Skip to content

Commit

Permalink
Merge pull request #249 from datosgobar/248-refactor-readme
Browse files Browse the repository at this point in the history
248 refactor readme
  • Loading branch information
lrromero committed Apr 8, 2019
2 parents c79cfd5 + d3ce809 commit b1a2294
Show file tree
Hide file tree
Showing 11 changed files with 173,653 additions and 146 deletions.
113 changes: 113 additions & 0 deletions pydatajson/catalog_readme.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
from __future__ import unicode_literals
from __future__ import with_statement

import io
import os
import logging

from six import string_types

from pydatajson.helpers import traverse_dict
from pydatajson.readers import read_catalog
from pydatajson.indicators import generate_catalogs_indicators
from pydatajson.validation import validate_catalog

logger = logging.getLogger('pydatajson')

CENTRAL_CATALOG = "http://datos.gob.ar/data.json"
ABSOLUTE_PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
TEMPLATES_PATH = os.path.join(ABSOLUTE_PROJECT_DIR, "templates")


def generate_catalog_readme(_datajson, catalog, export_path=None):
"""Este método está para mantener retrocompatibilidad con versiones
anteriores. Se ignora el argumento _data_json."""
return generate_readme(catalog, export_path)


def generate_readme(catalog, export_path=None):
"""Genera una descripción textual en formato Markdown sobre los
metadatos generales de un catálogo (título, editor, fecha de
publicación, et cetera), junto con:
- estado de los metadatos a nivel catálogo,
- estado global de los metadatos,
- cantidad de datasets federados y no federados,
- detalles de los datasets no federados
- cantidad de datasets y distribuciones incluidas
Es utilizada por la rutina diaria de `libreria-catalogos` para generar
un README con información básica sobre 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 texto generado (en
formato Markdown). Si se especifica, el método no devolverá
nada.
Returns:
str: Texto de la descripción generada.
"""
# Si se paso una ruta, guardarla
if isinstance(catalog, string_types):
catalog_path_or_url = catalog
else:
catalog_path_or_url = None

catalog = read_catalog(catalog)
validation = validate_catalog(catalog)
# Solo necesito indicadores para un catalogo
indicators = generate_catalogs_indicators(
catalog, CENTRAL_CATALOG)[0][0]

with io.open(os.path.join(TEMPLATES_PATH, 'catalog_readme.txt'), 'r',
encoding='utf-8') as template_file:
readme_template = template_file.read()

not_federated_datasets_list = "\n".join([
"- [{}]({})".format(dataset[0], dataset[1])
for dataset in indicators["datasets_no_federados"]
])
federated_removed_datasets_list = "\n".join([
"- [{}]({})".format(dataset[0], dataset[1])
for dataset in indicators["datasets_federados_eliminados"]
])
federated_datasets_list = "\n".join([
"- [{}]({})".format(dataset[0], dataset[1])
for dataset in indicators["datasets_federados"]
])
non_federated_pct = 1.0 - indicators["datasets_federados_pct"] if \
indicators["datasets_federados_pct"] is not None else \
indicators["datasets_federados_pct"]
content = {
"title": catalog.get("title"),
"publisher_name": traverse_dict(
catalog, ["publisher", "name"]),
"publisher_mbox": traverse_dict(
catalog, ["publisher", "mbox"]),
"catalog_path_or_url": catalog_path_or_url,
"description": catalog.get("description"),
"global_status": validation["status"],
"catalog_status": validation["error"]["catalog"]["status"],
"no_of_datasets": len(catalog["dataset"]),
"no_of_distributions": sum([len(dataset["distribution"]) for
dataset in catalog["dataset"]]),
"federated_datasets": indicators["datasets_federados_cant"],
"not_federated_datasets": indicators["datasets_no_federados_cant"],
"not_federated_datasets_pct": non_federated_pct,
"not_federated_datasets_list": not_federated_datasets_list,
"federated_removed_datasets_list": federated_removed_datasets_list,
"federated_datasets_list": federated_datasets_list,
}

catalog_readme = readme_template.format(**content)

if export_path:
with io.open(export_path, 'w+', encoding='utf-8') as target:
target.write(catalog_readme)
else:
return catalog_readme
128 changes: 5 additions & 123 deletions pydatajson/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,9 @@
from __future__ import unicode_literals
from __future__ import with_statement

import io
import json
import os.path
import re
import sys
import warnings
import logging
from collections import OrderedDict
from datetime import datetime
Expand All @@ -36,6 +33,7 @@
from . import federation
from . import transformation
from . import backup
from . import catalog_readme

logger = logging.getLogger('pydatajson')

Expand Down Expand Up @@ -139,7 +137,7 @@ def __init__(self, catalog=None, schema_filename=None, schema_dir=None,
# metodos para hacer backups
make_catalog_backup = backup.make_catalog_backup

# Metodos para interactuar con un portal de CKAN
# metodos para interactuar con un portal de CKAN
push_dataset_to_ckan = federation.push_dataset_to_ckan
harvest_dataset_to_ckan = federation.harvest_dataset_to_ckan
restore_dataset_to_ckan = federation.restore_dataset_to_ckan
Expand All @@ -149,6 +147,9 @@ def __init__(self, catalog=None, schema_filename=None, schema_dir=None,
push_new_themes = federation.push_new_themes
remove_harvested_ds_from_ckan = federation.remove_harvested_ds_from_ckan

# metodos de README
generate_catalog_readme = catalog_readme.generate_catalog_readme

def _build_index(self):
"""Itera todos los datasets, distribucioens y fields indexandolos."""

Expand Down Expand Up @@ -897,125 +898,6 @@ def info_dataset(index, dataset):
else:
return summary

def generate_catalog_readme(self, catalog, export_path=None):
"""Genera una descripción textual en formato Markdown sobre los
metadatos generales de un catálogo (título, editor, fecha de
publicación, et cetera), junto con:
- estado de los metadatos a nivel catálogo,
- estado global de los metadatos,
- cantidad de datasets federados y no federados,
- detalles de los datasets no federados
- cantidad de datasets y distribuciones incluidas
Es utilizada por la rutina diaria de `libreria-catalogos` para generar
un README con información básica sobre 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 texto generado (en
formato Markdown). Si se especifica, el método no devolverá
nada.
Returns:
str: Texto de la descripción generada.
"""
# Si se paso una ruta, guardarla
if isinstance(catalog, string_types):
catalog_path_or_url = catalog
else:
catalog_path_or_url = None

catalog = readers.read_catalog(catalog)
validation = self.validate_catalog(catalog)
# Solo necesito indicadores para un catalogo
indicators = self.generate_catalogs_indicators(
catalog, CENTRAL_CATALOG)[0][0]

readme_template = """
# Catálogo: {title}
## Información General
- **Autor**: {publisher_name}
- **Correo Electrónico**: {publisher_mbox}
- **Ruta del catálogo**: {catalog_path_or_url}
- **Nombre del catálogo**: {title}
- **Descripción**:
> {description}
## Estado de los metadatos y cantidad de recursos
- **Estado metadatos globales**: {global_status}
- **Estado metadatos catálogo**: {catalog_status}
- **Cantidad Total de Datasets**: {no_of_datasets}
- **Cantidad Total de Distribuciones**: {no_of_distributions}
- **Cantidad de Datasets Federados**: {federated_datasets}
- **Cantidad de Datasets NO Federados**: {not_federated_datasets}
- **Porcentaje de Datasets NO Federados**: {not_federated_datasets_pct}%
## Datasets federados que fueron eliminados en el nodo original
{federated_removed_datasets_list}
## Datasets no federados
{not_federated_datasets_list}
## Datasets federados
{federated_datasets_list}
## Reporte
Por favor, consulte el informe [`datasets.csv`](datasets.csv).
"""

not_federated_datasets_list = "\n".join([
"- [{}]({})".format(dataset[0], dataset[1])
for dataset in indicators["datasets_no_federados"]
])
federated_removed_datasets_list = "\n".join([
"- [{}]({})".format(dataset[0], dataset[1])
for dataset in indicators["datasets_federados_eliminados"]
])
federated_datasets_list = "\n".join([
"- [{}]({})".format(dataset[0], dataset[1])
for dataset in indicators["datasets_federados"]
])

content = {
"title": catalog.get("title"),
"publisher_name": helpers.traverse_dict(
catalog, ["publisher", "name"]),
"publisher_mbox": helpers.traverse_dict(
catalog, ["publisher", "mbox"]),
"catalog_path_or_url": catalog_path_or_url,
"description": catalog.get("description"),
"global_status": validation["status"],
"catalog_status": validation["error"]["catalog"]["status"],
"no_of_datasets": len(catalog["dataset"]),
"no_of_distributions": sum([len(dataset["distribution"]) for
dataset in catalog["dataset"]]),
"federated_datasets": indicators["datasets_federados_cant"],
"not_federated_datasets": indicators["datasets_no_federados_cant"],
"not_federated_datasets_pct": (
100.0 - indicators["datasets_federados_pct"]),
"not_federated_datasets_list": not_federated_datasets_list,
"federated_removed_datasets_list": federated_removed_datasets_list,
"federated_datasets_list": federated_datasets_list,
}

catalog_readme = readme_template.format(**content)

if export_path:
with io.open(export_path, 'w+', encoding='utf-8') as target:
target.write(catalog_readme)
else:
return catalog_readme

@classmethod
def _extract_datasets_to_harvest(cls, report):
"""Extrae de un reporte los datos necesarios para reconocer qué
Expand Down
39 changes: 39 additions & 0 deletions pydatajson/templates/catalog_readme.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@

# Catálogo: {title}

## Información General

- **Autor**: {publisher_name}
- **Correo Electrónico**: {publisher_mbox}
- **Ruta del catálogo**: {catalog_path_or_url}
- **Nombre del catálogo**: {title}
- **Descripción**:

> {description}

## Estado de los metadatos y cantidad de recursos

- **Estado metadatos globales**: {global_status}
- **Estado metadatos catálogo**: {catalog_status}
- **Cantidad Total de Datasets**: {no_of_datasets}
- **Cantidad Total de Distribuciones**: {no_of_distributions}

- **Cantidad de Datasets Federados**: {federated_datasets}
- **Cantidad de Datasets NO Federados**: {not_federated_datasets}
- **Porcentaje de Datasets NO Federados**: {not_federated_datasets_pct}

## Datasets federados que fueron eliminados en el nodo original

{federated_removed_datasets_list}

## Datasets no federados

{not_federated_datasets_list}

## Datasets federados

{federated_datasets_list}

## Reporte

Por favor, consulte el informe [`datasets.csv`](datasets.csv).

0 comments on commit b1a2294

Please sign in to comment.