mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 08:14:42 +04:00
Fix autoupdate spamming with defaults.
This commit is contained in:
parent
817ec510c7
commit
8b5c3b8745
4 changed files with 68 additions and 12 deletions
|
|
@ -5,30 +5,55 @@ import jsonschema.validators
|
|||
|
||||
|
||||
# From https://github.com/Julian/jsonschema/blob/master/docs/faq.rst
|
||||
def extend_with_default(validator_class):
|
||||
validate_properties = validator_class.VALIDATORS["properties"]
|
||||
def extend_validator_cls(validator_cls, modify):
|
||||
validate_properties = validator_cls.VALIDATORS['properties']
|
||||
|
||||
def set_defaults(validator, properties, instance, schema):
|
||||
def new_properties(validator, properties, instance, schema):
|
||||
for error in validate_properties(
|
||||
validator, properties, instance, schema,
|
||||
):
|
||||
yield error
|
||||
|
||||
for property, subschema in properties.iteritems():
|
||||
if "default" in subschema:
|
||||
instance.setdefault(
|
||||
property, copy.deepcopy(subschema["default"]),
|
||||
)
|
||||
modify(properties, instance)
|
||||
|
||||
return jsonschema.validators.extend(
|
||||
validator_class, {"properties" : set_defaults},
|
||||
validator_cls, {'properties': new_properties},
|
||||
)
|
||||
|
||||
|
||||
DefaultingValidator = extend_with_default(jsonschema.Draft4Validator)
|
||||
|
||||
def default_values(properties, instance):
|
||||
for property, subschema in properties.iteritems():
|
||||
if 'default' in subschema:
|
||||
instance.setdefault(
|
||||
property, copy.deepcopy(subschema['default']),
|
||||
)
|
||||
|
||||
|
||||
def remove_default_values(properties, instance):
|
||||
for property, subschema in properties.iteritems():
|
||||
if (
|
||||
'default' in subschema and
|
||||
instance.get(property) == subschema['default']
|
||||
):
|
||||
del instance[property]
|
||||
|
||||
|
||||
_AddDefaultsValidator = extend_validator_cls(
|
||||
jsonschema.Draft4Validator, default_values,
|
||||
)
|
||||
_RemoveDefaultsValidator = extend_validator_cls(
|
||||
jsonschema.Draft4Validator, remove_default_values,
|
||||
)
|
||||
|
||||
|
||||
def apply_defaults(obj, schema):
|
||||
obj = copy.deepcopy(obj)
|
||||
DefaultingValidator(schema).validate(obj)
|
||||
_AddDefaultsValidator(schema).validate(obj)
|
||||
return obj
|
||||
|
||||
|
||||
def remove_defaults(obj, schema):
|
||||
obj = copy.deepcopy(obj)
|
||||
_RemoveDefaultsValidator(schema).validate(obj)
|
||||
return obj
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue