dts-dance 0.1.6__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.
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dts-dance
3
- Version: 0.1.6
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
 
@@ -0,0 +1,5 @@
1
+ sites:
2
+ test:
3
+ endpoint: xxx
4
+ svc_account: xxx
5
+ svc_secret: xxx
@@ -99,7 +99,11 @@ class ByteCloudHelper:
99
99
  try:
100
100
  # 发送 GET 请求
101
101
  response = requests.get(url, headers=headers, timeout=60)
102
+
103
+ # 调试用途,输出返回内容,保存内容到本地文件
102
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)
103
107
 
104
108
  # 检查响应状态码
105
109
  if response.status_code != 200:
@@ -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
- url = "https://cloud.bytedance.net/api/v1/bytedts/api/bytedts/v3/DescribeTaskInfo"
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
- return f"https://cloud.bytedance.net/bytedts/datasync/detail/{task_id}?scope={env}"
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.6"
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.6"
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