def path(self, path, saltenv=None, path_type=None): ''' Relative salt path is the base path that all paths rely on. Any conversions from formats that are not relative will happen here. :param path: :param saltenv: :param path_type: ''' if isinstance(path, list): return [self.path(p, saltenv) for p in path] path_type = path_type or self.path_type(path, saltenv) # XXX: Grabs 1st entry. Maybe need more logic if path_type in ['toppath']: tops = self.files(saltenv=saltenv, toppath=path) try: topinfo = next(iter(tops)) relpath = matcher.getter('relpath', topinfo) return relpath(topinfo) except StopIteration: return '' return super(TopUtils, self).path(path, saltenv, path_type=path_type)
def include_links(self, tops): includes = [] try: top = next(iter(tops)) saltenv = matcher.getter('saltenv', top) abspath = matcher.getter('abspath', top) except StopIteration: return includes for topinfo in tops: if os.path.islink(abspath(topinfo)): realpath = os.path.realpath(abspath(topinfo)) includes.extend( self.files( saltenv=saltenv(topinfo), abspath=realpath ) ) return includes
def add_field_item(group_list, info): ''' Field value to add. Will be added to dictionary[key] as its value. Parameters ---------- group_list info ''' field_key = matcher.getter(field, info) value = field_key(info) if value not in group_list: group_list.append(value) return group_list
def flatten(key, sequence): ''' Flattens (reduces) sequence by key. Returns a list. Parameters ---------- key: sequence key of data to flatten sequence: list of objects Example ------- >>> data = [ ... {'saltenv': 'base', ... 'relpath': 'test/init.sls', ... 'is_pillar': True}, ... {'saltenv': 'base', ... 'relpath': 'test/test.sls', ... 'is_pillar': True}, ... {'saltenv': 'all', ... 'relpath': 'demo/demo.sls', ... 'is_pillar': True} ... ] >>> flatten('relpath', data) ['test/init.sls', 'test/test.sls', 'demo/demo.sls'] ''' if not sequence: return [] try: # Mapping return sorted(chain.from_iterable(sequence.values())) except AttributeError: # Sequence getter = matcher.getter(key, *sequence) return sorted( imap(lambda s: getter(s), sequence) ) # pylint: disable=W0108
def flatten(key, sequence): ''' Flattens (reduces) sequence by key. Returns a list. Parameters ---------- key: sequence key of data to flatten sequence: list of objects Example ------- >>> data = [ ... {'saltenv': 'base', ... 'relpath': 'test/init.sls', ... 'is_pillar': True}, ... {'saltenv': 'base', ... 'relpath': 'test/test.sls', ... 'is_pillar': True}, ... {'saltenv': 'all', ... 'relpath': 'demo/demo.sls', ... 'is_pillar': True} ... ] >>> flatten('relpath', data) ['test/init.sls', 'test/test.sls', 'demo/demo.sls'] ''' if not sequence: return [] try: # Mapping return sorted(chain.from_iterable(sequence.values())) except AttributeError: # Sequence getter = matcher.getter(key, *sequence) return sorted(imap(lambda s: getter(s), sequence)) # pylint: disable=W0108
def get(element, key): return matcher.getter(key, element)(element)
def reduceby(key, field, sequence): ''' Groups sequence by group key and reduces (only contains) values from the field key. Returns a dictionary. Parameters ---------- key: sequence key to use to group data field: sequence key used to populate group data sequence: list of objects Example ------- >>> data = [ ... {'saltenv': 'base', ... 'relpath': 'test/init.sls', ... 'is_pillar': True}, ... {'saltenv': 'base', ... 'relpath': 'test/test.sls', ... 'is_pillar': True}, ... {'saltenv': 'all', ... 'relpath': 'demo/demo.sls', ... 'is_pillar': True} ... ] >>> reduceby('saltenv', 'relpath', data) {'all': ['demo/demo.sls'], 'base': ['test/init.sls', 'test/test.sls']} ''' def add_field_item(group_list, info): ''' Field value to add. Will be added to dictionary[key] as its value. Parameters ---------- group_list info ''' field_key = matcher.getter(field, info) value = field_key(info) if value not in group_list: group_list.append(value) return group_list odict = OrderedDict() if not sequence: return odict getter = matcher.getter(key, *sequence) for item in sequence: key = getter(item) if key not in odict: odict[key] = list() odict[key] = add_field_item(odict[key], item) return odict