# Path: pydatajson/readers.py
# def read_catalog(catalog, default_values=None, catalog_format=None,
#                  verify=False, timeout=constants.REQUESTS_TIMEOUT):
#     """Toma una representación cualquiera de un catálogo, y devuelve su
#     representación interna (un diccionario de Python con su metadata.)
# 
#     Si recibe una representación _interna_ (un diccionario), lo devuelve
#     intacto. Si recibe una representación _externa_ (path/URL a un archivo
#     JSON/XLSX), devuelve su represetación interna, es decir, un diccionario.
# 
#     Args:
#         catalog (dict or str): Representación externa/interna de un catálogo.
#             Una representación _externa_ es un path local o una URL remota a un
#             archivo con la metadata de un catálogo, en formato JSON o XLSX. La
#             representación _interna_ de un catálogo es un diccionario.
# 
#     Returns:
#         dict: Representación interna de un catálogo para uso en las funciones
#         de esta librería.
#     """
#     unknown_catalog_repr_msg = \
#         """No se pudo inferir una representación válida de un catálogo del
#         parámetro provisto: {}.""".format(catalog)
#     assert isinstance(catalog, string_types + (dict,)
#                       ), unknown_catalog_repr_msg
# 
#     if isinstance(catalog, dict):
#         catalog_dict = catalog
# 
#     else:
#         # catalog es una URL remota o un path local
#         suffix = catalog.split(".")[-1].strip("/")
#         if suffix in ('json', 'xlsx'):
#             catalog_format = catalog_format or suffix
#         if catalog_format == "xlsx":
#             try:
#                 catalog_dict = read_xlsx_catalog(catalog,
#                                                  verify=verify,
#                                                  timeout=timeout)
#             except openpyxl_exceptions + (KeyError, ValueError, AssertionError,
#                                           IOError, BadZipfile) as e:
#                 raise ce.NonParseableCatalog(catalog, str(e))
#         elif catalog_format == "json":
#             try:
#                 catalog_dict = read_json(catalog,
#                                          verify=verify,
#                                          timeout=timeout)
#             except(ValueError, TypeError, IOError) as e:
#                 raise ce.NonParseableCatalog(catalog, str(e))
#         elif catalog_format == "ckan":
#             catalog_dict = read_ckan_catalog(catalog)
#         else:
#             catalog_dict = read_suffixless_catalog(catalog)
# 
#     # si se pasaron valores default, los aplica al catálogo leído
#     if default_values:
#         _apply_default_values(catalog_dict, default_values)
# 
#     return catalog_dict
# 
# Path: pydatajson/reporting.py
# def generate_datasets_summary(catalog, export_path=None, validator=None,
#                               verify_ssl=True, url_check_timeout=1):
#     """Genera un informe sobre los datasets presentes en un catálogo,
#     indicando para cada uno:
#         - Índice en la lista catalog["dataset"]
#         - Título
#         - Identificador
#         - Cantidad de distribuciones
#         - Estado de sus metadatos ["OK"|"ERROR"]
# 
#     Es utilizada por la rutina diaria de `libreria-catalogos` para reportar
#     sobre los datasets de los catálogos mantenidos.
# 
#     Args:
#         catalog (str o dict): Path a un catálogo en cualquier formato,
#             JSON, XLSX, o diccionario de python.
#         export_path (str): Path donde exportar el informe generado (en
#             formato XLSX o CSV). Si se especifica, el método no devolverá
#             nada.
# 
#     Returns:
#         list: Contiene tantos dicts como datasets estén presentes en
#         `catalogs`, con los datos antes mencionados.
#     """
#     catalog = readers.read_catalog(catalog)
# 
#     # Trato de leer todos los datasets bien formados de la lista
#     # catalog["dataset"], si existe.
#     if "dataset" in catalog and isinstance(catalog["dataset"], list):
#         datasets = [d if isinstance(d, dict) else {} for d in
#                     catalog["dataset"]]
#     else:
#         # Si no, considero que no hay datasets presentes
#         datasets = []
# 
#     validation = validate_catalog(
#         catalog, validator=validator, verify_ssl=verify_ssl,
#         url_check_timeout=url_check_timeout)["error"]["dataset"]
# 
#     def info_dataset(index, dataset):
#         """Recolecta información básica de un dataset."""
#         info = OrderedDict()
#         info["indice"] = index
#         info["titulo"] = dataset.get("title")
#         info["identificador"] = dataset.get("identifier")
#         info["estado_metadatos"] = validation[index]["status"]
#         info["cant_errores"] = len(validation[index]["errors"])
#         info["cant_distribuciones"] = len(dataset["distribution"])
#         if helpers.dataset_has_data_distributions(dataset):
#             info["tiene_datos"] = "SI"
#         else:
#             info["tiene_datos"] = "NO"
# 
#         return info
# 
#     summary = [info_dataset(i, ds) for i, ds in enumerate(datasets)]
#     if export_path:
#         writers.write_table(summary, export_path)
#     else:
#         return summary


from pydatajson.readers import read_catalog
from pydatajson.reporting import generate_datasets_summary
from pydatajson.validators\
    .distribution_download_urls_validator \
    import DistributionDownloadUrlsValidator
# -*- coding: utf-8 -*-



class StatusIndicatorsGenerator(object):

    def __init__(self, catalog, validator=None, verify_ssl=True,
                 url_check_timeout=1, threads_count=1):
        self.download_url_ok = None

# Path: pydatajson/readers.py
# def read_catalog(catalog, default_values=None, catalog_format=None,
#                  verify=False, timeout=constants.REQUESTS_TIMEOUT):
#     """Toma una representación cualquiera de un catálogo, y devuelve su
#     representación interna (un diccionario de Python con su metadata.)
# 
#     Si recibe una representación _interna_ (un diccionario), lo devuelve
#     intacto. Si recibe una representación _externa_ (path/URL a un archivo
#     JSON/XLSX), devuelve su represetación interna, es decir, un diccionario.
# 
#     Args:
#         catalog (dict or str): Representación externa/interna de un catálogo.
#             Una representación _externa_ es un path local o una URL remota a un
#             archivo con la metadata de un catálogo, en formato JSON o XLSX. La
#             representación _interna_ de un catálogo es un diccionario.
# 
#     Returns:
#         dict: Representación interna de un catálogo para uso en las funciones
#         de esta librería.
#     """
#     unknown_catalog_repr_msg = \
#         """No se pudo inferir una representación válida de un catálogo del
#         parámetro provisto: {}.""".format(catalog)
#     assert isinstance(catalog, string_types + (dict,)
#                       ), unknown_catalog_repr_msg
# 
#     if isinstance(catalog, dict):
#         catalog_dict = catalog
# 
#     else:
#         # catalog es una URL remota o un path local
#         suffix = catalog.split(".")[-1].strip("/")
#         if suffix in ('json', 'xlsx'):
#             catalog_format = catalog_format or suffix
#         if catalog_format == "xlsx":
#             try:
#                 catalog_dict = read_xlsx_catalog(catalog,
#                                                  verify=verify,
#                                                  timeout=timeout)
#             except openpyxl_exceptions + (KeyError, ValueError, AssertionError,
#                                           IOError, BadZipfile) as e:
#                 raise ce.NonParseableCatalog(catalog, str(e))
#         elif catalog_format == "json":
#             try:
#                 catalog_dict = read_json(catalog,
#                                          verify=verify,
#                                          timeout=timeout)
#             except(ValueError, TypeError, IOError) as e:
#                 raise ce.NonParseableCatalog(catalog, str(e))
#         elif catalog_format == "ckan":
#             catalog_dict = read_ckan_catalog(catalog)
#         else:
#             catalog_dict = read_suffixless_catalog(catalog)
# 
#     # si se pasaron valores default, los aplica al catálogo leído
#     if default_values:
#         _apply_default_values(catalog_dict, default_values)
# 
#     return catalog_dict
# 
# Path: pydatajson/reporting.py
# def generate_datasets_summary(catalog, export_path=None, validator=None,
#                               verify_ssl=True, url_check_timeout=1):
#     """Genera un informe sobre los datasets presentes en un catálogo,
#     indicando para cada uno:
#         - Índice en la lista catalog["dataset"]
#         - Título
#         - Identificador
#         - Cantidad de distribuciones
#         - Estado de sus metadatos ["OK"|"ERROR"]
# 
#     Es utilizada por la rutina diaria de `libreria-catalogos` para reportar
#     sobre los datasets de los catálogos mantenidos.
# 
#     Args:
#         catalog (str o dict): Path a un catálogo en cualquier formato,
#             JSON, XLSX, o diccionario de python.
#         export_path (str): Path donde exportar el informe generado (en
#             formato XLSX o CSV). Si se especifica, el método no devolverá
#             nada.
# 
#     Returns:
#         list: Contiene tantos dicts como datasets estén presentes en
#         `catalogs`, con los datos antes mencionados.
#     """
#     catalog = readers.read_catalog(catalog)
# 
#     # Trato de leer todos los datasets bien formados de la lista
#     # catalog["dataset"], si existe.
#     if "dataset" in catalog and isinstance(catalog["dataset"], list):
#         datasets = [d if isinstance(d, dict) else {} for d in
#                     catalog["dataset"]]
#     else:
#         # Si no, considero que no hay datasets presentes
#         datasets = []
# 
#     validation = validate_catalog(
#         catalog, validator=validator, verify_ssl=verify_ssl,
#         url_check_timeout=url_check_timeout)["error"]["dataset"]
# 
#     def info_dataset(index, dataset):
#         """Recolecta información básica de un dataset."""
#         info = OrderedDict()
#         info["indice"] = index
#         info["titulo"] = dataset.get("title")
#         info["identificador"] = dataset.get("identifier")
#         info["estado_metadatos"] = validation[index]["status"]
#         info["cant_errores"] = len(validation[index]["errors"])
#         info["cant_distribuciones"] = len(dataset["distribution"])
#         if helpers.dataset_has_data_distributions(dataset):
#             info["tiene_datos"] = "SI"
#         else:
#             info["tiene_datos"] = "NO"
# 
#         return info
# 
#     summary = [info_dataset(i, ds) for i, ds in enumerate(datasets)]
#     if export_path:
#         writers.write_table(summary, export_path)
#     else:
#         return summary


# Path: pydatajson/status_indicators_generator.py
from pydatajson.readers import read_catalog
from pydatajson.reporting import generate_datasets_summary
from pydatajson.validators\
    .distribution_download_urls_validator \
    import DistributionDownloadUrlsValidator

# -*- coding: utf-8 -*-



class StatusIndicatorsGenerator(object):

    def __init__(self, catalog, validator=None, verify_ssl=True,
                 url_check_timeout=1, threads_count=1):
        self.download_url_ok = None

        self.catalog = read_catalog(catalog)