docs: def generate_harvester_config(self, catalogs=None, harvest='valid',
                                    report=None, export_path=None):
          """Genera un archivo de configuración del harvester a partir de un
          reporte, o de un conjunto de catálogos y un criterio de cosecha
          (`harvest`).
  
          Args:
              catalogs (str, dict o list): Uno (str o dict) o varios (list de
                  strs y/o dicts) catálogos.
              harvest (str): Criterio para determinar qué datasets incluir en el
                  archivo de configuración generado  ('all', 'none',
                  'valid', 'report' o 'good').
              report (list o str): Tabla de reporte generada por
                  generate_datasets_report() como lista de diccionarios o archivo
                  en formato XLSX o CSV. Sólo se usa cuando `harvest=='report'`,
                  en cuyo caso `catalogs` se ignora.
              export_path (str): Path donde exportar el reporte generado (en
                  formato XLSX o CSV). Si se especifica, el método no devolverá
                  nada.
  
          Returns:
              list of dicts: Un diccionario con variables de configuración
                  por cada dataset a cosechar.
          """
  
          # Si se pasa un único catálogo, genero una lista que lo contenga
          if isinstance(catalogs, string_types + (dict,)):
              catalogs = [catalogs]
  
          if harvest == 'report':
              if not report:
                  raise ValueError("""
  Usted eligio 'report' como criterio de harvest, pero no proveyo un valor para
  el argumento 'report'. Por favor, intentelo nuevamente.""")
              datasets_report = readers.read_table(report)
          elif harvest in ['valid', 'none', 'all']:
              # catalogs no puede faltar para estos criterios
              assert isinstance(catalogs, string_types + (dict, list))
              datasets_report = self.generate_datasets_report(catalogs, harvest)
          else:
              raise ValueError("""
  {} no es un criterio de harvest reconocido. Pruebe con 'all', 'none', 'valid' o
  'report'.""".format(harvest))
  
          # define los campos del reporte que mantiene para el config file
          config_keys = [
              "catalog_federation_id", "catalog_federation_org",
              "dataset_identifier"
          ]
          # cambia algunos nombres de estos campos para el config file
          config_translator = {
              "catalog_federation_id": "catalog_id",
              "catalog_federation_org": "dataset_organization"
          }
          translated_keys = [config_translator.get(k, k) for k in config_keys]
  
          harvester_config = [
              OrderedDict(
                  # Retengo únicamente los campos que necesita el harvester
                  [(config_translator.get(k, k), v)
                   for (k, v) in dataset.items() if k in config_keys]
              )
              # Para aquellost datasets marcados con 'harvest'==1
              for dataset in datasets_report if bool(int(dataset["harvest"]))
          ]
  
          # chequea que el archivo de configuración tiene todos los campos
          required_keys = set(translated_keys)
          for row in harvester_config:
              row_keys = set(row.keys())
              msg = "Hay una fila con claves {} y debe tener claves {}".format(
                  row_keys, required_keys)
              assert row_keys == required_keys, msg
  
          if export_path:
              writers.write_table(harvester_config, export_path)
          else:
              return harvester_config