python-cnb 1.19.9__tar.gz → 1.21.13__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.
Files changed (63) hide show
  1. {python_cnb-1.19.9/python_cnb.egg-info → python_cnb-1.21.13}/PKG-INFO +1 -1
  2. python_cnb-1.21.13/cnb/charge.py +72 -0
  3. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/issues.py +122 -2
  4. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/knowledgebase.py +25 -2
  5. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/missions.py +0 -17
  6. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/api.py +30 -0
  7. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/dto.py +56 -3
  8. python_cnb-1.21.13/cnb/models/errors.py +11 -0
  9. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/pulls.py +56 -0
  10. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/rank.py +8 -8
  11. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/registries.py +9 -10
  12. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/repositories.py +0 -17
  13. {python_cnb-1.19.9 → python_cnb-1.21.13/python_cnb.egg-info}/PKG-INFO +1 -1
  14. {python_cnb-1.19.9 → python_cnb-1.21.13}/python_cnb.egg-info/SOURCES.txt +1 -0
  15. {python_cnb-1.19.9 → python_cnb-1.21.13}/setup.py +1 -1
  16. python_cnb-1.19.9/cnb/charge.py +0 -22
  17. {python_cnb-1.19.9 → python_cnb-1.21.13}/LICENSE +0 -0
  18. {python_cnb-1.19.9 → python_cnb-1.21.13}/MANIFEST.in +0 -0
  19. {python_cnb-1.19.9 → python_cnb-1.21.13}/README.md +0 -0
  20. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/__init__.py +0 -0
  21. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/activities.py +0 -0
  22. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/ai.py +0 -0
  23. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/ai_ext.py +0 -0
  24. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/assets.py +0 -0
  25. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/badge.py +0 -0
  26. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/build.py +0 -0
  27. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/client.py +0 -0
  28. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/cnb.py +0 -0
  29. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/event.py +0 -0
  30. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/exceptions.py +0 -0
  31. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/followers.py +0 -0
  32. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/git.py +0 -0
  33. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/gitsettings.py +0 -0
  34. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/members.py +0 -0
  35. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/__init__.py +0 -0
  36. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/chart.py +0 -0
  37. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/constant.py +0 -0
  38. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/convert.py +0 -0
  39. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/die.py +0 -0
  40. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/flags.py +0 -0
  41. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/git_woa_com_cnb_monorepo_git_internal_app_git_service_bff_api.py +0 -0
  42. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/git_woa_com_cnb_monorepo_git_internal_app_vcs_service_bff_api.py +0 -0
  43. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/git_woa_com_cnb_monorepo_platform_service_api_internal_models_artifactory_dto.py +0 -0
  44. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/member.py +0 -0
  45. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/models.py +0 -0
  46. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/openapi.py +0 -0
  47. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/organization.py +0 -0
  48. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/models/web.py +0 -0
  49. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/organizations.py +0 -0
  50. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/releases.py +0 -0
  51. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/repocodeissue.py +0 -0
  52. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/repocontributor.py +0 -0
  53. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/repolabels.py +0 -0
  54. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/search.py +0 -0
  55. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/security.py +0 -0
  56. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/starring.py +0 -0
  57. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/users.py +0 -0
  58. {python_cnb-1.19.9 → python_cnb-1.21.13}/cnb/workspace.py +0 -0
  59. {python_cnb-1.19.9 → python_cnb-1.21.13}/pyproject.toml +0 -0
  60. {python_cnb-1.19.9 → python_cnb-1.21.13}/python_cnb.egg-info/dependency_links.txt +0 -0
  61. {python_cnb-1.19.9 → python_cnb-1.21.13}/python_cnb.egg-info/requires.txt +0 -0
  62. {python_cnb-1.19.9 → python_cnb-1.21.13}/python_cnb.egg-info/top_level.txt +0 -0
  63. {python_cnb-1.19.9 → python_cnb-1.21.13}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-cnb
3
- Version: 1.19.9
3
+ Version: 1.21.13
4
4
  Summary: CNB OpenAPI的Python SDK,方便与CNB平台进行交互
5
5
  Home-page: https://cnb.cool
6
6
  Author: Tencent Cloud
@@ -0,0 +1,72 @@
1
+ # Code generated by cnb.cool/cnb/sdk/cnb-sdk-generator. DO NOT EDIT.
2
+ # source: https://api.cnb-dev.woa.com/swagger.json
3
+
4
+ from typing import Optional
5
+ from .models import dto
6
+ class ChargeService:
7
+ def __init__(self, client):
8
+ self._client = client
9
+
10
+ # 获取组织各资源类型当月额度
11
+ def get_quota(self,
12
+ slug: str,
13
+ ) -> dto.VolumeQuotaResp:
14
+ u = "/%s/-/charge/quota" % (slug, )
15
+
16
+ data = self._client.request(
17
+ method="GET",
18
+ endpoint=u,
19
+ )
20
+ return dto.VolumeQuotaResp.safe_parse(data)
21
+
22
+ # 分页获取组织仓库用量
23
+ def get_repos_volume(self,
24
+ slug: str,
25
+ type: Optional[str] = None,
26
+ page: Optional[int] = None,
27
+ page_size: Optional[int] = None,
28
+ ) -> list[dto.RepoVolume]:
29
+ u = "/%s/-/charge/repos-volume" % (slug, )
30
+
31
+ query_params = {
32
+ "type": type,
33
+ "page": page,
34
+ "page_size": page_size,
35
+ }
36
+ data = self._client.request(
37
+ method="GET",
38
+ endpoint=u,
39
+ params=query_params,
40
+ )
41
+ return [dto.RepoVolume.safe_parse(item) for item in data]
42
+
43
+ # 查看特权额度
44
+ def get_special_amount(self,
45
+ slug: str,
46
+ ) -> dto.SpecialAmount:
47
+ u = "/%s/-/charge/special-amount" % (slug, )
48
+
49
+ data = self._client.request(
50
+ method="GET",
51
+ endpoint=u,
52
+ )
53
+ return dto.SpecialAmount.safe_parse(data)
54
+
55
+ # 获取根组织各资源用量
56
+ def get_volume(self,
57
+ slug: str,
58
+ month: Optional[str] = None,
59
+ ) -> dto.VolumeUsedResp:
60
+ u = "/%s/-/charge/volume" % (slug, )
61
+
62
+ query_params = {
63
+ "month": month,
64
+ }
65
+ data = self._client.request(
66
+ method="GET",
67
+ endpoint=u,
68
+ params=query_params,
69
+ )
70
+ return dto.VolumeUsedResp.safe_parse(data)
71
+
72
+
@@ -105,6 +105,45 @@ class IssuesService:
105
105
  )
106
106
  return api.IssueComment.safe_parse(data)
107
107
 
108
+ # 获取 Issue 文件,返回文件二进制内容。Request to retrieve file of issues, returns binary content.
109
+ def get_issue_files(self,
110
+ repo: str,
111
+ file_path: str,
112
+ ):
113
+ u = "/%s/-/files/issues/%s" % (repo, file_path, )
114
+
115
+ data = self._client.request(
116
+ method="GET",
117
+ endpoint=u,
118
+ )
119
+ return
120
+
121
+ # 获取 Issue 图片,返回图片二进制内容。Request to retrieve image of issues, returns binary content.
122
+ def get_issue_imgs(self,
123
+ repo: str,
124
+ img_path: str,
125
+ ):
126
+ u = "/%s/-/imgs/issues/%s" % (repo, img_path, )
127
+
128
+ data = self._client.request(
129
+ method="GET",
130
+ endpoint=u,
131
+ )
132
+ return
133
+
134
+ # 查询指定Issue的自定义属性列表。Get issue custom properties.
135
+ def get_issue_properties(self,
136
+ repo: str,
137
+ number: str,
138
+ ) -> list[api.IssueProperty]:
139
+ u = "/%s/-/issues/%s/property" % (repo, number, )
140
+
141
+ data = self._client.request(
142
+ method="GET",
143
+ endpoint=u,
144
+ )
145
+ return [api.IssueProperty.safe_parse(item) for item in data]
146
+
108
147
  # 查询指定 Issue 的 Timeline Activity
109
148
  def list_issue_activities(self,
110
149
  repo: str,
@@ -237,6 +276,39 @@ class IssuesService:
237
276
  )
238
277
  return [api.Issue.safe_parse(item) for item in data]
239
278
 
279
+ # 查询仓库不可见的自定义属性列表。List repository invisible custom properties.
280
+ def list_repo_invisible_properties(self,
281
+ repo: str,
282
+ page: Optional[int] = None,
283
+ page_size: Optional[int] = None,
284
+ keyword: Optional[str] = None,
285
+ ) -> list[api.RepoProperty]:
286
+ u = "/%s/-/property/invisible" % (repo, )
287
+
288
+ query_params = {
289
+ "page": page,
290
+ "page_size": page_size,
291
+ "keyword": keyword,
292
+ }
293
+ data = self._client.request(
294
+ method="GET",
295
+ endpoint=u,
296
+ params=query_params,
297
+ )
298
+ return [api.RepoProperty.safe_parse(item) for item in data]
299
+
300
+ # 查询仓库可见的自定义属性列表。List repository visible custom properties.
301
+ def list_repo_visible_properties(self,
302
+ repo: str,
303
+ ) -> list[api.RepoProperty]:
304
+ u = "/%s/-/property" % (repo, )
305
+
306
+ data = self._client.request(
307
+ method="GET",
308
+ endpoint=u,
309
+ )
310
+ return [api.RepoProperty.safe_parse(item) for item in data]
311
+
240
312
  # 查询当前用户相关的 Issues。List issues for the authenticated user across all repositories.
241
313
  def list_user_issues(self,
242
314
  page: Optional[int] = None,
@@ -250,6 +322,8 @@ class IssuesService:
250
322
  updated_time_end: Optional[str] = None,
251
323
  close_time_begin: Optional[str] = None,
252
324
  close_time_end: Optional[str] = None,
325
+ created_time_begin: Optional[str] = None,
326
+ created_time_end: Optional[str] = None,
253
327
  order_by: Optional[str] = None,
254
328
  ) -> list[api.UserIssue]:
255
329
  u = "/user/issues" % ()
@@ -266,6 +340,8 @@ class IssuesService:
266
340
  "updated_time_end": updated_time_end,
267
341
  "close_time_begin": close_time_begin,
268
342
  "close_time_end": close_time_end,
343
+ "created_time_begin": created_time_begin,
344
+ "created_time_end": created_time_end,
269
345
  "order_by": order_by,
270
346
  }
271
347
  data = self._client.request(
@@ -306,6 +382,20 @@ class IssuesService:
306
382
  )
307
383
  return api.IssueComment.safe_parse(data)
308
384
 
385
+ # 创建一个 Issue 附件组用于上传新建 Issue 的附件。一次可以获取 16 个附件上传 url。需要上传更多附件可以使用 /{repo}/-/issues/asset-groups/{asset_group_id}/image-asset-upload-url 和 /{repo}/-/issues/asset-groups/{asset_group_id}/file-asset-upload-url 接口获取更多的上传 url。
386
+ def post_asset_group(self,
387
+ repo: str,
388
+ body_params: api.PostAssetGroupForm,
389
+ ) -> api.AssetGroup:
390
+ u = "/%s/-/issues/asset-groups" % (repo, )
391
+
392
+ data = self._client.request(
393
+ method="POST",
394
+ endpoint=u,
395
+ json=body_params.to_dict(),
396
+ )
397
+ return api.AssetGroup.safe_parse(data)
398
+
309
399
  # 添加处理人到指定的 issue。 Adds up to assignees to a issue, Users already assigned to an issue are not replaced.
310
400
  def post_issue_assignees(self,
311
401
  repo: str,
@@ -337,7 +427,7 @@ class IssuesService:
337
427
  return api.IssueComment.safe_parse(data)
338
428
 
339
429
  # 创建一个 Issue 评论的文件上传 url。请使用 put 发起流式上传到 upload_url 地址。上传完成后将 asset_link 添加到创建评论请求的 body 中。 Create a file upload URL for an Issue comment. Please use put to initiate a stream upload to the upload_url address. After uploading, add the asset_link to the body of the create comment request.
340
- def post_issue_file_asset_upload_url(self,
430
+ def post_issue_comment_file_asset_upload_url(self,
341
431
  repo: str,
342
432
  number: str,
343
433
  body_params: api.PostIssueAssetUploadURLForm,
@@ -352,7 +442,7 @@ class IssuesService:
352
442
  return api.IssueAssetUploadURL.safe_parse(data)
353
443
 
354
444
  # 创建一个 Issue 评论的图片上传 url。请使用 put 发起流式上传到 upload_url 地址。上传完成后将 asset_link 添加到创建评论请求的 body 中。Create an image upload URL for an Issue comment. Please use put to initiate a stream upload to the upload_url address. After uploading, add the asset_link to the body of the create comment request.
355
- def post_issue_image_asset_upload_url(self,
445
+ def post_issue_comment_image_asset_upload_url(self,
356
446
  repo: str,
357
447
  number: str,
358
448
  body_params: api.PostIssueAssetUploadURLForm,
@@ -366,6 +456,36 @@ class IssuesService:
366
456
  )
367
457
  return api.IssueAssetUploadURL.safe_parse(data)
368
458
 
459
+ # 新增一个 Issue 文件附件的上传 url 用于上传新建 Issue 的文件附件。
460
+ def post_issue_file_asset_upload_url(self,
461
+ repo: str,
462
+ asset_group_id: str,
463
+ body_params: api.PostIssueAssetUploadURLForm,
464
+ ) -> api.IssueAssetUploadURL:
465
+ u = "/%s/-/issues/asset-groups/%s/file-asset-upload-url" % (repo, asset_group_id, )
466
+
467
+ data = self._client.request(
468
+ method="POST",
469
+ endpoint=u,
470
+ json=body_params.to_dict(),
471
+ )
472
+ return api.IssueAssetUploadURL.safe_parse(data)
473
+
474
+ # 新增一个 Issue 图片的上传 url 用于上传新建 Issue 的图片。
475
+ def post_issue_image_asset_upload_url(self,
476
+ repo: str,
477
+ asset_group_id: str,
478
+ body_params: api.PostIssueAssetUploadURLForm,
479
+ ) -> api.IssueAssetUploadURL:
480
+ u = "/%s/-/issues/asset-groups/%s/image-asset-upload-url" % (repo, asset_group_id, )
481
+
482
+ data = self._client.request(
483
+ method="POST",
484
+ endpoint=u,
485
+ json=body_params.to_dict(),
486
+ )
487
+ return api.IssueAssetUploadURL.safe_parse(data)
488
+
369
489
  # 新增 issue 标签。Add labels to an issue.
370
490
  def post_issue_labels(self,
371
491
  repo: str,
@@ -43,7 +43,7 @@ class KnowledgebaseService:
43
43
  )
44
44
  return [dto.EmbeddingModel.safe_parse(item) for item in data]
45
45
 
46
- # 查询知识库,使用文档:https://docs.cnb.cool/zh/ai/knowledge-base.html
46
+ # 查询知识库 [POST 接口已废弃,请使用 GET 替代]
47
47
  def query_knowledge_base(self,
48
48
  repo: str,
49
49
  body_params: dto.QueryKnowledgeBaseReq,
@@ -57,12 +57,35 @@ class KnowledgebaseService:
57
57
  )
58
58
  return [dto.QueryKnowledgeBaseRes.safe_parse(item) for item in data]
59
59
 
60
+ # 查询知识库,使用文档:https://docs.cnb.cool/zh/ai/knowledge-base.html
61
+ def query_knowledge_base_get(self,
62
+ repo: str,
63
+ query: Optional[str] = None,
64
+ top_k: Optional[int] = None,
65
+ score_threshold: Optional[float] = None,
66
+ metadata_filtering_conditions: Optional[str] = None,
67
+ ) -> list[dto.QueryKnowledgeBaseRes]:
68
+ u = "/%s/-/knowledge/base/query" % (repo, )
69
+
70
+ query_params = {
71
+ "query": query,
72
+ "top_k": top_k,
73
+ "score_threshold": score_threshold,
74
+ "metadata_filtering_conditions": metadata_filtering_conditions,
75
+ }
76
+ data = self._client.request(
77
+ method="GET",
78
+ endpoint=u,
79
+ params=query_params,
80
+ )
81
+ return [dto.QueryKnowledgeBaseRes.safe_parse(item) for item in data]
82
+
60
83
  # 全局语义搜索 NPC 角色
61
84
  def search_npc(self,
62
85
  key: Optional[str] = None,
63
86
  top_n: Optional[int] = None,
64
87
  ) -> list[dto.SearchNpcRes]:
65
- u = "/npc/search" % ()
88
+ u = "/search/npc" % ()
66
89
 
67
90
  query_params = {
68
91
  "key": key,
@@ -133,21 +133,4 @@ class MissionsService:
133
133
  )
134
134
  return
135
135
 
136
- # 改变任务集可见性。Update the visibility of a mission.
137
- def set_mission_visibility(self,
138
- mission: str,
139
- visibility: Optional[str] = None,
140
- ):
141
- u = "/%s/-/settings/set_visibility" % (mission, )
142
-
143
- query_params = {
144
- "visibility": visibility,
145
- }
146
- data = self._client.request(
147
- method="POST",
148
- endpoint=u,
149
- params=query_params,
150
- )
151
- return
152
-
153
136
 
@@ -7,6 +7,11 @@ from typing import Optional, Dict
7
7
  from .models import CNBBaseModel
8
8
  from . import git_woa_com_cnb_monorepo_git_internal_app_git_service_bff_api
9
9
  from . import git_woa_com_cnb_monorepo_git_internal_app_vcs_service_bff_api
10
+ class AssetGroup(CNBBaseModel):
11
+ asset_group_id: Optional[str] = Field(alias="asset_group_id", default=None)
12
+ file_upload_urls: Optional[list['IssueAssetUploadURL']] = Field(alias="file_upload_urls", default=None)
13
+ image_upload_urls: Optional[list['IssueAssetUploadURL']] = Field(alias="image_upload_urls", default=None)
14
+ pass
10
15
  class Author(CNBBaseModel):
11
16
  email: Optional[str] = Field(alias="email", default=None)
12
17
  user_name: Optional[str] = Field(alias="user_name", default=None)
@@ -178,6 +183,9 @@ class DeleteIssueAssigneesForm(CNBBaseModel):
178
183
  class DeletePullAssigneesForm(CNBBaseModel):
179
184
  assignees: Optional[list[str]] = Field(alias="assignees", default=None)
180
185
  pass
186
+ class DeletePullReviewersForm(CNBBaseModel):
187
+ reviewers: Optional[list[str]] = Field(alias="reviewers", default=None)
188
+ pass
181
189
  class DiffLine(CNBBaseModel):
182
190
  content: Optional[str] = Field(alias="content", default=None)
183
191
  left_line_number: Optional[int] = Field(alias="left_line_number", default=None)
@@ -234,6 +242,7 @@ class IssueActivity(CNBBaseModel):
234
242
  pass
235
243
  class IssueAssetUploadURL(CNBBaseModel):
236
244
  asset_link: Optional[str] = Field(alias="asset_link", default=None)
245
+ name: Optional[str] = Field(alias="name", default=None)
237
246
  path: Optional[str] = Field(alias="path", default=None)
238
247
  upload_url: Optional[str] = Field(alias="upload_url", default=None)
239
248
  pass
@@ -257,12 +266,19 @@ class IssueDetail(CNBBaseModel):
257
266
  last_acted_at: Optional[str] = Field(alias="last_acted_at", default=None)
258
267
  number: Optional[str] = Field(alias="number", default=None)
259
268
  priority: Optional[str] = Field(alias="priority", default=None)
269
+ properties: Optional[list['IssueProperty']] = Field(alias="properties", default=None)
260
270
  started_at: Optional[str] = Field(alias="started_at", default=None)
261
271
  state: Optional[str] = Field(alias="state", default=None)
262
272
  state_reason: Optional[str] = Field(alias="state_reason", default=None)
263
273
  title: Optional[str] = Field(alias="title", default=None)
264
274
  updated_at: Optional[str] = Field(alias="updated_at", default=None)
265
275
  pass
276
+ class IssueProperty(CNBBaseModel):
277
+ key: Optional[str] = Field(alias="key", default=None)
278
+ name: Optional[str] = Field(alias="name", default=None)
279
+ type: Optional[str] = Field(alias="type", default=None)
280
+ value: Optional[str] = Field(alias="value", default=None)
281
+ pass
266
282
  class IssuePropertyUpdateResult(CNBBaseModel):
267
283
  failed_count: Optional[int] = Field(alias="failed_count", default=None)
268
284
  failed_keys: Optional[list[str]] = Field(alias="failed_keys", default=None)
@@ -327,8 +343,13 @@ class PatchPullRequest(CNBBaseModel):
327
343
  pass
328
344
  class PipelineSettings(CNBBaseModel):
329
345
  auto_trigger: Optional[bool] = Field(alias="auto_trigger", default=None)
346
+ cron_auto_trigger: Optional[bool] = Field(alias="cron_auto_trigger", default=None)
330
347
  forked_repo_auto_trigger: Optional[bool] = Field(alias="forked_repo_auto_trigger", default=None)
331
348
  pass
349
+ class PostAssetGroupForm(CNBBaseModel):
350
+ file_assets: Optional[list['PostIssueAssetUploadURLForm']] = Field(alias="file_assets", default=None)
351
+ image_assets: Optional[list['PostIssueAssetUploadURLForm']] = Field(alias="image_assets", default=None)
352
+ pass
332
353
  class PostBlobForm(CNBBaseModel):
333
354
  content: Optional[str] = Field(alias="content", default=None)
334
355
  encoding: Optional[str] = Field(alias="encoding", default=None)
@@ -374,6 +395,9 @@ class PostPullRequestReviewReplyForm(CNBBaseModel):
374
395
  body: Optional[str] = Field(alias="body", default=None)
375
396
  reply_to_comment_id: Optional[str] = Field(alias="reply_to_comment_id", default=None)
376
397
  pass
398
+ class PostPullReviewersForm(CNBBaseModel):
399
+ reviewers: Optional[list[str]] = Field(alias="reviewers", default=None)
400
+ pass
377
401
  class PostTagFrom(CNBBaseModel):
378
402
  message: Optional[str] = Field(alias="message", default=None)
379
403
  name: Optional[str] = Field(alias="name", default=None)
@@ -588,6 +612,12 @@ class RepoInfo(CNBBaseModel):
588
612
  path: Optional[str] = Field(alias="path", default=None)
589
613
  web_url: Optional[str] = Field(alias="web_url", default=None)
590
614
  pass
615
+ class RepoProperty(CNBBaseModel):
616
+ key: Optional[str] = Field(alias="key", default=None)
617
+ name: Optional[str] = Field(alias="name", default=None)
618
+ type: Optional[str] = Field(alias="type", default=None)
619
+ visible: Optional[bool] = Field(alias="visible", default=None)
620
+ pass
591
621
  class Signature(CNBBaseModel):
592
622
  date: Optional[str] = Field(alias="date", default=None)
593
623
  email: Optional[str] = Field(alias="email", default=None)
@@ -113,10 +113,16 @@ class BuildCommonResult(CNBBaseModel):
113
113
  pass
114
114
  class BuildLogsResult(CNBBaseModel):
115
115
  data: Optional[list['LogInfo']] = Field(alias="data", default=None)
116
- init: Optional[bool] = Field(alias="init", default=None)
117
116
  timestamp: Optional[int] = Field(alias="timestamp", default=None)
118
117
  total: Optional[int] = Field(alias="total", default=None)
119
118
  pass
119
+ class BuildPipelineInfo(CNBBaseModel):
120
+ createTime: Optional[str] = Field(alias="createTime", default=None)
121
+ duration: Optional[int] = Field(alias="duration", default=None)
122
+ id: Optional[str] = Field(alias="id", default=None)
123
+ labels: Optional[str] = Field(alias="labels", default=None)
124
+ status: Optional[str] = Field(alias="status", default=None)
125
+ pass
120
126
  class BuildResult(CNBBaseModel):
121
127
  buildLogUrl: Optional[str] = Field(alias="buildLogUrl", default=None)
122
128
  message: Optional[str] = Field(alias="message", default=None)
@@ -195,6 +201,9 @@ class CodeLicenseOverview(CNBBaseModel):
195
201
  medium_risk_cnt: Optional[int] = Field(alias="medium_risk_cnt", default=None)
196
202
  na_risk_cnt: Optional[int] = Field(alias="na_risk_cnt", default=None)
197
203
  pass
204
+ class CodeSbomOverview(CNBBaseModel):
205
+ enable: Optional[bool] = Field(alias="enable", default=None)
206
+ pass
198
207
  class CodeSensitiveSummary(CNBBaseModel):
199
208
  enable: Optional[bool] = Field(alias="enable", default=None)
200
209
  high_count: Optional[int] = Field(alias="high_count", default=None)
@@ -401,7 +410,6 @@ class CreateMissionReq(CNBBaseModel):
401
410
  pass
402
411
  class CreateRepoReq(CNBBaseModel):
403
412
  description: Optional[str] = Field(alias="description", default=None)
404
- license: Optional[str] = Field(alias="license", default=None)
405
413
  name: Optional[str] = Field(alias="name", default=None)
406
414
  visibility: Optional[str] = Field(alias="visibility", default=None)
407
415
  pass
@@ -507,6 +515,10 @@ class GetBadgeResult(CNBBaseModel):
507
515
  links: Optional[list[str]] = Field(alias="links", default=None)
508
516
  message: Optional[str] = Field(alias="message", default=None)
509
517
  pass
518
+ class GetRankResult(CNBBaseModel):
519
+ rank_list: Optional[list['RankDetailWithIncr']] = Field(alias="rank_list", default=None)
520
+ updated_at: Optional[str] = Field(alias="updated_at", default=None)
521
+ pass
510
522
  class GroupSettingReq(CNBBaseModel):
511
523
  email_verification: Optional[list[str]] = Field(alias="email_verification", default=None)
512
524
  group_protection: Optional[int] = Field(alias="group_protection", default=None)
@@ -600,6 +612,7 @@ class LogInfo(CNBBaseModel):
600
612
  pipelineFailCount: Optional[int] = Field(alias="pipelineFailCount", default=None)
601
613
  pipelineSuccessCount: Optional[int] = Field(alias="pipelineSuccessCount", default=None)
602
614
  pipelineTotalCount: Optional[int] = Field(alias="pipelineTotalCount", default=None)
615
+ pipelines: Optional[list['BuildPipelineInfo']] = Field(alias="pipelines", default=None)
603
616
  sha: Optional[str] = Field(alias="sha", default=None)
604
617
  slug: Optional[str] = Field(alias="slug", default=None)
605
618
  sn: Optional[str] = Field(alias="sn", default=None)
@@ -800,6 +813,7 @@ class OutsideCollaboratorInRepo(CNBBaseModel):
800
813
  email: Optional[str] = Field(alias="email", default=None)
801
814
  freeze: Optional[bool] = Field(alias="freeze", default=None)
802
815
  id: Optional[str] = Field(alias="id", default=None)
816
+ inviter: Optional['Users'] = Field(alias="inviter", default=None)
803
817
  join_time: Optional[str] = Field(alias="join_time", default=None)
804
818
  locked: Optional[bool] = Field(alias="locked", default=None)
805
819
  nickname: Optional[str] = Field(alias="nickname", default=None)
@@ -936,6 +950,10 @@ class QueryKnowledgeBaseRes(CNBBaseModel):
936
950
  metadata: Optional[Dict[str, 'object']] = Field(alias="metadata", default=None)
937
951
  score: Optional[float] = Field(alias="score", default=None)
938
952
  pass
953
+ class QuotaItem(CNBBaseModel):
954
+ free: Optional[int] = Field(alias="free", default=None)
955
+ total: Optional[int] = Field(alias="total", default=None)
956
+ pass
939
957
  class RankDetailWithIncr(CNBBaseModel):
940
958
  created_at: Optional[str] = Field(alias="created_at", default=None)
941
959
  description: Optional[str] = Field(alias="description", default=None)
@@ -1013,6 +1031,7 @@ class RepoPatch(CNBBaseModel):
1013
1031
  class RepoSecurityOverview(CNBBaseModel):
1014
1032
  code_issue: Optional['CodeIssueSummary'] = Field(alias="code_issue", default=None)
1015
1033
  code_license: Optional['CodeLicenseOverview'] = Field(alias="code_license", default=None)
1034
+ code_sbom: Optional['CodeSbomOverview'] = Field(alias="code_sbom", default=None)
1016
1035
  code_sensitive: Optional['CodeSensitiveSummary'] = Field(alias="code_sensitive", default=None)
1017
1036
  code_vulnerability: Optional['CodeVulOverview'] = Field(alias="code_vulnerability", default=None)
1018
1037
  risk_cnt: Optional['RepoSecurityRiskCnt'] = Field(alias="risk_cnt", default=None)
@@ -1022,6 +1041,7 @@ class RepoSecurityRiskCnt(CNBBaseModel):
1022
1041
  code_issue_risk_cnt: Optional[int] = Field(alias="code_issue_risk_cnt", default=None)
1023
1042
  code_license_enable: Optional[bool] = Field(alias="code_license_enable", default=None)
1024
1043
  code_license_risk_cnt: Optional[int] = Field(alias="code_license_risk_cnt", default=None)
1044
+ code_sbom_enable: Optional[bool] = Field(alias="code_sbom_enable", default=None)
1025
1045
  code_sensitive_enable: Optional[bool] = Field(alias="code_sensitive_enable", default=None)
1026
1046
  code_sensitive_risk_cnt: Optional[int] = Field(alias="code_sensitive_risk_cnt", default=None)
1027
1047
  code_vulnerability_enable: Optional[bool] = Field(alias="code_vulnerability_enable", default=None)
@@ -1034,6 +1054,13 @@ class RepoStarUsers(CNBBaseModel):
1034
1054
  total: Optional[int] = Field(alias="total", default=None)
1035
1055
  users: Optional[list['StarUser']] = Field(alias="users", default=None)
1036
1056
  pass
1057
+ class RepoVolume(CNBBaseModel):
1058
+ is_deleted: Optional[bool] = Field(alias="is_deleted", default=None)
1059
+ resource_id: Optional[str] = Field(alias="resource_id", default=None)
1060
+ resource_type: Optional['constant.SlugType'] = Field(alias="resource_type", default=None)
1061
+ slug: Optional[str] = Field(alias="slug", default=None)
1062
+ volume: Optional[str] = Field(alias="volume", default=None)
1063
+ pass
1037
1064
  class Repos4User(CNBBaseModel):
1038
1065
  access: Optional['constant.AccessRole'] = Field(alias="access", default=None)
1039
1066
  created_at: Optional[str] = Field(alias="created_at", default=None)
@@ -1107,10 +1134,13 @@ class Repos4UserBase(CNBBaseModel):
1107
1134
  pass
1108
1135
  class SearchNpcRes(CNBBaseModel):
1109
1136
  avatar: Optional[str] = Field(alias="avatar", default=None)
1137
+ built_count: Optional[int] = Field(alias="built_count", default=None)
1110
1138
  name: Optional[str] = Field(alias="name", default=None)
1111
- repo_id: Optional[int] = Field(alias="repo_id", default=None)
1139
+ pull_request_created_count: Optional[int] = Field(alias="pull_request_created_count", default=None)
1140
+ pull_request_merged_count: Optional[int] = Field(alias="pull_request_merged_count", default=None)
1112
1141
  score: Optional[float] = Field(alias="score", default=None)
1113
1142
  slogan: Optional[str] = Field(alias="slogan", default=None)
1143
+ slug: Optional[str] = Field(alias="slug", default=None)
1114
1144
  pass
1115
1145
  class Slugs(CNBBaseModel):
1116
1146
  created_at: Optional[str] = Field(alias="created_at", default=None)
@@ -1174,6 +1204,7 @@ class StartBuildReq(CNBBaseModel):
1174
1204
  sha: Optional[str] = Field(alias="sha", default=None)
1175
1205
  sync: Optional[str] = Field(alias="sync", default=None)
1176
1206
  tag: Optional[str] = Field(alias="tag", default=None)
1207
+ title: Optional[str] = Field(alias="title", default=None)
1177
1208
  pass
1178
1209
  class StartWorkspaceReq(CNBBaseModel):
1179
1210
  branch: Optional[str] = Field(alias="branch", default=None)
@@ -1217,6 +1248,9 @@ class UpdateMembersRequest(CNBBaseModel):
1217
1248
  access_level: Optional[str] = Field(alias="access_level", default=None)
1218
1249
  is_outside_collaborator: Optional[bool] = Field(alias="is_outside_collaborator", default=None)
1219
1250
  pass
1251
+ class UpdatePackageRequest(CNBBaseModel):
1252
+ description: Optional[str] = Field(alias="description", default=None)
1253
+ pass
1220
1254
  class UpdateUserInfoPayload(CNBBaseModel):
1221
1255
  address: Optional[str] = Field(alias="address", default=None)
1222
1256
  bio: Optional[str] = Field(alias="bio", default=None)
@@ -1296,6 +1330,7 @@ class UsersResult(CNBBaseModel):
1296
1330
  gender: Optional[int] = Field(alias="gender", default=None)
1297
1331
  group_count: Optional[int] = Field(alias="group_count", default=None)
1298
1332
  id: Optional[str] = Field(alias="id", default=None)
1333
+ identity_providers: Optional[Dict[str, 'object']] = Field(alias="identity_providers", default=None)
1299
1334
  is_following: Optional[bool] = Field(alias="is_following", default=None)
1300
1335
  location: Optional[str] = Field(alias="location", default=None)
1301
1336
  locked: Optional[bool] = Field(alias="locked", default=None)
@@ -1336,6 +1371,24 @@ class UsersWithAccessLevelInSlug(CNBBaseModel):
1336
1371
  verified: Optional[int] = Field(alias="verified", default=None)
1337
1372
  verified_expire_in: Optional[str] = Field(alias="verified_expire_in", default=None)
1338
1373
  pass
1374
+ class VolumeQuotaResp(CNBBaseModel):
1375
+ ci_gpu_in_sec: Optional['QuotaItem'] = Field(alias="ci_gpu_in_sec", default=None)
1376
+ ci_in_sec: Optional['QuotaItem'] = Field(alias="ci_in_sec", default=None)
1377
+ credit_in_milli: Optional['QuotaItem'] = Field(alias="credit_in_milli", default=None)
1378
+ dev_gpu_in_sec: Optional['QuotaItem'] = Field(alias="dev_gpu_in_sec", default=None)
1379
+ dev_in_sec: Optional['QuotaItem'] = Field(alias="dev_in_sec", default=None)
1380
+ git_in_byte: Optional['QuotaItem'] = Field(alias="git_in_byte", default=None)
1381
+ object_in_byte: Optional['QuotaItem'] = Field(alias="object_in_byte", default=None)
1382
+ pass
1383
+ class VolumeUsedResp(CNBBaseModel):
1384
+ ci_gpu_in_sec: Optional[int] = Field(alias="ci_gpu_in_sec", default=None)
1385
+ ci_in_sec: Optional[int] = Field(alias="ci_in_sec", default=None)
1386
+ credit_in_milli: Optional[int] = Field(alias="credit_in_milli", default=None)
1387
+ dev_gpu_in_sec: Optional[int] = Field(alias="dev_gpu_in_sec", default=None)
1388
+ dev_in_sec: Optional[int] = Field(alias="dev_in_sec", default=None)
1389
+ git_in_byte: Optional[int] = Field(alias="git_in_byte", default=None)
1390
+ object_in_byte: Optional[int] = Field(alias="object_in_byte", default=None)
1391
+ pass
1339
1392
  class WorkspaceDeleteReq(CNBBaseModel):
1340
1393
  pipelineId: Optional[str] = Field(alias="pipelineId", default=None)
1341
1394
  sn: Optional[str] = Field(alias="sn", default=None)
@@ -0,0 +1,11 @@
1
+ # Code generated by cnb.cool/cnb/sdk/cnb-sdk-generator. DO NOT EDIT.
2
+ # source: https://api.cnb-dev.woa.com/swagger.json
3
+
4
+ from pydantic import Field
5
+ from enum import Enum
6
+ from typing import Optional, Dict
7
+ from .models import CNBBaseModel
8
+ class WebError(CNBBaseModel):
9
+ errcode: Optional[int] = Field(alias="errcode", default=None)
10
+ errmsg: Optional[str] = Field(alias="errmsg", default=None)
11
+ pass
@@ -64,6 +64,21 @@ class PullsService:
64
64
  )
65
65
  return
66
66
 
67
+ # 删除合并请求中的评审人。Removes one or more reviewers from a pull request.
68
+ def delete_pull_reviewers(self,
69
+ repo: str,
70
+ number: str,
71
+ body_params: api.DeletePullReviewersForm,
72
+ ) -> api.Pull:
73
+ u = "/%s/-/pulls/%s/reviewers" % (repo, number, )
74
+
75
+ data = self._client.request(
76
+ method="DELETE",
77
+ endpoint=u,
78
+ json=body_params.to_dict(),
79
+ )
80
+ return api.Pull.safe_parse(data)
81
+
67
82
  # 删除 UploadFiles 上传的附件
68
83
  def delete_repo_files(self,
69
84
  repo: str,
@@ -90,6 +105,32 @@ class PullsService:
90
105
  )
91
106
  return
92
107
 
108
+ # 获取合并请求文件,返回文件二进制内容。Request to retrieve file of pull requests, returns binary content.
109
+ def get_pr_files(self,
110
+ repo: str,
111
+ file_path: str,
112
+ ):
113
+ u = "/%s/-/files/pulls/%s" % (repo, file_path, )
114
+
115
+ data = self._client.request(
116
+ method="GET",
117
+ endpoint=u,
118
+ )
119
+ return
120
+
121
+ # 获取合并请求图片,返回图片二进制内容。Request to retrieve image of pull requests, returns binary content.
122
+ def get_pr_imgs(self,
123
+ repo: str,
124
+ img_path: str,
125
+ ):
126
+ u = "/%s/-/imgs/pulls/%s" % (repo, img_path, )
127
+
128
+ data = self._client.request(
129
+ method="GET",
130
+ endpoint=u,
131
+ )
132
+ return
133
+
93
134
  # 查询指定合并请求。Get a pull request.
94
135
  def get_pull(self,
95
136
  repo: str,
@@ -453,6 +494,21 @@ class PullsService:
453
494
  )
454
495
  return
455
496
 
497
+ # 添加评审人到指定的合并请求。Adds up to reviewers to a pull request. Users already added as reviewers are not replaced.
498
+ def post_pull_reviewers(self,
499
+ repo: str,
500
+ number: str,
501
+ body_params: api.PostPullReviewersForm,
502
+ ) -> api.Pull:
503
+ u = "/%s/-/pulls/%s/reviewers" % (repo, number, )
504
+
505
+ data = self._client.request(
506
+ method="POST",
507
+ endpoint=u,
508
+ json=body_params.to_dict(),
509
+ )
510
+ return api.Pull.safe_parse(data)
511
+
456
512
  # 设置合并请求标签。Set the new labels for a pull.
457
513
  def put_pull_labels(self,
458
514
  repo: str,
@@ -31,7 +31,7 @@ class RankService:
31
31
  flags: Optional[str] = None,
32
32
  year: Optional[str] = None,
33
33
  topN: Optional[int] = None,
34
- ) -> list[dto.RankDetailWithIncr]:
34
+ ) -> dto.GetRankResult:
35
35
  u = "/ranks/repo/annual" % ()
36
36
 
37
37
  query_params = {
@@ -45,7 +45,7 @@ class RankService:
45
45
  endpoint=u,
46
46
  params=query_params,
47
47
  )
48
- return [dto.RankDetailWithIncr.safe_parse(item) for item in data]
48
+ return dto.GetRankResult.safe_parse(data)
49
49
 
50
50
  # 获取公仓日榜
51
51
  def get_repo_daily_rank(self,
@@ -53,7 +53,7 @@ class RankService:
53
53
  flags: Optional[str] = None,
54
54
  date: Optional[str] = None,
55
55
  topN: Optional[int] = None,
56
- ) -> list[dto.RankDetailWithIncr]:
56
+ ) -> dto.GetRankResult:
57
57
  u = "/ranks/repo/daily" % ()
58
58
 
59
59
  query_params = {
@@ -67,7 +67,7 @@ class RankService:
67
67
  endpoint=u,
68
68
  params=query_params,
69
69
  )
70
- return [dto.RankDetailWithIncr.safe_parse(item) for item in data]
70
+ return dto.GetRankResult.safe_parse(data)
71
71
 
72
72
  # 获取公仓月榜
73
73
  def get_repo_monthly_rank(self,
@@ -75,7 +75,7 @@ class RankService:
75
75
  flags: Optional[str] = None,
76
76
  month: Optional[str] = None,
77
77
  topN: Optional[int] = None,
78
- ) -> list[dto.RankDetailWithIncr]:
78
+ ) -> dto.GetRankResult:
79
79
  u = "/ranks/repo/monthly" % ()
80
80
 
81
81
  query_params = {
@@ -89,7 +89,7 @@ class RankService:
89
89
  endpoint=u,
90
90
  params=query_params,
91
91
  )
92
- return [dto.RankDetailWithIncr.safe_parse(item) for item in data]
92
+ return dto.GetRankResult.safe_parse(data)
93
93
 
94
94
  # 获取公仓周榜
95
95
  def get_repo_weekly_rank(self,
@@ -97,7 +97,7 @@ class RankService:
97
97
  flags: Optional[str] = None,
98
98
  start: Optional[str] = None,
99
99
  topN: Optional[int] = None,
100
- ) -> list[dto.RankDetailWithIncr]:
100
+ ) -> dto.GetRankResult:
101
101
  u = "/ranks/repo/weekly" % ()
102
102
 
103
103
  query_params = {
@@ -111,6 +111,6 @@ class RankService:
111
111
  endpoint=u,
112
112
  params=query_params,
113
113
  )
114
- return [dto.RankDetailWithIncr.safe_parse(item) for item in data]
114
+ return dto.GetRankResult.safe_parse(data)
115
115
 
116
116
 
@@ -181,20 +181,19 @@ class RegistriesService:
181
181
  )
182
182
  return [dto.Package.safe_parse(item) for item in data]
183
183
 
184
- # 改变制品仓库可见性。Update visibility of registry.
185
- def set_registry_visibility(self,
186
- registry: str,
187
- visibility: Optional[str] = None,
184
+ # 更新制品描述。Update the description of the specific package.
185
+ def update_package_description(self,
186
+ slug: str,
187
+ t: str,
188
+ name: str,
189
+ body_params: dto.UpdatePackageRequest,
188
190
  ):
189
- u = "/%s/-/settings/set_visibility" % (registry, )
191
+ u = "/%s/-/packages/%s/%s/-/description" % (slug, t, name, )
190
192
 
191
- query_params = {
192
- "visibility": visibility,
193
- }
194
193
  data = self._client.request(
195
- method="POST",
194
+ method="PUT",
196
195
  endpoint=u,
197
- params=query_params,
196
+ json=body_params.to_dict(),
198
197
  )
199
198
  return
200
199
 
@@ -220,23 +220,6 @@ class RepositoriesService:
220
220
  )
221
221
  return [dto.Repos4UserBase.safe_parse(item) for item in data]
222
222
 
223
- # 改变仓库可见性。Update visibility of repository.
224
- def set_repo_visibility(self,
225
- repo: str,
226
- visibility: Optional[str] = None,
227
- ):
228
- u = "/%s/-/settings/set_visibility" % (repo, )
229
-
230
- query_params = {
231
- "visibility": visibility,
232
- }
233
- data = self._client.request(
234
- method="POST",
235
- endpoint=u,
236
- params=query_params,
237
- )
238
- return
239
-
240
223
  # 转移仓库。Transfer a repository.
241
224
  def transfer_repo(self,
242
225
  repo: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-cnb
3
- Version: 1.19.9
3
+ Version: 1.21.13
4
4
  Summary: CNB OpenAPI的Python SDK,方便与CNB平台进行交互
5
5
  Home-page: https://cnb.cool
6
6
  Author: Tencent Cloud
@@ -43,6 +43,7 @@ cnb/models/constant.py
43
43
  cnb/models/convert.py
44
44
  cnb/models/die.py
45
45
  cnb/models/dto.py
46
+ cnb/models/errors.py
46
47
  cnb/models/flags.py
47
48
  cnb/models/git_woa_com_cnb_monorepo_git_internal_app_git_service_bff_api.py
48
49
  cnb/models/git_woa_com_cnb_monorepo_git_internal_app_vcs_service_bff_api.py
@@ -7,7 +7,7 @@ long_description = (this_directory / "README.md").read_text(encoding="utf-8")
7
7
 
8
8
  setup(
9
9
  name="python-cnb",
10
- version="1.19.9",
10
+ version="1.21.13",
11
11
  author="Tencent Cloud",
12
12
  author_email="ericdduan@tencent.com",
13
13
  description="CNB OpenAPI的Python SDK,方便与CNB平台进行交互",
@@ -1,22 +0,0 @@
1
- # Code generated by cnb.cool/cnb/sdk/cnb-sdk-generator. DO NOT EDIT.
2
- # source: https://api.cnb-dev.woa.com/swagger.json
3
-
4
- from typing import Optional
5
- from .models import dto
6
- class ChargeService:
7
- def __init__(self, client):
8
- self._client = client
9
-
10
- # 查看特权额度
11
- def get_special_amount(self,
12
- slug: str,
13
- ) -> dto.SpecialAmount:
14
- u = "/%s/-/charge/special-amount" % (slug, )
15
-
16
- data = self._client.request(
17
- method="GET",
18
- endpoint=u,
19
- )
20
- return dto.SpecialAmount.safe_parse(data)
21
-
22
-
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
File without changes
File without changes
File without changes
File without changes
File without changes