Robot Framework
tags.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 from robot.utils import is_string, normalize, NormalizedDict, Matcher
17 
18 
19 class Tags:
20  __slots__ = ['_tags', '_reserved']
21 
22  def __init__(self, tags=None):
23  self._tags, self._reserved_reserved = self._init_tags_init_tags(tags)
24 
25 
29  def robot(self, name):
30  return name in self._reserved_reserved
31 
32  def _init_tags(self, tags):
33  if not tags:
34  return (), ()
35  if is_string(tags):
36  tags = (tags,)
37  return self._normalize_normalize(tags)
38 
39  def _normalize(self, tags):
40  normalized = NormalizedDict([(str(t), None) for t in tags], ignore='_')
41  if '' in normalized:
42  del normalized['']
43  if 'NONE' in normalized:
44  del normalized['NONE']
45  reserved = tuple(tag.split(':')[1] for tag in normalized._keys
46  if tag[:6] == 'robot:')
47  return tuple(normalized), reserved
48 
49  def add(self, tags):
50  self.__init____init__(tuple(self) + tuple(Tags(tags)))
51 
52  def remove(self, tags):
53  tags = TagPatterns(tags)
54  self.__init____init__([t for t in self if not tags.match(t)])
55 
56  def match(self, tags):
57  return TagPatterns(tags).match(self)
58 
59  def __contains__(self, tags):
60  return self.matchmatch(tags)
61 
62  def __len__(self):
63  return len(self._tags)
64 
65  def __iter__(self):
66  return iter(self._tags)
67 
68  def __str__(self):
69  return '[%s]' % ', '.join(self)
70 
71  def __repr__(self):
72  return repr(list(self))
73 
74  def __eq__(self, other):
75  if not isinstance(other, Tags):
76  other = Tags(other)
77  self_normalized = [normalize(tag, ignore='_') for tag in self]
78  other_normalized = [normalize(tag, ignore='_') for tag in other]
79  return sorted(self_normalized) == sorted(other_normalized)
80 
81  def __getitem__(self, index):
82  item = self._tags[index]
83  return item if not isinstance(index, slice) else Tags(item)
84 
85  def __add__(self, other):
86  return Tags(tuple(self) + tuple(Tags(other)))
87 
88 
90 
91  def __init__(self, patterns):
92  self._patterns_patterns = tuple(TagPattern(p) for p in Tags(patterns))
93 
94  def match(self, tags):
95  if not self._patterns_patterns:
96  return False
97  tags = tags if isinstance(tags, Tags) else Tags(tags)
98  return any(p.match(tags) for p in self._patterns_patterns)
99 
100  def __contains__(self, tag):
101  return self.matchmatch(tag)
102 
103  def __len__(self):
104  return len(self._patterns_patterns)
105 
106  def __iter__(self):
107  return iter(self._patterns_patterns)
108 
109  def __getitem__(self, index):
110  return self._patterns_patterns[index]
111 
112  def __str__(self):
113  return '[%s]' % ', '.join(str(pattern) for pattern in self)
114 
115 
116 def TagPattern(pattern):
117  pattern = pattern.replace(' ', '')
118  if 'NOT' in pattern:
119  return NotTagPattern(*pattern.split('NOT'))
120  if 'OR' in pattern:
121  return OrTagPattern(pattern.split('OR'))
122  if 'AND' in pattern or '&' in pattern:
123  return AndTagPattern(pattern.replace('&', 'AND').split('AND'))
124  return SingleTagPattern(pattern)
125 
126 
128 
129  def __init__(self, pattern):
130  self._matcher_matcher = Matcher(pattern, ignore='_')
131 
132  def match(self, tags):
133  return self._matcher_matcher.match_any(tags)
134 
135  def __iter__(self):
136  yield self
137 
138  def __str__(self):
139  return self._matcher_matcher.pattern
140 
141  def __bool__(self):
142  return bool(self._matcher_matcher)
143 
144 
146 
147  def __init__(self, patterns):
148  self._patterns_patterns = tuple(TagPattern(p) for p in patterns)
149 
150  def match(self, tags):
151  return all(p.match(tags) for p in self._patterns_patterns)
152 
153  def __iter__(self):
154  return iter(self._patterns_patterns)
155 
156  def __str__(self):
157  return ' AND '.join(str(pattern) for pattern in self)
158 
159 
161 
162  def __init__(self, patterns):
163  self._patterns_patterns = tuple(TagPattern(p) for p in patterns)
164 
165  def match(self, tags):
166  return any(p.match(tags) for p in self._patterns_patterns)
167 
168  def __iter__(self):
169  return iter(self._patterns_patterns)
170 
171  def __str__(self):
172  return ' OR '.join(str(pattern) for pattern in self)
173 
174 
176 
177  def __init__(self, must_match, *must_not_match):
178  self._first_first = TagPattern(must_match)
179  self._rest_rest = OrTagPattern(must_not_match)
180 
181  def match(self, tags):
182  if not self._first_first:
183  return not self._rest_rest.match(tags)
184  return self._first_first.match(tags) and not self._rest_rest.match(tags)
185 
186  def __iter__(self):
187  yield self._first_first
188  for pattern in self._rest_rest:
189  yield pattern
190 
191  def __str__(self):
192  return ' NOT '.join(str(pattern) for pattern in self).lstrip()
def match(self, tags)
Definition: tags.py:150
def __init__(self, patterns)
Definition: tags.py:147
def __init__(self, must_match, *must_not_match)
Definition: tags.py:177
def match(self, tags)
Definition: tags.py:181
def match(self, tags)
Definition: tags.py:165
def __init__(self, patterns)
Definition: tags.py:162
def __init__(self, pattern)
Definition: tags.py:129
def match(self, tags)
Definition: tags.py:94
def __contains__(self, tag)
Definition: tags.py:100
def __getitem__(self, index)
Definition: tags.py:109
def __init__(self, patterns)
Definition: tags.py:91
def _init_tags(self, tags)
Definition: tags.py:32
def __str__(self)
Definition: tags.py:68
def __add__(self, other)
Definition: tags.py:85
def add(self, tags)
Definition: tags.py:49
def __len__(self)
Definition: tags.py:62
def __iter__(self)
Definition: tags.py:65
def __getitem__(self, index)
Definition: tags.py:81
def robot(self, name)
Check do tags contain a special tag in format robot:<name>.
Definition: tags.py:29
def __eq__(self, other)
Definition: tags.py:74
def remove(self, tags)
Definition: tags.py:52
def __repr__(self)
Definition: tags.py:71
def __contains__(self, tags)
Definition: tags.py:59
def _normalize(self, tags)
Definition: tags.py:39
def __init__(self, tags=None)
Definition: tags.py:22
def match(self, tags)
Definition: tags.py:56
def TagPattern(pattern)
Definition: tags.py:116
def normalize(string, ignore=(), caseless=True, spaceless=True)
Normalizes given string according to given spec.
Definition: normalizing.py:27