Robot Framework Integrated Development Environment (RIDE)
namespace.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 import operator
17 import os
18 import re
19 import sys
20 import tempfile
21 from itertools import chain
22 
23 
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,
28  ArgumentInfo)
29 from .cache import LibraryCache, ExpiringCache
30 from .resourcefactory import ResourceFactory
31 from .embeddedargs import EmbeddedArgsHandler
32 
33 
34 class Namespace():
35 
36  def __init__(self, settings):
37  self._settings_settings = settings
38  self._library_manager_library_manager = None
39  self._content_assist_hooks_content_assist_hooks = []
40  self._update_listeners_update_listeners = set()
41  self._init_caches_init_caches()
42  self._set_pythonpath_set_pythonpath()
43  PUBLISHER.subscribe(self._setting_changed_setting_changed, RideSettingsChanged)
44 
45  def _init_caches(self):
46  self._lib_cache_lib_cache = LibraryCache(
47  self._settings_settings, self.updateupdate, self._library_manager_library_manager)
48  self._resource_factory_resource_factory = ResourceFactory(self._settings_settings)
49  self._retriever_retriever = DatafileRetriever(self._lib_cache_lib_cache,
50  self._resource_factory_resource_factory, self)
51  self._context_factory_context_factory = _RetrieverContextFactory()
52 
53 
57  def _set_pythonpath(self):
58  path_idx = 0
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)
63  path_idx += 1
64  RideLogMessage(u'Inserted \'{0}\' to sys.path.'
65  .format(normalized)).publish()
66 
67  def _setting_changed(self, message):
68  section, setting = message.keys
69  if section == '' and setting == 'pythonpath':
70  for p in set(message.old).difference(message.new):
71  if p in sys.path:
72  sys.path.remove(p)
73  self._set_pythonpath_set_pythonpath()
74 
75  def update_exec_dir_global_var(self, exec_dir):
76  _VariableStash.global_variables['${EXECDIR}'] = exec_dir
77  self._context_factory_context_factory.reload_context_global_vars()
78 
79  def update_cur_dir_global_var(self, cur_dir):
80  _VariableStash.global_variables['${CURDIR}'] = cur_dir
81  self._context_factory_context_factory.reload_context_global_vars()
82 
83  def set_library_manager(self, library_manager):
84  self._library_manager_library_manager = library_manager
85  self._lib_cache_lib_cache.set_library_manager(library_manager)
86 
87  def update(self, *args):
88  self._retriever_retriever.expire_cache()
89  self._context_factory_context_factory = _RetrieverContextFactory()
90  for listener in self._update_listeners_update_listeners:
91  listener()
92 
93  def resource_filename_changed(self, old_name, new_name):
94  self._resource_factory_resource_factory.resource_filename_changed(old_name, new_name)
95 
97  self._init_caches_init_caches()
98 
99  def register_update_listener(self, listener):
100  self._update_listeners_update_listeners.add(listener) # append(listener) # DEBUG .add(listener)
101 
102  def unregister_update_listener(self, listener):
103  if listener in self._update_listeners_update_listeners:
104  self._update_listeners_update_listeners.remove(listener)
105 
107  self._update_listeners_update_listeners.clear() # = list() # DEBUG .clear()
108 
110  self._content_assist_hooks_content_assist_hooks.append(hook)
111 
112  def get_all_keywords(self, testsuites):
113  kws = set()
114  kws.update(self._get_default_keywords_get_default_keywords())
115  kws.update(self._retriever_retriever.get_keywords_from_several(testsuites))
116  return kws
117 
119  return self._lib_cache_lib_cache.get_default_keywords()
120 
121  def get_suggestions_for(self, controller, start):
122  datafile = controller.datafile
123  ctx = self._context_factory_context_factory.ctx_for_controller(controller)
124  sugs = set()
125  sugs.update(self._get_suggestions_from_hooks_get_suggestions_from_hooks(datafile, start))
126  if self._blank_blank(start) or not self._looks_like_variable_looks_like_variable(start):
127  sugs.update(self._variable_suggestions_variable_suggestions(controller, start, ctx))
128  sugs.update(self._keyword_suggestions_keyword_suggestions(datafile, start, ctx))
129  else:
130  sugs.update(self._variable_suggestions_variable_suggestions(controller, start, ctx))
131  sugs_list = list(sugs)
132  sugs_list.sort()
133  return sugs_list
134 
135  def _get_suggestions_from_hooks(self, datafile, start):
136  sugs = []
137  for hook in self._content_assist_hooks_content_assist_hooks:
138  sugs.extend(hook(datafile, start))
139  return sugs
140 
142  return self._retriever_retriever.get_all_cached_library_names()
143 
144  @staticmethod
145  def _blank(start):
146  return start == ''
147 
148  @staticmethod
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] == '$'
153 
154  def _variable_suggestions(self, controller, start, ctx):
155  self._add_kw_arg_vars_add_kw_arg_vars(controller, ctx.vars)
156  variables = self._retriever_retriever.get_variables_from(
157  controller.datafile, ctx)
158  sugs = (v for v in variables if v.name_matches(start))
159  return sugs
160 
161  @staticmethod
162  def _add_kw_arg_vars(controller, variables):
163  for name, value in controller.get_local_variables().items():
164  variables.set_argument(name, value)
165 
166  def _keyword_suggestions(self, datafile, start, ctx):
167  start_normalized = utils.normalize(start)
168  all_kws = chain(self._get_default_keywords_get_default_keywords(),
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))
173 
174  def get_resources(self, datafile):
175  return self._retriever_retriever.get_resources_from(datafile)
176 
177  def get_resource(self, path, directory='', report_status=True):
178  return self._resource_factory_resource_factory.get_resource(
179  directory, path,
180  report_status=report_status)
181 
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)
185 
186  def new_resource(self, path, directory=''):
187  return self._resource_factory_resource_factory.new_resource(directory, path)
188 
189  def find_user_keyword(self, datafile, kw_name):
190  kw = self.find_keywordfind_keyword(datafile, kw_name)
191  return kw if isinstance(kw, _UserKeywordInfo) else None
192 
193  def is_user_keyword(self, datafile, kw_name):
194  return bool(self.find_user_keywordfind_user_keyword(datafile, kw_name))
195 
196  def find_library_keyword(self, datafile, kw_name):
197  kw = self.find_keywordfind_keyword(datafile, kw_name)
198  return kw if kw and kw.is_library_keyword() else None
199 
200  def is_library_import_ok(self, datafile, imp):
201  return self._retriever_retriever.is_library_import_ok(
202  datafile, imp, self._context_factory_context_factory.ctx_for_datafile(datafile))
203 
204  def is_variables_import_ok(self, datafile, imp):
205  return self._retriever_retriever.is_variables_import_ok(
206  datafile, imp, self._context_factory_context_factory.ctx_for_datafile(datafile))
207 
208  def find_keyword(self, datafile, kw_name):
209  if not kw_name:
210  return None
211  kwds = self._retriever_retriever.get_keywords_cached(datafile,
212  self._context_factory_context_factory)
213  return kwds.get(kw_name)
214 
215  def is_library_keyword(self, datafile, kw_name):
216  return bool(self.find_library_keywordfind_library_keyword(datafile, kw_name))
217 
218  def keyword_details(self, datafile, name):
219  kw = self.find_keywordfind_keyword(datafile, name)
220  return kw.details if kw else None
221 
222 
224  def __init__(self):
225  self._context_cache_context_cache = {}
226 
227  def ctx_for_controller(self, controller):
228  if controller not in self._context_cache_context_cache:
229  self._context_cache_context_cache[controller] = RetrieverContext()
230  self._context_cache_context_cache[controller.datafile
231  ] = self._context_cache_context_cache[controller]
232  return self._context_cache_context_cache[controller]
233 
234  def ctx_for_datafile(self, datafile):
235  if datafile not in self._context_cache_context_cache:
236  ctx = RetrieverContext()
237  ctx.set_variables_from_datafile_variable_table(datafile)
238  self._context_cache_context_cache[datafile] = ctx
239  return self._context_cache_context_cache[datafile]
240 
242  for retrieve_context in self._context_cache_context_cache.values():
243  retrieve_context.vars.load_builtin_global_vars()
244 
245 
247  def __init__(self):
248  self.varsvars = _VariableStash()
249  self.parsedparsed = set()
250 
252  self.varsvars.set_from_variable_table(datafile.variable_table)
253 
254  def replace_variables(self, text):
255  return self.varsvars.replace_variables(text)
256 
257 
265  self.parsedparsed = set()
266 
267 
269  # Global variables copied from robot.variables
270  global_variables = {
271  '${:}': os.pathsep,
272  '${/}': os.sep,
273  '${CURDIR}': '.',
274  '${DEBUG_FILE}': '',
275  '${EMPTY}': '',
276  '${EXECDIR}': os.path.abspath('.'),
277  '${False}': False,
278  '${KEYWORD_MESSAGE}': '',
279  '${KEYWORD_STATUS}': '',
280  '${LOG_FILE}': '',
281  '${LOG_LEVEL}': '',
282  '${\\n}': os.linesep,
283  '${None}': None,
284  '${null}': None,
285  '${OUTPUT_DIR}': '',
286  '${OUTPUT_FILE}': '',
287  '${PREV_TEST_MESSAGE}': '',
288  '${PREV_TEST_NAME}': '',
289  '${PREV_TEST_STATUS}': '',
290  '${REPORT_FILE}': '',
291  '${SPACE}': ' ',
292  '${SUITE_DOCUMENTATION}': '',
293  '${SUITE_MESSAGE}': '',
294  '${SUITE_METADATA}': '',
295  '${SUITE_NAME}': '',
296  '${SUITE_SOURCE}': '',
297  '${SUITE_STATUS}': '',
298  '${TEMPDIR}': os.path.normpath(tempfile.gettempdir()),
299  '${TEST_DOCUMENTATION}': '',
300  '${TEST_MESSAGE}': '',
301  '${TEST_NAME}': '',
302  '${TEST_STATUS}': '',
303  '@{TEST_TAGS}': [],
304  '${True}': True
305  }
306 
307  ARGUMENT_SOURCE = object()
308 
309  def __init__(self):
310  self._vars_vars = robotapi.RobotVariables()
311  self._sources_sources = {}
312  self.load_builtin_global_varsload_builtin_global_vars()
313 
315  for k, v in self.global_variablesglobal_variables.items():
316  self.setset(k, v, 'built-in')
317 
318  def set(self, name, value, source):
319  self._vars_vars[name] = value
320  self._sources_sources[name[2:-1]] = source
321 
322  def set_argument(self, name, value):
323  self.setset(name, value, self.ARGUMENT_SOURCEARGUMENT_SOURCE)
324 
325  def replace_variables(self, value):
326  try:
327  return self._vars_vars.replace_scalar(value)
328  except robotapi.DataError:
329  return self._vars_vars.replace_string(value, ignore_errors=True)
330 
331  def set_from_variable_table(self, variable_table):
332  # print("DEBUG: set_from_variable_table = %s \n" % list(variable_table))
334  # print("DEBUG: set_from_variable_table reader %s \n" % reader)
335  for variable in variable_table:
336  try:
337  if variable.name not in self._vars_vars.store:
338  _, value = reader._get_name_and_value(
339  variable.name,
340  variable.value,
341  variable.report_invalid_syntax
342  )
343  # print("DEBUG: inside variable.name= %s \n" % variable.name)
344  self.setset(variable.name, value.resolve(self._vars_vars),
345  variable_table.source)
346  except Exception as e: # (robotapi.VariableError, robotapi.DataError):
347  # # robotapi.VariableError: # robotapi.DataError
348  # print("DEBUG: Namespace Exception = %s \n" % str(e))
349  if robotapi.is_var(variable.name):
350  val = self._empty_value_for_variable_type_empty_value_for_variable_type(variable.name)
351  self.setset(variable.name, val, variable_table.source)
352 
354  if name[0] == '$':
355  return ''
356  if name[0] == '@':
357  return []
358  return {}
359 
360  def set_from_file(self, varfile_path, args):
361  # print("DEBUG: enter set_from_file %s\n" % (varfile_path))
362  try:
363  vars_from_file = VariableFileSetter(None)._import_if_needed(
364  varfile_path, args)
365  except Exception as e: # robotapi.DataError
366  # print("DEBUG: leave with error set_from_file %s\n" % str(e))
367  raise # return # vars_from_file = {} # DEBUG
368  for name, value in vars_from_file:
369  self.setset(name, value, varfile_path)
370 
371  def _get_prefix(self, value):
372  if utils.is_dict_like(value):
373  return '&'
374  elif utils.is_list_like(value):
375  return '@'
376  else:
377  return '$'
378 
379  def __iter__(self):
380  for name, value in self._vars_vars.store.data.items():
381  source = self._sources_sources[name]
382  prefix = self._get_prefix_get_prefix(value)
383  name = u'{0}{{{1}}}'.format(prefix, name)
384  if source == self.ARGUMENT_SOURCEARGUMENT_SOURCE:
385  yield ArgumentInfo(name, value)
386  else:
387  yield VariableInfo(name, value, source)
388 
389 
391  def __init__(self, lib_cache, resource_factory, namespace):
392  self._namespace_namespace = namespace
393  self._lib_cache_lib_cache = lib_cache
394  self._resource_factory_resource_factory = resource_factory
395  self.keyword_cachekeyword_cache = ExpiringCache()
396  self._default_kws_default_kws = None
397 
399  return self._lib_cache_lib_cache.get_all_cached_library_names()
400 
401  @property
402  default_kws = property
403 
404  def default_kws(self):
405  if self._default_kws_default_kws is None:
406  self._default_kws_default_kws = self._lib_cache_lib_cache.get_default_keywords()
407  return self._default_kws_default_kws
408 
409  def expire_cache(self):
410  self.keyword_cachekeyword_cache = ExpiringCache()
411  self._lib_cache_lib_cache.expire()
412 
413  def get_keywords_from_several(self, datafiles):
414  kws = set()
415  kws.update(self.default_kwsdefault_kwsdefault_kws)
416  for df in datafiles:
417  kws.update(self.get_keywords_fromget_keywords_from(df, RetrieverContext()))
418  return kws
419 
420  def get_keywords_from(self, datafile, ctx):
421  self._get_vars_recursive_get_vars_recursive(datafile, ctx)
422  ctx.allow_going_through_resources_again()
423  return sorted(set(
424  self._get_datafile_keywords_get_datafile_keywords(datafile) +
425  self._get_imported_resource_keywords_get_imported_resource_keywords(datafile, ctx) +
426  self._get_imported_library_keywords_get_imported_library_keywords(datafile, ctx)))
427 
428  def is_library_import_ok(self, datafile, imp, ctx):
429  self._get_vars_recursive_get_vars_recursive(datafile, ctx)
430  return bool(self._lib_kw_getter_lib_kw_getter(imp, ctx))
431 
432  def is_variables_import_ok(self, datafile, imp, ctx):
433  self._get_vars_recursive_get_vars_recursive(datafile, ctx)
434  # print("DEBUG: Namespace is_variables_import_ok %s\n" % datafile.source)
435  return self._import_vars_import_vars(ctx, datafile, imp)
436 
437  def _get_datafile_keywords(self, datafile):
438  if isinstance(datafile, robotapi.ResourceFile):
439  return [ResourceUserKeywordInfo(kw) for kw in datafile.keywords]
440  return [TestCaseUserKeywordInfo(kw) for kw in datafile.keywords]
441 
442  def _get_imported_library_keywords(self, datafile, ctx):
443  return self._collect_kws_from_imports_collect_kws_from_imports(datafile, robotapi.Library,
444  self._lib_kw_getter_lib_kw_getter, ctx)
445 
446  def _collect_kws_from_imports(self, datafile, instance_type, getter, ctx):
447  kws = []
448  for imp in self._collect_import_of_type_collect_import_of_type(datafile, instance_type):
449  kws.extend(getter(imp, ctx))
450  return kws
451 
452  def _lib_kw_getter(self, imp, ctx):
453  # update cur dir for recursive import
454  self._namespace_namespace.update_cur_dir_global_var(imp.directory)
455  name = ctx.replace_variables(imp.name)
456  name = self._convert_to_absolute_path_convert_to_absolute_path(name, imp)
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)
460 
461  @staticmethod
462  def _convert_to_absolute_path(name, import_):
463  full_name = os.path.join(import_.directory, name)
464  if os.path.exists(full_name):
465  return full_name
466  return name
467 
468  @staticmethod
469  def _collect_import_of_type(datafile, instance_type):
470  return [imp for imp in datafile.imports
471  if isinstance(imp, instance_type)]
472 
473  def _get_imported_resource_keywords(self, datafile, ctx):
474  return self._collect_kws_from_imports_collect_kws_from_imports(datafile, robotapi.Resource,
475  self._res_kw_recursive_getter_res_kw_recursive_getter,
476  ctx)
477 
478  def _res_kw_recursive_getter(self, imp, ctx):
479  kws = []
480  res = self._resource_factory_resource_factory.get_resource_from_import(imp, ctx)
481  if not res or res in ctx.parsed:
482  return kws
483  ctx.parsed.add(res)
484  ctx.set_variables_from_datafile_variable_table(res)
485  for child in self._collect_import_of_type_collect_import_of_type(res, robotapi.Resource):
486  kws.extend(self._res_kw_recursive_getter_res_kw_recursive_getter(child, ctx))
487  kws.extend(self._get_imported_library_keywords_get_imported_library_keywords(res, ctx))
488  return [ResourceUserKeywordInfo(kw) for kw in res.keywords] + kws
489 
490  def get_variables_from(self, datafile, ctx=None):
491  return self._get_vars_recursive_get_vars_recursive(datafile,
492  ctx or RetrieverContext()).vars
493 
494  def _get_vars_recursive(self, datafile, ctx):
495  ctx.set_variables_from_datafile_variable_table(datafile)
496  self._collect_vars_from_variable_files_collect_vars_from_variable_files(datafile, ctx)
497  self._collect_each_res_import_collect_each_res_import(datafile, ctx, self._var_collector_var_collector)
498  return ctx
499 
500  def _collect_vars_from_variable_files(self, datafile, ctx):
501  for imp in self._collect_import_of_type_collect_import_of_type(datafile, robotapi.Variables):
502  self._import_vars_import_vars(ctx, datafile, imp)
503 
504  @staticmethod
505  def _import_vars(ctx, datafile, imp):
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]
509  # print("DEBUG: Namespace _import_vars: %s args %s\n" % (varfile_path, args))
510  try:
511  ctx.vars.set_from_file(varfile_path, args)
512  return True
513  except Exception as e: # robotapi.DataError as e:
514  # print("DEBUG: Namespace Error at import_vars: %s\n" % str(e))
515  return False # TODO: log somewhere
516 
517  def _var_collector(self, res, ctx, items):
518  self._get_vars_recursive_get_vars_recursive(res, ctx)
519 
520  def get_keywords_cached(self, datafile, context_factory):
521  values = self.keyword_cachekeyword_cache.get(datafile.source)
522  if not values:
523  words = self.get_keywords_fromget_keywords_from(
524  datafile, context_factory.ctx_for_datafile(datafile))
525  words.extend(self.default_kwsdefault_kwsdefault_kws)
526  values = _Keywords(words)
527  self.keyword_cachekeyword_cache.put(datafile.source, values)
528  return values
529 
530  def _get_user_keywords_from(self, datafile):
531  return list(self._get_user_keywords_recursive_get_user_keywords_recursive(datafile,
532  RetrieverContext()))
533 
534  def _get_user_keywords_recursive(self, datafile, ctx):
535  kws = set()
536  kws.update(datafile.keywords)
537  kws_from_res = self._collect_each_res_import_collect_each_res_import(
538  datafile, ctx,
539  lambda res, ctx, kws:
540  kws.update(self._get_user_keywords_recursive_get_user_keywords_recursive(res, ctx)))
541  kws.update(kws_from_res)
542  return kws
543 
544  def _collect_each_res_import(self, datafile, ctx, collector):
545  items = set()
546  ctx.set_variables_from_datafile_variable_table(datafile)
547  for imp in self._collect_import_of_type_collect_import_of_type(datafile, robotapi.Resource):
548  res = self._resource_factory_resource_factory.get_resource_from_import(imp, ctx)
549  if res and res not in ctx.parsed:
550  ctx.parsed.add(res)
551  collector(res, ctx, items)
552  return items
553 
554  def get_resources_from(self, datafile):
555  resources = list(self._get_resources_recursive_get_resources_recursive(datafile,
556  RetrieverContext()))
557  resources.sort(key=operator.attrgetter('name'))
558  return resources # DEBUG
559 
560  def _get_resources_recursive(self, datafile, ctx):
561  resources = set()
562  res = self._collect_each_res_import_collect_each_res_import(datafile, ctx, self._add_resource_add_resource)
563  resources.update(res)
564  for child in datafile.children:
565  resources.update(self._get_resources_recursive_get_resources_recursive(child, ctx))
566  return resources
567 
568  def _add_resource(self, res, ctx, items):
569  items.add(res)
570  items.update(self._get_resources_recursive_get_resources_recursive(res, ctx))
571 
572 
573 class _Keywords():
574 
575  regexp = re.compile("\s*(given|when|then|and|but)\s*(.*)", re.IGNORECASE)
576 
577  def __init__(self, keywords):
578  self.keywordskeywords = robotapi.NormalizedDict(ignore=['_'])
579  self.embedded_keywordsembedded_keywords = {}
580  self._add_keywords_add_keywords(keywords)
581 
582  def _add_keywords(self, keywords):
583  for kw in keywords:
584  self._add_keyword_add_keyword(kw)
585 
586  def _add_keyword(self, kw):
587  # TODO: this hack creates a preference for local keywords over
588  # resources and libraries Namespace should be rewritten to handle
589  # keyword preference order
590  if kw.name not in self.keywordskeywords:
591  self.keywordskeywords[kw.name] = kw
592  self._add_embedded_add_embedded(kw)
593  self.keywordskeywords[kw.longname] = kw
594 
595  def _add_embedded(self, kw):
596  if '$' not in kw.name:
597  return
598  try:
599  handler = EmbeddedArgsHandler(kw)
600  self.embedded_keywordsembedded_keywords[handler.name_regexp] = kw
601  except Exception:
602  pass
603 
604  def get(self, kw_name):
605  if kw_name in self.keywordskeywords:
606  return self.keywordskeywords[kw_name]
607  bdd_name = self._get_bdd_name_get_bdd_name(kw_name)
608  if bdd_name and bdd_name in self.keywordskeywords:
609  return self.keywordskeywords[bdd_name]
610  for regexp in self.embedded_keywordsembedded_keywords:
611  if regexp.match(kw_name) or (bdd_name and regexp.match(bdd_name)):
612  return self.embedded_keywordsembedded_keywords[regexp]
613  return None
614 
615  def _get_bdd_name(self, kw_name):
616  match = self.regexpregexp.match(kw_name)
617  return match.group(2) if match else None
Used when variable does not exist.
Definition: errors.py:67
The parsed resource file object.
Definition: model.py:254
Custom dictionary implementation automatically normalizing keys.
Definition: normalizing.py:58
def _get_imported_resource_keywords(self, datafile, ctx)
Definition: namespace.py:473
def get_keywords_cached(self, datafile, context_factory)
Definition: namespace.py:520
def _collect_vars_from_variable_files(self, datafile, ctx)
Definition: namespace.py:500
def _get_vars_recursive(self, datafile, ctx)
Definition: namespace.py:494
def is_variables_import_ok(self, datafile, imp, ctx)
Definition: namespace.py:432
def _add_resource(self, res, ctx, items)
Definition: namespace.py:568
def _collect_kws_from_imports(self, datafile, instance_type, getter, ctx)
Definition: namespace.py:446
def __init__(self, lib_cache, resource_factory, namespace)
Definition: namespace.py:391
def get_keywords_from(self, datafile, ctx)
Definition: namespace.py:420
def _get_resources_recursive(self, datafile, ctx)
Definition: namespace.py:560
def _get_imported_library_keywords(self, datafile, ctx)
Definition: namespace.py:442
def _var_collector(self, res, ctx, items)
Definition: namespace.py:517
def _collect_each_res_import(self, datafile, ctx, collector)
Definition: namespace.py:544
def _collect_import_of_type(datafile, instance_type)
Definition: namespace.py:469
def is_library_import_ok(self, datafile, imp, ctx)
Definition: namespace.py:428
def get_variables_from(self, datafile, ctx=None)
Definition: namespace.py:490
def _get_user_keywords_recursive(self, datafile, ctx)
Definition: namespace.py:534
def update_cur_dir_global_var(self, cur_dir)
Definition: namespace.py:79
def _keyword_suggestions(self, datafile, start, ctx)
Definition: namespace.py:166
def find_user_keyword(self, datafile, kw_name)
Definition: namespace.py:189
def set_library_manager(self, library_manager)
Definition: namespace.py:83
def is_library_keyword(self, datafile, kw_name)
Definition: namespace.py:215
def find_keyword(self, datafile, kw_name)
Definition: namespace.py:208
def _add_kw_arg_vars(controller, variables)
Definition: namespace.py:162
def resource_filename_changed(self, old_name, new_name)
Definition: namespace.py:93
def get_all_keywords(self, testsuites)
Definition: namespace.py:112
def _variable_suggestions(self, controller, start, ctx)
Definition: namespace.py:154
def unregister_update_listener(self, listener)
Definition: namespace.py:102
def _setting_changed(self, message)
Definition: namespace.py:67
def _set_pythonpath(self)
Add user configured paths to PYTHONAPATH.
Definition: namespace.py:57
def get_suggestions_for(self, controller, start)
Definition: namespace.py:121
def _get_suggestions_from_hooks(self, datafile, start)
Definition: namespace.py:135
def new_resource(self, path, directory='')
Definition: namespace.py:186
def is_library_import_ok(self, datafile, imp)
Definition: namespace.py:200
def keyword_details(self, datafile, name)
Definition: namespace.py:218
def register_content_assist_hook(self, hook)
Definition: namespace.py:109
def find_library_keyword(self, datafile, kw_name)
Definition: namespace.py:196
def is_user_keyword(self, datafile, kw_name)
Definition: namespace.py:193
def register_update_listener(self, listener)
Definition: namespace.py:99
def is_variables_import_ok(self, datafile, imp)
Definition: namespace.py:204
def get_resource(self, path, directory='', report_status=True)
Definition: namespace.py:177
def update_exec_dir_global_var(self, exec_dir)
Definition: namespace.py:75
def set_variables_from_datafile_variable_table(self, datafile)
Definition: namespace.py:251
def allow_going_through_resources_again(self)
Resets the parsed resources cache.
Definition: namespace.py:264
def set_from_file(self, varfile_path, args)
Definition: namespace.py:360
def set(self, name, value, source)
Definition: namespace.py:318
def set_from_variable_table(self, variable_table)
Definition: namespace.py:331
This class represents a general purpose log message.
Definition: messages.py:96