23 is_java_method, JYTHON, normalize, seq2str2, unic,
24 is_list_like, PY2, PYPY, type_name)
26 from .arguments
import EmbeddedArguments
27 from .context
import EXECUTION_CONTEXTS
28 from .dynamicmethods
import (GetKeywordArguments, GetKeywordDocumentation,
29 GetKeywordNames, GetKeywordTags, RunKeyword)
30 from .handlers
import Handler, InitHandler, DynamicHandler, EmbeddedArgumentsHandler
31 from .handlerstore
import HandlerStore
32 from .libraryscopes
import LibraryScope
33 from .outputcapture
import OutputCapturer
37 from java.lang
import Object
42 def TestLibrary(name, args=None, variables=None, create_handlers=True):
44 import_name =
'robot.libraries.' + name
48 importer = Importer(
'test library')
49 libcode, source = importer.import_class_or_module(import_name,
52 lib = libclass(libcode, name, args
or [], source, variables)
59 if inspect.ismodule(libcode):
63 return _DynamicLibrary
73 _failure_level =
'INFO'
75 def __init__(self, libcode, name, args, source, variables):
76 if os.path.exists(name):
77 name = os.path.splitext(os.path.basename(os.path.abspath(name)))[0]
88 self.positional_args, self.named_args \
89 = self.
initinit.resolve_arguments(args, variables)
100 if self.
_doc_doc
is None:
125 return self.
_get_attr_get_attr(libcode,
'ROBOT_LIBRARY_VERSION') \
126 or self.
_get_attr_get_attr(libcode,
'__version__')
128 def _get_attr(self, object, attr, default='', upper=False):
129 value =
unic(getattr(object, attr, default))
131 value =
normalize(value, ignore=
'_').upper()
135 return self.
_get_attr_get_attr(libcode,
'ROBOT_LIBRARY_DOC_FORMAT', upper=
True)
141 init = getattr(libcode,
'__init__',
None)
142 return init
if init
and self.
_valid_init_valid_init(init)
else lambda:
None
148 return method.__func__
is not object.__init__.__func__
149 return method
is not object.__init__
150 return (inspect.ismethod(method)
or
151 inspect.isfunction(method)
or
156 if not self.
scopescope.is_global:
172 return libcode(*self.positional_args, **
dict(self.named_args))
179 listeners = getattr(libinst,
'ROBOT_LIBRARY_LISTENER',
None)
180 if listeners
is None:
189 listeners = EXECUTION_CONTEXTS.current.output.library_listeners
191 except DataError
as err:
195 LOGGER.error(
"Registering listeners for library '%s' failed: %s"
196 % (self.
namename, err))
200 listeners = EXECUTION_CONTEXTS.current.output.library_listeners
201 listeners.unregister(self, close)
204 if self.
scopescope.is_global:
209 method = (getattr(listener,
'close',
None)
or
210 getattr(listener,
'_close',
None))
216 name = getattr(listener,
'__name__',
None)
or type_name(listener)
217 LOGGER.error(
"Calling method '%s' of listener '%s' failed: %s"
218 % (method.__name__, name, message))
219 LOGGER.info(
"Details:\n%s" % details)
226 raise DataError(
"Getting keyword names from library '%s' failed: %s"
227 % (self.
namename, message), details)
234 self.
handlershandlers.add(handler, embedded)
235 except DataError
as err:
236 LOGGER.error(
"Error in test library '%s': "
237 "Creating keyword '%s' failed: %s"
238 % (self.
namename, handler.name, err.message))
240 LOGGER.debug(
"Created keyword '%s'" % handler.name)
243 return [name
for name
in dir(libcode)
244 if name[:1] !=
'_' or self.
_has_robot_name_has_robot_name(name, libcode)]
251 return hasattr(handler,
'robot_name')
266 LOGGER.write(
"Adding keyword '%s' to library '%s' failed: %s"
269 LOGGER.debug(
'Details:\n%s' % details)
272 method = getattr(libcode, name)
273 if not inspect.isroutine(method):
274 raise DataError(
'Not a method or function')
280 except DataError
as err:
290 except DataError
as err:
296 return Handler(self, handler_name, handler_method)
303 return handler,
False
306 if not (arguments.minargs <= len(embedded.args) <= arguments.maxargs):
307 raise DataError(
'Embedded argument count does not match number of '
308 'accepted arguments.')
312 if self.positional_args
or self.named_args:
313 args = self.positional_args \
314 + [
'%s=%s' % item
for item
in self.named_args]
315 args_text =
'arguments %s' %
seq2str2(args)
317 args_text =
'no arguments'
318 raise DataError(
"Initializing test library '%s' with %s failed: %s\n%s"
319 % (self.
namename, args_text, msg, details))
327 for item
in (libinst,) + inspect.getmro(libinst.__class__):
328 if item
in (object, Object):
330 if hasattr(item,
'__dict__')
and name
in item.__dict__:
332 return getattr(libinst, name)
333 raise DataError(
'No non-implicit implementation found')
336 if not inspect.isroutine(handler):
337 raise DataError(
'Not a method or function')
339 raise DataError(
'Implicit methods are ignored')
344 for signature
in handler.argslist[:handler.nargs]:
345 cls = signature.declaringClass
346 if not (cls
is Object
or cls.
__module____module__ ==
'org.python.proxies'):
354 method = _BaseTestLibrary._get_handler_method(self, libcode, name)
355 if hasattr(libcode,
'__all__')
and name
not in libcode.__all__:
356 raise DataError(
'Not exposed as a keyword')
374 _failure_level =
'ERROR'
384 _failure_level =
'ERROR'
386 def __init__(self, libcode, name, args, source, variables=None):
387 _BaseTestLibrary.__init__(self, libcode, name, args, source, variables)
395 _BaseTestLibrary.doc.fget(self))
423 docgetter =
lambda: self.
_get_kw_doc_get_kw_doc(
'__init__')
Used when variable does not exist.
def close_global_listeners(self)
def _report_adding_keyword_failed(self, name, message=None, details=None, level=None)
def _has_robot_name(self, name, libcode)
def _get_version(self, libcode)
def _get_handler_names(self, libcode)
def __init__(self, libcode, name, args, source, variables)
def _try_to_create_handler(self, name, method)
def unregister_listeners(self, close=False)
def _valid_init(self, method)
def _create_handler(self, handler_name, handler_method)
def _validate_embedded_count(self, embedded, arguments)
def get_instance(self, create=True)
def _resolve_init_method(self, libcode)
def _create_init_handler(self, libcode)
def get_listeners(self, libinst=None)
def _close_listener(self, listener)
def _get_instance(self, libcode)
def _try_to_get_handler_method(self, libcode, name)
def _create_handlers(self, libcode)
def _get_possible_embedded_args_handler(self, handler)
def create_handlers(self)
def reset_instance(self, instance=None)
def register_listeners(self)
def _get_attr(self, object, attr, default='', upper=False)
def _get_doc_format(self, libcode)
def _raise_creating_instance_failed(self)
def _get_handler_method(self, libcode, name)
def _get_handler_method(self, libinst, name)
def _validate_handler(self, handler)
def _is_implicit_java_or_jython_method(self, handler)
def _create_handler(self, name, method)
def _get_kw_args(self, name)
def __init__(self, libcode, name, args, source, variables=None)
def _get_handler_names(self, instance)
def _get_handler_method(self, instance, name)
def _create_init_handler(self, libcode)
def _get_kw_tags(self, name)
def _get_kw_doc(self, name)
def _get_handler_names(self, instance)
def _get_handler_method(self, libcode, name)
def get_instance(self, create=True)
def _create_init_handler(self, libcode)
def Handler(library, name, method)
def InitHandler(library, method, docgetter=None)
def DynamicHandler(library, name, method, doc, argspec, tags=None)
def LibraryScope(libcode, library)
def _get_lib_class(libcode)
def TestLibrary(name, args=None, variables=None, create_handlers=True)
def get_error_details(exclude_robot_traces=EXCLUDE_ROBOT_TRACES)
Returns error message and details of the last occurred exception.
def seq2str2(sequence)
Returns sequence in format [ item 1 | item 2 | ...
def normalize(string, ignore=(), caseless=True, spaceless=True)
Normalizes given string according to given spec.
def is_java_method(method)