dataops-sdk 0.5.4__tar.gz → 0.5.6__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 (100) hide show
  1. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/PKG-INFO +1 -1
  2. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/__init__.py +7 -1
  3. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/__init__.py +10 -2
  4. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/api.py +26 -1
  5. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/skill.py +38 -3
  6. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/__init__.py +22 -5
  7. dataops_sdk-0.5.6/src/dataops_sdk/services/api.py +116 -0
  8. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/data_table.py +4 -4
  9. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/dataset.py +2 -2
  10. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/meta.py +8 -3
  11. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/skill.py +179 -8
  12. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/table.py +27 -12
  13. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/widget.py +1 -1
  14. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/wiki.py +2 -3
  15. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/workflow.py +14 -4
  16. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/session.py +4 -4
  17. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/PKG-INFO +1 -1
  18. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_session.py +1 -1
  19. dataops_sdk-0.5.4/src/dataops_sdk/services/api.py +0 -44
  20. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/README.md +0 -0
  21. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/pyproject.toml +0 -0
  22. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/setup.cfg +0 -0
  23. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/constants.py +0 -0
  24. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/exceptions.py +0 -0
  25. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/__init__.py +0 -0
  26. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/datasource_factory.py +0 -0
  27. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -0
  28. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/config.py +0 -0
  29. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/constants.py +0 -0
  30. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/instance.py +0 -0
  31. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +0 -0
  32. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -0
  33. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -0
  34. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +0 -0
  35. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +0 -0
  36. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/service.py +0 -0
  37. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/__init__.py +0 -0
  38. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/common.py +0 -0
  39. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/dbConn_async.py +0 -0
  40. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/dbConn_base.py +0 -0
  41. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/dbConn_sync.py +0 -0
  42. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/duckdb_manager.py +0 -0
  43. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/file_transfer_base.py +0 -0
  44. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +0 -0
  45. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/nacos.py +0 -0
  46. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/neo4j_sync.py +0 -0
  47. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/queue_base.py +0 -0
  48. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/queue_kafka.py +0 -0
  49. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +0 -0
  50. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/websocket_client.py +0 -0
  51. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/common.py +0 -0
  52. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/data_table.py +0 -0
  53. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/datasource.py +0 -0
  54. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/dict_.py +0 -0
  55. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/enums.py +0 -0
  56. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/group.py +0 -0
  57. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/meta.py +0 -0
  58. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/ontology.py +0 -0
  59. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/query.py +0 -0
  60. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/report.py +0 -0
  61. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/table.py +0 -0
  62. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/tag.py +0 -0
  63. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/user.py +0 -0
  64. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/widget.py +0 -0
  65. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/wiki.py +0 -0
  66. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/workflow.py +0 -0
  67. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/auth.py +0 -0
  68. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/datasource.py +0 -0
  69. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/dict_.py +0 -0
  70. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/group.py +0 -0
  71. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/metrics.py +0 -0
  72. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/ontology.py +0 -0
  73. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/ref.py +0 -0
  74. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/report.py +0 -0
  75. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/services/tag.py +0 -0
  76. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/__init__.py +0 -0
  77. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/builder.py +0 -0
  78. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/constants.py +0 -0
  79. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/markdown_parser.py +0 -0
  80. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/models.py +0 -0
  81. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/parse_utils.py +0 -0
  82. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/render_utils.py +0 -0
  83. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/renderers.py +0 -0
  84. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/tool.py +0 -0
  85. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/__init__.py +0 -0
  86. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/common.py +0 -0
  87. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/log.py +0 -0
  88. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/utils.py +0 -0
  89. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/SOURCES.txt +0 -0
  90. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
  91. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/requires.txt +0 -0
  92. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/top_level.txt +0 -0
  93. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_api_key_headers.py +0 -0
  94. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_constants.py +0 -0
  95. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_datasource_factory.py +0 -0
  96. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_db_conn_async.py +0 -0
  97. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_db_conn_sync.py +0 -0
  98. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_exceptions.py +0 -0
  99. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_utils.py +0 -0
  100. {dataops_sdk-0.5.4 → dataops_sdk-0.5.6}/tests/test_websocket_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataops-sdk
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Summary: Python SDK for the DataOps platform.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -79,8 +79,14 @@ from .services import ( # noqa: F401
79
79
  service_ref_backward,
80
80
  service_ref_forward,
81
81
  service_set_application,
82
+ service_skill_bind_ontology,
82
83
  service_skill_call_by_code,
83
84
  service_skill_download,
85
+ service_skill_followup_add,
86
+ service_skill_followup_list,
87
+ service_skill_followup_remove,
88
+ service_skill_followup_set,
89
+ service_skill_get_bindings,
84
90
  service_skill_update,
85
91
  service_skill_upload,
86
92
  service_skill_upload_sub_file,
@@ -93,4 +99,4 @@ from .services import ( # noqa: F401
93
99
  )
94
100
  from .session import dataops_base_url_context, request_context
95
101
 
96
- __version__ = "0.5.4"
102
+ __version__ = "0.5.6"
@@ -4,7 +4,7 @@
4
4
  dataops_sdk.schemas import ...`` 使用。
5
5
  """
6
6
 
7
- from .api import ApiMeta, HttpInterfaceData
7
+ from .api import ApiCallResult, ApiMeta, HttpInterfaceData
8
8
  from .common import DataOpsResponse
9
9
  from .data_table import DataTableData, MetaDataTable
10
10
  from .datasource import DataDataSource
@@ -47,7 +47,15 @@ from .ontology import (
47
47
  )
48
48
  from .query import PageParam, SqlCondition, SqlFilter, SqlQueryParam, SqlSort
49
49
  from .report import ReportMeta, ReportMetaData
50
- from .skill import DataSkill, DataSkillSubFile, MetaSkill, SkillCallResult
50
+ from .skill import (
51
+ DataSkill,
52
+ DataSkillSubFile,
53
+ MetaSkill,
54
+ SkillCallResult,
55
+ SkillFollowupItem,
56
+ SkillFollowupRef,
57
+ SkillOntologyRef,
58
+ )
51
59
  from .table import (
52
60
  ColumnItem,
53
61
  DataBaseColumnDictExternal,
@@ -5,9 +5,10 @@
5
5
  """
6
6
 
7
7
  from collections.abc import Mapping
8
- from typing import Annotated
8
+ from typing import Annotated, Any
9
9
 
10
10
  from pydantic import BaseModel, Field, JsonValue
11
+ from pydantic_core import from_json
11
12
 
12
13
  from .meta import Meta
13
14
 
@@ -57,3 +58,27 @@ class ApiMeta(Meta[HttpInterfaceData]):
57
58
 
58
59
  标准 ``Meta`` 容器,``data`` 承载 ``HttpInterfaceData``。
59
60
  """
61
+
62
+
63
+ class ApiCallResult(BaseModel):
64
+ """平台代发 API 的调用结果.
65
+
66
+ 目标接口的 HTTP 状态在 ``statusCode`` 中,平台调用本身失败时抛 ``DataOpsError``。
67
+
68
+ Attributes:
69
+ statusCode: 目标接口 HTTP 状态码。
70
+ headers: 目标接口响应头,多值头为字符串列表。
71
+ mimeType: 响应 Content-Type 的 type/subtype。
72
+ body: 响应体原文。
73
+ envCode: 实际使用的 API 环境编码。
74
+ """
75
+
76
+ statusCode: Annotated[int, Field(description="目标接口 HTTP 状态码")]
77
+ headers: Annotated[Mapping[str, JsonValue] | None, Field(description="目标接口响应头")] = None
78
+ mimeType: Annotated[str | None, Field(description="响应 MIME 类型")] = None
79
+ body: Annotated[str | None, Field(description="响应体原文")] = None
80
+ envCode: Annotated[str | None, Field(description="实际使用的 API 环境编码")] = None
81
+
82
+ @property
83
+ def json(self) -> Any:
84
+ return from_json(self.body)
@@ -5,31 +5,66 @@
5
5
  """
6
6
 
7
7
  from collections.abc import Mapping
8
- from typing import Annotated, Any, Union
8
+ from typing import Annotated, Any, Literal, Union
9
9
 
10
- from pydantic import AliasChoices, BaseModel, Field, JsonValue
10
+ from pydantic import AliasChoices, BaseModel, ConfigDict, Field, JsonValue
11
11
 
12
12
  from dataops_sdk.schemas.meta import Meta
13
13
 
14
14
 
15
+ class SkillOntologyRef(BaseModel):
16
+ """技能归属本体,对齐前端 ``meta.data.ref``."""
17
+
18
+ type: Annotated[Literal["ontology"], Field(description="引用类型")] = "ontology"
19
+ code: Annotated[str, Field(description="本体 meta code")]
20
+
21
+
22
+ class SkillFollowupRef(BaseModel):
23
+ """后续动作目标引用."""
24
+
25
+ type: Annotated[Literal["skill", "workflow"], Field(description="目标类型")]
26
+ code: Annotated[str, Field(description="目标 meta code")]
27
+
28
+
29
+ class SkillFollowupItem(BaseModel):
30
+ """技能后续动作,对齐前端 ``meta.data.followup``."""
31
+
32
+ id: Annotated[str, Field(description="条目 ID")]
33
+ ref: Annotated[SkillFollowupRef, Field(description="目标引用")]
34
+ title: Annotated[str, Field(description="目标标题")]
35
+ description: Annotated[str | None, Field(description="推荐描述")] = None
36
+
37
+
15
38
  class DataSkill(BaseModel):
16
39
  """技能实体 rawData 私有字段.
17
40
 
18
41
  字段命名参考前端 ``SkillFile.vue`` 与后端 ``SkillService`` 的约定:
19
42
  - ``editor``: TipTap JSON 文档结构(用于编辑器渲染)
20
43
  - ``args``: 技能对外入参定义列表
44
+ - ``ref``: 归属本体
45
+ - ``followup``: 后续动作列表
21
46
 
22
47
  Attributes:
23
- markdown: SKILL.md Markdown 内容。
24
48
  editor: TipTap JSON 文档结构。
25
49
  args: 技能对外入参定义。
50
+ ref: 归属本体引用。
51
+ followup: 后续动作。
52
+ description: 技能描述。
26
53
  """
27
54
 
55
+ model_config = ConfigDict(extra="allow")
56
+
28
57
  editor: Annotated[Mapping[str, JsonValue], Field(description="TipTap JSON 文档结构")]
29
58
  args: Annotated[
30
59
  list[Mapping[str, JsonValue]] | None,
31
60
  Field(description="技能对外入参定义"),
32
61
  ] = None
62
+ ref: Annotated[SkillOntologyRef | None, Field(description="归属本体")] = None
63
+ followup: Annotated[
64
+ list[SkillFollowupItem] | None,
65
+ Field(description="后续动作"),
66
+ ] = None
67
+ description: Annotated[str | None, Field(description="技能描述")] = None
33
68
 
34
69
 
35
70
  class DataSkillSubFileDoc(BaseModel):
@@ -1,4 +1,8 @@
1
- from .api import service_get_api_by_code, service_get_api_by_name
1
+ from .api import (
2
+ service_call_api,
3
+ service_get_api_by_code,
4
+ service_get_api_by_name,
5
+ )
2
6
  from .auth import (
3
7
  service_get_current_application,
4
8
  service_list_applications,
@@ -94,18 +98,24 @@ from .skill import (
94
98
  service_list_skill_files,
95
99
  service_list_skills,
96
100
  service_pack_skill_zip,
101
+ service_skill_bind_ontology,
97
102
  service_skill_call_by_code,
98
103
  service_skill_call_by_name,
99
104
  service_skill_delete_sub_file,
100
105
  service_skill_download,
101
- service_skill_update,
106
+ service_skill_file,
107
+ service_skill_files,
108
+ service_skill_followup_add,
109
+ service_skill_followup_list,
110
+ service_skill_followup_remove,
111
+ service_skill_followup_set,
112
+ service_skill_get_bindings,
102
113
  service_skill_get_subfile_by_code,
103
114
  service_skill_get_subfile_by_name,
104
- service_skill_files,
105
- service_skill_file,
115
+ service_skill_list_skill_codes_by_ontology,
116
+ service_skill_update,
106
117
  service_skill_upload,
107
118
  service_skill_upload_sub_file,
108
- service_skill_list_skill_codes_by_ontology,
109
119
  )
110
120
  from .table import (
111
121
  service_count_table_by_code,
@@ -161,6 +171,7 @@ from .workflow import (
161
171
  )
162
172
 
163
173
  __all__ = [
174
+ "service_call_api",
164
175
  "service_get_api_by_code",
165
176
  "service_get_api_by_name",
166
177
  "service_get_current_application",
@@ -253,6 +264,12 @@ __all__ = [
253
264
  "service_skill_file",
254
265
  "service_skill_upload",
255
266
  "service_skill_upload_sub_file",
267
+ "service_skill_bind_ontology",
268
+ "service_skill_followup_add",
269
+ "service_skill_followup_list",
270
+ "service_skill_followup_remove",
271
+ "service_skill_followup_set",
272
+ "service_skill_get_bindings",
256
273
  "service_skill_list_skill_codes_by_ontology",
257
274
  "service_count_table_by_code",
258
275
  "service_count_table_by_name",
@@ -0,0 +1,116 @@
1
+ """API 接口服务模块.
2
+
3
+ 为 API 接口实体 (MetaType.API) 提供基于编码或名称的元数据查询封装,
4
+ 以及按平台配置代发 HTTP 请求。
5
+ 查询底层调用 ``release_list_get_by_code`` / ``release_list_get_by_name``,返回 ``HttpInterfaceData`` 模型.
6
+ 调用走 ``POST /data/api/call``,环境解析与参数合并在平台侧完成.
7
+ """
8
+
9
+ from collections.abc import Mapping
10
+ from typing import Any
11
+
12
+ from pydantic_core import to_json
13
+
14
+ from dataops_sdk.schemas import ApiCallResult, HttpInterfaceData, MetaType
15
+ from dataops_sdk.services.meta import release_list_get_by_code, release_list_get_by_name
16
+ from dataops_sdk.session import get_session, vaild_respone
17
+ from dataops_sdk.utils.utils import encrypt_body
18
+
19
+ __all__ = [
20
+ "service_call_api",
21
+ "service_get_api_by_code",
22
+ "service_get_api_by_name",
23
+ ]
24
+
25
+
26
+ def service_get_api_by_code(code: str):
27
+ """根据编码获取 API 接口详情.
28
+
29
+ Args:
30
+ code: API 接口编码
31
+
32
+ Returns:
33
+ ApiMeta 对象,包含 HttpInterfaceData 数据
34
+
35
+ Raises:
36
+ NotFoundError: 找不到对应 API 接口时.
37
+ DataOpsError: API 返回错误时.
38
+ AuthenticationError: 未认证或认证失败时.
39
+ """
40
+ return release_list_get_by_code(MetaType.API, code, _class=HttpInterfaceData)
41
+
42
+
43
+ def service_get_api_by_name(name: str):
44
+ """根据名称获取 API 接口详情.
45
+
46
+ Args:
47
+ name: API 接口名称
48
+
49
+ Returns:
50
+ ApiMeta 对象,包含 HttpInterfaceData 数据
51
+
52
+ Raises:
53
+ NotFoundError: 找不到对应 API 接口时.
54
+ DataOpsError: API 返回错误时.
55
+ AuthenticationError: 未认证或认证失败时.
56
+ """
57
+ return release_list_get_by_name(MetaType.API, name, _class=HttpInterfaceData)
58
+
59
+
60
+ def service_call_api(
61
+ code: str,
62
+ *,
63
+ query: Mapping[str, Any] | None = None,
64
+ path: Mapping[str, Any] | None = None,
65
+ headers: Mapping[str, str] | None = None,
66
+ body: str | Mapping[str, Any] | list[Any] | None = None,
67
+ timeout: float | None = None,
68
+ env_code: str | None = None,
69
+ ) -> ApiCallResult:
70
+ """按编码调用平台上配置的 API.
71
+
72
+ 未传 ``env_code`` 时,由平台按 ``fmind.core.envCode``、接口绑定的 ``env_code``、
73
+ ``fmind.core.defaultEnvCode`` 决定环境。``body`` 为 ``None`` 时不发送请求体。
74
+ query、path、header 只发送调用方传入的键,不读取接口定义里的默认值。
75
+
76
+ Args:
77
+ code: API 接口编码。
78
+ query: 查询参数。
79
+ path: 路径参数。
80
+ headers: 请求头。
81
+ body: 请求体。字符串原样发送,dict 或 list 会序列化为 JSON。
82
+ timeout: 目标请求超时时间,单位秒。未传时不写入请求体,由平台决定;HTTP 客户端此时也不设超时。
83
+ 传入正数时写入 ``payload["timeout"]``,且客户端等待时间比它多 1 秒。
84
+ env_code: API 环境编码,只能用关键字传入。未传时由平台解析。
85
+
86
+ Returns:
87
+ 目标接口的状态码、响应头、MIME、响应体,以及实际使用的环境编码。
88
+ 目标接口返回 4xx/5xx 时不抛异常,状态在 ``statusCode`` 中。
89
+
90
+ Raises:
91
+ NotFoundError: 找不到对应 API 接口时.
92
+ DataOpsError: 平台返回错误时.
93
+ AuthenticationError: 未认证或认证失败时.
94
+ """
95
+ payload: dict[str, Any] = {"code": code}
96
+ if query is not None:
97
+ payload["query"] = dict(query)
98
+ if path is not None:
99
+ payload["path"] = dict(path)
100
+ if headers is not None:
101
+ payload["headers"] = dict(headers)
102
+ if body is not None:
103
+ payload["body"] = body if isinstance(body, str) else to_json(body).decode("utf-8")
104
+ if env_code is not None:
105
+ payload["env_code"] = env_code
106
+ session_timeout: float | None = None
107
+ if timeout is not None:
108
+ if timeout <= 0:
109
+ raise ValueError("timeout must be positive")
110
+ payload["timeout"] = timeout
111
+ session_timeout = timeout + 1
112
+
113
+ with get_session(timeout=session_timeout) as session:
114
+ resp = session.post("/data/api/call", content=to_json(encrypt_body(payload)))
115
+ resp_body = vaild_respone(resp, check_data=True, _class=ApiCallResult)
116
+ return resp_body.data
@@ -130,7 +130,7 @@ def service_get_data_table_data_by_code(
130
130
 
131
131
  meta = meta or service_get_data_table_by_code(code)
132
132
 
133
- with get_session(timeout=15, sub_system=meta.subSystem) as session:
133
+ with get_session(sub_system=meta.subSystem) as session:
134
134
  resp = session.post(
135
135
  f"/data/table/list/{code}",
136
136
  content=to_json(
@@ -180,7 +180,7 @@ def service_get_data_table_data_ext_by_code(
180
180
  meta = meta or service_get_data_table_by_code(code)
181
181
  assert meta.data, "元数据为空 is None"
182
182
 
183
- with get_session(timeout=15, sub_system=meta.subSystem) as session:
183
+ with get_session(sub_system=meta.subSystem) as session:
184
184
  resp = session.post(
185
185
  url,
186
186
  content=to_json(
@@ -344,7 +344,7 @@ def service_get_data_table_total(
344
344
  body = {
345
345
  "queryParam": query_param,
346
346
  }
347
- with get_session(timeout=15, sub_system=meta.subSystem) as session:
347
+ with get_session(sub_system=meta.subSystem) as session:
348
348
  resp = session.post(
349
349
  f"/data/table/total/{code}", content=to_json(encrypt_body(dict(queryParam=query_param)))
350
350
  )
@@ -378,7 +378,7 @@ def service_get_data_table_reference_list(
378
378
  "pageParam": page_param or PageParam(),
379
379
  "queryParam": query_param or SqlQueryParam(),
380
380
  }
381
- with get_session(timeout=15, sub_system=meta.subSystem) as session:
381
+ with get_session(sub_system=meta.subSystem) as session:
382
382
  resp = session.post(
383
383
  f"/data/table/referenceList/{code}/{subcode}", content=to_json(encrypt_body(body))
384
384
  )
@@ -89,7 +89,7 @@ def service_count_dataset_by_code(
89
89
  "queryParam": query_param,
90
90
  }
91
91
 
92
- with get_session(timeout=15) as session:
92
+ with get_session() as session:
93
93
  response = session.post(
94
94
  "/data/dataset/countData",
95
95
  content=to_json(encrypt_body(body)),
@@ -144,7 +144,7 @@ def service_get_dataset_data_by_code(
144
144
  }
145
145
 
146
146
  # 复用统一会话发送请求,encrypt_body 负责按项目约定包装请求体。
147
- with get_session(timeout=15) as session:
147
+ with get_session() as session:
148
148
  response = session.post(
149
149
  "/data/dataset/findData",
150
150
  content=to_json(encrypt_body(body)),
@@ -8,6 +8,9 @@ CLI 命令请使用 meta_cli 模块。
8
8
  from collections.abc import Mapping, Sequence
9
9
  from typing import cast
10
10
 
11
+ from pydantic import BaseModel, JsonValue
12
+ from pydantic_core import to_json
13
+
11
14
  from dataops_sdk.exceptions import (
12
15
  AuthenticationError,
13
16
  DataOpsError,
@@ -29,8 +32,6 @@ from dataops_sdk.schemas import (
29
32
  )
30
33
  from dataops_sdk.session import get_session, vaild_respone
31
34
  from dataops_sdk.utils import encrypt_body
32
- from pydantic import JsonValue
33
- from pydantic_core import to_json
34
35
 
35
36
 
36
37
  def release_list_list_by_parent_id(
@@ -431,6 +432,7 @@ def release_list_update(
431
432
  *,
432
433
  datasource: str | None = None,
433
434
  _class: type[META_DATA_TYPE] = DEFAULT_META_DATA_TYPE,
435
+ exclude_none_data: bool = False,
434
436
  ) -> Meta[META_DATA_TYPE]:
435
437
  """更新 Meta 对象.
436
438
 
@@ -450,7 +452,10 @@ def release_list_update(
450
452
  """
451
453
  meta_payload = meta.model_dump(mode="json", exclude={"data"})
452
454
  if meta.data is not None:
453
- meta_payload["rawData"] = to_json(meta.data).decode()
455
+ payload = meta.data
456
+ if exclude_none_data and isinstance(payload, BaseModel):
457
+ payload = payload.model_dump(mode="json", exclude_none=True)
458
+ meta_payload["rawData"] = to_json(payload).decode()
454
459
  body = {"meta": meta_payload, "params": []}
455
460
 
456
461
  try: