# hiermatch - Doing match on a list of string or a hierarchy. # Written by Chris Lawrence # Copyright (C) 1999-2008 Chris Lawrence # Copyright (C) 2008-2022 Sandro Tosi import re from . import exceptions def egrep_list(strlist, pattern_str, subindex=None): """ Use the pattern_str to find any match in a list of strings This is a helper function for :func:`egrep_hierarchy`. Note that this function is never called with the `subindex` parameter set. Parameters ---------- strlist : [str, ...] list of strings in which to look for the pattern pattern_str : str regular expression pattern subindex : [int, ...] list of indexes of strings in strlist, specifying the elements in which to look for the pattern Returns ------- [int, ...] a list of indexes for the matches in the origin list """ if strlist is None: return None try: pat = re.compile(pattern_str, re.I | re.M) except Exception: raise exceptions.InvalidRegex resultlist = [] if subindex is None: subindex = list(range(len(strlist))) for i in subindex: if pat.search(strlist[i]): resultlist.append(i) return resultlist def egrep_hierarchy(hier, pattern_str, subhier=None, nth=1): """ Grep the nth item of a hierarchy [(x, [a, b]),...] This is a helper function for :func:`matched_hierarchy`. Note that this function is never called with the `subhier` and `nth` parameters set. Parameters ---------- hier : [(str, [str, ...]), (str, [str, ...]), ...] list of tuples with severity and bug list pattern_str : str regular expression pattern subhier : [[int, ...], ...], optional subhierarchy indices nth : int, optional should always be 1 (one) Returns ------- [[int, ...], [int, ...], ...] a subhierarchy (for each severity in the input hierarchy, the list of indexes of the bugs matching the pattern_str) """ resulthier = [] for i in range(len(hier)): if subhier: if subhier[i]: # Only if have something to match. resultlist = egrep_list(hier[i][nth], pattern_str, subhier[i]) else: resultlist = [] else: resultlist = egrep_list(hier[i][nth], pattern_str) resulthier.append(resultlist) return resulthier def matched_hierarchy(hier, pattern_str): """ Create a new hierarchy from a pattern matching Parameters ---------- hier : [(str, [str, ...]), (str, [str, ...]), ...] list of tuples with severity and bug list pattern_str : str regular expression pattern Returns ------- [(str, [str, ...]), (str, [str, ...]), ...] list of tuples with severity and bug list, only including bugs matching the pattern_str """ mhier = [] result = egrep_hierarchy(hier, pattern_str) for i in range(len(result)): if result[i]: item = [hier[i][1][y] for y in result[i]] mhier.append((hier[i][0], item)) return mhier # vim:ts=8:sw=4:expandtab: