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,211 @@
1
+ """通用工具模块
2
+
3
+ 提供项目中常用的辅助函数,包括时间戳处理、路径工具、哈希计算、
4
+ 字符串解析、ID 生成和 JSON 打印等功能。
5
+ """
6
+
7
+ import hashlib
8
+ import os.path
9
+ import secrets
10
+ import string
11
+ import time
12
+ from io import BytesIO
13
+ from typing import Any
14
+
15
+ from pydantic_core import PydanticSerializationError, to_json
16
+
17
+
18
+ def get_unix_timestamp() -> int:
19
+ """获取当前 Unix 时间戳(毫秒级)。
20
+
21
+ Returns:
22
+ 当前时间的毫秒级 Unix 时间戳。
23
+
24
+ Example:
25
+ >>> timestamp = get_unix_timestamp()
26
+ >>> print(timestamp) # 例如: 1719123456789
27
+ """
28
+ return int(time.time() * 1e3)
29
+
30
+
31
+ def get_root_dir(*path: str) -> str:
32
+ """获取项目根目录或根目录下的指定路径。
33
+
34
+ Args:
35
+ path: 可选的相对路径,将与根目录拼接后返回。
36
+
37
+ Returns:
38
+ 项目根目录的绝对路径,或根目录下指定路径的绝对路径。
39
+
40
+ Example:
41
+ >>> get_root_dir()
42
+ '/path/to/python_container_service-package'
43
+ >>> get_root_dir('backend', 'utils')
44
+ '/path/to/python_container_service-package/utils'
45
+ """
46
+ root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
47
+ return root_dir if not path else os.path.join(root_dir, *path)
48
+
49
+
50
+ def get_log_dir() -> str:
51
+ """获取日志目录路径。
52
+
53
+ Returns:
54
+ 日志目录的绝对路径。
55
+
56
+ Example:
57
+ >>> get_log_dir()
58
+ '/path/to/project/logs'
59
+ """
60
+ return os.getenv("LOG_DIR", os.path.join(os.path.dirname(get_root_dir()), "logs"))
61
+
62
+
63
+ def get_log_path(name: str) -> str:
64
+ """获取日志文件的完整路径。
65
+
66
+ 自动为文件名添加 `.log` 后缀(如果尚未包含),并返回日志目录下的完整路径。
67
+
68
+ Args:
69
+ name: 日志文件名(不含后缀或含后缀均可)。
70
+
71
+ Returns:
72
+ 日志文件的完整绝对路径。
73
+
74
+ Example:
75
+ >>> get_log_path("app")
76
+ '/path/to/project/logs/app.log'
77
+ >>> get_log_path("error.log")
78
+ '/path/to/project/logs/error.log'
79
+ """
80
+ if not name.endswith(".log"):
81
+ name += ".log"
82
+ return os.path.join(get_log_dir(), name)
83
+
84
+
85
+ def calculate_file_hash(fp: BytesIO, chunk_size: int = 8192) -> str:
86
+ """计算二进制文件的 SHA-256 哈希值。
87
+
88
+ 采用分块读取方式计算文件哈希,适用于大文件场景,避免一次性加载整个文件到内存。
89
+ 计算完成后,文件指针会恢复到原始位置。
90
+
91
+ Args:
92
+ fp: 文件的 BytesIO 对象。
93
+ chunk_size: 每次读取的块大小(字节),默认为 8192。
94
+
95
+ Returns:
96
+ 文件的 SHA-256 哈希值(十六进制字符串)。
97
+
98
+ Raises:
99
+ IOError: 当文件读取发生错误时抛出。
100
+
101
+ Example:
102
+ >>> from io import BytesIO
103
+ >>> fp = BytesIO(b"hello world")
104
+ >>> calculate_file_hash(fp)
105
+ 'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'
106
+ """
107
+ hash_obj = hashlib.sha256()
108
+
109
+ try:
110
+ while chunk := fp.read(chunk_size):
111
+ hash_obj.update(chunk)
112
+ except OSError as e:
113
+ raise OSError(f"文件读取错误: {e}") from e
114
+ fp.seek(0)
115
+ return hash_obj.hexdigest()
116
+
117
+
118
+ def parse_unit_str(data: str) -> int:
119
+ """将带有单位后缀的字符串转换为整数。
120
+
121
+ 支持的单位:
122
+ - ``k`` - 千字节(1024)
123
+ - ``m`` - 兆字节(1024²)
124
+ - ``g`` - 吉字节(1024³)
125
+
126
+ 如果输入字符串没有单位后缀,则直接将其转换为整数。
127
+
128
+ Args:
129
+ data: 包含数字和可选单位后缀的字符串,大小写不敏感。
130
+
131
+ Returns:
132
+ 转换后的整数值。
133
+
134
+ Raises:
135
+ ValueError: 当输入格式无法解析时抛出。
136
+
137
+ Example:
138
+ >>> parse_unit_str("1024")
139
+ 1024
140
+ >>> parse_unit_str("64k")
141
+ 65536
142
+ >>> parse_unit_str("2m")
143
+ 2097152
144
+ >>> parse_unit_str("1g")
145
+ 1073741824
146
+ """
147
+ unit_map = {
148
+ "k": 1024,
149
+ "m": 1024**2,
150
+ "g": 1024**3,
151
+ }
152
+
153
+ data = data.lower()
154
+
155
+ if data.isdigit():
156
+ return int(data)
157
+
158
+ for unit, multiplier in unit_map.items():
159
+ if data.endswith(unit):
160
+ num_part = data[: -len(unit)]
161
+ return int(num_part) * multiplier
162
+
163
+ raise ValueError(f"Invalid data format: {data}")
164
+
165
+
166
+ def generate_slug_id(length: int = 10) -> str:
167
+ """生成随机字符串 ID。
168
+
169
+ 使用 ``secrets`` 模块生成密码学安全的随机字符串,包含字母和数字。
170
+
171
+ Args:
172
+ length: 生成字符串的长度,默认为 10。
173
+
174
+ Returns:
175
+ 随机生成的字符串 ID。
176
+
177
+ Example:
178
+ >>> generate_slug_id()
179
+ 'aB3xK9mQ2p'
180
+ >>> generate_slug_id(16)
181
+ 'xY7kL2pM9nQ4rT6w'
182
+ """
183
+ alphabet = string.ascii_letters + string.digits
184
+ return "".join(secrets.choice(alphabet) for _ in range(length))
185
+
186
+
187
+ def print_json(data: Any) -> None:
188
+ """打印 Pydantic 兼容的 JSON 格式数据。
189
+
190
+ 将数据序列化为 JSON 字符串并打印到标准输出。
191
+ 仅支持字典或 Pydantic 模型等可序列化对象。
192
+
193
+ Args:
194
+ data: 要打印的数据,必须为字典或可序列化为 JSON 的对象。
195
+
196
+ Example:
197
+ >>> print_json({"name": "test", "value": 123})
198
+ #
199
+ # {"name": "test", "value": 123}
200
+ """
201
+ if not isinstance(data, dict):
202
+ print("ERROR: data must be a dict or json serializable object.")
203
+ return
204
+ try:
205
+ json_str = to_json(data).decode("utf-8")
206
+ print()
207
+ print(json_str, end="")
208
+ except PydanticSerializationError as e:
209
+ print(f"ERROR in Serialization: {e}")
210
+ except Exception as e:
211
+ print(f"ERROR: {e}")
@@ -0,0 +1,120 @@
1
+ import re
2
+ from base64 import b64decode, b64encode
3
+ from collections.abc import Iterator, Mapping
4
+ from copy import deepcopy
5
+ from os import PathLike
6
+ from pathlib import Path
7
+ from typing import Literal, Protocol, TypeVar, cast
8
+
9
+ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
10
+ from cryptography.hazmat.primitives.padding import PKCS7
11
+ from pydantic import BaseModel, JsonValue
12
+ from pydantic_core import from_json, to_json
13
+
14
+ from dataops_sdk.constants import DEFAULT_SECRET_KEY
15
+
16
+
17
+ class SearchableNode(Protocol):
18
+ """Protocol for nodes that support regex search on name/title/remark/digest."""
19
+
20
+ NAME: str
21
+ TITLE: str
22
+ REMARK: str | None
23
+ DIGEST: str | None
24
+
25
+
26
+ T = TypeVar("T", bound=SearchableNode)
27
+
28
+
29
+ def filter_nodes_by_pattern(
30
+ nodes: Iterator[T],
31
+ query: str,
32
+ *,
33
+ include_digest: bool = False,
34
+ ) -> list[T]:
35
+ """Filter nodes by regex matching on NAME, TITLE, REMARK, and optionally DIGEST.
36
+
37
+ Args:
38
+ nodes: Iterator of nodes to filter.
39
+ query: Regex pattern to search for.
40
+ include_digest: Whether to also search in the DIGEST field.
41
+
42
+ Yields:
43
+ Nodes where the pattern matches NAME, TITLE, REMARK, or DIGEST (if include_digest=True).
44
+ """
45
+ pattern = re.compile(query)
46
+
47
+ return [
48
+ node
49
+ for node in nodes
50
+ if (
51
+ pattern.search(node.NAME)
52
+ or pattern.search(node.TITLE)
53
+ or (node.REMARK and pattern.search(node.REMARK))
54
+ or (include_digest and node.DIGEST and pattern.search(node.DIGEST))
55
+ )
56
+ ]
57
+
58
+
59
+ def get_work_dir(*args: str | PathLike[str]):
60
+ work_dir = Path.home().joinpath(".data-ops-cli")
61
+ if not work_dir.exists():
62
+ work_dir.mkdir()
63
+ return work_dir.joinpath(*args)
64
+
65
+
66
+ def encrypt_body(body: Mapping[str, JsonValue] | BaseModel | bytes):
67
+ if body is None:
68
+ raise ValueError("body is None")
69
+ if not isinstance(body, bytes):
70
+ body = to_json(body)
71
+ return {"__base64": f"FMIND-{b64encode(body).decode('utf-8')}"}
72
+
73
+
74
+ def decrypt_body(body: dict[Literal["__base64"], str]) -> Mapping[str, JsonValue]:
75
+ """
76
+ 解密请求体
77
+
78
+ Args:
79
+ body (dict[Literal["__base64"], str]): 加密后的请求体,包含一个 "__base64" 键,其值为原始请求体的 Base64 编码字符串
80
+
81
+ Returns:
82
+ JsonValue: 原始请求体
83
+ """
84
+ if "__base64" not in body:
85
+ raise ValueError("Invalid body format: missing '__base64' key")
86
+ base64_str = body["__base64"]
87
+ if base64_str.startswith("FMIND-"):
88
+ base64_str = base64_str[6:]
89
+ bytes_body = b64decode(base64_str)
90
+ return cast(Mapping[str, JsonValue], from_json(bytes_body))
91
+
92
+
93
+ def encrypt_hex(value: str, secret_key: str = DEFAULT_SECRET_KEY) -> str:
94
+ """AES-ECB 加密(PKCS7 padding),匹配 CryptoJS 参考实现。
95
+
96
+ Args:
97
+ value: 要加密的明文字符串
98
+ secret_key: AES 密钥(16字节),默认使用内置密钥
99
+
100
+ Returns:
101
+ 小写十六进制密文字符串
102
+ """
103
+ key = secret_key.encode("utf-8")
104
+ srcs = value.encode("utf-8")
105
+ padder = PKCS7(128).padder()
106
+ padded_data = padder.update(srcs) + padder.finalize()
107
+ cipher = Cipher(algorithms.AES(key), modes.ECB())
108
+ encryptor = cipher.encryptor()
109
+ ciphertext = encryptor.update(padded_data) + encryptor.finalize()
110
+ return ciphertext.hex()
111
+
112
+
113
+ def deep_merge(src: dict[str, JsonValue], dst: dict[str, JsonValue]) -> dict[str, JsonValue]:
114
+ result = deepcopy(src) # 避免修改原字典
115
+ for k, v in dst.items():
116
+ if k in result and isinstance(result[k], dict) and isinstance(v, dict):
117
+ result[k] = deep_merge(cast(dict, result[k]), v)
118
+ else:
119
+ result[k] = v
120
+ return result
@@ -0,0 +1,25 @@
1
+ Metadata-Version: 2.4
2
+ Name: dataops-sdk
3
+ Version: 0.3.0
4
+ Summary: Python SDK for the DataOps platform.
5
+ Requires-Python: >=3.11
6
+ Requires-Dist: pydantic<3,>=2
7
+ Requires-Dist: pydantic-core
8
+ Requires-Dist: pydantic-settings>=2.14.2
9
+ Requires-Dist: httpx2>=2.5.0
10
+ Requires-Dist: jinja2>=3.1.6
11
+ Requires-Dist: markdown-it-py<4,>=3
12
+ Requires-Dist: cryptography>=49.0.0
13
+ Provides-Extra: runner
14
+ Requires-Dist: paramiko>4; extra == "runner"
15
+ Requires-Dist: pandas; extra == "runner"
16
+ Requires-Dist: sqlalchemy; extra == "runner"
17
+ Requires-Dist: pymysql; extra == "runner"
18
+ Requires-Dist: doris-python>=1.0.3; extra == "runner"
19
+ Requires-Dist: oracledb~=4.0.1; extra == "runner"
20
+ Requires-Dist: neo4j; extra == "runner"
21
+ Requires-Dist: kafka-python>3; extra == "runner"
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest; extra == "dev"
24
+ Requires-Dist: pytest-mock; extra == "dev"
25
+ Requires-Dist: ruff; extra == "dev"
@@ -0,0 +1,79 @@
1
+ dataops_sdk/__init__.py,sha256=9jaAs5PlNtXQclWNn42nTgBmQjUndOmSpbgvw1PRP-g,2746
2
+ dataops_sdk/constants.py,sha256=lxaeTspOmFp8IdoHOCtUtFlp5ElE6jRgh-LvEgys6_Q,175
3
+ dataops_sdk/exceptions.py,sha256=GnNqDlMfgjMiL0Kp-H0KZMDJdRAckG6kd3V-NJiugFg,575
4
+ dataops_sdk/session.py,sha256=xUBBmWj5Qy2T0SAr8U6Pq3zc0T6bZ5s6Ab72LZVDSMU,9638
5
+ dataops_sdk/runner/__init__.py,sha256=nj-vZDrG8yUdYfc7Ck9Mkm3VvgZ8ctwNtxBtucsRKXk,1016
6
+ dataops_sdk/runner/datasource_factory.py,sha256=E0vwYWtks-SGBudTyNgYJjH6InwtbjZ8QZwoseNFBzs,3184
7
+ dataops_sdk/runner/schemas/nacos/__init__.py,sha256=yXsULXK8G5IiZz2c26yrVhtvflbDLwgTkajm74YAA10,146
8
+ dataops_sdk/runner/schemas/nacos/config.py,sha256=pHrwJRoDGQNuqMVoQnkmNF0ENqUqcmUvp-j3Q_YgTx0,1326
9
+ dataops_sdk/runner/schemas/nacos/constants.py,sha256=034uKkGHqlfcOzk1CvG92OhBZM_5oBx1WHfZGzOuE7g,4262
10
+ dataops_sdk/runner/schemas/nacos/instance.py,sha256=jRHSYLcOLSdVEzS6ol7z1Ta7kK7E5pSu199eMSV1kMo,3974
11
+ dataops_sdk/runner/schemas/nacos/nacos_exception.py,sha256=gNYYNe8jD6rJKBM6g_FdgqhB3XiJEQLA4P-AeIKgSa0,714
12
+ dataops_sdk/runner/schemas/nacos/naming_param.py,sha256=JAKdLxXgvIj_o9-zmugUUFOFas3ANV9cjDAAAuQknjM,3223
13
+ dataops_sdk/runner/schemas/nacos/naming_request.py,sha256=zQwBI_wWyZ3Qje_rBYlqkUpSMq_lkEo2q5Fvnoa_e3I,2814
14
+ dataops_sdk/runner/schemas/nacos/naming_response.py,sha256=P58H-xdVJ7DVB7fjxlN3nXUy1OShr-0D-be5ueQ5FgI,1384
15
+ dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py,sha256=-fieuddYrc-A3T5jcgbmUpFAHWKlwbPXzXI4i8lgfsE,313
16
+ dataops_sdk/runner/schemas/nacos/service.py,sha256=-jOgk94isl96qoo69ikWdD1Yw9g2FnbzhAeb7phJCa4,3887
17
+ dataops_sdk/runner/utils/__init__.py,sha256=HPvJcg806wbkOrizD1DYMAISCgCjZgREcxvvphCz9EI,1072
18
+ dataops_sdk/runner/utils/common.py,sha256=Sz1n4ZixbmSME1KFZGjGYK2IwDmxqIre4BK3a3PCR3g,6325
19
+ dataops_sdk/runner/utils/dbConn_base.py,sha256=N6fAaJYOmH_GksyQ2Q0kaQtFHsb8z2w4oYK_WrPr3Ls,8206
20
+ dataops_sdk/runner/utils/dbConn_sync.py,sha256=zOUFDjdi7Qk7x0BtzArDkHd-yXpk9fYC6LWyW423KYU,14718
21
+ dataops_sdk/runner/utils/duckdb_manager.py,sha256=xIREgkx6hcAbt6cYSTEHfGPGu7QgZsCwQrU4u2Vb1ng,6902
22
+ dataops_sdk/runner/utils/file_transfer_base.py,sha256=L6ogcrCKZteB0LMngIi1z8RfiQCyzPPhxUFzCsOVpE4,8156
23
+ dataops_sdk/runner/utils/ftp_file_transfer.py,sha256=pSnx0zdeiFN54wiE3ey_exRzhsvfVVn7sCrvh8G-5Xk,7685
24
+ dataops_sdk/runner/utils/log.py,sha256=IVCwLBlAyxZVSKPp2XJ85VAmdKY_ZtpY-JmtJj8hHms,1508
25
+ dataops_sdk/runner/utils/nacos.py,sha256=1M9AXKCLc-EJqbXMntf6b5P4b06nMdhnDXniSPe-JWI,2987
26
+ dataops_sdk/runner/utils/neo4j_sync.py,sha256=rWv2gRSJRPjqO3pRTkPkguU29xG1R_kzqCRuwCw5YNs,6730
27
+ dataops_sdk/runner/utils/queue_base.py,sha256=FHNPRZQZGRZP22VZzK5aHHL4i5heb4KPkfQEMFKDnQU,6673
28
+ dataops_sdk/runner/utils/queue_kafka.py,sha256=VK21eWOa-VIV4LXMwlh-e9ysDvFX9_9_A5C0Zc7x2yo,4903
29
+ dataops_sdk/runner/utils/sftp_file_transfer.py,sha256=jOd_ahePwZE3GtKx76a19zaugXP-O-MXo3UEiSYlTkQ,7854
30
+ dataops_sdk/schemas/__init__.py,sha256=IT1jH9O_YBem8zLRx_EvXDN6XRAcTD9gczZ03lD3pV8,978
31
+ dataops_sdk/schemas/alarm.py,sha256=YE6PyOhtYoKTXTeQgg15VjhTxdeXvBUJbQWKMjT8xzo,1507
32
+ dataops_sdk/schemas/api.py,sha256=x522Vf2leZnn8-bfllGoldy59zrS4a-c06B0uGQhfhw,1477
33
+ dataops_sdk/schemas/data_table.py,sha256=42r7HhntUnBSU9grP2_pRkTFhKdXiCmNG9lVNOuplmc,16544
34
+ dataops_sdk/schemas/datasource.py,sha256=jJkpaUu4SOlK7SgRZboUhcgxgHC2gCzJNX4yxhdN8-A,953
35
+ dataops_sdk/schemas/dict_.py,sha256=Y0ebyXYCw4vBhBgHyPXCz_4yVALAxMkQQlxSQsjJNs0,394
36
+ dataops_sdk/schemas/enums.py,sha256=FbWZDK7mT7HdIYme9WZzZEfJFRXTcNdVemjjY8W6nXA,2196
37
+ dataops_sdk/schemas/group.py,sha256=TvH0nsrGz1DpftrLAPpHqQuhMNgu0e5gu_Og3PiVnBc,1306
38
+ dataops_sdk/schemas/hazard.py,sha256=5sfAX5_iRK0yIQs4P88B49Li0ID02FPZkf5t5KxmY6w,5424
39
+ dataops_sdk/schemas/meta.py,sha256=NSVcb_te0Z6NRdGn13djm7LOrzqwE2jwMnsnABXQXl8,6413
40
+ dataops_sdk/schemas/query.py,sha256=48KtMhCK0DRnVrfE3a-jH0aobx7AXUWmycXS8IVOtvs,6568
41
+ dataops_sdk/schemas/report.py,sha256=OMR-CmYaDwpfYlfoXE8rpuyZHnvnSITL1umwEkx1XiA,520
42
+ dataops_sdk/schemas/skill.py,sha256=tQHjRIMZmGVUEABkYo5myibpQuqTPNEGizcIpPfmOHY,2296
43
+ dataops_sdk/schemas/table.py,sha256=w7iJp9Jhesn_rdm2RElz4ef66-TKncKo6nZSfPRzEJ0,2491
44
+ dataops_sdk/schemas/user.py,sha256=mAPgLCCKeoC7qvOj6TOSC2xI3OrL7P5eNOGy4R3RVyw,2522
45
+ dataops_sdk/schemas/widget.py,sha256=0LMXf5JitH4bLy1ciyTh337QRxoekh4tsUyoCgFMxHU,25420
46
+ dataops_sdk/schemas/workflow.py,sha256=wDFkfWon7-E1zdklm9Zw5JRREkU5oYJPvrBa8pkHlls,2063
47
+ dataops_sdk/services/__init__.py,sha256=-nVvfQ30e8KSWq0aMBvj3UMgFDML1jyQGSUdtr6WGcA,3308
48
+ dataops_sdk/services/alarm.py,sha256=0EpFK-Lrs15QRjaV7u3wXBmE5qVd8n1OkSRFYZGAXMs,9595
49
+ dataops_sdk/services/api.py,sha256=q9LeLbdGISmnJ6Exwq20BgJriYiuObv9xgZgg8rDRQE,793
50
+ dataops_sdk/services/auth.py,sha256=OJKZdcifkUq0HOZfjKDyRIDQE8Lgf43klZc2epcDVrE,3730
51
+ dataops_sdk/services/data_table.py,sha256=RQUWcw3LKZ3xKENF0dMRzkHk2Q5rVz-gpojtAM3tkps,13501
52
+ dataops_sdk/services/dataset.py,sha256=nwfKU3_7AYkMRHmFb03fkT8hP4m6n-xBq3Vj3OljWSw,3601
53
+ dataops_sdk/services/datasource.py,sha256=wqd3dN5s5-gnYHEiyipZQgx9la0cJIPKZeiKWJWLbjI,2441
54
+ dataops_sdk/services/dict_.py,sha256=XqLzGsX05UMoX_S3QQZ3qiD6QNYOzQbB90l7qeGiQLc,1796
55
+ dataops_sdk/services/hazard.py,sha256=m76RCmRs6tmnwbwL4omPnxIAX_g5sCOhACWKr8ur1A4,8119
56
+ dataops_sdk/services/meta.py,sha256=xEYq2ysM0NflrFSpbIlHxgn1enyGT_vAjwC5lNoBKW4,17678
57
+ dataops_sdk/services/metrics.py,sha256=-Ow0GpKZVT0pP3Pel4laQuM8rvw9F2qcH64mcDp4K84,1143
58
+ dataops_sdk/services/ref.py,sha256=CszNjBQOtcx3dJzNd867I_j55ozR1lrqnGWOIwFaAJs,1931
59
+ dataops_sdk/services/report.py,sha256=SAKQWrr8hfW3jcDIdk3JsxIkA5FFWMFvdgaYRDxhfn0,1051
60
+ dataops_sdk/services/skill.py,sha256=CMZF32Ud9T7vPM0xtGxPuzMhq1C8NbdIqUQnwLlwb7k,8741
61
+ dataops_sdk/services/table.py,sha256=F7WOgCVGrOevZXJLHSvLFrOtOPPqzIGqVygZ-fRokLQ,9758
62
+ dataops_sdk/services/widget.py,sha256=-PAy67FyhMe1DHKRyvGCNNcHmonaU4yojQqB-mkwGQQ,4048
63
+ dataops_sdk/services/workflow.py,sha256=DM1LNGaps3DUSyzcyohZoSoJQrbu07aBBOzkzm1dpH0,3223
64
+ dataops_sdk/tiptap/__init__.py,sha256=Zvsx9YpCplfeWoabKybz7MWLO6mQfAlBtODhhfi0fN0,612
65
+ dataops_sdk/tiptap/builder.py,sha256=_1VPZnX9IBFU6nkj9mjhFWSYmiNPgBSkaD-H1Ln1ifM,2245
66
+ dataops_sdk/tiptap/constants.py,sha256=mkD8wRxKxPyvGl7V-csl8W4VRehfuUYJsm_2lWTS2Xk,3055
67
+ dataops_sdk/tiptap/markdown_parser.py,sha256=YQAUHKlq_XrkSINMXPyPwxlFBUvhZK6YOs0kXtDKOWA,12130
68
+ dataops_sdk/tiptap/models.py,sha256=s4oHcUNBiBC2PWFYfsoYEdn0tVqowAOrmCC9BJlBN3w,819
69
+ dataops_sdk/tiptap/parse_utils.py,sha256=F74m7B4081EbiJR1XXJfFz2nn1Is0DqyDe1taFKBgZ4,24955
70
+ dataops_sdk/tiptap/render_utils.py,sha256=omu2M73KdXDM9Y6Ss4arvm18ekHLiznEyHPSDM4EiBI,21021
71
+ dataops_sdk/tiptap/renderers.py,sha256=qHAeYZeJf1Wip0svKtmy-28uFSeoTELzh3iE8bAQwaw,1235
72
+ dataops_sdk/tiptap/tool.py,sha256=CTq_iLHj0SMcRxJx1QATXDWJi_L5MIS53VKxpz5pz6c,20268
73
+ dataops_sdk/utils/__init__.py,sha256=Trxx0efdfPGprbqrdIGPRzk6QII4Jhv1O2Os9MOMiHQ,271
74
+ dataops_sdk/utils/common.py,sha256=ZTrVO8r_cdzQmDEPk1FUzCJSMjmfxnG3eDXmSxEdVmE,5742
75
+ dataops_sdk/utils/utils.py,sha256=J8sncXh-zHEgs-uuWDugXiF-g8hvH_M0YTp5y3au1Mc,3737
76
+ dataops_sdk-0.3.0.dist-info/METADATA,sha256=7aizHPXtm3UuFTkJXbQM4_rGI9waD0QjxYTd8ptM8ZU,881
77
+ dataops_sdk-0.3.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
78
+ dataops_sdk-0.3.0.dist-info/top_level.txt,sha256=3HhuuDSR-x4BEXEFTM8jiO5ShQbyduaD58ws-tfzkTc,12
79
+ dataops_sdk-0.3.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ dataops_sdk