Compare commits

...

3 commits

6 changed files with 129 additions and 121 deletions

View file

@ -1,3 +1,13 @@
## 0.2.0a24 (2025-10-10)
### Feat
- use rougail-user-data-commandline and mix config use data
### Fix
- remove force_apply_user_data support
## 0.2.0a23 (2025-10-03) ## 0.2.0a23 (2025-10-03)
### Fix ### Fix

View file

@ -4,7 +4,7 @@ requires = ["flit_core >=3.8.0,<4"]
[project] [project]
name = "rougail.cli" name = "rougail.cli"
version = "0.2.0a23" version = "0.2.0a24"
authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}] authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}]
readme = "README.md" readme = "README.md"
description = "CLI for Rougail" description = "CLI for Rougail"
@ -13,9 +13,6 @@ license = {file = "LICENSE"}
classifiers = [ classifiers = [
"License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
"Programming Language :: Python", "Programming Language :: Python",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.13",
@ -28,7 +25,7 @@ classifiers = [
] ]
dependencies = [ dependencies = [
"rougail >= 1.1,<2", "rougail >= 1.1,<2",
"tiramisu_cmdline_parser >= 0.6,<1", "rougail-user-data-commandline",
] ]
[project.scripts] [project.scripts]

View file

@ -31,6 +31,7 @@ from rougail.utils import load_modules
from rougail.user_datas import UserDatas from rougail.user_datas import UserDatas
from rougail.error import RougailWarning from rougail.error import RougailWarning
from rougail.user_data_commandline import RougailUserDataCommandline
try: try:
from rougail.user_data_yaml import RougailUserDataYaml from rougail.user_data_yaml import RougailUserDataYaml
except ImportError: except ImportError:
@ -46,111 +47,137 @@ from .i18n import _
ENV_PREFIX = "ROUGAILCLI" ENV_PREFIX = "ROUGAILCLI"
def _main(arguments, do_not_print): def _main(arguments, do_not_print):
global print_traceback
rougailconfig = get_rougail_config( rougailconfig = get_rougail_config(
backward_compatibility=False, add_extra_options=False backward_compatibility=False, add_extra_options=False
) )
rougailconfig.generate_config() rougailconfig.generate_config()
cmd_config = rougailconfig.config cmd_config = load_cmd_user_datas(rougailconfig.config, arguments)
print_traceback = rougailconfig["cli.debug"]
if rougailconfig["cli.versions"]:
versions = display_version(cmd_config)
if do_not_print:
return list(versions)
for version in versions:
print(version)
else:
manage_warnings(rougailconfig["cli.warnings"])
config, err_warn = load_user_datas(rougailconfig)
output = get_output(rougailconfig, config, err_warn)
if do_not_print:
return output.run()
ret = output.print()
if ret is False:
exit(1)
def load_cmd_user_datas(cmd_config, arguments):
origin_prop = cmd_config.property.default("read_write", "append") origin_prop = cmd_config.property.default("read_write", "append")
cmd_config.property.setdefault( cmd_config.property.setdefault(
frozenset(origin_prop | {"not_for_commandline"}), "read_write", "append" frozenset(origin_prop | {"not_for_commandline"}), "read_write", "append"
) )
cmd_config.property.read_write() cmd_config.property.read_write()
fake_rougail_config = { cmd_user_datas = []
"step.user_data": [],
}
fake_user_datas = []
if RougailUserDataYaml: if RougailUserDataYaml:
cli_config_file_key = f"{ENV_PREFIX}_CLI.CONFIG_FILE" config_file = os.environ.pop(f"{ENV_PREFIX}_CLI.CONFIG_FILE", None)
config_file = os.environ.pop(cli_config_file_key, None)
if not config_file: if not config_file:
config_file = cmd_config.forcepermissive.option("cli.config_file").value.get() config_file = cmd_config.forcepermissive.option("cli.config_file").value.get()
if Path(config_file).is_file(): if Path(config_file).is_file():
fake_rougail_config = { fake_rougail_config = {
"step.user_data": "yaml", "step.user_data": ["yaml"],
"yaml.filename": [config_file], "yaml.filename": [config_file],
"yaml.file_with_secrets": "all", "yaml.file_with_secrets": "all",
} }
fake_user_datas.extend( cmd_user_datas.extend(
RougailUserDataYaml(cmd_config, rougailconfig=fake_rougail_config).run() RougailUserDataYaml(cmd_config,
rougailconfig=fake_rougail_config,
).run()
) )
if RougailUserDataEnvironment: if RougailUserDataEnvironment:
fake_rougail_config = { fake_rougail_config = {
"step.user_data": "environment", "step.user_data": ["environment"],
"environment.default_environment_name": ENV_PREFIX, "environment.default_environment_name": ENV_PREFIX,
} }
fake_user_datas.extend( cmd_user_datas.extend(
RougailUserDataEnvironment( RougailUserDataEnvironment(
cmd_config, rougailconfig=fake_rougail_config cmd_config,
rougailconfig=fake_rougail_config,
).run() ).run()
) )
if fake_user_datas: fake_rougail_config = {
user_datas = UserDatas(cmd_config).user_datas(fake_user_datas, return_values_not_error=True) "step.user_data": ["commandline"],
else: }
user_datas = {} 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)
# replays to display errors if needed
parser = TiramisuCmdlineParser( parser = TiramisuCmdlineParser(
cmd_config, cmd_config,
# add_extra_options=False,
short_name_max_len=2, short_name_max_len=2,
) )
parser.parse_args(arguments) if not cmd_config.option("cli.versions").value.get():
if user_datas: parser.parse_args(arguments)
user_data = UserDatas(cmd_config).user_datas(user_datas, user_datas_type="values", only_default=True)
if user_data["warnings"] and cmd_config.option("cli.warnings").value.get():
for warning in user_data["warnings"]:
warn(warning)
if user_data["errors"]: if user_data["errors"]:
raise Exception(user_data["errors"][0]) raise Exception(user_data["errors"][0])
global print_traceback
print_traceback = rougailconfig["cli.debug"]
cmd_config.property.setdefault(origin_prop, "read_write", "append") cmd_config.property.setdefault(origin_prop, "read_write", "append")
cmd_config.property.remove("not_for_commandline") cmd_config.property.remove("not_for_commandline")
cmd_config.property.read_only() cmd_config.property.read_only()
if not cmd_config.option("cli.warnings").value.get(): return cmd_config
def display_version(cmd_config):
versions = []
from tiramisu import __version__
yield(f"tiramisu: {__version__}")
from tiramisu_cmdline_parser import __version__
yield(f"tiramisu-cmdline-parser: {__version__}")
from rougail import __version__
yield(f"rougail: {__version__}")
from . import __version__
yield(f"rougail-cli: {__version__}")
for step in ["structural", "user_data", "output"]:
display_step = step.replace("_", "-")
for step_name in sorted(cmd_config.unrestraint.option(f"step.{step}").value.list()):
path = (
Path(__file__).parent.parent
/ (step + "_" + step_name)
/ "__init__.py"
)
if path.is_file():
try:
module = load_modules(
"rougail." + step + "_" + step_name, str(path)
)
yield(
f"rougail-{display_step}-{step_name}: {module.__version__}"
)
except Exception as err:
pass
def manage_warnings(warnings):
if not warnings:
filterwarnings("ignore", category=DeprecationWarning) filterwarnings("ignore", category=DeprecationWarning)
filterwarnings("ignore", category=RougailWarning) filterwarnings("ignore", category=RougailWarning)
else: else:
filterwarnings("default", category=DeprecationWarning) filterwarnings("default", category=DeprecationWarning)
filterwarnings("default", category=RougailWarning) filterwarnings("default", category=RougailWarning)
if rougailconfig["cli.versions"]:
versions = []
from tiramisu import __version__
versions.append(f"tiramisu: {__version__}") def load_user_datas(rougailconfig):
from tiramisu_cmdline_parser import __version__
versions.append(f"tiramisu-cmdline-parser: {__version__}")
from rougail import __version__
versions.append(f"rougail: {__version__}")
from . import __version__
versions.append(f"rougail-cli: {__version__}")
for step in ["structural", "user_data", "output"]:
display_step = step.replace("_", "-")
for step_name in sorted(cmd_config.unrestraint.option(f"step.{step}").value.list()):
path = (
Path(__file__).parent.parent
/ (step + "_" + step_name)
/ "__init__.py"
)
if path.is_file():
try:
module = load_modules(
"rougail." + step + "_" + step_name, str(path)
)
versions.append(
f"rougail-{display_step}-{step_name}: {module.__version__}"
)
except Exception as err:
pass
if do_not_print:
return versions
for version in versions:
print(version)
return
try: try:
user_data_names = rougailconfig["step.user_data"] user_data_names = rougailconfig["step.user_data"]
except PropertiesOptionError: except PropertiesOptionError:
@ -159,59 +186,36 @@ def _main(arguments, do_not_print):
if rougailconfig["cli.load_config"]: if rougailconfig["cli.load_config"]:
rougail = Rougail(rougailconfig) rougail = Rougail(rougailconfig)
config = rougail.run() config = rougail.run()
config.property.read_write()
else: else:
config = None config = None
# data user # data user
if not user_data_names: user_datas = []
user_datas = None for user_data_name in user_data_names:
else: path = (
config.property.read_write() Path(__file__).parent.parent
user_datas = [] / ("user_data_" + user_data_name)
for user_data_name in user_data_names: / "__init__.py"
path = ( )
Path(__file__).parent.parent if not path.is_file():
/ ("user_data_" + user_data_name) raise Exception(
/ "__init__.py" _('cannot find "user_data" module "{0}"').format(user_data_name)
)
if not path.is_file():
raise Exception(
_('cannot find "user_data" module "{0}"').format(user_data_name)
)
module = load_modules("rougail.user_data_" + user_data_name, str(path))
if (
hasattr(module.RougailUserData, "force_apply_user_data")
and module.RougailUserData.force_apply_user_data is True
):
continue
user_datas.extend(
module.RougailUserData(
config,
rougailconfig=rougailconfig,
).run()
) )
module = load_modules("rougail.user_data_" + user_data_name, str(path))
user_datas.extend(
module.RougailUserData(
config,
rougailconfig=rougailconfig,
).run()
)
if user_datas: if user_datas:
err_warn = rougail.user_datas(user_datas) err_warn = rougail.user_datas(user_datas)
else: else:
err_warn = {"errors": [], "warnings": []} err_warn = {"errors": [], "warnings": []}
if user_data_names: return config, err_warn
config.property.read_write()
for user_data_name in user_data_names:
path = ( def get_output(rougailconfig, config, err_warn):
Path(__file__).parent.parent
/ ("user_data_" + user_data_name)
/ "__init__.py"
)
module = load_modules("rougail.user_data_" + user_data_name, str(path))
if (
hasattr(module.RougailUserData, "force_apply_user_data")
and module.RougailUserData.force_apply_user_data is True
):
ret = module.RougailUserData(
config,
rougailconfig=rougailconfig,
).run()
err_warn["errors"].extend(ret["errors"])
err_warn["warnings"].extend(ret["warnings"])
# output # output
if config and (not rougailconfig["cli.load_config"] or not rougailconfig["cli.read_write"]): if config and (not rougailconfig["cli.load_config"] or not rougailconfig["cli.read_write"]):
config.property.read_only() config.property.read_only()
@ -228,11 +232,7 @@ def _main(arguments, do_not_print):
user_data_errors=err_warn["errors"], user_data_errors=err_warn["errors"],
user_data_warnings=err_warn["warnings"], user_data_warnings=err_warn["warnings"],
) )
if do_not_print: return output
return output.run()
ret = output.print()
if ret is False:
exit(1)
def main(arguments=None, do_not_print=False): def main(arguments=None, do_not_print=False):

View file

@ -1 +1 @@
__version__ = "0.2.0a23" __version__ = "0.2.0a24"

View file

@ -1 +0,0 @@
["tiramisu: 5.2.0a12", "tiramisu-cmdline-parser: 0.7.0a2", "rougail: 1.2.0a35", "rougail-cli: 0.2.0a21", "rougail-structural-bitwarden: 0.1.0a5", "rougail-user-data-ansible: 0.1.0a3", "rougail-user-data-bitwarden: 0.1.0a21", "rougail-user-data-environment: 0.1.0a11", "rougail-user-data-yaml: 0.2.0a13", "rougail-output-ansible: 0.2.0a14", "rougail-output-console: 0.2.0a13", "rougail-output-doc: 0.2.0a30", "rougail-output-json: 0.2.0a10"]

View file

@ -48,6 +48,7 @@ def test_cli_boolean_no():
def test_cli_version(): def test_cli_version():
with chdir(test_dir / 'cli'): with chdir(test_dir / 'cli'):
ret = main(['--cli.version'], do_not_print=True) ret = main(['--cli.version'], do_not_print=True)
ret = [r.rsplit(': ', 1)[0] for r in ret]
filename = Path('versions.txt') filename = Path('versions.txt')
if not filename.is_file(): if not filename.is_file():
with filename.open('w') as fh: with filename.open('w') as fh:
@ -60,6 +61,7 @@ def test_cli_version():
def test_cli_version_user_data_disabled(): def test_cli_version_user_data_disabled():
with chdir(test_dir / 'cli'): with chdir(test_dir / 'cli'):
ret = main(['--cli.version', '--step.output', 'doc'], do_not_print=True) ret = main(['--cli.version', '--step.output', 'doc'], do_not_print=True)
ret = [r.rsplit(': ', 1)[0] for r in ret]
filename = Path('versions.txt') filename = Path('versions.txt')
if not filename.is_file(): if not filename.is_file():
with filename.open('w') as fh: with filename.open('w') as fh: