Robot Framework
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 robot.errors import DataError
17 from robot.utils import get_error_message, is_bytes, is_list_like, is_string, type_name
18 
19 from .arguments import PythonArgumentParser
20 
21 
22 def no_dynamic_method(*args):
23  return None
24 
25 
27 
30  _underscore_name = NotImplemented
31 
32  def __init__(self, lib):
33  self.methodmethod = self._get_method_get_method(lib)
34 
35  def _get_method(self, lib):
36  for name in self._underscore_name_underscore_name, self._camelCaseName_camelCaseName_camelCaseName:
37  method = getattr(lib, name, None)
38  if callable(method):
39  return method
40  return no_dynamic_method
41 
42  @property
43  _camelCaseName = property
44 
45  def _camelCaseName(self):
46  tokens = self._underscore_name_underscore_name.split('_')
47  return ''.join([tokens[0]] + [t.capitalize() for t in tokens[1:]])
48 
49  @property
50  name = property
51 
52  def name(self):
53  return self.methodmethod.__name__
54 
55  def __call__(self, *args):
56  try:
57  return self._handle_return_value_handle_return_value(self.methodmethod(*args))
58  except:
59  raise DataError("Calling dynamic method '%s' failed: %s"
60  % (self.namenamename, get_error_message()))
61 
62  def _handle_return_value(self, value):
63  raise NotImplementedError
64 
65  def _to_string(self, value, allow_tuple=False, allow_none=False):
66  if is_string(value):
67  return value
68  if is_bytes(value):
69  return value.decode('UTF-8')
70  if allow_tuple and is_list_like(value) and len(value) > 0:
71  return tuple(value)
72  if allow_none and value is None:
73  return value
74  or_tuple = ' or a non-empty tuple' if allow_tuple else ''
75  raise DataError('Return value must be a string%s, got %s.'
76  % (or_tuple, type_name(value)))
77 
78  def _to_list(self, value):
79  if value is None:
80  return ()
81  if not is_list_like(value):
82  raise DataError
83  return value
84 
85  def _to_list_of_strings(self, value, allow_tuples=False):
86  try:
87  return [self._to_string_to_string(item, allow_tuples)
88  for item in self._to_list_to_list(value)]
89  except DataError:
90  raise DataError('Return value must be a list of strings%s.'
91  % (' or non-empty tuples' if allow_tuples else ''))
92 
93  def __bool__(self):
94  return self.methodmethod is not no_dynamic_method
95 
96 
98 
101  _underscore_name = 'get_keyword_names'
102 
103  def _handle_return_value(self, value):
104  names = self._to_list_of_strings_to_list_of_strings(value)
105  return list(self._remove_duplicates_remove_duplicates(names))
106 
107  def _remove_duplicates(self, names):
108  seen = set()
109  for name in names:
110  if name not in seen:
111  seen.add(name)
112  yield name
113 
114 
116 
119  _underscore_name = 'run_keyword'
120 
121  @property
122  supports_kwargs = property
123 
124  def supports_kwargs(self):
125  spec = PythonArgumentParser().parse(self.methodmethod)
126  return len(spec.positional) == 3
127 
128 
130 
133  _underscore_name = 'get_keyword_documentation'
134 
135  def _handle_return_value(self, value):
136  return self._to_string_to_string(value or '')
137 
138 
140 
143  _underscore_name = 'get_keyword_arguments'
144 
145  def __init__(self, lib):
146  _DynamicMethod.__init__(self, lib)
147  self._supports_kwargs_supports_kwargs = RunKeyword(lib).supports_kwargs
148 
149  def _handle_return_value(self, value):
150  if value is None:
151  if self._supports_kwargs_supports_kwargs:
152  return ['*varargs', '**kwargs']
153  return ['*varargs']
154  return self._to_list_of_strings_to_list_of_strings(value, allow_tuples=True)
155 
156 
158 
161  _underscore_name = 'get_keyword_types'
162 
163  def _handle_return_value(self, value):
164  return value if self else {}
165 
166 
168 
171  _underscore_name = 'get_keyword_tags'
172 
173  def _handle_return_value(self, value):
174  return self._to_list_of_strings_to_list_of_strings(value)
175 
176 
178 
181  _underscore_name = 'get_keyword_source'
182 
183  def _handle_return_value(self, value):
184  return self._to_string_to_string(value, allow_none=True)
def _to_list_of_strings(self, value, allow_tuples=False)
def _to_string(self, value, allow_tuple=False, allow_none=False)
def get_error_message()
Returns error message of the last occurred exception.
Definition: error.py:34
def type_name(item, capitalize=False)
Return "non-technical" type name for objects and types.
Definition: robottypes.py:86
def is_list_like(item)
Definition: robottypes.py:66