| # Parser for test templates | |
| # | |
| # Copyright (c) 2021 Virtuozzo International GmbH. | |
| # | |
| # This program is free software; you can redistribute it and/or modify | |
| # it under the terms of the GNU General Public License as published by | |
| # the Free Software Foundation; either version 2 of the License, or | |
| # (at your option) any later version. | |
| # | |
| # This program is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| import itertools | |
| from lark import Lark | |
| grammar = """ | |
| start: ( text | column_switch | row_switch )+ | |
| column_switch: "{" text ["|" text]+ "}" | |
| row_switch: "[" text ["|" text]+ "]" | |
| text: /[^|{}\[\]]+/ | |
| """ | |
| parser = Lark(grammar) | |
| class Templater: | |
| def __init__(self, template): | |
| self.tree = parser.parse(template) | |
| c_switches = [] | |
| r_switches = [] | |
| for x in self.tree.children: | |
| if x.data == 'column_switch': | |
| c_switches.append([el.children[0].value for el in x.children]) | |
| elif x.data == 'row_switch': | |
| r_switches.append([el.children[0].value for el in x.children]) | |
| self.columns = list(itertools.product(*c_switches)) | |
| self.rows = list(itertools.product(*r_switches)) | |
| def gen(self, column, row): | |
| i = 0 | |
| j = 0 | |
| result = [] | |
| for x in self.tree.children: | |
| if x.data == 'text': | |
| result.append(x.children[0].value) | |
| elif x.data == 'column_switch': | |
| result.append(column[i]) | |
| i += 1 | |
| elif x.data == 'row_switch': | |
| result.append(row[j]) | |
| j += 1 | |
| return ''.join(result) |