def __init__(self, mapping, resolver, visitor=None, scope=None, mapping_resolver=None): if visitor is None: schema = resolver.referrer visitor = SchemaVisitor(schema, resolver, scope=scope) self.visitor = visitor self.mapping = mapping.copy() if not self.visitor.parent: self.mapping_resolver = RefResolver.from_schema(self.mapping) else: self.mapping_resolver = mapping_resolver if '$ref' in self.mapping: with self.mapping_resolver.resolving(self.mapping.pop('$ref'))\ as data: self.mapping.update(data) src = self.mapping.get('src') if src: _mapping = deepcopy(self.mapping) if self.visitor.is_object: for item, prop in _mapping.get('mapping', {}).items(): _src = prop.get('src') if _src: _mapping['mapping'][item]['src'] = "{}.{}".format( src, prop['src']) self.mapping = _mapping
def _get_visitor(self, entity, schema=None): if schema is None: schema = entity.get('$schema') if isinstance(schema, six.string_types): schema = {'$ref': schema} if schema is None: raise TypeError('No schema defined for network mapping.') return SchemaVisitor(schema, self.resolver)
def implied_schemas(schema_uri): # Given a schema URI, return a list of implied (i.e. child) schema URIs, # with the original schema included. schemas = [schema_uri] for uri, data in resolver.store.items(): if isinstance(data, dict): visitor = SchemaVisitor(data, resolver) if _check_schema_match(visitor, schema_uri): schemas.append(data.get('id')) return schemas
def implied_schemas(schema_uri): # Given a schema URI, return a list of implied (i.e. child) schema URIs, # with the original schema included. if schema_uri is None or not len(schema_uri.strip()): return [] schemas = set([schema_uri]) for uri, data in resolver.store.items(): if isinstance(data, dict): visitor = SchemaVisitor(data, resolver) if _check_schema_match(visitor, schema_uri): schemas.add(data.get('id')) return list(schemas)
def entities_to_table(schema, entities): """ Generate a flattened table from a set of entities, inlining inline sub-entities. """ config = get_loom_config() visitor = SchemaVisitor({'$ref': schema}, config.resolver) rows = [] for entity in entities: row = OrderedDict() for prop in visitor.properties: if prop.is_value and prop.inline: row[prop.title] = entity.get(prop.name) if prop.is_object: child_entity = entity.get(prop.name, {}) if prop.inline: for child_prop in prop.properties: if not prop.inline: continue title = '%s: %s' % (prop.title, child_prop.title) row[title] = child_entity.get(child_prop.name) else: row[prop.title] = child_entity.get('name', child_entity.get('id')) rows.append(row) return visitor, rows
def schema_visitor(self): return SchemaVisitor(self.schema_data, resolver)