def __init__(self, *restrict_sources, **kwds): """ descriptive, no? Basically splits an iterable of restrict:data into level of specificity, repo, cat, pkg, atom (dict) for use in filters Finally, a finalize_defaults kwd is supported to control whether incremental_expansion finalizes the initial defaults list. defaults to True. """ always = [] repo = [] cat = [] pkg = [] multi = [] atom_d = {} for restrict_pairs in restrict_sources: for a, data in restrict_pairs: if not data: continue if isinstance(a, restriction.AlwaysBool): # yes, odd attr name, but negate holds the val to return. # note also, we're dropping AlwaysFalse; it'll never match. if a.negate: always.extend(data) for atomlist in atom_d.itervalues(): atomlist.append((a, set([flag for flag in data if flag.startswith("-")]))) elif isinstance(a, atom.atom): atom_d.setdefault(a.key, []).append((a, data)) elif isinstance(a, boolean.AndRestriction): multi.append((a, data)) elif isinstance(a, packages.PackageRestriction): if a.attr == "category": cat.append((a, data)) elif a.attr == "package": pkg.append((a, data)) elif a.attr == "repo.repo_id": repo.append((a, data)) else: raise ValueError("%r doesn't operate on package/category/repo: " "data %r" % (a, data)) else: raise ValueError("%r is not an AlwaysBool, PackageRestriction, " "or atom: data %r" % (a, data)) if always: s = set() incremental_expansion(s, always, finalize=kwds.get("finalize_defaults", True)) always = s else: always = set() self.defaults = always self.defaults_finalized = set(x for x in self.defaults if not x.startswith("-")) self.freeform = tuple(x for x in (repo, cat, pkg, multi) if x) self.atoms = atom_d
def render_pkg(self, pkg, pre_defaults=()): items = self._dict.get(atom.atom(pkg.key)) if items is None: items = self._global_settings s = set(pre_defaults) incremental_expansion(s, chain_from_iterable(item.data for item in items if item.restrict.match(pkg))) return s
def render_pkg(self, pkg, pre_defaults=()): items = self._dict.get(atom.atom(pkg.key)) if items is None: items = self._global_settings s = set(pre_defaults) incremental_expansion(s, chain.from_iterable(item.data for item in items if item.restrict.match(pkg))) return s
def render_incrementals(iterable, **kwds): """helper function for simple incremental_expansion calls :param iterable: sequence of items to incrementally stack :param kwargs: options to pass to incremental_expansion :return: a set of the rendered results from incremental_expansion """ s = set() incremental_expansion(s, iterable, **kwds) return s
def pull_data(self, pkg, force_copy=False, pre_defaults=()): l = [] for specific in self.freeform: for restrict, data in specific: if restrict.match(pkg): l.append(data) for atom, data in self.atoms.get(pkg.key, ()): if atom.match(pkg): l.append(data) if pre_defaults: s = set(pre_defaults) incremental_expansion(s, self.defaults) else: s = set(self.defaults_finalized) if l: incremental_expansion(s, iflatten_instance(l)) return s