23 from .error
import get_error_details
24 from .robotpath
import abspath, normpath
25 from .robotinspect
import is_init
26 from .robottypes
import type_name
87 imported, source = self.
_import_import(name_or_path)
90 except DataError
as err:
112 imported, source = self.
_import_import(name_or_path, get_class=
False)
114 except DataError
as err:
121 if importer.handles(name):
122 return importer.import_(name, get_class)
125 if not return_source:
127 if source
and os.path.exists(source):
129 return imported, source
133 if os.path.isdir(source):
134 candidate = os.path.join(source,
'__init__.py')
135 elif source.endswith(
'.pyc'):
136 candidate = source[:-4] +
'.py'
139 return candidate
if os.path.exists(candidate)
else source
161 except DataError
as err:
165 import_type =
'%s ' % self.
_type_type.lower()
if self.
_type_type
else ''
166 item_type =
'module' if inspect.ismodule(item)
else 'class'
167 location = (
"'%s'" % source)
if source
else 'unknown location'
168 self.
_logger_logger.
info(
"Imported %s%s '%s' from %s."
169 % (import_type, item_type, name, location))
172 prefix = f
'Importing {self._type.lower()}' if self.
_type_type
else 'Importing'
173 raise DataError(f
"{prefix} '{name}' failed: {error.message}")
178 if inspect.isclass(imported):
181 raise DataError(
"Modules do not take arguments.")
187 positional, named = spec.resolve(args)
188 except ValueError
as err:
191 return imported(*positional, **dict(named))
199 init = getattr(imported,
'__init__',
None)
200 name = imported.__name__
202 return ArgumentSpec(name, self.
_type_type)
203 return PythonArgumentParser(self.
_type_type).parse(init, name)
212 if name
in sys.builtin_module_names:
213 raise DataError(
'Cannot import custom module with same name as '
214 'Python built-in module.')
215 importlib.invalidate_caches()
217 return __import__(name, fromlist=fromlist)
220 path =
'\n'.join(f
' {p}' for p
in sys.path)
221 raise DataError(f
'{message}\n{traceback}\nPYTHONPATH:\n{path}')
224 if inspect.isclass(imported)
or inspect.ismodule(imported):
229 klass = getattr(module, name
or module.__name__,
None)
230 return klass
if inspect.isclass(klass)
else None
234 source = inspect.getfile(imported)
237 return abspath(source)
if source
else None
244 _valid_import_extensions = (
'.py',
'')
247 return os.path.isabs(path)
258 if not os.path.exists(path):
259 raise DataError(
'File or directory does not exist.')
260 if not os.path.isabs(path):
261 raise DataError(
'Import path must be absolute.')
263 raise DataError(
'Not a valid file or directory to import.')
267 importing_package = os.path.splitext(path)[1] ==
''
269 del sys.modules[name]
270 self.
_logger_logger.
info(
"Removed module '%s' from sys.modules to import "
271 "fresh module." % name)
274 module_dir, module_file = os.path.split(
abspath(path))
275 module_name = os.path.splitext(module_file)[0]
276 return module_dir, module_name
279 if name
not in sys.modules:
281 source = getattr(sys.modules[name],
'__file__',
None)
285 return (
normpath(importing_from, case_normalize=
True) !=
286 normpath(imported_from, case_normalize=
True)
or
287 importing_package != imported_package)
291 imported_package = imported_file ==
'__init__'
293 imported_from = os.path.dirname(imported_from)
294 return imported_from, imported_package
298 sys.path.insert(0, module_dir)
300 return self.
_import_import(module_name)
302 sys.path.remove(module_dir)
308 return '.' not in name
311 imported = self.
_import_import(name)
323 parent_name, lib_name = name.rsplit(
'.', 1)
324 parent = self.
_import_import(parent_name, fromlist=[str(lib_name)])
326 imported = getattr(parent, lib_name)
327 except AttributeError:
328 raise DataError(
"Module '%s' does not contain '%s'."
329 % (parent_name, lib_name))
336 error = warn = info = debug = trace =
lambda self, *args, **kws:
None
def _get_import_information(self, source)
def _verify_import_path(self, path)
def _import_by_path(self, path)
tuple _valid_import_extensions
def _wrong_module_imported(self, name, importing_from, importing_package)
def import_(self, path, get_class=True)
def _split_path_to_module(self, path)
def _remove_wrong_module_from_sys_modules(self, path)
def import_(self, name, get_class=True)
Utility that can import modules and classes based on names and paths.
def _log_import_succeeded(self, item, name, source)
def __init__(self, type=None, logger=None)
:param type: Type of the thing being imported.
def import_class_or_module_by_path(self, path, instantiate_with_args=None)
Import a Python module or class using a file system path.
def _sanitize_source(self, source)
def _raise_import_failed(self, name, error)
def _import(self, name, get_class=True)
def _get_arg_spec(self, imported)
def _instantiate_if_needed(self, imported, args)
def import_class_or_module(self, name_or_path, instantiate_with_args=None, return_source=False)
Imports Python class or module based on the given name or path.
def _instantiate_class(self, imported, args)
def _handle_return_values(self, imported, source, return_source=False)
def import_module(self, name_or_path)
Imports Python module based on the given name or path.
def import_(self, name, get_class=True)
def _verify_type(self, imported)
def __init__(self, logger)
def _get_class_from_module(self, module, name=None)
def _get_source(self, imported)
def _import(self, name, fromlist=None)
def info(msg, html=False, also_console=False)
Writes the message to the log file using the INFO level.
def get_error_details(full_traceback=True, exclude_robot_traces=EXCLUDE_ROBOT_TRACES)
Returns error message and details of the last occurred exception.
def abspath(path, case_normalize=False)
Replacement for os.path.abspath with some enhancements and bug fixes.
def normpath(path, case_normalize=False)
Replacement for os.path.normpath with some enhancements.
def type_name(item, capitalize=False)
Return "non-technical" type name for objects and types.