class WalkInstance(Walk): def __init__(self, merger, base, head): Walk.__init__(self, merger) self.base_resolver = LocalRefResolver("", base.val) self.head_resolver = LocalRefResolver("", head.val) def add_meta(self, head, meta): if meta is None: rv = dict() else: rv = dict(meta) rv['value'] = head return rv def default_strategy(self, schema, base, head, meta, **kwargs): if self.is_type(head, "object"): return "objectMerge" else: return "overwrite" def call_descender(self, descender, schema, base, head, meta): return descender.descend_instance(self, schema, base, head, meta) def work(self, strategy, schema, base, head, meta, **kwargs): assert isinstance(schema, JSONValue) assert isinstance(base, JSONValue) assert isinstance(head, JSONValue) log.debug("work : %sbase %s, head %s" % (self._indent(), base.ref, head.ref)) if not base.is_undef(): with self.base_resolver.resolving(base.ref) as resolved: # nan is hacked in - we can't normally meaningfully compare two nan values assert base.val == resolved or (math.isnan(base.val) and math.isnan(resolved)) if not head.is_undef(): with self.head_resolver.resolving(head.ref) as resolved: # nan is hacked in - we can't normally meaningfully compare two nan values assert head.val == resolved or (math.isnan(head.val) and math.isnan(resolved)) rv = strategy.merge(self, base, head, schema, meta, objclass_menu=self.merger.objclass_menu, **kwargs) assert isinstance(rv, JSONValue) return rv
def __init__(self, schema, strategies=(), objclass_def='dict', objclass_menu=None, validatorclass=Draft4Validator): """Create a new Merger object. schema -- JSON schema to use when merging. strategies -- Any additional merge strategies to use during merge. objclass_def -- Name of the default class for JSON objects. objclass_menu -- Any additional classes for JSON objects. validatorclass -- JSON Schema validator class. strategies argument should be a dict mapping strategy names to instances of Strategy subclasses. objclass_def specifies the default class used for JSON objects when one is not specified in the schema. It should be 'dict' (dict built-in), 'OrderedDict' (collections.OrderedDict) or one of the names specified in the objclass_menu argument. If not specified, 'dict' is used. objclass_menu argument should be a dictionary that maps a string name to a function or class that will return an empty dictionary-like object to use as a JSON object. The function must accept either no arguments or a dictionary-like object. validatorclass argument can be used to supply a validator class from jsonschema. This can be used for example to specify which JSON Schema draft version will be used during merge. """ self.schema = schema if hasattr(validatorclass, 'ID_OF'): resolver = LocalRefResolver.from_schema(schema, id_of=validatorclass.ID_OF) else: # jsonschema<3.0.0 resolver = LocalRefResolver.from_schema(schema) self.validator = validatorclass(schema, resolver=resolver) self.strategies = dict(self.STRATEGIES) self.strategies.update(strategies) self.objclass_menu = {'dict': dict, 'OrderedDict': OrderedDict} if objclass_menu: self.objclass_menu.update(objclass_menu) self.objclass_menu['_default'] = self.objclass_menu[objclass_def]
def __init__(self, schema, strategies=(), objclass_def='dict', objclass_menu=None, validatorclass=Draft4Validator): """Create a new Merger object. schema -- JSON schema to use when merging. strategies -- Any additional merge strategies to use during merge. objclass_def -- Name of the default class for JSON objects. objclass_menu -- Any additional classes for JSON objects. validatorclass -- JSON Schema validator class. strategies argument should be a dict mapping strategy names to instances of Strategy subclasses. objclass_def specifies the default class used for JSON objects when one is not specified in the schema. It should be 'dict' (dict built-in), 'OrderedDict' (collections.OrderedDict) or one of the names specified in the objclass_menu argument. If not specified, 'dict' is used. objclass_menu argument should be a dictionary that maps a string name to a function or class that will return an empty dictionary-like object to use as a JSON object. The function must accept either no arguments or a dictionary-like object. validatorclass argument can be used to supply a validator class from jsonschema. This can be used for example to specify which JSON Schema draft version will be used during merge. """ self.schema = schema if hasattr(validatorclass, 'ID_OF'): resolver = LocalRefResolver.from_schema(schema, id_of=validatorclass.ID_OF) else: # jsonschema<3.0.0 resolver = LocalRefResolver.from_schema(schema) self.validator = validatorclass(schema, resolver=resolver) self.strategies = dict(self.STRATEGIES) self.strategies.update(strategies) self.objclass_menu = { 'dict': dict, 'OrderedDict': OrderedDict } if objclass_menu: self.objclass_menu.update(objclass_menu) self.objclass_menu['_default'] = self.objclass_menu[objclass_def]
class WalkInstance(Walk): def __init__(self, merger, base, head): Walk.__init__(self, merger) self.base_resolver = LocalRefResolver("", base.val) self.head_resolver = LocalRefResolver("", head.val) def add_meta(self, head, meta): if meta is None: rv = dict() else: rv = dict(meta) rv['value'] = head return rv def default_strategy(self, schema, base, head, meta, **kwargs): if self.is_type(head, "object"): return "objectMerge" else: return "overwrite" def call_descender(self, descender, schema, base, head, meta): return descender.descend_instance(self, schema, base, head, meta) def work(self, strategy, schema, base, head, meta, **kwargs): assert isinstance(schema, JSONValue) assert isinstance(base, JSONValue) assert isinstance(head, JSONValue) log.debug("work : %sbase %s, head %s" % (self._indent(), base.ref, head.ref)) if not base.is_undef(): with self.base_resolver.resolving(base.ref) as resolved: assert base.val is resolved if not head.is_undef(): with self.head_resolver.resolving(head.ref) as resolved: assert head.val is resolved rv = strategy.merge(self, base, head, schema, meta, objclass_menu=self.merger.objclass_menu, **kwargs) assert isinstance(rv, JSONValue) return rv
class WalkInstance(Walk): def __init__(self, merger, base, head, merge_options): Walk.__init__(self, merger, merge_options) self.base_resolver = LocalRefResolver("", base.val) self.head_resolver = LocalRefResolver("", head.val) def default_strategy(self, schema, base, head, **kwargs): log.debug(" : %sdefault strategy" % (self._indent(), )) if self.is_type(head, "object"): return "objectMerge" else: return "overwrite" def call_descender(self, descender, schema, base, head): return descender.descend_instance(self, schema, base, head) def work(self, strategy, schema, base, head, **kwargs): assert isinstance(schema, JSONValue) assert isinstance(base, JSONValue) assert isinstance(head, JSONValue) log.debug("work : %sbase %s, head %s" % (self._indent(), base.ref, head.ref)) if not base.is_undef(): with self.base_resolver.resolving(base.ref) as resolved: assert base.val is resolved if not head.is_undef(): with self.head_resolver.resolving(head.ref) as resolved: assert head.val is resolved rv = strategy.merge(self, base, head, schema, objclass_menu=self.merger.objclass_menu, **kwargs) assert isinstance(rv, JSONValue) return rv
def __init__(self, schema, strategies=(), objclass_def='dict', objclass_menu=None): """Create a new Merger object. schema -- JSON schema to use when merging. strategies -- Any additional merge strategies to use during merge. objclass_def -- Name of the default class for JSON objects. objclass_menu -- Any additional classes for JSON objects. strategies argument should be a dict mapping strategy names to instances of Strategy subclasses. objclass_def specifies the default class used for JSON objects when one is not specified in the schema. It should be 'dict' (dict built-in), 'OrderedDict' (collections.OrderedDict) or one of the names specified in the objclass_menu argument. If not specified, 'dict' is used. objclass_menu argument should be a dictionary that maps a string name to a function or class that will return an empty dictionary-like object to use as a JSON object. The function must accept either no arguments or a dictionary-like object. """ self.schema = schema resolver = LocalRefResolver.from_schema(schema) self.validator = Draft4Validator(schema, resolver=resolver) self.strategies = dict(self.STRATEGIES) self.strategies.update(strategies) self.objclass_menu = {'dict': dict, 'OrderedDict': OrderedDict} if objclass_menu: self.objclass_menu.update(objclass_menu) self.objclass_menu['_default'] = self.objclass_menu[objclass_def]
def __init__(self, merger, base, head): Walk.__init__(self, merger) self.base_resolver = LocalRefResolver("", base.val) self.head_resolver = LocalRefResolver("", head.val)
def __init__(self, merger, base, head): Walk.__init__(self, merger) self.base_resolver = LocalRefResolver("", base.val) self.head_resolver = LocalRefResolver("", head.val)