From 9dad912ab3b0eca840590e17b25a5ce3470dde97 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Mon, 27 Oct 2025 11:14:12 +0100 Subject: [PATCH] fix: unknown variable --- src/rougail/user_data_yaml/__init__.py | 6 +- src/rougail/user_data_yaml/config.py | 1 - tests/test_load.py | 95 +++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 6 deletions(-) diff --git a/src/rougail/user_data_yaml/__init__.py b/src/rougail/user_data_yaml/__init__.py index a25ff1e..9175c50 100644 --- a/src/rougail/user_data_yaml/__init__.py +++ b/src/rougail/user_data_yaml/__init__.py @@ -56,6 +56,8 @@ class RougailUserDataYaml: ) -> None: self.yaml = YAML(typ='safe', pure=True) user_datas = [] + if self.file_with_secrets == "last": + last_filename_idx = len(self.filenames) - 1 for idx, filename in enumerate(self.filenames): filename = Path(filename) if filename.is_file(): @@ -85,9 +87,7 @@ class RougailUserDataYaml: 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 + allow_secrets_variables = idx == last_filename_idx else: allow_secrets_variables = True user_datas.append( diff --git a/src/rougail/user_data_yaml/config.py b/src/rougail/user_data_yaml/config.py index 0dc5a4d..919327d 100644 --- a/src/rougail/user_data_yaml/config.py +++ b/src/rougail/user_data_yaml/config.py @@ -29,7 +29,6 @@ def get_rougail_config( yaml: description: {_("Configuration rougail-user-data-yaml")} disabled: - type: jinja jinja: | {{% if step.user_data is propertyerror or 'yaml' not in step.user_data %}} disabled diff --git a/tests/test_load.py b/tests/test_load.py index 9ebf895..2f8b03b 100644 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -8,7 +8,7 @@ from json import load, dump, loads, dumps from ruamel.yaml import YAML ######################### -from rougail_tests.utils import get_structures_list, get_rougail_config, get_values_for_config, config_to_dict +from rougail_tests.utils import get_structures_list, get_rougail_config, get_values_for_config, config_to_dict, root_test_dir EXT = "yml" @@ -20,7 +20,7 @@ excludes = [ ] test_ok = get_structures_list(excludes) -# test_ok = [Path('../rougail-tests/structures/20_9family_absolute')] +# test_ok = [Path('../rougail-tests/structures/60_6family_dynamic_sub_dynamic_empty2')] def idfn(fixture_value): @@ -214,3 +214,94 @@ def test_structural_files_directory(): with open(data_file) as json_file: expected = load(json_file) assert expected == data, data_file + + +def test_secret_all(): + root_test_dir / '00_6secret' + rougailconfig = get_rougail_config(root_test_dir / '00_6secret', namespace=False) + rougailconfig['step.user_data'] = ['yaml'] + rougailconfig["yaml.file_with_secrets"] = "all" + rougailconfig["yaml.filename"] = ["tests/secrets/secret.yml"] + rougail = Rougail(rougailconfig) + config = rougail.run() + user_data = RougailUserData(config, rougailconfig=rougailconfig).run() + errors = rougail.user_datas(user_data) + assert errors == {'errors': [], 'warnings': []} + config_dict = dict(config_to_dict(config.value.get())) + assert config_dict == {'secret1': "my_password", 'secret2': 'value'} + + +def test_secret_none(): + root_test_dir / '00_6secret' + rougailconfig = get_rougail_config(root_test_dir / '00_6secret', namespace=False) + rougailconfig['step.user_data'] = ['yaml'] + rougailconfig["yaml.file_with_secrets"] = "none" + rougailconfig["yaml.filename"] = ["tests/secrets/secret.yml"] + rougail = Rougail(rougailconfig) + config = rougail.run() + user_data = RougailUserData(config, rougailconfig=rougailconfig).run() + errors = rougail.user_datas(user_data) + assert errors == {'errors': ['the variable "secret1" contains secrets and should not be defined in the YAML file "tests/secrets/secret.yml"'], 'warnings': []} + config_dict = dict(config_to_dict(config.value.get())) + assert config_dict == {'secret1': None, 'secret2': 'value'} + + +def test_secret_first(): + root_test_dir / '00_6secret' + rougailconfig = get_rougail_config(root_test_dir / '00_6secret', namespace=False) + rougailconfig['step.user_data'] = ['yaml'] + rougailconfig["yaml.file_with_secrets"] = "first" + rougailconfig["yaml.filename"] = ["tests/secrets/secret.yml", "tests/secrets/no_secret.yml"] + rougail = Rougail(rougailconfig) + config = rougail.run() + user_data = RougailUserData(config, rougailconfig=rougailconfig).run() + errors = rougail.user_datas(user_data) + assert errors == {'errors': [], 'warnings': []} + config_dict = dict(config_to_dict(config.value.get())) + assert config_dict == {'secret1': "my_password", 'secret2': 'value'} + + +def test_secret_first_error(): + root_test_dir / '00_6secret' + rougailconfig = get_rougail_config(root_test_dir / '00_6secret', namespace=False) + rougailconfig['step.user_data'] = ['yaml'] + rougailconfig["yaml.file_with_secrets"] = "first" + rougailconfig["yaml.filename"] = ["tests/secrets/no_secret.yml", "tests/secrets/secret.yml"] + rougail = Rougail(rougailconfig) + config = rougail.run() + user_data = RougailUserData(config, rougailconfig=rougailconfig).run() + errors = rougail.user_datas(user_data) + assert errors == {'errors': ['the variable "secret1" contains secrets and should not be defined in the YAML file "tests/secrets/secret.yml"'], 'warnings': []} + config_dict = dict(config_to_dict(config.value.get())) + assert config_dict == {'secret1': None, 'secret2': 'value'} + + +def test_secret_last(): + root_test_dir / '00_6secret' + rougailconfig = get_rougail_config(root_test_dir / '00_6secret', namespace=False) + rougailconfig['step.user_data'] = ['yaml'] + rougailconfig["yaml.file_with_secrets"] = "last" + rougailconfig["yaml.filename"] = ["tests/secrets/no_secret.yml", "tests/secrets/secret.yml"] + rougail = Rougail(rougailconfig) + config = rougail.run() + user_data = RougailUserData(config, rougailconfig=rougailconfig).run() + errors = rougail.user_datas(user_data) + assert errors == {'errors': [], 'warnings': []} + config_dict = dict(config_to_dict(config.value.get())) + assert config_dict == {'secret1': "my_password", 'secret2': 'value'} + + +def test_secret_last_error(): + root_test_dir / '00_6secret' + rougailconfig = get_rougail_config(root_test_dir / '00_6secret', namespace=False) + rougailconfig['step.user_data'] = ['yaml'] + rougailconfig["yaml.file_with_secrets"] = "last" + rougailconfig["yaml.filename"] = ["tests/secrets/secret.yml", "tests/secrets/no_secret.yml"] + rougail = Rougail(rougailconfig) + config = rougail.run() + user_data = RougailUserData(config, rougailconfig=rougailconfig).run() + errors = rougail.user_datas(user_data) + assert errors == {'errors': ['the variable "secret1" contains secrets and should not be defined in the YAML file "tests/secrets/secret.yml"'], 'warnings': []} + config_dict = dict(config_to_dict(config.value.get())) + assert config_dict == {'secret1': None, 'secret2': 'value'} +