Exemple #1
0
    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)
Exemple #3
0
    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()
Exemple #6
0
 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]
Exemple #9
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)
Exemple #10
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 _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)
Exemple #14
0
 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
Exemple #15
0
 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)