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.
This commit is contained in:
Todd Gamblin 2018-05-12 21:51:05 -07:00 committed by scheibelp
parent 6f2cac9565
commit 1fe5dbf338

View File

@ -59,9 +59,7 @@
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 @@
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 set_pp_defaults(validator, properties, instance, schema):
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 @@ def get_section(self, section):
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)