pytest-dsl 0.6.0__py3-none-any.whl → 0.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pytest_dsl/core/dsl_executor.py +35 -12
- pytest_dsl/core/lexer.py +14 -4
- pytest_dsl/core/parser.py +50 -2
- pytest_dsl/core/parsetab.py +54 -43
- pytest_dsl/core/utils.py +43 -23
- pytest_dsl/core/variable_utils.py +215 -70
- pytest_dsl-0.7.0.dist-info/METADATA +1040 -0
- {pytest_dsl-0.6.0.dist-info → pytest_dsl-0.7.0.dist-info}/RECORD +12 -13
- pytest_dsl/parsetab.py +0 -69
- pytest_dsl-0.6.0.dist-info/METADATA +0 -725
- {pytest_dsl-0.6.0.dist-info → pytest_dsl-0.7.0.dist-info}/WHEEL +0 -0
- {pytest_dsl-0.6.0.dist-info → pytest_dsl-0.7.0.dist-info}/entry_points.txt +0 -0
- {pytest_dsl-0.6.0.dist-info → pytest_dsl-0.7.0.dist-info}/licenses/LICENSE +0 -0
- {pytest_dsl-0.6.0.dist-info → pytest_dsl-0.7.0.dist-info}/top_level.txt +0 -0
pytest_dsl/core/dsl_executor.py
CHANGED
@@ -90,6 +90,15 @@ class DSLExecutor:
|
|
90
90
|
item_value = self.eval_expression(item)
|
91
91
|
result.append(item_value)
|
92
92
|
return result
|
93
|
+
elif expr_node.type == 'DictExpr':
|
94
|
+
# 处理字典表达式
|
95
|
+
result = {}
|
96
|
+
for item in expr_node.children:
|
97
|
+
# 每个item是DictItem节点,包含键和值
|
98
|
+
key_value = self.eval_expression(item.children[0])
|
99
|
+
value_value = self.eval_expression(item.children[1])
|
100
|
+
result[key_value] = value_value
|
101
|
+
return result
|
93
102
|
elif expr_node.type == 'BooleanExpr':
|
94
103
|
# 处理布尔值表达式
|
95
104
|
return expr_node.value
|
@@ -111,13 +120,14 @@ class DSLExecutor:
|
|
111
120
|
if value in self.variable_replacer.local_variables:
|
112
121
|
return self.variable_replacer.local_variables[value]
|
113
122
|
|
114
|
-
#
|
115
|
-
pattern = r'\$\{([a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*)\}'
|
123
|
+
# 定义扩展的变量引用模式,支持数组索引和字典键访问
|
124
|
+
pattern = r'\$\{([a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*(?:(?:\.[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*)|(?:\[[^\]]+\]))*)\}'
|
116
125
|
# 检查整个字符串是否完全匹配单一变量引用模式
|
117
126
|
match = re.fullmatch(pattern, value)
|
118
127
|
if match:
|
119
|
-
|
120
|
-
|
128
|
+
var_ref = match.group(1)
|
129
|
+
# 使用新的变量路径解析器
|
130
|
+
return self.variable_replacer._parse_variable_path(var_ref)
|
121
131
|
else:
|
122
132
|
# 如果不是单一变量,则替换字符串中的所有变量引用
|
123
133
|
return self.variable_replacer.replace_in_string(value)
|
@@ -503,24 +513,37 @@ class DSLExecutor:
|
|
503
513
|
|
504
514
|
@allure.step("执行条件语句")
|
505
515
|
def _handle_if_statement(self, node):
|
506
|
-
"""处理if-else语句
|
516
|
+
"""处理if-elif-else语句
|
507
517
|
|
508
518
|
Args:
|
509
|
-
node: IfStatement节点,包含条件表达式、if分支和可选的else分支
|
519
|
+
node: IfStatement节点,包含条件表达式、if分支、可选的elif分支和可选的else分支
|
510
520
|
"""
|
521
|
+
# 首先检查if条件
|
511
522
|
condition = self.eval_expression(node.children[0])
|
512
523
|
|
513
|
-
# 将条件转换为布尔值进行评估
|
514
524
|
if condition:
|
515
525
|
# 执行if分支
|
516
526
|
with allure.step("执行if分支"):
|
517
527
|
return self.execute(node.children[1])
|
518
|
-
elif len(node.children) > 2:
|
519
|
-
# 如果存在else分支且条件为假,则执行else分支
|
520
|
-
with allure.step("执行else分支"):
|
521
|
-
return self.execute(node.children[2])
|
522
528
|
|
523
|
-
#
|
529
|
+
# 如果if条件为假,检查elif分支
|
530
|
+
for i in range(2, len(node.children)):
|
531
|
+
child = node.children[i]
|
532
|
+
|
533
|
+
# 如果是ElifClause节点
|
534
|
+
if hasattr(child, 'type') and child.type == 'ElifClause':
|
535
|
+
elif_condition = self.eval_expression(child.children[0])
|
536
|
+
if elif_condition:
|
537
|
+
with allure.step(f"执行elif分支 {i-1}"):
|
538
|
+
return self.execute(child.children[1])
|
539
|
+
|
540
|
+
# 如果是普通的statements节点(else分支)
|
541
|
+
elif not hasattr(child, 'type') or child.type == 'Statements':
|
542
|
+
# 这是else分支,只有在所有前面的条件都为假时才执行
|
543
|
+
with allure.step("执行else分支"):
|
544
|
+
return self.execute(child)
|
545
|
+
|
546
|
+
# 如果所有条件都为假且没有else分支,则不执行任何操作
|
524
547
|
return None
|
525
548
|
|
526
549
|
def _execute_remote_keyword_call(self, node):
|
pytest_dsl/core/lexer.py
CHANGED
@@ -12,6 +12,7 @@ reserved = {
|
|
12
12
|
'False': 'FALSE', # 添加布尔值支持
|
13
13
|
'return': 'RETURN', # 添加return关键字支持
|
14
14
|
'else': 'ELSE', # 添加else关键字支持
|
15
|
+
'elif': 'ELIF', # 添加elif关键字支持
|
15
16
|
'if': 'IF', # 添加if关键字支持
|
16
17
|
'as': 'AS', # 添加as关键字支持,用于远程关键字别名
|
17
18
|
'function': 'FUNCTION', # 添加function关键字支持,用于自定义关键字定义
|
@@ -29,6 +30,8 @@ tokens = [
|
|
29
30
|
'RPAREN',
|
30
31
|
'LBRACKET',
|
31
32
|
'RBRACKET',
|
33
|
+
'LBRACE', # 左大括号 {,用于字典字面量
|
34
|
+
'RBRACE', # 右大括号 },用于字典字面量
|
32
35
|
'COLON',
|
33
36
|
'COMMA',
|
34
37
|
'PLACEHOLDER',
|
@@ -58,6 +61,8 @@ t_LPAREN = r'\('
|
|
58
61
|
t_RPAREN = r'\)'
|
59
62
|
t_LBRACKET = r'\['
|
60
63
|
t_RBRACKET = r'\]'
|
64
|
+
t_LBRACE = r'\{'
|
65
|
+
t_RBRACE = r'\}'
|
61
66
|
t_COLON = r':'
|
62
67
|
t_COMMA = r','
|
63
68
|
t_EQUALS = r'='
|
@@ -72,8 +77,9 @@ t_MINUS = r'-'
|
|
72
77
|
t_TIMES = r'\*'
|
73
78
|
t_DIVIDE = r'/'
|
74
79
|
|
75
|
-
# 增加PLACEHOLDER规则,匹配 ${变量名}
|
76
|
-
|
80
|
+
# 增加PLACEHOLDER规则,匹配 ${变量名} 格式,支持点号、数组索引和字典键访问
|
81
|
+
# 匹配: ${variable}, ${obj.prop}, ${arr[0]}, ${dict["key"]}, ${obj[0].prop} 等
|
82
|
+
t_PLACEHOLDER = r'\$\{[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*(?:(?:\.[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*)|(?:\[[^\]]+\]))*\}'
|
77
83
|
|
78
84
|
# 添加管道符的正则表达式定义
|
79
85
|
t_PIPE = r'\|'
|
@@ -143,8 +149,12 @@ def t_IMPORT_KEYWORD(t):
|
|
143
149
|
|
144
150
|
|
145
151
|
def t_NUMBER(t):
|
146
|
-
r'\d+'
|
147
|
-
|
152
|
+
r'\d+(\.\d+)?'
|
153
|
+
# 如果包含小数点,转换为浮点数;否则转换为整数
|
154
|
+
if '.' in t.value:
|
155
|
+
t.value = float(t.value)
|
156
|
+
else:
|
157
|
+
t.value = int(t.value)
|
148
158
|
return t
|
149
159
|
|
150
160
|
|
pytest_dsl/core/parser.py
CHANGED
@@ -158,6 +158,7 @@ def p_expr_atom(p):
|
|
158
158
|
| ID
|
159
159
|
| boolean_expr
|
160
160
|
| list_expr
|
161
|
+
| dict_expr
|
161
162
|
| LPAREN expression RPAREN'''
|
162
163
|
if p[1] == '(':
|
163
164
|
# 处理括号表达式,直接返回括号内的表达式节点
|
@@ -197,6 +198,29 @@ def p_list_item(p):
|
|
197
198
|
p[0] = p[1]
|
198
199
|
|
199
200
|
|
201
|
+
def p_dict_expr(p):
|
202
|
+
'''dict_expr : LBRACE dict_items RBRACE
|
203
|
+
| LBRACE RBRACE'''
|
204
|
+
if len(p) == 4:
|
205
|
+
p[0] = Node('DictExpr', children=p[2])
|
206
|
+
else:
|
207
|
+
p[0] = Node('DictExpr', children=[]) # 空字典
|
208
|
+
|
209
|
+
|
210
|
+
def p_dict_items(p):
|
211
|
+
'''dict_items : dict_item
|
212
|
+
| dict_item COMMA dict_items'''
|
213
|
+
if len(p) == 2:
|
214
|
+
p[0] = [p[1]]
|
215
|
+
else:
|
216
|
+
p[0] = [p[1]] + p[3]
|
217
|
+
|
218
|
+
|
219
|
+
def p_dict_item(p):
|
220
|
+
'''dict_item : expression COLON expression'''
|
221
|
+
p[0] = Node('DictItem', children=[p[1], p[3]])
|
222
|
+
|
223
|
+
|
200
224
|
def p_loop(p):
|
201
225
|
'''loop : FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END'''
|
202
226
|
p[0] = Node('ForLoop', [p[6], p[8], p[11]], p[2])
|
@@ -280,11 +304,35 @@ def p_return_statement(p):
|
|
280
304
|
|
281
305
|
def p_if_statement(p):
|
282
306
|
'''if_statement : IF expression DO statements END
|
283
|
-
| IF expression DO statements
|
307
|
+
| IF expression DO statements elif_clauses END
|
308
|
+
| IF expression DO statements ELSE statements END
|
309
|
+
| IF expression DO statements elif_clauses ELSE statements END'''
|
284
310
|
if len(p) == 6:
|
311
|
+
# if condition do statements end
|
285
312
|
p[0] = Node('IfStatement', [p[2], p[4]], None)
|
286
|
-
|
313
|
+
elif len(p) == 7:
|
314
|
+
# if condition do statements elif_clauses end
|
315
|
+
p[0] = Node('IfStatement', [p[2], p[4]] + p[5], None)
|
316
|
+
elif len(p) == 8:
|
317
|
+
# if condition do statements else statements end
|
287
318
|
p[0] = Node('IfStatement', [p[2], p[4], p[6]], None)
|
319
|
+
else:
|
320
|
+
# if condition do statements elif_clauses else statements end
|
321
|
+
p[0] = Node('IfStatement', [p[2], p[4]] + p[5] + [p[7]], None)
|
322
|
+
|
323
|
+
|
324
|
+
def p_elif_clauses(p):
|
325
|
+
'''elif_clauses : elif_clause
|
326
|
+
| elif_clause elif_clauses'''
|
327
|
+
if len(p) == 2:
|
328
|
+
p[0] = [p[1]]
|
329
|
+
else:
|
330
|
+
p[0] = [p[1]] + p[2]
|
331
|
+
|
332
|
+
|
333
|
+
def p_elif_clause(p):
|
334
|
+
'''elif_clause : ELIF expression DO statements'''
|
335
|
+
p[0] = Node('ElifClause', [p[2], p[4]], None)
|
288
336
|
|
289
337
|
|
290
338
|
def p_comparison_expr(p):
|
pytest_dsl/core/parsetab.py
CHANGED
@@ -6,9 +6,9 @@ _tabversion = '3.10'
|
|
6
6
|
|
7
7
|
_lr_method = 'LALR'
|
8
8
|
|
9
|
-
_lr_signature = 'leftCOMMAleftGTLTGELEEQNEleftPLUSMINUSleftTIMESDIVIDErightEQUALSAS AUTHOR_KEYWORD COLON COMMA DATA_KEYWORD DATE DATE_KEYWORD DESCRIPTION_KEYWORD DIVIDE DO ELSE END EQ EQUALS FALSE FOR FUNCTION GE GT ID IF IMPORT_KEYWORD IN LBRACKET LE LPAREN LT MINUS NAME_KEYWORD NE NUMBER PIPE PLACEHOLDER PLUS RANGE RBRACKET REMOTE_KEYWORD RETURN RPAREN STRING TAGS_KEYWORD TEARDOWN TIMES TRUE USINGstart : metadata statements teardown\n | metadata statements\n | statements teardown\n | statementsmetadata : metadata_items\n | emptyempty :metadata_items : metadata_item metadata_items\n | metadata_itemmetadata_item : NAME_KEYWORD COLON metadata_value\n | DESCRIPTION_KEYWORD COLON metadata_value\n | TAGS_KEYWORD COLON LBRACKET tags RBRACKET\n | AUTHOR_KEYWORD COLON metadata_value\n | DATE_KEYWORD COLON DATE\n | DATA_KEYWORD COLON data_source\n | IMPORT_KEYWORD COLON STRING\n | REMOTE_KEYWORD COLON STRING AS IDmetadata_value : STRING\n | IDtags : tag COMMA tags\n | tagtag : STRING\n | IDstatements : statement statements\n | statementstatement : assignment\n | keyword_call\n | remote_keyword_call\n | loop\n | custom_keyword\n | return_statement\n | if_statementassignment : ID EQUALS expression\n | ID EQUALS keyword_call\n | ID EQUALS remote_keyword_callexpression : expr_atom\n | comparison_expr\n | arithmetic_exprexpr_atom : NUMBER\n | STRING\n | PLACEHOLDER\n | ID\n | boolean_expr\n | list_expr\n | LPAREN expression RPARENboolean_expr : TRUE\n | FALSElist_expr : LBRACKET list_items RBRACKET\n | LBRACKET RBRACKETlist_items : list_item\n | list_item COMMA list_itemslist_item : expressionloop : FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements ENDkeyword_call : LBRACKET ID RBRACKET COMMA parameter_list\n | LBRACKET ID RBRACKETparameter_list : parameter_itemsparameter_items : parameter_item COMMA parameter_items\n | parameter_itemparameter_item : ID COLON expressionteardown : TEARDOWN DO statements ENDdata_source : STRING USING IDcustom_keyword : FUNCTION ID LPAREN param_definitions RPAREN DO statements ENDparam_definitions : param_def_list\n | param_def_list : param_def COMMA param_def_list\n | param_defparam_def : ID EQUALS STRING\n | ID EQUALS NUMBER\n | IDreturn_statement : RETURN expressionif_statement : IF expression DO statements END\n | IF expression DO statements ELSE statements
|
9
|
+
_lr_signature = 'leftCOMMAleftGTLTGELEEQNEleftPLUSMINUSleftTIMESDIVIDErightEQUALSAS AUTHOR_KEYWORD COLON COMMA DATA_KEYWORD DATE DATE_KEYWORD DESCRIPTION_KEYWORD DIVIDE DO ELIF ELSE END EQ EQUALS FALSE FOR FUNCTION GE GT ID IF IMPORT_KEYWORD IN LBRACE LBRACKET LE LPAREN LT MINUS NAME_KEYWORD NE NUMBER PIPE PLACEHOLDER PLUS RANGE RBRACE RBRACKET REMOTE_KEYWORD RETURN RPAREN STRING TAGS_KEYWORD TEARDOWN TIMES TRUE USINGstart : metadata statements teardown\n | metadata statements\n | statements teardown\n | statementsmetadata : metadata_items\n | emptyempty :metadata_items : metadata_item metadata_items\n | metadata_itemmetadata_item : NAME_KEYWORD COLON metadata_value\n | DESCRIPTION_KEYWORD COLON metadata_value\n | TAGS_KEYWORD COLON LBRACKET tags RBRACKET\n | AUTHOR_KEYWORD COLON metadata_value\n | DATE_KEYWORD COLON DATE\n | DATA_KEYWORD COLON data_source\n | IMPORT_KEYWORD COLON STRING\n | REMOTE_KEYWORD COLON STRING AS IDmetadata_value : STRING\n | IDtags : tag COMMA tags\n | tagtag : STRING\n | IDstatements : statement statements\n | statementstatement : assignment\n | keyword_call\n | remote_keyword_call\n | loop\n | custom_keyword\n | return_statement\n | if_statementassignment : ID EQUALS expression\n | ID EQUALS keyword_call\n | ID EQUALS remote_keyword_callexpression : expr_atom\n | comparison_expr\n | arithmetic_exprexpr_atom : NUMBER\n | STRING\n | PLACEHOLDER\n | ID\n | boolean_expr\n | list_expr\n | dict_expr\n | LPAREN expression RPARENboolean_expr : TRUE\n | FALSElist_expr : LBRACKET list_items RBRACKET\n | LBRACKET RBRACKETlist_items : list_item\n | list_item COMMA list_itemslist_item : expressiondict_expr : LBRACE dict_items RBRACE\n | LBRACE RBRACEdict_items : dict_item\n | dict_item COMMA dict_itemsdict_item : expression COLON expressionloop : FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements ENDkeyword_call : LBRACKET ID RBRACKET COMMA parameter_list\n | LBRACKET ID RBRACKETparameter_list : parameter_itemsparameter_items : parameter_item COMMA parameter_items\n | parameter_itemparameter_item : ID COLON expressionteardown : TEARDOWN DO statements ENDdata_source : STRING USING IDcustom_keyword : FUNCTION ID LPAREN param_definitions RPAREN DO statements ENDparam_definitions : param_def_list\n | param_def_list : param_def COMMA param_def_list\n | param_defparam_def : ID EQUALS STRING\n | ID EQUALS NUMBER\n | IDreturn_statement : RETURN expressionif_statement : IF expression DO statements END\n | IF expression DO statements elif_clauses END\n | IF expression DO statements ELSE statements END\n | IF expression DO statements elif_clauses ELSE statements ENDelif_clauses : elif_clause\n | elif_clause elif_clauseselif_clause : ELIF expression DO statementscomparison_expr : expr_atom GT expr_atom\n | expr_atom LT expr_atom\n | expr_atom GE expr_atom\n | expr_atom LE expr_atom\n | expr_atom EQ expr_atom\n | expr_atom NE expr_atomarithmetic_expr : expression PLUS expression\n | expression MINUS expression\n | expression TIMES expression\n | expression DIVIDE expressionremote_keyword_call : ID PIPE LBRACKET ID RBRACKET COMMA parameter_list\n | ID PIPE LBRACKET ID RBRACKET'
|
10
10
|
|
11
|
-
_lr_action_items = {'ID':([0,2,4,5,6,7,8,9,10,11,12,13,14,18,25,26,27,28,33,34,35,38,43,47,48,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,74,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,96,99,105,106,107,115,116,117,118,119,120,121,122,123,124,125,126,127,130,131,133,134,135,136,137,138,139,142,144,145,147,148,149,153,156,157,158,159,161,163,165,167,],[24,24,-5,-6,24,-9,-26,-27,-28,-29,-30,-31,-32,37,45,46,54,54,-8,66,66,66,76,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,54,-46,-47,54,24,-10,-18,-19,-11,104,-55,-13,-14,-15,-16,-42,-33,-34,-35,108,109,111,54,54,54,54,54,54,54,54,54,54,-49,24,132,136,137,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,54,-12,104,-54,-56,-58,-61,-17,-84,54,111,-71,24,54,132,132,24,-59,-57,-83,54,-72,-62,24,-53,]),'LBRACKET':([0,2,4,5,6,7,8,9,10,11,12,13,14,27,28,33,36,43,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,69,70,71,72,74,76,77,78,79,80,84,85,86,87,88,89,90,91,92,93,96,99,115,116,117,118,119,120,121,122,123,124,125,126,127,130,133,134,135,136,137,138,139,144,145,147,153,156,157,158,159,161,163,165,167,],[18,18,-5,-6,18,-9,-26,-27,-28,-29,-30,-31,-32,60,60,-8,68,80,81,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,60,-46,-47,60,18,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,60,60,60,60,60,60,60,60,60,60,60,-49,18,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,60,-12,-54,-56,-58,-61,-17,-84,60,-71,18,60,18,-59,-57,-83,60,-72,-62,18,-53,]),'FOR':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[25,25,-5,-6,25,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,25,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,25,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,25,25,-59,-57,-83,-72,-62,25,-53,]),'FUNCTION':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[26,26,-5,-6,26,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,26,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,26,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,26,26,-59,-57,-83,-72,-62,26,-53,]),'RETURN':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[27,27,-5,-6,27,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,27,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,27,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,27,27,-59,-57,-83,-72,-62,27,-53,]),'IF':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[28,28,-5,-6,28,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,28,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,28,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,28,28,-59,-57,-83,-72,-62,28,-53,]),'NAME_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[15,15,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'DESCRIPTION_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[16,16,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'TAGS_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[17,17,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'AUTHOR_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[19,19,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'DATE_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[20,20,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'DATA_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[21,21,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'IMPORT_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[22,22,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'REMOTE_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[23,23,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'$end':([1,3,6,8,9,10,11,12,13,14,29,30,32,47,48,49,50,51,52,53,54,55,56,58,59,62,69,76,77,78,79,96,115,116,117,118,119,120,121,122,123,124,125,126,129,133,134,135,138,144,156,157,158,161,163,167,],[0,-4,-25,-26,-27,-28,-29,-30,-31,-32,-2,-3,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-1,-55,-42,-33,-34,-35,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-60,-54,-56,-58,-84,-71,-59,-57,-83,-72,-62,-53,]),'TEARDOWN':([3,6,8,9,10,11,12,13,14,29,32,47,48,49,50,51,52,53,54,55,56,58,59,69,76,77,78,79,96,115,116,117,118,119,120,121,122,123,124,125,126,133,134,135,138,144,156,157,158,161,163,167,],[31,-25,-26,-27,-28,-29,-30,-31,-32,31,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-55,-42,-33,-34,-35,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-54,-56,-58,-84,-71,-59,-57,-83,-72,-62,-53,]),'END':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,58,59,69,76,77,78,79,96,100,115,116,117,118,119,120,121,122,123,124,125,126,128,133,134,135,138,144,155,156,157,158,160,161,163,166,167,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-55,-42,-33,-34,-35,-49,129,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,144,-54,-56,-58,-84,-71,161,-59,-57,-83,163,-72,-62,167,-53,]),'ELSE':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,58,59,69,76,77,78,79,96,115,116,117,118,119,120,121,122,123,124,125,126,128,133,134,135,138,144,156,157,158,161,163,167,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-55,-42,-33,-34,-35,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,145,-54,-56,-58,-84,-71,-59,-57,-83,-72,-62,-53,]),'COLON':([15,16,17,19,20,21,22,23,132,],[34,35,36,38,39,40,41,42,147,]),'EQUALS':([24,111,],[43,140,]),'PIPE':([24,76,],[44,44,]),'NUMBER':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,140,147,159,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,152,51,51,]),'STRING':([27,28,34,35,38,40,41,42,43,57,60,68,80,84,85,86,87,88,89,90,91,92,93,127,131,139,140,147,159,],[52,52,65,65,65,73,74,75,52,52,52,103,52,52,52,52,52,52,52,52,52,52,52,52,103,52,151,52,52,]),'PLACEHOLDER':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,]),'LPAREN':([27,28,43,46,57,60,80,84,85,86,87,88,89,90,91,92,93,110,127,139,147,159,],[57,57,57,83,57,57,57,57,57,57,57,57,57,57,57,57,57,139,57,57,57,57,]),'TRUE':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,]),'FALSE':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,]),'DO':([31,48,49,50,51,52,53,54,55,56,58,59,61,96,115,116,117,118,119,120,121,122,123,124,125,126,141,164,],[63,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,99,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,153,165,]),'RBRACKET':([37,48,49,50,51,52,53,54,55,56,58,59,60,80,95,96,97,98,101,102,103,104,108,109,115,116,117,118,119,120,121,122,123,124,125,126,143,146,],[69,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,96,96,126,-49,-50,-52,130,-21,-22,-23,69,138,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-51,-20,]),'DATE':([39,],[71,]),'IN':([45,],[82,]),'PLUS':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[84,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,84,-42,84,84,-49,84,-42,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,84,84,84,]),'MINUS':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[85,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,85,-42,85,85,-49,85,-42,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,85,85,85,]),'TIMES':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[86,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,86,-42,86,86,-49,86,-42,86,86,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,86,86,86,]),'DIVIDE':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[87,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,87,-42,87,87,-49,87,-42,87,87,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,87,87,87,]),'RPAREN':([48,49,50,51,52,53,54,55,56,58,59,83,94,96,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,151,152,154,162,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-64,125,-49,-69,141,-63,-66,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-67,-68,-65,164,]),'COMMA':([48,49,50,51,52,53,54,55,56,58,59,69,96,97,98,102,103,104,108,111,114,115,116,117,118,119,120,121,122,123,124,125,126,135,138,150,151,152,156,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,105,-49,127,-52,131,-22,-23,-42,-69,142,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,148,149,159,-67,-68,-59,]),'GT':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[88,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'LT':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[89,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'GE':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[90,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'LE':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[91,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'EQ':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[92,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'NE':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[93,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'USING':([73,],[106,]),'AS':([75,],[107,]),'RANGE':([82,],[110,]),}
|
11
|
+
_lr_action_items = {'ID':([0,2,4,5,6,7,8,9,10,11,12,13,14,18,25,26,27,28,33,34,35,38,43,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,65,66,67,68,69,70,71,72,73,74,76,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,98,102,105,111,112,113,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,140,142,143,144,145,146,147,148,151,155,157,159,161,162,163,167,169,170,174,175,176,177,180,181,183,184,187,189,],[24,24,-5,-6,24,-9,-26,-27,-28,-29,-30,-31,-32,37,45,46,54,54,-8,68,68,68,78,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,54,-47,-48,54,54,24,-10,-18,-19,-11,110,-61,-13,-14,-15,-16,-42,-33,-34,-35,114,115,117,54,54,54,54,54,54,54,54,54,54,-50,-55,24,141,145,146,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,54,-54,54,54,-12,110,-60,-62,-64,-67,-17,-95,54,117,-77,24,54,54,141,141,24,-78,24,-65,-63,-94,54,-79,24,-68,-80,24,-59,]),'LBRACKET':([0,2,4,5,6,7,8,9,10,11,12,13,14,27,28,33,36,43,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,65,66,67,68,69,71,72,73,74,76,78,79,80,81,82,86,87,88,89,90,91,92,93,94,95,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,142,143,144,145,146,147,148,155,157,159,161,167,169,170,174,175,176,177,180,181,183,184,187,189,],[18,18,-5,-6,18,-9,-26,-27,-28,-29,-30,-31,-32,61,61,-8,70,82,83,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,61,-47,-48,61,61,18,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,61,61,61,61,61,61,61,61,61,61,61,-50,-55,18,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,61,-54,61,61,-12,-60,-62,-64,-67,-17,-95,61,-77,18,61,61,18,-78,18,-65,-63,-94,61,-79,18,-68,-80,18,-59,]),'FOR':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[25,25,-5,-6,25,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,25,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,25,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,25,25,-78,25,-65,-63,-94,-79,25,-68,-80,25,-59,]),'FUNCTION':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[26,26,-5,-6,26,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,26,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,26,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,26,26,-78,26,-65,-63,-94,-79,26,-68,-80,26,-59,]),'RETURN':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[27,27,-5,-6,27,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,27,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,27,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,27,27,-78,27,-65,-63,-94,-79,27,-68,-80,27,-59,]),'IF':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[28,28,-5,-6,28,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,28,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,28,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,28,28,-78,28,-65,-63,-94,-79,28,-68,-80,28,-59,]),'NAME_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[15,15,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'DESCRIPTION_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[16,16,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'TAGS_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[17,17,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'AUTHOR_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[19,19,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'DATE_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[20,20,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'DATA_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[21,21,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'IMPORT_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[22,22,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'REMOTE_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[23,23,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'$end':([1,3,6,8,9,10,11,12,13,14,29,30,32,47,48,49,50,51,52,53,54,55,56,57,59,60,64,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,138,142,143,144,147,155,169,174,175,176,180,183,184,189,],[0,-4,-25,-26,-27,-28,-29,-30,-31,-32,-2,-3,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-1,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-66,-60,-62,-64,-95,-77,-78,-65,-63,-94,-79,-68,-80,-59,]),'TEARDOWN':([3,6,8,9,10,11,12,13,14,29,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,142,143,144,147,155,169,174,175,176,180,183,184,189,],[31,-25,-26,-27,-28,-29,-30,-31,-32,31,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-60,-62,-64,-95,-77,-78,-65,-63,-94,-79,-68,-80,-59,]),'END':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,106,121,122,123,124,125,126,127,128,129,130,131,132,134,137,142,143,144,147,155,156,158,169,171,172,174,175,176,178,179,180,183,184,185,188,189,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,138,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,155,-60,-62,-64,-95,-77,169,-81,-78,180,-82,-65,-63,-94,183,184,-79,-68,-80,-83,189,-59,]),'ELSE':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,137,142,143,144,147,155,156,158,169,172,174,175,176,180,183,184,185,189,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,157,-60,-62,-64,-95,-77,170,-81,-78,-82,-65,-63,-94,-79,-68,-80,-83,-59,]),'ELIF':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,137,142,143,144,147,155,158,169,174,175,176,180,183,184,185,189,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,159,-60,-62,-64,-95,-77,159,-78,-65,-63,-94,-79,-68,-80,-83,-59,]),'COLON':([15,16,17,19,20,21,22,23,48,49,50,51,52,53,54,55,56,57,59,60,98,102,104,121,122,123,124,125,126,127,128,129,130,131,132,134,141,],[34,35,36,38,39,40,41,42,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-50,-55,136,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,161,]),'EQUALS':([24,117,],[43,149,]),'PIPE':([24,78,],[44,44,]),'NUMBER':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,149,159,161,177,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,166,51,51,51,]),'STRING':([27,28,34,35,38,40,41,42,43,58,61,62,70,82,86,87,88,89,90,91,92,93,94,95,133,135,136,140,148,149,159,161,177,],[52,52,67,67,67,75,76,77,52,52,52,52,109,52,52,52,52,52,52,52,52,52,52,52,52,52,52,109,52,165,52,52,52,]),'PLACEHOLDER':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,]),'LPAREN':([27,28,43,46,58,61,62,82,86,87,88,89,90,91,92,93,94,95,116,133,135,136,148,159,161,177,],[58,58,58,85,58,58,58,58,58,58,58,58,58,58,58,58,58,58,148,58,58,58,58,58,58,58,]),'TRUE':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,]),'FALSE':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,]),'LBRACE':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,]),'DO':([31,48,49,50,51,52,53,54,55,56,57,59,60,63,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,150,173,186,],[65,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,105,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,167,181,187,]),'RBRACKET':([37,48,49,50,51,52,53,54,55,56,57,59,60,61,82,97,98,99,100,102,107,108,109,110,114,115,121,122,123,124,125,126,127,128,129,130,131,132,134,152,160,],[71,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,98,98,132,-50,-51,-53,-55,139,-21,-22,-23,71,147,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-52,-20,]),'DATE':([39,],[73,]),'IN':([45,],[84,]),'PLUS':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[86,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,86,-42,86,86,-50,86,-55,86,-42,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,86,86,86,86,86,]),'MINUS':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[87,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,87,-42,87,87,-50,87,-55,87,-42,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,87,87,87,87,87,]),'TIMES':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[88,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,88,-42,88,88,-50,88,-55,88,-42,88,88,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,88,88,88,88,88,]),'DIVIDE':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[89,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,89,-42,89,89,-50,89,-55,89,-42,89,89,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,89,89,89,89,89,]),'RPAREN':([48,49,50,51,52,53,54,55,56,57,59,60,85,96,98,102,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,165,166,168,182,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-70,131,-50,-55,-75,150,-69,-72,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-73,-74,-71,186,]),'COMMA':([48,49,50,51,52,53,54,55,56,57,59,60,71,98,99,100,102,103,108,109,110,114,117,120,121,122,123,124,125,126,127,128,129,130,131,132,134,144,147,154,164,165,166,174,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,111,-50,133,-53,-55,135,140,-22,-23,-42,-75,151,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,162,163,-58,177,-73,-74,-65,]),'RBRACE':([48,49,50,51,52,53,54,55,56,57,59,60,62,98,101,102,103,121,122,123,124,125,126,127,128,129,130,131,132,134,153,154,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,102,-50,134,-55,-56,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-57,-58,]),'GT':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[90,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'LT':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[91,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'GE':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[92,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'LE':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[93,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'EQ':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[94,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'NE':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[95,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'USING':([75,],[112,]),'AS':([77,],[113,]),'RANGE':([84,],[116,]),}
|
12
12
|
|
13
13
|
_lr_action = {}
|
14
14
|
for _k, _v in _lr_action_items.items():
|
@@ -17,7 +17,7 @@ for _k, _v in _lr_action_items.items():
|
|
17
17
|
_lr_action[_x][_k] = _y
|
18
18
|
del _lr_action_items
|
19
19
|
|
20
|
-
_lr_goto_items = {'start':([0,],[1,]),'metadata':([0,],[2,]),'statements':([0,2,6,
|
20
|
+
_lr_goto_items = {'start':([0,],[1,]),'metadata':([0,],[2,]),'statements':([0,2,6,65,105,157,167,170,181,187,],[3,29,32,106,137,171,178,179,185,188,]),'metadata_items':([0,7,],[4,33,]),'empty':([0,],[5,]),'statement':([0,2,6,65,105,157,167,170,181,187,],[6,6,6,6,6,6,6,6,6,6,]),'metadata_item':([0,7,],[7,7,]),'assignment':([0,2,6,65,105,157,167,170,181,187,],[8,8,8,8,8,8,8,8,8,8,]),'keyword_call':([0,2,6,43,65,105,157,167,170,181,187,],[9,9,9,80,9,9,9,9,9,9,9,]),'remote_keyword_call':([0,2,6,43,65,105,157,167,170,181,187,],[10,10,10,81,10,10,10,10,10,10,10,]),'loop':([0,2,6,65,105,157,167,170,181,187,],[11,11,11,11,11,11,11,11,11,11,]),'custom_keyword':([0,2,6,65,105,157,167,170,181,187,],[12,12,12,12,12,12,12,12,12,12,]),'return_statement':([0,2,6,65,105,157,167,170,181,187,],[13,13,13,13,13,13,13,13,13,13,]),'if_statement':([0,2,6,65,105,157,167,170,181,187,],[14,14,14,14,14,14,14,14,14,14,]),'teardown':([3,29,],[30,64,]),'expression':([27,28,43,58,61,62,82,86,87,88,89,133,135,136,148,159,161,177,],[47,63,79,96,100,104,100,121,122,123,124,100,104,154,164,173,174,182,]),'expr_atom':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[48,48,48,48,48,48,48,48,48,48,48,125,126,127,128,129,130,48,48,48,48,48,48,48,]),'comparison_expr':([27,28,43,58,61,62,82,86,87,88,89,133,135,136,148,159,161,177,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,]),'arithmetic_expr':([27,28,43,58,61,62,82,86,87,88,89,133,135,136,148,159,161,177,],[50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,]),'boolean_expr':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,]),'list_expr':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,]),'dict_expr':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,]),'metadata_value':([34,35,38,],[66,69,72,]),'data_source':([40,],[74,]),'list_items':([61,82,133,],[97,97,152,]),'list_item':([61,82,133,],[99,99,99,]),'dict_items':([62,135,],[101,153,]),'dict_item':([62,135,],[103,103,]),'tags':([70,140,],[107,160,]),'tag':([70,140,],[108,108,]),'param_definitions':([85,],[118,]),'param_def_list':([85,151,],[119,168,]),'param_def':([85,151,],[120,120,]),'parameter_list':([111,163,],[142,176,]),'parameter_items':([111,162,163,],[143,175,143,]),'parameter_item':([111,162,163,],[144,144,144,]),'elif_clauses':([137,158,],[156,172,]),'elif_clause':([137,158,],[158,158,]),}
|
21
21
|
|
22
22
|
_lr_goto = {}
|
23
23
|
for _k, _v in _lr_goto_items.items():
|
@@ -71,44 +71,55 @@ _lr_productions = [
|
|
71
71
|
('expr_atom -> ID','expr_atom',1,'p_expr_atom','parser.py',158),
|
72
72
|
('expr_atom -> boolean_expr','expr_atom',1,'p_expr_atom','parser.py',159),
|
73
73
|
('expr_atom -> list_expr','expr_atom',1,'p_expr_atom','parser.py',160),
|
74
|
-
('expr_atom ->
|
75
|
-
('
|
76
|
-
('boolean_expr ->
|
77
|
-
('
|
78
|
-
('list_expr -> LBRACKET RBRACKET','list_expr',
|
79
|
-
('
|
80
|
-
('list_items -> list_item
|
81
|
-
('
|
82
|
-
('
|
83
|
-
('
|
84
|
-
('
|
85
|
-
('
|
86
|
-
('
|
87
|
-
('
|
88
|
-
('
|
89
|
-
('
|
90
|
-
('
|
91
|
-
('
|
92
|
-
('
|
93
|
-
('
|
94
|
-
('
|
95
|
-
('
|
96
|
-
('
|
97
|
-
('
|
98
|
-
('
|
99
|
-
('
|
100
|
-
('
|
101
|
-
('
|
102
|
-
('
|
103
|
-
('
|
104
|
-
('
|
105
|
-
('
|
106
|
-
('
|
107
|
-
('
|
108
|
-
('
|
109
|
-
('
|
110
|
-
('
|
111
|
-
('
|
112
|
-
('
|
113
|
-
('
|
74
|
+
('expr_atom -> dict_expr','expr_atom',1,'p_expr_atom','parser.py',161),
|
75
|
+
('expr_atom -> LPAREN expression RPAREN','expr_atom',3,'p_expr_atom','parser.py',162),
|
76
|
+
('boolean_expr -> TRUE','boolean_expr',1,'p_boolean_expr','parser.py',173),
|
77
|
+
('boolean_expr -> FALSE','boolean_expr',1,'p_boolean_expr','parser.py',174),
|
78
|
+
('list_expr -> LBRACKET list_items RBRACKET','list_expr',3,'p_list_expr','parser.py',179),
|
79
|
+
('list_expr -> LBRACKET RBRACKET','list_expr',2,'p_list_expr','parser.py',180),
|
80
|
+
('list_items -> list_item','list_items',1,'p_list_items','parser.py',188),
|
81
|
+
('list_items -> list_item COMMA list_items','list_items',3,'p_list_items','parser.py',189),
|
82
|
+
('list_item -> expression','list_item',1,'p_list_item','parser.py',197),
|
83
|
+
('dict_expr -> LBRACE dict_items RBRACE','dict_expr',3,'p_dict_expr','parser.py',202),
|
84
|
+
('dict_expr -> LBRACE RBRACE','dict_expr',2,'p_dict_expr','parser.py',203),
|
85
|
+
('dict_items -> dict_item','dict_items',1,'p_dict_items','parser.py',211),
|
86
|
+
('dict_items -> dict_item COMMA dict_items','dict_items',3,'p_dict_items','parser.py',212),
|
87
|
+
('dict_item -> expression COLON expression','dict_item',3,'p_dict_item','parser.py',220),
|
88
|
+
('loop -> FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END','loop',12,'p_loop','parser.py',225),
|
89
|
+
('keyword_call -> LBRACKET ID RBRACKET COMMA parameter_list','keyword_call',5,'p_keyword_call','parser.py',230),
|
90
|
+
('keyword_call -> LBRACKET ID RBRACKET','keyword_call',3,'p_keyword_call','parser.py',231),
|
91
|
+
('parameter_list -> parameter_items','parameter_list',1,'p_parameter_list','parser.py',239),
|
92
|
+
('parameter_items -> parameter_item COMMA parameter_items','parameter_items',3,'p_parameter_items','parser.py',244),
|
93
|
+
('parameter_items -> parameter_item','parameter_items',1,'p_parameter_items','parser.py',245),
|
94
|
+
('parameter_item -> ID COLON expression','parameter_item',3,'p_parameter_item','parser.py',253),
|
95
|
+
('teardown -> TEARDOWN DO statements END','teardown',4,'p_teardown','parser.py',258),
|
96
|
+
('data_source -> STRING USING ID','data_source',3,'p_data_source','parser.py',263),
|
97
|
+
('custom_keyword -> FUNCTION ID LPAREN param_definitions RPAREN DO statements END','custom_keyword',8,'p_custom_keyword','parser.py',268),
|
98
|
+
('param_definitions -> param_def_list','param_definitions',1,'p_param_definitions','parser.py',273),
|
99
|
+
('param_definitions -> <empty>','param_definitions',0,'p_param_definitions','parser.py',274),
|
100
|
+
('param_def_list -> param_def COMMA param_def_list','param_def_list',3,'p_param_def_list','parser.py',282),
|
101
|
+
('param_def_list -> param_def','param_def_list',1,'p_param_def_list','parser.py',283),
|
102
|
+
('param_def -> ID EQUALS STRING','param_def',3,'p_param_def','parser.py',291),
|
103
|
+
('param_def -> ID EQUALS NUMBER','param_def',3,'p_param_def','parser.py',292),
|
104
|
+
('param_def -> ID','param_def',1,'p_param_def','parser.py',293),
|
105
|
+
('return_statement -> RETURN expression','return_statement',2,'p_return_statement','parser.py',301),
|
106
|
+
('if_statement -> IF expression DO statements END','if_statement',5,'p_if_statement','parser.py',306),
|
107
|
+
('if_statement -> IF expression DO statements elif_clauses END','if_statement',6,'p_if_statement','parser.py',307),
|
108
|
+
('if_statement -> IF expression DO statements ELSE statements END','if_statement',7,'p_if_statement','parser.py',308),
|
109
|
+
('if_statement -> IF expression DO statements elif_clauses ELSE statements END','if_statement',8,'p_if_statement','parser.py',309),
|
110
|
+
('elif_clauses -> elif_clause','elif_clauses',1,'p_elif_clauses','parser.py',325),
|
111
|
+
('elif_clauses -> elif_clause elif_clauses','elif_clauses',2,'p_elif_clauses','parser.py',326),
|
112
|
+
('elif_clause -> ELIF expression DO statements','elif_clause',4,'p_elif_clause','parser.py',334),
|
113
|
+
('comparison_expr -> expr_atom GT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',339),
|
114
|
+
('comparison_expr -> expr_atom LT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',340),
|
115
|
+
('comparison_expr -> expr_atom GE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',341),
|
116
|
+
('comparison_expr -> expr_atom LE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',342),
|
117
|
+
('comparison_expr -> expr_atom EQ expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',343),
|
118
|
+
('comparison_expr -> expr_atom NE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',344),
|
119
|
+
('arithmetic_expr -> expression PLUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',367),
|
120
|
+
('arithmetic_expr -> expression MINUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',368),
|
121
|
+
('arithmetic_expr -> expression TIMES expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',369),
|
122
|
+
('arithmetic_expr -> expression DIVIDE expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',370),
|
123
|
+
('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET COMMA parameter_list','remote_keyword_call',7,'p_remote_keyword_call','parser.py',401),
|
124
|
+
('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET','remote_keyword_call',5,'p_remote_keyword_call','parser.py',402),
|
114
125
|
]
|
pytest_dsl/core/utils.py
CHANGED
@@ -10,34 +10,54 @@ from pytest_dsl.core.global_context import global_context
|
|
10
10
|
|
11
11
|
|
12
12
|
def replace_variables_in_string(value: str) -> str:
|
13
|
-
"""
|
14
|
-
|
13
|
+
"""替换字符串中的变量引用
|
14
|
+
|
15
|
+
支持多种访问语法:
|
16
|
+
- 基本变量: ${variable}
|
17
|
+
- 点号访问: ${object.property}
|
18
|
+
- 数组索引: ${array[0]}, ${array[-1]}
|
19
|
+
- 字典键访问: ${dict["key"]}, ${dict['key']}
|
20
|
+
- 混合访问: ${users[0].name}, ${data["users"][0]["name"]}
|
21
|
+
|
15
22
|
Args:
|
16
23
|
value: 包含变量引用的字符串
|
17
|
-
|
24
|
+
|
18
25
|
Returns:
|
19
26
|
替换后的字符串
|
20
27
|
"""
|
21
28
|
if not isinstance(value, str):
|
22
29
|
return value
|
23
|
-
|
30
|
+
|
31
|
+
# 使用新的变量替换器
|
32
|
+
from pytest_dsl.core.variable_utils import VariableReplacer
|
33
|
+
replacer = VariableReplacer()
|
34
|
+
|
35
|
+
try:
|
36
|
+
return replacer.replace_in_string(value)
|
37
|
+
except KeyError:
|
38
|
+
# 如果新的替换器失败,回退到旧的逻辑以保持兼容性
|
39
|
+
return _legacy_replace_variables_in_string(value)
|
40
|
+
|
41
|
+
|
42
|
+
def _legacy_replace_variables_in_string(value: str) -> str:
|
43
|
+
"""旧版变量替换逻辑(保持向后兼容性)"""
|
24
44
|
# 基本变量引用模式: ${variable}
|
25
45
|
basic_pattern = r'\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}'
|
26
|
-
|
46
|
+
|
27
47
|
# 嵌套引用模式: ${variable.field.subfield}
|
28
48
|
nested_pattern = r'\$\{([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)+)\}'
|
29
|
-
|
49
|
+
|
30
50
|
# 先处理嵌套引用
|
31
51
|
matches = list(re.finditer(nested_pattern, value))
|
32
52
|
for match in reversed(matches):
|
33
53
|
var_ref = match.group(1) # 例如: "api_test_data.user_id"
|
34
54
|
parts = var_ref.split('.')
|
35
|
-
|
55
|
+
|
36
56
|
# 获取根变量
|
37
57
|
root_var_name = parts[0]
|
38
58
|
if context_has_variable(root_var_name):
|
39
59
|
root_var = get_variable(root_var_name)
|
40
|
-
|
60
|
+
|
41
61
|
# 递归访问嵌套属性
|
42
62
|
var_value = root_var
|
43
63
|
for part in parts[1:]:
|
@@ -47,10 +67,10 @@ def replace_variables_in_string(value: str) -> str:
|
|
47
67
|
# 无法解析的属性路径
|
48
68
|
var_value = f"${{{var_ref}}}" # 保持原样
|
49
69
|
break
|
50
|
-
|
70
|
+
|
51
71
|
# 替换变量引用
|
52
72
|
value = value[:match.start()] + str(var_value) + value[match.end():]
|
53
|
-
|
73
|
+
|
54
74
|
# 再处理基本引用
|
55
75
|
matches = list(re.finditer(basic_pattern, value))
|
56
76
|
for match in reversed(matches):
|
@@ -58,16 +78,16 @@ def replace_variables_in_string(value: str) -> str:
|
|
58
78
|
if context_has_variable(var_name):
|
59
79
|
var_value = get_variable(var_name)
|
60
80
|
value = value[:match.start()] + str(var_value) + value[match.end():]
|
61
|
-
|
81
|
+
|
62
82
|
return value
|
63
83
|
|
64
84
|
|
65
85
|
def replace_variables_in_dict(data: Union[Dict, List, str]) -> Union[Dict, List, str]:
|
66
86
|
"""递归替换字典中的变量引用
|
67
|
-
|
87
|
+
|
68
88
|
Args:
|
69
89
|
data: 包含变量引用的字典、列表或字符串
|
70
|
-
|
90
|
+
|
71
91
|
Returns:
|
72
92
|
替换变量后的数据
|
73
93
|
"""
|
@@ -87,13 +107,13 @@ def context_has_variable(var_name: str) -> bool:
|
|
87
107
|
from pytest_dsl.core.yaml_vars import yaml_vars
|
88
108
|
if yaml_vars.get_variable(var_name) is not None:
|
89
109
|
return True
|
90
|
-
|
110
|
+
|
91
111
|
# 检查测试上下文
|
92
112
|
from pytest_dsl.core.keyword_manager import keyword_manager
|
93
113
|
current_context = getattr(keyword_manager, 'current_context', None)
|
94
114
|
if current_context and current_context.has(var_name):
|
95
115
|
return True
|
96
|
-
|
116
|
+
|
97
117
|
# 再检查全局上下文
|
98
118
|
return global_context.has_variable(var_name)
|
99
119
|
|
@@ -105,33 +125,33 @@ def get_variable(var_name: str) -> Any:
|
|
105
125
|
yaml_value = yaml_vars.get_variable(var_name)
|
106
126
|
if yaml_value is not None:
|
107
127
|
return yaml_value
|
108
|
-
|
128
|
+
|
109
129
|
# 检查测试上下文
|
110
130
|
from pytest_dsl.core.keyword_manager import keyword_manager
|
111
131
|
current_context = getattr(keyword_manager, 'current_context', None)
|
112
132
|
if current_context and current_context.has(var_name):
|
113
133
|
return current_context.get(var_name)
|
114
|
-
|
134
|
+
|
115
135
|
# 再从全局上下文获取
|
116
136
|
if global_context.has_variable(var_name):
|
117
137
|
return global_context.get_variable(var_name)
|
118
|
-
|
138
|
+
|
119
139
|
# 如果都没有找到,返回变量引用本身
|
120
140
|
return f"${{{var_name}}}"
|
121
141
|
|
122
142
|
|
123
143
|
def deep_merge(base: Dict, override: Dict) -> Dict:
|
124
144
|
"""深度合并两个字典
|
125
|
-
|
145
|
+
|
126
146
|
Args:
|
127
147
|
base: 基础字典
|
128
148
|
override: 覆盖字典
|
129
|
-
|
149
|
+
|
130
150
|
Returns:
|
131
151
|
合并后的字典
|
132
152
|
"""
|
133
153
|
result = base.copy()
|
134
|
-
|
154
|
+
|
135
155
|
for key, value in override.items():
|
136
156
|
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
|
137
157
|
# 递归合并嵌套字典
|
@@ -142,5 +162,5 @@ def deep_merge(base: Dict, override: Dict) -> Dict:
|
|
142
162
|
else:
|
143
163
|
# 覆盖或添加值
|
144
164
|
result[key] = value
|
145
|
-
|
146
|
-
return result
|
165
|
+
|
166
|
+
return result
|