dataops-sdk 0.3.1__tar.gz → 0.3.2__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 (99) hide show
  1. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/PKG-INFO +2 -2
  2. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/pyproject.toml +1 -1
  3. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/__init__.py +8 -1
  4. dataops_sdk-0.3.2/src/dataops_sdk/constants.py +15 -0
  5. dataops_sdk-0.3.2/src/dataops_sdk/exceptions.py +45 -0
  6. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/__init__.py +3 -5
  7. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/datasource_factory.py +1 -2
  8. dataops_sdk-0.3.2/src/dataops_sdk/runner/schemas/nacos/__init__.py +11 -0
  9. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/schemas/nacos/config.py +12 -10
  10. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/schemas/nacos/constants.py +9 -0
  11. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/schemas/nacos/instance.py +33 -9
  12. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +6 -1
  13. dataops_sdk-0.3.2/src/dataops_sdk/runner/schemas/nacos/naming_param.py +140 -0
  14. dataops_sdk-0.3.2/src/dataops_sdk/runner/schemas/nacos/naming_request.py +148 -0
  15. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +34 -3
  16. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +7 -0
  17. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/schemas/nacos/service.py +41 -10
  18. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/__init__.py +10 -10
  19. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/common.py +68 -17
  20. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/dbConn_base.py +52 -61
  21. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/dbConn_sync.py +186 -108
  22. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/duckdb_manager.py +100 -31
  23. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/file_transfer_base.py +65 -80
  24. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +2 -3
  25. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/nacos.py +20 -21
  26. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/neo4j_sync.py +72 -49
  27. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/queue_base.py +40 -48
  28. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/queue_kafka.py +24 -24
  29. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +31 -34
  30. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/__init__.py +6 -0
  31. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/alarm.py +46 -0
  32. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/api.py +24 -2
  33. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/data_table.py +249 -31
  34. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/datasource.py +30 -1
  35. dataops_sdk-0.3.2/src/dataops_sdk/schemas/dict_.py +32 -0
  36. dataops_sdk-0.3.2/src/dataops_sdk/schemas/enums.py +211 -0
  37. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/group.py +14 -8
  38. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/hazard.py +39 -1
  39. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/meta.py +116 -1
  40. dataops_sdk-0.3.2/src/dataops_sdk/schemas/query.py +467 -0
  41. dataops_sdk-0.3.2/src/dataops_sdk/schemas/report.py +42 -0
  42. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/skill.py +32 -4
  43. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/table.py +73 -0
  44. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/user.py +51 -1
  45. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/widget.py +469 -57
  46. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/schemas/workflow.py +44 -6
  47. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/alarm.py +116 -0
  48. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/api.py +16 -0
  49. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/auth.py +22 -2
  50. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/data_table.py +34 -1
  51. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/dataset.py +37 -2
  52. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/datasource.py +54 -1
  53. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/dict_.py +5 -0
  54. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/meta.py +12 -20
  55. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/metrics.py +12 -1
  56. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/ref.py +28 -1
  57. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/report.py +13 -0
  58. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/skill.py +11 -0
  59. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/table.py +71 -8
  60. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/workflow.py +41 -0
  61. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/session.py +150 -47
  62. dataops_sdk-0.3.2/src/dataops_sdk/tiptap/constants.py +248 -0
  63. dataops_sdk-0.3.2/src/dataops_sdk/tiptap/markdown_parser.py +892 -0
  64. dataops_sdk-0.3.2/src/dataops_sdk/tiptap/models.py +74 -0
  65. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/tiptap/parse_utils.py +159 -78
  66. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/tiptap/render_utils.py +53 -0
  67. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/tiptap/renderers.py +16 -8
  68. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/tiptap/tool.py +22 -1
  69. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/utils/__init__.py +7 -0
  70. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/utils/common.py +1 -1
  71. {dataops_sdk-0.3.1/src/dataops_sdk/runner → dataops_sdk-0.3.2/src/dataops_sdk}/utils/log.py +21 -7
  72. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/utils/utils.py +60 -16
  73. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk.egg-info/PKG-INFO +2 -2
  74. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk.egg-info/SOURCES.txt +1 -1
  75. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk.egg-info/requires.txt +1 -1
  76. dataops_sdk-0.3.1/src/dataops_sdk/constants.py +0 -6
  77. dataops_sdk-0.3.1/src/dataops_sdk/exceptions.py +0 -31
  78. dataops_sdk-0.3.1/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -5
  79. dataops_sdk-0.3.1/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -62
  80. dataops_sdk-0.3.1/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -84
  81. dataops_sdk-0.3.1/src/dataops_sdk/schemas/dict_.py +0 -13
  82. dataops_sdk-0.3.1/src/dataops_sdk/schemas/enums.py +0 -120
  83. dataops_sdk-0.3.1/src/dataops_sdk/schemas/query.py +0 -175
  84. dataops_sdk-0.3.1/src/dataops_sdk/schemas/report.py +0 -22
  85. dataops_sdk-0.3.1/src/dataops_sdk/tiptap/constants.py +0 -133
  86. dataops_sdk-0.3.1/src/dataops_sdk/tiptap/markdown_parser.py +0 -298
  87. dataops_sdk-0.3.1/src/dataops_sdk/tiptap/models.py +0 -43
  88. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/setup.cfg +0 -0
  89. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/__init__.py +0 -0
  90. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/hazard.py +0 -0
  91. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/services/widget.py +0 -0
  92. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/tiptap/__init__.py +0 -0
  93. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk/tiptap/builder.py +0 -0
  94. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
  95. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/src/dataops_sdk.egg-info/top_level.txt +0 -0
  96. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/tests/test_constants.py +0 -0
  97. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/tests/test_exceptions.py +0 -0
  98. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/tests/test_session.py +0 -0
  99. {dataops_sdk-0.3.1 → dataops_sdk-0.3.2}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataops-sdk
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Python SDK for the DataOps platform.
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: pydantic<3,>=2
@@ -8,7 +8,7 @@ Requires-Dist: pydantic-core
8
8
  Requires-Dist: pydantic-settings>=2.14.2
9
9
  Requires-Dist: httpx2>=2.5.0
10
10
  Requires-Dist: jinja2>=3.1.6
11
- Requires-Dist: markdown-it-py<4,>=3
11
+ Requires-Dist: markdown-it-py[plugins]
12
12
  Requires-Dist: cryptography>=49.0.0
13
13
  Provides-Extra: runner
14
14
  Requires-Dist: paramiko>4; extra == "runner"
@@ -13,7 +13,7 @@ dependencies = [
13
13
  "pydantic-settings>=2.14.2",
14
14
  "httpx2>=2.5.0",
15
15
  "jinja2>=3.1.6",
16
- "markdown-it-py>=3,<4",
16
+ "markdown-it-py[plugins]",
17
17
  "cryptography>=49.0.0",
18
18
  ]
19
19
 
@@ -1,3 +1,10 @@
1
+ """DataOps 平台 SDK.
2
+
3
+ 对外暴露子模块 ``runner``、``schemas``、``utils`` 以及 ``services`` 中的全部平台操作函数,
4
+ 供 ``data-ops-cli`` 命令行工具及外部调用方复用。可选的 ``runner`` extra 提供数据库与
5
+ Nacos 集成能力,未安装时仍可独立导入本包核心功能。
6
+ """
7
+
1
8
  from . import runner, schemas, utils
2
9
  from .services import ( # noqa: F401
3
10
  release_list_create,
@@ -89,4 +96,4 @@ from .services import ( # noqa: F401
89
96
  service_update_data_table_record_by_id_list,
90
97
  )
91
98
 
92
- __version__ = "0.3.1"
99
+ __version__ = "0.3.2"
@@ -0,0 +1,15 @@
1
+ """dataops_sdk 的全局常量定义.
2
+
3
+ 集中维护 SDK 内部使用的固定文件名、默认值等常量,便于在多个模块间共享:
4
+
5
+ - ``USER_INFO_FILE``:本地缓存用户信息(含 access_token / refresh_token)的文件名。
6
+ - ``APPLICATION_FILE``:本地缓存当前应用上下文(应用编码、版本等)的文件名。
7
+ - ``DEFAULT_SECRET_KEY``:未显式配置时用于本地凭据加密的内置密钥(仅用于本地持久化场景)。
8
+ """
9
+
10
+ from typing import Final
11
+
12
+ USER_INFO_FILE: Final[str] = "user_info.json"
13
+ APPLICATION_FILE: Final[str] = "application.json"
14
+
15
+ DEFAULT_SECRET_KEY: Final[str] = "e0XxEhkWSJcA6Aps"
@@ -0,0 +1,45 @@
1
+ """dataops_sdk 自定义异常层级.
2
+
3
+ 定义 SDK 与后端交互过程中可能抛出的异常类型。``DataOpsError`` 作为基类,聚合消息
4
+ 与可选的 HTTP 状态码;下层异常类用于在 SDK 与 CLI 中区分典型错误场景(资源缺失、
5
+ 认证失败、写入失败等),便于调用方按类型进行捕获与分支处理。
6
+ """
7
+
8
+
9
+ class DataOpsError(Exception):
10
+ """DataOps API 错误基类。"""
11
+
12
+ def __init__(self, message: str, status_code: int | None = None):
13
+ """初始化 DataOps 错误。
14
+
15
+ Args:
16
+ message: 人类可读的错误描述,会同时用于 ``args`` 与 ``str(exc)`` 输出。
17
+ status_code: 可选的 HTTP 状态码,便于上层根据响应码分类处理。
18
+ """
19
+ self.message = message
20
+ self.status_code = status_code
21
+ super().__init__(message)
22
+
23
+
24
+ class NotFoundError(DataOpsError):
25
+ """资源未找到。"""
26
+
27
+ pass
28
+
29
+
30
+ class AuthenticationError(DataOpsError):
31
+ """认证失败异常。"""
32
+
33
+ pass
34
+
35
+
36
+ class FailedToCreateError(DataOpsError):
37
+ """创建失败异常。"""
38
+
39
+ pass
40
+
41
+
42
+ class FailedToUpdateError(DataOpsError):
43
+ """更新失败异常。"""
44
+
45
+ pass
@@ -4,11 +4,11 @@
4
4
  可作为独立模块被导入使用。
5
5
 
6
6
  Modules:
7
- schemas: Nacos 配置数据模型
8
- utils: 通用工具(数据库连接、加密、日志等)
7
+ schemas: Nacos 配置数据模型.
8
+ utils: 通用工具(数据库连接、加密、日志等).
9
9
 
10
10
  Example:
11
- >>> from runner.utils import DatabaseConn, DuckDBManager
11
+ >>> from dataops_sdk.runner import DatabaseConn, getLogger
12
12
  """
13
13
 
14
14
  from .datasource_factory import get_datasource_instent
@@ -23,7 +23,6 @@ from .utils import (
23
23
  encrypt_body,
24
24
  generate_uuid,
25
25
  get_service_instance,
26
- getLogger,
27
26
  parse_args,
28
27
  print_json,
29
28
  )
@@ -36,7 +35,6 @@ __all__ = [
36
35
  "Neo4jConn",
37
36
  "decrypt_body",
38
37
  "encrypt_body",
39
- "getLogger",
40
38
  "print_json",
41
39
  "generate_uuid",
42
40
  "parse_args",
@@ -1,5 +1,4 @@
1
- """
2
- 数据源实例工厂模块。
1
+ """数据源实例工厂模块。
3
2
 
4
3
  根据数据源元数据动态创建对应的连接实例(数据库或消息队列)。
5
4
  """
@@ -0,0 +1,11 @@
1
+ """Nacos 配置中心 schema 集合。
2
+
3
+ 聚合 Nacos 配置、服务发现与命名空间相关的数据模型,对外暴露
4
+ ``NacosSettings``、``Service`` 与 ``Instance`` 等常用模型。
5
+ """
6
+
7
+ from .config import NacosSettings
8
+ from .instance import Instance
9
+ from .service import Service
10
+
11
+ __all__ = ["Service", "Instance", "NacosSettings"]
@@ -24,17 +24,19 @@ class NacosSettings(BaseSettings):
24
24
  子系统连接和 Nacos 服务发现参数。
25
25
 
26
26
  Attributes:
27
- nacos_addrs: NACOS服务地址
28
- nacos_user: NACOS用户名
29
- nacos_password: NACOS密码
30
- nacos_discovery_namespace: NACOS服务发现命名空间
31
- nacos_group_name: NACOS服务发现组名
27
+ nacos_addrs: Nacos 服务地址(IP:PORT 形式,多个地址以英文逗号分隔)。
28
+ nacos_user: Nacos 鉴权用户名。
29
+ nacos_password: Nacos 鉴权密码。
30
+ nacos_discovery_namespace: Nacos 服务发现使用的命名空间 ID。
31
+ nacos_group_name: Nacos 服务发现使用的默认分组名,缺省 ``DEFAULT_GROUP``。
32
32
  """
33
33
 
34
- nacos_addrs: Annotated[str, Field(description="NACOS服务地址")]
35
- nacos_user: Annotated[str, Field(description="NACOS用户名")]
36
- nacos_password: Annotated[str, Field(description="NACOS密码")]
37
- nacos_discovery_namespace: Annotated[str, Field(description="NACOS服务发现命名空间")]
38
- nacos_group_name: Annotated[str, Field(description="NACOS服务发现组名")] = "DEFAULT_GROUP"
34
+ nacos_addrs: Annotated[str, Field(description="Nacos 服务地址")]
35
+ nacos_user: Annotated[str, Field(description="Nacos 用户名")]
36
+ nacos_password: Annotated[str, Field(description="Nacos 密码")]
37
+ nacos_discovery_namespace: Annotated[str, Field(description="Nacos 服务发现命名空间 ID")]
38
+ nacos_group_name: Annotated[str, Field(description="Nacos 服务发现默认分组名")] = (
39
+ "DEFAULT_GROUP"
40
+ )
39
41
 
40
42
  model_config = SettingsConfigDict(extra="ignore")
@@ -1,4 +1,13 @@
1
+ """Nacos 客户端常量集合。
2
+
3
+ 集中定义 Nacos 客户端在协议、HTTP 头、超时与命名空间等场景下
4
+ 复用的常量值,来源参考 Nacos 官方 OpenAPI 与 Python 客户端实现。
5
+ """
6
+
7
+
1
8
  class Constants:
9
+ """Nacos 客户端常量集合。"""
10
+
2
11
  NAMING_MODULE = "naming"
3
12
 
4
13
  CONFIG_MODULE = "config"
@@ -1,3 +1,9 @@
1
+ """Nacos 服务实例模型。
2
+
3
+ 定义 Nacos 服务发现场景下的注册实例数据结构,并提供与官方 Java
4
+ 客户端行为对齐的合法性校验与元数据辅助方法。
5
+ """
6
+
1
7
  from __future__ import annotations
2
8
 
3
9
  import re
@@ -11,16 +17,34 @@ from .preserved_metadata_key import PreservedMetadataKeys
11
17
 
12
18
 
13
19
  class Instance(BaseModel):
14
- instanceId: Annotated[str, Field(description="实例ID")] = ""
15
- ip: Annotated[str, Field(description="实例IP地址")]
16
- port: Annotated[int, Field(description="实例端口号")]
17
- weight: Annotated[float, Field(description="实例权重")] = 1.0
18
- healthy: Annotated[bool, Field(description="实例健康状态")] = True
20
+ """Nacos 服务注册实例。
21
+
22
+ 用于描述一个注册到 Nacos 服务发现体系中的服务实例,包含网络
23
+ 信息、健康状态、所属集群以及自定义元数据。
24
+
25
+ Attributes:
26
+ instanceId: 实例唯一标识,缺省时由客户端按 IP、端口、集群等规则生成。
27
+ ip: 实例对外提供服务的 IP 地址。
28
+ port: 实例对外提供服务的端口号,范围 ``0``-``65535``。
29
+ weight: 实例权重,默认为 ``1.0``,用于负载均衡。
30
+ healthy: 实例是否处于健康状态,默认为 ``True``。
31
+ enabled: 实例是否启用,禁用后不会出现在订阅结果中。
32
+ ephemeral: 是否为临时实例,临时实例通过心跳维持注册状态。
33
+ clusterName: 实例所属集群名称,缺省为 ``DEFAULT``。
34
+ serviceName: 实例所属服务名称。
35
+ metadata: 实例自定义元数据键值对。
36
+ """
37
+
38
+ instanceId: Annotated[str, Field(description="实例唯一标识")] = ""
39
+ ip: Annotated[str, Field(description="实例对外提供服务的 IP 地址")]
40
+ port: Annotated[int, Field(description="实例对外提供服务的端口号")]
41
+ weight: Annotated[float, Field(description="实例权重,负载均衡时使用")] = 1.0
42
+ healthy: Annotated[bool, Field(description="实例是否处于健康状态")] = True
19
43
  enabled: Annotated[bool, Field(description="实例是否启用")] = True
20
- ephemeral: Annotated[bool, Field(description="实例是否临时实例")] = True
21
- clusterName: Annotated[str, Field(description="实例所在集群名称")] = ""
22
- serviceName: Annotated[str, Field(description="实例所在服务名称")] = ""
23
- metadata: Annotated[dict, Field(description="实例元数据")] = {}
44
+ ephemeral: Annotated[bool, Field(description="是否为临时实例")] = True
45
+ clusterName: Annotated[str, Field(description="实例所属集群名称")] = ""
46
+ serviceName: Annotated[str, Field(description="实例所属服务名称")] = ""
47
+ metadata: Annotated[dict, Field(description="实例自定义元数据")] = {}
24
48
 
25
49
  def __str__(self):
26
50
  return f"Instance({', '.join(f'{key}={value!r}' for key, value in self.__dict__.items())})"
@@ -1,3 +1,8 @@
1
+ """Nacos 客户端异常与错误码定义。
2
+
3
+ 集中声明 Nacos 客户端在调用过程中使用的错误码常量及统一异常类。
4
+ """
5
+
1
6
  CLIENT_INVALID_PARAM = -400
2
7
 
3
8
  CLIENT_DISCONNECT = -401
@@ -36,7 +41,7 @@ HTTP_CLIENT_ERROR_CODE = -500
36
41
 
37
42
 
38
43
  class NacosException(Exception):
39
- """Custom exception class with an error code attribute."""
44
+ """Nacos 客户端统一异常,携带错误码与可读消息。"""
40
45
 
41
46
  def __init__(self, error_code, message="An error occurred"):
42
47
  self.error_code = error_code
@@ -0,0 +1,140 @@
1
+ """Nacos 命名空间 API 调用参数模型。
2
+
3
+ 定义调用 Nacos OpenAPI 命名空间相关接口时使用的请求参数模型,
4
+ 覆盖实例注册、注销、查询、订阅与服务列表等常见场景。
5
+ """
6
+
7
+ from collections.abc import Callable
8
+ from typing import Annotated
9
+
10
+ from pydantic import BaseModel, Field
11
+
12
+ from .constants import Constants
13
+
14
+
15
+ class RegisterInstanceParam(BaseModel):
16
+ """注册单个实例到 Nacos 服务时的入参。
17
+
18
+ Attributes:
19
+ ip: 待注册实例的 IP 地址。
20
+ port: 待注册实例的端口号。
21
+ weight: 实例权重,默认 ``1.0``。
22
+ enabled: 是否启用实例,默认 ``True``。
23
+ healthy: 实例初始健康状态,默认 ``True``。
24
+ metadata: 实例自定义元数据键值对。
25
+ cluster_name: 所属集群名称,缺省为空(实际生效为默认集群)。
26
+ service_name: 目标服务名称。
27
+ group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
28
+ ephemeral: 是否注册为临时实例,默认 ``True``。
29
+ """
30
+
31
+ ip: Annotated[str, Field(description="待注册实例的 IP 地址")]
32
+ port: Annotated[int, Field(description="待注册实例的端口号")]
33
+ weight: Annotated[float, Field(description="实例权重,负载均衡时使用")] = 1.0
34
+ enabled: Annotated[bool, Field(description="是否启用实例")] = True
35
+ healthy: Annotated[bool, Field(description="实例初始健康状态")] = True
36
+ metadata: Annotated[dict[str, str], Field(description="实例自定义元数据")] = {}
37
+ cluster_name: Annotated[str, Field(description="所属集群名称")] = ""
38
+ service_name: Annotated[str, Field(description="目标服务名称")]
39
+ group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
40
+ ephemeral: Annotated[bool, Field(description="是否注册为临时实例")] = True
41
+
42
+
43
+ class BatchRegisterInstanceParam(BaseModel):
44
+ """批量注册实例的入参。
45
+
46
+ Attributes:
47
+ service_name: 目标服务名称。
48
+ group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
49
+ instances: 待注册的实例参数列表。
50
+ """
51
+
52
+ service_name: Annotated[str, Field(description="目标服务名称")]
53
+ group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
54
+ instances: Annotated[
55
+ list[RegisterInstanceParam], Field(description="待注册的实例参数列表")
56
+ ] = []
57
+
58
+
59
+ class DeregisterInstanceParam(BaseModel):
60
+ """注销实例的入参。
61
+
62
+ Attributes:
63
+ ip: 待注销实例的 IP 地址。
64
+ port: 待注销实例的端口号。
65
+ cluster_name: 所属集群名称,缺省为空(实际生效为默认集群)。
66
+ service_name: 目标服务名称。
67
+ group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
68
+ ephemeral: 待注销实例是否为临时实例,默认 ``True``。
69
+ """
70
+
71
+ ip: Annotated[str, Field(description="待注销实例的 IP 地址")]
72
+ port: Annotated[int, Field(description="待注销实例的端口号")]
73
+ cluster_name: Annotated[str, Field(description="所属集群名称")] = ""
74
+ service_name: Annotated[str, Field(description="目标服务名称")]
75
+ group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
76
+ ephemeral: Annotated[bool, Field(description="待注销实例是否为临时实例")] = True
77
+
78
+
79
+ class ListInstanceParam(BaseModel):
80
+ """查询服务实例列表的入参。
81
+
82
+ Attributes:
83
+ service_name: 目标服务名称。
84
+ group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
85
+ clusters: 仅查询指定集群的实例列表。
86
+ subscribe: 是否同时订阅该服务的变更,默认 ``True``。
87
+ healthy_only: 是否仅返回健康实例,``None`` 表示不过滤。
88
+ """
89
+
90
+ service_name: Annotated[str, Field(description="目标服务名称")]
91
+ group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
92
+ clusters: Annotated[list[str], Field(description="仅查询指定集群的实例列表")] = []
93
+ subscribe: Annotated[bool, Field(description="是否同时订阅该服务的变更")] = True
94
+ healthy_only: Annotated[bool | None, Field(description="是否仅返回健康实例")] = None
95
+
96
+
97
+ class SubscribeServiceParam(BaseModel):
98
+ """订阅服务变更的入参。
99
+
100
+ Attributes:
101
+ service_name: 目标服务名称。
102
+ group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
103
+ clusters: 仅订阅指定集群的实例变更。
104
+ subscribe_callback: 服务变更回调函数,``None`` 表示无回调。
105
+ """
106
+
107
+ service_name: Annotated[str, Field(description="目标服务名称")]
108
+ group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
109
+ clusters: Annotated[list[str], Field(description="仅订阅指定集群的实例变更")] = []
110
+ subscribe_callback: Annotated[Callable | None, Field(description="服务变更回调函数")] = None
111
+
112
+
113
+ class GetServiceParam(BaseModel):
114
+ """获取单个服务信息的入参。
115
+
116
+ Attributes:
117
+ service_name: 目标服务名称。
118
+ group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
119
+ clusters: 仅查询指定集群的实例。
120
+ """
121
+
122
+ service_name: Annotated[str, Field(description="目标服务名称")]
123
+ group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
124
+ clusters: Annotated[list[str], Field(description="仅查询指定集群的实例")] = []
125
+
126
+
127
+ class ListServiceParam(BaseModel):
128
+ """分页查询服务列表的入参。
129
+
130
+ Attributes:
131
+ namespace_id: 命名空间 ID,缺省为 ``Constants.DEFAULT_NAMESPACE_ID``。
132
+ group_name: 服务所在分组,默认 ``DEFAULT_GROUP``。
133
+ page_no: 查询页码,从 ``1`` 开始,默认 ``1``。
134
+ page_size: 每页返回数量,默认 ``10``。
135
+ """
136
+
137
+ namespace_id: Annotated[str, Field(description="命名空间 ID")] = Constants.DEFAULT_NAMESPACE_ID
138
+ group_name: Annotated[str, Field(description="服务所在分组")] = Constants.DEFAULT_GROUP
139
+ page_no: Annotated[int, Field(description="查询页码,从 1 开始")] = 1
140
+ page_size: Annotated[int, Field(description="每页返回数量")] = 10
@@ -0,0 +1,148 @@
1
+ """Nacos 命名空间 gRPC 请求模型。
2
+
3
+ 定义通过 gRPC 通道向 Nacos 服务器发起命名空间相关操作时的请求结构,
4
+ 包含抽象基类及若干具体操作类型的请求模型。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from abc import ABC
10
+ from typing import Annotated
11
+
12
+ from pydantic import Field
13
+ from v2.nacos.naming.model.instance import Instance
14
+ from v2.nacos.transport.model.rpc_request import Request
15
+
16
+ from .service import Service
17
+
18
+
19
+ class AbstractNamingRequest(Request, ABC):
20
+ """命名空间相关 gRPC 请求的抽象基类。
21
+
22
+ 统一携带命名空间、服务名和分组等公共字段,子类需实现
23
+ :meth:`get_request_type` 标识具体请求类型。
24
+
25
+ Attributes:
26
+ namespace: 命名空间 ID,缺省为空字符串。
27
+ serviceName: 目标服务名称,缺省为空字符串。
28
+ groupName: 服务所在分组名称,缺省为空字符串。
29
+ """
30
+
31
+ namespace: Annotated[str | None, Field(description="命名空间 ID")] = ""
32
+ serviceName: Annotated[str | None, Field(description="目标服务名称")] = ""
33
+ groupName: Annotated[str | None, Field(description="服务所在分组名称")] = ""
34
+
35
+ def get_module(self):
36
+ return "naming"
37
+
38
+ def get_request_type(self) -> str:
39
+ """返回请求类型标识,子类必须重写。"""
40
+ raise NotImplementedError("Subclasses should implement this method.")
41
+
42
+
43
+ NOTIFY_SUBSCRIBER_REQUEST_TYPE = "NotifySubscriberRequest"
44
+
45
+
46
+ class ServiceQueryRequest(AbstractNamingRequest):
47
+ """服务信息查询请求。
48
+
49
+ Attributes:
50
+ cluster: 目标集群名称。
51
+ healthOnly: 是否仅返回健康实例。
52
+ udpPort: 客户端 UDP 推送端口,默认 ``None``。
53
+ """
54
+
55
+ cluster: Annotated[str | None, Field(description="目标集群名称")]
56
+ healthOnly: Annotated[bool | None, Field(description="是否仅返回健康实例")]
57
+ udpPort: Annotated[int | None, Field(description="客户端 UDP 推送端口")] = None
58
+
59
+ def get_request_type(self) -> str:
60
+ return "ServiceQueryRequest"
61
+
62
+
63
+ class InstanceRequest(AbstractNamingRequest):
64
+ """单个实例的注册、注销或更新请求。
65
+
66
+ Attributes:
67
+ type: 操作类型,例如 ``registerInstance``、``deregisterInstance`` 等。
68
+ instance: 待操作的实例对象。
69
+ """
70
+
71
+ type: Annotated[str | None, Field(description="实例操作类型")]
72
+ instance: Annotated[Instance | None, Field(description="待操作的实例对象")]
73
+
74
+ def get_request_type(self) -> str:
75
+ return "InstanceRequest"
76
+
77
+
78
+ class PersistentInstanceRequest(AbstractNamingRequest):
79
+ """持久化实例请求。
80
+
81
+ Attributes:
82
+ type: 操作类型,例如注册、注销等。
83
+ instance: 待操作的实例对象。
84
+ """
85
+
86
+ type: Annotated[str | None, Field(description="持久化实例操作类型")]
87
+ instance: Annotated[Instance | None, Field(description="待操作的实例对象")]
88
+
89
+ def get_request_type(self) -> str:
90
+ return "PersistentInstanceRequest"
91
+
92
+
93
+ class BatchInstanceRequest(AbstractNamingRequest):
94
+ """批量实例请求。
95
+
96
+ Attributes:
97
+ type: 批量操作类型。
98
+ instances: 待操作的实例对象列表。
99
+ """
100
+
101
+ type: Annotated[str | None, Field(description="批量实例操作类型")]
102
+ instances: Annotated[list[Instance] | None, Field(description="待操作的实例对象列表")]
103
+
104
+ def get_request_type(self) -> str:
105
+ return "BatchInstanceRequest"
106
+
107
+
108
+ class NotifySubscriberRequest(AbstractNamingRequest):
109
+ """订阅变更通知请求。
110
+
111
+ Attributes:
112
+ serviceInfo: 推送的服务信息。
113
+ """
114
+
115
+ serviceInfo: Annotated[Service | None, Field(description="推送的服务信息")]
116
+
117
+ def get_request_type(self) -> str:
118
+ return "NotifySubscriberRequest"
119
+
120
+
121
+ class ServiceListRequest(AbstractNamingRequest):
122
+ """服务列表查询请求。
123
+
124
+ Attributes:
125
+ pageNo: 查询页码,从 ``1`` 开始。
126
+ pageSize: 每页返回数量。
127
+ """
128
+
129
+ pageNo: Annotated[int | None, Field(description="查询页码")]
130
+ pageSize: Annotated[int | None, Field(description="每页返回数量")]
131
+
132
+ def get_request_type(self) -> str:
133
+ return "ServiceListRequest"
134
+
135
+
136
+ class SubscribeServiceRequest(AbstractNamingRequest):
137
+ """服务订阅请求。
138
+
139
+ Attributes:
140
+ subscribe: 是否开启订阅。
141
+ clusters: 关注的集群名称列表。
142
+ """
143
+
144
+ subscribe: Annotated[bool | None, Field(description="是否开启订阅")]
145
+ clusters: Annotated[str | None, Field(description="关注的集群名称列表")]
146
+
147
+ def get_request_type(self) -> str:
148
+ return "SubscribeServiceRequest"
@@ -1,3 +1,9 @@
1
+ """Nacos 命名空间 gRPC 响应模型。
2
+
3
+ 定义通过 gRPC 通道从 Nacos 服务器接收命名空间相关操作的响应结构,
4
+ 覆盖订阅通知、服务查询、实例操作及服务列表查询等场景。
5
+ """
6
+
1
7
  from __future__ import annotations
2
8
 
3
9
  from typing import Annotated
@@ -8,12 +14,20 @@ from v2.nacos.transport.model.rpc_response import Response
8
14
 
9
15
 
10
16
  class NotifySubscriberResponse(Response):
17
+ """订阅变更通知响应。"""
18
+
11
19
  def get_response_type(self) -> str:
12
20
  return "NotifySubscriberResponse"
13
21
 
14
22
 
15
23
  class QueryServiceResponse(Response):
16
- serviceInfo: Annotated[Service | None, Field(description="服务信息")] = None
24
+ """服务信息查询响应。
25
+
26
+ Attributes:
27
+ serviceInfo: 服务信息负载。
28
+ """
29
+
30
+ serviceInfo: Annotated[Service | None, Field(description="服务信息负载")] = None
17
31
 
18
32
  def get_service_info(self) -> Service:
19
33
  return self.serviceInfo
@@ -23,7 +37,13 @@ class QueryServiceResponse(Response):
23
37
 
24
38
 
25
39
  class SubscribeServiceResponse(Response):
26
- serviceInfo: Annotated[Service | None, Field(description="服务信息")] = None
40
+ """服务订阅响应。
41
+
42
+ Attributes:
43
+ serviceInfo: 服务信息负载。
44
+ """
45
+
46
+ serviceInfo: Annotated[Service | None, Field(description="服务信息负载")] = None
27
47
 
28
48
  def get_response_type(self) -> str:
29
49
  return "SubscribeServiceResponse"
@@ -33,17 +53,28 @@ class SubscribeServiceResponse(Response):
33
53
 
34
54
 
35
55
  class InstanceResponse(Response):
56
+ """实例操作响应。"""
57
+
36
58
  def get_response_type(self) -> str:
37
59
  return "InstanceResponse"
38
60
 
39
61
 
40
62
  class BatchInstanceResponse(Response):
63
+ """批量实例操作响应。"""
64
+
41
65
  def get_response_type(self) -> str:
42
66
  return "BatchInstanceResponse"
43
67
 
44
68
 
45
69
  class ServiceListResponse(Response):
46
- count: Annotated[int, Field(description="服务数量")]
70
+ """服务列表查询响应。
71
+
72
+ Attributes:
73
+ count: 满足条件的服务总数。
74
+ serviceNames: 服务名称列表。
75
+ """
76
+
77
+ count: Annotated[int, Field(description="满足条件的服务总数")]
47
78
  serviceNames: Annotated[list[str], Field(description="服务名称列表")]
48
79
 
49
80
  def get_response_type(self) -> str:
@@ -1,3 +1,10 @@
1
+ """Nacos 实例保留元数据键常量。
2
+
3
+ 集中定义 Nacos 客户端在实例元数据中识别的保留键,这些键用于
4
+ 控制心跳超时、IP 删除超时以及实例 ID 生成策略等行为。
5
+ """
6
+
7
+
1
8
  class PreservedMetadataKeys:
2
9
  REGISTER_SOURCE = "preserved.register.source"
3
10