Skip to content

Commit b7be0d9

Browse files
committed
fix leaking keywords names
Fixes #146
1 parent 8b756a4 commit b7be0d9

File tree

4 files changed

+41
-13
lines changed

4 files changed

+41
-13
lines changed

atest/SmallLibrary.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
from robot.api import logger
55
from robotlibcore import DynamicCore, keyword
66

7+
class KeywordClass:
8+
9+
@keyword(name="Execute SomeThing")
10+
def execute_something(self):
11+
"""This is old"""
12+
print("Name is here")
13+
714
class SmallLibrary(DynamicCore):
815
"""Library documentation."""
916

@@ -12,10 +19,7 @@ def __init__(self, translation: Optional[Path] = None):
1219
if not isinstance(translation, Path):
1320
logger.warn("Convert to Path")
1421
translation = Path(translation)
15-
logger.warn(translation.absolute())
16-
logger.warn(type(translation))
17-
18-
DynamicCore.__init__(self, [], translation.absolute())
22+
DynamicCore.__init__(self, [KeywordClass()], translation.absolute())
1923

2024
@keyword(tags=["tag1", "tag2"])
2125
def normal_keyword(self, arg: int, other: str) -> str:
@@ -32,7 +36,7 @@ def not_keyword(self, data: str) -> str:
3236
print(data)
3337
return data
3438

35-
@keyword(name="This Is New Name", tags=["tag1", "tag2"])
39+
@keyword(name="Name ChanGed", tags=["tag1", "tag2"])
3640
def name_changed(self, some: int, other: int) -> int:
3741
"""This one too"""
3842
print(f"{some} {type(some)}, {other} {type(other)}")

atest/translation.json

+4
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,9 @@
2121
,
2222
"kw_not_translated": {
2323
"doc": "Here is new doc"
24+
},
25+
"execute_something": {
26+
"name": "tee_jotain",
27+
"doc": "Uusi kirja."
2428
}
2529
}

src/robotlibcore.py

+20-8
Original file line numberDiff line numberDiff line change
@@ -57,35 +57,47 @@ def _translation(translation: Optional[Path] = None):
5757
return {}
5858

5959

60+
def _translated_keywords(translation_data: dict) -> list:
61+
return [item.get("name") for item in translation_data.values() if item.get("name")]
62+
63+
6064
class HybridCore:
6165
def __init__(self, library_components: List, translation: Optional[Path] = None) -> None:
6266
self.keywords = {}
6367
self.keywords_spec = {}
6468
self.attributes = {}
6569
translation_data = _translation(translation)
66-
self.add_library_components(library_components, translation_data)
67-
self.add_library_components([self], translation_data)
70+
translated_kw_names = _translated_keywords(translation_data)
71+
self.add_library_components(library_components, translation_data, translated_kw_names)
72+
self.add_library_components([self], translation_data, translated_kw_names)
6873
self.__set_library_listeners(library_components)
6974

70-
def add_library_components(self, library_components: List, translation: Optional[dict] = None):
75+
def add_library_components(
76+
self,
77+
library_components: List,
78+
translation: Optional[dict] = None,
79+
translated_kw_names: Optional[list] = None,
80+
):
7181
translation = translation if translation else {}
82+
translated_kw_names = translated_kw_names if translated_kw_names else []
7283
self.keywords_spec["__init__"] = KeywordBuilder.build(self.__init__, translation) # type: ignore
7384
self.__replace_intro_doc(translation)
7485
for component in library_components:
7586
for name, func in self.__get_members(component):
7687
if callable(func) and hasattr(func, "robot_name"):
7788
kw = getattr(component, name)
78-
kw_name = self.__get_keyword_name(func, name, translation)
89+
kw_name = self.__get_keyword_name(func, name, translation, translated_kw_names)
7990
self.keywords[kw_name] = kw
8091
self.keywords_spec[kw_name] = KeywordBuilder.build(kw, translation)
8192
# Expose keywords as attributes both using original
8293
# method names as well as possible custom names.
8394
self.attributes[name] = self.attributes[kw_name] = kw
8495

85-
def __get_keyword_name(self, func: Callable, name: str, translation: dict):
86-
if name in translation: # noqa: SIM102
87-
if new_name := translation[name].get("name"):
88-
return new_name
96+
def __get_keyword_name(self, func: Callable, name: str, translation: dict, translated_kw_names: list):
97+
if name in translated_kw_names:
98+
return name
99+
if name in translation and translation[name].get("name"):
100+
return translation[name].get("name")
89101
return func.robot_name or name
90102

91103
def __replace_intro_doc(self, translation: dict):

utest/test_translations.py

+8
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,11 @@ def test_kw_not_translated_but_doc_is(lib: SmallLibrary):
5757
assert "kw_not_translated" in keywords
5858
doc = lib.get_keyword_documentation("kw_not_translated")
5959
assert doc == "Here is new doc"
60+
61+
62+
def test_rf_name_not_in_keywords():
63+
translation = Path(__file__).parent.parent / "atest" / "translation.json"
64+
lib = SmallLibrary(translation=translation)
65+
kw = lib.keywords
66+
assert "Execute SomeThing" not in kw, f"Execute SomeThing should not be present: {kw}"
67+
assert len(kw) == 6, f"Too many keywords: {kw}"

0 commit comments

Comments
 (0)