Source code for coalib.settings.SectionFilling

import copy
from inspect import signature
import logging

from coalib.bears.BEAR_KIND import BEAR_KIND
from coalib.collecting import Dependencies
from coalib.collecting.Collectors import (
    collect_bears, collect_bears_by_aspects)
from coalib.settings.Setting import Setting


[docs]def fill_section(section, acquire_settings, log_printer, bears): """ Retrieves needed settings from given bears and asks the user for missing values. If a setting is requested by several bears, the help text from the latest bear will be taken. :param section: A section containing available settings. Settings will be added if some are missing. :param acquire_settings: The method to use for requesting settings. It will get a parameter which is a dictionary with the settings name as key and a list containing a description in [0] and the names of the bears who need this setting in all following indexes. :param log_printer: The log printer for logging. :param bears: All bear classes or instances. :return: The new section. """ # Retrieve needed settings. prel_needed_settings = {} for bear in bears: needed = bear.get_non_optional_settings() for key in needed: if key in prel_needed_settings: prel_needed_settings[key].append(bear.name) else: prel_needed_settings[key] = [needed[key][0], bear.name] # Strip away existent settings. needed_settings = {} for setting, help_text in prel_needed_settings.items(): if setting not in section: needed_settings[setting] = help_text # Get missing ones. if len(needed_settings) > 0: if len(signature(acquire_settings).parameters) == 2: new_vals = acquire_settings(None, needed_settings) else: logging.warning('acquire_settings: section parameter is ' 'deprecated.') new_vals = acquire_settings(None, needed_settings, section) for setting, help_text in new_vals.items(): section.append(Setting(setting, help_text)) return section
[docs]def fill_settings(sections, targets, acquire_settings, log_printer=None, fill_section_method=fill_section, **kwargs): """ Retrieves all bears and requests missing settings via the given acquire_settings method. This will retrieve all bears and their dependencies. :param sections: The sections to fill up, modified in place. :param targets: List of section names to be executed which are passed from cli. :param acquire_settings: The method to use for requesting settings. It will get a parameter which is a dictionary with the settings name as key and a list containing a description in [0] and the names of the bears who need this setting in all following indexes. :param log_printer: The log printer to use for logging. :param fill_section_method: Method to be used to fill the section settings. :param kwargs: Any other arguments for the fill_section_method can be supplied via kwargs, which are passed directly to the fill_section_method. :return: A tuple containing (local_bears, global_bears), each of them being a dictionary with the section name as key and as value the bears as a list. """ local_bears = {} global_bears = {} for section_name, section in sections.items(): bear_dirs = section.bear_dirs() if getattr(section, 'aspects', None): section_local_bears, section_global_bears = ( collect_bears_by_aspects( section.aspects, [BEAR_KIND.LOCAL, BEAR_KIND.GLOBAL])) else: bears = list(section.get('bears', '')) section_local_bears, section_global_bears = collect_bears( bear_dirs, bears, [BEAR_KIND.LOCAL, BEAR_KIND.GLOBAL]) section_local_bears = Dependencies.resolve(section_local_bears) section_global_bears = Dependencies.resolve(section_global_bears) all_bears = copy.deepcopy(section_local_bears) all_bears.extend(section_global_bears) if section.is_enabled(targets): fill_section_method(section, acquire_settings, None, all_bears, **kwargs) local_bears[section_name] = section_local_bears global_bears[section_name] = section_global_bears return local_bears, global_bears