diff --git a/src/rougail/cli/__main__.py b/src/rougail/cli/__main__.py index 77bcef0..810ff9a 100644 --- a/src/rougail/cli/__main__.py +++ b/src/rougail/cli/__main__.py @@ -17,7 +17,7 @@ along with Mtools. If not, see . """ import os -from warnings import warn, filterwarnings +from warnings import filterwarnings from pathlib import Path from sys import exit @@ -28,10 +28,8 @@ from tiramisu import Config from rougail import Rougail from rougail.config import get_rougail_config from rougail.utils import load_modules -from rougail.user_datas import UserDatas from rougail.error import RougailWarning -from rougail.user_data_commandline import RougailUserDataCommandline try: from rougail.user_data_yaml import RougailUserDataYaml except ImportError: @@ -40,6 +38,7 @@ try: from rougail.user_data_environment import RougailUserDataEnvironment except ImportError: RougailUserDataEnvironment = None +from .rougailconfig import load as rougailconfig_load from .i18n import _ @@ -52,8 +51,7 @@ def _main(arguments, do_not_print): rougailconfig = get_rougail_config( backward_compatibility=False, add_extra_options=False ) - rougailconfig.generate_config() - cmd_config = load_cmd_user_datas(rougailconfig.config, arguments) + cmd_config = load_cmd_user_datas(rougailconfig, arguments) print_traceback = rougailconfig["cli.debug"] if rougailconfig["cli.versions"]: versions = display_version(cmd_config) @@ -72,59 +70,32 @@ def _main(arguments, do_not_print): exit(1) -def load_cmd_user_datas(cmd_config, arguments): +def load_cmd_user_datas(rougailconfig, arguments): + rougailconfig.generate_config() + cmd_config = rougailconfig.config origin_prop = cmd_config.property.default("read_write", "append") cmd_config.property.setdefault( frozenset(origin_prop | {"not_for_commandline"}), "read_write", "append" ) cmd_config.property.read_write() - cmd_user_datas = [] + config_file = None if RougailUserDataYaml: - config_file = os.environ.pop(f"{ENV_PREFIX}_CLI.CONFIG_FILE", None) - if not config_file: - config_file = cmd_config.forcepermissive.option("cli.config_file").value.get() - if Path(config_file).is_file(): - fake_rougail_config = { - "step.user_data": ["yaml"], - "yaml.filename": [config_file], - "yaml.file_with_secrets": "all", - } - cmd_user_datas.extend( - RougailUserDataYaml(cmd_config, - rougailconfig=fake_rougail_config, - ).run() - ) + _config_file = os.environ.pop(f"{ENV_PREFIX}_CLI.CONFIG_FILE", None) + if not _config_file: + _config_file = cmd_config.forcepermissive.option("cli.config_file").value.get() + if Path(_config_file).is_file(): + config_file = _config_file if RougailUserDataEnvironment: - fake_rougail_config = { - "step.user_data": ["environment"], - "environment.default_environment_name": ENV_PREFIX, - } - cmd_user_datas.extend( - RougailUserDataEnvironment( - cmd_config, - rougailconfig=fake_rougail_config, - ).run() - ) - fake_rougail_config = { - "step.user_data": ["commandline"], - } - cmd_user_datas.extend( - RougailUserDataCommandline(cmd_config, - rougailconfig=fake_rougail_config, - short_name_max_len=2, - arguments=arguments, - ).run() - ) - user_data = UserDatas(cmd_config).user_datas(cmd_user_datas) - if user_data["warnings"] and cmd_config.option("cli.warnings").value.get(): - for warning in user_data["warnings"]: - warn(warning) + env_prefix = ENV_PREFIX + else: + env_prefix = None + user_data = rougailconfig_load(rougailconfig, config_file, env_prefix, True, display_warnings=cmd_config.option("cli.warnings").value.get(), raise_on_error=False, _arguments=arguments, _generate=False) # replays to display errors if needed - parser = TiramisuCmdlineParser( - cmd_config, - short_name_max_len=2, - ) if not cmd_config.option("cli.versions").value.get(): + parser = TiramisuCmdlineParser( + cmd_config, + short_name_max_len=2, + ) parser.parse_args(arguments) if user_data["errors"]: raise Exception(user_data["errors"][0]) diff --git a/src/rougail/cli/rougailconfig.py b/src/rougail/cli/rougailconfig.py new file mode 100644 index 0000000..d5b4254 --- /dev/null +++ b/src/rougail/cli/rougailconfig.py @@ -0,0 +1,86 @@ +""" +Silique (https://www.silique.fr) +Copyright (C) 2025 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mtools is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mtools. If not, see . +""" +from warnings import warn +from rougail.user_datas import UserDatas + + +def load(rougailconfig: "RougailConfig", + yaml_file: str=None, + env_prefix: str=None, + commandline: bool=False, + display_warnings: bool=True, + raise_on_error: bool=True, + _arguments=None, + _generate=True + ): + if _generate: + rougailconfig.generate_config() + cmd_config = rougailconfig.config + origin_prop = cmd_config.property.exportation() + cmd_config.property.read_write() + user_datas = [] + if yaml_file: + user_datas.extend(from_yaml(cmd_config, yaml_file)) + if env_prefix: + user_datas.extend(from_env(cmd_config, env_prefix)) + if commandline: + user_datas.extend(from_cmdline(cmd_config, _arguments)) + user_data = UserDatas(cmd_config).user_datas(user_datas) + if display_warnings and user_data["warnings"]: + for warning in user_data["warnings"]: + warn(warning) + if raise_on_error and user_data["errors"]: + raise Exception(user_data["errors"][0]) + cmd_config.property.importation(origin_prop) + return user_data + + +def from_yaml(cmd_config, yaml_file): + from rougail.user_data_yaml import RougailUserDataYaml + fake_rougail_config = { + "step.user_data": ["yaml"], + "yaml.filename": [yaml_file], + "yaml.file_with_secrets": "all", + } + return RougailUserDataYaml(cmd_config, + rougailconfig=fake_rougail_config, + ).run() + + +def from_env(cmd_config, env_prefix): + from rougail.user_data_environment import RougailUserDataEnvironment + fake_rougail_config = { + "step.user_data": ["environment"], + "environment.default_environment_name": env_prefix, + } + return RougailUserDataEnvironment( + cmd_config, + rougailconfig=fake_rougail_config, + ).run() + + +def from_cmdline(cmd_config, arguments): + from rougail.user_data_commandline import RougailUserDataCommandline + fake_rougail_config = { + "step.user_data": ["commandline"], + } + return RougailUserDataCommandline(cmd_config, + rougailconfig=fake_rougail_config, + short_name_max_len=2, + arguments=arguments, + ).run() diff --git a/tests/cli/versions.txt b/tests/cli/versions.txt new file mode 100644 index 0000000..7053e45 --- /dev/null +++ b/tests/cli/versions.txt @@ -0,0 +1 @@ +["tiramisu", "tiramisu-cmdline-parser", "rougail", "rougail-cli", "rougail-structural-bitwarden", "rougail-user-data-ansible", "rougail-user-data-bitwarden", "rougail-user-data-commandline", "rougail-user-data-environment", "rougail-user-data-yaml", "rougail-output-ansible", "rougail-output-console", "rougail-output-doc", "rougail-output-json"] diff --git a/tests/rougailcli_file/yaml.txt b/tests/rougailcli_file/yaml.txt index c9279d3..e9c3832 100644 --- a/tests/rougailcli_file/yaml.txt +++ b/tests/rougailcli_file/yaml.txt @@ -1 +1 @@ -"{\n \"my_variable\": {\n \"type\": \"variable\",\n \"default\": {\n \"name\": \"Default\",\n \"values\": \"my_value\"\n },\n \"properties\": [\n {\n \"type\": \"type\",\n \"name\": \"string\"\n },\n {\n \"type\": \"property\",\n \"name\": \"mandatory\"\n }\n ],\n \"paths\": [\n \"my_variable\"\n ],\n \"names\": [\n \"my_variable\"\n ],\n \"descriptions\": [\n \"A description.\"\n ]\n }\n}" \ No newline at end of file +"{\n \"my_variable\": {\n \"type\": \"variable\",\n \"default\": {\n \"name\": \"Default\",\n \"values\": \"my_value\"\n },\n \"properties\": [\n {\n \"type\": \"type\",\n \"name\": \"string\"\n },\n {\n \"type\": \"property\",\n \"name\": \"mandatory\"\n }\n ],\n \"path\": \"my_variable\",\n \"names\": [\n \"my_variable\"\n ],\n \"description\": \"A description.\"\n }\n}" \ No newline at end of file diff --git a/tests/second_step/yaml.txt b/tests/second_step/yaml.txt index c9279d3..e9c3832 100644 --- a/tests/second_step/yaml.txt +++ b/tests/second_step/yaml.txt @@ -1 +1 @@ -"{\n \"my_variable\": {\n \"type\": \"variable\",\n \"default\": {\n \"name\": \"Default\",\n \"values\": \"my_value\"\n },\n \"properties\": [\n {\n \"type\": \"type\",\n \"name\": \"string\"\n },\n {\n \"type\": \"property\",\n \"name\": \"mandatory\"\n }\n ],\n \"paths\": [\n \"my_variable\"\n ],\n \"names\": [\n \"my_variable\"\n ],\n \"descriptions\": [\n \"A description.\"\n ]\n }\n}" \ No newline at end of file +"{\n \"my_variable\": {\n \"type\": \"variable\",\n \"default\": {\n \"name\": \"Default\",\n \"values\": \"my_value\"\n },\n \"properties\": [\n {\n \"type\": \"type\",\n \"name\": \"string\"\n },\n {\n \"type\": \"property\",\n \"name\": \"mandatory\"\n }\n ],\n \"path\": \"my_variable\",\n \"names\": [\n \"my_variable\"\n ],\n \"description\": \"A description.\"\n }\n}" \ No newline at end of file