예제 #1
0
    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
예제 #2
0
 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)
예제 #3
0
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
예제 #4
0
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)
예제 #5
0
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
예제 #6
0
 def schema_visitor(self):
     return SchemaVisitor(self.schema_data, resolver)