Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions src/SeleniumLibrary/base/robotlibcore.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,27 @@ def decorator(func):

PY2 = sys.version_info < (3,)

__version__ = '1.0rc2'
__version__ = '1.0rc3'


class HybridCore(object):

def __init__(self, library_components):
self.keywords = {}
self.attributes = {}
self.add_library_components(library_components)
self.add_library_components([self])

def add_library_components(self, library_components):
for component in library_components:
for name, func in self._get_members(component):
if callable(func) and hasattr(func, 'robot_name'):
kw = getattr(component, name)
kw_name = func.robot_name or name
self.keywords[kw_name] = getattr(component, name)
self.keywords[kw_name] = kw
# Expose keywords as attributes both using original
# method names as well as possible custom names.
self.attributes[name] = self.attributes[kw_name] = kw

def _get_members(self, component):
if inspect.ismodule(component):
Expand All @@ -64,18 +69,18 @@ def _get_members(self, component):
raise TypeError('Libraries must be modules or new-style class '
'instances, got old-style class {!r} instead.'
.format(component.__class__.__name__))
return self._get_members_from_instannce(component)
return self._get_members_from_instance(component)

def _get_members_from_instannce(self, instance):
def _get_members_from_instance(self, instance):
# Avoid calling properties by getting members from class, not instance.
cls = type(instance)
for name in dir(instance):
owner = cls if hasattr(cls, name) else instance
yield name, getattr(owner, name)

def __getattr__(self, name):
if name in self.keywords:
return self.keywords[name]
if name in self.attributes:
return self.attributes[name]
raise AttributeError('{!r} object has no attribute {!r}'
.format(type(self).__name__, name))

Expand All @@ -84,7 +89,7 @@ def __dir__(self):
my_attrs = dir(type(self)) + list(self.__dict__)
else:
my_attrs = super().__dir__()
return sorted(set(my_attrs + list(self.keywords)))
return sorted(set(my_attrs) | set(self.attributes))

def get_keyword_names(self):
return sorted(self.keywords)
Expand Down