From c00d67d55a210e15c556055c55490afa857232c5 Mon Sep 17 00:00:00 2001 From: Benjamin Braatz Date: Wed, 1 Sep 2021 11:49:25 +0200 Subject: [PATCH] Cache the JSON schema validators. --- controlpi/messagebus.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/controlpi/messagebus.py b/controlpi/messagebus.py index 54fbf2a..ed9b6b2 100644 --- a/controlpi/messagebus.py +++ b/controlpi/messagebus.py @@ -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 -- 2.34.1