pytest-dsl 0.5.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/cli.py +28 -33
- pytest_dsl/core/auto_decorator.py +72 -53
- pytest_dsl/core/auto_directory.py +8 -5
- pytest_dsl/core/dsl_executor.py +91 -23
- pytest_dsl/core/http_request.py +272 -221
- pytest_dsl/core/lexer.py +17 -17
- pytest_dsl/core/parser.py +52 -4
- pytest_dsl/core/parsetab.py +81 -70
- pytest_dsl/core/plugin_discovery.py +1 -8
- pytest_dsl/core/utils.py +43 -23
- pytest_dsl/core/variable_utils.py +215 -70
- pytest_dsl/core/yaml_loader.py +96 -19
- pytest_dsl/examples/assert/assertion_example.auto +1 -1
- pytest_dsl/examples/assert/boolean_test.auto +2 -2
- pytest_dsl/examples/assert/expression_test.auto +1 -1
- pytest_dsl/examples/custom/test_advanced_keywords.auto +2 -2
- pytest_dsl/examples/custom/test_custom_keywords.auto +2 -2
- pytest_dsl/examples/custom/test_default_values.auto +2 -2
- pytest_dsl/examples/http/file_reference_test.auto +1 -1
- pytest_dsl/examples/http/http_advanced.auto +1 -1
- pytest_dsl/examples/http/http_example.auto +1 -1
- pytest_dsl/examples/http/http_length_test.auto +1 -1
- pytest_dsl/examples/http/http_retry_assertions.auto +1 -1
- pytest_dsl/examples/http/http_retry_assertions_enhanced.auto +2 -2
- pytest_dsl/examples/http/http_with_yaml.auto +1 -1
- pytest_dsl/examples/quickstart/api_basics.auto +1 -1
- pytest_dsl/examples/quickstart/assertions.auto +1 -1
- pytest_dsl/examples/quickstart/loops.auto +2 -2
- pytest_dsl/keywords/assertion_keywords.py +76 -62
- pytest_dsl/keywords/global_keywords.py +43 -4
- pytest_dsl/keywords/http_keywords.py +58 -56
- pytest_dsl-0.7.0.dist-info/METADATA +1040 -0
- pytest_dsl-0.7.0.dist-info/RECORD +67 -0
- {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/WHEEL +1 -1
- pytest_dsl/parsetab.py +0 -69
- pytest_dsl-0.5.0.dist-info/METADATA +0 -596
- pytest_dsl-0.5.0.dist-info/RECORD +0 -68
- {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/entry_points.txt +0 -0
- {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/licenses/LICENSE +0 -0
- {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/top_level.txt +0 -0
pytest_dsl/core/lexer.py
CHANGED
@@ -12,8 +12,11 @@ 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
|
-
'as': 'AS' # 添加as关键字支持,用于远程关键字别名
|
17
|
+
'as': 'AS', # 添加as关键字支持,用于远程关键字别名
|
18
|
+
'function': 'FUNCTION', # 添加function关键字支持,用于自定义关键字定义
|
19
|
+
'teardown': 'TEARDOWN' # 添加teardown关键字支持,用于清理操作
|
17
20
|
}
|
18
21
|
|
19
22
|
# token 名称列表
|
@@ -27,6 +30,8 @@ tokens = [
|
|
27
30
|
'RPAREN',
|
28
31
|
'LBRACKET',
|
29
32
|
'RBRACKET',
|
33
|
+
'LBRACE', # 左大括号 {,用于字典字面量
|
34
|
+
'RBRACE', # 右大括号 },用于字典字面量
|
30
35
|
'COLON',
|
31
36
|
'COMMA',
|
32
37
|
'PLACEHOLDER',
|
@@ -35,9 +40,7 @@ tokens = [
|
|
35
40
|
'TAGS_KEYWORD',
|
36
41
|
'AUTHOR_KEYWORD',
|
37
42
|
'DATE_KEYWORD',
|
38
|
-
'TEARDOWN_KEYWORD',
|
39
43
|
'DATA_KEYWORD', # Add new token for @data keyword
|
40
|
-
'KEYWORD_KEYWORD', # 添加@keyword关键字
|
41
44
|
'IMPORT_KEYWORD', # 添加@import关键字
|
42
45
|
'REMOTE_KEYWORD', # 添加@remote关键字
|
43
46
|
'GT', # 大于 >
|
@@ -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'\|'
|
@@ -132,29 +138,23 @@ def t_DATE_KEYWORD(t):
|
|
132
138
|
return t
|
133
139
|
|
134
140
|
|
135
|
-
def t_TEARDOWN_KEYWORD(t):
|
136
|
-
r'@teardown'
|
137
|
-
return t
|
138
|
-
|
139
|
-
|
140
141
|
def t_DATA_KEYWORD(t):
|
141
142
|
r'@data'
|
142
143
|
return t
|
143
144
|
|
144
145
|
|
145
|
-
def t_KEYWORD_KEYWORD(t):
|
146
|
-
r'@keyword'
|
147
|
-
return t
|
148
|
-
|
149
|
-
|
150
146
|
def t_IMPORT_KEYWORD(t):
|
151
147
|
r'@import'
|
152
148
|
return t
|
153
149
|
|
154
150
|
|
155
151
|
def t_NUMBER(t):
|
156
|
-
r'\d+'
|
157
|
-
|
152
|
+
r'\d+(\.\d+)?'
|
153
|
+
# 如果包含小数点,转换为浮点数;否则转换为整数
|
154
|
+
if '.' in t.value:
|
155
|
+
t.value = float(t.value)
|
156
|
+
else:
|
157
|
+
t.value = int(t.value)
|
158
158
|
return t
|
159
159
|
|
160
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])
|
@@ -231,7 +255,7 @@ def p_parameter_item(p):
|
|
231
255
|
|
232
256
|
|
233
257
|
def p_teardown(p):
|
234
|
-
'''teardown :
|
258
|
+
'''teardown : TEARDOWN DO statements END'''
|
235
259
|
p[0] = Node('Teardown', [p[3]])
|
236
260
|
|
237
261
|
|
@@ -241,7 +265,7 @@ def p_data_source(p):
|
|
241
265
|
|
242
266
|
|
243
267
|
def p_custom_keyword(p):
|
244
|
-
'''custom_keyword :
|
268
|
+
'''custom_keyword : FUNCTION ID LPAREN param_definitions RPAREN DO statements END'''
|
245
269
|
p[0] = Node('CustomKeyword', [p[4], p[7]], p[2])
|
246
270
|
|
247
271
|
|
@@ -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 GE GT ID IF IMPORT_KEYWORD IN
|
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,]),'KEYWORD_KEYWORD':([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_KEYWORD':([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():
|
@@ -44,71 +44,82 @@ _lr_productions = [
|
|
44
44
|
('metadata_item -> DATA_KEYWORD COLON data_source','metadata_item',3,'p_metadata_item','parser.py',70),
|
45
45
|
('metadata_item -> IMPORT_KEYWORD COLON STRING','metadata_item',3,'p_metadata_item','parser.py',71),
|
46
46
|
('metadata_item -> REMOTE_KEYWORD COLON STRING AS ID','metadata_item',5,'p_metadata_item','parser.py',72),
|
47
|
-
('metadata_value -> STRING','metadata_value',1,'p_metadata_value','parser.py',
|
48
|
-
('metadata_value -> ID','metadata_value',1,'p_metadata_value','parser.py',
|
49
|
-
('tags -> tag COMMA tags','tags',3,'p_tags','parser.py',
|
50
|
-
('tags -> tag','tags',1,'p_tags','parser.py',
|
51
|
-
('tag -> STRING','tag',1,'p_tag','parser.py',
|
52
|
-
('tag -> ID','tag',1,'p_tag','parser.py',
|
53
|
-
('statements -> statement statements','statements',2,'p_statements','parser.py',
|
54
|
-
('statements -> statement','statements',1,'p_statements','parser.py',
|
55
|
-
('statement -> assignment','statement',1,'p_statement','parser.py',
|
56
|
-
('statement -> keyword_call','statement',1,'p_statement','parser.py',
|
57
|
-
('statement -> remote_keyword_call','statement',1,'p_statement','parser.py',
|
58
|
-
('statement -> loop','statement',1,'p_statement','parser.py',
|
59
|
-
('statement -> custom_keyword','statement',1,'p_statement','parser.py',
|
60
|
-
('statement -> return_statement','statement',1,'p_statement','parser.py',
|
61
|
-
('statement -> if_statement','statement',1,'p_statement','parser.py',
|
62
|
-
('assignment -> ID EQUALS expression','assignment',3,'p_assignment','parser.py',
|
63
|
-
('assignment -> ID EQUALS keyword_call','assignment',3,'p_assignment','parser.py',
|
64
|
-
('assignment -> ID EQUALS remote_keyword_call','assignment',3,'p_assignment','parser.py',
|
65
|
-
('expression -> expr_atom','expression',1,'p_expression','parser.py',
|
66
|
-
('expression -> comparison_expr','expression',1,'p_expression','parser.py',
|
67
|
-
('expression -> arithmetic_expr','expression',1,'p_expression','parser.py',
|
68
|
-
('expr_atom -> NUMBER','expr_atom',1,'p_expr_atom','parser.py',
|
69
|
-
('expr_atom -> STRING','expr_atom',1,'p_expr_atom','parser.py',
|
70
|
-
('expr_atom -> PLACEHOLDER','expr_atom',1,'p_expr_atom','parser.py',
|
71
|
-
('expr_atom -> ID','expr_atom',1,'p_expr_atom','parser.py',
|
72
|
-
('expr_atom -> boolean_expr','expr_atom',1,'p_expr_atom','parser.py',
|
73
|
-
('expr_atom -> list_expr','expr_atom',1,'p_expr_atom','parser.py',
|
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
|
-
('
|
47
|
+
('metadata_value -> STRING','metadata_value',1,'p_metadata_value','parser.py',91),
|
48
|
+
('metadata_value -> ID','metadata_value',1,'p_metadata_value','parser.py',92),
|
49
|
+
('tags -> tag COMMA tags','tags',3,'p_tags','parser.py',97),
|
50
|
+
('tags -> tag','tags',1,'p_tags','parser.py',98),
|
51
|
+
('tag -> STRING','tag',1,'p_tag','parser.py',106),
|
52
|
+
('tag -> ID','tag',1,'p_tag','parser.py',107),
|
53
|
+
('statements -> statement statements','statements',2,'p_statements','parser.py',112),
|
54
|
+
('statements -> statement','statements',1,'p_statements','parser.py',113),
|
55
|
+
('statement -> assignment','statement',1,'p_statement','parser.py',121),
|
56
|
+
('statement -> keyword_call','statement',1,'p_statement','parser.py',122),
|
57
|
+
('statement -> remote_keyword_call','statement',1,'p_statement','parser.py',123),
|
58
|
+
('statement -> loop','statement',1,'p_statement','parser.py',124),
|
59
|
+
('statement -> custom_keyword','statement',1,'p_statement','parser.py',125),
|
60
|
+
('statement -> return_statement','statement',1,'p_statement','parser.py',126),
|
61
|
+
('statement -> if_statement','statement',1,'p_statement','parser.py',127),
|
62
|
+
('assignment -> ID EQUALS expression','assignment',3,'p_assignment','parser.py',132),
|
63
|
+
('assignment -> ID EQUALS keyword_call','assignment',3,'p_assignment','parser.py',133),
|
64
|
+
('assignment -> ID EQUALS remote_keyword_call','assignment',3,'p_assignment','parser.py',134),
|
65
|
+
('expression -> expr_atom','expression',1,'p_expression','parser.py',144),
|
66
|
+
('expression -> comparison_expr','expression',1,'p_expression','parser.py',145),
|
67
|
+
('expression -> arithmetic_expr','expression',1,'p_expression','parser.py',146),
|
68
|
+
('expr_atom -> NUMBER','expr_atom',1,'p_expr_atom','parser.py',155),
|
69
|
+
('expr_atom -> STRING','expr_atom',1,'p_expr_atom','parser.py',156),
|
70
|
+
('expr_atom -> PLACEHOLDER','expr_atom',1,'p_expr_atom','parser.py',157),
|
71
|
+
('expr_atom -> ID','expr_atom',1,'p_expr_atom','parser.py',158),
|
72
|
+
('expr_atom -> boolean_expr','expr_atom',1,'p_expr_atom','parser.py',159),
|
73
|
+
('expr_atom -> list_expr','expr_atom',1,'p_expr_atom','parser.py',160),
|
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
|
]
|
@@ -114,15 +114,8 @@ def scan_local_keywords() -> None:
|
|
114
114
|
"""
|
115
115
|
扫描本地keywords目录中的关键字
|
116
116
|
|
117
|
-
|
118
|
-
2. 再查找并导入用户项目根目录下的keywords目录中的Python模块
|
117
|
+
再查找并导入用户项目根目录下的keywords目录中的Python模块
|
119
118
|
"""
|
120
|
-
# 1. 尝试导入内置的keywords包
|
121
|
-
try:
|
122
|
-
import keywords
|
123
|
-
except ImportError:
|
124
|
-
print("提示: 未找到内置关键字包")
|
125
|
-
|
126
119
|
# 2. 查找并导入用户项目中的keywords目录
|
127
120
|
try:
|
128
121
|
# 获取当前工作目录,通常是用户项目的根目录
|
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
|