docs: def generate_harvestable_catalogs(self, catalogs, harvest='all',
                                        report=None, export_path=None):
          """Filtra los catálogos provistos según el criterio determinado en
          `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 conservar de
                  cada catálogo ('all', 'none', 'valid' o 'report').
              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'`.
              export_path (str): Path a un archivo JSON o directorio donde
                  exportar los catálogos filtrados. Si termina en ".json" se
                  exportará la lista de catálogos a un único archivo. Si es un
                  directorio, se guardará en él un JSON por catálogo. Si se
                  especifica `export_path`, el método no devolverá nada.
  
          Returns:
              list of dicts: Lista de catálogos.
          """
          assert isinstance(catalogs, string_types + (dict, list))
          # Si se pasa un único catálogo, genero una lista que lo contenga
          if isinstance(catalogs, string_types + (dict,)):
              catalogs = [catalogs]
  
          harvestable_catalogs = [readers.read_catalog(c) for c in catalogs]
          catalogs_urls = [catalog if isinstance(catalog, string_types)
                           else None for catalog in catalogs]
  
          # aplica los criterios de cosecha
          if harvest == 'all':
              pass
          elif harvest == 'none':
              for catalog in harvestable_catalogs:
                  catalog["dataset"] = []
          elif harvest == 'valid':
              report = self.generate_datasets_report(catalogs, harvest)
              return self.generate_harvestable_catalogs(
                  catalogs=catalogs, harvest='report', report=report,
                  export_path=export_path)
          elif 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_to_harvest = self._extract_datasets_to_harvest(report)
              for idx_cat, catalog in enumerate(harvestable_catalogs):
                  catalog_url = catalogs_urls[idx_cat]
                  if ("dataset" in catalog and
                          isinstance(catalog["dataset"], list)):
                      catalog["dataset"] = [
                          dataset for dataset in catalog["dataset"]
                          if (catalog_url, dataset.get("title")) in
                          datasets_to_harvest
                      ]
                  else:
                      catalog["dataset"] = []
          else:
              raise ValueError("""
  {} no es un criterio de harvest reconocido. Pruebe con 'all', 'none', 'valid' o
  'report'.""".format(harvest))
  
          # devuelve los catálogos harvesteables
          if export_path and os.path.isdir(export_path):
              # Creo un JSON por catálogo
              for idx, catalog in enumerate(harvestable_catalogs):
                  filename = os.path.join(export_path, "catalog_{}".format(idx))
                  writers.write_json(catalog, filename)
          elif export_path:
              # Creo un único JSON con todos los catálogos
              writers.write_json(harvestable_catalogs, export_path)
          else:
              return harvestable_catalogs