Robot Framework Integrated Development Environment (RIDE)
handlers.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 copy import copy
17 
18 from robotide.lib.robot.utils import (getdoc, getshortdoc, is_java_init, is_java_method,
19  is_list_like, printable_name, split_tags_from_doc,
20  type_name)
21 from robotide.lib.robot.errors import DataError
22 from robotide.lib.robot.model import Tags
23 
24 from .arguments import (ArgumentSpec, DynamicArgumentParser,
25  JavaArgumentCoercer, JavaArgumentParser,
26  PythonArgumentParser)
27 from .dynamicmethods import GetKeywordTypes
28 from .librarykeywordrunner import (EmbeddedArgumentsRunner,
29  LibraryKeywordRunner, RunKeywordRunner)
30 from .runkwregister import RUN_KW_REGISTER
31 
32 
33 def Handler(library, name, method):
34  if RUN_KW_REGISTER.is_run_keyword(library.orig_name, name):
35  return _RunKeywordHandler(library, name, method)
36  if is_java_method(method):
37  return _JavaHandler(library, name, method)
38  else:
39  return _PythonHandler(library, name, method)
40 
41 
42 def DynamicHandler(library, name, method, doc, argspec, tags=None):
43  if RUN_KW_REGISTER.is_run_keyword(library.orig_name, name):
44  return _DynamicRunKeywordHandler(library, name, method, doc, argspec, tags)
45  return _DynamicHandler(library, name, method, doc, argspec, tags)
46 
47 
48 def InitHandler(library, method, docgetter=None):
49  Init = _PythonInitHandler if not is_java_init(method) else _JavaInitHandler
50  return Init(library, '__init__', method, docgetter)
51 
52 
54 
55  def __init__(self, library, handler_name, handler_method, doc='', tags=None):
56  self.librarylibrary = library
57  self._handler_name_handler_name = handler_name
58  self.namename = self._get_name_get_name(handler_name, handler_method)
59  self.argumentsarguments = self._parse_arguments_parse_arguments(handler_method)
60  self._method_method = self._get_initial_handler_get_initial_handler(library, handler_name,
61  handler_method)
62  doc, tags_from_doc = split_tags_from_doc(doc or '')
63  tags_from_attr = self._get_tags_from_attribute_get_tags_from_attribute(handler_method)
64  self._doc_doc = doc
65  self.tagstags = Tags(tuple(tags_from_doc) +
66  tuple(tags_from_attr) +
67  tuple(tags or ()))
68 
69  def _get_name(self, handler_name, handler_method):
70  robot_name = getattr(handler_method, 'robot_name', None)
71  name = robot_name or printable_name(handler_name, code_style=True)
72  if not name:
73  raise DataError('Keyword name cannot be empty.')
74  return name
75 
76  def _parse_arguments(self, handler_method):
77  raise NotImplementedError
78 
79  def _get_tags_from_attribute(self, handler_method):
80  tags = getattr(handler_method, 'robot_tags', ())
81  if not is_list_like(tags):
82  raise DataError("Expected tags to be list-like, got %s."
83  % type_name(tags))
84  return tags
85 
86  def _get_initial_handler(self, library, name, method):
87  if library.scope.is_global:
88  return self._get_global_handler_get_global_handler(method, name)
89  return None
90 
91  def resolve_arguments(self, args, variables=None):
92  return self.argumentsarguments.resolve(args, variables)
93 
94  @property
95  doc = property
96 
97  def doc(self):
98  return self._doc_doc
99 
100  @property
101  longname = property
102 
103  def longname(self):
104  return '%s.%s' % (self.librarylibrary.name, self.namename)
105 
106  @property
107  shortdoc = property
108 
109  def shortdoc(self):
110  return getshortdoc(self.docdocdoc)
111 
112  @property
113  libname = property
114 
115  def libname(self):
116  return self.librarylibrary.name
117 
118  def create_runner(self, name):
119  return LibraryKeywordRunner(self)
120 
121  def current_handler(self):
122  if self._method_method:
123  return self._method_method
124  return self._get_handler_get_handler(self.librarylibrary.get_instance(), self._handler_name_handler_name)
125 
126  def _get_global_handler(self, method, name):
127  return method
128 
129  def _get_handler(self, lib_instance, handler_name):
130  return getattr(lib_instance, handler_name)
131 
132 
134 
135  def __init__(self, library, handler_name, handler_method):
136  _RunnableHandler.__init__(self, library, handler_name, handler_method,
137  getdoc(handler_method))
138 
139  def _parse_arguments(self, handler_method):
140  return PythonArgumentParser().parse(handler_method, self.longnamelongnamelongname)
141 
142 
144 
145  def __init__(self, library, handler_name, handler_method):
146  _RunnableHandler.__init__(self, library, handler_name, handler_method)
147  signatures = self._get_signatures_get_signatures(handler_method)
148  self._arg_coercer_arg_coercer = JavaArgumentCoercer(signatures, self.argumentsarguments)
149 
150  def _parse_arguments(self, handler_method):
151  signatures = self._get_signatures_get_signatures(handler_method)
152  return JavaArgumentParser().parse(signatures, self.longnamelongnamelongname)
153 
154  def _get_signatures(self, handler):
155  code_object = getattr(handler, 'im_func', handler)
156  return code_object.argslist[:code_object.nargs]
157 
158  def resolve_arguments(self, args, variables=None):
159  positional, named = self.argumentsarguments.resolve(args, variables,
160  dict_to_kwargs=True)
161  arguments = self._arg_coercer_arg_coercer.coerce(positional, named,
162  dryrun=not variables)
163  return arguments, []
164 
165 
167 
168  def __init__(self, library, handler_name, dynamic_method, doc='',
169  argspec=None, tags=None):
170  self._argspec_argspec = argspec
171  self._run_keyword_method_name_run_keyword_method_name = dynamic_method.name
172  self._supports_kwargs_supports_kwargs = dynamic_method.supports_kwargs
173  _RunnableHandler.__init__(self, library, handler_name,
174  dynamic_method.method, doc, tags)
175 
176  def _parse_arguments(self, handler_method):
177  spec = DynamicArgumentParser().parse(self._argspec_argspec, self.longnamelongnamelongname)
178  if not self._supports_kwargs_supports_kwargs:
179  if spec.kwargs:
180  raise DataError("Too few '%s' method parameters for **kwargs "
181  "support." % self._run_keyword_method_name_run_keyword_method_name)
182  if spec.kwonlyargs:
183  raise DataError("Too few '%s' method parameters for "
184  "keyword-only arguments support."
185  % self._run_keyword_method_name_run_keyword_method_name)
186  spec.types = GetKeywordTypes(self.librarylibrary.get_instance())(self._handler_name_handler_name)
187  return spec
188 
189  def resolve_arguments(self, arguments, variables=None):
190  positional, named = self.argumentsarguments.resolve(arguments, variables)
191  if not self._supports_kwargs_supports_kwargs:
192  positional, named = self.argumentsarguments.map(positional, named)
193  return positional, named
194 
195  def _get_handler(self, lib_instance, handler_name):
196  runner = getattr(lib_instance, self._run_keyword_method_name_run_keyword_method_name)
197  return self._get_dynamic_handler_get_dynamic_handler(runner, handler_name)
198 
199  def _get_global_handler(self, method, name):
200  return self._get_dynamic_handler_get_dynamic_handler(method, name)
201 
202  def _get_dynamic_handler(self, runner, name):
203  def handler(*positional, **kwargs):
204  if self._supports_kwargs_supports_kwargs:
205  return runner(name, positional, kwargs)
206  else:
207  return runner(name, positional)
208  return handler
209 
210 
212 
213  def create_runner(self, name):
214  default_dry_run_keywords = ('name' in self.argumentsarguments.positional and
215  self._args_to_process_args_to_process_args_to_process)
216  return RunKeywordRunner(self, default_dry_run_keywords)
217 
218  @property
219  _args_to_process = property
220 
221  def _args_to_process(self):
222  return RUN_KW_REGISTER.get_args_to_process(self.librarylibrary.orig_name,
223  self.namename)
224 
225  def resolve_arguments(self, args, variables=None):
226  args_to_process = self._args_to_process_args_to_process_args_to_process
227  return self.argumentsarguments.resolve(args, variables, resolve_named=False,
228  resolve_variables_until=args_to_process)
229 
230 
232 
235  _parse_arguments = _RunKeywordHandler._parse_arguments
236  resolve_arguments = _RunKeywordHandler.resolve_arguments
237 
238 
240 
241  def __init__(self, library, handler_name, handler_method, docgetter):
242  _PythonHandler.__init__(self, library, handler_name, handler_method)
243  self._docgetter_docgetter = docgetter
244 
245  @property
246  doc = property
247 
248  def doc(self):
249  if self._docgetter_docgetter:
250  self._doc_doc_doc = self._docgetter_docgetter() or self._doc_doc_doc
251  self._docgetter_docgetter = None
252  return self._doc_doc_doc
253 
254  def _parse_arguments(self, handler_method):
255  parser = PythonArgumentParser(type='Test Library')
256  return parser.parse(handler_method, self.librarylibrary.name)
257 
258 
260 
261  def __init__(self, library, handler_name, handler_method, docgetter):
262  _JavaHandler.__init__(self, library, handler_name, handler_method)
263  self._docgetter_docgetter = docgetter
264 
265  @property
266  doc = property
267 
268  def doc(self):
269  if self._docgetter_docgetter:
270  self._doc_doc_doc = self._docgetter_docgetter() or self._doc_doc_doc
271  self._docgetter_docgetter = None
272  return self._doc_doc_doc
273 
274  def _parse_arguments(self, handler_method):
275  parser = JavaArgumentParser(type='Test Library')
276  signatures = self._get_signatures_get_signatures(handler_method)
277  return parser.parse(signatures, self.librarylibrary.name)
278 
279 
281 
282  def __init__(self, name_regexp, orig_handler):
283  self.argumentsarguments = ArgumentSpec() # Show empty argument spec for Libdoc
284  self.name_regexpname_regexp = name_regexp
285  self._orig_handler_orig_handler = orig_handler
286 
287  def __getattr__(self, item):
288  return getattr(self._orig_handler_orig_handler, item)
289 
290  @property
291  library = property
292 
293  def library(self):
294  return self._orig_handler_orig_handler.library
295 
296  @library.setter
297 
298  def library(self, library):
299  self._orig_handler_orig_handler.library = library
300 
301  def matches(self, name):
302  return self.name_regexpname_regexp.match(name) is not None
303 
304  def create_runner(self, name):
305  return EmbeddedArgumentsRunner(self, name)
306 
307  def __copy__(self):
308  orig_handler = copy(self._orig_handler_orig_handler)
309  return EmbeddedArgumentsHandler(self.name_regexpname_regexp, orig_handler)
Used when variable does not exist.
Definition: errors.py:67
def __init__(self, name_regexp, orig_handler)
Definition: handlers.py:282
def _get_handler(self, lib_instance, handler_name)
Definition: handlers.py:195
def resolve_arguments(self, arguments, variables=None)
Definition: handlers.py:189
def __init__(self, library, handler_name, dynamic_method, doc='', argspec=None, tags=None)
Definition: handlers.py:169
def _parse_arguments(self, handler_method)
Definition: handlers.py:150
def __init__(self, library, handler_name, handler_method)
Definition: handlers.py:145
def resolve_arguments(self, args, variables=None)
Definition: handlers.py:158
def __init__(self, library, handler_name, handler_method, docgetter)
Definition: handlers.py:261
def __init__(self, library, handler_name, handler_method)
Definition: handlers.py:135
def __init__(self, library, handler_name, handler_method, docgetter)
Definition: handlers.py:241
def resolve_arguments(self, args, variables=None)
Definition: handlers.py:225
def _get_name(self, handler_name, handler_method)
Definition: handlers.py:69
def _get_initial_handler(self, library, name, method)
Definition: handlers.py:86
def _get_tags_from_attribute(self, handler_method)
Definition: handlers.py:79
def _get_handler(self, lib_instance, handler_name)
Definition: handlers.py:129
def __init__(self, library, handler_name, handler_method, doc='', tags=None)
Definition: handlers.py:55
def resolve_arguments(self, args, variables=None)
Definition: handlers.py:91
def Handler(library, name, method)
Definition: handlers.py:33
def InitHandler(library, method, docgetter=None)
Definition: handlers.py:48
def DynamicHandler(library, name, method, doc, argspec, tags=None)
Definition: handlers.py:42
def printable_name(string, code_style=False)
Generates and returns printable name from the given string.
Definition: misc.py:76
def getshortdoc(doc_or_item, linesep='\n')
Definition: text.py:181
def split_tags_from_doc(doc)
Definition: text.py:158