pytest-dsl 0.13.0__py3-none-any.whl → 0.15.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/__init__.py +190 -3
- pytest_dsl/cli.py +37 -260
- pytest_dsl/core/custom_keyword_manager.py +114 -14
- pytest_dsl/core/dsl_executor.py +549 -166
- pytest_dsl/core/dsl_executor_utils.py +21 -22
- pytest_dsl/core/execution_tracker.py +291 -0
- pytest_dsl/core/hook_manager.py +87 -0
- pytest_dsl/core/hookable_executor.py +134 -0
- pytest_dsl/core/hookable_keyword_manager.py +106 -0
- pytest_dsl/core/hookspecs.py +175 -0
- pytest_dsl/core/keyword_loader.py +402 -0
- pytest_dsl/core/keyword_manager.py +29 -23
- pytest_dsl/core/parser.py +94 -18
- pytest_dsl/core/validator.py +417 -0
- pytest_dsl/core/yaml_loader.py +142 -42
- pytest_dsl/core/yaml_vars.py +90 -7
- pytest_dsl/plugin.py +10 -1
- {pytest_dsl-0.13.0.dist-info → pytest_dsl-0.15.0.dist-info}/METADATA +1 -1
- {pytest_dsl-0.13.0.dist-info → pytest_dsl-0.15.0.dist-info}/RECORD +23 -16
- {pytest_dsl-0.13.0.dist-info → pytest_dsl-0.15.0.dist-info}/WHEEL +0 -0
- {pytest_dsl-0.13.0.dist-info → pytest_dsl-0.15.0.dist-info}/entry_points.txt +0 -0
- {pytest_dsl-0.13.0.dist-info → pytest_dsl-0.15.0.dist-info}/licenses/LICENSE +0 -0
- {pytest_dsl-0.13.0.dist-info → pytest_dsl-0.15.0.dist-info}/top_level.txt +0 -0
pytest_dsl/core/yaml_vars.py
CHANGED
@@ -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
|
-
|
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
|
-
|
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
@@ -38,6 +38,13 @@ def pytest_configure(config):
|
|
38
38
|
# 确保全局变量存储目录存在
|
39
39
|
os.makedirs(global_context._storage_dir, exist_ok=True)
|
40
40
|
|
41
|
+
# 首先导入内置关键字模块,确保内置关键字被注册
|
42
|
+
try:
|
43
|
+
import pytest_dsl.keywords # noqa: F401
|
44
|
+
print("pytest环境:内置关键字模块加载完成")
|
45
|
+
except ImportError as e:
|
46
|
+
print(f"pytest环境:加载内置关键字模块失败: {e}")
|
47
|
+
|
41
48
|
# 加载所有已安装的关键字插件
|
42
49
|
load_all_plugins()
|
43
50
|
|
@@ -46,7 +53,9 @@ def pytest_configure(config):
|
|
46
53
|
|
47
54
|
# 自动导入项目中的resources目录
|
48
55
|
try:
|
49
|
-
from pytest_dsl.core.custom_keyword_manager import
|
56
|
+
from pytest_dsl.core.custom_keyword_manager import (
|
57
|
+
custom_keyword_manager
|
58
|
+
)
|
50
59
|
|
51
60
|
# 获取pytest的根目录
|
52
61
|
project_root = str(config.rootdir) if config.rootdir else os.getcwd()
|
@@ -1,28 +1,35 @@
|
|
1
|
-
pytest_dsl/__init__.py,sha256=
|
2
|
-
pytest_dsl/cli.py,sha256=
|
1
|
+
pytest_dsl/__init__.py,sha256=VZz4wtSOB6NkY8jkO69YM8xVfD0y0v6xwob-ljkATnE,4817
|
2
|
+
pytest_dsl/cli.py,sha256=pkom2w-7AWEDVH-khQGfUDs3NTeiG9pmWLk04gKD-gM,27289
|
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=
|
5
|
+
pytest_dsl/plugin.py,sha256=CEwi-ci2rMevaAl9PwBw2WKXWRbXuHI1IkkDV0I0VIo,2224
|
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=
|
12
|
-
pytest_dsl/core/dsl_executor.py,sha256=
|
13
|
-
pytest_dsl/core/dsl_executor_utils.py,sha256=
|
11
|
+
pytest_dsl/core/custom_keyword_manager.py,sha256=F9aSbth4x4-5nHb0N5uG04CpgwGnQv4RDGeRKR2WuIk,16001
|
12
|
+
pytest_dsl/core/dsl_executor.py,sha256=DQVPLCh0_Z1PQtMdU_We5Pv1im_CDEwLI0q-9DkzmIQ,47992
|
13
|
+
pytest_dsl/core/dsl_executor_utils.py,sha256=ZJLSYSsiKHqg53d3Bl--ZF8m9abd5kpqdevWl31KEZg,2276
|
14
|
+
pytest_dsl/core/execution_tracker.py,sha256=Pwcxraxt_xkOouq32KBqola-OVfnbaomCoMTyUIqoN4,9476
|
14
15
|
pytest_dsl/core/global_context.py,sha256=NcEcS2V61MT70tgAsGsFWQq0P3mKjtHQr1rgT3yTcyY,3535
|
16
|
+
pytest_dsl/core/hook_manager.py,sha256=rqpcj9tBcxwFpoU2ZAfOWO8P0oyq02Ie_XUjq-9vFc0,2445
|
17
|
+
pytest_dsl/core/hookable_executor.py,sha256=sxkyWF7bSkKzgVoNwUTvtDGOSgFKXXQHR5uYIf-9MaM,3969
|
18
|
+
pytest_dsl/core/hookable_keyword_manager.py,sha256=e_guTVF1tU3pu_uzAUd4xNudFlYth42Ll2ESeRLlpjE,3833
|
19
|
+
pytest_dsl/core/hookspecs.py,sha256=fBmvs8uIV9_M_FUQBgvHSDn51Z6ABXo9k0okf80wzeo,5071
|
15
20
|
pytest_dsl/core/http_client.py,sha256=hdx8gI4JCmq1-96pbiKeyKzSQUzPAi08cRNmljiPQmY,15536
|
16
21
|
pytest_dsl/core/http_request.py,sha256=6e-gTztH3wu2eSW27Nc0uPmyWjB6oBwndx8Vqnu5uyg,60030
|
17
|
-
pytest_dsl/core/
|
22
|
+
pytest_dsl/core/keyword_loader.py,sha256=3GQ4w5Zf2XdkoJ85uYXh9YB93_8L8OAb7vvuKE3-gVA,13864
|
23
|
+
pytest_dsl/core/keyword_manager.py,sha256=5WZWwlYk74kGHh1T6WjCuVd8eelq2-UEXvDIe4U7rEI,7730
|
18
24
|
pytest_dsl/core/lexer.py,sha256=WaLzt9IhtHiA90Fg2WGgfVztveCUhtgxzANBaEiy-F8,4347
|
19
|
-
pytest_dsl/core/parser.py,sha256=
|
25
|
+
pytest_dsl/core/parser.py,sha256=iDxZ6MHa6EtDUieWDBYP36f2QYPBxKnIdoWgTrpulkI,14471
|
20
26
|
pytest_dsl/core/parsetab.py,sha256=o4XbFKwpsi3fYmfI_F6u5NSM61Qp6gTx-Sfh1jDINxI,31767
|
21
27
|
pytest_dsl/core/plugin_discovery.py,sha256=3pt3EXJ7EPF0rkUlyDZMVHkIiTy2vicdIIQJkrHXZjY,8305
|
22
28
|
pytest_dsl/core/utils.py,sha256=q0AMdw5HO33JvlA3UJeQ7IXh1Z_8K1QlwiM1_yiITrU,5350
|
29
|
+
pytest_dsl/core/validator.py,sha256=Zl7aSRF52HifE0vsRj5cXsLInLiyfcuWPuIlgxYY_dY,14686
|
23
30
|
pytest_dsl/core/variable_utils.py,sha256=sx5DFZAO_syi0E_0ACisiZUQL9yxGeOfNmMtV6w9V3E,13947
|
24
|
-
pytest_dsl/core/yaml_loader.py,sha256=
|
25
|
-
pytest_dsl/core/yaml_vars.py,sha256=
|
31
|
+
pytest_dsl/core/yaml_loader.py,sha256=PC-R05bmHDI1QyBhhnt2jEK2c50Sg2xKsMDDY7p5rRg,8165
|
32
|
+
pytest_dsl/core/yaml_vars.py,sha256=PqbCGT_TmOXH09Pmm72sYtMEvV-sp9ocLqkuAUQYhhc,5047
|
26
33
|
pytest_dsl/docs/custom_keywords.md,sha256=03dA_GeHxoLixA8Sqch14bhTbxXQCSfz9Kvged2fMCo,4381
|
27
34
|
pytest_dsl/examples/__init__.py,sha256=FKkyLFOjxfC6XnJlW7iK_BUIX9dTIpXgoYN1pfs91ss,84
|
28
35
|
pytest_dsl/examples/test_assert.py,sha256=zJ9bflsbyyl7v5AKdLHYTVPI4pe8QiQoeym-ULAs0tk,343
|
@@ -65,9 +72,9 @@ pytest_dsl/remote/keyword_client.py,sha256=BL80MOaLroUi0v-9sLtkJ55g1R0Iw9SE1k11I
|
|
65
72
|
pytest_dsl/remote/keyword_server.py,sha256=vGIE3Bhh461xX_u1U-Cf5nrWL2GQFYdtQdcMWfFIYgE,22320
|
66
73
|
pytest_dsl/remote/variable_bridge.py,sha256=dv-d3Gq9ttvvrXM1fdlLtoSOPB6vRp0_GBOwX4wvcy8,7121
|
67
74
|
pytest_dsl/templates/keywords_report.html,sha256=7x84iq6hi08nf1iQ95jZ3izcAUPx6JFm0_8xS85CYws,31241
|
68
|
-
pytest_dsl-0.
|
69
|
-
pytest_dsl-0.
|
70
|
-
pytest_dsl-0.
|
71
|
-
pytest_dsl-0.
|
72
|
-
pytest_dsl-0.
|
73
|
-
pytest_dsl-0.
|
75
|
+
pytest_dsl-0.15.0.dist-info/licenses/LICENSE,sha256=Rguy8cb9sYhK6cmrBdXvwh94rKVDh2tVZEWptsHIsVM,1071
|
76
|
+
pytest_dsl-0.15.0.dist-info/METADATA,sha256=C0m-LwNfCj8xXE_CzU1rIUVCuUsxQkeodkC7IQxxDSk,29655
|
77
|
+
pytest_dsl-0.15.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
78
|
+
pytest_dsl-0.15.0.dist-info/entry_points.txt,sha256=PLOBbH02OGY1XR1JDKIZB1Em87loUvbgMRWaag-5FhY,204
|
79
|
+
pytest_dsl-0.15.0.dist-info/top_level.txt,sha256=4CrSx4uNqxj7NvK6k1y2JZrSrJSzi-UvPZdqpUhumWM,11
|
80
|
+
pytest_dsl-0.15.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|