Caso de uso 2 - Validación, transformación y harvesting con el catálogo del Ministerio de Justicia

Caso 2: catálogo no válido por no tener completos los campos "title" de la clase dataset.

En esta prueba se realiza el proceso completo de validación, transformación y harvesting a partir de un archivo xlsx que contiene los metadatos pertenecientes al catálogo del Ministerio de Justicia.

Nota: Se trata de un catálogo conocido y originalmente válido en cuanto a su estructura y metadatos, al que se le han borrado los valores de la propiedad "dataset_title". Archivo utilizado: catalogo-justicia-con-error-datasets.xlsx

Setup

Importación de metodos y clases


In [1]:
import arrow
import os, sys
sys.path.insert(0, os.path.abspath(".."))
from pydatajson import DataJson #lib y clase
from pydatajson.readers import read_catalog # lib, modulo ... metodo Lle el catalogo -json o xlsx o (local o url) dicc- y lo transforma en un diccionario de python
from pydatajson.writers import write_json_catalog

Declaración de variables y paths


In [2]:
#completar con lo que corresponda
ORGANISMO = 'justicia'
catalogo_xlsx = os.path.join("archivos-tests", "excel-no-validos", "catalogo-justicia-con-error-datasets.xlsx")

In [3]:
#NO MODIFICAR

#Creo la estructura de directorios necesaria si no existe
if not os.path.isdir("archivos-generados"):
    os.mkdir("archivos-generados")

for directorio in ["jsons", "reportes", "configuracion"]:
    path = os.path.join("archivos-generados", directorio)
    if not os.path.isdir(path):
        os.mkdir(path)

# Declaro algunas variables de interés
HOY = arrow.now().format('YYYY-MM-DD-HH_mm')
catalogo_a_json = os.path.join("archivos-generados","jsons","catalogo-{}-{}.json".format(ORGANISMO, HOY))
reporte_datasets = os.path.join("archivos-generados", "reportes", "reporte-catalogo-{}-{}.xlsx".format(ORGANISMO, HOY))
archivo_config_sin_reporte = os.path.join("archivos-generados", "configuracion", "archivo-config_-{}-{}-sinr.csv".format(ORGANISMO, HOY))
archivo_config_con_reporte = os.path.join("archivos-generados", "configuracion", "archivo-config-{}-{}-conr.csv".format(ORGANISMO, HOY))

Validación del archivo xlsx y transformación a json

Validación del catálogo en xlsx


In [4]:
catalogo = read_catalog(catalogo_xlsx)

Transformación del catálogo, de xlsx a json


In [5]:
write_json_catalog(catalogo, catalogo_a_json)
##write_json_catalog(catalog, target_file)  escribe un dicc a un archivo json

Validación del catalogo en json y harvesting

Validación del catálogo en json

Instanciación de la clase DataJson


In [6]:
dj = DataJson()

Validación -V/F- del catálogo en json


In [7]:
dj.is_valid_catalog(catalogo)
# obtenemos FALSE


Out[7]:
False

Validación detallada del catálogo en json


In [8]:
dj.validate_catalog(catalogo)
# el mensaje de Error indica que "title" es una propiedad requerida


Out[8]:
{u'error': {u'catalog': {u'errors': [],
   u'status': u'OK',
   u'title': u'Datos Justicia Argentina'},
  u'dataset': [{u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 0],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 1],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 2],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 3],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 4],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 5],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 6],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 7],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 8],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 9],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 10],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 11],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 12],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 13],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 14],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None},
   {u'errors': [{u'error_code': 1,
      u'instance': None,
      u'message': "u'title' is a required property",
      u'path': [u'dataset', 15],
      u'validator': u'required',
      u'validator_value': [u'title',
       u'description',
       u'publisher',
       u'superTheme',
       u'distribution',
       u'accrualPeriodicity',
       u'issued']}],
    u'status': u'ERROR',
    u'title': None}]},
 u'status': u'ERROR'}

Reporte al área correspondiente

En este caso debe hacerse el reporte del error al área correspondiente para que puedan completarse las omisiones. Recién luego, se estará en condiciones de seguir con el proceso.