dataops-sdk 0.3.5__tar.gz → 0.4.0__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 (92) hide show
  1. dataops_sdk-0.4.0/PKG-INFO +113 -0
  2. dataops_sdk-0.4.0/README.md +85 -0
  3. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/pyproject.toml +1 -0
  4. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/__init__.py +1 -3
  5. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/__init__.py +9 -1
  6. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/__init__.py +11 -2
  7. dataops_sdk-0.4.0/src/dataops_sdk/schemas/common.py +11 -0
  8. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/data_table.py +4 -2
  9. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/enums.py +52 -13
  10. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/meta.py +12 -1
  11. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/query.py +39 -33
  12. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/skill.py +1 -24
  13. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/table.py +49 -5
  14. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/widget.py +242 -160
  15. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/__init__.py +6 -7
  16. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/auth.py +1 -1
  17. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/data_table.py +120 -168
  18. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/dict_.py +2 -4
  19. dataops_sdk-0.4.0/src/dataops_sdk/services/meta.py +484 -0
  20. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/skill.py +17 -9
  21. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/table.py +168 -213
  22. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/widget.py +32 -10
  23. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/session.py +72 -7
  24. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/utils/utils.py +2 -2
  25. dataops_sdk-0.4.0/src/dataops_sdk.egg-info/PKG-INFO +113 -0
  26. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk.egg-info/SOURCES.txt +2 -0
  27. dataops_sdk-0.3.5/PKG-INFO +0 -26
  28. dataops_sdk-0.3.5/src/dataops_sdk/services/meta.py +0 -618
  29. dataops_sdk-0.3.5/src/dataops_sdk.egg-info/PKG-INFO +0 -26
  30. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/setup.cfg +0 -0
  31. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/constants.py +0 -0
  32. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/exceptions.py +0 -0
  33. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/__init__.py +0 -0
  34. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/datasource_factory.py +0 -0
  35. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -0
  36. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/config.py +0 -0
  37. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/constants.py +0 -0
  38. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/instance.py +0 -0
  39. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +0 -0
  40. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -0
  41. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -0
  42. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +0 -0
  43. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +0 -0
  44. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/schemas/nacos/service.py +0 -0
  45. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/common.py +0 -0
  46. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/dbConn_base.py +0 -0
  47. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/dbConn_sync.py +0 -0
  48. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/duckdb_manager.py +0 -0
  49. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/file_transfer_base.py +0 -0
  50. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +0 -0
  51. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/nacos.py +0 -0
  52. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/neo4j_sync.py +0 -0
  53. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/queue_base.py +0 -0
  54. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/queue_kafka.py +0 -0
  55. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +0 -0
  56. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/alarm.py +0 -0
  57. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/api.py +0 -0
  58. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/datasource.py +0 -0
  59. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/dict_.py +0 -0
  60. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/group.py +0 -0
  61. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/hazard.py +0 -0
  62. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/report.py +0 -0
  63. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/user.py +0 -0
  64. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/schemas/workflow.py +0 -0
  65. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/alarm.py +0 -0
  66. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/api.py +0 -0
  67. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/dataset.py +0 -0
  68. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/datasource.py +0 -0
  69. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/hazard.py +0 -0
  70. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/metrics.py +0 -0
  71. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/ref.py +0 -0
  72. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/report.py +0 -0
  73. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/services/workflow.py +0 -0
  74. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/__init__.py +0 -0
  75. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/builder.py +0 -0
  76. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/constants.py +0 -0
  77. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/markdown_parser.py +0 -0
  78. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/models.py +0 -0
  79. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/parse_utils.py +0 -0
  80. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/render_utils.py +0 -0
  81. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/renderers.py +0 -0
  82. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/tiptap/tool.py +0 -0
  83. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/utils/__init__.py +0 -0
  84. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/utils/common.py +0 -0
  85. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk/utils/log.py +0 -0
  86. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
  87. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk.egg-info/requires.txt +0 -0
  88. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/src/dataops_sdk.egg-info/top_level.txt +0 -0
  89. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/tests/test_constants.py +0 -0
  90. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/tests/test_exceptions.py +0 -0
  91. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/tests/test_session.py +0 -0
  92. {dataops_sdk-0.3.5 → dataops_sdk-0.4.0}/tests/test_utils.py +0 -0
@@ -0,0 +1,113 @@
1
+ Metadata-Version: 2.4
2
+ Name: dataops-sdk
3
+ Version: 0.4.0
4
+ Summary: Python SDK for the DataOps platform.
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: pydantic<3,>=2
8
+ Requires-Dist: pydantic-core
9
+ Requires-Dist: pydantic-settings>=2.14.2
10
+ Requires-Dist: httpx2>=2.5.0
11
+ Requires-Dist: jinja2>=3.1.6
12
+ Requires-Dist: markdown-it-py[plugins]
13
+ Requires-Dist: cryptography>=49.0.0
14
+ Requires-Dist: PyYaml
15
+ Provides-Extra: runner
16
+ Requires-Dist: paramiko>4; extra == "runner"
17
+ Requires-Dist: pandas; extra == "runner"
18
+ Requires-Dist: sqlalchemy; extra == "runner"
19
+ Requires-Dist: pymysql; extra == "runner"
20
+ Requires-Dist: doris-python>=1.0.3; extra == "runner"
21
+ Requires-Dist: oracledb~=4.0.1; extra == "runner"
22
+ Requires-Dist: neo4j; extra == "runner"
23
+ Requires-Dist: kafka-python>3; extra == "runner"
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest; extra == "dev"
26
+ Requires-Dist: pytest-mock; extra == "dev"
27
+ Requires-Dist: ruff; extra == "dev"
28
+
29
+ # dataops-sdk
30
+
31
+ Python SDK for the DataOps platform.
32
+
33
+ ## 安装
34
+
35
+ ```bash
36
+ # 基础安装
37
+ pip install dataops_sdk
38
+
39
+ # 含数据库驱动
40
+ pip install "dataops_sdk[runner]"
41
+ ```
42
+
43
+ ## 快速开始
44
+
45
+ ```python
46
+ from dataops_sdk.session import configure
47
+ from dataops_sdk.services import service_list_tables, service_get_table_data_by_code
48
+
49
+ # 配置认证
50
+ configure(base_url="https://your-platform.com", api_key="your-api-key")
51
+
52
+ # 查询数据表
53
+ tables = service_list_tables("doris")
54
+ print(tables)
55
+ ```
56
+
57
+ ## 核心模块
58
+
59
+ ### session — 认证配置
60
+
61
+ ```python
62
+ from dataops_sdk.session import configure, get_session
63
+
64
+ configure(base_url, api_key) # 设置全局会话
65
+ ```
66
+
67
+ ### schemas — 数据模型
68
+
69
+ | 模块 | 说明 |
70
+ |------|------|
71
+ | `MetaType` | 元数据类型枚举 |
72
+ | `SqlQueryParam` | SQL 查询参数 |
73
+ | `Meta` | 元数据通用模型 |
74
+ | `Datasource` | 数据源模型 |
75
+ | `DataTable` | 数据表模型 |
76
+ | `Dataset` | 数据集模型 |
77
+ | `Metrics` | 指标模型 |
78
+ | `Report` | 报表模型 |
79
+ | `Widget` | 组件模型 |
80
+ | `Workflow` | 工作流模型 |
81
+ | `Alarm` | 告警模型 |
82
+ | `Hazard` | 隐患模型 |
83
+ | `Api` | API 模型 |
84
+ | `Dict` | 字典模型 |
85
+ | `Skill` | 技能模型 |
86
+ | `Ref` | 引用模型 |
87
+
88
+ ### services — 平台操作
89
+
90
+ 每个服务模块对应一类实体的操作,提供 `list`、`detail` 等通用接口:
91
+
92
+ - `service_*_list` — 列表查询
93
+ - `service_*_detail` — 详情查询
94
+ - `service_*_create` — 创建
95
+ - `service_*_update` — 更新
96
+ - `service_*_delete` — 删除
97
+
98
+ ## 依赖
99
+
100
+ - Python >= 3.11
101
+ - pydantic >= 2
102
+ - httpx2 >= 2.5.0
103
+ - pydantic-settings >= 2.14.2
104
+ - jinja2 >= 3.1.6
105
+ - cryptography >= 49.0.0
106
+
107
+ ## 可选依赖 (runner)
108
+
109
+ - paramiko > 4 — 文件传输
110
+ - pandas — 数据分析
111
+ - sqlalchemy / pymysql / doris-python / oracledb — 关系数据库
112
+ - neo4j — 图数据库
113
+ - kafka-python > 3 — 队列驱动
@@ -0,0 +1,85 @@
1
+ # dataops-sdk
2
+
3
+ Python SDK for the DataOps platform.
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ # 基础安装
9
+ pip install dataops_sdk
10
+
11
+ # 含数据库驱动
12
+ pip install "dataops_sdk[runner]"
13
+ ```
14
+
15
+ ## 快速开始
16
+
17
+ ```python
18
+ from dataops_sdk.session import configure
19
+ from dataops_sdk.services import service_list_tables, service_get_table_data_by_code
20
+
21
+ # 配置认证
22
+ configure(base_url="https://your-platform.com", api_key="your-api-key")
23
+
24
+ # 查询数据表
25
+ tables = service_list_tables("doris")
26
+ print(tables)
27
+ ```
28
+
29
+ ## 核心模块
30
+
31
+ ### session — 认证配置
32
+
33
+ ```python
34
+ from dataops_sdk.session import configure, get_session
35
+
36
+ configure(base_url, api_key) # 设置全局会话
37
+ ```
38
+
39
+ ### schemas — 数据模型
40
+
41
+ | 模块 | 说明 |
42
+ |------|------|
43
+ | `MetaType` | 元数据类型枚举 |
44
+ | `SqlQueryParam` | SQL 查询参数 |
45
+ | `Meta` | 元数据通用模型 |
46
+ | `Datasource` | 数据源模型 |
47
+ | `DataTable` | 数据表模型 |
48
+ | `Dataset` | 数据集模型 |
49
+ | `Metrics` | 指标模型 |
50
+ | `Report` | 报表模型 |
51
+ | `Widget` | 组件模型 |
52
+ | `Workflow` | 工作流模型 |
53
+ | `Alarm` | 告警模型 |
54
+ | `Hazard` | 隐患模型 |
55
+ | `Api` | API 模型 |
56
+ | `Dict` | 字典模型 |
57
+ | `Skill` | 技能模型 |
58
+ | `Ref` | 引用模型 |
59
+
60
+ ### services — 平台操作
61
+
62
+ 每个服务模块对应一类实体的操作,提供 `list`、`detail` 等通用接口:
63
+
64
+ - `service_*_list` — 列表查询
65
+ - `service_*_detail` — 详情查询
66
+ - `service_*_create` — 创建
67
+ - `service_*_update` — 更新
68
+ - `service_*_delete` — 删除
69
+
70
+ ## 依赖
71
+
72
+ - Python >= 3.11
73
+ - pydantic >= 2
74
+ - httpx2 >= 2.5.0
75
+ - pydantic-settings >= 2.14.2
76
+ - jinja2 >= 3.1.6
77
+ - cryptography >= 49.0.0
78
+
79
+ ## 可选依赖 (runner)
80
+
81
+ - paramiko > 4 — 文件传输
82
+ - pandas — 数据分析
83
+ - sqlalchemy / pymysql / doris-python / oracledb — 关系数据库
84
+ - neo4j — 图数据库
85
+ - kafka-python > 3 — 队列驱动
@@ -7,6 +7,7 @@ name = "dataops-sdk"
7
7
  dynamic = ["version"]
8
8
  description = "Python SDK for the DataOps platform."
9
9
  requires-python = ">=3.11"
10
+ readme = "README.md"
10
11
  dependencies = [
11
12
  "pydantic>=2,<3",
12
13
  "pydantic-core",
@@ -67,9 +67,7 @@ from .services import ( # noqa: F401
67
67
  service_get_table_detail_by_code,
68
68
  service_get_table_detail_by_name,
69
69
  service_get_table_list_by_code,
70
- service_get_table_record_by_id,
71
70
  service_get_table_records_by_code,
72
- service_get_table_reference_list,
73
71
  service_get_table_total_by_code,
74
72
  service_get_widget_data_by_code,
75
73
  service_get_widget_detail_by_code,
@@ -109,4 +107,4 @@ from .services import ( # noqa: F401
109
107
  )
110
108
  from .session import dataops_base_url_context, request_context
111
109
 
112
- __version__ = "0.3.5"
110
+ __version__ = "0.4.0"
@@ -19,7 +19,14 @@ Example:
19
19
  >>> from dataops_sdk.runner.utils import DatabaseConn, encrypt_body
20
20
  """
21
21
 
22
- from .common import decrypt_body, encrypt_body, generate_uuid, parse_args, print_json
22
+ from .common import (
23
+ decrypt_body,
24
+ encrypt_body,
25
+ generate_uuid,
26
+ parse_args,
27
+ parse_trigger_time,
28
+ print_json,
29
+ )
23
30
  from .dbConn_sync import DatabaseConn
24
31
  from .ftp_file_transfer import FTPFileTransfer
25
32
  from .nacos import get_service_instance
@@ -39,4 +46,5 @@ __all__ = [
39
46
  "FTPFileTransfer",
40
47
  "SFTPFileTransfer",
41
48
  "parse_args",
49
+ "parse_trigger_time",
42
50
  ]
@@ -14,10 +14,18 @@ from .alarm import (
14
14
  AlarmSpecItem,
15
15
  )
16
16
  from .api import ApiMeta, HttpInterfaceData
17
+ from .common import DataOpsResponse
17
18
  from .data_table import DataTableData, MetaDataTable
18
19
  from .datasource import DataDataSource
19
20
  from .dict_ import DataDict, DictItem
20
- from .enums import InnerMetaType, MetaType
21
+ from .enums import (
22
+ InnerMetaType,
23
+ MetaSkillFileSubType,
24
+ MetaSkillSubType,
25
+ MetaTemplateSubType,
26
+ MetaType,
27
+ MetaWidgetSubType,
28
+ )
21
29
  from .group import GroupNode
22
30
  from .hazard import HazardRecordDTO, HazardTaskDTO
23
31
  from .meta import (
@@ -26,10 +34,11 @@ from .meta import (
26
34
  Meta,
27
35
  MetaBase,
28
36
  MetaCreate,
37
+ MetaPageData,
29
38
  MetaRef,
30
39
  MetaUpdate,
31
40
  )
32
- from .query import PageParam, SqlCondition, SqlQueryParam, SqlSort
41
+ from .query import PageParam, SqlCondition, SqlFilter, SqlQueryParam, SqlSort
33
42
  from .report import ReportMeta, ReportMetaData
34
43
  from .skill import DataSkill, DataSkillSubFile, MetaSkill, SkillCallResult
35
44
  from .table import (
@@ -0,0 +1,11 @@
1
+ from typing import Annotated, Generic, TypeVar
2
+
3
+ from pydantic import BaseModel, Field, JsonValue, NonNegativeInt
4
+
5
+ DataVar = TypeVar("DataVar", default=JsonValue | None)
6
+
7
+
8
+ class DataOpsResponse(BaseModel, Generic[DataVar]):
9
+ code: Annotated[NonNegativeInt, Field(description="响应码")]
10
+ msg: Annotated[str | None, Field(description="响应消息")]
11
+ data: Annotated[DataVar, Field(description="响应数据")]
@@ -410,7 +410,7 @@ class DataTableField(BaseModel):
410
410
 
411
411
  title: Annotated[str | None, Field(description="显示标题")]
412
412
  name: Annotated[str, Field(description="字段名称/列名 (前端显示的名称)")]
413
- type: Annotated[str, Field(description="字段类型")]
413
+ type: Annotated[str | None, Field(description="字段类型")] = None
414
414
 
415
415
  # 数据属性
416
416
  pk: Annotated[bool, Field(description="是否主键")] = False
@@ -608,7 +608,7 @@ class DataTableData(BaseModel):
608
608
  """
609
609
 
610
610
  # 模型配置
611
- model: Annotated[DataTableModel, Field(description="数据源模型配置")]
611
+ model: Annotated[DataTableModel | None, Field(description="数据源模型配置")] = None
612
612
 
613
613
  # 字段定义
614
614
  fields: Annotated[list[DataTableField], Field(description="字段列表", default_factory=list)] = (
@@ -641,6 +641,8 @@ class DataTableData(BaseModel):
641
641
  querys: Annotated[list[QueryCondition] | None, Field(description="查询条件列表")] = None
642
642
  query_form: Annotated[QueryForm | None, Field(description="查询表单配置")] = None
643
643
 
644
+ model_config = ConfigDict(extra="allow")
645
+
644
646
 
645
647
  # ---------------------------------------------------------------------------
646
648
  # MetaDataTable
@@ -76,17 +76,17 @@ class SqlExpression(StrEnum):
76
76
  用于查询条件构造,对应后端 ``SqlExpression``。
77
77
  """
78
78
 
79
- EQ = "="
79
+ EQ = "eq"
80
80
  """相等 (=)。"""
81
- NE = "!="
81
+ NE = "ne"
82
82
  """不相等 (!=)。"""
83
- GT = ">"
83
+ GT = "gt"
84
84
  """大于 (>)。"""
85
- GE = ">="
85
+ GE = "ge"
86
86
  """大于等于 (>=)。"""
87
- LT = "<"
87
+ LT = "lt"
88
88
  """小于 (<)。"""
89
- LE = "<="
89
+ LE = "le"
90
90
  """小于等于 (<=)。"""
91
91
  IN = "in"
92
92
  """属于 (IN)。"""
@@ -116,16 +116,16 @@ class SqlExpression(StrEnum):
116
116
  Returns:
117
117
  str: 中文标题,例如 ``"相等"``、``"属于"`` 等。
118
118
  """
119
- return _EXPRESSION_TITLES[self]
119
+ return _EXPRESSION_TITLES[self.value]
120
120
 
121
121
 
122
122
  _EXPRESSION_TITLES: dict[str, str] = {
123
- "=": "相等",
124
- "!=": "不相等",
125
- ">": "大于",
126
- ">=": "大于等于",
127
- "<": "小于",
128
- "<=": "小于等于",
123
+ "eq": "相等",
124
+ "ne": "不相等",
125
+ "gt": "大于",
126
+ "ge": "大于等于",
127
+ "lt": "小于",
128
+ "le": "小于等于",
129
129
  "in": "属于",
130
130
  "notin": "不属于",
131
131
  "like": "匹配",
@@ -209,3 +209,42 @@ class ColumnType(StrEnum):
209
209
  """子表类型。"""
210
210
  STRING = "string"
211
211
  """字符串类型。"""
212
+
213
+
214
+ class MetaWidgetSubType(StrEnum):
215
+ """卡片子类型枚举."""
216
+
217
+ CHART = "chart"
218
+ TABLE = "table"
219
+ DETAIL = "detail"
220
+ STATISTIC = "statistic"
221
+ STATISTIC_V2 = "statistic-v2"
222
+ GIS = "gis"
223
+ METRIC = "metric"
224
+ TOPOLOGY = "topology"
225
+ AMIS = "amis"
226
+
227
+
228
+ class MetaTemplateSubType(StrEnum):
229
+ """模板子类型枚举."""
230
+
231
+ REPORT = "report"
232
+ PYTHON = "python"
233
+ JAVASCRIPT = "javascript"
234
+
235
+
236
+ class MetaSkillSubType(StrEnum):
237
+ """技能子类型枚举."""
238
+
239
+ LLM = "llm"
240
+ API = "api"
241
+ REPORT = "report"
242
+ FORM_SAVE = "form-save"
243
+
244
+
245
+ class MetaSkillFileSubType(StrEnum):
246
+ """技能子文件类型枚举."""
247
+
248
+ DOC = "doc"
249
+ CODE = "code"
250
+ IMAGE = "image"
@@ -129,7 +129,7 @@ class MetaBase(BaseModel):
129
129
  str | None,
130
130
  Field(
131
131
  description="空间名称",
132
- validate_alias=AliasChoices("spaceName", "space_name", "SPACE_NAME"),
132
+ validation_alias=AliasChoices("spaceName", "space_name", "SPACE_NAME"),
133
133
  ),
134
134
  ] = None
135
135
 
@@ -339,3 +339,14 @@ class MetaUpdate(BaseModel, Generic[META_DATA_TYPE]):
339
339
  data: Annotated[
340
340
  META_DATA_TYPE | None, Field(description="元数据", exclude_if=lambda x: x is None)
341
341
  ] = None
342
+
343
+
344
+ class MetaPageData(BaseModel):
345
+ total: Annotated[int, Field(description="总数")]
346
+ page_num: Annotated[
347
+ int, Field(description="页码", validation_alias=AliasChoices("pageNum", "page_num"))
348
+ ]
349
+ page_size: Annotated[
350
+ int, Field(description="页大小", validation_alias=AliasChoices("pageSize", "page_size"))
351
+ ]
352
+ records: list[MetaBase] = Field(default_factory=list, description="数据")
@@ -3,6 +3,7 @@
3
3
  承载分页参数、SQL 条件、排序、过滤等查询相关模型,供 SDK services 层拼装 SQL 查询时复用。
4
4
  """
5
5
 
6
+ from collections.abc import Sequence
6
7
  from typing import Annotated, Any, Literal
7
8
 
8
9
  from pydantic import BaseModel, Field, JsonValue
@@ -32,6 +33,7 @@ class SqlConditionBase(BaseModel):
32
33
 
33
34
  name: Annotated[str, Field(description="字段名")]
34
35
  value: Annotated[Any, Field(description="字段值")]
36
+ expression: Annotated[SqlExpression, Field(description="条件表达式")] = SqlExpression.EQ
35
37
 
36
38
 
37
39
  class SqlCondition(SqlConditionBase):
@@ -45,7 +47,6 @@ class SqlCondition(SqlConditionBase):
45
47
  """
46
48
 
47
49
  alias: Annotated[str | None, Field(description="表别名")] = None
48
- expression: Annotated[SqlExpression, Field(description="条件表达式")]
49
50
 
50
51
 
51
52
  class SqlSort(BaseModel):
@@ -59,20 +60,33 @@ class SqlSort(BaseModel):
59
60
 
60
61
  alias: Annotated[str | None, Field(description="表别名")] = None
61
62
  name: Annotated[str, Field(description="字段名")]
62
- asc: Annotated[bool, Field(description="是否ASE")] = True
63
+ asc: Annotated[bool, Field(description="是否升序")] = True
63
64
 
64
65
 
65
- class SqlFilter(BaseModel):
66
- """单条件过滤器,封装一个 ``SqlConditionBase``.
66
+ class SqlFilter(SqlConditionBase):
67
+ """条件过滤器"""
67
68
 
68
- 提供 ``eq``/``ne``/``gt``/``ge``/``lt``/``le``/``in_``/``not_in``/``like``/``not_like``
69
- 等便捷工厂方法构造等值或不等值过滤。
69
+ @classmethod
70
+ def from_str(cls, value: str) -> "SqlFilter":
71
+ """解析查询参数.
70
72
 
71
- Attributes:
72
- condition: 基础条件。
73
- """
73
+ Returns:
74
+ SqlFilter: 解析后的查询参数。
75
+ """
76
+ return cls.model_validate_json(value)
77
+
78
+ def to_condition(self, alias: str | None = None) -> SqlCondition:
79
+ """将过滤器转换为条件.
74
80
 
75
- condition: Annotated[SqlConditionBase, Field(description="条件")]
81
+ Args:
82
+ alias: 可选表别名。
83
+
84
+ Returns:
85
+ SqlCondition: 转换后的条件。
86
+ """
87
+ return SqlCondition(
88
+ alias=alias, name=self.name, value=self.value, expression=self.expression
89
+ )
76
90
 
77
91
  @classmethod
78
92
  def eq(cls, name: str, value: Any):
@@ -85,7 +99,7 @@ class SqlFilter(BaseModel):
85
99
  Returns:
86
100
  SqlFilter: 对应的过滤器实例。
87
101
  """
88
- return cls(condition=SqlConditionBase(name=name, value=value))
102
+ return cls(name=name, value=value, expression=SqlExpression.EQ)
89
103
 
90
104
  @classmethod
91
105
  def ne(cls, name: str, value: Any):
@@ -98,7 +112,7 @@ class SqlFilter(BaseModel):
98
112
  Returns:
99
113
  SqlFilter: 对应的过滤器实例。
100
114
  """
101
- return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NE))
115
+ return cls(name=name, value=value, expression=SqlExpression.NE)
102
116
 
103
117
  @classmethod
104
118
  def gt(cls, name: str, value: Any):
@@ -111,7 +125,7 @@ class SqlFilter(BaseModel):
111
125
  Returns:
112
126
  SqlFilter: 对应的过滤器实例。
113
127
  """
114
- return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.GT))
128
+ return cls(name=name, value=value, expression=SqlExpression.GT)
115
129
 
116
130
  @classmethod
117
131
  def ge(cls, name: str, value: Any):
@@ -124,7 +138,7 @@ class SqlFilter(BaseModel):
124
138
  Returns:
125
139
  SqlFilter: 对应的过滤器实例。
126
140
  """
127
- return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.GE))
141
+ return cls(name=name, value=value, expression=SqlExpression.GE)
128
142
 
129
143
  @classmethod
130
144
  def lt(cls, name: str, value: Any):
@@ -137,7 +151,7 @@ class SqlFilter(BaseModel):
137
151
  Returns:
138
152
  SqlFilter: 对应的过滤器实例。
139
153
  """
140
- return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LT))
154
+ return cls(name=name, value=value, expression=SqlExpression.LT)
141
155
 
142
156
  @classmethod
143
157
  def le(cls, name: str, value: Any):
@@ -150,7 +164,7 @@ class SqlFilter(BaseModel):
150
164
  Returns:
151
165
  SqlFilter: 对应的过滤器实例。
152
166
  """
153
- return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LE))
167
+ return cls(name=name, value=value, expression=SqlExpression.LE)
154
168
 
155
169
  @classmethod
156
170
  def in_(cls, name: str, value: list):
@@ -163,7 +177,7 @@ class SqlFilter(BaseModel):
163
177
  Returns:
164
178
  SqlFilter: 对应的过滤器实例。
165
179
  """
166
- return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.IN))
180
+ return cls(name=name, value=value, expression=SqlExpression.IN)
167
181
 
168
182
  @classmethod
169
183
  def not_in(cls, name: str, value: list):
@@ -176,9 +190,7 @@ class SqlFilter(BaseModel):
176
190
  Returns:
177
191
  SqlFilter: 对应的过滤器实例。
178
192
  """
179
- return cls(
180
- condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NOT_IN)
181
- )
193
+ return cls(name=name, value=value, expression=SqlExpression.NOT_IN)
182
194
 
183
195
  @classmethod
184
196
  def like(cls, name: str, value: str):
@@ -191,9 +203,7 @@ class SqlFilter(BaseModel):
191
203
  Returns:
192
204
  SqlFilter: 对应的过滤器实例。
193
205
  """
194
- return cls(
195
- condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LIKE)
196
- )
206
+ return cls(name=name, value=value, expression=SqlExpression.LIKE)
197
207
 
198
208
  @classmethod
199
209
  def not_like(cls, name: str, value: str):
@@ -206,9 +216,7 @@ class SqlFilter(BaseModel):
206
216
  Returns:
207
217
  SqlFilter: 对应的过滤器实例。
208
218
  """
209
- return cls(
210
- condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NOT_LIKE)
211
- )
219
+ return cls(name=name, value=value, expression=SqlExpression.NOT_LIKE)
212
220
 
213
221
 
214
222
  class SqlQueryParam(BaseModel):
@@ -222,11 +230,9 @@ class SqlQueryParam(BaseModel):
222
230
  """
223
231
 
224
232
  conjunction: Annotated[Literal["and", "or"], Field(description="条件连接符")] = "and"
225
- conditionList: Annotated[
226
- list[SqlCondition], Field(description="条件列表", default_factory=list)
227
- ]
228
- sorts: Annotated[list[SqlSort], Field(description="排序列表", default_factory=list)]
229
- varMap: Annotated[dict[str, JsonValue], Field(description="变量映射", default_factory=dict)]
233
+ conditionList: list[SqlCondition] = Field(description="条件列表", default_factory=list)
234
+ sorts: list[SqlSort] = Field(description="排序列表", default_factory=list)
235
+ varMap: dict[str, JsonValue] = Field(description="变量映射", default_factory=dict)
230
236
 
231
237
  def add(self, *condition: SqlCondition):
232
238
  """追加条件.
@@ -336,7 +342,7 @@ class SqlQueryParam(BaseModel):
336
342
  )
337
343
  return self
338
344
 
339
- def add_in(self, name: str, value: list, alias: str | None = None):
345
+ def add_in(self, name: str, value: Sequence[Any], alias: str | None = None):
340
346
  """追加 ``in`` 属于条件.
341
347
 
342
348
  Args:
@@ -352,7 +358,7 @@ class SqlQueryParam(BaseModel):
352
358
  )
353
359
  return self
354
360
 
355
- def add_not_in(self, name: str, value: list, alias: str | None = None):
361
+ def add_not_in(self, name: str, value: Sequence[Any], alias: str | None = None):
356
362
  """追加 ``not in`` 不属于条件.
357
363
 
358
364
  Args:
@@ -5,23 +5,11 @@
5
5
  """
6
6
 
7
7
  from collections.abc import Mapping
8
- from enum import StrEnum
9
8
  from typing import Annotated, Any, Union
10
9
 
11
- from dataops_sdk.schemas.meta import Meta
12
10
  from pydantic import AliasChoices, BaseModel, Field, JsonValue
13
11
 
14
-
15
- class MetaSkillSubType(StrEnum):
16
- LLM = "llm"
17
- API = "api"
18
- REPORT = "report"
19
-
20
-
21
- class MetaSkillFileSubType(StrEnum):
22
- DOC = "doc"
23
- CODE = "code"
24
- IMAGE = "image"
12
+ from dataops_sdk.schemas.meta import Meta
25
13
 
26
14
 
27
15
  class DataSkill(BaseModel):
@@ -73,17 +61,6 @@ class MetaSkill(Meta[DataSkill]):
73
61
  content: 来自 ``data.markdown`` 的 Markdown 文本,若 ``data`` 为空时返回空字符串。
74
62
  """
75
63
 
76
- @property
77
- def content(self) -> str:
78
- """便利访问:返回 markdown 文本(若存在).
79
-
80
- Returns:
81
- str: Markdown 内容,缺失时返回空字符串。
82
- """
83
- if self.data is None:
84
- return ""
85
- return self.data.markdown or ""
86
-
87
64
 
88
65
  class SkillCallResult(BaseModel):
89
66
  """调用 skill 后的返回结果,对应 Java ``SkillResult``.