Index: tools/telemetry/telemetry/user_story/user_story_filter.py |
diff --git a/tools/telemetry/telemetry/user_story/user_story_filter.py b/tools/telemetry/telemetry/user_story/user_story_filter.py |
index 1c28beb7b5ea9b7970ecef93289f4e7459b5d4ab..fce696b6f08cea13ff22823763e50fcbfb00d1d7 100644 |
--- a/tools/telemetry/telemetry/user_story/user_story_filter.py |
+++ b/tools/telemetry/telemetry/user_story/user_story_filter.py |
@@ -8,73 +8,76 @@ import re |
from telemetry.core import command_line |
-def HasLabelIn(user_story, labels): |
- return bool(user_story.labels.intersection(labels)) |
+class _StoryMatcher(object): |
+ def __init__(self, pattern): |
+ self._regex = None |
+ self.has_compile_error = False |
+ if pattern: |
+ try: |
+ self._regex = re.compile(pattern) |
+ except re.error: |
+ self.has_compile_error = True |
+ |
+ def __nonzero__(self): |
+ return self._regex is not None |
+ |
+ def HasMatch(self, user_story): |
+ return self and bool( |
+ self._regex.search(user_story.display_name) or |
+ (user_story.name and self._regex.search(user_story.name))) |
+ |
+ |
+class _StoryLabelMatcher(object): |
+ def __init__(self, labels_str): |
+ self._labels = labels_str.split(',') if labels_str else None |
+ |
+ def __nonzero__(self): |
+ return self._labels is not None |
+ |
+ def HasLabelIn(self, user_story): |
+ return self and bool(user_story.labels.intersection(self._labels)) |
class UserStoryFilter(command_line.ArgumentHandlerMixIn): |
- """Filters pages in the page set based on command-line flags.""" |
+ """Filters user stories in the user story set based on command-line flags.""" |
@classmethod |
def AddCommandLineArgs(cls, parser): |
- group = optparse.OptionGroup(parser, 'Page filtering options') |
- group.add_option('--page-filter', |
- help='Use only pages whose URLs match the given filter regexp.') |
- group.add_option('--page-filter-exclude', |
- help='Exclude pages whose URLs match the given filter regexp.') |
- group.add_option('--page-label-filter', |
- help='Use only pages that have any of these labels') |
- group.add_option('--page-label-filter-exclude', |
- help='Exclude pages that have any of these labels') |
- |
+ group = optparse.OptionGroup(parser, 'User story filtering options') |
+ group.add_option('--story-filter', |
+ help='Use only user stories whose names match the given filter regexp.') |
+ group.add_option('--page-filter', dest='story_filter', |
+ help='Deprecated. Use --story-filter instead.') |
+ group.add_option('--story-filter-exclude', |
+ help='Exclude user stories whose names match the given filter regexp.') |
+ group.add_option('--story-label-filter', |
+ help='Use only user stories that have any of these labels') |
+ group.add_option('--story-label-filter-exclude', |
+ help='Exclude user stories that have any of these labels') |
parser.add_option_group(group) |
@classmethod |
def ProcessCommandLineArgs(cls, parser, args): |
- cls._page_regex = None |
- cls._page_exclude_regex = None |
- cls._include_labels = None |
- cls._exclude_labels = None |
- |
- if args.page_filter: |
- try: |
- cls._page_regex = re.compile(args.page_filter) |
- except re.error: |
- raise parser.error('--page-filter: invalid regex') |
- |
- if args.page_filter_exclude: |
- try: |
- cls._page_exclude_regex = re.compile(args.page_filter_exclude) |
- except re.error: |
- raise parser.error('--page-filter-exclude: invalid regex') |
+ cls._include_regex = _StoryMatcher(args.story_filter) |
+ cls._exclude_regex = _StoryMatcher(args.story_filter_exclude) |
+ cls._include_labels = _StoryLabelMatcher(args.story_label_filter) |
+ cls._exclude_labels = _StoryLabelMatcher(args.story_label_filter_exclude) |
- if args.page_label_filter: |
- cls._include_labels = args.page_label_filter.split(',') |
- |
- if args.page_label_filter_exclude: |
- cls._exclude_labels = args.page_label_filter_exclude.split(',') |
+ if cls._include_regex.has_compile_error: |
+ raise parser.error('--story-filter: Invalid regex.') |
+ if cls._exclude_regex.has_compile_error: |
+ raise parser.error('--story-filter-exclude: Invalid regex.') |
@classmethod |
def IsSelected(cls, user_story): |
# Exclude filters take priority. |
- if cls._exclude_labels and HasLabelIn(user_story, cls._exclude_labels): |
+ if cls._exclude_labels.HasLabelIn(user_story): |
+ return False |
+ if cls._exclude_regex.HasMatch(user_story): |
+ return False |
+ |
+ if cls._include_labels and not cls._include_labels.HasLabelIn(user_story): |
+ return False |
+ if cls._include_regex and not cls._include_regex.HasMatch(user_story): |
return False |
- if cls._page_exclude_regex: |
- matches_display_name = cls._page_exclude_regex.search( |
- user_story.display_name) |
- matches_name = user_story.name and cls._page_exclude_regex.search( |
- user_story.name) |
- if matches_display_name or matches_name: |
- return False |
- |
- # Apply all filters. |
- filter_result = True |
- if cls._include_labels: |
- filter_result = filter_result and HasLabelIn( |
- user_story, cls._include_labels) |
- if cls._page_regex: |
- matches_display_name = cls._page_regex.search(user_story.display_name) |
- matches_name = user_story.name and cls._page_regex.search(user_story.name) |
- filter_result = filter_result and (matches_display_name or matches_name) |
- |
- return filter_result |
+ return True |