Ejemplo n.º 1
0
class Section(object):
    def __init__(self, name, params=None):
        self._name = name
        if params is None:
            self._params = OrderedDict()
        else:
            self._params = params
        self._sub_sections = OrderedDict()

    def __getitem__(self, index):
        return self.get_subsections_by_name(index)

    def __repr__(self):
        return 'Section %s (%s)' % (self.get_name(), self._params or '')

    def set_params(self, **params):
        self._params = params

    def get_params(self):
        return self._params

    def get_name(self):
        return self._name

    def add_sub_section(self, sec):
        key = sec.get_name()
        if key not in self._sub_sections:
            self._sub_sections[key] = []

        self._sub_sections[key].append(sec)
        return sec

    def get_subsections_by_name(self, name):
        return self._sub_sections.get(name, [])

    def get_subsections_by_param_val(self, **kwargs):
        ret = []
        for item in self.get_subsections():
            item_match = True
            for k, v in kwargs.iteritems():
                item_params = item.get_params()
                if k in item_params.keys():
                    if item_params[k] != v:
                        item_match = False
            if item_match:
                ret.append(item)
        return ret

    def get_subsections(self):
        for subsec in self._sub_sections.itervalues():
            for sub in subsec:
                yield sub

    def search_section_childs(self, section_name, param_name):
        return self._search_section_params(self, section_name, param_name)

    def _search_section_params(self, section, section_name, param_name):
        param_values = set()
        for s in section.get_subsections():
            if s.get_name() == section_name:
                for key, val in s.get_params().iteritems():
                    if key == param_name:
                        param_values.add(val)
            deeper_values = self._search_section_params(s, section_name, param_name)
            param_values |= deeper_values
        return param_values

    # Generator for subsections
    def __iter__(self):
        return self.get_subsections()