| 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
|
|
|