Skip to content

Commit

Permalink
Merge pull request #20 from datosgobar/0.1.3
Browse files Browse the repository at this point in the history
0.1.3
  • Loading branch information
abenassi committed Dec 19, 2016
2 parents f1ba16a + 2b01cab commit de61941
Show file tree
Hide file tree
Showing 52 changed files with 1,541 additions and 474 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,6 @@ target/

# Vim swap files
*.swp

# Archivos de desarrollo
allresults.py
7 changes: 6 additions & 1 deletion HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
History
===
=======

0.1.4 (2016-12-16)
------------------

* Al resultado de `DataJson.validate_catalog()` se le incorpora una lista (`"errors"`) con información de los errores encontrados durante la validación en cada nivel de jerarquía ("catalog" y cada elemento de "dataset")

0.1.2 (2016-12-14)
------------------
Expand Down
48 changes: 31 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,15 @@ print validation_report
"error": {
"catalog": {
"status": "OK",
"errors": [],
"title": "Datos Argentina"
},
"dataset": [
{
"status": "OK",
"errors": [],
"title": "Sistema de contrataciones electrónicas"
}

]
}
}
Expand All @@ -120,7 +121,7 @@ print validation_report
#### Archivo data.json remoto

```python
datajson_url = "http://104.131.35.253/data.json"
datajson_url = "http://181.209.63.71/data.json"
validation_result = dj.is_valid_catalog(datajson_url)
validation_report = dj.validate_catalog(datajson_url)

Expand All @@ -133,24 +134,37 @@ print validation_report
"error": {
"catalog": {
"status": "ERROR",
"title": "Título del portal"
"errors": [
{
"instance": "",
"validator": "format",
"path": [
"publisher",
"mbox"
],
"message": "u'' is not a u'email'",
"error_code": 2,
"validator_value": "email"
},
{
"instance": "",
"validator": "minLength",
"path": [
"publisher",
"name"
],
"message": "u'' is too short",
"error_code": 2,
"validator_value": 1
}
],
"title": "Andino"
},
"dataset": [
{
"status": "ERROR",
"title": "Dataset ejemplo 04"
},
{
"status": "ERROR",
"title": "Dataset ejemplo 03"
},
{
"status": "ERROR",
"title": "Dataset ejemplo 02"
},
{
"status": "ERROR",
"title": "Dataset ejemplo 01"
"status": "OK",
"errors": [],
"title": "Dataset Demo"
}
]
}
Expand Down
7 changes: 6 additions & 1 deletion docs/HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
History
===
=======

0.1.4 (2016-12-16)
------------------

* Al resultado de `DataJson.validate_catalog()` se le incorpora una lista (`"errors"`) con información de los errores encontrados durante la validación en cada nivel de jerarquía ("catalog" y cada elemento de "dataset")

0.1.2 (2016-12-14)
------------------
Expand Down
48 changes: 31 additions & 17 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,15 @@ print validation_report
"error": {
"catalog": {
"status": "OK",
"errors": [],
"title": "Datos Argentina"
},
"dataset": [
{
"status": "OK",
"errors": [],
"title": "Sistema de contrataciones electrónicas"
}

]
}
}
Expand All @@ -120,7 +121,7 @@ print validation_report
#### Archivo data.json remoto

```python
datajson_url = "http://104.131.35.253/data.json"
datajson_url = "http://181.209.63.71/data.json"
validation_result = dj.is_valid_catalog(datajson_url)
validation_report = dj.validate_catalog(datajson_url)

Expand All @@ -133,24 +134,37 @@ print validation_report
"error": {
"catalog": {
"status": "ERROR",
"title": "Título del portal"
"errors": [
{
"instance": "",
"validator": "format",
"path": [
"publisher",
"mbox"
],
"message": "u'' is not a u'email'",
"error_code": 2,
"validator_value": "email"
},
{
"instance": "",
"validator": "minLength",
"path": [
"publisher",
"name"
],
"message": "u'' is too short",
"error_code": 2,
"validator_value": 1
}
],
"title": "Andino"
},
"dataset": [
{
"status": "ERROR",
"title": "Dataset ejemplo 04"
},
{
"status": "ERROR",
"title": "Dataset ejemplo 03"
},
{
"status": "ERROR",
"title": "Dataset ejemplo 02"
},
{
"status": "ERROR",
"title": "Dataset ejemplo 01"
"status": "OK",
"errors": [],
"title": "Dataset Demo"
}
]
}
Expand Down
2 changes: 1 addition & 1 deletion pydatajson/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@

__author__ = """Datos Argentina"""
__email__ = 'datos@modernizacion.gob.ar'
__version__ = '0.1.2'
__version__ = '0.1.3'
76 changes: 58 additions & 18 deletions pydatajson/pydatajson.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from urlparse import urljoin, urlparse
import warnings
import json
from pprint import pprint
import jsonschema
import requests

Expand Down Expand Up @@ -55,6 +54,10 @@ def _create_validator(cls, schema_filename, schema_dir):
directorio base (absoluto) y el archivo desde el que se referencia el
directorio.
Para poder validar formatos, un Validador requiere que se provea
explícitamente un FormatChecker. Actualmente se usa el default de la
librería, jsonschema.FormatChecker().
Args:
schema_filename (str): Nombre del archivo que contiene el esquema
validador "maestro".
Expand Down Expand Up @@ -131,7 +134,8 @@ def is_valid_catalog(self, datajson_path):
"""Valida que un archivo `data.json` cumpla con el schema definido.
Chequea que el data.json tiene todos los campos obligatorios y que
siguen la estructura definida en el schema.
tanto los campos obligatorios como los opcionales siguen la estructura
definida en el schema.
Args:
datajson_path (str): Path al archivo data.json a ser validado.
Expand All @@ -147,7 +151,8 @@ def validate_catalog(self, datajson_path):
"""Analiza un data.json registrando los errores que encuentra.
Chequea que el data.json tiene todos los campos obligatorios y que
siguen la estructura definida en el schema.
tanto los campos obligatorios como los opcionales siguen la estructura
definida en el schema.
Args:
datajson_path (str): Path al archivo data.json a ser validado.
Expand All @@ -158,13 +163,29 @@ def validate_catalog(self, datajson_path):
{
"status": "OK", # resultado de la validación global
"error": {
"catalog": {"status": "OK", "title": "Título Catalog"},
"catalog": {
"status": "OK",
"errors": []
"title": "Título Catalog"},
"dataset": [
{"status": "OK", "title": "Titulo Dataset 1"},
{"status": "ERROR", "title": "Titulo Dataset 2"}
{
"status": "OK",
"errors": [],
"title": "Titulo Dataset 1"
},
{
"status": "ERROR",
"errors": [error1_info, error2_info, ...],
"title": "Titulo Dataset 2"
}
]
}
}
Donde errorN_info es un dict con la información del N-ésimo
error encontrado, con las siguientes claves: "path", "instance",
"message", "validator", "validator_value", "error_code".
"""
datajson = self._json_to_dict(datajson_path)

Expand All @@ -174,37 +195,56 @@ def validate_catalog(self, datajson_path):
"error": {
"catalog": {
"status": "OK",
"title": datajson.get("title")
"title": datajson.get("title"),
"errors": []
},
# "dataset" contiene lista de rtas default si el catálogo
# contiene la clave "dataset" y además su valor es una lista.
# En caso contrario "dataset" es None.
"dataset": [
{
"status": "OK",
"title": dataset.get("title")
"title": dataset.get("title"),
"errors": []
} for dataset in datajson["dataset"]
] if ("dataset" in datajson and
isinstance(datajson["dataset"], list)) else None
}
}

def _update_response(validation_error, response):
def _update_response(error, response):
"""Actualiza la respuesta por default acorde a un error de
validación."""
new_response = response.copy()

# El status del catálogo entero será ERROR
new_response["status"] = "ERROR"

path = validation_error.path
# Adapto la información del ValidationError recibido a los fines
# del validador de DataJsons
error_info = {
# Error Code 1 para "campo obligatorio faltante"
# Error Code 2 para "error en tipo o formato de campo"
"error_code": 1 if error.validator == "required" else 2,
"message": error.message,
"validator": error.validator,
"validator_value": error.validator_value,
"path": list(error.path),
# La instancia validada es irrelevante si el error es de tipo 1
"instance": (None if error.validator == "required" else
error.instance)
}

if len(path) >= 2 and path[0] == "dataset":
# Identifico a qué nivel de jerarquía sucedió el error.
if len(error.path) >= 2 and error.path[0] == "dataset":
# El error está a nivel de un dataset particular o inferior
new_response["error"]["dataset"][path[1]]["status"] = "ERROR"
position = new_response["error"]["dataset"][error.path[1]]
else:
# El error está a nivel de catálogo
new_response["error"]["catalog"]["status"] = "ERROR"
position = new_response["error"]["catalog"]

position["status"] = "ERROR"
position["errors"].append(error_info)

return new_response

Expand All @@ -229,11 +269,11 @@ def main():
python pydatajson.py ~/github/pydatajson/tests/samples/full_data.json
"""
datajson_file = sys.argv[1]
dj = DataJson()
bool_res = dj.is_valid_catalog(datajson_file)
full_res = dj.validate_catalog(datajson_file)
pprint(bool_res)
pprint(full_res)
dj_instance = DataJson()
bool_res = dj_instance.is_valid_catalog(datajson_file)
full_res = dj_instance.validate_catalog(datajson_file)
print(bool_res)
print(json.dumps(full_res, separators=(",", ": "), indent=4))


if __name__ == '__main__':
Expand Down

0 comments on commit de61941

Please sign in to comment.