Skip to content

Commit d0140a5

Browse files
committed
Feature/39 - Robot Framework 4.0 support (salabs#39)
1 parent 30869a7 commit d0140a5

File tree

8 files changed

+77
-20
lines changed

8 files changed

+77
-20
lines changed

Diff for: .github/workflows/basic_pipeline.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
python -m pip install --upgrade pip
2525
pip install pylint==2.4.4 pytest mock testarchiver
2626
pip install setuptools wheel
27-
pip install robotframework==3.2.2
27+
pip install robotframework~=4.0
2828
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
2929
- name: Lint with pylint
3030
run: |

Diff for: robot_tests/tests/loop_suite/for_tests.robot

-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
*** Settings ***
22
Library String
33
Force tags loops
4-
Test setup Log foo
5-
Test teardown Log foo
64

75
*** Test Cases ***
86
For-Loop-In-Range

Diff for: robot_tests/tests/top_suite/conditonal.robot

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
*** Settings ***
2+
Force tags ifelse rf4
3+
4+
*** Test cases ***
5+
This test contains if else structures
6+
Log negative or positive number -2
7+
Log negative or positive number 3
8+
Log negative or positive number 0
9+
10+
*** Keywords ***
11+
Log negative or positive number
12+
[Arguments] ${value}
13+
IF ${value} < 0
14+
Log The value is zero.
15+
ELSE IF ${value} > 0
16+
Log The value is zero.
17+
ELSE
18+
Log The value is zero.
19+
END

Diff for: robot_tests/tests/top_suite/lower_suite/embedded.robot

-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ Template and for loops
1616
FOR ${item} IN @{ITEMS}
1717
${item} Robot
1818
END
19-
FOR ${index} IN RANGE 5
20-
Framework @{ITEMS}[${index}]
21-
END
2219

2320
*** Keywords ***
2421
The result of ${calculation} should be ${expected}

Diff for: robot_tests/tests/top_suite/skipping.robot

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
*** Settings ***
2+
Resource common_keywords.robot
3+
Force tags skipping rf4
4+
5+
*** Test cases ***
6+
This test is skipped after doing something
7+
Do nothing twice
8+
Skip This is skipped
9+
10+
This test is skipped in setup
11+
[Setup] Skip This is skipped
12+
Do nothing twice
13+
14+
This test is skipped in teardown
15+
Do nothing twice
16+
[Teardown] Skip This is skipped

Diff for: test_archiver/ArchiverRobotListener.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@ def end_test(self, name, attrs):
4949
self.archiver.end_test(attrs)
5050

5151
def start_keyword(self, name, attrs):
52-
self.archiver.begin_keyword(attrs['kwname'], attrs['libname'], attrs['type'], attrs['args'])
52+
kw_type = attrs['type']
53+
contol_structure = kw_type.lower() in ('if', 'else if', 'else', 'for', 'for iteration')
54+
name = attrs['type'] if contol_structure else attrs['kwname']
55+
library = attrs['libname']
56+
arguments = [attrs['kwname']] if contol_structure else attrs['args']
57+
arguments = [] if len(arguments) == 1 and arguments[0] == '' else arguments
58+
self.archiver.begin_keyword(name, library, kw_type, arguments)
5359

5460
def end_keyword(self, name, attrs):
5561
self.archiver.end_keyword(attrs)

Diff for: test_archiver/configs.py

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def parse_key_value_pairs(values):
3030
LOG_LEVEL_MAP["DEBUG"] = 10
3131
LOG_LEVEL_MAP["INFO"] = 20
3232
LOG_LEVEL_MAP["WARN"] = 30
33+
LOG_LEVEL_MAP["SKIP"] = 30
3334
LOG_LEVEL_MAP["ERROR"] = 40
3435
LOG_LEVEL_MAP["FAIL"] = 50
3536

Diff for: test_archiver/output_parser.py

+33-13
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
# pylint: disable=R0912,R0915
22

3+
import datetime
34
import os.path
45
import sys
56
import xml.sax
6-
import datetime
7+
78
from . import archiver, configs
89

910
DEFAULT_SUITE_NAME = 'Unnamed suite'
1011

1112

1213
class XmlOutputParser(xml.sax.handler.ContentHandler):
1314
def __init__(self, archiver_instance):
14-
super(XmlOutputParser, self).__init__()
15+
super().__init__()
1516
self.archiver = archiver_instance
1617
self._current_content = []
1718
self.excluding = False
@@ -39,7 +40,7 @@ class RobotFrameworkOutputParser(XmlOutputParser):
3940
EXCLUDED_SECTIONS = ('statistics', 'errors')
4041

4142
def __init__(self, archiver_instance):
42-
super(RobotFrameworkOutputParser, self).__init__(archiver_instance)
43+
super().__init__(archiver_instance)
4344
self.archiver.test_type = "Robot Framework"
4445

4546
def startElement(self, name, attrs):
@@ -53,19 +54,32 @@ def startElement(self, name, attrs):
5354
attrs.get('generator'),
5455
attrs.get('rpa') if 'rpa' in attrs.getNames() else False,
5556
None,
56-
)
57+
)
5758
elif name == 'suite':
5859
execution_path = attrs.getValue('id') if 'id' in attrs.getNames() else None
5960
self.archiver.begin_suite(attrs.getValue('name'), execution_path=execution_path)
6061
elif name == 'test':
6162
execution_path = attrs.getValue('id') if 'id' in attrs.getNames() else None
6263
self.archiver.begin_test(attrs.getValue('name'), execution_path=execution_path)
6364
elif name == 'kw':
64-
name = attrs.getValue('name') if 'name' in attrs.getNames() else '${EMPTY}'
65+
name = attrs.getValue('name') if 'name' in attrs.getNames() else ''
6566
kw_type = attrs.getValue('type') if 'type' in attrs.getNames() else 'Keyword'
6667
library = attrs.getValue('library') if 'library' in attrs.getNames() else ''
6768
self.archiver.begin_keyword(name, library, kw_type)
68-
# self.archiver.set_execution_path(attrs.getValue('id'))
69+
elif name == 'for':
70+
self.archiver.begin_keyword('FOR', '', 'FOR')
71+
self.archiver.update_arguments(attrs.getValue('flavor'))
72+
elif name == 'iter':
73+
self.archiver.begin_keyword('FOR ITERATION', '', 'FOR ITERATION')
74+
elif name == 'branch':
75+
self.archiver.begin_keyword(attrs.getValue('type'), '', attrs.getValue('type'))
76+
if 'condition' in attrs.getNames():
77+
self.archiver.update_arguments(attrs.getValue('condition'))
78+
elif name == 'var':
79+
if 'name' in attrs.getNames():
80+
self.archiver.update_arguments(attrs.getValue('name'))
81+
elif name == 'value':
82+
pass
6983
elif name == 'arg':
7084
pass
7185
elif name == 'msg':
@@ -78,19 +92,17 @@ def startElement(self, name, attrs):
7892
attrs.getValue('endtime'), critical=critical)
7993
elif name == 'assign':
8094
pass
81-
elif name == 'var':
82-
pass
8395
elif name == 'timeout':
8496
pass
8597
elif name == 'tag':
8698
pass
87-
elif name == 'item': # metadata item
99+
elif name == 'item': # metadata item # <RF4.0
88100
self.archiver.begin_metadata(attrs.getValue('name'))
89101
elif name == 'meta': # metadata item # RF4.0
90102
self.archiver.begin_metadata(attrs.getValue('name'))
91103
elif name == 'doc':
92104
pass
93-
elif name in ('arguments', 'tags', 'metadata', 'for', 'iter', 'value'):
105+
elif name in ('arguments', 'tags', 'metadata', 'if'):
94106
pass
95107
else:
96108
print("WARNING: begin unknown item '{}'".format(name))
@@ -108,6 +120,12 @@ def endElement(self, name):
108120
self.archiver.end_test()
109121
elif name == 'kw':
110122
self.archiver.end_keyword()
123+
elif name == 'for':
124+
self.archiver.end_keyword()
125+
elif name == 'iter':
126+
self.archiver.end_keyword()
127+
elif name == 'branch':
128+
self.archiver.end_keyword()
111129
elif name == 'arg':
112130
self.archiver.update_arguments(self.content())
113131
elif name == 'msg':
@@ -118,7 +136,9 @@ def endElement(self, name):
118136
elif name == 'assign':
119137
pass
120138
elif name == 'var':
121-
pass
139+
self.archiver.update_arguments(self.content())
140+
elif name == 'value':
141+
self.archiver.update_arguments(self.content())
122142
elif name == 'timeout':
123143
pass
124144
elif name == 'tag':
@@ -130,7 +150,7 @@ def endElement(self, name):
130150
self.archiver.end_metadata(self.content())
131151
elif name == 'doc':
132152
pass
133-
elif name in ('arguments', 'tags', 'metadata', 'for', 'iter', 'value'):
153+
elif name in ('arguments', 'tags', 'metadata', 'if'):
134154
pass
135155
else:
136156
print("WARNING: ending unknown item '{}'".format(name))
@@ -785,7 +805,7 @@ def argument_parser():
785805
"context": "The execution context, same as --execution-context and command line will override this setting.",
786806
"changes": [
787807
{
788-
"name": "string representing the changed item, for example file path",
808+
"name": "string representing the changed item, for example file path",
789809
"repository": "Repository (optional), for separating between changed items with identical names.",
790810
"item_type": "Separating items (optional) and for filtering subsets when prioritising",
791811
"subtype": "(optional, for separating items for filtering subsets when prioritising"

0 commit comments

Comments
 (0)