def test_regexp(self): """ Regular expressions """ assert (filter("tag: Tier.*", self.data, regexp=True) is True) assert (filter("tag: Tier[123]", self.data, regexp=True) is True) assert (filter("tag: mod:[XS]", self.data, regexp=True) is True) assert (filter("tag: NoTier.*", self.data, regexp=True) is False) assert (filter("tag: -Tier.*", self.data, regexp=True) is False)
def test_basic(self): """ Basic stuff and negation """ assert (filter("tag: Tier1", self.data) is True) assert (filter("tag: mod:S", self.data) is True) assert (filter("tag: -Tier2", self.data) is True) assert (filter("tag: -mod:S2", self.data) is True) assert (filter("category: Sanity", self.data) is True) assert (filter("category: -Regression", self.data) is True) assert (filter("tag: Tier2", self.data) is False) assert (filter("tag: -Tier1", self.data) is False) assert (filter("category: Regression", self.data) is False) assert (filter("category: -Sanity", self.data) is False)
def prune(self, whole=False, keys=[], names=[], filters=[], conditions=[]): """ Filter tree nodes based on given criteria """ for node in self.climb(whole): # Select only nodes with key content if not all([key in node.data for key in keys]): continue # Select nodes with name matching regular expression if names and not any( [re.search(name, node.name) for name in names]): continue # Apply filters and conditions if given try: if not all([ utils.filter(filter, node.data, regexp=True) for filter in filters ]): continue if not all([ utils.evaluate(condition, node.data, node) for condition in conditions ]): continue # Handle missing attribute as if filter failed except utils.FilterError: continue # All criteria met, thus yield the node yield node
def test_sugar(self): """ Syntactic sugar """ assert (filter("tag: Tier1, Tier2", self.data) is True) assert (filter("tag: Tier2, mod:S", self.data) is True) assert (filter("tag: Tier1, TIPpass", self.data) is True) assert (filter("tag: -Tier2", self.data) is True) assert (filter("tag: -Tier1, -Tier2", self.data) is True) assert (filter("tag: -Tier1, -Tier2", self.data) is True) assert (filter("tag: Tier2, Tier3", self.data) is False)
def test_invalid(self): """ Invalid filter format """ with pytest.raises(utils.FilterError): filter("x & y", self.data) with pytest.raises(utils.FilterError): filter("status:proposed", self.data) with pytest.raises(utils.FilterError): filter("x: 1", None)
def main(cmdline=None): """ Parse options, gather metadata, print requested data """ # Parse command line arguments options, arguments = Options().parse(cmdline) if not arguments: arguments = ["."] output = "" # Enable debugging output if options.debug: utils.log.setLevel(utils.LOG_DEBUG) # Show metadata for each path given counter = 0 for path in arguments: if options.verbose: utils.info("Checking {0} for metadata.".format(path)) tree = fmf.Tree(path) for node in tree.climb(options.whole): # Select only nodes with key content if not all([key in node.data for key in options.keys]): continue # Select nodes with name matching regular expression if options.names and not any( [re.search(name, node.name) for name in options.names]): continue # Apply advanced filters if given try: if not all([utils.filter(filter, node.data) for filter in options.filters]): continue # Handle missing attribute as if filter failed except utils.FilterError: continue show = node.show(brief=options.brief) print(show) output += show + "\n" counter += 1 # Print summary if options.verbose: utils.info("Found {0}.".format(utils.listed(counter, "object"))) return output
def test_unicode(self): """ Unicode support """ assert (filter("tag: -ťip", self.data) is True) assert (filter("tag: ťip", self.data) is False) assert (filter("tag: ťip", {"tag": ["ťip"]}) is True) assert (filter("tag: -ťop", {"tag": ["ťip"]}) is True)
def test_case(self): """ Case insensitive """ assert (filter("tag: tier1", self.data, sensitive=False) is True) assert (filter("tag: tippass", self.data, sensitive=False) is True)
def test_operators(self): """ Operators """ assert (filter("tag: Tier1 | tag: Tier2", self.data) is True) assert (filter("tag: Tier1 | tag: mod:S", self.data) is True) assert (filter("tag: mod:X | tag: mod:S", self.data) is True) assert (filter("tag: -Tier1 | tag: -Tier2", self.data) is True) assert (filter("tag: Tier1 | tag: TIPpass", self.data) is True) assert (filter("tag: Tier1 | category: Regression", self.data) is True) assert (filter("tag: Tier1 & tag: TIPpass", self.data) is True) assert (filter("tag: Tier1 & category: Sanity", self.data) is True) assert (filter("tag: Tier2 | tag: Tier3", self.data) is False) assert (filter("tag: Tier1 & tag: Tier2", self.data) is False) assert (filter("tag: Tier2 & tag: Tier3", self.data) is False) assert (filter("tag: Tier1 & category: Regression", self.data) is False) assert (filter("tag: Tier2 | category: Regression", self.data) is False)
def test_empty_filter(self): """ Empty filter should return True """ assert filter(None, self.data) is True assert filter("", self.data) is True
def test_filter(): """ Function filter() """ data = {"tag": ["Tier1", "TIPpass"], "category": ["Sanity"]} # Invalid filter format with pytest.raises(FilterError): filter("x & y", data) with pytest.raises(FilterError): filter("status:proposed", data) # Basic stuff and negation filter("tag: Tier1", data) == True filter("tag: -Tier2", data) == True filter("category: Sanity", data) == True filter("category: -Regression", data) == True filter("tag: Tier2", data) == False filter("tag: -Tier1", data) == False filter("category: Regression", data) == False filter("category: -Sanity", data) == False # ORs and ANDs filter("tag: Tier1 | tag: Tier2", data) == True filter("tag: -Tier1 | tag: -Tier2", data) == True filter("tag: Tier1 | tag: TIPpass", data) == True filter("tag: Tier1 | category: Regression", data) == True filter("tag: Tier1 & tag: TIPpass", data) == True filter("tag: Tier1 & category: Sanity", data) == True filter("tag: Tier2 | tag: Tier3", data) == False filter("tag: Tier1 & tag: Tier2", data) == False filter("tag: Tier2 & tag: Tier3", data) == False filter("tag: Tier1 & category: Regression", data) == False filter("tag: Tier2 | category: Regression", data) == False # Syntactic sugar filter("tag: Tier1, Tier2", data) == True filter("tag: Tier1, TIPpass", data) == True filter("tag: Tier1; TIPpass", data) == True filter("tag: -Tier2", data) == True filter("tag: -Tier1, -Tier2", data) == True filter("tag: -Tier1, -Tier2", data) == True filter("tag: -Tier1; -Tier2", data) == False filter("tag: Tier2, Tier3", data) == False filter("tag: Tier1; Tier2", data) == False filter("tag: Tier2; Tier3", data) == False filter("tag: Tier1; -TIPpass", data) == False # Regular expressions filter("tag: Tier.*", data, regexp=True) == True filter("tag: Tier[123]", data, regexp=True) == True filter("tag: NoTier.*", data, regexp=True) == False filter("tag: -Tier.*", data, regexp=True) == False # Case insensitive filter("tag: tier1", data, sensitive=False) == True filter("tag: tippass", data, sensitive=False) == True # Unicode support filter("tag: -ťip", data) == True filter("tag: ťip", data) == False filter("tag: ťip", {"tag": ["ťip"]}) == True filter("tag: -ťop", {"tag": ["ťip"]}) == True
def test_sugar(self): """ Syntactic sugar """ assert (filter("tag: Tier1, Tier2", self.data) == True) assert (filter("tag: Tier1, TIPpass", self.data) == True) assert (filter("tag: Tier1; TIPpass", self.data) == True) assert (filter("tag: -Tier2", self.data) == True) assert (filter("tag: -Tier1, -Tier2", self.data) == True) assert (filter("tag: -Tier1, -Tier2", self.data) == True) assert (filter("tag: -Tier1; -Tier2", self.data) == False) assert (filter("tag: Tier2, Tier3", self.data) == False) assert (filter("tag: Tier1; Tier2", self.data) == False) assert (filter("tag: Tier2; Tier3", self.data) == False) assert (filter("tag: Tier1; -TIPpass", self.data) == False)