Robot Framework Integrated Development Environment (RIDE)
handlerstore.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 operator import attrgetter
17 
18 from robotide.lib.robot.errors import DataError, KeywordError
19 from robotide.lib.robot.utils import NormalizedDict
20 
21 from .usererrorhandler import UserErrorHandler
22 
23 
24 class HandlerStore():
25  TEST_LIBRARY_TYPE = 'Test library'
26  TEST_CASE_FILE_TYPE = 'Test case file'
27  RESOURCE_FILE_TYPE = 'Resource file'
28 
29  def __init__(self, source, source_type):
30  self.sourcesource = source
31  self.source_typesource_type = source_type
32  self._normal_normal = NormalizedDict(ignore='_')
33  self._embedded_embedded = []
34 
35  def add(self, handler, embedded=False):
36  if embedded:
37  self._embedded_embedded.append(handler)
38  elif handler.name not in self._normal_normal:
39  self._normal_normal[handler.name] = handler
40  else:
41  error = DataError('Keyword with same name defined multiple times.')
42  self._normal_normal[handler.name] = UserErrorHandler(error, handler.name,
43  handler.libname)
44  raise error
45 
46  def __iter__(self):
47  handlers = list(self._normal_normal.values()) + self._embedded_embedded
48  return iter(sorted(handlers, key=attrgetter('name')))
49 
50  def __len__(self):
51  return len(self._normal_normal) + len(self._embedded_embedded)
52 
53  def __contains__(self, name):
54  if name in self._normal_normal:
55  return True
56  return any(template.matches(name) for template in self._embedded_embedded)
57 
58  def create_runner(self, name):
59  return self[name].create_runner(name)
60 
61  def __getitem__(self, name):
62  try:
63  return self._normal_normal[name]
64  except KeyError:
65  return self._find_embedded_find_embedded(name)
66 
67  def _find_embedded(self, name):
68  embedded = [template for template in self._embedded_embedded
69  if template.matches(name)]
70  if len(embedded) == 1:
71  return embedded[0]
72  self._raise_no_single_match_raise_no_single_match(name, embedded)
73 
74  def _raise_no_single_match(self, name, found):
75  if self.source_typesource_type == self.TEST_CASE_FILE_TYPETEST_CASE_FILE_TYPE:
76  source = self.source_typesource_type
77  else:
78  source = "%s '%s'" % (self.source_typesource_type, self.sourcesource)
79  if not found:
80  raise KeywordError("%s contains no keywords matching name '%s'."
81  % (source, name))
82  error = ["%s contains multiple keywords matching name '%s':"
83  % (source, name)]
84  names = sorted(handler.name for handler in found)
85  raise KeywordError('\n '.join(error + names))
Used when variable does not exist.
Definition: errors.py:67
Used when a test or keyword timeout occurs.
Definition: errors.py:83
def add(self, handler, embedded=False)
Definition: handlerstore.py:35
Created if creating handlers fail – running raises DataError.