From 5aff9ed94474572d55cf8b045014a2ff69e70232 Mon Sep 17 00:00:00 2001 From: Julien Moura Date: Tue, 23 Apr 2024 12:38:19 +0200 Subject: [PATCH] feature(cli): add command to export rules context in current environment --- qgis_deployment_toolbelt/cli.py | 15 ++- qgis_deployment_toolbelt/commands/__init__.py | 5 - .../commands/rules_context.py | 91 +++++++++++++++++++ tests/test_cli_rules_context_export.py | 50 ++++++++++ 4 files changed, 155 insertions(+), 6 deletions(-) create mode 100644 qgis_deployment_toolbelt/commands/rules_context.py create mode 100644 tests/test_cli_rules_context_export.py diff --git a/qgis_deployment_toolbelt/cli.py b/qgis_deployment_toolbelt/cli.py index 09e5751a..2e54bf2b 100644 --- a/qgis_deployment_toolbelt/cli.py +++ b/qgis_deployment_toolbelt/cli.py @@ -25,7 +25,9 @@ __uri_homepage__, __version__, ) -from qgis_deployment_toolbelt.commands import parser_main_deployment, parser_upgrade +from qgis_deployment_toolbelt.commands.deployment import parser_main_deployment +from qgis_deployment_toolbelt.commands.rules_context import parser_rules_context_export +from qgis_deployment_toolbelt.commands.upgrade import parser_upgrade from qgis_deployment_toolbelt.utils.journalizer import configure_logger # ############################################################################# @@ -166,6 +168,17 @@ def main(in_args: list[str] = None): add_common_arguments(subcmd_deployment) parser_main_deployment(subcmd_deployment) + # Rules context + subcmd_rules_context = subparsers.add_parser( + "export-rules-context", + help="Export QDT rules context taking into account the local environment to " + "help rules writing.", + formatter_class=main_parser.formatter_class, + prog="rules-context-export", + ) + add_common_arguments(subcmd_rules_context) + parser_rules_context_export(subcmd_rules_context) + # Upgrader subcmd_upgrade = subparsers.add_parser( "upgrade", diff --git a/qgis_deployment_toolbelt/commands/__init__.py b/qgis_deployment_toolbelt/commands/__init__.py index 308ad01e..e69de29b 100644 --- a/qgis_deployment_toolbelt/commands/__init__.py +++ b/qgis_deployment_toolbelt/commands/__init__.py @@ -1,5 +0,0 @@ -#! python3 # noqa: E265 - -# submodules -from .deployment import parser_main_deployment # noqa: F401 -from .upgrade import parser_upgrade # noqa: F401 diff --git a/qgis_deployment_toolbelt/commands/rules_context.py b/qgis_deployment_toolbelt/commands/rules_context.py new file mode 100644 index 00000000..68e2c06e --- /dev/null +++ b/qgis_deployment_toolbelt/commands/rules_context.py @@ -0,0 +1,91 @@ +#! python3 # noqa: E265 + + +""" + Sub-command to export local rules context. + + Author: Julien M. (https://github.com/guts) +""" + + +# ############################################################################ +# ########## IMPORTS ############# +# ################################ + +# standard library +import argparse +import logging +from pathlib import Path + +# package +from qgis_deployment_toolbelt.constants import get_qdt_working_directory +from qgis_deployment_toolbelt.profiles.rules_context import QdtRulesContext +from qgis_deployment_toolbelt.utils.bouncer import exit_cli_error, exit_cli_success + +# ############################################################################ +# ########## GLOBALS ############# +# ################################ + +logger = logging.getLogger(__name__) + + +# ############################################################################ +# ########## CLI ################# +# ################################ + + +def parser_rules_context_export( + subparser: argparse.ArgumentParser, +) -> argparse.ArgumentParser: + """Set the argument parser for subcommand. + + Args: + subparser (argparse.ArgumentParser): parser to set up + + Returns: + argparse.ArgumentParser: parser ready to use + """ + + subparser.add_argument( + "-o", + "--output", + help="Path to the output file where to write rules context.", + default=get_qdt_working_directory().joinpath("export/qdt_rules_context.json"), + type=Path, + dest="output_path", + ) + + subparser.set_defaults(func=run) + + return subparser + + +# ############################################################################ +# ########## MAIN ################ +# ################################ + + +def run(args: argparse.Namespace): + """Run the sub command logic. + + Open result of a previous command. + + Args: + args (argparse.Namespace): arguments passed to the subcommand + """ + logger.debug(f"Running {args.command} with {args}") + + try: + context_json_path = Path(args.output_path) + context_json_path.parent.mkdir(parents=True, exist_ok=True) + rules_context = QdtRulesContext() + + # write into the file passing extra parameters to json.dumps + with context_json_path.open("w", encoding="UTF8") as wf: + wf.write(rules_context.to_json(indent=4, sort_keys=True)) + + # exit nicely + print(f"Rules context exported in {args.output_path}") + exit_cli_success(f"Rules context exported in {args.output_path}") + except Exception as err: + exit_cli_error(err) diff --git a/tests/test_cli_rules_context_export.py b/tests/test_cli_rules_context_export.py new file mode 100644 index 00000000..ad4caadf --- /dev/null +++ b/tests/test_cli_rules_context_export.py @@ -0,0 +1,50 @@ +#! python3 # noqa: E265 + +""" + Test CLI's rules context export command. + + Author: Julien Moura (Oslandia) +""" + +# ############################################################################# +# ########## Libraries ############# +# ################################## + + +# 3rd party +import pytest + +# project +from qgis_deployment_toolbelt import cli + +# ############################################################################# +# ######## Classes ################# +# ################################## + + +@pytest.mark.parametrize("option", ("-h", "--help")) +def test_cli_export_rules_context_help(capsys, option): + """Test CLI help.""" + with pytest.raises(SystemExit): + cli.main(["export-rules-context", option]) + + out, err = capsys.readouterr() + + assert err == "" + + +def test_cli_export_rules_context(capsys): + """Test CLI.""" + with pytest.raises(SystemExit): + cli.main(["export-rules-context"]) + + out, err = capsys.readouterr() + + assert err == "" + + +# ############################################################################# +# ######## Standalone ############## +# ################################## +if __name__ == "__main__": + pass