diff --git a/src/rougail/output_json/__init__.py b/src/rougail/output_json/__init__.py index 62d0fe1..883a415 100644 --- a/src/rougail/output_json/__init__.py +++ b/src/rougail/output_json/__init__.py @@ -1,6 +1,6 @@ """ Silique (https://www.silique.fr) -Copyright (C) 2022-2025 +Copyright (C) 2022-2026 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 @@ -38,6 +38,7 @@ class RougailOutputJson: rougailconfig: "RougailConfig" = None, user_data_errors: Optional[list] = None, user_data_warnings: Optional[list] = None, + true_config: "Config" = None, **kwargs, ) -> None: if rougailconfig is None: @@ -51,6 +52,10 @@ class RougailOutputJson: ) self.rougailconfig = rougailconfig self.config = config + if true_config: + self.true_config = true_config + else: + self.true_config = config try: groups.namespace self.support_namespace = True @@ -80,23 +85,18 @@ class RougailOutputJson: def exporter(self) -> None: self.is_mandatory = self.rougailconfig["json.mandatory"] - self.get = self.rougailconfig["json.get"] self.dico = {} - if self.is_mandatory: - ori_properties = self.config.property.exportation() - self.config.property.read_write() + if self.is_mandatory and self.config.isoptiondescription(): + ori_properties = self.true_config.property.exportation() + self.true_config.property.read_write() self.mandatory() - self.config.property.importation(ori_properties) + self.true_config.property.importation(ori_properties) self.manage_warnings() - if self.get: - config = self.config.option(self.get) - if not config.isoptiondescription(): - self.dico = config.value.get() - return True - else: - config = self.config + if not self.config.isoptiondescription(): + self.dico = self.config.value.get() + return True self.parse_family( - config, + self.config, self.dico, None, ) @@ -168,10 +168,7 @@ class RougailOutputJson: self.parse_family(option, parent, subnamespace) child[option.name()] = parent else: - self.parse_variable(option, child, namespace) - - def parse_variable(self, option, child, namespace): - child[option.name()] = option.value.get() + child[option.name()] = option.value.get() def parse_leadership( self, diff --git a/src/rougail/output_json/config.py b/src/rougail/output_json/config.py index 9247858..42ba081 100644 --- a/src/rougail/output_json/config.py +++ b/src/rougail/output_json/config.py @@ -1,6 +1,6 @@ """ Silique (https://www.silique.fr) -Copyright (C) 2024-2025 +Copyright (C) 2024-2026 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 @@ -44,15 +44,6 @@ json: jinja: |- {{{{ cli.read_write is not defined or not cli.read_write }}}} description: {_('true if "cli.read_write" is false')} - - get: - description: {_('get value for a variable or a family')} - help: |- - {_('By default, the entire configuration is exported as JSON. It is possible to retrieve variables values from a defined family or directly the value of a variable.')} - examples: - - family - - family.variable - mandatory: false """ return { "name": "json", diff --git a/src/rougail/output_json/i18n.py b/src/rougail/output_json/i18n.py index 3f16f67..f7a9835 100644 --- a/src/rougail/output_json/i18n.py +++ b/src/rougail/output_json/i18n.py @@ -1,6 +1,6 @@ """Internationalisation utilities Silique (https://www.silique.fr) -Copyright (C) 2024-2025 +Copyright (C) 2024-2026 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 diff --git a/tests/test_load.py b/tests/test_load.py index c170195..a25b134 100644 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -1,6 +1,6 @@ from pytest import fixture # , raises from pathlib import Path -from rougail import Rougail +from rougail import Rougail, RougailConfig from rougail.output_json import RougailOutputJson as RougailOutput from rougail_tests.utils import get_structures_list, get_rougail_config, get_values_for_config @@ -111,3 +111,41 @@ def test_structural_files_json_namespace_mandatory(test_dir): def test_structural_files_json_namespace_mandatory_read_only(test_dir): _test_structural_files(test_dir, False, EXT, read_write=False, mandatory=True) + + +def test_subconfig_family(): + rougailconfig = RougailConfig.copy() + rougailconfig['step.output'] = 'json' + rougailconfig['main_structural_directories'] = [str(Path(__file__).parent / 'subconfig')] + rougail = Rougail(rougailconfig) + config = rougail.run() + config.property.read_only() + generated_output = RougailOutput(config.option('rougail.a_family'), rougailconfig=rougailconfig, true_config=config).run()[1] + output_file = Path(__file__).parent / 'subconfig-results' / "family.json" + if not output_file.is_file(): + if not output_file.parent.is_dir(): + output_file.parent.mkdir() + with output_file.open('w') as outfh: + outfh.write(generated_output) + with output_file.open() as outfh: + attented_output = outfh.read() + assert generated_output == attented_output, f'filename {output_file}' + + +def test_subconfig_variable(): + rougailconfig = RougailConfig.copy() + rougailconfig['step.output'] = 'json' + rougailconfig['main_structural_directories'] = [str(Path(__file__).parent / 'subconfig')] + rougail = Rougail(rougailconfig) + config = rougail.run() + config.property.read_only() + generated_output = RougailOutput(config.option('rougail.a_family.a_sub_family.a_variable'), rougailconfig=rougailconfig, true_config=config).run()[1] + output_file = Path(__file__).parent / 'subconfig-results' / "variable.json" + if not output_file.is_file(): + if not output_file.parent.is_dir(): + output_file.parent.mkdir() + with output_file.open('w') as outfh: + outfh.write(generated_output) + with output_file.open() as outfh: + attented_output = outfh.read() + assert generated_output == attented_output, f'filename {output_file}'