From 28103836ac389f51818c319c7f6599548c8cda9b Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Sat, 13 Apr 2024 17:52:05 +0200 Subject: [PATCH] config: Add ask_value() helper to section & config objects --- mylib/config.py | 86 +++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/mylib/config.py b/mylib/config.py index eea6cd4..7fff4b4 100644 --- a/mylib/config.py +++ b/mylib/config.py @@ -249,12 +249,16 @@ class BaseOption: # pylint: disable=too-many-instance-attributes def ask_value(self, set_it=True): """ - Ask to user to enter value of this option and set or - return it regarding set parameter + Ask to user to enter value of this option and set it if set_it parameter is True + + :param set_it: If True (default), option value will be updated with user input + + :return: The configuration option value. + :rtype: mixed """ value = self._ask_value() if set_it: - return self.set(value) + self.set(value) return value @@ -510,8 +514,12 @@ class PasswordOption(StringOption): def ask_value(self, set_it=True): """ - Ask to user to enter value of this option and set or - return it regarding set parameter + Ask to user to enter value of this option and set it if set_it parameter is True + + :param set_it: If True (default), option value will be updated with user input + + :return: The configuration option value. + :rtype: mixed """ value = self._ask_value() if set_it: @@ -530,7 +538,7 @@ class PasswordOption(StringOption): use_keyring = False else: print("Invalid answer. Possible values: Y or N (case insensitive)") - return self.set(value, use_keyring=use_keyring) + self.set(value, use_keyring=use_keyring) return value @@ -610,28 +618,32 @@ class ConfigSection: :param set_it: If True (default), option value will be updated with user input - :return: If set_it is True, return True if valid value for each configuration - option have been retrieved and set. If False, return a dict of configuration - options and their value. + :return: a dict of configuration options and their value. :rtype: bool of dict """ if self.comment: print(f"# {self.comment}") print(f"[{self.name}]\n") result = {} - error = False for name, option in self.options.items(): - option_result = option.ask_value(set_it=set_it) - if set_it: - result[name] = option_result - elif not option_result: - error = True + result[name] = option.ask_value(set_it=set_it) print() print() - if set_it: - return not error return result + def ask_value(self, option, set_it=True): + """ + Ask user to enter value for the specified configuration option of the section + + :param options: The configuration option name + :param set_it: If True (default), option value will be updated with user input + + :return: The configuration option value. + :rtype: mixed + """ + assert self.defined(option), f"Option {option} unknown" + return self.options[option].ask_value(set_it=set_it) + class RawWrappedTextHelpFormatter(argparse.RawDescriptionHelpFormatter): """ @@ -1073,8 +1085,7 @@ class Config: # pylint: disable=too-many-instance-attributes self._loaded() if self.get_option("mylib_config_reconfigure", default=False): - if self.ask_values(set_it=True) and self.save(): - sys.exit(0) + self.ask_values(set_it=True) sys.exit(1) return options @@ -1100,27 +1111,32 @@ class Config: # pylint: disable=too-many-instance-attributes :param execute_callback: Sections's loaded callbacks will be finally executed (only if set_it is True, default: False) - :return: If set_it is True, return True if valid value for each configuration - option have been retrieved and set. If False, return a dict of configuration - section and their options value. - :rtype: bool of dict + :return: a dict of configuration section and their options value. + :rtype: dict """ result = {} - error = False for name, section in self.sections.items(): - section_result = section.ask_values(set_it=set_it) - if not set_it: - result[name] = section_result - elif not section_result: - error = True - if set_it: - if error: - return False - if execute_callback: - self._loaded() - return True + result[name] = section.ask_values(set_it=set_it) + + if set_it and execute_callback: + self._loaded() + return result + def ask_value(self, section, option, set_it=True): + """ + Ask user to enter value for the specified configuration option + + :param section: The configuration section name + :param option: The configuration option name + :param set_it: If True (default), option value will be updated with user input + + :return: The configuration option value. + :rtype: mixed + """ + assert self.defined(section, option), f"Unknown option {section}.{option}" + return self.sections[section].ask_value(option, set_it=set_it) + def configure(self, argv=None, description=False): """ Entry point of a script you could use to created your configuration file