Robot Framework Integrated Development Environment (RIDE)
keywordremover.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 robotide.lib.robot.errors import DataError
17 from robotide.lib.robot.model import SuiteVisitor, TagPattern
18 from robotide.lib.robot.utils import Matcher, plural_or_not
19 
20 
21 def KeywordRemover(how):
22  upper = how.upper()
23  if upper.startswith('NAME:'):
24  return ByNameKeywordRemover(pattern=how[5:])
25  if upper.startswith('TAG:'):
26  return ByTagKeywordRemover(pattern=how[4:])
27  try:
28  return {'ALL': AllKeywordsRemover,
29  'PASSED': PassedKeywordRemover,
30  'FOR': ForLoopItemsRemover,
31  'WUKS': WaitUntilKeywordSucceedsRemover}[upper]()
32  except KeyError:
33  raise DataError("Expected 'ALL', 'PASSED', 'NAME:<pattern>', 'TAG:<pattern>', "
34  "'FOR', or 'WUKS' but got '%s'." % how)
35 
36 
38 
41  _message = 'Keyword data removed using --RemoveKeywords option.'
42 
43  def __init__(self):
44  self._removal_message_removal_message = RemovalMessage(self._message_message)
45 
46  def _clear_content(self, kw):
47  kw.keywords = []
48  kw.messages = []
49  self._removal_message_removal_message.set(kw)
50 
51  def _failed_or_warning_or_error(self, item):
52  return not item.passed or self._warning_or_error_warning_or_error(item)
53 
54  def _warning_or_error(self, item):
55  finder = WarningAndErrorFinder()
56  item.visit(finder)
57  return finder.found
58 
59 
61 
62  def visit_keyword(self, keyword):
63  self._clear_content_clear_content(keyword)
64 
65 
67 
68  def start_suite(self, suite):
69  if not suite.statistics.all.failed:
70  for keyword in suite.keywords:
71  if not self._warning_or_error_warning_or_error(keyword):
72  self._clear_content_clear_content(keyword)
73 
74  def visit_test(self, test):
75  if not self._failed_or_warning_or_error_failed_or_warning_or_error(test):
76  for keyword in test.keywords:
77  self._clear_content_clear_content(keyword)
78 
79  def visit_keyword(self, keyword):
80  pass
81 
82 
83 class ByNameKeywordRemover(_KeywordRemover):
84 
85  def __init__(self, pattern):
86  _KeywordRemover.__init__(self)
87  self._matcher_matcher = Matcher(pattern, ignore='_')
88 
89  def start_keyword(self, kw):
90  if self._matcher_matcher.match(kw.name) and not self._warning_or_error_warning_or_error(kw):
91  self._clear_content_clear_content(kw)
92 
93 
95 
96  def __init__(self, pattern):
97  _KeywordRemover.__init__(self)
98  self._pattern_pattern = TagPattern(pattern)
99 
100  def start_keyword(self, kw):
101  if self._pattern_pattern.match(kw.tags) and not self._warning_or_error_warning_or_error(kw):
102  self._clear_content_clear_content(kw)
103 
104 
106 
109  _message = '%d passing step%s removed using --RemoveKeywords option.'
110 
111  def start_keyword(self, kw):
112  if kw.type == kw.FOR_LOOP_TYPE:
113  before = len(kw.keywords)
114  kw.keywords = self._remove_keywords_remove_keywords(kw.keywords)
115  self._removal_message_removal_message.set_if_removed(kw, before)
116 
117  def _remove_keywords(self, keywords):
118  return [kw for kw in keywords
119  if self._failed_or_warning_or_error_failed_or_warning_or_error(kw) or kw is keywords[-1]]
120 
121 
123 
126  _message = '%d failing step%s removed using --RemoveKeywords option.'
127 
128  def start_keyword(self, kw):
129  if kw.name == 'BuiltIn.Wait Until Keyword Succeeds' and kw.keywords:
130  before = len(kw.keywords)
131  kw.keywords = self._remove_keywords_remove_keywords(list(kw.keywords))
132  self._removal_message_removal_message.set_if_removed(kw, before)
133 
134  def _remove_keywords(self, keywords):
135  include_from_end = 2 if keywords[-1].passed else 1
136  return self._kws_with_warnings_kws_with_warnings(keywords[:-include_from_end]) \
137  + keywords[-include_from_end:]
138 
139  def _kws_with_warnings(self, keywords):
140  return [kw for kw in keywords if self._warning_or_error_warning_or_error(kw)]
141 
142 
144 
145  def __init__(self):
146  self.foundfound = False
147 
148  def start_suite(self, suite):
149  return not self.foundfound
150 
151  def start_test(self, test):
152  return not self.foundfound
153 
154  def start_keyword(self, keyword):
155  return not self.foundfound
156 
157  def visit_message(self, msg):
158  if msg.level in ('WARN', 'ERROR'):
159  self.foundfound = True
160 
161 
163 
164  def __init__(self, message):
165  self._message_message = message
166 
167  def set_if_removed(self, kw, len_before):
168  removed = len_before - len(kw.keywords)
169  if removed:
170  self.setset(kw, self._message_message % (removed, plural_or_not(removed)))
171 
172  def set(self, kw, message=None):
173  kw.doc = ('%s\n\n_%s_' % (kw.doc, message or self._message_message)).strip()
Used when variable does not exist.
Definition: errors.py:67
Interface to ease traversing through a test suite structure.
Definition: visitor.py:75
def visit_keyword(self, keyword)
Implements traversing through the keyword and its child keywords.
def start_keyword(self, kw)
Called when keyword starts.
def start_keyword(self, kw)
Called when keyword starts.
def start_keyword(self, kw)
Called when keyword starts.
def start_suite(self, suite)
Called when suite starts.
def visit_test(self, test)
Implements traversing through the test and its keywords.
def visit_keyword(self, keyword)
Implements traversing through the keyword and its child keywords.
def start_suite(self, suite)
Called when suite starts.
def start_keyword(self, keyword)
Called when keyword starts.
def visit_message(self, msg)
Implements visiting the message.
def TagPattern(pattern)
Definition: tags.py:100