dataops-sdk 0.5.5__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.
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/PKG-INFO +1 -1
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/__init__.py +7 -1
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/__init__.py +10 -2
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/api.py +26 -1
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/skill.py +38 -3
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/__init__.py +22 -5
- dataops_sdk-0.5.6/src/dataops_sdk/services/api.py +116 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/data_table.py +4 -4
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/dataset.py +2 -2
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/meta.py +8 -3
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/skill.py +178 -7
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/table.py +27 -12
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/widget.py +1 -1
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/wiki.py +2 -3
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/workflow.py +14 -4
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/session.py +4 -4
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/PKG-INFO +1 -1
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_session.py +1 -1
- dataops_sdk-0.5.5/src/dataops_sdk/services/api.py +0 -46
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/README.md +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/pyproject.toml +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/setup.cfg +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/constants.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/exceptions.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/__init__.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/datasource_factory.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/config.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/constants.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/instance.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/schemas/nacos/service.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/__init__.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/common.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/dbConn_async.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/dbConn_base.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/dbConn_sync.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/duckdb_manager.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/file_transfer_base.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/nacos.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/neo4j_sync.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/queue_base.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/queue_kafka.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/runner/utils/websocket_client.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/common.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/data_table.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/datasource.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/dict_.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/enums.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/group.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/meta.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/ontology.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/query.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/report.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/table.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/tag.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/user.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/widget.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/wiki.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/schemas/workflow.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/auth.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/datasource.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/dict_.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/group.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/metrics.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/ontology.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/ref.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/report.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/services/tag.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/__init__.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/builder.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/constants.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/markdown_parser.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/models.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/parse_utils.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/render_utils.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/renderers.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/tiptap/tool.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/__init__.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/common.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/log.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk/utils/utils.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/SOURCES.txt +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/requires.txt +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/src/dataops_sdk.egg-info/top_level.txt +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_api_key_headers.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_constants.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_datasource_factory.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_db_conn_async.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_db_conn_sync.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_exceptions.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_utils.py +0 -0
- {dataops_sdk-0.5.5 → dataops_sdk-0.5.6}/tests/test_websocket_client.py +0 -0
|
@@ -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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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:
|