feat: yaml.filename could be the name of a directory

This commit is contained in:
egarette@silique.fr 2025-05-13 21:42:54 +02:00
parent d75e447ec9
commit 7552a1ab18
6 changed files with 93 additions and 61 deletions

View file

@ -5,8 +5,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"POT-Creation-Date: 2025-05-11 10:23+0200\n" "POT-Creation-Date: 2025-05-14 08:28+0200\n"
"PO-Revision-Date: 2025-05-11 10:23+0200\n" "PO-Revision-Date: 2025-05-14 08:29+0200\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: fr\n" "Language: fr\n"
@ -16,32 +16,36 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 3.5\n" "X-Generator: Poedit 3.5\n"
#: src/rougail/user_data_yaml/__init__.py:43 #: src/rougail/user_data_yaml/__init__.py:46
msgid "yaml is not set in step.user_data" msgid "yaml is not set in step.user_data"
msgstr "\"yaml\" n'est pas défini dans step.user_data" msgstr "\"yaml\" n'est pas défini dans step.user_data"
#: src/rougail/user_data_yaml/__init__.py:63 #: src/rougail/user_data_yaml/__init__.py:72
msgid "cannot load \"{0}\", the root value is not a dict but \"{1}\"" msgid "cannot load \"{0}\", the root value is not a dict but \"{1}\""
msgstr "" msgstr ""
"ne peut charger \"{0}\", la valeur racine n'est pas une dictionnaire mais " "ne peut charger \"{0}\", la valeur racine n'est pas une dictionnaire mais "
"\"{1}\"" "\"{1}\""
#: src/rougail/user_data_yaml/__init__.py:86 #: src/rougail/user_data_yaml/__init__.py:95
msgid "the YAML file \"{0}\"" msgid "the YAML file \"{0}\""
msgstr "le fichier YAML \"{0}\"" msgstr "le fichier YAML \"{0}\""
#: src/rougail/user_data_yaml/__init__.py:117 #: src/rougail/user_data_yaml/__init__.py:127
msgid "\"{0}\" in {1} has an unknown value" msgid "\"{0}\" in {1} has an unknown value"
msgstr "\"{0}\" dans {1} a une valeur inconnue" msgstr "\"{0}\" dans {1} a une valeur inconnue"
#: src/rougail/user_data_yaml/config.py:29 #: src/rougail/user_data_yaml/config.py:30
msgid "Configuration rougail-user-data-yaml" msgid "Configuration rougail-user-data-yaml"
msgstr "Configuration de rougail-user-data-yaml" msgstr "Configuration de rougail-user-data-yaml"
#: src/rougail/user_data_yaml/config.py:38 #: src/rougail/user_data_yaml/config.py:39
msgid "Filename" msgid "File or directory name where user datas are stored"
msgstr "Nom du fichier" msgstr ""
"Nom du fichier ou répertoire où sont enregistré les données utilisateur"
#: src/rougail/user_data_yaml/config.py:49 #: src/rougail/user_data_yaml/config.py:48
msgid "File that may contain secrets" msgid "File that may contain secrets"
msgstr "Le fichier peut contenir des secrets" msgstr "Le fichier peut contenir des secrets"
#~ msgid "Filename"
#~ msgstr "Nom du fichier"

View file

@ -5,7 +5,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2025-05-12 08:39+0200\n" "POT-Creation-Date: 2025-05-14 08:29+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -15,19 +15,19 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
#: src/rougail/user_data_yaml/__init__.py:45 #: src/rougail/user_data_yaml/__init__.py:46
msgid "yaml is not set in step.user_data" msgid "yaml is not set in step.user_data"
msgstr "" msgstr ""
#: src/rougail/user_data_yaml/__init__.py:65 #: src/rougail/user_data_yaml/__init__.py:72
msgid "cannot load \"{0}\", the root value is not a dict but \"{1}\"" msgid "cannot load \"{0}\", the root value is not a dict but \"{1}\""
msgstr "" msgstr ""
#: src/rougail/user_data_yaml/__init__.py:88 #: src/rougail/user_data_yaml/__init__.py:95
msgid "the YAML file \"{0}\"" msgid "the YAML file \"{0}\""
msgstr "" msgstr ""
#: src/rougail/user_data_yaml/__init__.py:120 #: src/rougail/user_data_yaml/__init__.py:127
msgid "\"{0}\" in {1} has an unknown value" msgid "\"{0}\" in {1} has an unknown value"
msgstr "" msgstr ""
@ -36,10 +36,10 @@ msgid "Configuration rougail-user-data-yaml"
msgstr "" msgstr ""
#: src/rougail/user_data_yaml/config.py:39 #: src/rougail/user_data_yaml/config.py:39
msgid "Filename" msgid "File or directory name where user datas are stored"
msgstr "" msgstr ""
#: src/rougail/user_data_yaml/config.py:50 #: src/rougail/user_data_yaml/config.py:48
msgid "File that may contain secrets" msgid "File that may contain secrets"
msgstr "" msgstr ""

View file

@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
""" """
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pathlib import Path
from rougail.error import ExtentionError from rougail.error import ExtentionError
from tiramisu.error import ValueOptionError, PropertiesOptionError, LeadershipError from tiramisu.error import ValueOptionError, PropertiesOptionError, LeadershipError
@ -56,48 +57,54 @@ class RougailUserDataYaml:
self.yaml = YAML() self.yaml = YAML()
user_datas = [] user_datas = []
for idx, filename in enumerate(self.filenames): for idx, filename in enumerate(self.filenames):
file_values = self.open(filename) filename = Path(filename)
if not file_values: if filename.is_file():
continue filenames = [filename]
values = {}
if not isinstance(file_values, dict):
self.errors.append(
_(
'cannot load "{0}", the root value is not a dict but "{1}"'
).format(filename, file_values)
)
else: else:
self.parse( filenames = list(filename.glob('*.yml')) + list(filename.glob('*.yaml'))
values, for filename in sorted(filenames):
"", file_values = self.open(filename)
file_values, if not file_values:
filename, continue
values = {}
if not isinstance(file_values, dict):
self.errors.append(
_(
'cannot load "{0}", the root value is not a dict but "{1}"'
).format(filename, file_values)
)
else:
self.parse(
values,
"",
file_values,
filename,
)
if self.file_with_secrets == "none":
allow_secrets_variables = False
elif self.file_with_secrets == "first":
allow_secrets_variables = idx == 0
elif self.file_with_secrets == "last":
if not idx:
last_filenames = len(self.filenames) - 1
allow_secrets_variables = idx == last_filenames
else:
allow_secrets_variables = True
user_datas.append(
{
"source": _('the YAML file "{0}"').format(filename),
"errors": self.errors,
"warnings": self.warnings,
"values": values,
"options": {
"allow_secrets_variables": allow_secrets_variables,
},
}
) )
if self.file_with_secrets == "none":
allow_secrets_variables = False
elif self.file_with_secrets == "first":
allow_secrets_variables = idx == 0
elif self.file_with_secrets == "last":
if not idx:
last_filenames = len(self.filenames) - 1
allow_secrets_variables = idx == last_filenames
else:
allow_secrets_variables = True
user_datas.append(
{
"source": _('the YAML file "{0}"').format(filename),
"errors": self.errors,
"warnings": self.warnings,
"values": values,
"options": {
"allow_secrets_variables": allow_secrets_variables,
},
}
)
return user_datas return user_datas
def open(self, filename: str) -> dict: def open(self, filename: str) -> dict:
with open(filename) as fh_config: with filename.open() as fh_config:
return self.yaml.load(fh_config) return self.yaml.load(fh_config)
def parse( def parse(

View file

@ -36,15 +36,13 @@ yaml:
{{% endif %}} {{% endif %}}
filename: filename:
description: {_("Filename")} description: {_("File or directory name where user datas are stored")}
alternative_name: ff alternative_name: ff
type: unix_filename type: unix_filename
multi: true multi: true
params: params:
allow_relative: True allow_relative: True
test_existence: True test_existence: True
types:
- file
file_with_secrets: file_with_secrets:
description: {_("File that may contain secrets")} description: {_("File that may contain secrets")}

View file

@ -163,11 +163,11 @@ def test_errors_2():
####################################################################### #######################################################################
error_env = list((Path(__file__).parent / 'errors' / 'yaml').glob("*.yaml")) error_yaml = list((Path(__file__).parent / 'errors' / 'yaml').glob("*.yaml"))
error_env.sort() error_yaml.sort()
@fixture(scope="module", params=error_env, ids=idfn) @fixture(scope="module", params=error_yaml, ids=idfn)
def test_file_error(request): def test_file_error(request):
return request.param return request.param
@ -191,3 +191,26 @@ def test_dictionaries_error(test_file_error):
with open(errors_file) as json_file: with open(errors_file) as json_file:
expected_errors = load(json_file) expected_errors = load(json_file)
assert expected_errors == errors, errors_file assert expected_errors == errors, errors_file
def test_dictionaries_directory():
test_dir = Path(__file__).parent / 'directory'
rougailconfig = get_rougail_config(test_dir / 'structure')
##################################
rougailconfig['step.user_data'] = ['yaml']
rougailconfig['yaml.filename'] = [str(test_dir / 'yaml')]
rougail = Rougail(rougailconfig)
config = rougail.run()
##################################
# loads variables in the tiramisu config
generated_user_data = RougailUserData(config, rougailconfig=rougailconfig).run()
rougail.user_datas(generated_user_data)
config.property.read_only()
data = dict(config_to_dict(config.value.get()))
data_file = test_dir / "result.txt"
if not data_file.is_file():
with open(data_file, 'a') as json_file:
dump(data, json_file, indent=4)
with open(data_file) as json_file:
expected = load(json_file)
assert expected == data, data_file