19 from robot.utils import (getdoc, getshortdoc, is_list_like, normpath, printable_name,
20 split_tags_from_doc, type_name)
24 from .arguments
import ArgumentSpec, DynamicArgumentParser, PythonArgumentParser
25 from .dynamicmethods
import GetKeywordSource, GetKeywordTypes
26 from .librarykeywordrunner
import (EmbeddedArgumentsRunner,
27 LibraryKeywordRunner, RunKeywordRunner)
28 from .runkwregister
import RUN_KW_REGISTER
32 if RUN_KW_REGISTER.is_run_keyword(library.orig_name, name):
38 if RUN_KW_REGISTER.is_run_keyword(library.orig_name, name):
48 supports_embedded_args =
False
50 def __init__(self, library, handler_name, handler_method, doc='', tags=None):
61 tuple(tags_from_attr) +
65 robot_name = getattr(handler_method,
'robot_name',
None)
68 raise DataError(
'Keyword name cannot be empty.')
72 raise NotImplementedError
75 tags = getattr(handler_method,
'robot_tags', ())
77 raise DataError(f
"Expected tags to be list-like, got {type_name(tags)}.")
81 if library.scope.is_global:
86 return self.
argumentsarguments.resolve(args, variables, self.
librarylibrary.converters,
99 return f
'{self.library.name}.{self.name}'
111 return self.
librarylibrary.name
117 return self.
librarylibrary.source
138 return getattr(lib_instance, handler_name)
139 except AttributeError:
141 if handler_name ==
'__init__':
148 def __init__(self, library, handler_name, handler_method):
149 super().
__init__(library, handler_name, handler_method,
getdoc(handler_method))
161 source = inspect.getsourcefile(inspect.unwrap(handler))
172 lines, start_lineno = inspect.getsourcelines(inspect.unwrap(handler))
173 except (TypeError, OSError, IOError):
175 for increment, line
in enumerate(lines):
176 if line.strip().startswith(
'def '):
177 return start_lineno + increment
183 def __init__(self, library, handler_name, dynamic_method, doc='', argspec=None,
189 _RunnableHandler.__init__(self, library, handler_name, dynamic_method.method,
198 raise DataError(f
"Too few '{name}' method parameters for "
199 f
"**kwargs support.")
201 raise DataError(f
"Too few '{name}' method parameters for "
202 f
"keyword-only arguments support.")
204 spec.types = get_keyword_types(self.
_handler_name_handler_name)
219 except DataError
as err:
220 self.
librarylibrary.report_error(
221 f
"Getting source information for keyword '{self.name}' failed: {err}",
225 if source
and ':' in source
and source.rsplit(
':', 1)[1].isdigit():
226 source, lineno = source.rsplit(
':', 1)
230 return normpath(source)
if source
else self.
librarylibrary.source, lineno
243 positional, named = self.
argumentsarguments.map(positional, named)
244 return positional, named
254 def handler(*positional, **kwargs):
256 return runner(name, positional, kwargs)
258 return runner(name, positional)
265 dry_run = RUN_KW_REGISTER.get_dry_run(self.
librarylibrary.orig_name, self.
namename)
269 _args_to_process = property
272 return RUN_KW_REGISTER.get_args_to_process(self.
librarylibrary.orig_name, self.
namename)
275 return self.
argumentsarguments.resolve(args, variables, self.
librarylibrary.converters,
284 _parse_arguments = _RunKeywordHandler._parse_arguments
285 resolve_arguments = _RunKeywordHandler.resolve_arguments
290 def __init__(self, library, handler_name, handler_method, docgetter):
291 super().
__init__(library, handler_name, handler_method)
308 return parser.parse(init_method
or (
lambda:
None), self.
librarylibrary.name)
312 supports_embedded_args =
True
334 return self.
embeddedembedded.match(name)
is not None
342 if argspec.var_positional:
343 args = variables.replace_list(args)
345 args = [variables.replace_scalar(a)
for a
in args]
346 self.
embeddedembedded.validate(args)
348 dry_run=
not variables)
def __getattr__(self, item)
def __init__(self, embedded, orig_handler)
def resolve_arguments(self, args, variables=None, languages=None)
def library(self, library)
def create_runner(self, name, languages=None)
def resolve_arguments(self, arguments, variables=None, languages=None)
def _get_dynamic_handler(self, runner, name)
def _get_global_handler(self, method, name)
def __init__(self, library, handler_name, dynamic_method, doc='', argspec=None, tags=None)
def _parse_arguments(self, handler_method)
def _get_source_info(self)
def _get_handler(self, lib_instance, handler_name)
def __init__(self, library, handler_name, handler_method)
def _parse_arguments(self, handler_method)
def _parse_arguments(self, init_method)
def __init__(self, library, handler_name, handler_method, docgetter)
def _get_name(self, handler_name, handler_method)
def _args_to_process(self)
def resolve_arguments(self, args, variables=None, languages=None)
def create_runner(self, name, languages=None)
def resolve_arguments(self, args, variables=None, languages=None)
def _parse_arguments(self, handler_method)
def create_runner(self, name, languages=None)
def _get_initial_handler(self, library, name, method)
def _get_tags_from_attribute(self, handler_method)
def __init__(self, library, handler_name, handler_method, doc='', tags=None)
def _get_global_handler(self, method, name)
def _get_handler(self, lib_instance, handler_name)
def current_handler(self)
def _get_name(self, handler_name, handler_method)
def InitHandler(library, method=None, docgetter=None)
def Handler(library, name, method)
def DynamicHandler(library, name, method, doc, argspec, tags=None)
def printable_name(string, code_style=False)
Generates and returns printable name from the given string.
def normpath(path, case_normalize=False)
Replacement for os.path.normpath with some enhancements.
def getshortdoc(doc_or_item, linesep='\n')
def split_tags_from_doc(doc)