21 from itertools
import chain
24 from ..
import robotapi, utils
25 from ..publish
import PUBLISHER, RideSettingsChanged, RideLogMessage
26 from ..robotapi
import VariableFileSetter
27 from ..spec.iteminfo
import (TestCaseUserKeywordInfo, ResourceUserKeywordInfo, VariableInfo, _UserKeywordInfo,
29 from .cache
import LibraryCache, ExpiringCache
30 from .resourcefactory
import ResourceFactory
31 from .embeddedargs
import EmbeddedArgsHandler
43 PUBLISHER.subscribe(self.
_setting_changed_setting_changed, RideSettingsChanged)
59 for path
in self.
_settings_settings.get(
'pythonpath', []):
60 if path
not in sys.path:
61 normalized = path.replace(
'/', os.sep)
62 sys.path.insert(path_idx, normalized)
65 .format(normalized)).publish()
68 section, setting = message.keys
69 if section ==
'' and setting ==
'pythonpath':
70 for p
in set(message.old).difference(message.new):
76 _VariableStash.global_variables[
'${EXECDIR}'] = exec_dir
80 _VariableStash.global_variables[
'${CURDIR}'] = cur_dir
115 kws.update(self.
_retriever_retriever.get_keywords_from_several(testsuites))
119 return self.
_lib_cache_lib_cache.get_default_keywords()
122 datafile = controller.datafile
131 sugs_list = list(sugs)
138 sugs.extend(hook(datafile, start))
150 return len(start) == 1
and start[0]
in [
'$',
'@',
'&'] \
151 or (len(start) >= 2
and start[:2]
in [
'${',
'@{',
'&{']) \
152 or len(start) >= 2
and start[0] ==
'$'
156 variables = self.
_retriever_retriever.get_variables_from(
157 controller.datafile, ctx)
158 sugs = (v
for v
in variables
if v.name_matches(start))
163 for name, value
in controller.get_local_variables().items():
164 variables.set_argument(name, value)
167 start_normalized = utils.normalize(start)
169 self.
_retriever_retriever.get_keywords_from(datafile, ctx))
170 return (sug
for sug
in all_kws
171 if sug.name_begins_with(start_normalized)
or
172 sug.longname_begins_with(start_normalized))
175 return self.
_retriever_retriever.get_resources_from(datafile)
180 report_status=report_status)
183 ctx = self.
_context_factory_context_factory.ctx_for_datafile(imp.parent.parent)
184 return self.
_resource_factory_resource_factory.get_resource_from_import(imp, ctx)
191 return kw
if isinstance(kw, _UserKeywordInfo)
else None
198 return kw
if kw
and kw.is_library_keyword()
else None
202 datafile, imp, self.
_context_factory_context_factory.ctx_for_datafile(datafile))
206 datafile, imp, self.
_context_factory_context_factory.ctx_for_datafile(datafile))
211 kwds = self.
_retriever_retriever.get_keywords_cached(datafile,
213 return kwds.get(kw_name)
220 return kw.details
if kw
else None
237 ctx.set_variables_from_datafile_variable_table(datafile)
242 for retrieve_context
in self.
_context_cache_context_cache.values():
243 retrieve_context.vars.load_builtin_global_vars()
252 self.
varsvars.set_from_variable_table(datafile.variable_table)
276 '${EXECDIR}': os.path.abspath(
'.'),
278 '${KEYWORD_MESSAGE}':
'',
279 '${KEYWORD_STATUS}':
'',
282 '${\\n}': os.linesep,
286 '${OUTPUT_FILE}':
'',
287 '${PREV_TEST_MESSAGE}':
'',
288 '${PREV_TEST_NAME}':
'',
289 '${PREV_TEST_STATUS}':
'',
290 '${REPORT_FILE}':
'',
292 '${SUITE_DOCUMENTATION}':
'',
293 '${SUITE_MESSAGE}':
'',
294 '${SUITE_METADATA}':
'',
296 '${SUITE_SOURCE}':
'',
297 '${SUITE_STATUS}':
'',
298 '${TEMPDIR}': os.path.normpath(tempfile.gettempdir()),
299 '${TEST_DOCUMENTATION}':
'',
300 '${TEST_MESSAGE}':
'',
302 '${TEST_STATUS}':
'',
310 self.
_vars_vars = robotapi.RobotVariables()
316 self.
setset(k, v,
'built-in')
318 def set(self, name, value, source):
319 self.
_vars_vars[name] = value
320 self.
_sources_sources[name[2:-1]] = source
327 return self.
_vars_vars.replace_scalar(value)
329 return self.
_vars_vars.replace_string(value, ignore_errors=
True)
335 for variable
in variable_table:
337 if variable.name
not in self.
_vars_vars.store:
338 _, value = reader._get_name_and_value(
341 variable.report_invalid_syntax
344 self.
setset(variable.name, value.resolve(self.
_vars_vars),
345 variable_table.source)
346 except Exception
as e:
349 if robotapi.is_var(variable.name):
351 self.
setset(variable.name, val, variable_table.source)
363 vars_from_file = VariableFileSetter(
None)._import_if_needed(
365 except Exception
as e:
368 for name, value
in vars_from_file:
369 self.
setset(name, value, varfile_path)
372 if utils.is_dict_like(value):
374 elif utils.is_list_like(value):
380 for name, value
in self.
_vars_vars.store.data.items():
381 source = self.
_sources_sources[name]
383 name =
u'{0}{{{1}}}'.format(prefix, name)
391 def __init__(self, lib_cache, resource_factory, namespace):
402 default_kws = property
422 ctx.allow_going_through_resources_again()
435 return self.
_import_vars_import_vars(ctx, datafile, imp)
449 kws.extend(getter(imp, ctx))
454 self.
_namespace_namespace.update_cur_dir_global_var(imp.directory)
455 name = ctx.replace_variables(imp.name)
457 args = [ctx.replace_variables(a)
for a
in imp.args]
458 alias = ctx.replace_variables(imp.alias)
if imp.alias
else None
459 return self.
_lib_cache_lib_cache.get_library_keywords(name, args, alias)
463 full_name = os.path.join(import_.directory, name)
464 if os.path.exists(full_name):
470 return [imp
for imp
in datafile.imports
471 if isinstance(imp, instance_type)]
481 if not res
or res
in ctx.parsed:
484 ctx.set_variables_from_datafile_variable_table(res)
495 ctx.set_variables_from_datafile_variable_table(datafile)
506 varfile_path = os.path.join(datafile.directory,
507 ctx.replace_variables(imp.name))
508 args = [ctx.replace_variables(a)
for a
in imp.args]
511 ctx.vars.set_from_file(varfile_path, args)
513 except Exception
as e:
521 values = self.
keyword_cachekeyword_cache.get(datafile.source)
524 datafile, context_factory.ctx_for_datafile(datafile))
536 kws.update(datafile.keywords)
539 lambda res, ctx, kws:
541 kws.update(kws_from_res)
546 ctx.set_variables_from_datafile_variable_table(datafile)
549 if res
and res
not in ctx.parsed:
551 collector(res, ctx, items)
557 resources.sort(key=operator.attrgetter(
'name'))
563 resources.update(res)
564 for child
in datafile.children:
575 regexp = re.compile(
"\s*(given|when|then|and|but)\s*(.*)", re.IGNORECASE)
590 if kw.name
not in self.
keywordskeywords:
593 self.
keywordskeywords[kw.longname] = kw
596 if '$' not in kw.name:
605 if kw_name
in self.
keywordskeywords:
606 return self.
keywordskeywords[kw_name]
608 if bdd_name
and bdd_name
in self.
keywordskeywords:
609 return self.
keywordskeywords[bdd_name]
611 if regexp.match(kw_name)
or (bdd_name
and regexp.match(bdd_name)):
616 match = self.
regexpregexp.match(kw_name)
617 return match.group(2)
if match
else None
Used when variable does not exist.
The parsed resource file object.
Custom dictionary implementation automatically normalizing keys.
def _get_imported_resource_keywords(self, datafile, ctx)
def get_keywords_cached(self, datafile, context_factory)
def _collect_vars_from_variable_files(self, datafile, ctx)
def _get_vars_recursive(self, datafile, ctx)
def is_variables_import_ok(self, datafile, imp, ctx)
def _add_resource(self, res, ctx, items)
def _collect_kws_from_imports(self, datafile, instance_type, getter, ctx)
def _import_vars(ctx, datafile, imp)
def __init__(self, lib_cache, resource_factory, namespace)
def _get_datafile_keywords(self, datafile)
def get_keywords_from(self, datafile, ctx)
def _get_resources_recursive(self, datafile, ctx)
def _res_kw_recursive_getter(self, imp, ctx)
def _get_imported_library_keywords(self, datafile, ctx)
def _var_collector(self, res, ctx, items)
def _collect_each_res_import(self, datafile, ctx, collector)
def get_keywords_from_several(self, datafiles)
def _collect_import_of_type(datafile, instance_type)
def get_all_cached_library_names(self)
def is_library_import_ok(self, datafile, imp, ctx)
def _convert_to_absolute_path(name, import_)
def get_variables_from(self, datafile, ctx=None)
def _get_user_keywords_from(self, datafile)
def _get_user_keywords_recursive(self, datafile, ctx)
def get_resources_from(self, datafile)
def _lib_kw_getter(self, imp, ctx)
def update_cur_dir_global_var(self, cur_dir)
def find_resource_with_import(self, imp)
def _keyword_suggestions(self, datafile, start, ctx)
def find_user_keyword(self, datafile, kw_name)
def set_library_manager(self, library_manager)
def __init__(self, settings)
def is_library_keyword(self, datafile, kw_name)
def find_keyword(self, datafile, kw_name)
def _add_kw_arg_vars(controller, variables)
def resource_filename_changed(self, old_name, new_name)
def clear_update_listeners(self)
def get_all_keywords(self, testsuites)
def _variable_suggestions(self, controller, start, ctx)
def unregister_update_listener(self, listener)
def get_resources(self, datafile)
def _setting_changed(self, message)
def _set_pythonpath(self)
Add user configured paths to PYTHONAPATH.
def get_all_cached_library_names(self)
def get_suggestions_for(self, controller, start)
def _get_suggestions_from_hooks(self, datafile, start)
def _get_default_keywords(self)
def new_resource(self, path, directory='')
def is_library_import_ok(self, datafile, imp)
def keyword_details(self, datafile, name)
def register_content_assist_hook(self, hook)
def find_library_keyword(self, datafile, kw_name)
def is_user_keyword(self, datafile, kw_name)
def reset_resource_and_library_cache(self)
def register_update_listener(self, listener)
def is_variables_import_ok(self, datafile, imp)
def _looks_like_variable(start)
def get_resource(self, path, directory='', report_status=True)
def update_exec_dir_global_var(self, exec_dir)
def set_variables_from_datafile_variable_table(self, datafile)
def replace_variables(self, text)
def allow_going_through_resources_again(self)
Resets the parsed resources cache.
def _add_keyword(self, kw)
def _get_bdd_name(self, kw_name)
def __init__(self, keywords)
def _add_embedded(self, kw)
def _add_keywords(self, keywords)
def reload_context_global_vars(self)
def ctx_for_controller(self, controller)
def ctx_for_datafile(self, datafile)
def set_from_file(self, varfile_path, args)
def _get_prefix(self, value)
def set(self, name, value, source)
def load_builtin_global_vars(self)
dictionary global_variables
def _empty_value_for_variable_type(self, name)
def replace_variables(self, value)
def set_from_variable_table(self, variable_table)
def set_argument(self, name, value)
This class represents a general purpose log message.