pytest-dsl 0.12.1__py3-none-any.whl → 0.14.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.
@@ -5,22 +5,32 @@ from pathlib import Path
5
5
 
6
6
 
7
7
  class YAMLVariableManager:
8
- """管理YAML格式的变量文件"""
8
+ """管理YAML格式的变量文件,支持hook扩展"""
9
9
 
10
10
  def __init__(self):
11
11
  self._loaded_files: List[str] = []
12
12
  self._variables: Dict[str, Any] = {}
13
+ self._enable_hooks = True # 是否启用hook
13
14
 
14
15
  def has_variable(self, name: str) -> bool:
15
16
  """检查变量是否存在
16
-
17
+
17
18
  Args:
18
19
  name: 变量名
19
-
20
+
20
21
  Returns:
21
22
  bool: 变量是否存在
22
23
  """
23
- return name in self._variables
24
+ # 首先检查本地变量
25
+ if name in self._variables:
26
+ return True
27
+
28
+ # 如果启用了hook,尝试通过hook查找
29
+ if self._enable_hooks:
30
+ hook_value = self._get_variable_through_hook(name)
31
+ return hook_value is not None
32
+
33
+ return False
24
34
 
25
35
  def load_yaml_file(self, file_path: str) -> None:
26
36
  """加载单个YAML文件中的变量"""
@@ -54,8 +64,73 @@ class YAMLVariableManager:
54
64
  self.load_yaml_file(str(yaml_file))
55
65
 
56
66
  def get_variable(self, name: str) -> Optional[Any]:
57
- """获取变量值"""
58
- return self._variables.get(name)
67
+ """获取变量值,支持hook扩展
68
+
69
+ 优先级:
70
+ 1. 本地YAML变量
71
+ 2. Hook提供的变量
72
+
73
+ Args:
74
+ name: 变量名
75
+
76
+ Returns:
77
+ 变量值,如果不存在返回None
78
+ """
79
+ # 首先从本地变量获取
80
+ if name in self._variables:
81
+ return self._variables[name]
82
+
83
+ # 如果启用了hook,尝试通过hook获取
84
+ if self._enable_hooks:
85
+ hook_value = self._get_variable_through_hook(name)
86
+ if hook_value is not None:
87
+ # 可选:将hook获取的变量缓存到本地
88
+ # self._variables[name] = hook_value
89
+ return hook_value
90
+
91
+ return None
92
+
93
+ def _get_variable_through_hook(self, name: str) -> Optional[Any]:
94
+ """通过hook获取变量值
95
+
96
+ Args:
97
+ name: 变量名
98
+
99
+ Returns:
100
+ 变量值,如果不存在返回None
101
+ """
102
+ try:
103
+ from .hook_manager import hook_manager
104
+
105
+ # 确保hook管理器已初始化
106
+ hook_manager.initialize()
107
+
108
+ # 如果没有已注册的插件,直接返回
109
+ if not hook_manager.get_plugins():
110
+ return None
111
+
112
+ # 尝试从环境变量获取当前环境
113
+ environment = os.environ.get(
114
+ 'PYTEST_DSL_ENVIRONMENT') or os.environ.get('ENVIRONMENT')
115
+
116
+ # 调用dsl_get_variable hook
117
+ variable_results = hook_manager.pm.hook.dsl_get_variable(
118
+ var_name=name,
119
+ project_id=None, # 可以根据需要传递project_id
120
+ environment=environment
121
+ )
122
+
123
+ # 返回第一个非None的结果
124
+ for result in variable_results:
125
+ if result is not None:
126
+ return result
127
+
128
+ return None
129
+
130
+ except Exception as e:
131
+ # Hook调用失败时记录警告但不影响正常流程
132
+ print(f"通过hook获取变量失败: {e}")
133
+ return None
59
134
 
60
135
  def get_all_variables(self) -> Dict[str, Any]:
61
136
  """获取所有已加载的变量"""
@@ -65,6 +140,14 @@ class YAMLVariableManager:
65
140
  """获取已加载的文件列表"""
66
141
  return self._loaded_files.copy()
67
142
 
143
+ def set_enable_hooks(self, enable: bool) -> None:
144
+ """设置是否启用hook
145
+
146
+ Args:
147
+ enable: 是否启用hook
148
+ """
149
+ self._enable_hooks = enable
150
+
68
151
  def clear(self) -> None:
69
152
  """清除所有已加载的变量"""
70
153
  self._variables.clear()
@@ -72,4 +155,4 @@ class YAMLVariableManager:
72
155
 
73
156
 
74
157
  # 创建全局YAML变量管理器实例
75
- yaml_vars = YAMLVariableManager()
158
+ yaml_vars = YAMLVariableManager()
pytest_dsl/plugin.py CHANGED
@@ -40,6 +40,23 @@ def pytest_configure(config):
40
40
 
41
41
  # 加载所有已安装的关键字插件
42
42
  load_all_plugins()
43
-
43
+
44
44
  # 加载本地关键字(向后兼容)
45
- scan_local_keywords()
45
+ scan_local_keywords()
46
+
47
+ # 自动导入项目中的resources目录
48
+ try:
49
+ from pytest_dsl.core.custom_keyword_manager import custom_keyword_manager
50
+
51
+ # 获取pytest的根目录
52
+ project_root = str(config.rootdir) if config.rootdir else os.getcwd()
53
+
54
+ # 检查是否存在resources目录
55
+ resources_dir = os.path.join(project_root, "resources")
56
+ if os.path.exists(resources_dir) and os.path.isdir(resources_dir):
57
+ custom_keyword_manager.auto_import_resources_directory(
58
+ project_root)
59
+ print(f"pytest环境:已自动导入resources目录 {resources_dir}")
60
+
61
+ except Exception as e:
62
+ print(f"pytest环境:自动导入resources目录时出现警告: {str(e)}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytest-dsl
3
- Version: 0.12.1
3
+ Version: 0.14.0
4
4
  Summary: A DSL testing framework based on pytest
5
5
  Author: Chen Shuanglin
6
6
  License: MIT
@@ -1,28 +1,32 @@
1
1
  pytest_dsl/__init__.py,sha256=FzwXGvmuvMhRBKxvCdh1h-yJ2wUOnDxcTbU4Nt5fHn8,301
2
- pytest_dsl/cli.py,sha256=clpvDtQ18tJHl0DUKhoAfCNROE3TB_t59z0fOn5VL9M,33404
2
+ pytest_dsl/cli.py,sha256=Pt1cyaQ9rd31LWC1e-8IqS-xqvPzBmFXjdw2QAruyvU,35689
3
3
  pytest_dsl/conftest_adapter.py,sha256=cevEb0oEZKTZfUrGe1-CmkFByxKhUtjuurBJP7kpLc0,149
4
4
  pytest_dsl/main_adapter.py,sha256=pUIPN_EzY3JCDlYK7yF_OeLDVqni8vtG15G7gVzPJXg,181
5
- pytest_dsl/plugin.py,sha256=zA1Uf5xcdpYVFRHfEy4rCAB1zTdn3EhO8AbOFysOBm8,1173
5
+ pytest_dsl/plugin.py,sha256=Ymepaknms6N5mMoFgtiVi4YYiycE8a_6BPCBONmN-W8,1901
6
6
  pytest_dsl/core/__init__.py,sha256=ersUoxIWSrisxs9GX_STlH4XAbjNxAWUQB0NboaC5zI,322
7
7
  pytest_dsl/core/auth_provider.py,sha256=IZfXXrr4Uuc8QHwRPvhHSzNa2fwrqhjYts1xh78D39Q,14861
8
8
  pytest_dsl/core/auto_decorator.py,sha256=9Mga-GB4AzV5nkB6zpfaq8IuHa0KOH8LlFvnWyH_tnU,6623
9
9
  pytest_dsl/core/auto_directory.py,sha256=egyTnVxtGs4P75EIivRauLRPJfN9aZpoGVvp_Ma72AM,2714
10
10
  pytest_dsl/core/context.py,sha256=fXpVQon666Lz_PCexjkWMBBr-Xcd1SkDMp2vHar6eIs,664
11
- pytest_dsl/core/custom_keyword_manager.py,sha256=UdlGUc_mT8hIwmU7LVf4wJLG-geChwYgvcFM-KtPvJA,7512
12
- pytest_dsl/core/dsl_executor.py,sha256=aEEfocFCFxNDN1puBFhQzL5fzw9eZx8BAyYJI5XSt4Y,30472
11
+ pytest_dsl/core/custom_keyword_manager.py,sha256=F9aSbth4x4-5nHb0N5uG04CpgwGnQv4RDGeRKR2WuIk,16001
12
+ pytest_dsl/core/dsl_executor.py,sha256=PQvr7tbCM-ULPa6-2sBzaNFL7Q20xRSXZV-iNxFG9C0,38914
13
13
  pytest_dsl/core/dsl_executor_utils.py,sha256=cFoR2p3qQ2pb-UhkoefleK-zbuFqf0aBLh2Rlp8Ebs4,2180
14
14
  pytest_dsl/core/global_context.py,sha256=NcEcS2V61MT70tgAsGsFWQq0P3mKjtHQr1rgT3yTcyY,3535
15
+ pytest_dsl/core/hook_manager.py,sha256=rqpcj9tBcxwFpoU2ZAfOWO8P0oyq02Ie_XUjq-9vFc0,2445
16
+ pytest_dsl/core/hookable_executor.py,sha256=sxkyWF7bSkKzgVoNwUTvtDGOSgFKXXQHR5uYIf-9MaM,3969
17
+ pytest_dsl/core/hookable_keyword_manager.py,sha256=e_guTVF1tU3pu_uzAUd4xNudFlYth42Ll2ESeRLlpjE,3833
18
+ pytest_dsl/core/hookspecs.py,sha256=fBmvs8uIV9_M_FUQBgvHSDn51Z6ABXo9k0okf80wzeo,5071
15
19
  pytest_dsl/core/http_client.py,sha256=hdx8gI4JCmq1-96pbiKeyKzSQUzPAi08cRNmljiPQmY,15536
16
20
  pytest_dsl/core/http_request.py,sha256=6e-gTztH3wu2eSW27Nc0uPmyWjB6oBwndx8Vqnu5uyg,60030
17
21
  pytest_dsl/core/keyword_manager.py,sha256=hoNXHQcumnufPRUobnY0mnku4CHxSg2amwPFby4gQEs,7643
18
22
  pytest_dsl/core/lexer.py,sha256=WaLzt9IhtHiA90Fg2WGgfVztveCUhtgxzANBaEiy-F8,4347
19
- pytest_dsl/core/parser.py,sha256=xxy6yC6NdwHxln200aIuaWWN3w44uI8kkNlw8PTVpYI,11855
20
- pytest_dsl/core/parsetab.py,sha256=aN-2RRTr3MSbMyfe-9zOj_t96Xu84avE29GWqH6nqmg,31472
23
+ pytest_dsl/core/parser.py,sha256=pZjbfvab-VLjGJ28AV-69Nrdom_F1L0hwO76TyTyC2s,11947
24
+ pytest_dsl/core/parsetab.py,sha256=o4XbFKwpsi3fYmfI_F6u5NSM61Qp6gTx-Sfh1jDINxI,31767
21
25
  pytest_dsl/core/plugin_discovery.py,sha256=3pt3EXJ7EPF0rkUlyDZMVHkIiTy2vicdIIQJkrHXZjY,8305
22
26
  pytest_dsl/core/utils.py,sha256=q0AMdw5HO33JvlA3UJeQ7IXh1Z_8K1QlwiM1_yiITrU,5350
23
27
  pytest_dsl/core/variable_utils.py,sha256=sx5DFZAO_syi0E_0ACisiZUQL9yxGeOfNmMtV6w9V3E,13947
24
- pytest_dsl/core/yaml_loader.py,sha256=IOzRP3iEaVJ-4UiZGkuwy5VAD8_pWQjKHD0tZhwIGb8,4858
25
- pytest_dsl/core/yaml_vars.py,sha256=4Z0q9_ergpDjMrNUS0qU5oHrPPLYOL91bWoNxCioSLw,2551
28
+ pytest_dsl/core/yaml_loader.py,sha256=PC-R05bmHDI1QyBhhnt2jEK2c50Sg2xKsMDDY7p5rRg,8165
29
+ pytest_dsl/core/yaml_vars.py,sha256=PqbCGT_TmOXH09Pmm72sYtMEvV-sp9ocLqkuAUQYhhc,5047
26
30
  pytest_dsl/docs/custom_keywords.md,sha256=03dA_GeHxoLixA8Sqch14bhTbxXQCSfz9Kvged2fMCo,4381
27
31
  pytest_dsl/examples/__init__.py,sha256=FKkyLFOjxfC6XnJlW7iK_BUIX9dTIpXgoYN1pfs91ss,84
28
32
  pytest_dsl/examples/test_assert.py,sha256=zJ9bflsbyyl7v5AKdLHYTVPI4pe8QiQoeym-ULAs0tk,343
@@ -65,9 +69,9 @@ pytest_dsl/remote/keyword_client.py,sha256=BL80MOaLroUi0v-9sLtkJ55g1R0Iw9SE1k11I
65
69
  pytest_dsl/remote/keyword_server.py,sha256=vGIE3Bhh461xX_u1U-Cf5nrWL2GQFYdtQdcMWfFIYgE,22320
66
70
  pytest_dsl/remote/variable_bridge.py,sha256=dv-d3Gq9ttvvrXM1fdlLtoSOPB6vRp0_GBOwX4wvcy8,7121
67
71
  pytest_dsl/templates/keywords_report.html,sha256=7x84iq6hi08nf1iQ95jZ3izcAUPx6JFm0_8xS85CYws,31241
68
- pytest_dsl-0.12.1.dist-info/licenses/LICENSE,sha256=Rguy8cb9sYhK6cmrBdXvwh94rKVDh2tVZEWptsHIsVM,1071
69
- pytest_dsl-0.12.1.dist-info/METADATA,sha256=QHdli1Rdp1xywHV12X4Xo2BL1Xie2czRRtQJ_dPPXqc,29655
70
- pytest_dsl-0.12.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
71
- pytest_dsl-0.12.1.dist-info/entry_points.txt,sha256=PLOBbH02OGY1XR1JDKIZB1Em87loUvbgMRWaag-5FhY,204
72
- pytest_dsl-0.12.1.dist-info/top_level.txt,sha256=4CrSx4uNqxj7NvK6k1y2JZrSrJSzi-UvPZdqpUhumWM,11
73
- pytest_dsl-0.12.1.dist-info/RECORD,,
72
+ pytest_dsl-0.14.0.dist-info/licenses/LICENSE,sha256=Rguy8cb9sYhK6cmrBdXvwh94rKVDh2tVZEWptsHIsVM,1071
73
+ pytest_dsl-0.14.0.dist-info/METADATA,sha256=Qryl8-XUSV2y1G1BEXS6RSnmjqKfTRdlTtfPPhi5kEU,29655
74
+ pytest_dsl-0.14.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
+ pytest_dsl-0.14.0.dist-info/entry_points.txt,sha256=PLOBbH02OGY1XR1JDKIZB1Em87loUvbgMRWaag-5FhY,204
76
+ pytest_dsl-0.14.0.dist-info/top_level.txt,sha256=4CrSx4uNqxj7NvK6k1y2JZrSrJSzi-UvPZdqpUhumWM,11
77
+ pytest_dsl-0.14.0.dist-info/RECORD,,