dataops-sdk 0.3.0__py3-none-any.whl

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.

Potentially problematic release.


This version of dataops-sdk might be problematic. Click here for more details.

Files changed (79) hide show
  1. dataops_sdk/__init__.py +84 -0
  2. dataops_sdk/constants.py +6 -0
  3. dataops_sdk/exceptions.py +31 -0
  4. dataops_sdk/runner/__init__.py +46 -0
  5. dataops_sdk/runner/datasource_factory.py +83 -0
  6. dataops_sdk/runner/schemas/nacos/__init__.py +5 -0
  7. dataops_sdk/runner/schemas/nacos/config.py +40 -0
  8. dataops_sdk/runner/schemas/nacos/constants.py +235 -0
  9. dataops_sdk/runner/schemas/nacos/instance.py +103 -0
  10. dataops_sdk/runner/schemas/nacos/nacos_exception.py +44 -0
  11. dataops_sdk/runner/schemas/nacos/naming_param.py +62 -0
  12. dataops_sdk/runner/schemas/nacos/naming_request.py +84 -0
  13. dataops_sdk/runner/schemas/nacos/naming_response.py +50 -0
  14. dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +10 -0
  15. dataops_sdk/runner/schemas/nacos/service.py +119 -0
  16. dataops_sdk/runner/utils/__init__.py +42 -0
  17. dataops_sdk/runner/utils/common.py +209 -0
  18. dataops_sdk/runner/utils/dbConn_base.py +256 -0
  19. dataops_sdk/runner/utils/dbConn_sync.py +485 -0
  20. dataops_sdk/runner/utils/duckdb_manager.py +203 -0
  21. dataops_sdk/runner/utils/file_transfer_base.py +307 -0
  22. dataops_sdk/runner/utils/ftp_file_transfer.py +242 -0
  23. dataops_sdk/runner/utils/log.py +50 -0
  24. dataops_sdk/runner/utils/nacos.py +96 -0
  25. dataops_sdk/runner/utils/neo4j_sync.py +236 -0
  26. dataops_sdk/runner/utils/queue_base.py +224 -0
  27. dataops_sdk/runner/utils/queue_kafka.py +150 -0
  28. dataops_sdk/runner/utils/sftp_file_transfer.py +243 -0
  29. dataops_sdk/schemas/__init__.py +32 -0
  30. dataops_sdk/schemas/alarm.py +38 -0
  31. dataops_sdk/schemas/api.py +37 -0
  32. dataops_sdk/schemas/data_table.py +437 -0
  33. dataops_sdk/schemas/datasource.py +26 -0
  34. dataops_sdk/schemas/dict_.py +13 -0
  35. dataops_sdk/schemas/enums.py +120 -0
  36. dataops_sdk/schemas/group.py +40 -0
  37. dataops_sdk/schemas/hazard.py +151 -0
  38. dataops_sdk/schemas/meta.py +175 -0
  39. dataops_sdk/schemas/query.py +175 -0
  40. dataops_sdk/schemas/report.py +22 -0
  41. dataops_sdk/schemas/skill.py +70 -0
  42. dataops_sdk/schemas/table.py +65 -0
  43. dataops_sdk/schemas/user.py +52 -0
  44. dataops_sdk/schemas/widget.py +651 -0
  45. dataops_sdk/schemas/workflow.py +63 -0
  46. dataops_sdk/services/__init__.py +110 -0
  47. dataops_sdk/services/alarm.py +324 -0
  48. dataops_sdk/services/api.py +28 -0
  49. dataops_sdk/services/auth.py +120 -0
  50. dataops_sdk/services/data_table.py +485 -0
  51. dataops_sdk/services/dataset.py +127 -0
  52. dataops_sdk/services/datasource.py +57 -0
  53. dataops_sdk/services/dict_.py +69 -0
  54. dataops_sdk/services/hazard.py +260 -0
  55. dataops_sdk/services/meta.py +523 -0
  56. dataops_sdk/services/metrics.py +42 -0
  57. dataops_sdk/services/ref.py +66 -0
  58. dataops_sdk/services/report.py +36 -0
  59. dataops_sdk/services/skill.py +276 -0
  60. dataops_sdk/services/table.py +340 -0
  61. dataops_sdk/services/widget.py +143 -0
  62. dataops_sdk/services/workflow.py +102 -0
  63. dataops_sdk/session.py +292 -0
  64. dataops_sdk/tiptap/__init__.py +30 -0
  65. dataops_sdk/tiptap/builder.py +75 -0
  66. dataops_sdk/tiptap/constants.py +133 -0
  67. dataops_sdk/tiptap/markdown_parser.py +294 -0
  68. dataops_sdk/tiptap/models.py +43 -0
  69. dataops_sdk/tiptap/parse_utils.py +889 -0
  70. dataops_sdk/tiptap/render_utils.py +846 -0
  71. dataops_sdk/tiptap/renderers.py +51 -0
  72. dataops_sdk/tiptap/tool.py +629 -0
  73. dataops_sdk/utils/__init__.py +15 -0
  74. dataops_sdk/utils/common.py +211 -0
  75. dataops_sdk/utils/utils.py +120 -0
  76. dataops_sdk-0.3.0.dist-info/METADATA +25 -0
  77. dataops_sdk-0.3.0.dist-info/RECORD +79 -0
  78. dataops_sdk-0.3.0.dist-info/WHEEL +5 -0
  79. dataops_sdk-0.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,151 @@
1
+ from datetime import datetime
2
+ from typing import Annotated
3
+
4
+ from pydantic import AliasChoices, BaseModel, ConfigDict, Field
5
+
6
+
7
+ class HazardRecordDTO(BaseModel):
8
+ """隐患记录 DTO,对应 Java ``HazardRecordDTO``.
9
+
10
+ 注意:list/his-list 接口实际返回 ``DbRecord``(key 全部大写下划线),
11
+ 本模型供用户在已知单条记录结构时构造/校验对象使用。
12
+ """
13
+
14
+ model_config = ConfigDict(populate_by_name=True, extra="ignore")
15
+
16
+ cuid: Annotated[str, Field(description="隐患记录主键 ID")]
17
+ rule_code: Annotated[
18
+ str | None,
19
+ Field(description="所属规则编码", validation_alias=AliasChoices("ruleCode", "rule_code")),
20
+ ] = None
21
+ rule_name: Annotated[
22
+ str | None,
23
+ Field(description="所属规则名称", validation_alias=AliasChoices("ruleName", "rule_name")),
24
+ ] = None
25
+ hazard_no: Annotated[
26
+ str | None,
27
+ Field(description="隐患编号", validation_alias=AliasChoices("hazardNo", "hazard_no")),
28
+ ] = None
29
+ hazard_title: Annotated[
30
+ str | None,
31
+ Field(description="隐患标题", validation_alias=AliasChoices("hazardTitle", "hazard_title")),
32
+ ] = None
33
+ hazard_desc: Annotated[
34
+ str | None,
35
+ Field(description="隐患描述", validation_alias=AliasChoices("hazardDesc", "hazard_desc")),
36
+ ] = None
37
+ hazard_level: Annotated[
38
+ str | None,
39
+ Field(description="隐患等级", validation_alias=AliasChoices("hazardLevel", "hazard_level")),
40
+ ] = None
41
+ object_type: Annotated[
42
+ str | None,
43
+ Field(
44
+ description="隐患对象类型", validation_alias=AliasChoices("objectType", "object_type")
45
+ ),
46
+ ] = None
47
+ object_type_name: Annotated[
48
+ str | None,
49
+ Field(
50
+ description="隐患对象类型名",
51
+ validation_alias=AliasChoices("objectTypeName", "object_type_name"),
52
+ ),
53
+ ] = None
54
+ object_id: Annotated[
55
+ str | None,
56
+ Field(description="隐患对象 ID", validation_alias=AliasChoices("objectId", "object_id")),
57
+ ] = None
58
+ object_name: Annotated[
59
+ str | None,
60
+ Field(
61
+ description="隐患对象名称", validation_alias=AliasChoices("objectName", "object_name")
62
+ ),
63
+ ] = None
64
+ status: Annotated[int | None, Field(description="隐患状态码")] = None
65
+ clear_time: Annotated[
66
+ datetime | None,
67
+ Field(description="清除时间", validation_alias=AliasChoices("clearTime", "clear_time")),
68
+ ] = None
69
+ order_no: Annotated[
70
+ str | None,
71
+ Field(description="外部工单号", validation_alias=AliasChoices("orderNo", "order_no")),
72
+ ] = None
73
+ clear_notify_status: Annotated[
74
+ int | None,
75
+ Field(
76
+ description="清除通知状态",
77
+ validation_alias=AliasChoices("clearNotifyStatus", "clear_notify_status"),
78
+ ),
79
+ ] = None
80
+ need_dispatch: Annotated[
81
+ bool | None,
82
+ Field(
83
+ description="是否需要派遣",
84
+ validation_alias=AliasChoices("needDispatch", "need_dispatch"),
85
+ ),
86
+ ] = None
87
+ check_start_time: Annotated[
88
+ datetime | None,
89
+ Field(
90
+ description="检查开始时间",
91
+ validation_alias=AliasChoices("checkStartTime", "check_start_time"),
92
+ ),
93
+ ] = None
94
+ check_end_time: Annotated[
95
+ datetime | None,
96
+ Field(
97
+ description="检查结束时间",
98
+ validation_alias=AliasChoices("checkEndTime", "check_end_time"),
99
+ ),
100
+ ] = None
101
+ create_time: Annotated[
102
+ datetime | None,
103
+ Field(description="创建时间", validation_alias=AliasChoices("createTime", "create_time")),
104
+ ] = None
105
+ last_modify_time: Annotated[
106
+ datetime | None,
107
+ Field(
108
+ description="最后修改时间",
109
+ validation_alias=AliasChoices("lastModifyTime", "last_modify_time"),
110
+ ),
111
+ ] = None
112
+
113
+
114
+ class HazardTaskDTO(BaseModel):
115
+ """隐患任务 DTO,对应 Java ``HazardTaskDTO``.
116
+
117
+ 主要在 ``/hazard/task/trigger/{code}`` 触发后由后端异步生成实例并写入日志;
118
+ SDK 不直接查询该 DTO,保留供用户在构造/序列化场景下使用。
119
+ """
120
+
121
+ model_config = ConfigDict(populate_by_name=True, extra="ignore")
122
+
123
+ code: Annotated[str | None, Field(description="任务编码")] = None
124
+ name: Annotated[str | None, Field(description="任务名称")] = None
125
+ title: Annotated[str | None, Field(description="任务中文名")] = None
126
+ hazard_code: Annotated[
127
+ str | None,
128
+ Field(description="隐患编码", validation_alias=AliasChoices("hazardCode", "hazard_code")),
129
+ ] = None
130
+ check_object: Annotated[
131
+ dict | None,
132
+ Field(
133
+ description="检查对象配置",
134
+ validation_alias=AliasChoices("checkObject", "check_object"),
135
+ ),
136
+ ] = None
137
+ job_setting: Annotated[
138
+ dict | None,
139
+ Field(
140
+ description="任务调度配置",
141
+ validation_alias=AliasChoices("jobSetting", "job_setting"),
142
+ ),
143
+ ] = None
144
+ enabled: Annotated[bool | None, Field(description="是否启用")] = None
145
+ need_dispatch: Annotated[
146
+ bool | None,
147
+ Field(
148
+ description="是否需要派遣",
149
+ validation_alias=AliasChoices("needDispatch", "need_dispatch"),
150
+ ),
151
+ ] = None
@@ -0,0 +1,175 @@
1
+ from collections.abc import Mapping
2
+ from datetime import datetime
3
+ from typing import Annotated, Generic, TypeVar
4
+
5
+ from pydantic import (
6
+ AliasChoices,
7
+ BaseModel,
8
+ ConfigDict,
9
+ Field,
10
+ JsonValue,
11
+ model_validator,
12
+ )
13
+ from pydantic_core import from_json
14
+
15
+ DEFAULT_META_DATA_TYPE = Mapping[str, JsonValue]
16
+ META_DATA_BOUND_TYPE = DEFAULT_META_DATA_TYPE | BaseModel
17
+
18
+ META_DATA_TYPE = TypeVar("META_DATA_TYPE", bound=META_DATA_BOUND_TYPE)
19
+
20
+
21
+ class MetaRelease(BaseModel):
22
+ CUID: Annotated[str, Field(description="元数据ID")]
23
+ TENANT_ID: Annotated[str, Field(description="租户ID")]
24
+ PROD_CODE: Annotated[str, Field(description="产品编码")]
25
+ RELEASE: Annotated[str, Field(description="版本")] = "1.0.0"
26
+
27
+ CODE: Annotated[str, Field(description="编码")]
28
+ TYPE: Annotated[str, Field(description="类型")]
29
+ SUB_TYPE: Annotated[str | None, Field(description="子类型")]
30
+ NAME: Annotated[str, Field(description="名称")]
31
+ TITLE: Annotated[str, Field(description="中文名称")]
32
+ REMARK: Annotated[str | None, Field(description="备注")]
33
+ DIGEST: Annotated[str | None, Field(description="摘要")]
34
+
35
+ CREATE_TIME: Annotated[datetime, Field(description="创建时间")]
36
+ CREATE_USER: Annotated[str, Field(description="创建人")]
37
+ LAST_MODIFY_TIME: Annotated[datetime, Field(description="最后修改时间")]
38
+ LAST_MODIFY_USER: Annotated[str, Field(description="最后修改人")]
39
+
40
+ model_config = ConfigDict(extra="allow", str_to_lower=True)
41
+
42
+
43
+ class MetaBase(BaseModel):
44
+ id: Annotated[str, Field(description="元数据ID", validation_alias=AliasChoices("id", "cuid"))]
45
+ parentId: Annotated[
46
+ str | None,
47
+ Field(description="父ID", validation_alias=AliasChoices("parentId", "parent_id")),
48
+ ]
49
+ code: Annotated[str, Field(description="编码")]
50
+
51
+ groupCode: Annotated[
52
+ str | None,
53
+ Field(description="组编码", validation_alias=AliasChoices("groupCode", "group_code")),
54
+ ]
55
+ groupName: Annotated[str | None, Field(description="组名称")] = None
56
+ spaceName: Annotated[str | None, Field(description="空间名称")] = None
57
+
58
+ subSystem: Annotated[
59
+ str, Field(description="子系统", validation_alias=AliasChoices("subSystem", "sub_system"))
60
+ ]
61
+
62
+ type: Annotated[str, Field(description="类型")]
63
+ subType: Annotated[
64
+ str | None,
65
+ Field(description="子类型", validation_alias=AliasChoices("subType", "sub_type")),
66
+ ]
67
+
68
+ name: Annotated[str, Field(description="名称")]
69
+ title: Annotated[str, Field(description="中文名称")]
70
+ digest: Annotated[str | None, Field(description="摘要")]
71
+
72
+ remark: Annotated[str | None, Field(description="备注")]
73
+
74
+ createUser: Annotated[
75
+ str, Field(description="创建人", validation_alias=AliasChoices("createUser", "create_user"))
76
+ ]
77
+ createTime: Annotated[
78
+ datetime,
79
+ Field(description="创建时间", validation_alias=AliasChoices("createTime", "create_time")),
80
+ ]
81
+ lastModifyUser: Annotated[
82
+ str,
83
+ Field(
84
+ description="最后修改人",
85
+ validation_alias=AliasChoices("lastModifyUser", "last_modify_user"),
86
+ ),
87
+ ]
88
+ lastModifyTime: Annotated[
89
+ datetime,
90
+ Field(
91
+ description="最后修改时间",
92
+ validation_alias=AliasChoices("lastModifyTime", "last_modify_time"),
93
+ ),
94
+ ]
95
+
96
+ tenantId: Annotated[
97
+ str, Field(description="租户ID", validation_alias=AliasChoices("tenantId", "tenant_id"))
98
+ ]
99
+ prodCode: Annotated[
100
+ str, Field(description="产品编码", validation_alias=AliasChoices("prodCode", "prod_code"))
101
+ ]
102
+ release: Annotated[str, Field(description="版本")]
103
+
104
+ action: Annotated[str, Field(description="操作")]
105
+ version: Annotated[str, Field(description="版本")]
106
+
107
+ model_config = ConfigDict(extra="allow")
108
+
109
+
110
+ class Meta(MetaBase, Generic[META_DATA_TYPE]):
111
+ data: Annotated[META_DATA_TYPE | None, Field(description="元数据")]
112
+
113
+ @model_validator(mode="before")
114
+ @classmethod
115
+ def parse_raw_data(cls, values):
116
+ raw = values.get("rawData")
117
+ if raw:
118
+ values["data"] = from_json(raw)
119
+ return values
120
+
121
+ model_config = ConfigDict(extra="ignore")
122
+
123
+
124
+ class MetaRef(BaseModel):
125
+ """引用元数据"""
126
+
127
+ cuid: Annotated[str, Field(description="元数据ID", exclude=True)]
128
+ type: Annotated[str, Field(description="类型")]
129
+ code: Annotated[str, Field(description="编码")]
130
+ name: Annotated[str, Field(description="名称")]
131
+ title: Annotated[str, Field(description="中文名称")]
132
+
133
+ refType: Annotated[str, Field(description="引用类型")]
134
+ refCode: Annotated[str, Field(description="引用编码")]
135
+ refName: Annotated[str, Field(description="引用名称")]
136
+ refTitle: Annotated[str, Field(description="引用中文名称")]
137
+ refSubtype: Annotated[str | None, Field(description="引用子类型")]
138
+ refSubcode: Annotated[str | None, Field(description="引用子编码")] = None
139
+
140
+ valid: Annotated[bool, Field(description="是否有效")] = False
141
+
142
+
143
+ class MetaCreate(BaseModel, Generic[META_DATA_TYPE]):
144
+ code: Annotated[str | None, Field(description="编码")] = None
145
+
146
+ type: Annotated[str, Field(description="类型")]
147
+ subType: Annotated[
148
+ str | None,
149
+ Field(description="子类型", validation_alias=AliasChoices("subType", "sub_type")),
150
+ ] = None
151
+
152
+ name: Annotated[str, Field(description="名称")]
153
+ title: Annotated[str, Field(description="中文名称")]
154
+ # digest: Annotated[str | None, Field(description="摘要")] = None
155
+
156
+ remark: Annotated[str | None, Field(description="备注")] = None
157
+
158
+ data: Annotated[META_DATA_TYPE, Field(description="元数据")]
159
+
160
+ groupCode: Annotated[
161
+ str | None,
162
+ Field(description="分组编码", validation_alias=AliasChoices("groupCode", "group_code")),
163
+ ] = None
164
+
165
+
166
+ class MetaUpdate(BaseModel, Generic[META_DATA_TYPE]):
167
+ code: Annotated[str | None, Field(description="编码")] = None
168
+
169
+ name: Annotated[str | None, Field(description="名称")] = None
170
+ title: Annotated[str | None, Field(description="中文名称")] = None
171
+ remark: Annotated[str | None, Field(description="备注")] = None
172
+
173
+ data: Annotated[
174
+ META_DATA_TYPE | None, Field(description="元数据", exclude_if=lambda x: x is None)
175
+ ] = None
@@ -0,0 +1,175 @@
1
+ from typing import Annotated, Any, Literal
2
+
3
+ from pydantic import BaseModel, Field, JsonValue
4
+
5
+ from dataops_sdk.schemas.enums import SqlExpression
6
+
7
+
8
+ class PageParam(BaseModel):
9
+ start: Annotated[int, Field(description="起始位置")] = 0
10
+ limit: Annotated[int, Field(description="每页条数")] = 20
11
+
12
+
13
+ class SqlConditionBase(BaseModel):
14
+ name: Annotated[str, Field(description="字段名")]
15
+ value: Annotated[Any, Field(description="字段值")]
16
+
17
+
18
+ class SqlCondition(SqlConditionBase):
19
+ alias: Annotated[str | None, Field(description="表别名")] = None
20
+ expression: Annotated[SqlExpression, Field(description="条件表达式")]
21
+
22
+
23
+ class SqlSort(BaseModel):
24
+ alias: Annotated[str | None, Field(description="表别名")] = None
25
+ name: Annotated[str, Field(description="字段名")]
26
+ asc: Annotated[bool, Field(description="是否ASE")] = True
27
+
28
+
29
+ class SqlFilter(BaseModel):
30
+ condition: Annotated[SqlConditionBase, Field(description="条件")]
31
+
32
+ @classmethod
33
+ def eq(cls, name: str, value: Any):
34
+ return cls(condition=SqlConditionBase(name=name, value=value))
35
+
36
+ @classmethod
37
+ def ne(cls, name: str, value: Any):
38
+ return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NE))
39
+
40
+ @classmethod
41
+ def gt(cls, name: str, value: Any):
42
+ return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.GT))
43
+
44
+ @classmethod
45
+ def ge(cls, name: str, value: Any):
46
+ return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.GE))
47
+
48
+ @classmethod
49
+ def lt(cls, name: str, value: Any):
50
+ return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LT))
51
+
52
+ @classmethod
53
+ def le(cls, name: str, value: Any):
54
+ return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LE))
55
+
56
+ @classmethod
57
+ def in_(cls, name: str, value: list):
58
+ return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.IN))
59
+
60
+ @classmethod
61
+ def not_in(cls, name: str, value: list):
62
+ return cls(
63
+ condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NOT_IN)
64
+ )
65
+
66
+ @classmethod
67
+ def like(cls, name: str, value: str):
68
+ return cls(
69
+ condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LIKE)
70
+ )
71
+
72
+ @classmethod
73
+ def not_like(cls, name: str, value: str):
74
+ return cls(
75
+ condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NOT_LIKE)
76
+ )
77
+
78
+
79
+ class SqlQueryParam(BaseModel):
80
+ conjunction: Annotated[Literal["and", "or"], Field(description="条件连接符")] = "and"
81
+ conditionList: Annotated[
82
+ list[SqlCondition], Field(description="条件列表", default_factory=list)
83
+ ]
84
+ sorts: Annotated[list[SqlSort], Field(description="排序列表", default_factory=list)]
85
+ varMap: Annotated[dict[str, JsonValue], Field(description="变量映射", default_factory=dict)]
86
+
87
+ def add_eq(self, name: str, value: Any, alias: str | None = None):
88
+ self.conditionList.append(
89
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.EQ)
90
+ )
91
+ return self
92
+
93
+ def add_ne(self, name: str, value: Any, alias: str | None = None):
94
+ self.conditionList.append(
95
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NE)
96
+ )
97
+ return self
98
+
99
+ def add_gt(self, name: str, value: Any, alias: str | None = None):
100
+ self.conditionList.append(
101
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.GT)
102
+ )
103
+ return self
104
+
105
+ def add_ge(self, name: str, value: Any, alias: str | None = None):
106
+ self.conditionList.append(
107
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.GE)
108
+ )
109
+ return self
110
+
111
+ def add_lt(self, name: str, value: Any, alias: str | None = None):
112
+ self.conditionList.append(
113
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.LT)
114
+ )
115
+ return self
116
+
117
+ def add_le(self, name: str, value: Any, alias: str | None = None):
118
+ self.conditionList.append(
119
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.LE)
120
+ )
121
+ return self
122
+
123
+ def add_in(self, name: str, value: list, alias: str | None = None):
124
+ self.conditionList.append(
125
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.IN)
126
+ )
127
+ return self
128
+
129
+ def add_not_in(self, name: str, value: list, alias: str | None = None):
130
+ self.conditionList.append(
131
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NOT_IN)
132
+ )
133
+ return self
134
+
135
+ def add_like(self, name: str, value: str, alias: str | None = None):
136
+ self.conditionList.append(
137
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.LIKE)
138
+ )
139
+ return self
140
+
141
+ def add_not_like(self, name: str, value: str, alias: str | None = None):
142
+ self.conditionList.append(
143
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NOT_LIKE)
144
+ )
145
+ return self
146
+
147
+ def add_between(self, name: str, value: tuple[Any, Any], alias: str | None = None):
148
+ self.conditionList.append(
149
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.BETWEEN)
150
+ )
151
+ return self
152
+
153
+ def add_not_between(self, name: str, value: tuple[Any, Any], alias: str | None = None):
154
+ self.conditionList.append(
155
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NOT_BETWEEN)
156
+ )
157
+ return self
158
+
159
+ def add_is_null(self, name: str, alias: str | None = None):
160
+ self.conditionList.append(
161
+ SqlCondition(alias=alias, name=name, value=None, expression=SqlExpression.IS_NULL)
162
+ )
163
+ return self
164
+
165
+ def add_is_not_null(self, name: str, alias: str | None = None):
166
+ self.conditionList.append(
167
+ SqlCondition(alias=alias, name=name, value=None, expression=SqlExpression.IS_NOT_NULL)
168
+ )
169
+ return self
170
+
171
+ def add_exists(self, name: str, value: Any, alias: str | None = None):
172
+ self.conditionList.append(
173
+ SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.EXISTS)
174
+ )
175
+ return self
@@ -0,0 +1,22 @@
1
+ from collections.abc import Mapping
2
+ from typing import Annotated
3
+
4
+ from pydantic import BaseModel, Field, JsonValue
5
+
6
+ from dataops_sdk.tiptap import TipTapBuilder
7
+
8
+ from .meta import Meta
9
+
10
+
11
+ class ReportMetaData(BaseModel):
12
+ """Report metadata"""
13
+
14
+ editor: Annotated[Mapping[str, JsonValue], Field(description="tiptap 原始文档")]
15
+
16
+
17
+ class ReportMeta(Meta[ReportMetaData]):
18
+ """文档 Meta"""
19
+
20
+ @property
21
+ def content(self) -> str:
22
+ return TipTapBuilder().build().serialize(self.data.editor).strip()
@@ -0,0 +1,70 @@
1
+ from collections.abc import Mapping
2
+ from typing import Annotated, Any
3
+
4
+ from pydantic import AliasChoices, BaseModel, Field, JsonValue
5
+
6
+ from dataops_sdk.schemas.meta import Meta
7
+
8
+
9
+ class DataSkill(BaseModel):
10
+ """skill 实体 rawData 私有字段.
11
+
12
+ 字段命名参考前端 ``SkillFile.vue`` 与后端 ``SkillService`` 的约定:
13
+ - ``markdown``: SKILL.md 的 Markdown 正文(用于 LLM 子类型技能)
14
+ - ``editor``: TipTap JSON 文档结构(用于编辑器渲染)
15
+ - ``args``: 技能对外入参定义列表
16
+ - ``input_json_schema``: JSON Schema 格式的入参约束
17
+ """
18
+
19
+ markdown: Annotated[str | None, Field(description="SKILL.md Markdown 内容")] = None
20
+ editor: Annotated[Mapping[str, JsonValue] | None, Field(description="TipTap JSON 文档结构")] = (
21
+ None
22
+ )
23
+ args: Annotated[
24
+ list[Mapping[str, JsonValue]] | None,
25
+ Field(description="技能对外入参定义"),
26
+ ] = None
27
+ input_json_schema: Annotated[
28
+ Mapping[str, JsonValue] | None, Field(description="JSON Schema 入参约束")
29
+ ] = None
30
+
31
+
32
+ class MetaSkill(Meta[DataSkill]):
33
+ """skill 实体详情,继承通用 Meta 字段并附加 DataSkill data."""
34
+
35
+ @property
36
+ def content(self) -> str:
37
+ """便利访问:返回 markdown 文本(若存在)."""
38
+ if self.data is None:
39
+ return ""
40
+ return self.data.markdown or ""
41
+
42
+
43
+ class SkillCallResult(BaseModel):
44
+ """调用 skill 后的返回结果,对应 Java ``SkillResult``.
45
+
46
+ 字段使用 snake_case,通过 ``validation_alias`` 兼容后端驼峰返回.
47
+ """
48
+
49
+ inst_id: Annotated[
50
+ str,
51
+ Field(
52
+ description="调用实例 ID",
53
+ validation_alias=AliasChoices("instId", "inst_id"),
54
+ ),
55
+ ]
56
+ status: Annotated[str, Field(description="执行状态 success/failure")]
57
+ output_data: Annotated[
58
+ Any,
59
+ Field(
60
+ description="Python 容器返回的业务数据",
61
+ validation_alias=AliasChoices("outputData", "output_data"),
62
+ ),
63
+ ] = None
64
+ error_message: Annotated[
65
+ str | None,
66
+ Field(
67
+ description="失败时的错误信息",
68
+ validation_alias=AliasChoices("errorMessage", "error_message"),
69
+ ),
70
+ ] = None
@@ -0,0 +1,65 @@
1
+ from typing import Annotated
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from dataops_sdk.schemas.enums import ColumnType
6
+
7
+
8
+ class DataBaseColumnReference(BaseModel):
9
+ type: Annotated[str, Field(description="引用类型")]
10
+ code: Annotated[str, Field(description="引用编码")]
11
+
12
+
13
+ class DataBaseColumnReferenceValue(DataBaseColumnReference):
14
+ subtype: Annotated[str | None, Field(description="引用子类型")]
15
+ subcode: Annotated[str, Field(description="引用子编码")]
16
+
17
+
18
+ class DataBaseColumnDictExternal(BaseModel):
19
+ ref__dict: Annotated[DataBaseColumnReference, Field(description="外部类型映射")]
20
+
21
+
22
+ class DataBaseColumnTableExternal(BaseModel):
23
+ ref__table: Annotated[DataBaseColumnReference, Field(description="外部类型表")]
24
+ ref__valueField: Annotated[DataBaseColumnReferenceValue, Field(description="外部类型值字段")]
25
+ ref__displayField: Annotated[
26
+ DataBaseColumnReferenceValue | None,
27
+ Field(description="外部类型显示字段"),
28
+ ] = None
29
+
30
+
31
+ class ColumnItem(BaseModel):
32
+ id: Annotated[str, Field(description="id")]
33
+ name: Annotated[str, Field(description="列名")]
34
+ title: Annotated[str, Field(description="列中文名")]
35
+ dbType: Annotated[ColumnType, Field(description="数据库类型")]
36
+ nullable: Annotated[bool, Field(description="是否可为空")] = True
37
+
38
+ length: Annotated[int | None, Field(description="长度")] = None
39
+ decimalPlace: Annotated[int | None, Field(description="小数位")] = None
40
+
41
+ type: Annotated[str | None, Field(description="类型")] = None
42
+
43
+ typeExt: Annotated[
44
+ DataBaseColumnDictExternal | DataBaseColumnTableExternal | None,
45
+ Field(description="类型扩展"),
46
+ ] = None
47
+
48
+ pk: Annotated[bool | None, Field(description="是否为主键")] = None
49
+ labelKey: Annotated[bool | None, Field(description="是否作为标签")] = None
50
+
51
+
52
+ class IndexColumnItem(BaseModel):
53
+ column: Annotated[str, Field(description="列名")]
54
+ sort: Annotated[str | None, Field(description="排序方式")] = None
55
+
56
+
57
+ class IndexItem(BaseModel):
58
+ id: Annotated[str, Field(description="id")]
59
+ name: Annotated[str, Field(description="索引名")]
60
+ columns: Annotated[list[IndexColumnItem], Field(description="索引列")]
61
+
62
+
63
+ class DataDataBase(BaseModel):
64
+ columns: Annotated[list[ColumnItem], Field(description="列数据", default_factory=list)]
65
+ indexes: Annotated[list[IndexItem], Field(description="索引数据", default_factory=list)]