def update_resource_properties(r, orig_columns={}, force=False):
    """Get descriptions and other properties from this, or upstream, packages, and add them to the schema. """

    added = []

    schema_term = r.schema_term

    if not schema_term:
        warn("No schema term for ", r.name)
        return

    rg = r.raw_row_generator

    # Get columns information from the schema, or, if it is a package reference,
    # from the upstream schema

    upstream_columns = {e['name'].lower() if e['name'] else '': e for e in r.columns() or {}}

    # Just from the local schema
    schema_columns = {e['name'].lower() if e['name'] else '': e for e in r.schema_columns or {}}

    # Ask the generator if it can provide column descriptions and types
    generator_columns = {e['name'].lower() if e['name'] else '': e for e in rg.columns or {}}

    def get_col_value(col_name, value_name):

        v = None

        if not col_name:
            return None

        for d in [generator_columns, upstream_columns, orig_columns, schema_columns]:
            v_ = d.get(col_name.lower(), {}).get(value_name)
            if v_:
                v = v_

        return v



    # Look for new properties
    extra_properties = set()
    for d in [generator_columns, upstream_columns, orig_columns, schema_columns]:
        for k, v in d.items():
            for kk, vv in v.items():
                extra_properties.add(kk)

    # Remove the properties that are already accounted for
    extra_properties = extra_properties - {'pos', 'header', 'name', ''}

    # Add any extra properties, such as from upstream packages, to the schema.

    for ep in extra_properties:
        r.doc['Schema'].add_arg(ep)

    for c in schema_term.find('Table.Column'):

        for ep in extra_properties:
            t = c.get_or_new_child(ep)
            v = get_col_value(c.name, ep)
            if v:
                t.value = v
                added.append((c.name, ep, v))

    prt('Updated schema for {}. Set {} properties'.format(r.name, len(added)))
def update_resource_properties ( r , orig_columns = { } , force = False ) : added = [ ] schema_term = r . schema_term if not schema_term : warn ( "No schema term for " , r . name ) return rg = r . raw_row_generator upstream_columns = { e [ 'name' ] . lower ( ) if e [ 'name' ] else '' : e for e in r . columns ( ) or { } } schema_columns = { e [ 'name' ] . lower ( ) if e [ 'name' ] else '' : e for e in r . schema_columns or { } } generator_columns = { e [ 'name' ] . lower ( ) if e [ 'name' ] else '' : e for e in rg . columns or { } } def get_col_value ( col_name , value_name ) : v = None if not col_name : return None for d in [ generator_columns , upstream_columns , orig_columns , schema_columns ] : v_ = d . get ( col_name . lower ( ) , { } ) . get ( value_name ) if v_ : v = v_ return v extra_properties = set ( ) for d in [ generator_columns , upstream_columns , orig_columns , schema_columns ] : for k , v in d . items ( ) : for kk , vv in v . items ( ) : extra_properties . add ( kk ) extra_properties = extra_properties - { 'pos' , 'header' , 'name' , '' } for ep in extra_properties : r . doc [ 'Schema' ] . add_arg ( ep ) for c in schema_term . find ( 'Table.Column' ) : for ep in extra_properties : t = c . get_or_new_child ( ep ) v = get_col_value ( c . name , ep ) if v : t . value = v added . append ( ( c . name , ep , v ) ) prt ( 'Updated schema for {}. Set {} properties' . format ( r . name , len ( added ) ) )
Get descriptions and other properties from this, or upstream, packages, and add them to the schema.