dataops-sdk 0.4.0__tar.gz → 0.4.1__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 → dataops_sdk-0.4.1}/PKG-INFO +1 -1
  2. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/__init__.py +1 -1
  3. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/__init__.py +3 -1
  4. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/common.py +1 -1
  5. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/enums.py +25 -1
  6. dataops_sdk-0.4.1/src/dataops_sdk/schemas/group.py +66 -0
  7. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/report.py +11 -12
  8. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/user.py +2 -2
  9. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/workflow.py +1 -5
  10. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/__init__.py +12 -2
  11. dataops_sdk-0.4.1/src/dataops_sdk/services/group.py +69 -0
  12. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/meta.py +0 -2
  13. dataops_sdk-0.4.1/src/dataops_sdk/services/metrics.py +87 -0
  14. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/report.py +19 -2
  15. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/skill.py +3 -0
  16. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/widget.py +14 -0
  17. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/session.py +5 -6
  18. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/utils/utils.py +5 -17
  19. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk.egg-info/PKG-INFO +1 -1
  20. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk.egg-info/SOURCES.txt +1 -0
  21. dataops_sdk-0.4.0/src/dataops_sdk/schemas/group.py +0 -46
  22. dataops_sdk-0.4.0/src/dataops_sdk/services/metrics.py +0 -53
  23. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/README.md +0 -0
  24. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/pyproject.toml +0 -0
  25. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/setup.cfg +0 -0
  26. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/constants.py +0 -0
  27. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/exceptions.py +0 -0
  28. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/__init__.py +0 -0
  29. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/datasource_factory.py +0 -0
  30. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -0
  31. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/config.py +0 -0
  32. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/constants.py +0 -0
  33. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/instance.py +0 -0
  34. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +0 -0
  35. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -0
  36. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -0
  37. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +0 -0
  38. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +0 -0
  39. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/schemas/nacos/service.py +0 -0
  40. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/__init__.py +0 -0
  41. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/common.py +0 -0
  42. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/dbConn_base.py +0 -0
  43. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/dbConn_sync.py +0 -0
  44. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/duckdb_manager.py +0 -0
  45. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/file_transfer_base.py +0 -0
  46. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +0 -0
  47. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/nacos.py +0 -0
  48. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/neo4j_sync.py +0 -0
  49. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/queue_base.py +0 -0
  50. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/queue_kafka.py +0 -0
  51. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +0 -0
  52. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/alarm.py +0 -0
  53. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/api.py +0 -0
  54. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/data_table.py +0 -0
  55. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/datasource.py +0 -0
  56. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/dict_.py +0 -0
  57. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/hazard.py +0 -0
  58. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/meta.py +0 -0
  59. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/query.py +0 -0
  60. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/skill.py +0 -0
  61. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/table.py +0 -0
  62. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/schemas/widget.py +0 -0
  63. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/alarm.py +0 -0
  64. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/api.py +0 -0
  65. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/auth.py +0 -0
  66. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/data_table.py +0 -0
  67. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/dataset.py +0 -0
  68. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/datasource.py +0 -0
  69. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/dict_.py +0 -0
  70. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/hazard.py +0 -0
  71. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/ref.py +0 -0
  72. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/table.py +0 -0
  73. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/services/workflow.py +0 -0
  74. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/__init__.py +0 -0
  75. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/builder.py +0 -0
  76. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/constants.py +0 -0
  77. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/markdown_parser.py +0 -0
  78. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/models.py +0 -0
  79. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/parse_utils.py +0 -0
  80. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/render_utils.py +0 -0
  81. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/renderers.py +0 -0
  82. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/tiptap/tool.py +0 -0
  83. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/utils/__init__.py +0 -0
  84. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/utils/common.py +0 -0
  85. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk/utils/log.py +0 -0
  86. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
  87. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk.egg-info/requires.txt +0 -0
  88. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/src/dataops_sdk.egg-info/top_level.txt +0 -0
  89. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/tests/test_constants.py +0 -0
  90. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/tests/test_exceptions.py +0 -0
  91. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/tests/test_session.py +0 -0
  92. {dataops_sdk-0.4.0 → dataops_sdk-0.4.1}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataops-sdk
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Python SDK for the DataOps platform.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -107,4 +107,4 @@ from .services import ( # noqa: F401
107
107
  )
108
108
  from .session import dataops_base_url_context, request_context
109
109
 
110
- __version__ = "0.4.0"
110
+ __version__ = "0.4.1"
@@ -19,14 +19,16 @@ from .data_table import DataTableData, MetaDataTable
19
19
  from .datasource import DataDataSource
20
20
  from .dict_ import DataDict, DictItem
21
21
  from .enums import (
22
+ GroupNodeRefType,
22
23
  InnerMetaType,
24
+ MetaReportSubType,
23
25
  MetaSkillFileSubType,
24
26
  MetaSkillSubType,
25
27
  MetaTemplateSubType,
26
28
  MetaType,
27
29
  MetaWidgetSubType,
28
30
  )
29
- from .group import GroupNode
31
+ from .group import GroupNode, GroupTree
30
32
  from .hazard import HazardRecordDTO, HazardTaskDTO
31
33
  from .meta import (
32
34
  DEFAULT_META_DATA_TYPE,
@@ -2,7 +2,7 @@ from typing import Annotated, Generic, TypeVar
2
2
 
3
3
  from pydantic import BaseModel, Field, JsonValue, NonNegativeInt
4
4
 
5
- DataVar = TypeVar("DataVar", default=JsonValue | None)
5
+ DataVar = TypeVar("DataVar")
6
6
 
7
7
 
8
8
  class DataOpsResponse(BaseModel, Generic[DataVar]):
@@ -7,6 +7,14 @@
7
7
  from enum import StrEnum
8
8
 
9
9
 
10
+ class GroupNodeRefType(StrEnum):
11
+ """分组节点引用类型枚举."""
12
+
13
+ INNER = "inner"
14
+ BEFORE = "before"
15
+ AFTER = "after"
16
+
17
+
10
18
  class InnerMetaType(StrEnum):
11
19
  """SDK 内部使用的 Meta 类型枚举.
12
20
 
@@ -16,8 +24,11 @@ class InnerMetaType(StrEnum):
16
24
  DATASOURCE: 数据源类型 meta。
17
25
  """
18
26
 
27
+ GROUP = "group"
28
+ """分组"""
29
+
19
30
  DATASOURCE = "datasource"
20
- """数据源类型 meta。"""
31
+ """数据源类型"""
21
32
 
22
33
  def __repr__(self):
23
34
  return self.value
@@ -248,3 +259,16 @@ class MetaSkillFileSubType(StrEnum):
248
259
  DOC = "doc"
249
260
  CODE = "code"
250
261
  IMAGE = "image"
262
+
263
+
264
+ class MetaReportSubType(StrEnum):
265
+ """文档子类型枚举."""
266
+
267
+ # 文档
268
+ DOC = "doc"
269
+ # 本体
270
+ ONTOLOGY = "ontology"
271
+ # 看板
272
+ DASHBOARD = "dashboard"
273
+ # # 废弃
274
+ # SKILL = "skill"
@@ -0,0 +1,66 @@
1
+ """分组节点 (GroupNode) Schema 定义.
2
+
3
+ 用于表示数据源目录树中的分组节点,包含节点的基本信息
4
+ 和层级关系。
5
+ """
6
+
7
+ from typing import Annotated
8
+
9
+ from pydantic import AliasChoices, BaseModel, Field, JsonValue
10
+
11
+
12
+ class GroupTree(BaseModel):
13
+ prodCode: Annotated[
14
+ str,
15
+ Field(
16
+ description="产品编码",
17
+ validation_alias=AliasChoices("prodCode", "prod_code", "PROD_CODE"),
18
+ ),
19
+ ]
20
+ release: Annotated[
21
+ str | None, Field(description="版本", validation_alias=AliasChoices("release", "RELEASE"))
22
+ ] = None
23
+
24
+ name: Annotated[str, Field(description="名称", validation_alias=AliasChoices("name", "NAME"))]
25
+ title: Annotated[
26
+ str, Field(description="中文名称", validation_alias=AliasChoices("title", "TITLE"))
27
+ ]
28
+
29
+ data: list["GroupNode"] = Field(default_factory=list, description="数据")
30
+ nodeMap: dict[str, dict[str, JsonValue]] = Field(default_factory=dict, description="节点映射")
31
+
32
+
33
+ class GroupNode(BaseModel):
34
+ id: Annotated[
35
+ str, Field(description="元数据ID", validation_alias=AliasChoices("id", "cuid", "CUID"))
36
+ ]
37
+ pid: Annotated[str | None, Field(description="父ID")]
38
+ parentId: Annotated[
39
+ str | None,
40
+ Field(
41
+ description="父ID", validation_alias=AliasChoices("parentId", "parent_id", "PARENT_ID")
42
+ ),
43
+ ]
44
+
45
+ type: Annotated[str, Field(description="类型", validation_alias=AliasChoices("type", "TYPE"))]
46
+ subType: Annotated[
47
+ str | None,
48
+ Field(
49
+ description="子类型", validation_alias=AliasChoices("subType", "sub_type", "SUB_TYPE")
50
+ ),
51
+ ]
52
+
53
+ name: Annotated[str, Field(description="名称", validation_alias=AliasChoices("name", "NAME"))]
54
+ title: Annotated[
55
+ str, Field(description="中文名称", validation_alias=AliasChoices("label", "title", "TITLE"))
56
+ ]
57
+ digest: Annotated[
58
+ str | None, Field(description="摘要", validation_alias=AliasChoices("digest", "DIGEST"))
59
+ ]
60
+ remark: Annotated[
61
+ str | None, Field(description="备注", validation_alias=AliasChoices("remark", "REMARK"))
62
+ ]
63
+
64
+ attrs: Annotated[dict[str, JsonValue] | None, Field(description="扩展属性")] = None
65
+ params: Annotated[dict[str, JsonValue] | None, Field(description="参数")] = None
66
+ children: Annotated[list["GroupNode"] | None, Field(description="子节点")] = None
@@ -6,9 +6,8 @@
6
6
  from collections.abc import Mapping
7
7
  from typing import Annotated
8
8
 
9
- from pydantic import BaseModel, Field, JsonValue
10
-
11
9
  from dataops_sdk.tiptap import TipTapBuilder
10
+ from pydantic import BaseModel, Field, JsonValue
12
11
 
13
12
  from .meta import Meta
14
13
 
@@ -20,7 +19,16 @@ class ReportMetaData(BaseModel):
20
19
  editor: tiptap 原始文档结构。
21
20
  """
22
21
 
23
- editor: Annotated[Mapping[str, JsonValue], Field(description="tiptap 原始文档")]
22
+ editor: Annotated[dict[str, JsonValue], Field(description="tiptap 原始文档")]
23
+
24
+ @property
25
+ def content(self) -> str:
26
+ """由 ``data.editor`` 通过 ``TipTapBuilder`` 序列化为纯文本.
27
+
28
+ Returns:
29
+ str: 序列化结果。
30
+ """
31
+ return TipTapBuilder().build().serialize(self.editor).strip()
24
32
 
25
33
 
26
34
  class ReportMeta(Meta[ReportMetaData]):
@@ -31,12 +39,3 @@ class ReportMeta(Meta[ReportMetaData]):
31
39
  Attributes:
32
40
  content: 由 ``data.editor`` 序列化得到的纯文本。
33
41
  """
34
-
35
- @property
36
- def content(self) -> str:
37
- """由 ``data.editor`` 通过 ``TipTapBuilder`` 序列化为纯文本.
38
-
39
- Returns:
40
- str: 序列化结果。
41
- """
42
- return TipTapBuilder().build().serialize(self.data.editor).strip()
@@ -41,8 +41,8 @@ class Application(BaseModel):
41
41
  REMARK: Annotated[str | None, Field(description="备注")]
42
42
  CREATE_TIME: Annotated[str, Field(description="创建时间")]
43
43
  CREATE_USER: Annotated[str, Field(description="创建人")]
44
- LAST_MODIFY_TIME: Annotated[str, Field(description="最后修改时间")]
45
- LAST_MODIFY_USER: Annotated[str, Field(description="最后修改人")]
44
+ LAST_MODIFY_TIME: Annotated[str | None, Field(description="最后修改时间")]
45
+ LAST_MODIFY_USER: Annotated[str | None, Field(description="最后修改人")]
46
46
  PROD_ADMIN: Annotated[str | None, Field(description="产品管理员")]
47
47
  GIT_ID: Annotated[str | None, Field(description="Git ID")]
48
48
  EXTS: Annotated[str | None, Field(description="扩展字段")]
@@ -6,17 +6,13 @@
6
6
  from collections.abc import Mapping
7
7
  from typing import Annotated, Generic, TypeVar
8
8
 
9
+ from dataops_sdk.schemas.meta import Meta
9
10
  from pydantic import (
10
11
  BaseModel,
11
12
  Field,
12
13
  JsonValue,
13
14
  )
14
15
 
15
- from dataops_sdk.schemas.meta import Meta
16
-
17
- # 注意:用传统 TypeVar + Generic[T] 写法以兼容 Python 3.11+。
18
- # PEP 695 ``class Foo[T](Bar)`` 语法需要 Python 3.12+,且其 default 参数需 3.13+,
19
- # 故此处不使用 PEP 695 语法。
20
16
  T = TypeVar("T")
21
17
 
22
18
 
@@ -60,6 +60,11 @@ from .dict_ import (
60
60
  service_get_dict_detail_by_name,
61
61
  service_list_dicts,
62
62
  )
63
+ from .group import (
64
+ create_group_node,
65
+ get_group_by_name,
66
+ get_group_by_sapce,
67
+ )
63
68
  from .hazard import (
64
69
  service_clear_hazard_history_records,
65
70
  service_dispatch_hazard_callback,
@@ -82,9 +87,13 @@ from .meta import (
82
87
  release_ref_list,
83
88
  release_ref_list_by_ref,
84
89
  )
85
- from .metrics import service_get_metrics, service_list_metrics
90
+ from .metrics import (
91
+ service_get_metrics,
92
+ service_get_metrics_data_by_code,
93
+ service_list_metrics,
94
+ )
86
95
  from .ref import service_ref_backward, service_ref_forward
87
- from .report import service_get_report, service_list_reports
96
+ from .report import service_get_report, service_list_reports, servive_tree_report
88
97
  from .skill import (
89
98
  SkillPackValidationError,
90
99
  service_delete_skill,
@@ -125,6 +134,7 @@ from .widget import (
125
134
  service_get_widget_detail_by_code,
126
135
  service_list_widgets,
127
136
  service_update_widget,
137
+ servive_tree_widget,
128
138
  )
129
139
  from .workflow import (
130
140
  service_get_workflow_by_code,
@@ -0,0 +1,69 @@
1
+ from collections.abc import Mapping, Sequence
2
+ from typing import Literal, cast
3
+
4
+ from dataops_sdk.exceptions import AuthenticationError
5
+ from dataops_sdk.schemas import (
6
+ GroupNode,
7
+ GroupNodeRefType,
8
+ GroupTree,
9
+ InnerMetaType,
10
+ MetaType,
11
+ )
12
+ from dataops_sdk.session import get_session, vaild_respone
13
+ from dataops_sdk.utils import encrypt_body
14
+ from pydantic import JsonValue
15
+ from pydantic_core import to_json
16
+
17
+
18
+ def get_group_by_sapce(
19
+ space_name: str,
20
+ group_name: MetaType | InnerMetaType | str,
21
+ *,
22
+ auto_create: bool = False,
23
+ ):
24
+ type_str = group_name.value if isinstance(group_name, (MetaType, InnerMetaType)) else group_name
25
+ url = f"/meta/group/getSpaceGroupTree/{space_name}/{type_str}"
26
+
27
+ try:
28
+ with get_session() as session:
29
+ resp = session.get(url, params=dict(autoCreate=auto_create))
30
+ resp_body = vaild_respone(resp, True, _class=GroupTree)
31
+ return resp_body.data or []
32
+ except SystemExit as e:
33
+ raise AuthenticationError("认证失败,请先登录") from e
34
+
35
+
36
+ def get_group_by_name(
37
+ group_name: MetaType | InnerMetaType | str,
38
+ *,
39
+ auto_create: bool = True,
40
+ ) -> GroupTree:
41
+ type_str = group_name.value if isinstance(group_name, (MetaType, InnerMetaType)) else group_name
42
+ url = f"/meta/group/getGroupTree/{type_str}"
43
+
44
+ try:
45
+ with get_session() as session:
46
+ resp = session.get(url, params=dict(autoCreate=auto_create))
47
+ resp_body = vaild_respone(resp, True, _class=GroupTree)
48
+ return resp_body.data or []
49
+ except SystemExit as e:
50
+ raise AuthenticationError("认证失败,请先登录") from e
51
+
52
+
53
+ def create_group_node(
54
+ group_name: str,
55
+ node: GroupNode,
56
+ ref_node_id: str | None = None,
57
+ ref_type: GroupNodeRefType | None = None,
58
+ ):
59
+ url = f"/meta/group/addGroupNode/{group_name}"
60
+
61
+ body = dict(addNode=node, refNodeId=ref_node_id, refType=ref_type)
62
+
63
+ try:
64
+ with get_session() as session:
65
+ resp = session.post(url, content=to_json(encrypt_body(body)))
66
+ resp_body = vaild_respone(resp, True, _class=GroupTree)
67
+ return resp_body.data or []
68
+ except SystemExit as e:
69
+ raise AuthenticationError("认证失败,请先登录") from e
@@ -11,9 +11,7 @@ from typing import cast
11
11
  from dataops_sdk.exceptions import (
12
12
  AuthenticationError,
13
13
  DataOpsError,
14
- FailedToCreateError,
15
14
  FailedToUpdateError,
16
- NotFoundError,
17
15
  )
18
16
  from dataops_sdk.schemas import (
19
17
  DEFAULT_META_DATA_TYPE,
@@ -0,0 +1,87 @@
1
+ """指标服务."""
2
+
3
+ from collections.abc import Mapping, Sequence
4
+
5
+ from dataops_sdk.schemas import Meta, MetaBase, MetaType
6
+ from dataops_sdk.schemas.query import PageParam, SqlQueryParam
7
+ from dataops_sdk.services.meta import release_list_get_by_code, release_list_list
8
+ from dataops_sdk.session import get_session, vaild_respone
9
+ from dataops_sdk.utils import filter_nodes_by_pattern
10
+ from dataops_sdk.utils.utils import encrypt_body
11
+ from pydantic import JsonValue
12
+ from pydantic_core import to_json
13
+
14
+ __all__ = ["service_list_metrics", "service_get_metrics"]
15
+
16
+
17
+ def service_list_metrics(query: str | None = None) -> list[MetaBase]:
18
+ """列出指标(可选正则过滤).
19
+
20
+ Args:
21
+ query: 正则表达式,匹配 NAME / TITLE / REMARK / DIGEST
22
+
23
+ Returns:
24
+ MetaBase 对象列表
25
+
26
+ Raises:
27
+ DataOpsError: API 请求失败时
28
+ AuthenticationError: 未认证时
29
+ """
30
+ nodes = release_list_list(MetaType.METRICS)
31
+ if query:
32
+ nodes = filter_nodes_by_pattern(nodes, query, include_digest=True)
33
+ return nodes
34
+
35
+
36
+ def service_get_metrics(code: str) -> Meta[Mapping[str, JsonValue]]:
37
+ """获取指标详情.
38
+
39
+ Args:
40
+ code: 指标编码
41
+
42
+ Returns:
43
+ 指标元数据。`meta.data` 结构详见后端指标定义。
44
+
45
+ Raises:
46
+ NotFoundError: 找不到对应指标时.
47
+ DataOpsError: API 返回错误时.
48
+ AuthenticationError: 未认证或认证失败时.
49
+ """
50
+ return release_list_get_by_code(MetaType.METRICS, code)
51
+
52
+
53
+ def service_get_metrics_data_by_code(
54
+ code: str,
55
+ page_param: PageParam | None = None,
56
+ query_param: SqlQueryParam | None = None,
57
+ dimensions: Sequence[str] | None = None,
58
+ ) -> list[dict[str, JsonValue]]:
59
+ """获取指标实际数据.
60
+
61
+ Args:
62
+ code: 指标编码
63
+ page_param: 分页参数
64
+ query_param: 查询参数
65
+ dimensions: 维度字段名列表
66
+
67
+ Examples:
68
+ 查询 2026-04-18 的光缆数量
69
+ >>> data-ops-cli metrics data 1777544300561_98429 -c '{"name":"d_cycle_time","value":"2026-04-18"}'
70
+ 按照统计日期维度查看光缆数量
71
+ >>> data-ops-cli metrics data 1777544300561_98429 -d d_cycle_time
72
+ """
73
+ dimensions_body = None
74
+ if dimensions:
75
+ dimensions_body = [{"name": dimension} for dimension in dimensions]
76
+ body = {
77
+ "type": MetaType.METRICS,
78
+ "code": code,
79
+ "queryParam": query_param,
80
+ "pageParam": page_param,
81
+ "count": False,
82
+ "dimensions": dimensions_body,
83
+ }
84
+ with get_session() as session:
85
+ resp = session.post("/data/metrics/view/findData", content=to_json(encrypt_body(body)))
86
+ resp_body = vaild_respone(resp, check_data=True, _class=list[dict[str, JsonValue]])
87
+ return resp_body.data
@@ -7,12 +7,29 @@
7
7
  """
8
8
 
9
9
  from dataops_sdk.schemas import MetaBase, MetaType, ReportMetaData
10
- from dataops_sdk.services import release_list_get_by_code, release_list_list
10
+ from dataops_sdk.services import (
11
+ get_group_by_sapce,
12
+ release_list_get_by_code,
13
+ release_list_list,
14
+ )
11
15
  from dataops_sdk.utils import filter_nodes_by_pattern
12
16
 
13
17
  __all__ = ["service_get_report", "service_list_reports"]
14
18
 
15
19
 
20
+ def servive_tree_report(space_code: str = "report"):
21
+ """获取卡片树结构.
22
+
23
+ Returns:
24
+ 卡片树结构
25
+
26
+ Raises:
27
+ DataOpsError: API 请求失败时
28
+ AuthenticationError: 未认证时
29
+ """
30
+ return get_group_by_sapce(space_code, MetaType.REPORT)
31
+
32
+
16
33
  def service_list_reports(query: str | None = None) -> list[MetaBase]:
17
34
  """列出文档(可选正则过滤).
18
35
 
@@ -32,7 +49,7 @@ def service_list_reports(query: str | None = None) -> list[MetaBase]:
32
49
  return nodes
33
50
 
34
51
 
35
- def service_get_report(code: str) -> ReportMetaData:
52
+ def service_get_report(code: str):
36
53
  """读取文档内容并渲染为 Markdown.
37
54
 
38
55
  Args:
@@ -278,6 +278,7 @@ def service_skill_upload(
278
278
  file_path: str | Path,
279
279
  sub_type: MetaSkillSubType,
280
280
  title: str | None = None,
281
+ group_name: str | None = None,
281
282
  ref_node_id: str | None = None,
282
283
  ref_type: str | None = None,
283
284
  ) -> dict:
@@ -310,6 +311,8 @@ def service_skill_upload(
310
311
  form_data["refNodeId"] = ref_node_id
311
312
  if ref_type:
312
313
  form_data["refType"] = ref_type
314
+ if group_name:
315
+ form_data["groupName"] = group_name
313
316
 
314
317
  with (
315
318
  open(path, "rb") as f,
@@ -16,6 +16,7 @@ from dataops_sdk.schemas import (
16
16
  SqlQueryParam,
17
17
  WidgetMetaData,
18
18
  )
19
+ from dataops_sdk.services.group import get_group_by_name
19
20
  from dataops_sdk.services.meta import (
20
21
  release_list_get_by_code,
21
22
  release_list_list,
@@ -26,6 +27,19 @@ from dataops_sdk.utils import encrypt_body
26
27
  from pydantic_core import to_json
27
28
 
28
29
 
30
+ def servive_tree_widget():
31
+ """获取卡片树结构.
32
+
33
+ Returns:
34
+ 卡片树结构
35
+
36
+ Raises:
37
+ DataOpsError: API 请求失败时
38
+ AuthenticationError: 未认证时
39
+ """
40
+ return get_group_by_name(MetaType.WIDGET)
41
+
42
+
29
43
  def service_list_widgets(sub_types: list[str] | None = None) -> list[MetaBase]:
30
44
  """搜索卡片列表.
31
45
 
@@ -5,14 +5,13 @@ from contextvars import ContextVar
5
5
  from typing import IO, Any, BinaryIO, Literal, overload
6
6
 
7
7
  import httpx2
8
- from pydantic import JsonValue, TypeAdapter, ValidationError
9
- from pydantic_core import from_json, to_json
10
-
11
8
  from dataops_sdk.constants import APPLICATION_FILE, USER_INFO_FILE
12
9
  from dataops_sdk.exceptions import AuthenticationError, DataOpsError
13
10
  from dataops_sdk.schemas import Application, DataOpsResponse, UserInfo
14
11
  from dataops_sdk.schemas.common import DataVar
15
12
  from dataops_sdk.utils import get_work_dir
13
+ from pydantic import JsonValue, TypeAdapter, ValidationError
14
+ from pydantic_core import from_json, to_json
16
15
 
17
16
  __all__ = [
18
17
  "set_request_auth",
@@ -223,7 +222,7 @@ def get_headers(strict: bool = True) -> dict[str, str]:
223
222
 
224
223
  # 降级:原有的 CLI/环境变量/file 认证逻辑
225
224
  fmind_auth_headers = os.getenv("FMIND_AUTH_HEADERS", None)
226
- if fmind_auth_headers is not None:
225
+ if fmind_auth_headers:
227
226
  headers = from_json(fmind_auth_headers)
228
227
  assert isinstance(headers, dict), "FMIND_AUTH_HEADERS must be a JSON object string"
229
228
  return headers
@@ -437,7 +436,7 @@ def post_multipart(
437
436
  @overload
438
437
  def vaild_respone(
439
438
  respone: httpx2.Response, check_data: Literal[False] = False, *, _class: None = None
440
- ) -> DataOpsResponse: ...
439
+ ) -> DataOpsResponse[JsonValue | None]: ...
441
440
 
442
441
 
443
442
  @overload
@@ -478,7 +477,7 @@ def vaild_respone(
478
477
  if check_data and response_body_json.get("data") is None:
479
478
  raise DataOpsError(f"返回数据为空, 错误消息: {response_body_json.get('msg')}")
480
479
  response_body = (
481
- DataOpsResponse.model_validate(response_body_json)
480
+ DataOpsResponse[JsonValue | None].model_validate(response_body_json)
482
481
  if _class is None
483
482
  else DataOpsResponse[_class].model_validate(response_body_json)
484
483
  )
@@ -6,7 +6,7 @@
6
6
 
7
7
  import re
8
8
  from base64 import b64decode, b64encode
9
- from collections.abc import Iterator, Mapping
9
+ from collections.abc import Mapping, Sequence
10
10
  from copy import deepcopy
11
11
  from os import PathLike
12
12
  from pathlib import Path
@@ -14,11 +14,11 @@ from typing import Any, Literal, Protocol, TypeVar, cast
14
14
 
15
15
  from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
16
16
  from cryptography.hazmat.primitives.padding import PKCS7
17
+ from dataops_sdk.constants import DEFAULT_SECRET_KEY
18
+ from dataops_sdk.schemas.meta import MetaBase
17
19
  from pydantic import BaseModel, JsonValue
18
20
  from pydantic_core import from_json, to_json
19
21
 
20
- from dataops_sdk.constants import DEFAULT_SECRET_KEY
21
-
22
22
  __all__ = [
23
23
  "filter_nodes_by_pattern",
24
24
  "get_work_dir",
@@ -28,24 +28,12 @@ __all__ = [
28
28
  ]
29
29
 
30
30
 
31
- class SearchableNode(Protocol):
32
- """Protocol for nodes that support regex search on name/title/remark/digest."""
33
-
34
- name: str
35
- title: str
36
- remark: str | None
37
- digest: str | None
38
-
39
-
40
- T = TypeVar("T", bound=SearchableNode)
41
-
42
-
43
31
  def filter_nodes_by_pattern(
44
- nodes: Iterator[T],
32
+ nodes: Sequence[MetaBase],
45
33
  query: str,
46
34
  *,
47
35
  include_digest: bool = False,
48
- ) -> list[T]:
36
+ ) -> list[MetaBase]:
49
37
  """按正则表达式过滤节点,匹配 NAME、TITLE、REMARK 以及可选的 DIGEST 字段。
50
38
 
51
39
  Args:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataops-sdk
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Python SDK for the DataOps platform.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -59,6 +59,7 @@ src/dataops_sdk/services/data_table.py
59
59
  src/dataops_sdk/services/dataset.py
60
60
  src/dataops_sdk/services/datasource.py
61
61
  src/dataops_sdk/services/dict_.py
62
+ src/dataops_sdk/services/group.py
62
63
  src/dataops_sdk/services/hazard.py
63
64
  src/dataops_sdk/services/meta.py
64
65
  src/dataops_sdk/services/metrics.py
@@ -1,46 +0,0 @@
1
- """分组节点 (GroupNode) Schema 定义.
2
-
3
- 用于表示数据源目录树中的分组节点,包含节点的基本信息
4
- 和层级关系。
5
- """
6
-
7
- from typing import Annotated
8
-
9
- from pydantic import AliasChoices, BaseModel, Field
10
-
11
-
12
- class GroupNode(BaseModel):
13
- """分组节点模型.
14
-
15
- 用于表示数据源目录树中的分组节点,包含节点的基本信息
16
- 和层级关系。
17
-
18
- Attributes:
19
- code: 节点编码/ID(来自后端 ``id``)。
20
- type: 节点类型。
21
- subType: 子类型。
22
- name: 节点名称。
23
- label: 中文名称。
24
- remark: 备注信息。
25
- params: 扩展参数映射。
26
- children: 子节点列表。
27
- """
28
-
29
- code: Annotated[str, Field(description="节点", validation_alias=AliasChoices("id"))]
30
- type: Annotated[str, Field(description="类型")]
31
- subType: Annotated[
32
- str | None,
33
- Field(
34
- description="子类型",
35
- validation_alias=AliasChoices("subType", "sub_type"),
36
- exclude=True,
37
- ),
38
- ]
39
- name: Annotated[str, Field(description="名称")]
40
- label: Annotated[str, Field(description="中文名称")]
41
- remark: Annotated[str | None, Field(description="备注")]
42
- params: Annotated[
43
- dict[str, str | int | float | bool | None] | None,
44
- Field(description="参数", exclude=True),
45
- ]
46
- children: Annotated[list["GroupNode"] | None, Field(description="子节点")]
@@ -1,53 +0,0 @@
1
- """指标服务.
2
-
3
- 提供指标 (METRICS) 实体的列表与详情查询:
4
-
5
- - :func:`service_list_metrics` 调用 ``release_list_list`` 全量拉取,再按正则过滤.
6
- - :func:`service_get_metrics` 调用 ``release_list_get_by_code`` 获取单个指标的 Meta.
7
- """
8
-
9
- from collections.abc import Mapping
10
-
11
- from pydantic import JsonValue
12
-
13
- from dataops_sdk.schemas import Meta, MetaBase, MetaType
14
- from dataops_sdk.services.meta import release_list_get_by_code, release_list_list
15
- from dataops_sdk.utils import filter_nodes_by_pattern
16
-
17
- __all__ = ["service_list_metrics", "service_get_metrics"]
18
-
19
-
20
- def service_list_metrics(query: str | None = None) -> list[MetaBase]:
21
- """列出指标(可选正则过滤).
22
-
23
- Args:
24
- query: 正则表达式,匹配 NAME / TITLE / REMARK / DIGEST
25
-
26
- Returns:
27
- MetaBase 对象列表
28
-
29
- Raises:
30
- DataOpsError: API 请求失败时
31
- AuthenticationError: 未认证时
32
- """
33
- nodes = release_list_list(MetaType.METRICS)
34
- if query:
35
- nodes = filter_nodes_by_pattern(nodes, query, include_digest=True)
36
- return nodes
37
-
38
-
39
- def service_get_metrics(code: str) -> Meta[Mapping[str, JsonValue]]:
40
- """获取指标详情.
41
-
42
- Args:
43
- code: 指标编码
44
-
45
- Returns:
46
- 指标元数据。`meta.data` 结构详见后端指标定义。
47
-
48
- Raises:
49
- NotFoundError: 找不到对应指标时.
50
- DataOpsError: API 返回错误时.
51
- AuthenticationError: 未认证或认证失败时.
52
- """
53
- return release_list_get_by_code(MetaType.METRICS, code)
File without changes
File without changes
File without changes