dts-dance 0.1.5__tar.gz → 0.1.8__tar.gz
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.
- {dts_dance-0.1.5 → dts_dance-0.1.8}/PKG-INFO +2 -1
- dts_dance-0.1.8/config.example.yaml +5 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/bytecloud.py +6 -1
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/dflow.py +64 -2
- dts_dance-0.1.8/dtsdance/tcc.py +234 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/pyproject.toml +2 -1
- dts_dance-0.1.8/tests/config.py +22 -0
- dts_dance-0.1.8/tests/test_dflow.py +21 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/uv.lock +49 -1
- {dts_dance-0.1.5 → dts_dance-0.1.8}/.gitignore +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/.python-version +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/CLAUDE.md +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/DEV.md +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/README.md +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/__init__.py +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/dsyncer.py +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/feishu_base.py +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/feishu_table.py +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/metrics_fe.py +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/s3.py +0 -0
- {dts_dance-0.1.5 → dts_dance-0.1.8}/dtsdance/spacex.py +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dts-dance
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
4
4
|
Summary: dts dance lib
|
|
5
5
|
Keywords: observation,tools
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Requires-Dist: loguru==0.7.3
|
|
8
|
+
Requires-Dist: pyyaml==6.0.3
|
|
8
9
|
Requires-Dist: requests==2.32.5
|
|
9
10
|
Description-Content-Type: text/markdown
|
|
10
11
|
|
|
@@ -100,9 +100,14 @@ class ByteCloudHelper:
|
|
|
100
100
|
# 发送 GET 请求
|
|
101
101
|
response = requests.get(url, headers=headers, timeout=60)
|
|
102
102
|
|
|
103
|
+
# 调试用途,输出返回内容,保存内容到本地文件
|
|
104
|
+
# logger.debug(f"获取JWT令牌响应: response.text={response.text}")
|
|
105
|
+
# with open("jwt_response.html", "w", encoding="utf-8") as f:
|
|
106
|
+
# f.write(response.text)
|
|
107
|
+
|
|
103
108
|
# 检查响应状态码
|
|
104
109
|
if response.status_code != 200:
|
|
105
|
-
raise Exception(f"获取JWT
|
|
110
|
+
raise Exception(f"获取JWT令牌失败。status_code: {response.status_code}, response.text: {response.text}")
|
|
106
111
|
|
|
107
112
|
# 解析响应体
|
|
108
113
|
response_json = response.json()
|
|
@@ -3,6 +3,7 @@ from loguru import logger
|
|
|
3
3
|
from .bytecloud import ByteCloudHelper
|
|
4
4
|
import requests
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
class DFlowHelper:
|
|
7
8
|
|
|
8
9
|
def __init__(self, bytecloud_helper: ByteCloudHelper) -> None:
|
|
@@ -69,7 +70,8 @@ class DFlowHelper:
|
|
|
69
70
|
dict[str, Any]: DFlow 任务信息,包含 create_time 等字段
|
|
70
71
|
"""
|
|
71
72
|
# 构建 API URL
|
|
72
|
-
|
|
73
|
+
env_info = self.bytecloud_helper.get_env_info(env)
|
|
74
|
+
url = f"{env_info.endpoint}/api/v1/bytedts/api/bytedts/v3/DescribeTaskInfo"
|
|
73
75
|
|
|
74
76
|
# 准备请求头
|
|
75
77
|
headers = self._build_headers(env)
|
|
@@ -88,6 +90,7 @@ class DFlowHelper:
|
|
|
88
90
|
filtered_data = {
|
|
89
91
|
"task_id": task.get("id", ""),
|
|
90
92
|
"status": task.get("status", ""),
|
|
93
|
+
"desc": task.get("desc", ""),
|
|
91
94
|
"create_time": task.get("create_time", 0),
|
|
92
95
|
}
|
|
93
96
|
|
|
@@ -108,4 +111,63 @@ class DFlowHelper:
|
|
|
108
111
|
str: DFlow 任务详情页面的 URL
|
|
109
112
|
"""
|
|
110
113
|
# 根据环境生成对应的 scope 参数
|
|
111
|
-
|
|
114
|
+
env_info = self.bytecloud_helper.get_env_info(env)
|
|
115
|
+
return f"{env_info.endpoint}/bytedts/datasync/detail/{task_id}?scope={env}"
|
|
116
|
+
|
|
117
|
+
def init_resources(self, env: str, ctrl_env: str) -> bool:
|
|
118
|
+
"""
|
|
119
|
+
初始化 CTRL 环境资源
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
env: 环境名称
|
|
123
|
+
ctrl_env: 控制环境
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
bool: CTRL 环境资源初始化结果
|
|
127
|
+
"""
|
|
128
|
+
# 构建 API URL
|
|
129
|
+
env_info = self.bytecloud_helper.get_env_info(env)
|
|
130
|
+
url = f"{env_info.endpoint}/api/v1/bytedts/api/bytedts/v3/InitSystemResource"
|
|
131
|
+
|
|
132
|
+
# 准备请求头
|
|
133
|
+
headers = self._build_headers(env)
|
|
134
|
+
|
|
135
|
+
# 构建请求数据
|
|
136
|
+
json_data = {"ctrl_env": ctrl_env}
|
|
137
|
+
|
|
138
|
+
response_data = self._make_request("POST", url, headers, json_data)
|
|
139
|
+
|
|
140
|
+
message = response_data.get("message")
|
|
141
|
+
logger.info(f"int_resources {env} {ctrl_env}, message: {message}")
|
|
142
|
+
|
|
143
|
+
return message == "ok"
|
|
144
|
+
|
|
145
|
+
def list_resources(self, env: str, ctrl_env: str) -> list[str]:
|
|
146
|
+
"""
|
|
147
|
+
列举 CTRL 环境资源列表
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
env: 环境名称
|
|
151
|
+
ctrl_env: 控制环境
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
list[str]: CTRL 环境资源列表
|
|
155
|
+
"""
|
|
156
|
+
# 构建 API URL
|
|
157
|
+
env_info = self.bytecloud_helper.get_env_info(env)
|
|
158
|
+
url = f"{env_info.endpoint}/api/v1/bytedts/api/bytedts/v3/DescribeResources"
|
|
159
|
+
|
|
160
|
+
# 准备请求头
|
|
161
|
+
headers = self._build_headers(env)
|
|
162
|
+
|
|
163
|
+
# 构建请求数据
|
|
164
|
+
json_data = {"offset": 0, "limit": 10, "ctrl_env": ctrl_env}
|
|
165
|
+
|
|
166
|
+
response_data = self._make_request("POST", url, headers, json_data)
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
data = cast(dict, response_data.get("data", {}))
|
|
170
|
+
items = cast(list, data.get("items", []))
|
|
171
|
+
return [item["name"] for item in items]
|
|
172
|
+
except (KeyError, AttributeError, Exception) as e:
|
|
173
|
+
raise Exception(f"无法从响应中提取 CTRL 环境资源列表数据: {str(e)}")
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"""TCE (Toutiao Cloud Engine) API client."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class TCCConfigItem:
|
|
10
|
+
"""Single TCC configuration item."""
|
|
11
|
+
|
|
12
|
+
conf_name: str
|
|
13
|
+
value: str
|
|
14
|
+
description: str
|
|
15
|
+
data_type: str
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TCCError(Exception):
|
|
19
|
+
"""TCC API error."""
|
|
20
|
+
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TCCClient:
|
|
25
|
+
"""Client for TCC OpenAPI."""
|
|
26
|
+
|
|
27
|
+
def __init__(self, svc_account: str, svc_secret: str, base_url: str):
|
|
28
|
+
self.svc_account = svc_account
|
|
29
|
+
self.base_url = base_url
|
|
30
|
+
self.headers = {
|
|
31
|
+
"Authorization": f"Bearer {svc_secret}",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
def publish_config(
|
|
35
|
+
self,
|
|
36
|
+
ns_name: str,
|
|
37
|
+
region: str,
|
|
38
|
+
conf_name: str,
|
|
39
|
+
value: str,
|
|
40
|
+
dir: str,
|
|
41
|
+
description: str,
|
|
42
|
+
data_type: str,
|
|
43
|
+
) -> dict[str, Any]:
|
|
44
|
+
"""
|
|
45
|
+
Create or update TCC configuration.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Response data containing config_id and deployment_id
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
TCCError: If API call fails
|
|
52
|
+
"""
|
|
53
|
+
url = f"{self.base_url}/api/v1/tcc_v3_openapi/bcc/open/config/update"
|
|
54
|
+
|
|
55
|
+
payload = {
|
|
56
|
+
"ns_name": ns_name,
|
|
57
|
+
"dir": dir,
|
|
58
|
+
"conf_name": conf_name,
|
|
59
|
+
"value": str(value),
|
|
60
|
+
"data_type": data_type,
|
|
61
|
+
"region": region,
|
|
62
|
+
"description": description,
|
|
63
|
+
"operator": self.svc_account,
|
|
64
|
+
"update_strategy": "modify_and_deploy",
|
|
65
|
+
"auto_create": "auto_create_dir_config", # 自动创建还未存在的目录和配置
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
# print(f"writing tcc config, payload: {payload}")
|
|
70
|
+
response = requests.post(url, headers=self.headers, json=payload, timeout=30)
|
|
71
|
+
if response.status_code != 200:
|
|
72
|
+
raise TCCError(f"TCC API request failed with status {response.status_code}\n" f"Response: {response.text}")
|
|
73
|
+
|
|
74
|
+
result = response.json()
|
|
75
|
+
|
|
76
|
+
# Check for errors in response
|
|
77
|
+
base_resp = result.get("base_resp", {})
|
|
78
|
+
if base_resp.get("error_code", 0) != 0:
|
|
79
|
+
raise TCCError(f"TCC API error: {base_resp.get('error_message', 'Unknown error')}")
|
|
80
|
+
|
|
81
|
+
return result.get("data", {})
|
|
82
|
+
|
|
83
|
+
except requests.RequestException as e:
|
|
84
|
+
raise TCCError(f"Failed to create TCC config: {str(e)}") from e
|
|
85
|
+
|
|
86
|
+
def _list(
|
|
87
|
+
self,
|
|
88
|
+
ns_name: str,
|
|
89
|
+
region: str,
|
|
90
|
+
dir: str,
|
|
91
|
+
page: int = 1,
|
|
92
|
+
page_size: int = 100,
|
|
93
|
+
with_value: bool = True,
|
|
94
|
+
) -> dict[str, Any]:
|
|
95
|
+
"""
|
|
96
|
+
List TCC configurations.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
ns_name: Namespace name
|
|
100
|
+
region: Region (default: "China-BOE")
|
|
101
|
+
dir: Directory path (default: "/default")
|
|
102
|
+
page: Page number (default: 1)
|
|
103
|
+
page_size: Page size (default: 100)
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Configuration data
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
TCCError: If API call fails
|
|
110
|
+
"""
|
|
111
|
+
url = f"{self.base_url}/api/v1/tcc_v3_openapi/bcc/open/config/list"
|
|
112
|
+
|
|
113
|
+
params = {
|
|
114
|
+
"ns_name": ns_name,
|
|
115
|
+
"dir": dir,
|
|
116
|
+
"region": region,
|
|
117
|
+
"with_value": with_value,
|
|
118
|
+
"page": page,
|
|
119
|
+
"page_size": page_size,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
response = requests.post(url, headers=self.headers, params=params, timeout=30)
|
|
124
|
+
response.raise_for_status()
|
|
125
|
+
result = response.json()
|
|
126
|
+
|
|
127
|
+
# Check for errors in response
|
|
128
|
+
base_resp = result.get("base_resp", {})
|
|
129
|
+
if base_resp.get("error_code", 0) != 0:
|
|
130
|
+
raise TCCError(f"TCC API error: {base_resp.get('error_message', 'Unknown error')}")
|
|
131
|
+
|
|
132
|
+
return result
|
|
133
|
+
|
|
134
|
+
except requests.RequestException as e:
|
|
135
|
+
raise TCCError(f"Failed to get TCC config: {str(e)}") from e
|
|
136
|
+
|
|
137
|
+
def list_all(
|
|
138
|
+
self,
|
|
139
|
+
ns_name: str,
|
|
140
|
+
region: str,
|
|
141
|
+
dir: str,
|
|
142
|
+
with_value: bool = True,
|
|
143
|
+
) -> list[dict[str, Any]]:
|
|
144
|
+
"""
|
|
145
|
+
List all TCC configurations across all pages.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
ns_name: Namespace name
|
|
149
|
+
region: Region (default: "China-BOE")
|
|
150
|
+
dir: Directory path (default: "/default")
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
List of all configuration items
|
|
154
|
+
|
|
155
|
+
Raises:
|
|
156
|
+
TCCError: If API call fails
|
|
157
|
+
"""
|
|
158
|
+
all_items = []
|
|
159
|
+
page = 1
|
|
160
|
+
page_size = 100
|
|
161
|
+
|
|
162
|
+
while True:
|
|
163
|
+
result = self._list(region=region, ns_name=ns_name, dir=dir, page=page, page_size=page_size, with_value=with_value)
|
|
164
|
+
|
|
165
|
+
# Extract items from current page
|
|
166
|
+
data = result.get("data", {})
|
|
167
|
+
items = data.get("items", [])
|
|
168
|
+
all_items.extend(items)
|
|
169
|
+
|
|
170
|
+
# Check if there are more pages
|
|
171
|
+
page_info = result.get("page_info", {})
|
|
172
|
+
total_page = page_info.get("total_page", 1)
|
|
173
|
+
|
|
174
|
+
if page >= total_page:
|
|
175
|
+
break
|
|
176
|
+
|
|
177
|
+
page += 1
|
|
178
|
+
|
|
179
|
+
return all_items
|
|
180
|
+
|
|
181
|
+
def list_all_names(
|
|
182
|
+
self,
|
|
183
|
+
ns_name: str,
|
|
184
|
+
region: str,
|
|
185
|
+
dir: str,
|
|
186
|
+
) -> list[str]:
|
|
187
|
+
items = self.list_all(ns_name, region, dir, False)
|
|
188
|
+
return [item.get("conf_name", "") for item in items]
|
|
189
|
+
|
|
190
|
+
def get_config(
|
|
191
|
+
self,
|
|
192
|
+
ns_name: str,
|
|
193
|
+
region: str,
|
|
194
|
+
conf_name: str,
|
|
195
|
+
dir: str,
|
|
196
|
+
) -> dict[str, Any]:
|
|
197
|
+
"""
|
|
198
|
+
Get TCC configuration.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
ns_name: Namespace name
|
|
202
|
+
region: Region (default: "China-BOE")
|
|
203
|
+
conf_name: Configuration name
|
|
204
|
+
dir: Directory path (default: "/default")
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Configuration data
|
|
208
|
+
|
|
209
|
+
Raises:
|
|
210
|
+
TCCError: If API call fails
|
|
211
|
+
"""
|
|
212
|
+
url = f"{self.base_url}/api/v1/tcc_v3_openapi/bcc/open/config/get"
|
|
213
|
+
|
|
214
|
+
params = {
|
|
215
|
+
"ns_name": ns_name,
|
|
216
|
+
"dir": dir,
|
|
217
|
+
"region": region,
|
|
218
|
+
"conf_name": conf_name,
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
try:
|
|
222
|
+
response = requests.get(url, headers=self.headers, params=params, timeout=30)
|
|
223
|
+
response.raise_for_status()
|
|
224
|
+
result = response.json()
|
|
225
|
+
|
|
226
|
+
# Check for errors in response
|
|
227
|
+
base_resp = result.get("base_resp", {})
|
|
228
|
+
if base_resp.get("error_code", 0) != 0:
|
|
229
|
+
raise TCCError(f"TCC API error: {base_resp.get('error_message', 'Unknown error')}")
|
|
230
|
+
|
|
231
|
+
return result.get("data", {})
|
|
232
|
+
|
|
233
|
+
except requests.RequestException as e:
|
|
234
|
+
raise TCCError(f"Failed to get TCC config: {str(e)}") from e
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dts-dance"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.8"
|
|
8
8
|
description = "dts dance lib"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
keywords = ["tools", "observation"]
|
|
@@ -12,6 +12,7 @@ requires-python = ">=3.12"
|
|
|
12
12
|
dependencies = [
|
|
13
13
|
"requests==2.32.5",
|
|
14
14
|
"loguru==0.7.3",
|
|
15
|
+
"pyyaml==6.0.3",
|
|
15
16
|
]
|
|
16
17
|
|
|
17
18
|
[tool.hatch.build.targets.wheel]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Any
|
|
3
|
+
import yaml
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def load_config() -> dict[str, Any]:
|
|
7
|
+
"""从配置文件加载配置
|
|
8
|
+
|
|
9
|
+
Returns:
|
|
10
|
+
dict[str, Any]: 应用配置字典
|
|
11
|
+
|
|
12
|
+
Raises:
|
|
13
|
+
ValueError: 配置文件加载错误
|
|
14
|
+
"""
|
|
15
|
+
config_path = os.environ.get("CONFIG_PATH", "config.yaml")
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
with open(config_path, "r", encoding="utf-8") as f:
|
|
19
|
+
return yaml.safe_load(f)
|
|
20
|
+
|
|
21
|
+
except Exception as e:
|
|
22
|
+
raise ValueError(f"加载配置失败: {e}")
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from dtsdance.dflow import DFlowHelper
|
|
2
|
+
from dtsdance.bytecloud import ByteCloudEnvInfo, ByteCloudHelper
|
|
3
|
+
|
|
4
|
+
from config import load_config
|
|
5
|
+
|
|
6
|
+
config = load_config()
|
|
7
|
+
envs_bytecloud = {k: ByteCloudEnvInfo(k, v["endpoint"], v["svc_secret"]) for k, v in config["sites"].items()}
|
|
8
|
+
bytecloud_helper = ByteCloudHelper(envs_bytecloud)
|
|
9
|
+
dsyncer_helper = DFlowHelper(bytecloud_helper)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# pytest tests/test_dflow.py::test_get_dflow_info -s
|
|
13
|
+
def test_get_dflow_info():
|
|
14
|
+
try:
|
|
15
|
+
info = dsyncer_helper.get_dflow_info("boe", "1324653150464")
|
|
16
|
+
# info = dsyncer_helper.get_dflow_info("i18n-bd", "4102917472017")
|
|
17
|
+
# info = dsyncer_helper.get_dflow_info("us-ttp", "257993088799750")
|
|
18
|
+
# info = dsyncer_helper.get_dflow_info("eu-ttp", "815571859216")
|
|
19
|
+
print(f"DFlow Info: {info}")
|
|
20
|
+
except Exception as e:
|
|
21
|
+
print(f"Failed to get DFlow info for environment boe: {e}")
|
|
@@ -79,16 +79,18 @@ wheels = [
|
|
|
79
79
|
|
|
80
80
|
[[package]]
|
|
81
81
|
name = "dts-dance"
|
|
82
|
-
version = "0.1.
|
|
82
|
+
version = "0.1.8"
|
|
83
83
|
source = { editable = "." }
|
|
84
84
|
dependencies = [
|
|
85
85
|
{ name = "loguru" },
|
|
86
|
+
{ name = "pyyaml" },
|
|
86
87
|
{ name = "requests" },
|
|
87
88
|
]
|
|
88
89
|
|
|
89
90
|
[package.metadata]
|
|
90
91
|
requires-dist = [
|
|
91
92
|
{ name = "loguru", specifier = "==0.7.3" },
|
|
93
|
+
{ name = "pyyaml", specifier = "==6.0.3" },
|
|
92
94
|
{ name = "requests", specifier = "==2.32.5" },
|
|
93
95
|
]
|
|
94
96
|
|
|
@@ -114,6 +116,52 @@ wheels = [
|
|
|
114
116
|
{ url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" },
|
|
115
117
|
]
|
|
116
118
|
|
|
119
|
+
[[package]]
|
|
120
|
+
name = "pyyaml"
|
|
121
|
+
version = "6.0.3"
|
|
122
|
+
source = { registry = "https://pypi.org/simple" }
|
|
123
|
+
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
|
|
124
|
+
wheels = [
|
|
125
|
+
{ url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
|
|
126
|
+
{ url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
|
|
127
|
+
{ url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
|
|
128
|
+
{ url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
|
|
129
|
+
{ url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
|
|
130
|
+
{ url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
|
|
131
|
+
{ url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
|
|
132
|
+
{ url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
|
|
133
|
+
{ url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
|
|
134
|
+
{ url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
|
|
135
|
+
{ url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
|
|
136
|
+
{ url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
|
|
137
|
+
{ url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
|
|
138
|
+
{ url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
|
|
139
|
+
{ url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
|
|
140
|
+
{ url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
|
|
141
|
+
{ url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
|
|
142
|
+
{ url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
|
|
143
|
+
{ url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
|
|
144
|
+
{ url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
|
|
145
|
+
{ url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
|
|
146
|
+
{ url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
|
|
147
|
+
{ url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
|
|
148
|
+
{ url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
|
|
149
|
+
{ url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
|
|
150
|
+
{ url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
|
|
151
|
+
{ url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
|
|
152
|
+
{ url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
|
|
153
|
+
{ url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
|
|
154
|
+
{ url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
|
|
155
|
+
{ url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
|
|
156
|
+
{ url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
|
|
157
|
+
{ url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
|
|
158
|
+
{ url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
|
|
159
|
+
{ url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
|
|
160
|
+
{ url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
|
|
161
|
+
{ url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
|
|
162
|
+
{ url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
|
|
163
|
+
]
|
|
164
|
+
|
|
117
165
|
[[package]]
|
|
118
166
|
name = "requests"
|
|
119
167
|
version = "2.32.5"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|