1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
8 from telemetry.core import command_line
11 def HasLabelIn(page, labels):
12 return bool(page.labels.intersection(labels))
15 class PageFilter(command_line.ArgumentHandlerMixIn):
16 """Filters pages in the page set based on command-line flags."""
19 def AddCommandLineArgs(cls, parser):
20 group = optparse.OptionGroup(parser, 'Page filtering options')
21 group.add_option('--page-filter',
22 help='Use only pages whose URLs match the given filter regexp.')
23 group.add_option('--page-filter-exclude',
24 help='Exclude pages whose URLs match the given filter regexp.')
25 group.add_option('--page-label-filter',
26 help='Use only pages that have any of these labels')
27 group.add_option('--page-label-filter-exclude',
28 help='Exclude pages that have any of these labels')
30 parser.add_option_group(group)
33 def ProcessCommandLineArgs(cls, parser, args):
34 cls._page_regex = None
35 cls._page_exclude_regex = None
36 cls._include_labels = None
37 cls._exclude_labels = None
41 cls._page_regex = re.compile(args.page_filter)
43 raise parser.error('--page-filter: invalid regex')
45 if args.page_filter_exclude:
47 cls._page_exclude_regex = re.compile(args.page_filter_exclude)
49 raise parser.error('--page-filter-exclude: invalid regex')
51 if args.page_label_filter:
52 cls._include_labels = args.page_label_filter.split(',')
54 if args.page_label_filter_exclude:
55 cls._exclude_labels = args.page_label_filter_exclude.split(',')
58 def IsSelected(cls, page):
59 # Exclude filters take priority.
60 if cls._exclude_labels and HasLabelIn(page, cls._exclude_labels):
62 if cls._page_exclude_regex:
63 matches_url = cls._page_exclude_regex.search(page.url)
64 matches_name = page.name and cls._page_exclude_regex.search(page.name)
65 if matches_url or matches_name:
70 if cls._include_labels:
71 filter_result = filter_result and HasLabelIn(page, cls._include_labels)
73 matches_url = cls._page_regex.search(page.url)
74 matches_name = page.name and cls._page_regex.search(page.name)
75 filter_result = filter_result and (matches_url or matches_name)