Compare commits
77 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 636cd59e7a | |||
| 0500688079 | |||
| 5ce01380bf | |||
| 004e314c3f | |||
| 8aacb91433 | |||
| e56815f684 | |||
| 82df953c70 | |||
| 5548144d2d | |||
| 67876d77a4 | |||
| ca636fe7a6 | |||
| ff58fc056a | |||
| ba82f91cc6 | |||
| ba0b326b56 | |||
| fe96019173 | |||
| 1af9610734 | |||
| 6d3759f3e4 | |||
| b7dbaaa95d | |||
| de98071a53 | |||
| d5c229ec50 | |||
| 83b20dc0c1 | |||
| 97c87c24d3 | |||
| d9c197ca72 | |||
| e0a45ad4a6 | |||
| 52069f00c3 | |||
| 358de23cb4 | |||
| 6946532f8d | |||
| 8c8d16b1dd | |||
| 01aa36c1d7 | |||
| dd08fb6e46 | |||
| 27ee7f0f1b | |||
| 2e7ba5695f | |||
| e4e0cc987d | |||
| 1c34145daf | |||
| 346401912c | |||
| 1576f105e0 | |||
| 82e9e5bc30 | |||
| 2bc7e3914c | |||
| c874fa8573 | |||
| da6a816713 | |||
| 57df91ebee | |||
| 8751165a7c | |||
| 63b2131908 | |||
| 577f354e70 | |||
| 10d495c9a8 | |||
| e11885fbd7 | |||
| 9fb4cb8351 | |||
| 0102eede49 | |||
| 05fcb14364 | |||
| aa5c2f773c | |||
| f5f85ba79f | |||
| cf0fc37aef | |||
| 8ecc0e0f55 | |||
| 0f1e1b9ea5 | |||
| 1036ccb358 | |||
| 5327ff1917 | |||
| c31652256f | |||
| 8c924a7cba | |||
| 3f2920f37c | |||
| 0010c9cf07 | |||
| fb7c3c3346 | |||
| e6582d6d9d | |||
| 5cfa351e67 | |||
| e9b1ab5f85 | |||
| 95da29454a | |||
| a530ff33d6 | |||
| dcbe1a99d6 | |||
| c0d103f2e8 | |||
| e87bcbd4c8 | |||
| 703b1ce70e | |||
| 60ee2a6feb | |||
| 6feebea664 | |||
| b5c845f90c | |||
| c79975c5df | |||
| 52cbfc1f15 | |||
| e62797c79f | |||
| 8073ef9bc1 | |||
| ea0076279c |
39 changed files with 1069 additions and 63 deletions
223
CHANGELOG.md
223
CHANGELOG.md
|
|
@ -1,3 +1,226 @@
|
|||
## 0.2.0a33 (2025-11-21)
|
||||
|
||||
### Feat
|
||||
|
||||
- add inaccessible_read_write_modes and inaccessible_modes options
|
||||
|
||||
## 0.2.0a32 (2025-11-08)
|
||||
|
||||
### Fix
|
||||
|
||||
- execute interactive mode too
|
||||
|
||||
## 0.2.0a31 (2025-11-07)
|
||||
|
||||
### Fix
|
||||
|
||||
- better layers support
|
||||
|
||||
## 0.2.0a30 (2025-11-07)
|
||||
|
||||
### Feat
|
||||
|
||||
- layers information is send to output
|
||||
|
||||
## 0.2.0a29 (2025-11-06)
|
||||
|
||||
### Feat
|
||||
|
||||
- choice if invalid value or unknown variable in user data is a fatal error or not
|
||||
|
||||
## 0.2.0a28 (2025-11-03)
|
||||
|
||||
### Feat
|
||||
|
||||
- support layers
|
||||
|
||||
### Fix
|
||||
|
||||
- do not display full help to early
|
||||
|
||||
## 0.2.0a27 (2025-10-31)
|
||||
|
||||
### Fix
|
||||
|
||||
- remove all warnings!
|
||||
- update tests with new output_doc module
|
||||
|
||||
## 0.2.0a26 (2025-10-29)
|
||||
|
||||
### Fix
|
||||
|
||||
- add default option for environment user datas
|
||||
|
||||
## 0.2.0a25 (2025-10-27)
|
||||
|
||||
### Feat
|
||||
|
||||
- can use .rougailcli.yml, env variable or command line argument from own script
|
||||
|
||||
## 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)
|
||||
|
||||
### Fix
|
||||
|
||||
- config in read_only mode is asked
|
||||
|
||||
## 0.2.0a22 (2025-10-02)
|
||||
|
||||
### Feat
|
||||
|
||||
- limit warning when asked
|
||||
|
||||
## 0.2.0a21 (2025-09-29)
|
||||
|
||||
### Feat
|
||||
|
||||
- add cli.read_write option
|
||||
|
||||
## 0.2.0a20 (2025-09-22)
|
||||
|
||||
### Fix
|
||||
|
||||
- dictionary => structure
|
||||
|
||||
## 0.2.0a19 (2025-09-03)
|
||||
|
||||
### Fix
|
||||
|
||||
- do now set modified option in second round
|
||||
|
||||
## 0.2.0a18 (2025-05-14)
|
||||
|
||||
### Feat
|
||||
|
||||
- able to lad config_file name from environement variable
|
||||
- loads user datas before and after cli params
|
||||
|
||||
## 0.2.0a17 (2025-05-12)
|
||||
|
||||
### Fix
|
||||
|
||||
- upgrade translation
|
||||
- black
|
||||
|
||||
## 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.
|
|
@ -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-05-14 08:22+0200\n"
|
||||
"PO-Revision-Date: 2025-05-14 08:22+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: fr\n"
|
||||
|
|
@ -16,14 +16,40 @@ 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:170
|
||||
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:214
|
||||
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:240
|
||||
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 "Charger les paramètres de la ligne de commande depuis un fichier"
|
||||
|
||||
#: src/rougail/cli/config.py:39
|
||||
msgid "Displays debug informations"
|
||||
msgstr "Afficher les informations de debug"
|
||||
|
||||
#: src/rougail/cli/config.py:43
|
||||
msgid "Displays command line option warnings informations"
|
||||
msgstr "Afficher les avertissements de chargement des options de la ligne de commande"
|
||||
|
||||
#: src/rougail/cli/config.py:47
|
||||
msgid "Displays Rougail version and all its components"
|
||||
msgstr "Afficher la version de Rougail et de tous ces composants"
|
||||
|
||||
#~ msgid "do not display debug informations"
|
||||
#~ msgstr "ne pas afficher les informations de debug"
|
||||
|
||||
#~ msgid "do not display rougail version and all componants"
|
||||
#~ msgstr "ne pas afficher la version de rougail et de tous ces composants"
|
||||
|
|
|
|||
|
|
@ -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-14 08:25+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,35 @@ msgstr ""
|
|||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
|
||||
#: src/rougail/cli/__main__.py:63
|
||||
#: src/rougail/cli/__main__.py:170
|
||||
msgid "cannot find \"user_data\" module \"{0}\""
|
||||
msgstr ""
|
||||
|
||||
#: src/rougail/cli/__main__.py:76
|
||||
#: src/rougail/cli/__main__.py:214
|
||||
msgid "cannot find cli file for \"output_name\" module \"{0}\""
|
||||
msgstr ""
|
||||
|
||||
#: src/rougail/cli/__main__.py:89
|
||||
#: src/rougail/cli/__main__.py:240
|
||||
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 "Displays debug informations"
|
||||
msgstr ""
|
||||
|
||||
#: src/rougail/cli/config.py:43
|
||||
msgid "Displays command line option warnings informations"
|
||||
msgstr ""
|
||||
|
||||
#: src/rougail/cli/config.py:47
|
||||
msgid "Displays Rougail version and all its components"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ requires = ["flit_core >=3.8.0,<4"]
|
|||
|
||||
[project]
|
||||
name = "rougail.cli"
|
||||
version = "0.1.1"
|
||||
version = "0.2.0a33"
|
||||
authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}]
|
||||
readme = "README.md"
|
||||
description = "CLI for Rougail"
|
||||
|
|
@ -13,11 +13,10 @@ license = {file = "LICENSE"}
|
|||
classifiers = [
|
||||
"License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
|
||||
"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.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"Programming Language :: Python :: 3.14",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Operating System :: OS Independent",
|
||||
"Natural Language :: English",
|
||||
|
|
@ -26,7 +25,7 @@ classifiers = [
|
|||
]
|
||||
dependencies = [
|
||||
"rougail >= 1.1,<2",
|
||||
"tiramisu_cmdline_parser >= 0.6,<1",
|
||||
"rougail-user-data-commandline",
|
||||
]
|
||||
|
||||
[project.scripts]
|
||||
|
|
@ -40,5 +39,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
|
||||
|
|
|
|||
|
|
@ -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,5 @@ 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__
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -16,54 +16,211 @@ You should have received a copy of the GNU General Public License
|
|||
along with Mtools. If not, see <http://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
from tiramisu_cmdline_parser import TiramisuCmdlineParser
|
||||
from tiramisu import Config
|
||||
import os
|
||||
from warnings import filterwarnings
|
||||
from pathlib import Path
|
||||
from sys import exit
|
||||
from warnings import warn
|
||||
|
||||
from rougail import Rougail, PropertiesOptionError
|
||||
from tiramisu_cmdline_parser import TiramisuCmdlineParser
|
||||
from tiramisu.error import PropertiesOptionError
|
||||
from tiramisu import MetaConfig
|
||||
|
||||
from rougail import Rougail
|
||||
from rougail.user_datas import UserDatas
|
||||
from rougail.config import get_rougail_config
|
||||
from rougail.update import RougailUpgrade
|
||||
from rougail.utils import load_modules
|
||||
from rougail.error import RougailWarning
|
||||
|
||||
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 .rougailconfig import load as rougailconfig_load
|
||||
|
||||
from .i18n import _
|
||||
|
||||
|
||||
def _main():
|
||||
ENV_PREFIX = "ROUGAILCLI"
|
||||
|
||||
|
||||
def _main(arguments, do_not_print):
|
||||
global print_traceback
|
||||
rougailconfig = get_rougail_config(
|
||||
backward_compatibility=False, add_extra_options=False
|
||||
)
|
||||
cmd_config = load_cmd_user_datas(rougailconfig, 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)
|
||||
exit()
|
||||
layer_datas, metaconfig, config, err_warn = load_user_datas(rougailconfig)
|
||||
output = get_output(rougailconfig, metaconfig, config, err_warn, layer_datas)
|
||||
if do_not_print:
|
||||
return output.run()
|
||||
ret = output.print()
|
||||
if ret is False:
|
||||
exit(1)
|
||||
|
||||
|
||||
def load_cmd_user_datas(rougailconfig, arguments):
|
||||
rougailconfig.generate_config()
|
||||
cmd_config = rougailconfig.config
|
||||
cmd_config.property.read_write()
|
||||
cmd_config.property.add("not_for_commandline")
|
||||
parser = TiramisuCmdlineParser(
|
||||
cmd_config,
|
||||
add_extra_options=False,
|
||||
short_name_max_len=2,
|
||||
origin_prop = cmd_config.property.default("read_write", "append")
|
||||
cmd_config.property.setdefault(
|
||||
frozenset(origin_prop | {"not_for_commandline"}), "read_write", "append"
|
||||
)
|
||||
parser.parse_args()
|
||||
cmd_config.property.remove("not_for_commandline")
|
||||
cmd_config.property.read_write()
|
||||
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():
|
||||
config_file = _config_file
|
||||
if RougailUserDataEnvironment:
|
||||
env_prefix = ENV_PREFIX
|
||||
else:
|
||||
env_prefix = None
|
||||
user_data = rougailconfig_load(rougailconfig, config_file, env_prefix, True, _arguments=arguments, _generate=False, _add_help=False)
|
||||
display_warnings = rougailconfig["cli.warnings"]
|
||||
manage_warnings(display_warnings)
|
||||
if not cmd_config.option("cli.versions").value.get():
|
||||
if display_warnings and user_data["warnings"]:
|
||||
for warning in user_data["warnings"]:
|
||||
warn(warning)
|
||||
if manage_warnings:
|
||||
# replays to display errors if needed
|
||||
parser = TiramisuCmdlineParser(
|
||||
cmd_config,
|
||||
short_name_max_len=2,
|
||||
)
|
||||
parser.parse_args(arguments)
|
||||
if user_data["errors"]:
|
||||
raise Exception(user_data["errors"][0])
|
||||
|
||||
cmd_config.property.setdefault(origin_prop, "read_write", "append")
|
||||
cmd_config.property.read_only()
|
||||
if rougailconfig["upgrade"]:
|
||||
RougailUpgrade(rougailconfig=rougailconfig).run()
|
||||
return
|
||||
cmd_config.property.remove("not_for_commandline")
|
||||
|
||||
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=RougailWarning)
|
||||
else:
|
||||
filterwarnings("default", category=DeprecationWarning)
|
||||
filterwarnings("default", category=RougailWarning)
|
||||
|
||||
|
||||
def load_user_datas(rougailconfig):
|
||||
layer_datas = {}
|
||||
if not rougailconfig["cli.load_config"]:
|
||||
return None, None, None, {"errors": [], "warnings": []}
|
||||
try:
|
||||
user_data_names = rougailconfig["step.user_data"]
|
||||
except PropertiesOptionError:
|
||||
user_data_names = []
|
||||
output_name = rougailconfig["step.output"]
|
||||
# structural
|
||||
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()
|
||||
# data user
|
||||
if not user_data_names:
|
||||
user_datas = None
|
||||
has_layers = rougailconfig["cli.layers"]
|
||||
if has_layers:
|
||||
layers = [[ud] for ud in user_data_names]
|
||||
last_layers = len(layers) - 1
|
||||
else:
|
||||
config.property.read_write()
|
||||
layers = [user_data_names]
|
||||
last_layers = 0
|
||||
rougail = Rougail(rougailconfig)
|
||||
layer_name = "_".join(layers[-1])
|
||||
subconfig = rougail.run(name=layer_name)
|
||||
try:
|
||||
read_write = set()
|
||||
read_only = set()
|
||||
if rougailconfig["cli.inaccessible_read_write_modes"]:
|
||||
read_write = set(rougailconfig["cli.inaccessible_read_write_modes"])
|
||||
if rougailconfig["cli.inaccessible_modes"]:
|
||||
read_only = set(rougailconfig["cli.inaccessible_modes"])
|
||||
read_write |= read_only
|
||||
if read_write:
|
||||
subconfig.property.setdefault(
|
||||
frozenset(subconfig.property.default("read_write", "append") | read_write), "read_write", "append"
|
||||
)
|
||||
subconfig.property.setdefault(
|
||||
frozenset(subconfig.property.default("read_only", "remove") | (read_write - read_only)), "read_only", "remove"
|
||||
)
|
||||
subconfig.property.read_write()
|
||||
if read_only:
|
||||
subconfig.property.setdefault(
|
||||
frozenset(subconfig.property.default("read_only", "append") | read_only), "read_only", "append"
|
||||
)
|
||||
subconfig.property.read_write()
|
||||
except:
|
||||
pass
|
||||
metaconfig = subconfig
|
||||
if last_layers:
|
||||
for layer in layers[:-1]:
|
||||
layer_name = "_".join(layer)
|
||||
metaconfig = MetaConfig([metaconfig], name=layer_name)
|
||||
metaconfig.owner.set(metaconfig.path())
|
||||
subconfig = metaconfig
|
||||
err_warn = {"errors": [], "warnings": []}
|
||||
invalid_user_datas_error = rougailconfig["cli.invalid_user_datas_error"]
|
||||
unknown_user_datas_error = rougailconfig["cli.unknown_user_datas_error"]
|
||||
interactive_user_datas = {}
|
||||
for idx, layer in enumerate(layers):
|
||||
if idx:
|
||||
subconfig = subconfig.config("_".join(layer))
|
||||
layer_name = subconfig.path()
|
||||
subconfig.owner.set(subconfig.path())
|
||||
else:
|
||||
layer_name = None
|
||||
# data user
|
||||
user_datas = []
|
||||
for user_data_name in user_data_names:
|
||||
if has_layers:
|
||||
layer_datas[layer_name] = {}
|
||||
for user_data_name in layer:
|
||||
path = (
|
||||
Path(__file__).parent.parent
|
||||
/ ("user_data_" + user_data_name)
|
||||
|
|
@ -74,35 +231,70 @@ def _main():
|
|||
_('cannot find "user_data" module "{0}"').format(user_data_name)
|
||||
)
|
||||
module = load_modules("rougail.user_data_" + user_data_name, str(path))
|
||||
user_datas.extend(
|
||||
module.RougailUserData(
|
||||
config,
|
||||
rougail_user_datas = module.RougailUserData
|
||||
if hasattr(rougail_user_datas, 'interactive_user_datas') and rougail_user_datas.interactive_user_datas:
|
||||
interactive_user_datas.setdefault(layer_name, {})[user_data_name] = rougail_user_datas
|
||||
continue
|
||||
elif interactive_user_datas:
|
||||
raise Exception(_(f'interactive user datas "{0}" is loader before uninteractive user datas "{1}"').format(list(interactive_user_datas), user_data_name))
|
||||
for user_data in rougail_user_datas(
|
||||
subconfig,
|
||||
rougailconfig=rougailconfig,
|
||||
).run()
|
||||
)
|
||||
if user_datas:
|
||||
err_warn = rougail.user_datas(user_datas)
|
||||
else:
|
||||
err_warn = {"errors": [], "warnings": []}
|
||||
).run():
|
||||
if has_layers:
|
||||
layer_datas[layer_name].setdefault(user_data_name, []).append(user_data["source"])
|
||||
user_datas.append(user_data)
|
||||
if user_datas:
|
||||
new_err_warn = UserDatas(subconfig).user_datas(user_datas, invalid_user_datas_error=invalid_user_datas_error, unknown_user_datas_error=unknown_user_datas_error)
|
||||
for level, datas in new_err_warn.items():
|
||||
if datas:
|
||||
err_warn[level].extend(datas)
|
||||
for layer_name, interactive_user_data in interactive_user_datas.items():
|
||||
for layer, rougail_user_datas in interactive_user_data.items():
|
||||
if has_layers and len(layers) > 1:
|
||||
subconfig = subconfig.config("_".join(layer))
|
||||
subconfig.owner.set(subconfig.path())
|
||||
for user_data in rougail_user_datas(
|
||||
subconfig,
|
||||
rougailconfig=rougailconfig,
|
||||
).run():
|
||||
if has_layers:
|
||||
layer_datas[layer_name].setdefault(user_data_name, []).append(user_data["source"])
|
||||
|
||||
return layer_datas, metaconfig, subconfig, err_warn
|
||||
|
||||
|
||||
def get_output(rougailconfig, metaconfig, config, err_warn, layer_datas):
|
||||
# output
|
||||
config.property.read_only()
|
||||
if config and (not rougailconfig["cli.load_config"] or not rougailconfig["cli.read_write"]):
|
||||
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()
|
||||
config_owner_is_path=True,
|
||||
metaconfig=metaconfig,
|
||||
layer_datas=layer_datas,
|
||||
)
|
||||
return output
|
||||
|
||||
|
||||
def main():
|
||||
def main(arguments=None, do_not_print=False):
|
||||
global print_traceback
|
||||
print_traceback = True
|
||||
try:
|
||||
_main()
|
||||
return _main(arguments, do_not_print)
|
||||
except Exception as err:
|
||||
print(_("ERROR: {0}").format(err))
|
||||
exit(1)
|
||||
if print_traceback:
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
exit(_("ERROR: {0}").format(err))
|
||||
|
|
|
|||
1
src/rougail/cli/__version__.py
Normal file
1
src/rougail/cli/__version__.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
__version__ = "0.2.0a33"
|
||||
97
src/rougail/cli/config.py
Normal file
97
src/rougail/cli/config.py
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
"""
|
||||
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: false # {_('Displays debug informations')}
|
||||
|
||||
warnings: true # {_('Displays command line option warnings informations')}
|
||||
|
||||
versions: false # {_('Displays Rougail version and all its components')}
|
||||
|
||||
invalid_user_datas_error: false # {_("Invalid value in user datas is not allowed")}
|
||||
|
||||
unknown_user_datas_error: false # {_("Unknown variable in user datas is not allowed")}
|
||||
|
||||
layers:
|
||||
description: {_('Open each user datas in separate layers')}
|
||||
default: false
|
||||
hidden:
|
||||
jinja: |-
|
||||
{{{{ __.step.user_data is propertyerror or __.step.user_data | length < 2 }}}}
|
||||
return_type: boolean
|
||||
|
||||
load_config:
|
||||
default: true
|
||||
hidden: true
|
||||
|
||||
read_write: false # {_('Configuration in output step is in read_write mode')}
|
||||
|
||||
inaccessible_read_write_modes:
|
||||
description: {_('Modes that should not be accessible in read_write mode')}
|
||||
multi: true
|
||||
mandatory: false
|
||||
disabled:
|
||||
jinja: |
|
||||
{{% if not modes_level %}}
|
||||
No mode
|
||||
{{% endif %}}
|
||||
validators:
|
||||
- type: jinja
|
||||
jinja: |
|
||||
{{% if _.inaccessible_read_write_modes not in modes_level %}}
|
||||
not in modes_level ({{modes_level}})
|
||||
{{% endif %}}
|
||||
|
||||
inaccessible_modes:
|
||||
description: {_('Modes that should not be accessible')}
|
||||
multi: true
|
||||
mandatory: false
|
||||
disabled:
|
||||
jinja: |
|
||||
{{% if not modes_level %}}
|
||||
No mode
|
||||
{{% endif %}}
|
||||
validators:
|
||||
- type: jinja
|
||||
jinja: |
|
||||
{{% if _.inaccessible_modes not in modes_level %}}
|
||||
not in modes_level ({{modes_level}})
|
||||
{{% endif %}}
|
||||
"""
|
||||
return {
|
||||
"options": options,
|
||||
"process": None,
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Binary file not shown.
82
src/rougail/cli/rougailconfig.py
Normal file
82
src/rougail/cli/rougailconfig.py
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
"""
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
"""
|
||||
from rougail.user_datas import UserDatas
|
||||
|
||||
|
||||
def load(rougailconfig: "RougailConfig",
|
||||
yaml_file: str=None,
|
||||
env_prefix: str=None,
|
||||
commandline: bool=False,
|
||||
_arguments=None,
|
||||
_add_help=True,
|
||||
_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, _add_help))
|
||||
user_data = UserDatas(cmd_config).user_datas(user_datas)
|
||||
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 = {
|
||||
"main_namespace": None,
|
||||
"step.user_data": ["environment"],
|
||||
"environment.default_environment_name": env_prefix,
|
||||
"environment.custom_separator": None,
|
||||
}
|
||||
return RougailUserDataEnvironment(
|
||||
cmd_config,
|
||||
rougailconfig=fake_rougail_config,
|
||||
).run()
|
||||
|
||||
|
||||
def from_cmdline(cmd_config, arguments, add_help):
|
||||
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,
|
||||
add_help=add_help,
|
||||
).run()
|
||||
5
tests/cli/result.txt
Normal file
5
tests/cli/result.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
╭─────── Caption ────────╮
|
||||
│ Variable [38;5;220mDefault value[0m │
|
||||
╰────────────────────────╯
|
||||
Variables:
|
||||
[94m┗━━ [0m📓 a description: [38;5;220mmy_value[0m
|
||||
7
tests/cli/result_user_data.txt
Normal file
7
tests/cli/result_user_data.txt
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
╭────────────── Caption ───────────────╮
|
||||
│ Variable Modified value │
|
||||
│ ([32m⏳ Original default value[0m) │
|
||||
╰──────────────────────────────────────╯
|
||||
Variables:
|
||||
[94m┗━━ [0m📓 a description: a yaml value ◀ loaded from the YAML file "yaml/file.yml"
|
||||
[94m [0m(⏳ [32mmy_value[0m)
|
||||
7
tests/cli/result_user_datas.txt
Normal file
7
tests/cli/result_user_datas.txt
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
╭────────────── Caption ───────────────╮
|
||||
│ Variable Modified value │
|
||||
│ ([32m⏳ Original default value[0m) │
|
||||
╰──────────────────────────────────────╯
|
||||
Variables:
|
||||
[94m┗━━ [0m📓 a description: a yaml value ◀ loaded from the YAML file "yaml/file.yml"
|
||||
[94m [0m(⏳ [32mmy_value[0m)
|
||||
11
tests/cli/result_user_datas_layers.txt
Normal file
11
tests/cli/result_user_datas_layers.txt
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
╭────────────── Caption ───────────────╮
|
||||
│ Variable Modified value │
|
||||
│ ([32m⏳ Original default value[0m) │
|
||||
╰──────────────────────────────────────╯
|
||||
╭─────────── Layers ────────────╮
|
||||
│ environment variable │
|
||||
│ the YAML file "yaml/file.yml" │
|
||||
╰───────────────────────────────╯
|
||||
Variables:
|
||||
[94m┗━━ [0m📓 a description: a yaml value ◀ loaded from the YAML file "yaml/file.yml"
|
||||
[94m [0m(⏳ [32mmy env value[0m ◀ loaded from environment variable ⏳ [32mmy env value[0m)
|
||||
4
tests/cli/structures/file.yml
Normal file
4
tests/cli/structures/file.yml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
version: 1.1
|
||||
|
||||
my_variable: my_value # a description
|
||||
1
tests/cli/versions.txt
Normal file
1
tests/cli/versions.txt
Normal file
|
|
@ -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-questionary", "rougail-user-data-yaml", "rougail-output-ansible", "rougail-output-console", "rougail-output-doc", "rougail-output-json"]
|
||||
2
tests/cli/yaml/file.yml
Normal file
2
tests/cli/yaml/file.yml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
my_variable: a yaml value
|
||||
7
tests/rougailcli_file/.rougailcli.yml
Normal file
7
tests/rougailcli_file/.rougailcli.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
main_structural_directories:
|
||||
- structures
|
||||
step:
|
||||
output: doc
|
||||
doc:
|
||||
output_format: json
|
||||
1
tests/rougailcli_file/alt_console.txt
Normal file
1
tests/rougailcli_file/alt_console.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
"\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503\u001b[1m \u001b[0m\u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m\u2503\u001b[1m \u001b[0m\u001b[1mDescription \u001b[0m\u001b[1m \u001b[0m\u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 \u001b[1mmy_variable\u001b[0m \u2502 A description. \u2502\n\u2502 \u001b[1;7m string \u001b[0m \u001b[1;7m mandatory \u001b[0m \u2502 \u001b[1mDefault\u001b[0m: my_value \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"
|
||||
7
tests/rougailcli_file/alt_rougailcli.yml
Normal file
7
tests/rougailcli_file/alt_rougailcli.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
main_structural_directories:
|
||||
- structures
|
||||
step:
|
||||
output: doc
|
||||
doc:
|
||||
output_format: console
|
||||
1
tests/rougailcli_file/mix_console.txt
Normal file
1
tests/rougailcli_file/mix_console.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
"[cols=\"1a,1a\"]\n|====\n| Variable | Description \n| **my_variable** +\n`https://rougail.readthedocs.io/en/latest/variable.html#variables-types[string]` `mandatory` | A description. +\n**Default**: my_value \n|====\n\n"
|
||||
6
tests/rougailcli_file/mix_rougailcli.yml
Normal file
6
tests/rougailcli_file/mix_rougailcli.yml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
main_structural_directories:
|
||||
- structures
|
||||
doc:
|
||||
output_format: console
|
||||
|
||||
4
tests/rougailcli_file/structures/file.yml
Normal file
4
tests/rougailcli_file/structures/file.yml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
version: 1.1
|
||||
|
||||
my_variable: my_value # a description
|
||||
9
tests/rougailcli_file/structures_warnings/file.yml
Normal file
9
tests/rougailcli_file/structures_warnings/file.yml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
version: 1.1
|
||||
|
||||
my_variable:
|
||||
redefine: true
|
||||
validators: # validators in jinja without description makes warnings
|
||||
- jinja: |-
|
||||
{{ _.my_variable != "my_value" }}
|
||||
warnings: true
|
||||
1
tests/rougailcli_file/warnings.txt
Normal file
1
tests/rougailcli_file/warnings.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
["family \"configuration rougail-json\" is disabled, \"test mandatories variables before display in json\" will be ignored when loading from the YAML file \"warnings.yml\""]
|
||||
7
tests/rougailcli_file/warnings.yml
Normal file
7
tests/rougailcli_file/warnings.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
main_structural_directories:
|
||||
- structures
|
||||
doc:
|
||||
output_format: console
|
||||
json:
|
||||
mandatory: true
|
||||
1
tests/rougailcli_file/warnings2.txt
Normal file
1
tests/rougailcli_file/warnings2.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
[]
|
||||
9
tests/rougailcli_file/warnings2.yml
Normal file
9
tests/rougailcli_file/warnings2.yml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
main_structural_directories:
|
||||
- structures
|
||||
doc:
|
||||
output_format: console
|
||||
json:
|
||||
mandatory: true
|
||||
cli:
|
||||
warnings: false
|
||||
1
tests/rougailcli_file/warnings3.txt
Normal file
1
tests/rougailcli_file/warnings3.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
["family \"configuration rougail-json\" is disabled, \"test mandatories variables before display in json\" will be ignored when loading from the YAML file \"warnings3.yml\"", "\"validators\" is a calculation for my_variable but has no description in \"structures/file.yml\" and \"structures_warnings/file.yml\""]
|
||||
8
tests/rougailcli_file/warnings3.yml
Normal file
8
tests/rougailcli_file/warnings3.yml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
main_structural_directories:
|
||||
- structures
|
||||
- structures_warnings
|
||||
doc:
|
||||
output_format: console
|
||||
json:
|
||||
mandatory: true
|
||||
1
tests/rougailcli_file/warnings4.txt
Normal file
1
tests/rougailcli_file/warnings4.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
[]
|
||||
10
tests/rougailcli_file/warnings4.yml
Normal file
10
tests/rougailcli_file/warnings4.yml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
main_structural_directories:
|
||||
- structures
|
||||
- structures_warnings
|
||||
doc:
|
||||
output_format: console
|
||||
json:
|
||||
mandatory: true
|
||||
cli:
|
||||
warnings: false
|
||||
1
tests/rougailcli_file/yaml.txt
Normal file
1
tests/rougailcli_file/yaml.txt
Normal file
|
|
@ -0,0 +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 \"path\": \"my_variable\",\n \"names\": [\n \"my_variable\"\n ],\n \"description\": \"A description.\",\n \"gen_examples\": [\n \"my_value\"\n ],\n \"mandatory_without_value\": false\n }\n}"
|
||||
3
tests/second_step/.rougailcli.yml
Normal file
3
tests/second_step/.rougailcli.yml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
doc:
|
||||
output_format: json
|
||||
4
tests/second_step/structures/file.yml
Normal file
4
tests/second_step/structures/file.yml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
version: 1.1
|
||||
|
||||
my_variable: my_value # a description
|
||||
1
tests/second_step/yaml.txt
Normal file
1
tests/second_step/yaml.txt
Normal file
|
|
@ -0,0 +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 \"path\": \"my_variable\",\n \"names\": [\n \"my_variable\"\n ],\n \"description\": \"A description.\",\n \"gen_examples\": [\n \"my_value\"\n ],\n \"mandatory_without_value\": false\n }\n}"
|
||||
241
tests/test_load.py
Normal file
241
tests/test_load.py
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
import os
|
||||
import warnings
|
||||
from pathlib import Path
|
||||
from contextlib import chdir
|
||||
from json import dumps, loads
|
||||
|
||||
from rougail.cli.__main__ import main
|
||||
|
||||
|
||||
test_dir = Path(__file__).parent
|
||||
os.environ['COLUMNS'] = '80'
|
||||
|
||||
|
||||
def test_cli():
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--main_structural_directories', '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), str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_boolean():
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--main_structural_directories', '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), str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_boolean_no():
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--main_structural_directories', '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), str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_version():
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--cli.version'], do_not_print=True)
|
||||
ret = [r.rsplit(': ', 1)[0] for r in ret]
|
||||
filename = Path('versions.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == data, str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_version_user_data_disabled():
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--cli.version', '--step.output', 'doc'], do_not_print=True)
|
||||
ret = [r.rsplit(': ', 1)[0] for r in ret]
|
||||
filename = Path('versions.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == data, str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_version_user_data_disabled_2():
|
||||
with chdir(test_dir / 'second_step'):
|
||||
ret = main(['--main_structural_directories', 'structures', '--step.output', 'doc'], do_not_print=True)
|
||||
filename = Path('yaml.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret[1]))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == (True, data), str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_user_data():
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--main_structural_directories', 'structures', '--step.user_data', 'yaml', '--yaml.filename', 'yaml/file.yml'], do_not_print=True)
|
||||
filename = Path('result_user_data.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), str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_user_datas():
|
||||
save = os.environ.copy()
|
||||
os.environ["MY_VARIABLE"] = "my env value"
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--main_structural_directories', 'structures', '--step.user_data', 'environment', 'yaml', '--yaml.filename', 'yaml/file.yml'], do_not_print=True)
|
||||
filename = Path('result_user_datas.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), str(filename.absolute())
|
||||
save = os.environ.copy()
|
||||
|
||||
|
||||
def test_cli_user_datas_user_datas_layers():
|
||||
save = os.environ.copy()
|
||||
os.environ["ROUGAIL_MY_VARIABLE"] = "my env value"
|
||||
with chdir(test_dir / 'cli'):
|
||||
ret = main(['--main_structural_directories', 'structures', '--cli.layers', '--step.user_data', 'environment', 'yaml', '--yaml.filename', 'yaml/file.yml'], do_not_print=True)
|
||||
filename = Path('result_user_datas_layers.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), str(filename.absolute())
|
||||
save = os.environ.copy()
|
||||
|
||||
|
||||
def test_cli_rougailcli():
|
||||
with chdir(test_dir / 'rougailcli_file'):
|
||||
ret = main([], do_not_print=True)
|
||||
filename = Path('yaml.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret[1]))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == (True, data), str(filename.absolute())
|
||||
|
||||
|
||||
def test_cli_alt_rougailcli():
|
||||
save = os.environ.copy()
|
||||
with chdir(test_dir / 'rougailcli_file'):
|
||||
os.environ["ROUGAILCLI_CLI.CONFIG_FILE"] = 'alt_rougailcli.yml'
|
||||
ret = main([], do_not_print=True)
|
||||
filename = Path('alt_console.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret[1]))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == (True, data), str(filename.absolute())
|
||||
os.environ = save
|
||||
|
||||
|
||||
def test_cli_rougailcli_mix():
|
||||
save = os.environ.copy()
|
||||
with chdir(test_dir / 'rougailcli_file'):
|
||||
os.environ["ROUGAILCLI_CLI.CONFIG_FILE"] = 'mix_rougailcli.yml'
|
||||
ret = main(["-o", "doc", "--doc.output_format", "asciidoc"], do_not_print=True)
|
||||
filename = Path('mix_console.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret[1]))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == (True, data), str(filename.absolute())
|
||||
os.environ = save
|
||||
|
||||
|
||||
def test_cli_rougailcli_warning():
|
||||
save = os.environ.copy()
|
||||
with chdir(test_dir / 'rougailcli_file'):
|
||||
os.environ["ROUGAILCLI_CLI.CONFIG_FILE"] = 'warnings.yml'
|
||||
with warnings.catch_warnings(record=True) as rougail_wn:
|
||||
warnings.simplefilter("always", UserWarning)
|
||||
main(["-o", "doc", "--doc.output_format", "asciidoc"], do_not_print=True)
|
||||
ret = [str(w.message) for w in rougail_wn]
|
||||
filename = Path('warnings.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps([str(w.message) for w in rougail_wn]))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == data, str(filename.absolute())
|
||||
os.environ = save
|
||||
|
||||
|
||||
def test_cli_rougailcli_not_warning():
|
||||
save = os.environ.copy()
|
||||
with chdir(test_dir / 'rougailcli_file'):
|
||||
os.environ["ROUGAILCLI_CLI.CONFIG_FILE"] = 'warnings2.yml'
|
||||
with warnings.catch_warnings(record=True) as rougail_wn:
|
||||
warnings.simplefilter("always", UserWarning)
|
||||
main(["-o", "doc", "--doc.output_format", "asciidoc"], do_not_print=True)
|
||||
filename = Path('warnings2.txt')
|
||||
ret = [str(w.message) for w in rougail_wn]
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == data, str(filename.absolute())
|
||||
os.environ = save
|
||||
|
||||
|
||||
def test_cli_rougailcli_warning2():
|
||||
save = os.environ.copy()
|
||||
with chdir(test_dir / 'rougailcli_file'):
|
||||
os.environ["ROUGAILCLI_CLI.CONFIG_FILE"] = 'warnings3.yml'
|
||||
with warnings.catch_warnings(record=True) as rougail_wn:
|
||||
warnings.simplefilter("always", UserWarning)
|
||||
main(["-o", "doc", "--doc.output_format", "asciidoc"], do_not_print=True)
|
||||
ret = [str(w.message) for w in rougail_wn]
|
||||
filename = Path('warnings3.txt')
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == data, str(filename.absolute())
|
||||
os.environ = save
|
||||
|
||||
|
||||
def test_cli_rougailcli_not_warning2():
|
||||
save = os.environ.copy()
|
||||
with chdir(test_dir / 'rougailcli_file'):
|
||||
os.environ["ROUGAILCLI_CLI.CONFIG_FILE"] = 'warnings4.yml'
|
||||
with warnings.catch_warnings(record=True) as rougail_wn:
|
||||
warnings.simplefilter("always", UserWarning)
|
||||
main(["-o", "doc", "--doc.output_format", "asciidoc"], do_not_print=True)
|
||||
filename = Path('warnings4.txt')
|
||||
ret = [str(w.message) for w in rougail_wn]
|
||||
if not filename.is_file():
|
||||
with filename.open('w') as fh:
|
||||
fh.write(dumps(ret))
|
||||
with filename.open() as fh:
|
||||
data = loads(fh.read())
|
||||
assert ret == data, str(filename.absolute())
|
||||
os.environ = save
|
||||
Loading…
Reference in a new issue