code: def _extract_datasets_to_harvest(cls, report):
          
          assert isinstance(report, string_types + (list,))
  
          # Si `report` es una lista de tuplas con longitud 2, asumimos que es un
          # reporte procesado para extraer los datasets a harvestear. Se devuelve
          # intacta.
          if (isinstance(report, list) and all([isinstance(x, tuple) and
                                                len(x) == 2 for x in report])):
              return report
  
          table = readers.read_table(report)
          table_keys = table[0].keys()
          expected_keys = ["catalog_metadata_url", "dataset_title",
                           "dataset_accrualPeriodicity"]
  
          # Verifico la presencia de las claves básicas de un config de harvester
          for key in expected_keys:
              if key not in table_keys:
                  raise KeyError("""
  El reporte no contiene la clave obligatoria {}. Pruebe con otro archivo.
  """.format(key))
  
          if "harvest" in table_keys:
              # El archivo es un reporte de datasets.
              datasets_to_harvest = [
                  (row["catalog_metadata_url"], row["dataset_title"]) for row in
                  table if int(row["harvest"])]
          else:
              # El archivo es un config de harvester.
              datasets_to_harvest = [
                  (row["catalog_metadata_url"], row["dataset_title"]) for row in
                  table]
  
          return datasets_to_harvest
docs: Extrae de un reporte los datos necesarios para reconocer qué
          datasets marcar para cosecha en cualquier generador.
  
          Args:
              report (str o list): Reporte (lista de dicts) o path a uno.
  
          Returns:
              list: Lista de tuplas con los títulos de catálogo y dataset de cada
              reporte extraído.