Robot Framework Integrated Development Environment (RIDE)
dynamicmethods.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.utils import (get_error_message, is_java_method, is_bytes, is_unicode, is_tuple, py2to3)
18 
19 from .arguments import JavaArgumentParser, PythonArgumentParser
20 
21 
22 def no_dynamic_method(*args):
23  pass
24 
25 
26 @py2to3
28 
31  _underscore_name = NotImplemented
32 
33  def __init__(self, lib):
34  self.methodmethod = self._get_method_get_method(lib)
35 
36  def _get_method(self, lib):
37  for name in self._underscore_name_underscore_name, self._camelCaseName_camelCaseName_camelCaseName:
38  method = getattr(lib, name, None)
39  if callable(method):
40  return method
41  return no_dynamic_method
42 
43  @property
44  _camelCaseName = property
45 
46  def _camelCaseName(self):
47  tokens = self._underscore_name_underscore_name.split('_')
48  return ''.join([tokens[0]] + [t.capitalize() for t in tokens[1:]])
49 
50  @property
51  name = property
52 
53  def name(self):
54  return self.methodmethod.__name__
55 
56  def __call__(self, *args):
57  try:
58  return self._handle_return_value_handle_return_value(self.methodmethod(*args))
59  except:
60  raise DataError("Calling dynamic method '%s' failed: %s"
61  % (self.methodmethod.__name__, get_error_message()))
62 
63  def _handle_return_value(self, value):
64  raise NotImplementedError
65 
66  def _to_string(self, value):
67  if is_unicode(value):
68  return value
69  if is_bytes(value):
70  return value.decode('UTF-8')
71  if is_tuple(value):
72  return f"{value[0]}={value[1]}"
73  raise DataError('Return value must be string.')
74 
75  def _to_list_of_strings(self, value):
76  try:
77  return [self._to_string_to_string(v) for v in value]
78  except (TypeError, DataError):
79  raise DataError('Return value must be list of strings.')
80 
81  def __nonzero__(self):
82  return self.methodmethod is not no_dynamic_method
83 
84 
86 
89  _underscore_name = 'get_keyword_names'
90 
91  def _handle_return_value(self, value):
92  names = self._to_list_of_strings_to_list_of_strings(value or [])
93  return list(self._remove_duplicates_remove_duplicates(names))
94 
95  def _remove_duplicates(self, names):
96  seen = set()
97  for name in names:
98  if name not in seen:
99  seen.add(name)
100  yield name
101 
102 
104 
107  _underscore_name = 'run_keyword'
108 
109  @property
110  supports_kwargs = property
111 
112  def supports_kwargs(self):
113  if is_java_method(self.methodmethod):
114  return self._supports_java_kwargs_supports_java_kwargs(self.methodmethod)
115  return self._supports_python_kwargs_supports_python_kwargs(self.methodmethod)
116 
117  def _supports_python_kwargs(self, method):
118  spec = PythonArgumentParser().parse(method)
119  return len(spec.positional) == 3
120 
121  def _supports_java_kwargs(self, method):
122  func = self.methodmethod.im_func if hasattr(method, 'im_func') else method
123  signatures = func.argslist[:func.nargs]
124  spec = JavaArgumentParser().parse(signatures)
125  return (self._java_single_signature_kwargs_java_single_signature_kwargs(spec) or
126  self._java_multi_signature_kwargs_java_multi_signature_kwargs(spec))
127 
129  return len(spec.positional) == 1 and spec.varargs and spec.kwargs
130 
132  return len(spec.positional) == 3 and not (spec.varargs or spec.kwargs)
133 
134 
136 
139  _underscore_name = 'get_keyword_documentation'
140 
141  def _handle_return_value(self, value):
142  return self._to_string_to_string(value or '')
143 
144 
146 
149  _underscore_name = 'get_keyword_arguments'
150 
151  def __init__(self, lib):
152  _DynamicMethod.__init__(self, lib)
153  self._supports_kwargs_supports_kwargs = RunKeyword(lib).supports_kwargs
154 
155  def _handle_return_value(self, value):
156  if value is None:
157  if self._supports_kwargs_supports_kwargs:
158  return ['*varargs', '**kwargs']
159  return ['*varargs']
160  return self._to_list_of_strings_to_list_of_strings(value)
161 
162 
164 
167  _underscore_name = 'get_keyword_types'
168 
169  def _handle_return_value(self, value):
170  return value
171 
172 
174 
177  _underscore_name = 'get_keyword_tags'
178 
179  def _handle_return_value(self, value):
180  return self._to_list_of_strings_to_list_of_strings(value or [])
Used when variable does not exist.
Definition: errors.py:67
def get_error_message()
Returns error message of the last occurred exception.
Definition: error.py:41