Compare commits

..

38 commits

Author SHA1 Message Date
57df91ebee bump: version 0.2.0a15 → 0.2.0a16 2025-05-09 08:23:35 +02:00
8751165a7c fix: description 2025-05-09 07:45:42 +02:00
63b2131908 bump: version 0.2.0a14 → 0.2.0a15 2025-05-05 16:59:45 +02:00
577f354e70 fix: do not raise if warning in cli 2025-05-05 16:59:25 +02:00
10d495c9a8 bump: version 0.2.0a13 → 0.2.0a14 2025-05-02 08:09:23 +02:00
e11885fbd7 fix: do not force use_data usage 2025-05-02 08:09:14 +02:00
9fb4cb8351 bump: version 0.2.0a12 → 0.2.0a13 2025-04-30 09:03:10 +02:00
0102eede49 fix: add first test + remove add_extra_options option in tiramisu-cmdline-parser 2025-04-29 22:54:52 +02:00
05fcb14364 fix: remove negative_description support 2025-04-29 22:53:29 +02:00
aa5c2f773c fix: display user-data instead of user_data in version 2025-04-27 10:30:00 +02:00
f5f85ba79f bump: version 0.2.0a11 → 0.2.0a12 2025-04-09 21:22:44 +02:00
cf0fc37aef fix: version 2025-04-09 21:22:41 +02:00
8ecc0e0f55 bump: version 0.2.0a10 → 0.2.0a11 2025-03-31 16:38:16 +02:00
0f1e1b9ea5 fix: translation 2025-03-31 16:38:01 +02:00
1036ccb358 bump: version 0.2.0a9 → 0.2.0a10 2025-03-31 10:25:20 +02:00
5327ff1917 fix: access to cli.config_file variable with commandline 2025-03-31 10:24:01 +02:00
c31652256f bump: version 0.2.0a8 → 0.2.0a9 2025-03-31 09:30:43 +02:00
8c924a7cba feat: cli loads .rougailcli.yml file 2025-03-31 09:30:29 +02:00
3f2920f37c bump: version 0.2.0a7 → 0.2.0a8 2025-02-17 11:17:43 +01:00
0010c9cf07 fix: add config.py file 2025-02-17 11:17:23 +01:00
fb7c3c3346 bump: version 0.2.0a6 → 0.2.0a7 2025-02-17 10:01:27 +01:00
e6582d6d9d fix: better error support 2025-02-17 10:01:23 +01:00
5cfa351e67 bump: version 0.2.0a5 → 0.2.0a6 2025-02-10 10:00:37 +01:00
e9b1ab5f85 feat: return 1 if output has problems 2025-02-10 10:00:09 +01:00
95da29454a bump: version 0.2.0a4 → 0.2.0a5 2025-02-05 11:58:25 +01:00
a530ff33d6 feat: user_data can be loaded after other plugins 2025-02-05 11:57:06 +01:00
dcbe1a99d6 bump: version 0.2.0a3 → 0.2.0a4 2025-01-04 12:33:31 +01:00
c0d103f2e8 fix: add and remove not_for_commandline property 2025-01-04 12:33:26 +01:00
e87bcbd4c8 bump: version 0.2.0a2 → 0.2.0a3 2025-01-04 12:00:02 +01:00
703b1ce70e fix: remove upgrade feature (now in formatter project) + better support of not_for_commandline feature 2025-01-04 11:59:43 +01:00
60ee2a6feb bump: version 0.2.0a1 → 0.2.0a2 2024-12-11 22:19:57 +01:00
6feebea664 fix: user_data and output are not plugins 2024-12-11 22:19:44 +01:00
b5c845f90c bump: version 0.2.0a0 → 0.2.0a1 2024-11-28 21:47:36 +01:00
c79975c5df fix: separation between run and print function 2024-11-28 21:47:22 +01:00
52cbfc1f15 bump: version 0.1.2a0 → 0.2.0a0 2024-11-27 10:24:53 +01:00
e62797c79f feat: load config from environment if rougail-user-data-environment is installed 2024-11-27 09:20:30 +01:00
8073ef9bc1 bump: version 0.1.1 → 0.1.2a0 2024-11-25 09:20:44 +01:00
ea0076279c fix: translation is not mandatory 2024-11-25 09:18:59 +01:00
14 changed files with 387 additions and 39 deletions

View file

@ -1,3 +1,113 @@
## 0.2.0a16 (2025-05-09)
### Fix
- description
## 0.2.0a15 (2025-05-05)
### Fix
- do not raise if warning in cli
## 0.2.0a14 (2025-05-02)
### Fix
- do not force use_data usage
## 0.2.0a13 (2025-04-30)
### Fix
- add first test + remove add_extra_options option in tiramisu-cmdline-parser
- remove negative_description support
- display user-data instead of user_data in version
## 0.2.0a12 (2025-04-09)
### Fix
- version
## 0.2.0a11 (2025-03-31)
### Fix
- translation
## 0.2.0a10 (2025-03-31)
### Fix
- access to cli.config_file variable with commandline
## 0.2.0a9 (2025-03-31)
### Feat
- cli loads .rougailcli.yml file
## 0.2.0a8 (2025-02-17)
### Fix
- add config.py file
## 0.2.0a7 (2025-02-17)
### Fix
- better error support
## 0.2.0a6 (2025-02-10)
### Feat
- return 1 if output has problems
## 0.2.0a5 (2025-02-05)
### Feat
- user_data can be loaded after other plugins
## 0.2.0a4 (2025-01-04)
### Fix
- add and remove not_for_commandline property
## 0.2.0a3 (2025-01-04)
### Fix
- remove upgrade feature (now in formatter project) + better support of not_for_commandline feature
## 0.2.0a2 (2024-12-11)
### Fix
- user_data and output are not plugins
## 0.2.0a1 (2024-11-28)
### Fix
- separation between run and print function
## 0.2.0a0 (2024-11-27)
### Feat
- load config from environment if rougail-user-data-environment is installed
### Fix
- translation is not mandatory
## 0.1.1 (2024-11-06)
## 0.1.1rc0 (2024-11-06)
### Fix

Binary file not shown.

View file

@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2024-10-31 09:57+0100\n"
"PO-Revision-Date: 2024-10-31 10:00+0100\n"
"POT-Creation-Date: 2025-04-09 21:21+0200\n"
"PO-Revision-Date: 2025-04-09 21:22+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
@ -16,14 +16,38 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 3.5\n"
#: src/rougail/cli/__main__.py:43
#: src/rougail/cli/__main__.py:125
msgid "cannot find \"user_data\" module \"{0}\""
msgstr "ne peut trouve le module \"user_data\" \"{0}\""
#: src/rougail/cli/__main__.py:56
#: src/rougail/cli/__main__.py:162
msgid "cannot find cli file for \"output_name\" module \"{0}\""
msgstr "ne peut trouve le fichier cli pour le module \"output_name\" \"{0}\""
#: src/rougail/cli/__main__.py:69
#: src/rougail/cli/__main__.py:184
msgid "ERROR: {0}"
msgstr "ERREUR : {0}"
#: src/rougail/cli/config.py:28
msgid "Command line options"
msgstr "Options de la ligne de commande"
#: src/rougail/cli/config.py:31
msgid "loads command line parameters from a file"
msgstr "charge les paramètres de la ligne de commande depuis un fichier"
#: src/rougail/cli/config.py:39
msgid "display debug informations"
msgstr "affiche les informations de debug"
#: src/rougail/cli/config.py:40
msgid "do not display debug informations"
msgstr "ne pas afficher les informations de debug"
#: src/rougail/cli/config.py:44
msgid "display rougail version and all componants"
msgstr "afficher la version de rougail et de tous ces composants"
#: src/rougail/cli/config.py:45
msgid "do not display rougail version and all componants"
msgstr "ne pas afficher la version de rougail et de tous ces composants"

View file

@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2024-10-31 19:17+0100\n"
"POT-Creation-Date: 2025-05-03 22:46+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -15,15 +15,31 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n"
#: src/rougail/cli/__main__.py:63
#: src/rougail/cli/__main__.py:130
msgid "cannot find \"user_data\" module \"{0}\""
msgstr ""
#: src/rougail/cli/__main__.py:76
#: src/rougail/cli/__main__.py:168
msgid "cannot find cli file for \"output_name\" module \"{0}\""
msgstr ""
#: src/rougail/cli/__main__.py:89
#: src/rougail/cli/__main__.py:193
msgid "ERROR: {0}"
msgstr ""
#: src/rougail/cli/config.py:28
msgid "Command line options"
msgstr ""
#: src/rougail/cli/config.py:31
msgid "loads command line parameters from a file"
msgstr ""
#: src/rougail/cli/config.py:39
msgid "display debug informations"
msgstr ""
#: src/rougail/cli/config.py:43
msgid "display rougail version and all componants"
msgstr ""

View file

@ -4,7 +4,7 @@ requires = ["flit_core >=3.8.0,<4"]
[project]
name = "rougail.cli"
version = "0.1.1"
version = "0.2.0a16"
authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}]
readme = "README.md"
description = "CLI for Rougail"
@ -18,6 +18,8 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
"Natural Language :: English",
@ -40,5 +42,9 @@ name = "cz_conventional_commits"
tag_format = "$version"
version_scheme = "pep440"
version_provider = "pep621"
#update_changelog_on_bump = true
version_files = [
"src/rougail/cli/__version__.py",
"pyproject.toml:version"
]
update_changelog_on_bump = true
changelog_merge_prerelease = true

View file

@ -1,6 +1,6 @@
"""
Silique (https://www.silique.fr)
Copyright (C) 2024
Copyright (C) 2024-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
@ -15,3 +15,4 @@ 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 <http://www.gnu.org/licenses/>.
"""
from .__version__ import __version__

View file

@ -1,6 +1,6 @@
"""
Silique (https://www.silique.fr)
Copyright (C) 2024
Copyright (C) 2024-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
@ -17,46 +17,102 @@ along with Mtools. If not, see <http://www.gnu.org/licenses/>.
"""
from tiramisu_cmdline_parser import TiramisuCmdlineParser
from tiramisu.error import PropertiesOptionError
from tiramisu import Config
from pathlib import Path
from sys import exit
from rougail import Rougail, PropertiesOptionError
from rougail import Rougail
from rougail.config import get_rougail_config
from rougail.update import RougailUpgrade
from rougail.utils import load_modules
from rougail.user_datas import UserDatas
try:
from rougail.user_data_yaml import RougailUserDataYaml
except ImportError:
RougailUserDataYaml = None
try:
from rougail.user_data_environment import RougailUserDataEnvironment
except ImportError:
RougailUserDataEnvironment = None
from .i18n import _
def _main():
def _main(arguments, do_not_print):
rougailconfig = get_rougail_config(
backward_compatibility=False, add_extra_options=False
)
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_config.property.add("not_for_commandline")
fake_rougail_config = {'step.user_data': [],}
fake_user_datas = []
if RougailUserDataYaml:
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',
}
fake_user_datas.extend(RougailUserDataYaml(cmd_config, rougailconfig=fake_rougail_config).run())
if RougailUserDataEnvironment:
fake_rougail_config = {'step.user_data': 'environment',
'environment.default_environment_name': 'ROUGAILCLI',
}
fake_user_datas.extend(RougailUserDataEnvironment(cmd_config, rougailconfig=fake_rougail_config).run())
if fake_user_datas:
user_data = UserDatas(cmd_config).user_datas(fake_user_datas)
if user_data["errors"]:
raise Exception(user_data["errors"][0])
# if user_data["warnings"]:
# raise Exception(user_data["warnings"][0])
parser = TiramisuCmdlineParser(
cmd_config,
add_extra_options=False,
# add_extra_options=False,
short_name_max_len=2,
)
parser.parse_args()
parser.parse_args(arguments)
global print_traceback
print_traceback = rougailconfig["cli.debug"]
cmd_config.property.setdefault(origin_prop, 'read_write', 'append')
cmd_config.property.remove("not_for_commandline")
cmd_config.property.read_only()
if rougailconfig["upgrade"]:
RougailUpgrade(rougailconfig=rougailconfig).run()
if rougailconfig['cli.versions']:
from tiramisu import __version__
print(f'tiramisu: {__version__}')
from tiramisu_cmdline_parser import __version__
print(f'tiramisu-cmdline-parser: {__version__}')
from rougail import __version__
print(f'rougail: {__version__}')
from . import __version__
print(f'rougail-cli: {__version__}')
for step in ['structural', 'user_data', 'output']:
display_step = step.replace('_', '-')
for step_name in sorted(cmd_config.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))
print(f'rougail-{display_step}-{step_name}: {module.__version__}')
except Exception as err:
pass
return
try:
user_data_names = rougailconfig["step.user_data"]
except PropertiesOptionError:
user_data_names = []
output_name = rougailconfig["step.output"]
# structural
if rougailconfig["cli.load_config"]:
rougail = Rougail(rougailconfig)
for user_data_name in user_data_names:
rougail.converted.plugins.append("user_data_" + user_data_name)
rougail.converted.plugins.append("output_" + output_name)
config = rougail.get_config()
config = rougail.run()
else:
config = None
# data user
if not user_data_names:
user_datas = None
@ -74,6 +130,8 @@ def _main():
_('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,
@ -84,25 +142,52 @@ def _main():
err_warn = rougail.user_datas(user_datas)
else:
err_warn = {"errors": [], "warnings": []}
if user_data_names:
config.property.read_write()
for user_data_name in user_data_names:
path = (
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
if config:
config.property.read_only()
output_name = rougailconfig["step.output"]
path = Path(__file__).parent.parent / ("output_" + output_name) / "__init__.py"
if not path.is_file():
raise Exception(
_('cannot find cli file for "output_name" module "{0}"').format(output_name)
)
module = load_modules("rougail.output_" + output_name, str(path))
module.RougailOutput(
output = module.RougailOutput(
config=config,
rougailconfig=rougailconfig,
user_data_errors=err_warn["errors"],
user_data_warnings=err_warn["warnings"],
).run()
def main():
try:
_main()
except Exception as err:
print(_("ERROR: {0}").format(err))
)
if do_not_print:
return output.run()
ret = output.print()
if ret is False:
exit(1)
def main(arguments=None, do_not_print=False):
global print_traceback
print_traceback = True
try:
return _main(arguments, do_not_print)
except Exception as err:
if print_traceback:
import traceback
traceback.print_exc()
exit(_("ERROR: {0}").format(err))

View file

@ -0,0 +1 @@
__version__ = "0.2.0a16"

53
src/rougail/cli/config.py Normal file
View file

@ -0,0 +1,53 @@
"""
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 Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
This program 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 Lesser General Public License for more
details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
from .i18n import _
def get_rougail_config(
*,
backward_compatibility: bool = True, # pylint: disable=unused-argument
) -> dict:
options = f"""
cli:
description: {_('Command line options')}
config_file:
description: {_('Loads command line parameters from a file')}
type: unix_filename
commandline: false
params:
allow_relative: true
default: .rougailcli.yml
debug:
description: {_('Display debug informations')}
default: false
versions:
description: {_('Display rougail version and all componants')}
default: false
load_config:
default: true
hidden: true
"""
return {
"options": options,
"process": None,
}

View file

@ -1,6 +1,6 @@
"""Internationalisation utilities
Silique (https://www.silique.fr)
Copyright (C) 2024
Copyright (C) 2024-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
@ -19,6 +19,6 @@ along with Mtools. If not, see <http://www.gnu.org/licenses/>.
from gettext import translation
from pathlib import Path
t = translation("rougail_cli", str(Path(__file__).parent / "locale"))
t = translation("rougail_cli", str(Path(__file__).parent / "locale"), fallback=True)
_ = t.gettext

5
tests/cli/result.txt Normal file
View file

@ -0,0 +1,5 @@
╭─────── Caption ────────╮
│ Variable Default value │
╰────────────────────────╯
Variables:
┗━━ 📓 my_variable: my_value

View file

@ -0,0 +1,4 @@
---
version: 1.1
my_variable: my_value

43
tests/test_load.py Normal file
View file

@ -0,0 +1,43 @@
from pathlib import Path
from os import chdir
from rougail.cli.__main__ import main
test_dir = Path(__file__).parent
def test_cli():
chdir(test_dir / 'cli')
ret = main(['--main_dictionaries', 'structures'], do_not_print=True)
filename = Path('result.txt')
if not filename.is_file():
with filename.open('w') as fh:
fh.write(ret[1])
with filename.open() as fh:
data = fh.read()
assert ret == (True, data)
def test_cli_boolean():
chdir(test_dir / 'cli')
ret = main(['--main_dictionaries', 'structures', '--console.mandatory'], do_not_print=True)
filename = Path('result.txt')
if not filename.is_file():
with filename.open('w') as fh:
fh.write(ret[1])
with filename.open() as fh:
data = fh.read()
assert ret == (True, data)
def test_cli_boolean_2():
chdir(test_dir / 'cli')
ret = main(['--main_dictionaries', 'structures', '--console.no-mandatory'], do_not_print=True)
filename = Path('result.txt')
if not filename.is_file():
with filename.open('w') as fh:
fh.write(ret[1])
with filename.open() as fh:
data = fh.read()
assert ret == (True, data)