pytest-dsl 0.4.0__py3-none-any.whl → 0.6.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.
Files changed (36) hide show
  1. pytest_dsl/cli.py +28 -33
  2. pytest_dsl/core/auto_decorator.py +72 -53
  3. pytest_dsl/core/auto_directory.py +8 -5
  4. pytest_dsl/core/dsl_executor.py +211 -53
  5. pytest_dsl/core/http_request.py +272 -221
  6. pytest_dsl/core/lexer.py +14 -13
  7. pytest_dsl/core/parser.py +27 -8
  8. pytest_dsl/core/parsetab.py +71 -66
  9. pytest_dsl/core/plugin_discovery.py +1 -8
  10. pytest_dsl/core/yaml_loader.py +96 -19
  11. pytest_dsl/examples/assert/assertion_example.auto +1 -1
  12. pytest_dsl/examples/assert/boolean_test.auto +2 -2
  13. pytest_dsl/examples/assert/expression_test.auto +1 -1
  14. pytest_dsl/examples/custom/test_advanced_keywords.auto +2 -2
  15. pytest_dsl/examples/custom/test_custom_keywords.auto +2 -2
  16. pytest_dsl/examples/custom/test_default_values.auto +2 -2
  17. pytest_dsl/examples/http/file_reference_test.auto +1 -1
  18. pytest_dsl/examples/http/http_advanced.auto +1 -1
  19. pytest_dsl/examples/http/http_example.auto +1 -1
  20. pytest_dsl/examples/http/http_length_test.auto +1 -1
  21. pytest_dsl/examples/http/http_retry_assertions.auto +1 -1
  22. pytest_dsl/examples/http/http_retry_assertions_enhanced.auto +2 -2
  23. pytest_dsl/examples/http/http_with_yaml.auto +1 -1
  24. pytest_dsl/examples/quickstart/api_basics.auto +1 -1
  25. pytest_dsl/examples/quickstart/assertions.auto +1 -1
  26. pytest_dsl/examples/quickstart/loops.auto +2 -2
  27. pytest_dsl/keywords/assertion_keywords.py +76 -62
  28. pytest_dsl/keywords/global_keywords.py +43 -4
  29. pytest_dsl/keywords/http_keywords.py +141 -139
  30. {pytest_dsl-0.4.0.dist-info → pytest_dsl-0.6.0.dist-info}/METADATA +266 -15
  31. pytest_dsl-0.6.0.dist-info/RECORD +68 -0
  32. {pytest_dsl-0.4.0.dist-info → pytest_dsl-0.6.0.dist-info}/WHEEL +1 -1
  33. {pytest_dsl-0.4.0.dist-info → pytest_dsl-0.6.0.dist-info}/entry_points.txt +1 -0
  34. pytest_dsl-0.4.0.dist-info/RECORD +0 -68
  35. {pytest_dsl-0.4.0.dist-info → pytest_dsl-0.6.0.dist-info}/licenses/LICENSE +0 -0
  36. {pytest_dsl-0.4.0.dist-info → pytest_dsl-0.6.0.dist-info}/top_level.txt +0 -0
pytest_dsl/core/lexer.py CHANGED
@@ -12,7 +12,10 @@ reserved = {
12
12
  'False': 'FALSE', # 添加布尔值支持
13
13
  'return': 'RETURN', # 添加return关键字支持
14
14
  'else': 'ELSE', # 添加else关键字支持
15
- 'if': 'IF' # 添加if关键字支持
15
+ 'if': 'IF', # 添加if关键字支持
16
+ 'as': 'AS', # 添加as关键字支持,用于远程关键字别名
17
+ 'function': 'FUNCTION', # 添加function关键字支持,用于自定义关键字定义
18
+ 'teardown': 'TEARDOWN' # 添加teardown关键字支持,用于清理操作
16
19
  }
17
20
 
18
21
  # token 名称列表
@@ -34,10 +37,9 @@ tokens = [
34
37
  'TAGS_KEYWORD',
35
38
  'AUTHOR_KEYWORD',
36
39
  'DATE_KEYWORD',
37
- 'TEARDOWN_KEYWORD',
38
40
  'DATA_KEYWORD', # Add new token for @data keyword
39
- 'KEYWORD_KEYWORD', # 添加@keyword关键字
40
41
  'IMPORT_KEYWORD', # 添加@import关键字
42
+ 'REMOTE_KEYWORD', # 添加@remote关键字
41
43
  'GT', # 大于 >
42
44
  'LT', # 小于 <
43
45
  'GE', # 大于等于 >=
@@ -48,6 +50,7 @@ tokens = [
48
50
  'MINUS', # 减法 -
49
51
  'TIMES', # 乘法 *
50
52
  'DIVIDE', # 除法 /
53
+ 'PIPE', # 管道符 |,用于远程关键字调用
51
54
  ] + list(reserved.values())
52
55
 
53
56
  # 正则表达式定义 token
@@ -72,6 +75,14 @@ t_DIVIDE = r'/'
72
75
  # 增加PLACEHOLDER规则,匹配 ${变量名} 格式
73
76
  t_PLACEHOLDER = r'\$\{[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*\}'
74
77
 
78
+ # 添加管道符的正则表达式定义
79
+ t_PIPE = r'\|'
80
+
81
+ # 添加@remote关键字的token规则
82
+ def t_REMOTE_KEYWORD(t):
83
+ r'@remote'
84
+ return t
85
+
75
86
 
76
87
  def t_DATE(t):
77
88
  r'\d{4}-\d{2}-\d{2}(\s+\d{2}:\d{2}:\d{2})?'
@@ -121,21 +132,11 @@ def t_DATE_KEYWORD(t):
121
132
  return t
122
133
 
123
134
 
124
- def t_TEARDOWN_KEYWORD(t):
125
- r'@teardown'
126
- return t
127
-
128
-
129
135
  def t_DATA_KEYWORD(t):
130
136
  r'@data'
131
137
  return t
132
138
 
133
139
 
134
- def t_KEYWORD_KEYWORD(t):
135
- r'@keyword'
136
- return t
137
-
138
-
139
140
  def t_IMPORT_KEYWORD(t):
140
141
  r'@import'
141
142
  return t
pytest_dsl/core/parser.py CHANGED
@@ -68,7 +68,8 @@ def p_metadata_item(p):
68
68
  | AUTHOR_KEYWORD COLON metadata_value
69
69
  | DATE_KEYWORD COLON DATE
70
70
  | DATA_KEYWORD COLON data_source
71
- | IMPORT_KEYWORD COLON STRING'''
71
+ | IMPORT_KEYWORD COLON STRING
72
+ | REMOTE_KEYWORD COLON STRING AS ID'''
72
73
  if p[1] == '@tags':
73
74
  p[0] = Node(p[1], value=p[4])
74
75
  elif p[1] == '@data':
@@ -76,7 +77,12 @@ def p_metadata_item(p):
76
77
  data_info = p[3] # 这是一个包含 file 和 format 的字典
77
78
  p[0] = Node(p[1], value=data_info, children=None)
78
79
  elif p[1] == '@import':
80
+ # 检查是否是远程导入格式
79
81
  p[0] = Node(p[1], value=p[3])
82
+ elif p[1] == '@remote':
83
+ # 对于远程关键字导入,存储URL和别名
84
+ print(f"解析远程关键字导入: URL={p[3]}, 别名={p[5]}")
85
+ p[0] = Node('RemoteImport', value={'url': p[3], 'alias': p[5]})
80
86
  else:
81
87
  p[0] = Node(p[1], value=p[3])
82
88
 
@@ -114,6 +120,7 @@ def p_statements(p):
114
120
  def p_statement(p):
115
121
  '''statement : assignment
116
122
  | keyword_call
123
+ | remote_keyword_call
117
124
  | loop
118
125
  | custom_keyword
119
126
  | return_statement
@@ -123,9 +130,12 @@ def p_statement(p):
123
130
 
124
131
  def p_assignment(p):
125
132
  '''assignment : ID EQUALS expression
126
- | ID EQUALS keyword_call'''
133
+ | ID EQUALS keyword_call
134
+ | ID EQUALS remote_keyword_call'''
127
135
  if isinstance(p[3], Node) and p[3].type == 'KeywordCall':
128
136
  p[0] = Node('AssignmentKeywordCall', [p[3]], p[1])
137
+ elif isinstance(p[3], Node) and p[3].type == 'RemoteKeywordCall':
138
+ p[0] = Node('AssignmentRemoteKeywordCall', [p[3]], p[1])
129
139
  else:
130
140
  p[0] = Node('Assignment', value=p[1], children=[p[3]])
131
141
 
@@ -221,7 +231,7 @@ def p_parameter_item(p):
221
231
 
222
232
 
223
233
  def p_teardown(p):
224
- '''teardown : TEARDOWN_KEYWORD DO statements END'''
234
+ '''teardown : TEARDOWN DO statements END'''
225
235
  p[0] = Node('Teardown', [p[3]])
226
236
 
227
237
 
@@ -231,7 +241,7 @@ def p_data_source(p):
231
241
 
232
242
 
233
243
  def p_custom_keyword(p):
234
- '''custom_keyword : KEYWORD_KEYWORD ID LPAREN param_definitions RPAREN DO statements END'''
244
+ '''custom_keyword : FUNCTION ID LPAREN param_definitions RPAREN DO statements END'''
235
245
  p[0] = Node('CustomKeyword', [p[4], p[7]], p[2])
236
246
 
237
247
 
@@ -284,7 +294,7 @@ def p_comparison_expr(p):
284
294
  | expr_atom LE expr_atom
285
295
  | expr_atom EQ expr_atom
286
296
  | expr_atom NE expr_atom'''
287
-
297
+
288
298
  # 根据规则索引判断使用的是哪个操作符
289
299
  if p.slice[2].type == 'GT':
290
300
  operator = '>'
@@ -301,7 +311,7 @@ def p_comparison_expr(p):
301
311
  else:
302
312
  print(f"警告: 无法识别的操作符类型 {p.slice[2].type}")
303
313
  operator = None
304
-
314
+
305
315
  p[0] = Node('ComparisonExpr', [p[1], p[3]], operator)
306
316
 
307
317
 
@@ -310,7 +320,7 @@ def p_arithmetic_expr(p):
310
320
  | expression MINUS expression
311
321
  | expression TIMES expression
312
322
  | expression DIVIDE expression'''
313
-
323
+
314
324
  # 根据规则索引判断使用的是哪个操作符
315
325
  if p.slice[2].type == 'PLUS':
316
326
  operator = '+'
@@ -323,7 +333,7 @@ def p_arithmetic_expr(p):
323
333
  else:
324
334
  print(f"警告: 无法识别的操作符类型 {p.slice[2].type}")
325
335
  operator = None
326
-
336
+
327
337
  p[0] = Node('ArithmeticExpr', [p[1], p[3]], operator)
328
338
 
329
339
 
@@ -337,3 +347,12 @@ def p_error(p):
337
347
 
338
348
  def get_parser(debug=False):
339
349
  return yacc.yacc(debug=debug)
350
+
351
+ # 定义远程关键字调用的语法规则
352
+ def p_remote_keyword_call(p):
353
+ '''remote_keyword_call : ID PIPE LBRACKET ID RBRACKET COMMA parameter_list
354
+ | ID PIPE LBRACKET ID RBRACKET'''
355
+ if len(p) == 8:
356
+ p[0] = Node('RemoteKeywordCall', [p[7]], {'alias': p[1], 'keyword': p[4]})
357
+ else:
358
+ p[0] = Node('RemoteKeywordCall', [[]], {'alias': p[1], 'keyword': p[4]})
@@ -6,9 +6,9 @@ _tabversion = '3.10'
6
6
 
7
7
  _lr_method = 'LALR'
8
8
 
9
- _lr_signature = 'leftCOMMAleftGTLTGELEEQNEleftPLUSMINUSleftTIMESDIVIDErightEQUALSAUTHOR_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 KEYWORD_KEYWORD LBRACKET LE LPAREN LT MINUS NAME_KEYWORD NE NUMBER PLACEHOLDER PLUS RANGE RBRACKET RETURN RPAREN STRING TAGS_KEYWORD TEARDOWN_KEYWORD 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 STRINGmetadata_value : STRING\n | IDtags : tag COMMA tags\n | tagtag : STRING\n | IDstatements : statement statements\n | statementstatement : assignment\n | keyword_call\n | loop\n | custom_keyword\n | return_statement\n | if_statementassignment : ID EQUALS expression\n | ID EQUALS 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_KEYWORD DO statements ENDdata_source : STRING USING IDcustom_keyword : KEYWORD_KEYWORD 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 ENDcomparison_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 expression'
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 ENDcomparison_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,17,23,24,25,26,31,32,33,36,40,43,44,45,46,47,48,49,50,51,52,53,54,55,56,59,60,61,62,63,64,65,66,67,68,70,71,72,73,75,76,77,78,79,80,81,82,83,84,85,88,91,97,98,105,106,107,108,109,110,111,112,113,114,115,116,117,120,121,123,124,125,126,127,130,132,133,135,136,140,143,144,145,147,149,151,153,],[22,22,-5,-6,22,-9,-25,-26,-27,-28,-29,-30,35,41,42,50,50,-8,62,62,62,50,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,50,-43,-44,50,22,-10,-17,-18,-11,96,-52,-13,-14,-15,-16,-31,-32,99,101,50,50,50,50,50,50,50,50,50,50,-46,22,122,126,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,50,-12,96,-51,-53,-55,-58,50,101,-68,22,50,122,22,-56,-54,50,-69,-59,22,-50,]),'LBRACKET':([0,2,4,5,6,7,8,9,10,11,12,13,25,26,31,34,40,43,44,45,46,47,48,49,50,51,52,53,54,55,56,59,60,61,62,63,65,66,67,68,70,71,72,73,76,77,78,79,80,81,82,83,84,85,88,91,105,106,107,108,109,110,111,112,113,114,115,116,117,120,123,124,125,126,127,132,133,135,140,143,144,145,147,149,151,153,],[17,17,-5,-6,17,-9,-25,-26,-27,-28,-29,-30,56,56,-8,64,73,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,56,-43,-44,56,17,-10,-17,-18,-11,-52,-13,-14,-15,-16,-31,-32,56,56,56,56,56,56,56,56,56,56,56,-46,17,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,56,-12,-51,-53,-55,-58,56,-68,17,56,17,-56,-54,56,-69,-59,17,-50,]),'FOR':([0,2,4,5,6,7,8,9,10,11,12,13,31,43,44,45,46,47,48,49,50,51,52,54,55,59,60,61,62,63,65,66,67,68,70,71,72,88,91,105,106,107,108,109,110,111,112,113,114,115,116,120,123,124,125,126,132,133,140,143,144,147,149,151,153,],[23,23,-5,-6,23,-9,-25,-26,-27,-28,-29,-30,-8,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,23,-10,-17,-18,-11,-52,-13,-14,-15,-16,-31,-32,-46,23,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-12,-51,-53,-55,-58,-68,23,23,-56,-54,-69,-59,23,-50,]),'KEYWORD_KEYWORD':([0,2,4,5,6,7,8,9,10,11,12,13,31,43,44,45,46,47,48,49,50,51,52,54,55,59,60,61,62,63,65,66,67,68,70,71,72,88,91,105,106,107,108,109,110,111,112,113,114,115,116,120,123,124,125,126,132,133,140,143,144,147,149,151,153,],[24,24,-5,-6,24,-9,-25,-26,-27,-28,-29,-30,-8,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,24,-10,-17,-18,-11,-52,-13,-14,-15,-16,-31,-32,-46,24,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-12,-51,-53,-55,-58,-68,24,24,-56,-54,-69,-59,24,-50,]),'RETURN':([0,2,4,5,6,7,8,9,10,11,12,13,31,43,44,45,46,47,48,49,50,51,52,54,55,59,60,61,62,63,65,66,67,68,70,71,72,88,91,105,106,107,108,109,110,111,112,113,114,115,116,120,123,124,125,126,132,133,140,143,144,147,149,151,153,],[25,25,-5,-6,25,-9,-25,-26,-27,-28,-29,-30,-8,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,25,-10,-17,-18,-11,-52,-13,-14,-15,-16,-31,-32,-46,25,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-12,-51,-53,-55,-58,-68,25,25,-56,-54,-69,-59,25,-50,]),'IF':([0,2,4,5,6,7,8,9,10,11,12,13,31,43,44,45,46,47,48,49,50,51,52,54,55,59,60,61,62,63,65,66,67,68,70,71,72,88,91,105,106,107,108,109,110,111,112,113,114,115,116,120,123,124,125,126,132,133,140,143,144,147,149,151,153,],[26,26,-5,-6,26,-9,-25,-26,-27,-28,-29,-30,-8,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,26,-10,-17,-18,-11,-52,-13,-14,-15,-16,-31,-32,-46,26,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-12,-51,-53,-55,-58,-68,26,26,-56,-54,-69,-59,26,-50,]),'NAME_KEYWORD':([0,7,60,61,62,63,66,67,68,70,120,126,],[14,14,-10,-17,-18,-11,-13,-14,-15,-16,-12,-58,]),'DESCRIPTION_KEYWORD':([0,7,60,61,62,63,66,67,68,70,120,126,],[15,15,-10,-17,-18,-11,-13,-14,-15,-16,-12,-58,]),'TAGS_KEYWORD':([0,7,60,61,62,63,66,67,68,70,120,126,],[16,16,-10,-17,-18,-11,-13,-14,-15,-16,-12,-58,]),'AUTHOR_KEYWORD':([0,7,60,61,62,63,66,67,68,70,120,126,],[18,18,-10,-17,-18,-11,-13,-14,-15,-16,-12,-58,]),'DATE_KEYWORD':([0,7,60,61,62,63,66,67,68,70,120,126,],[19,19,-10,-17,-18,-11,-13,-14,-15,-16,-12,-58,]),'DATA_KEYWORD':([0,7,60,61,62,63,66,67,68,70,120,126,],[20,20,-10,-17,-18,-11,-13,-14,-15,-16,-12,-58,]),'IMPORT_KEYWORD':([0,7,60,61,62,63,66,67,68,70,120,126,],[21,21,-10,-17,-18,-11,-13,-14,-15,-16,-12,-58,]),'$end':([1,3,6,8,9,10,11,12,13,27,28,30,43,44,45,46,47,48,49,50,51,52,54,55,58,65,71,72,88,105,106,107,108,109,110,111,112,113,114,115,116,119,123,124,125,132,143,144,147,149,153,],[0,-4,-24,-25,-26,-27,-28,-29,-30,-2,-3,-23,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,-1,-52,-31,-32,-46,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-57,-51,-53,-55,-68,-56,-54,-69,-59,-50,]),'TEARDOWN_KEYWORD':([3,6,8,9,10,11,12,13,27,30,43,44,45,46,47,48,49,50,51,52,54,55,65,71,72,88,105,106,107,108,109,110,111,112,113,114,115,116,123,124,125,132,143,144,147,149,153,],[29,-24,-25,-26,-27,-28,-29,-30,29,-23,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,-52,-31,-32,-46,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-51,-53,-55,-68,-56,-54,-69,-59,-50,]),'END':([6,8,9,10,11,12,13,30,43,44,45,46,47,48,49,50,51,52,54,55,65,71,72,88,92,105,106,107,108,109,110,111,112,113,114,115,116,118,123,124,125,132,142,143,144,146,147,149,152,153,],[-24,-25,-26,-27,-28,-29,-30,-23,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,-52,-31,-32,-46,119,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,132,-51,-53,-55,-68,147,-56,-54,149,-69,-59,153,-50,]),'ELSE':([6,8,9,10,11,12,13,30,43,44,45,46,47,48,49,50,51,52,54,55,65,71,72,88,105,106,107,108,109,110,111,112,113,114,115,116,118,123,124,125,132,143,144,147,149,153,],[-24,-25,-26,-27,-28,-29,-30,-23,-67,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,-52,-31,-32,-46,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,133,-51,-53,-55,-68,-56,-54,-69,-59,-50,]),'COLON':([14,15,16,18,19,20,21,122,],[32,33,34,36,37,38,39,135,]),'EQUALS':([22,101,],[40,128,]),'NUMBER':([25,26,40,53,56,73,76,77,78,79,80,81,82,83,84,85,117,127,128,135,145,],[47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,139,47,47,]),'STRING':([25,26,32,33,36,38,39,40,53,56,64,73,76,77,78,79,80,81,82,83,84,85,117,121,127,128,135,145,],[48,48,61,61,61,69,70,48,48,48,95,48,48,48,48,48,48,48,48,48,48,48,48,95,48,138,48,48,]),'PLACEHOLDER':([25,26,40,53,56,73,76,77,78,79,80,81,82,83,84,85,117,127,135,145,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,]),'LPAREN':([25,26,40,42,53,56,73,76,77,78,79,80,81,82,83,84,85,100,117,127,135,145,],[53,53,53,75,53,53,53,53,53,53,53,53,53,53,53,53,53,127,53,53,53,53,]),'TRUE':([25,26,40,53,56,73,76,77,78,79,80,81,82,83,84,85,117,127,135,145,],[54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,]),'FALSE':([25,26,40,53,56,73,76,77,78,79,80,81,82,83,84,85,117,127,135,145,],[55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,]),'DO':([29,44,45,46,47,48,49,50,51,52,54,55,57,88,105,106,107,108,109,110,111,112,113,114,115,116,129,150,],[59,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,91,-46,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,140,151,]),'RBRACKET':([35,44,45,46,47,48,49,50,51,52,54,55,56,73,87,88,89,90,93,94,95,96,99,105,106,107,108,109,110,111,112,113,114,115,116,131,134,],[65,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,88,88,116,-46,-47,-49,120,-20,-21,-22,65,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-48,-19,]),'DATE':([37,],[67,]),'IN':([41,],[74,]),'PLUS':([43,44,45,46,47,48,49,50,51,52,54,55,57,71,86,88,90,99,105,106,107,108,109,110,111,112,113,114,115,116,137,143,148,],[76,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,76,76,76,-46,76,-39,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,76,76,76,]),'MINUS':([43,44,45,46,47,48,49,50,51,52,54,55,57,71,86,88,90,99,105,106,107,108,109,110,111,112,113,114,115,116,137,143,148,],[77,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,77,77,77,-46,77,-39,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,77,77,77,]),'TIMES':([43,44,45,46,47,48,49,50,51,52,54,55,57,71,86,88,90,99,105,106,107,108,109,110,111,112,113,114,115,116,137,143,148,],[78,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,78,78,78,-46,78,-39,78,78,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,78,78,78,]),'DIVIDE':([43,44,45,46,47,48,49,50,51,52,54,55,57,71,86,88,90,99,105,106,107,108,109,110,111,112,113,114,115,116,137,143,148,],[79,-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,79,79,79,-46,79,-39,79,79,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,79,79,79,]),'RPAREN':([44,45,46,47,48,49,50,51,52,54,55,75,86,88,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,138,139,141,148,],[-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,-61,115,-46,-66,129,-60,-63,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,-64,-65,-62,150,]),'COMMA':([44,45,46,47,48,49,50,51,52,54,55,65,88,89,90,94,95,96,99,101,104,105,106,107,108,109,110,111,112,113,114,115,116,125,137,138,139,143,],[-33,-34,-35,-36,-37,-38,-39,-40,-41,-43,-44,97,-46,117,-49,121,-21,-22,-39,-66,130,-76,-77,-78,-79,-70,-71,-72,-73,-74,-75,-42,-45,136,145,-64,-65,-56,]),'GT':([44,47,48,49,50,51,52,54,55,88,99,115,116,],[80,-36,-37,-38,-39,-40,-41,-43,-44,-46,-39,-42,-45,]),'LT':([44,47,48,49,50,51,52,54,55,88,99,115,116,],[81,-36,-37,-38,-39,-40,-41,-43,-44,-46,-39,-42,-45,]),'GE':([44,47,48,49,50,51,52,54,55,88,99,115,116,],[82,-36,-37,-38,-39,-40,-41,-43,-44,-46,-39,-42,-45,]),'LE':([44,47,48,49,50,51,52,54,55,88,99,115,116,],[83,-36,-37,-38,-39,-40,-41,-43,-44,-46,-39,-42,-45,]),'EQ':([44,47,48,49,50,51,52,54,55,88,99,115,116,],[84,-36,-37,-38,-39,-40,-41,-43,-44,-46,-39,-42,-45,]),'NE':([44,47,48,49,50,51,52,54,55,88,99,115,116,],[85,-36,-37,-38,-39,-40,-41,-43,-44,-46,-39,-42,-45,]),'USING':([69,],[98,]),'RANGE':([74,],[100,]),}
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,]),}
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,59,91,133,140,151,],[3,27,30,92,118,142,146,152,]),'metadata_items':([0,7,],[4,31,]),'empty':([0,],[5,]),'statement':([0,2,6,59,91,133,140,151,],[6,6,6,6,6,6,6,6,]),'metadata_item':([0,7,],[7,7,]),'assignment':([0,2,6,59,91,133,140,151,],[8,8,8,8,8,8,8,8,]),'keyword_call':([0,2,6,40,59,91,133,140,151,],[9,9,9,72,9,9,9,9,9,]),'loop':([0,2,6,59,91,133,140,151,],[10,10,10,10,10,10,10,10,]),'custom_keyword':([0,2,6,59,91,133,140,151,],[11,11,11,11,11,11,11,11,]),'return_statement':([0,2,6,59,91,133,140,151,],[12,12,12,12,12,12,12,12,]),'if_statement':([0,2,6,59,91,133,140,151,],[13,13,13,13,13,13,13,13,]),'teardown':([3,27,],[28,58,]),'expression':([25,26,40,53,56,73,76,77,78,79,117,127,135,145,],[43,57,71,86,90,90,105,106,107,108,90,137,143,148,]),'expr_atom':([25,26,40,53,56,73,76,77,78,79,80,81,82,83,84,85,117,127,135,145,],[44,44,44,44,44,44,44,44,44,44,109,110,111,112,113,114,44,44,44,44,]),'comparison_expr':([25,26,40,53,56,73,76,77,78,79,117,127,135,145,],[45,45,45,45,45,45,45,45,45,45,45,45,45,45,]),'arithmetic_expr':([25,26,40,53,56,73,76,77,78,79,117,127,135,145,],[46,46,46,46,46,46,46,46,46,46,46,46,46,46,]),'boolean_expr':([25,26,40,53,56,73,76,77,78,79,80,81,82,83,84,85,117,127,135,145,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,]),'list_expr':([25,26,40,53,56,73,76,77,78,79,80,81,82,83,84,85,117,127,135,145,],[52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,]),'metadata_value':([32,33,36,],[60,63,66,]),'data_source':([38,],[68,]),'list_items':([56,73,117,],[87,87,131,]),'list_item':([56,73,117,],[89,89,89,]),'tags':([64,121,],[93,134,]),'tag':([64,121,],[94,94,]),'param_definitions':([75,],[102,]),'param_def_list':([75,130,],[103,141,]),'param_def':([75,130,],[104,104,]),'parameter_list':([97,],[123,]),'parameter_items':([97,136,],[124,144,]),'parameter_item':([97,136,],[125,125,]),}
20
+ _lr_goto_items = {'start':([0,],[1,]),'metadata':([0,],[2,]),'statements':([0,2,6,63,99,145,153,165,],[3,29,32,100,128,155,160,166,]),'metadata_items':([0,7,],[4,33,]),'empty':([0,],[5,]),'statement':([0,2,6,63,99,145,153,165,],[6,6,6,6,6,6,6,6,]),'metadata_item':([0,7,],[7,7,]),'assignment':([0,2,6,63,99,145,153,165,],[8,8,8,8,8,8,8,8,]),'keyword_call':([0,2,6,43,63,99,145,153,165,],[9,9,9,78,9,9,9,9,9,]),'remote_keyword_call':([0,2,6,43,63,99,145,153,165,],[10,10,10,79,10,10,10,10,10,]),'loop':([0,2,6,63,99,145,153,165,],[11,11,11,11,11,11,11,11,]),'custom_keyword':([0,2,6,63,99,145,153,165,],[12,12,12,12,12,12,12,12,]),'return_statement':([0,2,6,63,99,145,153,165,],[13,13,13,13,13,13,13,13,]),'if_statement':([0,2,6,63,99,145,153,165,],[14,14,14,14,14,14,14,14,]),'teardown':([3,29,],[30,62,]),'expression':([27,28,43,57,60,80,84,85,86,87,127,139,147,159,],[47,61,77,94,98,98,115,116,117,118,98,150,156,162,]),'expr_atom':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[48,48,48,48,48,48,48,48,48,48,119,120,121,122,123,124,48,48,48,48,]),'comparison_expr':([27,28,43,57,60,80,84,85,86,87,127,139,147,159,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,]),'arithmetic_expr':([27,28,43,57,60,80,84,85,86,87,127,139,147,159,],[50,50,50,50,50,50,50,50,50,50,50,50,50,50,]),'boolean_expr':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[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,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,]),'metadata_value':([34,35,38,],[64,67,70,]),'data_source':([40,],[72,]),'list_items':([60,80,127,],[95,95,143,]),'list_item':([60,80,127,],[97,97,97,]),'tags':([68,131,],[101,146,]),'tag':([68,131,],[102,102,]),'param_definitions':([83,],[112,]),'param_def_list':([83,142,],[113,154,]),'param_def':([83,142,],[114,114,]),'parameter_list':([105,149,],[133,158,]),'parameter_items':([105,148,149,],[134,157,134,]),'parameter_item':([105,148,149,],[135,135,135,]),}
21
21
 
22
22
  _lr_goto = {}
23
23
  for _k, _v in _lr_goto_items.items():
@@ -43,67 +43,72 @@ _lr_productions = [
43
43
  ('metadata_item -> DATE_KEYWORD COLON DATE','metadata_item',3,'p_metadata_item','parser.py',69),
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
- ('metadata_value -> STRING','metadata_value',1,'p_metadata_value','parser.py',85),
47
- ('metadata_value -> ID','metadata_value',1,'p_metadata_value','parser.py',86),
48
- ('tags -> tag COMMA tags','tags',3,'p_tags','parser.py',91),
49
- ('tags -> tag','tags',1,'p_tags','parser.py',92),
50
- ('tag -> STRING','tag',1,'p_tag','parser.py',100),
51
- ('tag -> ID','tag',1,'p_tag','parser.py',101),
52
- ('statements -> statement statements','statements',2,'p_statements','parser.py',106),
53
- ('statements -> statement','statements',1,'p_statements','parser.py',107),
54
- ('statement -> assignment','statement',1,'p_statement','parser.py',115),
55
- ('statement -> keyword_call','statement',1,'p_statement','parser.py',116),
56
- ('statement -> loop','statement',1,'p_statement','parser.py',117),
57
- ('statement -> custom_keyword','statement',1,'p_statement','parser.py',118),
58
- ('statement -> return_statement','statement',1,'p_statement','parser.py',119),
59
- ('statement -> if_statement','statement',1,'p_statement','parser.py',120),
60
- ('assignment -> ID EQUALS expression','assignment',3,'p_assignment','parser.py',125),
61
- ('assignment -> ID EQUALS keyword_call','assignment',3,'p_assignment','parser.py',126),
62
- ('expression -> expr_atom','expression',1,'p_expression','parser.py',134),
63
- ('expression -> comparison_expr','expression',1,'p_expression','parser.py',135),
64
- ('expression -> arithmetic_expr','expression',1,'p_expression','parser.py',136),
65
- ('expr_atom -> NUMBER','expr_atom',1,'p_expr_atom','parser.py',145),
66
- ('expr_atom -> STRING','expr_atom',1,'p_expr_atom','parser.py',146),
67
- ('expr_atom -> PLACEHOLDER','expr_atom',1,'p_expr_atom','parser.py',147),
68
- ('expr_atom -> ID','expr_atom',1,'p_expr_atom','parser.py',148),
69
- ('expr_atom -> boolean_expr','expr_atom',1,'p_expr_atom','parser.py',149),
70
- ('expr_atom -> list_expr','expr_atom',1,'p_expr_atom','parser.py',150),
71
- ('expr_atom -> LPAREN expression RPAREN','expr_atom',3,'p_expr_atom','parser.py',151),
72
- ('boolean_expr -> TRUE','boolean_expr',1,'p_boolean_expr','parser.py',162),
73
- ('boolean_expr -> FALSE','boolean_expr',1,'p_boolean_expr','parser.py',163),
74
- ('list_expr -> LBRACKET list_items RBRACKET','list_expr',3,'p_list_expr','parser.py',168),
75
- ('list_expr -> LBRACKET RBRACKET','list_expr',2,'p_list_expr','parser.py',169),
76
- ('list_items -> list_item','list_items',1,'p_list_items','parser.py',177),
77
- ('list_items -> list_item COMMA list_items','list_items',3,'p_list_items','parser.py',178),
78
- ('list_item -> expression','list_item',1,'p_list_item','parser.py',186),
79
- ('loop -> FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END','loop',12,'p_loop','parser.py',191),
80
- ('keyword_call -> LBRACKET ID RBRACKET COMMA parameter_list','keyword_call',5,'p_keyword_call','parser.py',196),
81
- ('keyword_call -> LBRACKET ID RBRACKET','keyword_call',3,'p_keyword_call','parser.py',197),
82
- ('parameter_list -> parameter_items','parameter_list',1,'p_parameter_list','parser.py',205),
83
- ('parameter_items -> parameter_item COMMA parameter_items','parameter_items',3,'p_parameter_items','parser.py',210),
84
- ('parameter_items -> parameter_item','parameter_items',1,'p_parameter_items','parser.py',211),
85
- ('parameter_item -> ID COLON expression','parameter_item',3,'p_parameter_item','parser.py',219),
86
- ('teardown -> TEARDOWN_KEYWORD DO statements END','teardown',4,'p_teardown','parser.py',224),
87
- ('data_source -> STRING USING ID','data_source',3,'p_data_source','parser.py',229),
88
- ('custom_keyword -> KEYWORD_KEYWORD ID LPAREN param_definitions RPAREN DO statements END','custom_keyword',8,'p_custom_keyword','parser.py',234),
89
- ('param_definitions -> param_def_list','param_definitions',1,'p_param_definitions','parser.py',239),
90
- ('param_definitions -> <empty>','param_definitions',0,'p_param_definitions','parser.py',240),
91
- ('param_def_list -> param_def COMMA param_def_list','param_def_list',3,'p_param_def_list','parser.py',248),
92
- ('param_def_list -> param_def','param_def_list',1,'p_param_def_list','parser.py',249),
93
- ('param_def -> ID EQUALS STRING','param_def',3,'p_param_def','parser.py',257),
94
- ('param_def -> ID EQUALS NUMBER','param_def',3,'p_param_def','parser.py',258),
95
- ('param_def -> ID','param_def',1,'p_param_def','parser.py',259),
96
- ('return_statement -> RETURN expression','return_statement',2,'p_return_statement','parser.py',267),
97
- ('if_statement -> IF expression DO statements END','if_statement',5,'p_if_statement','parser.py',272),
98
- ('if_statement -> IF expression DO statements ELSE statements END','if_statement',7,'p_if_statement','parser.py',273),
99
- ('comparison_expr -> expr_atom GT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',281),
100
- ('comparison_expr -> expr_atom LT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',282),
101
- ('comparison_expr -> expr_atom GE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',283),
102
- ('comparison_expr -> expr_atom LE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',284),
103
- ('comparison_expr -> expr_atom EQ expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',285),
104
- ('comparison_expr -> expr_atom NE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',286),
105
- ('arithmetic_expr -> expression PLUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',309),
106
- ('arithmetic_expr -> expression MINUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',310),
107
- ('arithmetic_expr -> expression TIMES expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',311),
108
- ('arithmetic_expr -> expression DIVIDE expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',312),
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',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 -> LPAREN expression RPAREN','expr_atom',3,'p_expr_atom','parser.py',161),
75
+ ('boolean_expr -> TRUE','boolean_expr',1,'p_boolean_expr','parser.py',172),
76
+ ('boolean_expr -> FALSE','boolean_expr',1,'p_boolean_expr','parser.py',173),
77
+ ('list_expr -> LBRACKET list_items RBRACKET','list_expr',3,'p_list_expr','parser.py',178),
78
+ ('list_expr -> LBRACKET RBRACKET','list_expr',2,'p_list_expr','parser.py',179),
79
+ ('list_items -> list_item','list_items',1,'p_list_items','parser.py',187),
80
+ ('list_items -> list_item COMMA list_items','list_items',3,'p_list_items','parser.py',188),
81
+ ('list_item -> expression','list_item',1,'p_list_item','parser.py',196),
82
+ ('loop -> FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END','loop',12,'p_loop','parser.py',201),
83
+ ('keyword_call -> LBRACKET ID RBRACKET COMMA parameter_list','keyword_call',5,'p_keyword_call','parser.py',206),
84
+ ('keyword_call -> LBRACKET ID RBRACKET','keyword_call',3,'p_keyword_call','parser.py',207),
85
+ ('parameter_list -> parameter_items','parameter_list',1,'p_parameter_list','parser.py',215),
86
+ ('parameter_items -> parameter_item COMMA parameter_items','parameter_items',3,'p_parameter_items','parser.py',220),
87
+ ('parameter_items -> parameter_item','parameter_items',1,'p_parameter_items','parser.py',221),
88
+ ('parameter_item -> ID COLON expression','parameter_item',3,'p_parameter_item','parser.py',229),
89
+ ('teardown -> TEARDOWN DO statements END','teardown',4,'p_teardown','parser.py',234),
90
+ ('data_source -> STRING USING ID','data_source',3,'p_data_source','parser.py',239),
91
+ ('custom_keyword -> FUNCTION ID LPAREN param_definitions RPAREN DO statements END','custom_keyword',8,'p_custom_keyword','parser.py',244),
92
+ ('param_definitions -> param_def_list','param_definitions',1,'p_param_definitions','parser.py',249),
93
+ ('param_definitions -> <empty>','param_definitions',0,'p_param_definitions','parser.py',250),
94
+ ('param_def_list -> param_def COMMA param_def_list','param_def_list',3,'p_param_def_list','parser.py',258),
95
+ ('param_def_list -> param_def','param_def_list',1,'p_param_def_list','parser.py',259),
96
+ ('param_def -> ID EQUALS STRING','param_def',3,'p_param_def','parser.py',267),
97
+ ('param_def -> ID EQUALS NUMBER','param_def',3,'p_param_def','parser.py',268),
98
+ ('param_def -> ID','param_def',1,'p_param_def','parser.py',269),
99
+ ('return_statement -> RETURN expression','return_statement',2,'p_return_statement','parser.py',277),
100
+ ('if_statement -> IF expression DO statements END','if_statement',5,'p_if_statement','parser.py',282),
101
+ ('if_statement -> IF expression DO statements ELSE statements END','if_statement',7,'p_if_statement','parser.py',283),
102
+ ('comparison_expr -> expr_atom GT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',291),
103
+ ('comparison_expr -> expr_atom LT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',292),
104
+ ('comparison_expr -> expr_atom GE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',293),
105
+ ('comparison_expr -> expr_atom LE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',294),
106
+ ('comparison_expr -> expr_atom EQ expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',295),
107
+ ('comparison_expr -> expr_atom NE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',296),
108
+ ('arithmetic_expr -> expression PLUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',319),
109
+ ('arithmetic_expr -> expression MINUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',320),
110
+ ('arithmetic_expr -> expression TIMES expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',321),
111
+ ('arithmetic_expr -> expression DIVIDE expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',322),
112
+ ('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET COMMA parameter_list','remote_keyword_call',7,'p_remote_keyword_call','parser.py',353),
113
+ ('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET','remote_keyword_call',5,'p_remote_keyword_call','parser.py',354),
109
114
  ]
@@ -114,15 +114,8 @@ def scan_local_keywords() -> None:
114
114
  """
115
115
  扫描本地keywords目录中的关键字
116
116
 
117
- 1. 先尝试导入内置的keywords包(向后兼容)
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
  # 获取当前工作目录,通常是用户项目的根目录
@@ -10,7 +10,7 @@ from pytest_dsl.core.yaml_vars import yaml_vars
10
10
 
11
11
  def add_yaml_options(parser):
12
12
  """添加YAML变量相关的命令行参数选项
13
-
13
+
14
14
  Args:
15
15
  parser: pytest命令行参数解析器
16
16
  """
@@ -29,34 +29,111 @@ def add_yaml_options(parser):
29
29
  )
30
30
 
31
31
 
32
- def load_yaml_variables(config):
33
- """加载YAML变量文件
34
-
35
- 从命令行参数指定的文件和目录加载YAML变量。
36
-
32
+ def load_yaml_variables_from_args(yaml_files=None, yaml_vars_dir=None, project_root=None):
33
+ """从参数加载YAML变量文件(通用函数)
34
+
37
35
  Args:
38
- config: pytest配置对象
36
+ yaml_files: YAML文件列表
37
+ yaml_vars_dir: YAML变量目录路径
38
+ project_root: 项目根目录(用于默认config目录)
39
39
  """
40
40
  # 加载单个YAML文件
41
- yaml_files = config.getoption('--yaml-vars')
42
41
  if yaml_files:
43
42
  yaml_vars.load_yaml_files(yaml_files)
44
43
  print(f"已加载YAML变量文件: {', '.join(yaml_files)}")
45
44
 
46
45
  # 加载目录中的YAML文件
47
- yaml_vars_dir = config.getoption('--yaml-vars-dir')
48
- if yaml_vars_dir is None:
49
- # 默认使用使用者项目根目录下的config目录
50
- # 通过pytest的rootdir获取使用者的项目根目录
51
- project_root = config.rootdir
52
- yaml_vars_dir = str(project_root / 'config')
46
+ if yaml_vars_dir is None and project_root:
47
+ # 默认使用项目根目录下的config目录
48
+ yaml_vars_dir = str(Path(project_root) / 'config')
53
49
  print(f"使用默认YAML变量目录: {yaml_vars_dir}")
54
-
55
- if Path(yaml_vars_dir).exists():
50
+
51
+ if yaml_vars_dir and Path(yaml_vars_dir).exists():
56
52
  yaml_vars.load_from_directory(yaml_vars_dir)
57
53
  print(f"已加载YAML变量目录: {yaml_vars_dir}")
58
54
  loaded_files = yaml_vars.get_loaded_files()
59
55
  if loaded_files:
60
- print(f"目录中加载的文件: {', '.join(loaded_files)}")
61
- else:
62
- print(f"YAML变量目录不存在: {yaml_vars_dir}")
56
+ # 过滤出当前目录的文件
57
+ if yaml_vars_dir:
58
+ dir_files = [f for f in loaded_files if Path(f).parent == Path(yaml_vars_dir)]
59
+ if dir_files:
60
+ print(f"目录中加载的文件: {', '.join(dir_files)}")
61
+ else:
62
+ print(f"加载的文件: {', '.join(loaded_files)}")
63
+ elif yaml_vars_dir:
64
+ print(f"YAML变量目录不存在: {yaml_vars_dir}")
65
+
66
+ # 加载完YAML变量后,自动连接远程服务器
67
+ load_remote_servers_from_yaml()
68
+
69
+
70
+ def load_yaml_variables(config):
71
+ """加载YAML变量文件(pytest插件接口)
72
+
73
+ 从pytest配置对象中获取命令行参数并加载YAML变量。
74
+
75
+ Args:
76
+ config: pytest配置对象
77
+ """
78
+ # 获取命令行参数
79
+ yaml_files = config.getoption('--yaml-vars')
80
+ yaml_vars_dir = config.getoption('--yaml-vars-dir')
81
+ project_root = config.rootdir
82
+
83
+ # 调用通用加载函数
84
+ load_yaml_variables_from_args(
85
+ yaml_files=yaml_files,
86
+ yaml_vars_dir=yaml_vars_dir,
87
+ project_root=project_root
88
+ )
89
+
90
+
91
+ def load_remote_servers_from_yaml():
92
+ """从YAML配置中自动加载远程服务器
93
+
94
+ 检查YAML变量中是否包含remote_servers配置,如果有则自动连接这些服务器。
95
+ """
96
+ try:
97
+ # 获取远程服务器配置
98
+ remote_servers_config = yaml_vars.get_variable('remote_servers')
99
+ if not remote_servers_config:
100
+
101
+ return
102
+
103
+ print(f"发现 {len(remote_servers_config)} 个远程服务器配置")
104
+
105
+ # 导入远程关键字管理器
106
+ from pytest_dsl.remote.keyword_client import remote_keyword_manager
107
+
108
+ # 遍历配置并连接服务器
109
+ for server_name, server_config in remote_servers_config.items():
110
+ try:
111
+ url = server_config.get('url')
112
+ alias = server_config.get('alias', server_name)
113
+ api_key = server_config.get('api_key')
114
+ sync_config = server_config.get('sync_config')
115
+
116
+ if not url:
117
+ print(f"跳过服务器 {server_name}: 缺少URL配置")
118
+ continue
119
+
120
+ print(f"正在连接远程服务器: {server_name} ({url}) 别名: {alias}")
121
+
122
+ # 注册远程服务器
123
+ success = remote_keyword_manager.register_remote_server(
124
+ url=url,
125
+ alias=alias,
126
+ api_key=api_key,
127
+ sync_config=sync_config
128
+ )
129
+
130
+ if success:
131
+ print(f"成功连接到远程服务器: {server_name} ({url})")
132
+ else:
133
+ print(f"连接远程服务器失败: {server_name} ({url})")
134
+
135
+ except Exception as e:
136
+ print(f"连接远程服务器 {server_name} 时发生错误: {str(e)}")
137
+
138
+ except Exception as e:
139
+ print(f"加载远程服务器配置时发生错误: {str(e)}")
@@ -39,6 +39,6 @@ username = [JSON提取],JSON数据:${json_data},JSONPath:'$.user.name',变量名
39
39
  bool_value = True
40
40
  [断言],条件:'${bool_value} == True',消息:'布尔值断言失败'
41
41
 
42
- @teardown do
42
+ teardown do
43
43
  [打印],内容:'所有断言测试通过!'
44
44
  end
@@ -29,6 +29,6 @@ bool_true = True
29
29
  bool_false = False
30
30
  [断言],条件:'${bool_true} and not ${bool_false}',消息:'变量布尔值表达式断言失败'
31
31
 
32
- @teardown do
32
+ teardown do
33
33
  [打印],内容:'所有布尔值断言测试通过!'
34
- end
34
+ end
@@ -44,6 +44,6 @@ text = "Hello, World!"
44
44
  [数据比较],实际值:'10 + 10',预期值:20,消息:'数据比较表达式失败'
45
45
  [数据比较],实际值:'len("Hello")',预期值:5,消息:'函数表达式比较失败'
46
46
 
47
- @teardown do
47
+ teardown do
48
48
  [打印],内容:'所有表达式断言测试通过!'
49
49
  end
@@ -26,6 +26,6 @@
26
26
  # 不进行复杂断言,只确认返回结果不为空
27
27
  [断言],条件:'${报告结果} != ""',消息:'报告结果不应为空'
28
28
 
29
- @teardown do
29
+ teardown do
30
30
  [打印],内容:'高级自定义关键字测试完成'
31
- end
31
+ end