docs: def process_schema(doc, resource, df):
      """Add schema entiries to a metatab doc from a dataframe"""
      from rowgenerators import SourceError
      from requests.exceptions import ConnectionError
  
      from metapack.cli.core import extract_path_name, alt_col_name, type_map
      from tableintuit import TypeIntuiter
      from rowgenerators.generator.python import PandasDataframeSource
      from appurl import parse_app_url
  
      try:
          doc['Schema']
      except KeyError:
          doc.new_section('Schema', ['DataType', 'Altname', 'Description'])
  
      schema_name = resource.get_value('schema', resource.get_value('name'))
  
      schema_term = doc.find_first(term='Table', value=schema_name, section='Schema')
  
      if schema_term:
          logger.info("Found table for '{}'; skipping".format(schema_name))
          return
  
      path, name = extract_path_name(resource.url)
  
      logger.info("Processing {}".format(resource.url))
  
      si = PandasDataframeSource(parse_app_url(resource.url), df, cache=doc._cache, )
  
      try:
          ti = TypeIntuiter().run(si)
      except SourceError as e:
          logger.warn("Failed to process '{}'; {}".format(path, e))
          return
      except ConnectionError as e:
          logger.warn("Failed to download '{}'; {}".format(path, e))
          return
  
      table = doc['Schema'].new_term('Table', schema_name)
  
      logger.info("Adding table '{}' to metatab schema".format(schema_name))
  
      for i, c in enumerate(ti.to_rows()):
          raw_alt_name = alt_col_name(c['header'], i)
          alt_name = raw_alt_name if raw_alt_name != c['header'] else ''
  
          t = table.new_child('Column', c['header'],
                              datatype=type_map.get(c['resolved_type'], c['resolved_type']),
                              altname=alt_name,
                              description=df[c['header']].description \
                                          if hasattr(df, 'description') and df[c['header']].description else ''
                              )
  
      return table