From 9a4edcc16b48f84ef120e35a2281ebb39168d9d9 Mon Sep 17 00:00:00 2001 From: amercader Date: Mon, 6 May 2024 11:42:59 +0200 Subject: [PATCH] Consume command --- ckanext/dcat/cli.py | 75 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 65 insertions(+), 10 deletions(-) diff --git a/ckanext/dcat/cli.py b/ckanext/dcat/cli.py index ade76959..7dcf8105 100644 --- a/ckanext/dcat/cli.py +++ b/ckanext/dcat/cli.py @@ -1,25 +1,80 @@ # -*- coding: utf-8 -*- +import json import click + import ckan.plugins.toolkit as tk + import ckanext.dcat.utils as utils +from ckanext.dcat.processors import RDFParser, RDFSerializer, DEFAULT_RDF_PROFILES -@click.group() -def generate_static(): - """Generates static files containing all datasets. - """ +@click.group() +def dcat(): + """DCAT utilities for CKAN""" pass -@generate_static.command() -@click.argument('output', type=click.File(mode="w")) -def json(output): - """The generate command will generate a static file containing all of - the datasets in the catalog in JSON format. +@dcat.command() +@click.argument("output", type=click.File(mode="w")) +def generate_static(output): + """[Deprecated] Generate a static datasets file in JSON format + (requires the dcat_json_interface plugin) . """ utils.generate_static_json(output) +@dcat.command(context_settings={"show_default": True}) +@click.argument("input", type=click.File(mode="r")) +@click.option( + "-o", + "--output", + type=click.File(mode="w"), + default="-", + help="By default the command will output the result to stdin, " + "alternatively you can provide a file path with this option", +) +@click.option( + "-f", "--format", default="xml", help="Serialization format (eg ttl, jsonld)" +) +@click.option( + "-p", + "--profiles", + default=" ".join(DEFAULT_RDF_PROFILES), + help="RDF profiles to use", +) +@click.option( + "-P", "--pretty", default=False, help="Make the output more human readable" +) +@click.option( + "-m", "--compat_mode", default=False, help="Compatibility mode (deprecated)" +) +def consume(input, output, format, profiles, pretty, compat_mode): + """ + Parses DCAT RDF graphs into CKAN dataset JSON objects. + + The input serializations can be provided as a path to a file, e.g.: + + ckan dcat consume examples/dataset.ttl + + Or be read from stdin: + + ckan dcat consume - + """ + contents = input.read() + + if profiles: + profiles = profiles.split() + parser = RDFParser(profiles=profiles, compatibility_mode=compat_mode) + parser.parse(contents, _format=format) + + ckan_datasets = [d for d in parser.datasets()] + + indent = 4 if pretty else None + out = json.dumps(ckan_datasets, indent=indent) + + output.write(out) + + def get_commands(): - return [generate_static] + return [dcat]