From 1fe5dbf338ed2d937a22cb32d75fb599dd00abf3 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 12 May 2018 21:51:05 -0700 Subject: init: only imoprt jsonschema if needed - It turns out that jsonschema is one of the more expensive imports. - move imports of jsonschema into functions to avoid the performance hits for calls that don't need config. --- lib/spack/spack/config.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index 5a551bdc42..149ed5088d 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -59,9 +59,7 @@ from six import string_types from six import iteritems import yaml -import jsonschema from yaml.error import MarkedYAMLError -from jsonschema import Draft4Validator, validators import llnl.util.tty as tty from llnl.util.filesystem import mkdirp @@ -72,7 +70,6 @@ import spack.schema from spack.error import SpackError from spack.util.ordereddict import OrderedDict - # Hacked yaml for configuration files preserves line numbers. import spack.util.spack_yaml as syaml @@ -132,6 +129,7 @@ def _extend_with_default(validator_class): commented out. """ + import jsonschema validate_properties = validator_class.VALIDATORS["properties"] validate_pattern_properties = validator_class.VALIDATORS[ "patternProperties"] @@ -157,16 +155,12 @@ def _extend_with_default(validator_class): validator, properties, instance, schema): yield err - return validators.extend(validator_class, { + return jsonschema.validators.extend(validator_class, { "properties": set_defaults, "patternProperties": set_pp_defaults }) -#: the validator we use for Spack config files -DefaultSettingValidator = _extend_with_default(Draft4Validator) - - class ConfigScope(object): """This class represents a configuration scope. @@ -192,6 +186,7 @@ class ConfigScope(object): return self.sections[section] def write_section(self, section): + import jsonschema filename = self.get_section_filename(section) data = self.get_section(section) try: @@ -545,8 +540,14 @@ def _validate_section(data, schema): on Spack YAML structures. """ + import jsonschema + if not hasattr(_validate_section, 'validator'): + DefaultSettingValidator = _extend_with_default( + jsonschema.Draft4Validator) + _validate_section.validator = DefaultSettingValidator + try: - DefaultSettingValidator(schema).validate(data) + _validate_section.validator(schema).validate(data) except jsonschema.ValidationError as e: raise ConfigFormatError(e, data) -- cgit v1.2.3-60-g2f50