def _init_variable(self, parent, member_name, default, set_value, add_value, norm_values, parse_value=lambda x: [x]): def _collect(value): return list(ichain(imap(parse_value, value))) # Setting initial value of variable result = default if hasattr(parent, member_name): # get from parent if available result = getattr(parent, member_name) if set_value is None: result = set_value elif not unspecified(set_value): result = norm_values(list(_collect(set_value))) # Add to settings if add_value and (result is not None): result = result + norm_values(list(_collect(add_value))) elif add_value: result = norm_values(list(_collect(add_value))) setattr(self, member_name, result) return result
def _get_internal(self, desc, obj2str, str2obj, def2obj, option, default_obj, interactive=True, interactive_msg=None, interactive_msg_append_default=True, **kwargs): # interactive mode only overrides default values from the code uii = UserInputInterface() if interactive_msg and self.is_interactive(option, interactive): prompt = interactive_msg if interactive_msg_append_default and not unspecified(default_obj): prompt += (' [%s]' % self._get_default_str(default_obj, def2obj, obj2str)) while True: handler = signal.signal(signal.SIGINT, signal.SIG_DFL) try: user_input = uii.prompt_text('%s: ' % prompt) except Exception: sys.exit(os.EX_DATAERR) signal.signal(signal.SIGINT, handler) if user_input != '': try: default_obj = str2obj(user_input) except Exception: clear_current_exception() self._log.warning('Unable to parse %s: %s\n', desc, user_input) continue break return TypedConfigInterface._get_internal(self, desc, obj2str, str2obj, def2obj, option, default_obj, **kwargs)
def format(self, print_section=False, print_default=False, default=unspecified, source='', wraplen=33): if unspecified(self.value) or (not print_default and (self.value == default)): return '' if print_section: prefix = '[%s] %s' % (self.section, self.option) else: prefix = self.option prefix += ' %s' % self.opttype line_list = lidfilter(imap(str.strip, self.value.strip().splitlines())) if len(line_list) == 1: line_list = [prefix + ' ' + line_list[0]] # everything on one line else: line_list.insert( 0, prefix) # prefix on first line - rest on other lines result = '' for line in line_list: if not result: # first line if source and (len(line) >= wraplen): result += '; source: ' + source + '\n' elif source: result = line.ljust(wraplen) + ' ; ' + source + '\n' continue else: result += '\t' result += line + '\n' return result.rstrip()
def get_entry(self, option_list, entry_default, entry_default_fallback): if not unspecified(entry_default.value): self._container_cur.set_default_entry(entry_default) # Assemble matching config entries and combine them entries = self._match_entries(self._container_cur, option_list) if not unspecified(entry_default.value): entries.append(entry_default_fallback) self._log.log(logging.DEBUG1, 'Used config entries:') for entry in entries: self._log.log(logging.DEBUG1, ' %s (%s | %s)', entry.format(print_section=True), entry.source, entry.order) entry_cur = ConfigEntry.combine_entries(entries) # Ensure that fallback default value is stored in persistent storage if entry_default_fallback.used and not unspecified(entry_default.value): self._container_cur.set_default_entry(entry_default_fallback) return entry_cur
def format(self, print_section=False, print_default=False, default=unspecified, source='', wraplen=33): if unspecified(self.value) or (not print_default and (self.value == default)): return '' if print_section: prefix = '[%s] %s' % (self.section, self.option) else: prefix = self.option prefix += ' %s' % self.opttype line_list = lidfilter(imap(str.strip, self.value.strip().splitlines())) if len(line_list) == 1: line_list = [prefix + ' ' + line_list[0]] # everything on one line else: line_list.insert(0, prefix) # prefix on first line - rest on other lines result = '' for line in line_list: if not result: # first line if source and (len(line) >= wraplen): result += '; source: ' + source + '\n' elif source: result = line.ljust(wraplen) + ' ; ' + source + '\n' continue else: result += '\t' result += line + '\n' return result.rstrip()
def get_entry(self, option_list, entry_default, entry_default_fallback): if not unspecified(entry_default.value): self._container_cur.set_default_entry(entry_default) # Assemble matching config entries and combine them entries = self._match_entries(self._container_cur, option_list) if not unspecified(entry_default.value): entries.append(entry_default_fallback) self._log.log(logging.DEBUG1, 'Used config entries:') for entry in entries: self._log.log(logging.DEBUG1, ' %s (%s | %s)', entry.format(print_section=True), entry.source, entry.order) entry_cur = ConfigEntry.combine_entries(entries) # Ensure that fallback default value is stored in persistent storage if entry_default_fallback.used and not unspecified( entry_default.value): self._container_cur.set_default_entry(entry_default_fallback) return entry_cur
def lookup(self, value, default=unspecified, is_selector=True): result = list(self._lookup(value, is_selector)) if (None in self._values) and (self._always_default or not result): result.append(self._values[None]) if not (result or unspecified(default)): result.append(default) if not self._only_first: return result elif result: return result[0]
def lookup(self, value, default=unspecified, is_selector=True): result = list(self._lookup(value, is_selector)) if (None in self._values) and (self._always_default or not result): result.append(self._values[None]) if not (result or unspecified(default)): result.append(default) if not self._only_first: return result elif result: return result[0]
def split_list(iterable, fun, sort_key=unspecified): # single pass on iterable! (result_true, result_false) = ([], []) for value in iterable: if fun(value): result_true.append(value) else: result_false.append(value) if not unspecified(sort_key): sort_inplace(result_true, key=sort_key) sort_inplace(result_false, key=sort_key) return (result_true, result_false)
def split_list(iterable, fun, sort_key=unspecified): # single pass on iterable! (result_true, result_false) = ([], []) for value in iterable: if fun(value): result_true.append(value) else: result_false.append(value) if not unspecified(sort_key): sort_inplace(result_true, key=sort_key) sort_inplace(result_false, key=sort_key) return (result_true, result_false)
def _get_default_str(self, default_obj, def2obj, obj2str): # First transform default into string if applicable if not unspecified(default_obj): try: if def2obj: default_obj = def2obj(default_obj) except Exception: raise APIError('Unable to convert default object: %s' % repr(default_obj)) try: result = obj2str(default_obj) if not isinstance(result, str): raise APIError('Default string representation function returned %r' % result) return result except Exception: raise APIError('Unable to get string representation of default object: %s' % repr(default_obj)) return unspecified
def _init_variable(self, parent, member_name, default, set_value, add_value, norm_values, parse_value=lambda x: [x]): def _collect(value): return list(ichain(imap(parse_value, value))) # Setting initial value of variable result = default if hasattr(parent, member_name): # get from parent if available result = getattr(parent, member_name) if set_value is None: result = set_value elif not unspecified(set_value): result = norm_values(list(_collect(set_value))) # Add to settings if add_value and (result is not None): result = result + norm_values(list(_collect(add_value))) elif add_value: result = norm_values(list(_collect(add_value))) setattr(self, member_name, result) return result
def get_choice(self, option, choices, default=unspecified, obj2str=str.__str__, str2obj=str, def2obj=None, **kwargs): default_str = self._get_default_str(default, def2obj, obj2str) def _cap_default(value): # capitalize default value if value == default_str: return value.upper() return value.lower() choices_str = str.join('/', imap(_cap_default, imap(obj2str, choices))) if (default not in choices) and not unspecified(default): raise APIError('Invalid default choice "%s" [%s]!' % (default, choices_str)) if 'interactive_msg' in kwargs: kwargs['interactive_msg'] += (' [%s]' % choices_str) def _checked_str2obj(value): obj = str2obj(value) if obj not in choices: raise ConfigError('Invalid choice "%s" [%s]!' % (value, choices_str)) return obj return self._get_internal('choice', obj2str, _checked_str2obj, def2obj, option, default, interactive_msg_append_default=False, **kwargs)
def _get_default_str(self, default_obj, def2obj, obj2str): # First transform default into string if applicable if not unspecified(default_obj): try: if def2obj: default_obj = def2obj(default_obj) except Exception: raise APIError('Unable to convert default object: %s' % repr(default_obj)) try: result = obj2str(default_obj) if not isinstance(result, str): raise APIError( 'Default string representation function returned %r' % result) return result except Exception: raise APIError( 'Unable to get string representation of default object: %s' % repr(default_obj)) return unspecified
def _get_internal(self, desc, obj2str, str2obj, def2obj, option, default_obj, on_change=unspecified, on_valid=unspecified, persistent=False, override=None): if self._log.isEnabledFor(logging.DEBUG2): self._log.log(logging.DEBUG2, 'Config query from: %r', self._get_caller()) # Make sure option is in a consistent format option_list = norm_config_locations(option) self._log.log(logging.DEBUG1, 'Config query for config option %r', str.join(' / ', option_list)) if override: return str2obj(override) default_str = None try: default_str = self._get_default_str(default_obj, def2obj, obj2str) (old_entry, cur_entry) = self._config_view.get(option_list, default_str, persistent=persistent) return self._process_entries( old_entry, cur_entry, desc, obj2str, str2obj, when_unspecified(on_change, self._default_on_change), when_unspecified(on_valid, self._default_on_valid)) except Exception: if unspecified(default_obj): default_str = 'no default' # pylint:disable=redefined-variable-type elif not default_str: default_str = repr(default_obj) raise ConfigError( 'Unable to get %r from option %r (%s)' % (desc, str.join(' / ', option_list), default_str))
def _get_internal(self, desc, obj2str, str2obj, def2obj, option, default_obj, interactive=True, interactive_msg=None, interactive_msg_append_default=True, **kwargs): # interactive mode only overrides default values from the code uii = UserInputInterface() if interactive_msg and self.is_interactive(option, interactive): prompt = interactive_msg if interactive_msg_append_default and not unspecified(default_obj): prompt += ( ' [%s]' % self._get_default_str(default_obj, def2obj, obj2str)) while True: handler = signal.signal(signal.SIGINT, signal.SIG_DFL) try: user_input = uii.prompt_text('%s: ' % prompt) except Exception: sys.exit(os.EX_DATAERR) signal.signal(signal.SIGINT, handler) if user_input != '': try: default_obj = str2obj(user_input) except Exception: clear_current_exception() self._log.warning('Unable to parse %s: %s\n', desc, user_input) continue break return TypedConfigInterface._get_internal(self, desc, obj2str, str2obj, def2obj, option, default_obj, **kwargs)
def _get_internal(self, desc, obj2str, str2obj, def2obj, option, default_obj, on_change=unspecified, on_valid=unspecified, persistent=False, override=None): if self._log.isEnabledFor(logging.DEBUG2): self._log.log(logging.DEBUG2, 'Config query from: %r', self._get_caller()) # Make sure option is in a consistent format option_list = norm_config_locations(option) self._log.log(logging.DEBUG1, 'Config query for config option %r', str.join(' / ', option_list)) if override: return str2obj(override) default_str = None try: default_str = self._get_default_str(default_obj, def2obj, obj2str) (old_entry, cur_entry) = self._config_view.get(option_list, default_str, persistent=persistent) return self._process_entries(old_entry, cur_entry, desc, obj2str, str2obj, when_unspecified(on_change, self._default_on_change), when_unspecified(on_valid, self._default_on_valid)) except Exception: if unspecified(default_obj): default_str = 'no default' # pylint:disable=redefined-variable-type elif not default_str: default_str = repr(default_obj) raise ConfigError('Unable to get %r from option %r (%s)' % (desc, str.join(' / ', option_list), default_str))
def get_choice(self, option, choices, default=unspecified, obj2str=str.__str__, str2obj=str, def2obj=None, **kwargs): default_str = self._get_default_str(default, def2obj, obj2str) def _cap_default(value): # capitalize default value if value == default_str: return value.upper() return value.lower() choices_str = str.join('/', imap(_cap_default, imap(obj2str, choices))) if (default not in choices) and not unspecified(default): raise APIError('Invalid default choice "%s" [%s]!' % (default, choices_str)) if 'interactive_msg' in kwargs: kwargs['interactive_msg'] += (' [%s]' % choices_str) def _checked_str2obj(value): obj = str2obj(value) if obj not in choices: raise ConfigError('Invalid choice "%s" [%s]!' % (value, choices_str)) return obj return self._get_internal('choice', obj2str, _checked_str2obj, def2obj, option, default, interactive_msg_append_default=False, **kwargs)