Skip to content

Commit 6c94753

Browse files
committed
Refactoring
1 parent 19e3f03 commit 6c94753

File tree

2 files changed

+70
-30
lines changed

2 files changed

+70
-30
lines changed

robotframework_reportportal/listener.py

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,29 @@ def wrap(*args, **kwargs):
9292
return wrap
9393

9494

95-
# noinspection PyPep8Naming
95+
def process_keyword_names_and_tags(matcher_list: List[KeywordMatch], pattern_str: str) -> None:
96+
"""Pick name or pattern string, parse it and add to the matcher list.
97+
98+
:param matcher_list: List of keyword matchers to add to
99+
:param pattern_str: Pattern string passed to `--remove-keywords` or `--flatten-keywords` argument
100+
"""
101+
if ":" in pattern_str:
102+
pattern_type, pattern = pattern_str.split(":", 1)
103+
pattern_type = pattern_type.strip().upper()
104+
if "NAME" == pattern_type.upper():
105+
matcher_list.append(KeywordNameMatch(pattern.strip()))
106+
elif "TAG" == pattern_type.upper():
107+
matcher_list.append(KeywordTagMatch(pattern.strip()))
108+
109+
96110
class listener:
97111
"""Robot Framework listener interface for reporting to ReportPortal."""
98112

99113
_items: LifoQueue[Union[Keyword, Launch, Suite, Test]]
100114
_service: Optional[RobotService]
101115
_variables: Optional[Variables]
102116
_remove_keyword_filters: List[KeywordMatch] = []
117+
_flatten_keyword_filters: List[KeywordMatch] = []
103118
_remove_all_keyword_content: bool = False
104119
_remove_data_passed_tests: bool = False
105120
ROBOT_LISTENER_API_VERSION = 2
@@ -321,13 +336,28 @@ def _process_keyword_remove(self):
321336
else:
322337
self._remove_keyword_filters.append(WHILE_KEYWORD_MATCH)
323338
continue
324-
if ":" in pattern_str:
325-
pattern_type, pattern = pattern_str.split(":", 1)
326-
pattern_type = pattern_type.strip().upper()
327-
if "NAME" == pattern_type.upper():
328-
self._remove_keyword_filters.append(KeywordNameMatch(pattern.strip()))
329-
elif "TAG" == pattern_type.upper():
330-
self._remove_keyword_filters.append(KeywordTagMatch(pattern.strip()))
339+
process_keyword_names_and_tags(self._remove_keyword_filters, pattern_str)
340+
341+
def _process_keyword_flatten(self):
342+
if not self.variables.flatten_keywords:
343+
return
344+
345+
self._flatten_keyword_filters = []
346+
current_context = EXECUTION_CONTEXTS.current
347+
if current_context:
348+
# noinspection PyProtectedMember
349+
for pattern_str in set(current_context.output._settings.flatten_keywords):
350+
pattern_str_upper = pattern_str.upper()
351+
if pattern_str_upper in {"FOR", "WHILE", "ITERATION", "FORITEM"}:
352+
if pattern_str_upper == "FOR":
353+
self._flatten_keyword_filters.append(FOR_KEYWORD_MATCH)
354+
elif pattern_str_upper == "WHILE":
355+
self._flatten_keyword_filters.append(WHILE_KEYWORD_MATCH)
356+
else:
357+
self._flatten_keyword_filters.append(FOR_KEYWORD_MATCH)
358+
self._flatten_keyword_filters.append(WHILE_KEYWORD_MATCH)
359+
continue
360+
process_keyword_names_and_tags(self._flatten_keyword_filters, pattern_str)
331361

332362
def start_launch(self, attributes: Dict[str, Any], ts: Optional[Any] = None) -> None:
333363
"""Start a new launch at the ReportPortal.
@@ -336,6 +366,7 @@ def start_launch(self, attributes: Dict[str, Any], ts: Optional[Any] = None) ->
336366
:param ts: Timestamp(used by the ResultVisitor)
337367
"""
338368
self._process_keyword_remove()
369+
self._process_keyword_flatten()
339370

340371
launch = Launch(self.variables.launch_name, attributes, self.variables.launch_attributes)
341372
launch.doc = self.variables.launch_doc or launch.doc
@@ -410,6 +441,9 @@ def start_test(self, name: str, attributes: Dict, ts: Optional[Any] = None) -> N
410441
test.rp_item_id = self.service.start_test(test=test, ts=ts)
411442
self._add_current_item(test)
412443

444+
def _log_keyword_content_removed(self, item_id: str, timestamp: str) -> None:
445+
self._log_data_removed(item_id, timestamp, REMOVED_KEYWORD_CONTENT_LOG)
446+
413447
@check_rp_enabled
414448
def end_test(self, _: Optional[str], attributes: Dict, ts: Optional[Any] = None) -> None:
415449
"""Finish started test case at the ReportPortal.
@@ -437,14 +471,20 @@ def _log_data_removed(self, item_id: str, timestamp: str, message: str) -> None:
437471
msg.timestamp = timestamp
438472
self.__post_log_message(msg)
439473

440-
def _log_keyword_content_removed(self, item_id: str, timestamp: str) -> None:
441-
self._log_data_removed(item_id, timestamp, REMOVED_KEYWORD_CONTENT_LOG)
442-
443474
def _do_start_keyword(self, keyword: Keyword, ts: Optional[str] = None) -> None:
444475
logger.debug(f"ReportPortal - Start Keyword: {keyword.robot_attributes}")
445476
keyword.rp_item_id = self.service.start_keyword(keyword=keyword, ts=ts)
446477
keyword.posted = True
447478

479+
def _should_remove(self, keyword: Keyword) -> Optional[KeywordMatch]:
480+
for matcher in self._remove_keyword_filters:
481+
if matcher.match(keyword):
482+
return matcher
483+
return None
484+
485+
def _should_flatten(self, keyword: Keyword) -> bool:
486+
return any(matcher.match(keyword) for matcher in self._flatten_keyword_filters)
487+
448488
@check_rp_enabled
449489
def start_keyword(self, name: str, attributes: Dict, ts: Optional[Any] = None) -> None:
450490
"""Start a new keyword(test step) at the ReportPortal.
@@ -453,22 +493,21 @@ def start_keyword(self, name: str, attributes: Dict, ts: Optional[Any] = None) -
453493
:param attributes: Dictionary passed by the Robot Framework
454494
:param ts: Timestamp(used by the ResultVisitor)
455495
"""
456-
kwd = Keyword(name, attributes, self.current_item)
457496
parent = self.current_item
497+
kwd = Keyword(name, attributes, parent)
458498
remove_kwd = parent.remove_data
459499
skip_data = self._remove_all_keyword_content or self._remove_data_passed_tests
460500
kwd.remove_data = remove_kwd or skip_data
461501

462502
if kwd.remove_data:
463-
kwd.matched_filter = getattr(parent, "matched_filter", None)
464-
kwd.skip_origin = getattr(parent, "skip_origin", None)
503+
kwd.remove_filter = parent.remove_filter
504+
kwd.remove_origin = parent.remove_origin
465505
else:
466-
for m in self._remove_keyword_filters:
467-
if m.match(kwd):
468-
kwd.remove_data = True
469-
kwd.matched_filter = m
470-
kwd.skip_origin = kwd
471-
break
506+
m = self._should_remove(kwd)
507+
if m:
508+
kwd.remove_data = True
509+
kwd.remove_filter = m
510+
kwd.remove_origin = kwd
472511

473512
if remove_kwd:
474513
kwd.rp_item_id = str(uuid.uuid4())
@@ -477,7 +516,7 @@ def start_keyword(self, name: str, attributes: Dict, ts: Optional[Any] = None) -
477516
else:
478517
self._do_start_keyword(kwd, ts)
479518
if skip_data:
480-
kwd.skip_origin = kwd
519+
kwd.remove_origin = kwd
481520
if self._remove_data_passed_tests:
482521
parent.skipped_keywords.append(kwd)
483522

@@ -497,7 +536,7 @@ def end_keyword(self, _: Optional[str], attributes: Dict, ts: Optional[Any] = No
497536
"""
498537
kwd = self.current_item.update(attributes)
499538

500-
if kwd.matched_filter is WUKS_KEYWORD_MATCH and kwd.skip_origin is kwd:
539+
if kwd.remove_filter is WUKS_KEYWORD_MATCH and kwd.remove_origin is kwd:
501540
skipped_keywords = kwd.skipped_keywords
502541
skipped_keywords_num = len(skipped_keywords)
503542
if skipped_keywords_num > 2:
@@ -516,8 +555,8 @@ def end_keyword(self, _: Optional[str], attributes: Dict, ts: Optional[Any] = No
516555
self._do_end_keyword(last_iteration, ts)
517556

518557
elif (
519-
(kwd.matched_filter is FOR_KEYWORD_MATCH) or (kwd.matched_filter is WHILE_KEYWORD_MATCH)
520-
) and kwd.skip_origin is kwd:
558+
(kwd.remove_filter is FOR_KEYWORD_MATCH) or (kwd.remove_filter is WHILE_KEYWORD_MATCH)
559+
) and kwd.remove_origin is kwd:
521560
skipped_keywords = kwd.skipped_keywords
522561
skipped_keywords_num = len(skipped_keywords)
523562
if skipped_keywords_num > 1:
@@ -529,7 +568,7 @@ def end_keyword(self, _: Optional[str], attributes: Dict, ts: Optional[Any] = No
529568
last_iteration = kwd.skipped_keywords[-1]
530569
self._post_skipped_keywords(last_iteration)
531570
self._do_end_keyword(last_iteration, ts)
532-
elif kwd.posted and kwd.remove_data and kwd.skip_origin is kwd:
571+
elif kwd.posted and kwd.remove_data and kwd.remove_origin is kwd:
533572
if (self._remove_all_keyword_content or not self._remove_data_passed_tests) and (
534573
kwd.skipped_keywords or kwd.skipped_logs
535574
):

robotframework_reportportal/model.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class Entity:
3131

3232
type: str
3333
remove_data: bool
34+
flattened: bool
35+
remove_filter: Optional[Any]
36+
remove_origin: Optional[Any]
3437
rp_item_id: Optional[str]
3538
parent: Optional["Entity"]
3639

@@ -44,6 +47,9 @@ def __init__(self, entity_type: str, parent: Optional["Entity"]):
4447
self.parent = parent
4548
self.rp_item_id = None
4649
self.remove_data = False
50+
self.flattened = False
51+
self.remove_filter = None
52+
self.remove_origin = None
4753

4854
@property
4955
def rp_parent_item_id(self):
@@ -90,9 +96,6 @@ class Keyword(Entity):
9096
skipped_logs: List[LogMessage]
9197
skipped_keywords: List["Keyword"]
9298
posted: bool
93-
remove_data: bool
94-
matched_filter: Optional[Any]
95-
skip_origin: Optional[Any]
9699

97100
def __init__(self, name: str, robot_attributes: Dict[str, Any], parent: Entity):
98101
"""Initialize required attributes.
@@ -118,8 +121,6 @@ def __init__(self, name: str, robot_attributes: Dict[str, Any], parent: Entity):
118121
self.skipped_keywords = []
119122
self.skipped_logs = []
120123
self.posted = True
121-
self.matched_filter = None
122-
self.skip_origin = None
123124

124125
def get_name(self) -> str:
125126
"""Get name of the keyword suitable for ReportPortal."""

0 commit comments

Comments
 (0)