diff --git a/pastepwn/analyzers/basicanalyzer.py b/pastepwn/analyzers/basicanalyzer.py index b6c3d53f..d5ddcf79 100644 --- a/pastepwn/analyzers/basicanalyzer.py +++ b/pastepwn/analyzers/basicanalyzer.py @@ -34,13 +34,24 @@ def add_action(self, action): self._check_action(action) self.actions.append(action) - def match(self, paste): + def match(self, paste, unique_matches=False): """ Checks if a certain paste is matched by the conditions set for this analyzer :param paste: A :class:`pastepwn.core.paste` object which should be matched + :param unique_matches: A boolean that specifies if matches should be unique. + defaults to False :return: :obj:`bool` if the paste has been matched """ raise NotImplementedError("Your analyzer must implement the match method!") + + @staticmethod + def unique(matches): + """ + Takes a list of matches and returns a list with no duplicates. + :param matches: A list of matches + :return: A filtered list of matches retaining order + """ + return sorted(set(matches), key=matches.index) def _check_action(self, action): """Check if a passed action is a subclass of BasicAction""" diff --git a/pastepwn/analyzers/tests/basicanalyzer_test.py b/pastepwn/analyzers/tests/basicanalyzer_test.py index 4981e8dc..f33141d3 100644 --- a/pastepwn/analyzers/tests/basicanalyzer_test.py +++ b/pastepwn/analyzers/tests/basicanalyzer_test.py @@ -99,6 +99,27 @@ def test_error_logging_init_class(self): self.assertEqual(log.output, ["ERROR:pastepwn.analyzers.basicanalyzer:You passed a class as action for 'BasicAnalyzer' but an instance of an action was expected!"]) + def test_unique(self): + """Check if running unique() on a list of matches returns a list with + no duplicates""" + # Some lists with and without duplicates + test_lists = [ + [], + ["a", "a"], + ["a", "b"], + ["a", "b", "a"] + ] + self.assertEqual(BasicAnalyzer.unique(test_lists[0]), [], + msg="BasicAnalyzer.unique() left a duplicate!") + self.assertEqual(BasicAnalyzer.unique(test_lists[1]), ["a"], + msg="BasicAnalyzer.unique() left a duplicate!") + # Should preserve order + self.assertEqual(BasicAnalyzer.unique(test_lists[2]), ["a", "b"], + msg="BasicAnalyzer.unique() left a duplicate!") + self.assertEqual(BasicAnalyzer.unique(test_lists[3]), ["a", "b"], + msg="BasicAnalyzer.unique() left a duplicate!") + + if __name__ == '__main__': unittest.main()