Skip to content

Commit eb81075

Browse files
committed
Support reference file parser and custom parser
1 parent fbf9dca commit eb81075

File tree

7 files changed

+113
-10
lines changed

7 files changed

+113
-10
lines changed

ExcelDataDriver/ExcelParser/ABCParserStrategy.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ABCParserStrategy:
1111
def __init__(self):
1212
self.MANDATORY_TEST_DATA_COLUMN = MANDATORY_TEST_DATA_COLUMN
1313
self.DEFAULT_COLUMN_INDEXS = self.MANDATORY_TEST_DATA_COLUMN.values()
14-
self.start_row = 2
14+
self.start_row = 1
1515
self.max_column = 50
1616
self.maximum_column_index_row = 5
1717

@@ -56,8 +56,8 @@ def parsing_column_indexs(self, ws):
5656
continue
5757
for cell in row:
5858
if (cell.value is not None) and (cell.value not in self.DEFAULT_COLUMN_INDEXS):
59-
ws_column_indexs[cell.value.lower().strip()] = column_index_from_string(coordinate_from_string(cell.coordinate)[0])
60-
print('Optional : '+str(cell.value.lower().strip()) + ' : ' + str(cell.coordinate) + ' : ' + str(column_index_from_string(coordinate_from_string(cell.coordinate)[0])))
59+
ws_column_indexs[str(cell.value).lower().strip()] = column_index_from_string(coordinate_from_string(cell.coordinate)[0])
60+
print('Optional : '+str(str(cell.value).lower().strip()) + ' : ' + str(cell.coordinate) + ' : ' + str(column_index_from_string(coordinate_from_string(cell.coordinate)[0])))
6161
break
6262
print('Done parsing column indexes')
6363
return ws_column_indexs

ExcelDataDriver/ExcelParser/DefaultReferenceParserStrategy.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ class DefaultReferenceParserStrategy(ABCParserStrategy):
77
def __init__(self):
88
ABCParserStrategy.__init__(self)
99

10+
def is_ws_column_valid(self, ws, validate_result):
11+
return validate_result
12+
1013
def is_test_data_valid(self, ws_column_indexes, ws_title, row_index, row):
1114
return True
1215

ExcelDataDriver/ExcelParser/ParserContext.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@ def parse(self, wb):
1414
validate_result = {'is_pass': True, 'error_message': ''}
1515

1616
# Validate column
17-
print('Validate column')
17+
print('Validate reference column')
1818
for ws in self.parser_strategy.get_all_worksheet(wb):
1919
validate_result = self.parser_strategy.is_ws_column_valid(ws, validate_result)
2020
if validate_result['is_pass'] is not True:
2121
raise ValueError(validate_result['error_message'])
22-
print('Done validate column')
22+
print('Done validate reference column')
2323

2424
# Parsing test data
25-
print('Parsing test data')
25+
print('Parsing reference data')
2626
ws_test_data_rows = OrderedDict()
2727
for ws in self.parser_strategy.get_all_worksheet(wb):
2828
ws_column_indexs = self.parser_strategy.parsing_column_indexs(ws)
2929
test_data_rows = self.parser_strategy.parse_test_data_properties(ws, ws_column_indexs)
3030
ws_test_data_rows[ws.title] = test_data_rows
31-
print('Done validate test data')
31+
print('Done validate reference data')
3232

3333
return ws_test_data_rows

ExcelDataDriver/ExcelReferenceDataRow/ExcelReferenceDataRow.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def __init__(self, excel_title, excel_row_index, excel_row, column_indexes):
1414
if self.row_no is None:
1515
self.row_no = excel_row[column_indexes[column_index_key] - 1].row
1616
self.sheet_name = excel_row[column_indexes[column_index_key] - 1].parent.title
17-
self.properties_list[column_index_key] = excel_row[column_indexes[column_index_key] - 1].value
17+
self.properties_list[column_index_key.lower().strip().replace(' ', '_')] = excel_row[column_indexes[column_index_key] - 1].value
1818

1919
def get_data_type(self):
2020
return DataTypes.REFERENCE_DATA
@@ -28,6 +28,5 @@ def get_sheet_name(self):
2828
def get_test_data_property(self, property_name):
2929
try:
3030
return self.properties_list[property_name.lower().strip()]
31-
# return self.excel_row[self.column_indexes[property_name.lower().strip()] - 1].value
3231
except:
3332
raise Exception('Can\'t find property name '+property_name+' under test data row index '+str(self.get_row_no()))

ExcelDataDriver/Keywords/CoreExcelKeywords.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def load_reference_data(self, alias_name, filename, custom_parser_module='ExcelD
4848
reference_wb.close()
4949

5050
def _load_customer_class_from_module(self, module_name, class_name):
51-
MyClass = getattr(importlib.import_module('ExcelDataDriver.ExcelParser.DefaultReferenceParserStrategy'), 'DefaultReferenceParserStrategy')
51+
MyClass = getattr(importlib.import_module(module_name), class_name)
5252
return MyClass
5353

5454
####################################################

ExcelDataDriver/__init__.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
https://github.com/robotframework/robotframework/tree/master/doc/userguide/src/ExtendingRobotFramework
2121
"""
2222
import glob
23+
import importlib
2324
import re
2425
import sys
2526
import os.path
@@ -76,6 +77,8 @@ def __init__(self, file=None, custom_parser=None, capture_screenshot='Always', m
7677
self.custom_parser = CustomExcelParser.CustomExcelParser()
7778
self.capture_screenshot_option = CaptureScreenShotOption[capture_screenshot]
7879
self.manually_test = manually_test
80+
if self.file is None:
81+
self.manually_test = True
7982

8083
self.excelTestDataService = ExcelTestDataService()
8184
self.suite_source = None
@@ -93,6 +96,8 @@ def __init__(self, file=None, custom_parser=None, capture_screenshot='Always', m
9396

9497
self.screenshot_running_id = 0
9598

99+
self.reference_data = dict()
100+
96101
def load_module(self, module):
97102
"""``Important`` using by local library only."""
98103
# module_path = "mypackage.%s" % module
@@ -516,3 +521,63 @@ def save_report(self, newfile=None):
516521
517522
"""
518523
self.excelTestDataService.save_report(newfile)
524+
525+
####################################################
526+
#
527+
# Load reference excel data
528+
#
529+
####################################################
530+
@keyword
531+
def load_reference_data(self, alias_name, filename,
532+
custom_parser_module='ExcelDataDriver.ExcelParser.DefaultReferenceParserStrategy',
533+
custom_parser_class='DefaultReferenceParserStrategy'):
534+
"""
535+
Load reference data with specific Parser
536+
537+
Arguments:
538+
| alias_name | alias_name for refer to the reference data |
539+
| filename (string) | The file name string value that will be used to open the excel file to perform tests upon. |
540+
| custom_parser_module | Test data parser module is ExcelDataDriver.ExcelParser.DefaultReferenceParserStrategy |
541+
| custom_parser_class | Test data parser class is DefaultReferenceParserStrategy |
542+
"""
543+
reference_wb = OpenpyxlHelper.load_excel_file(filename)
544+
CustomExcelParser = getattr(importlib.import_module(custom_parser_module), custom_parser_class)
545+
# CustomExcelParser = __import__(custom_parser_module)
546+
# parser_context = ParserContext(CustomExcelParser.CustomExcelBreakdownParser())
547+
parser_context = ParserContext(CustomExcelParser())
548+
references_data_sheets = parser_context.parse(reference_wb)
549+
reference_row_data = []
550+
for sheet_name in references_data_sheets:
551+
reference_row_data += references_data_sheets[sheet_name]
552+
self.reference_data[alias_name] = {
553+
'selected': None,
554+
'data': reference_row_data
555+
}
556+
reference_wb.close()
557+
558+
@keyword
559+
def select_reference_data_based_on_condition(self, alias_name, condition):
560+
"""
561+
Select reference data based on condition
562+
563+
Arguments:
564+
| alias_name | alias_name for refer to the reference data |
565+
| condition | refer variable name 'data' |
566+
567+
Default Data Properties:
568+
excel_title string
569+
excel_row_index string
570+
row_no string
571+
sheet_name string
572+
properties_list dictionary: access to excel property with lower case and use _ instead of space
573+
"""
574+
self.reference_data[alias_name]['selected'] = next(data for data in self.reference_data[alias_name]['data'] if eval(condition))
575+
576+
@keyword
577+
def get_selected_reference_data_property(self, alias_name, property_name):
578+
return self.reference_data[alias_name]['selected'].properties_list[property_name]
579+
580+
@keyword
581+
def get_reference_data_property(self, alias_name, property_name, condition):
582+
select = next(data for data in self.reference_data[alias_name]['data'] if eval(condition))
583+
return select.properties_list[property_name]
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import os
2+
import sys
3+
from unittest import TestCase
4+
5+
from astroid import module
6+
7+
from ExcelDataDriver import ExcelDataDriver
8+
9+
10+
class TestDefaultReferenceParserStrategy(TestCase):
11+
12+
"""
13+
Load and count test data
14+
"""
15+
def test_load_test_data_WithValidPostComRunTestData_LoadExcelSuccessfully(self):
16+
# Arrange
17+
core_rpa = ExcelDataDriver()
18+
19+
# Act
20+
core_rpa.load_reference_data('ref1', os.getcwd()+'../../../Examples/test_data/DefaultDemoData.xlsx')
21+
22+
def test_select_reference_data_with_condition(self):
23+
# Arrange
24+
core_rpa = ExcelDataDriver()
25+
core_rpa.load_reference_data('ref1', os.getcwd() + '../../../Examples/test_data/DefaultDemoData.xlsx')
26+
27+
# Act
28+
core_rpa.select_reference_data_based_on_condition('ref1', 'data.properties_list["username"] == "john"')
29+
30+
#def test_local_import(self):
31+
# module_path = 'CustomExcelParser'
32+
# if module_path in sys.modules.keys():
33+
# return sys.modules[module_path]
34+
# __import__(module_path)
35+
# x = 10
36+

0 commit comments

Comments
 (0)