Cache the JSON schema validators.
authorBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 1 Sep 2021 09:49:25 +0000 (11:49 +0200)
committerBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 1 Sep 2021 09:49:25 +0000 (11:49 +0200)
controlpi/messagebus.py

index 54fbf2a9aad9f925cff802f5a6bcefda0edd630b..ed9b6b21e7d80bc3ac82d252fbab0b34f4e0aa5c 100644 (file)
@@ -346,6 +346,7 @@ class MessageTemplate(Dict[str, JSONSchema]):
         >>> print(t)
         {'key': {'const': 'value'}}
         """
+        self._validators: Dict[str, jsonschema.Draft7Validator] = {}
         if init is not None:
             self.update(init)
 
@@ -435,6 +436,7 @@ class MessageTemplate(Dict[str, JSONSchema]):
         except jsonschema.exceptions.SchemaError:
             raise TypeError(f"'{value}' is not a valid value in"
                             " MessageTemplate (not a valid JSON schema).")
+        self._validators[key] = jsonschema.Draft7Validator(value)
         super().__setitem__(key, value)
 
     def update(self, *args, **kwargs) -> None:
@@ -606,7 +608,7 @@ class MessageTemplate(Dict[str, JSONSchema]):
             if key not in message:
                 return False
             else:
-                validator = jsonschema.Draft7Validator(self[key])
+                validator = self._validators[key]
                 for error in validator.iter_errors(message[key]):
                     return False
         return True
@@ -722,6 +724,7 @@ class MessageTemplateRegistry:
 
         >>> r = MessageTemplateRegistry()
         """
+        self._validators: Dict[str, jsonschema.Draft7Validator] = {}
         self._clients: List[str] = []
         self._children: Dict[str, Dict[str, MessageTemplateRegistry]] = {}
 
@@ -882,8 +885,11 @@ class MessageTemplateRegistry:
         for key in self._children:
             if key in message:
                 for schema_string in self._children[key]:
-                    schema = json.loads(schema_string)
-                    validator = jsonschema.Draft7Validator(schema)
+                    if schema_string not in self._validators:
+                        schema = json.loads(schema_string)
+                        self._validators[schema_string] = \
+                            jsonschema.Draft7Validator(schema)
+                    validator = self._validators[schema_string]
                     validated = True
                     for error in validator.iter_errors(message[key]):
                         validated = False
@@ -914,8 +920,11 @@ class MessageTemplateRegistry:
         for key in self._children:
             if key in message:
                 for schema_string in self._children[key]:
-                    schema = json.loads(schema_string)
-                    validator = jsonschema.Draft7Validator(schema)
+                    if schema_string not in self._validators:
+                        schema = json.loads(schema_string)
+                        self._validators[schema_string] = \
+                            jsonschema.Draft7Validator(schema)
+                    validator = self._validators[schema_string]
                     validated = True
                     for error in validator.iter_errors(message[key]):
                         validated = False