data-ops-cli 0.3.0__tar.gz → 0.3.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 (46) hide show
  1. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/PKG-INFO +2 -2
  2. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/pyproject.toml +2 -2
  3. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/data_ops_cli.egg-info/PKG-INFO +2 -2
  4. data_ops_cli-0.3.1/src/data_ops_cli.egg-info/requires.txt +7 -0
  5. data_ops_cli-0.3.1/src/dataops_cli/__init__.py +17 -0
  6. data_ops_cli-0.3.1/src/dataops_cli/_compat.py +81 -0
  7. data_ops_cli-0.3.1/src/dataops_cli/cli/__init__.py +9 -0
  8. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/alarm.py +139 -29
  9. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/api.py +31 -15
  10. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/auth.py +28 -13
  11. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/data_table.py +36 -18
  12. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/dataset.py +43 -14
  13. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/datasource.py +44 -14
  14. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/dict_.py +29 -19
  15. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/factory.py +20 -0
  16. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/hazard.py +73 -32
  17. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/metrics.py +13 -7
  18. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/ref.py +36 -38
  19. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/report.py +10 -7
  20. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/skill.py +70 -31
  21. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/table.py +89 -45
  22. data_ops_cli-0.3.1/src/dataops_cli/cli/utils.py +54 -0
  23. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/widget.py +112 -26
  24. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/dataops_cli/cli/workflow.py +34 -19
  25. data_ops_cli-0.3.1/src/dataops_cli/exceptions.py +10 -0
  26. data_ops_cli-0.3.1/src/dataops_cli/runner.py +14 -0
  27. data_ops_cli-0.3.1/src/dataops_cli/schems.py +11 -0
  28. data_ops_cli-0.3.1/src/dataops_cli/sdk.py +14 -0
  29. data_ops_cli-0.3.1/src/dataops_cli/session.py +10 -0
  30. data_ops_cli-0.3.1/src/dataops_cli/utils.py +10 -0
  31. data_ops_cli-0.3.0/src/data_ops_cli.egg-info/requires.txt +0 -7
  32. data_ops_cli-0.3.0/src/dataops_cli/__init__.py +0 -11
  33. data_ops_cli-0.3.0/src/dataops_cli/_compat.py +0 -53
  34. data_ops_cli-0.3.0/src/dataops_cli/cli/__init__.py +0 -3
  35. data_ops_cli-0.3.0/src/dataops_cli/cli/utils.py +0 -32
  36. data_ops_cli-0.3.0/src/dataops_cli/exceptions.py +0 -8
  37. data_ops_cli-0.3.0/src/dataops_cli/runner.py +0 -8
  38. data_ops_cli-0.3.0/src/dataops_cli/schems.py +0 -8
  39. data_ops_cli-0.3.0/src/dataops_cli/sdk.py +0 -8
  40. data_ops_cli-0.3.0/src/dataops_cli/session.py +0 -8
  41. data_ops_cli-0.3.0/src/dataops_cli/utils.py +0 -8
  42. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/setup.cfg +0 -0
  43. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/data_ops_cli.egg-info/SOURCES.txt +0 -0
  44. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/data_ops_cli.egg-info/dependency_links.txt +0 -0
  45. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/data_ops_cli.egg-info/entry_points.txt +0 -0
  46. {data_ops_cli-0.3.0 → data_ops_cli-0.3.1}/src/data_ops_cli.egg-info/top_level.txt +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-ops-cli
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Command-line wrapper around dataops_sdk for the DataOps platform.
5
5
  Requires-Python: >=3.11
6
- Requires-Dist: dataops_sdk[runner]<1.0,>=0.1.0
6
+ Requires-Dist: dataops-sdk[runner]>=0.3.2
7
7
  Requires-Dist: typer
8
8
  Requires-Dist: rich
9
9
  Provides-Extra: dev
@@ -8,7 +8,7 @@ dynamic = ["version"]
8
8
  description = "Command-line wrapper around dataops_sdk for the DataOps platform."
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
11
- "dataops_sdk[runner]>=0.1.0,<1.0",
11
+ "dataops-sdk[runner]>=0.3.2",
12
12
  "typer",
13
13
  "rich",
14
14
  ]
@@ -34,4 +34,4 @@ where = ["src"]
34
34
  include = ["dataops_cli*"]
35
35
 
36
36
  [tool.setuptools.package-data]
37
- dataops_cli = ["py.typed"]
37
+ dataops_cli = ["py.typed"]
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-ops-cli
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Command-line wrapper around dataops_sdk for the DataOps platform.
5
5
  Requires-Python: >=3.11
6
- Requires-Dist: dataops_sdk[runner]<1.0,>=0.1.0
6
+ Requires-Dist: dataops-sdk[runner]>=0.3.2
7
7
  Requires-Dist: typer
8
8
  Requires-Dist: rich
9
9
  Provides-Extra: dev
@@ -0,0 +1,7 @@
1
+ dataops-sdk[runner]>=0.3.2
2
+ typer
3
+ rich
4
+
5
+ [dev]
6
+ pytest
7
+ ruff
@@ -0,0 +1,17 @@
1
+ """CLI package for DataOps.
2
+
3
+ This package hosts the Typer-based ``data-ops-cli`` command line interface. It
4
+ groups command modules under :mod:`dataops_cli.cli` and re-exports the package
5
+ ``__version__``. Platform functionality lives in the companion
6
+ ``dataops_sdk`` package; the CLI itself only wires commands onto SDK services.
7
+
8
+ .. deprecated::
9
+ Importing the legacy top-level shims
10
+ (``dataops_cli.sdk`` / ``dataops_cli.schems`` / ``dataops_cli.runner`` /
11
+ ``dataops_cli.exceptions`` / ``dataops_cli.session`` /
12
+ ``dataops_cli.utils``) is deprecated; use ``dataops_sdk`` instead. The CLI
13
+ itself (``dataops_cli.cli``) is unaffected. These deprecation shims will be
14
+ removed in ``dataops_cli`` 1.0.
15
+ """
16
+
17
+ __version__ = "0.3.1"
@@ -0,0 +1,81 @@
1
+ """Build a deprecation-shim module via PEP 562 ``__getattr__``.
2
+
3
+ This helper is used by the legacy top-level shims
4
+ (``dataops_cli.sdk`` / ``dataops_cli.schems`` / ``dataops_cli.runner`` /
5
+ ``dataops_cli.exceptions`` / ``dataops_cli.session`` /
6
+ ``dataops_cli.utils``). Each shim file's body is a single call to
7
+ :func:`make_shim`. The returned namespace exposes ``__all__`` and a
8
+ ``__getattr__`` that proxies to the underlying ``dataops_sdk`` module while
9
+ emitting a single ``DeprecationWarning`` per attribute name (so logging stays
10
+ bounded).
11
+
12
+ .. deprecated::
13
+ The shim modules themselves are deprecated; new code should import from
14
+ ``dataops_sdk`` directly. This helper module will be removed in
15
+ ``dataops_cli`` 1.0.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import importlib
21
+ import sys
22
+ import warnings
23
+ from types import ModuleType
24
+ from typing import Any
25
+
26
+ # Mapping from legacy ``dataops_cli.*`` module paths to their ``dataops_sdk``
27
+ # replacements. Used by :func:`make_shim` to resolve the target module.
28
+ _OLD_TO_NEW = {
29
+ "dataops_cli.sdk": "dataops_sdk.services",
30
+ "dataops_cli.schems": "dataops_sdk.schemas",
31
+ "dataops_cli.runner": "dataops_sdk.runner",
32
+ "dataops_cli.exceptions": "dataops_sdk.exceptions",
33
+ "dataops_cli.session": "dataops_sdk.session",
34
+ "dataops_cli.utils": "dataops_sdk.utils",
35
+ }
36
+
37
+
38
+ def make_shim(old_path: str) -> ModuleType:
39
+ """Create (and register in ``sys.modules``) a shim module proxying to ``new_path``.
40
+
41
+ The new module is wired with PEP 562 ``__getattr__`` so that attribute
42
+ access is lazily forwarded to ``dataops_sdk`` and emits a single
43
+ ``DeprecationWarning`` per attribute name on first access. ``__all__`` and
44
+ ``__dir__`` are forwarded from the target module so ``import *`` and
45
+ introspection behave naturally.
46
+
47
+ Args:
48
+ old_path: The legacy module path (e.g. ``"dataops_cli.sdk"``). Must be
49
+ a key in :data:`_OLD_TO_NEW`.
50
+
51
+ Returns:
52
+ The freshly created proxy module, also registered in :data:`sys.modules`
53
+ under ``old_path``.
54
+
55
+ .. deprecated::
56
+ Only used to construct the legacy ``dataops_cli.*`` shims. Will be
57
+ removed in ``dataops_cli`` 1.0 alongside the shims themselves.
58
+ """
59
+ new_path = _OLD_TO_NEW[old_path]
60
+ target = importlib.import_module(new_path)
61
+ warned: set[str] = set()
62
+
63
+ def __getattr__(name: str) -> Any:
64
+ """PEP 562 attribute lookup that warns once per attribute name."""
65
+ if name not in warned:
66
+ warned.add(name)
67
+ warnings.warn(
68
+ f"Importing '{name}' from '{old_path}' is deprecated; "
69
+ f"import it from '{new_path}' instead. "
70
+ "This shim will be removed in dataops_cli 1.0.",
71
+ DeprecationWarning,
72
+ stacklevel=2,
73
+ )
74
+ return getattr(target, name)
75
+
76
+ module = ModuleType(old_path)
77
+ module.__getattr__ = __getattr__ # type: ignore[attr-defined]
78
+ module.__all__ = getattr(target, "__all__", []) # type: ignore[attr-defined]
79
+ module.__dir__ = lambda: list(dir(target)) # type: ignore[attr-defined]
80
+ sys.modules[old_path] = module
81
+ return module
@@ -0,0 +1,9 @@
1
+ """data-ops-cli 的 Typer 命令组集合.
2
+
3
+ 本包聚合所有 CLI 子命令模块(alarm、api、auth 等),由 ``factory.create_app``
4
+ 统一注册为 Typer 应用并通过 ``dataops_cli.cli.app`` 暴露。
5
+ """
6
+
7
+ from dataops_cli.cli.factory import create_app
8
+
9
+ app = create_app()
@@ -10,10 +10,6 @@ import json
10
10
  from typing import Annotated, Any, Optional
11
11
 
12
12
  import typer
13
- from pydantic_core import to_json
14
- from rich.console import Console
15
- from rich.table import Table
16
-
17
13
  from dataops_cli.cli.utils import print_list
18
14
  from dataops_sdk.exceptions import DataOpsError
19
15
  from dataops_sdk.schemas.query import SqlQueryParam
@@ -32,12 +28,15 @@ from dataops_sdk.services.alarm import (
32
28
  service_list_alarm_rules,
33
29
  service_list_alarm_specs,
34
30
  )
31
+ from pydantic_core import to_json
32
+ from rich.console import Console
33
+ from rich.table import Table
35
34
 
36
35
  # ---------------------------------------------------------------------------
37
36
  # CLI 命令(薄包装,负责输出渲染)
38
37
  # ---------------------------------------------------------------------------
39
38
 
40
- alarm_typer = typer.Typer(name="alarm", help="告警相关命令", no_args_is_help=True)
39
+ alarm_typer = typer.Typer(name="alarm", help="告警规则配置", no_args_is_help=True)
41
40
  alarm_rule_typer = typer.Typer(name="rule", help="告警规则命令", no_args_is_help=True)
42
41
  alarm_spec_typer = typer.Typer(name="spec", help="告警专业命令", no_args_is_help=True)
43
42
  alarm_action_typer = typer.Typer(name="action", help="告警动作命令", no_args_is_help=True)
@@ -93,6 +92,18 @@ def count_alarm_rules_match(
93
92
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
94
93
  enabled: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
95
94
  ):
95
+ """查询告警匹配规则数量。
96
+
97
+ 按专业、关键字与启用状态进行过滤,返回匹配规则的总数。
98
+
99
+ Args:
100
+ spec: 专业值列表,多个值会同时参与匹配。
101
+ query: 可选关键字,用于模糊搜索。
102
+ enabled: 可选启用状态过滤;为 ``True`` / ``False`` 时严格匹配。
103
+
104
+ Examples:
105
+ >>> data-ops-cli alarm rule match count --spec MY_SPEC
106
+ """
96
107
  try:
97
108
  total = service_count_alarm_rule_matches(query, enabled, spec)
98
109
  except DataOpsError as e:
@@ -104,13 +115,27 @@ def count_alarm_rules_match(
104
115
  @rule_match_typer.command("list", help="查询告警匹配规则")
105
116
  def list_alarm_rules_match(
106
117
  spec: Annotated[list[str], typer.Option(help="专业值", default_factory=list)],
107
- page: Annotated[int, typer.Option("-p", "--page", help="页码")] = 0,
108
- size: Annotated[int, typer.Option("-s", "--size", help="每页条数")] = 20,
118
+ page_num: Annotated[int, typer.Option("-n", "--page-num", help="页码")] = 0,
119
+ page_size: Annotated[int, typer.Option("-s", "--page-size", help="每页大小")] = 20,
109
120
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
110
121
  enabled: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
111
122
  ):
123
+ """查询告警匹配规则列表。
124
+
125
+ 按专业、关键字与启用状态过滤告警匹配规则,并以平面表格形式输出。
126
+
127
+ Args:
128
+ spec: 专业值列表,多个值同时参与匹配。
129
+ page: 页码(从 0 开始)。
130
+ size: 每页条数。
131
+ query: 可选关键字。
132
+ enabled: 可选启用状态过滤。
133
+
134
+ Examples:
135
+ >>> data-ops-cli alarm rule match list --spec MY_SPEC --page 0 --size 20
136
+ """
112
137
  try:
113
- group_nodes = service_list_alarm_rule_matches(page, size, query, enabled, spec)
138
+ group_nodes = service_list_alarm_rule_matches(page_num, page_size, query, enabled, spec)
114
139
  except DataOpsError as e:
115
140
  typer.echo(f"错误: {e.message}")
116
141
  raise typer.Exit(code=1) from None
@@ -145,17 +170,30 @@ def list_alarm_rules_match(
145
170
 
146
171
  @alarm_spec_typer.command("list", help="查询告警专业")
147
172
  def list_alarm_specs(
148
- page: Annotated[int, typer.Option("-p", "--page", help="页码")] = 0,
149
- size: Annotated[int, typer.Option("-s", "--size", help="每页条数")] = 20,
173
+ page_num: Annotated[int, typer.Option("-n", "--page-num", help="页码")] = 0,
174
+ page_size: Annotated[int, typer.Option("-s", "--page-size", help="每页大小")] = 20,
150
175
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
151
176
  active: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
152
177
  ):
178
+ """查询告警专业列表。
179
+
180
+ 按关键字与启用状态过滤告警专业(spec),输出标题、值、行业等基础字段。
181
+
182
+ Args:
183
+ page: 页码(从 0 开始)。
184
+ size: 每页条数。
185
+ query: 可选关键字。
186
+ active: 可选启用状态过滤。
187
+
188
+ Examples:
189
+ >>> data-ops-cli alarm spec list -q "网元"
190
+ """
153
191
  query_param = SqlQueryParam()
154
192
  if active is not None:
155
193
  query_param.varMap["isEnabled"] = "1" if active else "0"
156
194
  if query:
157
195
  query_param.add_like("title", query, "mrl")
158
- group_nodes = service_list_alarm_specs(page, size, query_param)
196
+ group_nodes = service_list_alarm_specs(page_num, page_size, query_param)
159
197
 
160
198
  print_list(
161
199
  ["专业名称", "值", "行业", "启用状态", "创建人", "更新时间"],
@@ -178,18 +216,40 @@ def count_alarm_specs(
178
216
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
179
217
  enabled: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
180
218
  ):
219
+ """查询告警专业的总数。
220
+
221
+ Args:
222
+ query: 可选关键字。
223
+ enabled: 可选启用状态过滤。
224
+
225
+ Examples:
226
+ >>> data-ops-cli alarm spec count
227
+ """
181
228
  total = service_count_alarm_specs(query, enabled)
182
229
  print(total)
183
230
 
184
231
 
185
232
  @alarm_rule_typer.command("list", help="查询告警规则")
186
233
  def list_alarm_rules(
187
- page: Annotated[int, typer.Option("-p", "--page", help="页码")] = 0,
188
- size: Annotated[int, typer.Option("-s", "--size", help="每页条数")] = 20,
234
+ page_num: Annotated[int, typer.Option("-n", "--page-num", help="页码")] = 0,
235
+ page_size: Annotated[int, typer.Option("-s", "--page-size", help="每页大小")] = 20,
189
236
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
190
237
  enabled: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
191
238
  ):
192
- group_nodes = service_list_alarm_rules(page, size, query, enabled)
239
+ """查询告警规则列表。
240
+
241
+ 按关键字与启用状态过滤告警规则,并以平面表格输出名称、值与启用状态。
242
+
243
+ Args:
244
+ page: 页码(从 0 开始)。
245
+ size: 每页条数。
246
+ query: 可选关键字。
247
+ enabled: 可选启用状态过滤。
248
+
249
+ Examples:
250
+ >>> data-ops-cli alarm rule list -q "电压"
251
+ """
252
+ group_nodes = service_list_alarm_rules(page_num, page_size, query, enabled)
193
253
 
194
254
  print_list(
195
255
  ["规则名称", "值", "启用状态", "创建人", "更新时间"],
@@ -211,6 +271,15 @@ def count_alarm_specs(
211
271
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
212
272
  enabled: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
213
273
  ):
274
+ """查询告警规则的总数。
275
+
276
+ Args:
277
+ query: 可选关键字。
278
+ enabled: 可选启用状态过滤。
279
+
280
+ Examples:
281
+ >>> data-ops-cli alarm rule count
282
+ """
214
283
  total = service_count_alarm_rules(query, enabled)
215
284
  print(total)
216
285
 
@@ -218,13 +287,27 @@ def count_alarm_specs(
218
287
  @alarm_action_typer.command("list", help="查询告警动作")
219
288
  def list_alarm_actions(
220
289
  rule: Annotated[list[str], typer.Option(help="专业值", default_factory=list)],
221
- page: Annotated[int, typer.Option("-p", "--page", help="页码")] = 0,
222
- size: Annotated[int, typer.Option("-s", "--size", help="每页条数")] = 20,
290
+ page_num: Annotated[int, typer.Option("-n", "--page-num", help="页码")] = 0,
291
+ page_size: Annotated[int, typer.Option("-s", "--page-size", help="每页大小")] = 20,
223
292
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
224
293
  enabled: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
225
294
  ):
295
+ """查询告警动作列表。
296
+
297
+ 按所属规则、关键字与启用状态过滤告警动作,并以平面表格输出。
298
+
299
+ Args:
300
+ rule: 所属规则编码列表。
301
+ page: 页码(从 0 开始)。
302
+ size: 每页条数。
303
+ query: 可选关键字。
304
+ enabled: 可选启用状态过滤。
305
+
306
+ Examples:
307
+ >>> data-ops-cli alarm action list --rule MY_RULE
308
+ """
226
309
  try:
227
- group_nodes = service_list_alarm_action(page, size, query, enabled, rule)
310
+ group_nodes = service_list_alarm_action(page_num, page_size, query, enabled, rule)
228
311
  except DataOpsError as e:
229
312
  typer.echo(f"错误: {e.message}")
230
313
  raise typer.Exit(code=1) from None
@@ -261,6 +344,16 @@ def count_alarm_actions(
261
344
  query: Annotated[Optional[str], typer.Option("-q", "--query", help="搜索关键字")] = None,
262
345
  enabled: Annotated[Optional[bool], typer.Option(help="启用状态")] = None,
263
346
  ):
347
+ """查询告警动作的总数。
348
+
349
+ Args:
350
+ rule: 所属规则编码列表。
351
+ query: 可选关键字。
352
+ enabled: 可选启用状态过滤。
353
+
354
+ Examples:
355
+ >>> data-ops-cli alarm action count --rule MY_RULE
356
+ """
264
357
  try:
265
358
  total = service_count_alarm_action(query, enabled, rule)
266
359
  except DataOpsError as e:
@@ -271,9 +364,11 @@ def count_alarm_actions(
271
364
 
272
365
  @alarm_rule_typer.command("enums")
273
366
  def get_alarm_rule_enums() -> None:
274
- """获取告警规则枚举配置.
367
+ """获取告警规则枚举配置。
275
368
 
276
- 示例:
369
+ 后端返回 ``dict`` 时以两列 ``key/value`` 表渲染;其他结构以 JSON 形式输出。
370
+
371
+ Examples:
277
372
  >>> data-ops-cli alarm rule enums
278
373
  """
279
374
  try:
@@ -300,9 +395,14 @@ def get_alarm_rule_enums() -> None:
300
395
  def find_meta_by_codes(
301
396
  codes: Annotated[list[str], typer.Argument(help="告警规则编码列表")],
302
397
  ) -> None:
303
- """根据告警规则编码批量查询关联元数据.
398
+ """根据告警规则编码批量查询关联元数据。
399
+
400
+ 以 JSON 格式输出查询结果,便于人工检视或管道后续处理。
401
+
402
+ Args:
403
+ codes: 告警规则编码列表。
304
404
 
305
- 示例:
405
+ Examples:
306
406
  >>> data-ops-cli alarm rule find-meta-by-codes code1 code2
307
407
  """
308
408
  try:
@@ -318,9 +418,12 @@ def find_meta_by_codes(
318
418
  def get_alarm_table_columns(
319
419
  spec_type: Annotated[str, typer.Argument(help="告警规格类型")],
320
420
  ) -> None:
321
- """获取指定 specType 对应的告警表列定义.
421
+ """获取指定 specType 对应的告警表列定义。
322
422
 
323
- 示例:
423
+ Args:
424
+ spec_type: 告警规格类型编码。
425
+
426
+ Examples:
324
427
  >>> data-ops-cli alarm rule alarm-columns MY_SPEC_TYPE
325
428
  """
326
429
  try:
@@ -336,9 +439,12 @@ def get_alarm_table_columns(
336
439
  def get_rel_table_columns(
337
440
  code: Annotated[str, typer.Argument(help="告警规则编码")],
338
441
  ) -> None:
339
- """获取指定告警规则关联表列.
442
+ """获取指定告警规则关联表的列定义。
443
+
444
+ Args:
445
+ code: 告警规则编码。
340
446
 
341
- 示例:
447
+ Examples:
342
448
  >>> data-ops-cli alarm rule rel-columns rule_code_001
343
449
  """
344
450
  try:
@@ -358,12 +464,16 @@ def find_alarm_table_data(
358
464
  typer.Option(help="查询条件 JSON 字符串"),
359
465
  ] = None,
360
466
  ) -> None:
361
- """查询告警表数据.
467
+ """查询指定数据源中告警表的实际数据(由告警规则写入的记录,非实时告警)。
362
468
 
363
- 示例:
364
- >>> data-ops-cli alarm rule data --code rule_code_001
469
+ ``--query`` 接收 JSON 字符串并解析为 dict 后透传给 SDK。
365
470
 
366
- 带查询条件
471
+ Args:
472
+ code: 告警规则编码。
473
+ query: 可选 JSON 字符串,表示查询条件。
474
+
475
+ Examples:
476
+ >>> data-ops-cli alarm rule data --code rule_code_001
367
477
  >>> data-ops-cli alarm rule data --code rule_code_001 --query '{"date":"2026-07-16"}'
368
478
  """
369
479
  try:
@@ -6,11 +6,10 @@
6
6
  - CLI 命令:基于服务层的薄包装,负责格式化输出
7
7
  """
8
8
 
9
- import shutil
10
9
  from typing import Annotated
11
10
 
12
11
  import typer
13
-
12
+ from dataops_cli.cli.utils import print_list
14
13
  from dataops_sdk.exceptions import DataOpsError
15
14
  from dataops_sdk.schemas import MetaType
16
15
  from dataops_sdk.services.api import service_get_api_by_code
@@ -46,7 +45,11 @@ api_typer = typer.Typer(
46
45
 
47
46
 
48
47
  def _first_line(text: str) -> str:
49
- """取文本的第一行."""
48
+ """取文本的第一行。
49
+
50
+ Args:
51
+ text: 多行字符串。
52
+ """
50
53
  return text.split("\n")[0]
51
54
 
52
55
 
@@ -56,11 +59,14 @@ def list_apis(
56
59
  str | None, typer.Option("-q", "--query", help="按名称/标题/备注正则过滤")
57
60
  ] = None,
58
61
  ) -> None:
59
- """列出所有 API 接口.
62
+ """列出所有 API 接口。
60
63
 
61
64
  从元数据服务获取 API 接口列表,支持通过正则表达式按名称、标题或备注进行过滤。
62
65
 
63
- 示例:
66
+ Args:
67
+ query: 可选正则表达式,按名称/标题/备注过滤。
68
+
69
+ Examples:
64
70
  列出所有 API 接口
65
71
  >>> data-ops-cli api list
66
72
 
@@ -81,14 +87,14 @@ def list_apis(
81
87
  print("(无结果)")
82
88
  return
83
89
 
84
- print("code title remark")
90
+ print_list(
91
+ ["code", "title", "remark"],
92
+ [
93
+ [node.CODE, node.TITLE, _first_line(node.REMARK or "")]
94
+ for node in group_nodes
95
+ ]
96
+ )
85
97
 
86
- for node in group_nodes:
87
- code = node.CODE
88
- title = node.TITLE
89
- remark_raw = node.REMARK or ""
90
- remark = _first_line(remark_raw.strip())
91
- print(code, title, remark)
92
98
 
93
99
 
94
100
  @api_typer.command("detail", rich_help_panel="API 查询", no_args_is_help=True)
@@ -99,11 +105,15 @@ def get_api_detail(
99
105
  typer.Option("-s", "--simplify", help="仅显示基本信息,不展示请求/响应参数"),
100
106
  ] = False,
101
107
  ) -> None:
102
- """获取 API 接口详情.
108
+ """获取 API 接口详情。
103
109
 
104
110
  根据 API 接口编码获取详细信息,包括请求方法、路径、状态、请求参数和响应参数。
105
111
 
106
- 示例:
112
+ Args:
113
+ code: API 接口编码。
114
+ simplify: 是否仅显示基本信息(不展示请求/响应参数)。
115
+
116
+ Examples:
107
117
  获取 API 接口完整信息
108
118
  >>> data-ops-cli api detail user_login
109
119
 
@@ -207,7 +217,13 @@ def get_api_detail(
207
217
 
208
218
 
209
219
  def _print_params_tree(params: list[dict], indent: int = 0, prefix: str = "") -> None:
210
- """递归打印参数树结构."""
220
+ """递归打印参数树结构。
221
+
222
+ Args:
223
+ params: 参数节点列表。
224
+ indent: 当前缩进空格数。
225
+ prefix: 每行前缀。
226
+ """
211
227
  for p in params:
212
228
  ptype = p.get("type", "?")
213
229
  name = p.get("name", "?")
@@ -34,11 +34,13 @@ auth_typer.add_typer(application_typer)
34
34
 
35
35
  @auth_typer.command("status")
36
36
  def auth_status() -> None:
37
- """显示当前认证状态.
37
+ """显示当前认证状态。
38
38
 
39
39
  查询当前用户的登录状态及已设置的应用信息。
40
- 如果未登录,提示用户先进行登录。
41
- 如果已登录但未设置应用,提示用户设置应用。
40
+
41
+ 如果未登录,提示用户先进行登录;
42
+ 如果已登录但未设置应用,提示用户设置应用;
43
+ 否则同时输出应用关联的主/隐患数据源信息。
42
44
  """
43
45
  target_path = get_work_dir(USER_INFO_FILE)
44
46
  if not target_path.exists():
@@ -82,12 +84,16 @@ def auth(
82
84
  envvar="DATA_OPS_PASSWORD",
83
85
  ),
84
86
  ) -> None:
85
- """登录 DataOps 平台.
87
+ """登录 DataOps 平台。
86
88
 
87
89
  使用用户名和密码进行登录,登录成功后会将 Token 保存到本地。
88
- 支持通过环境变量 DATA_OPS_USERNAME 和 DATA_OPS_PASSWORD 传入凭据。
90
+ 支持通过环境变量 ``DATA_OPS_USERNAME````DATA_OPS_PASSWORD`` 传入凭据。
91
+
92
+ Args:
93
+ username: 用户名。
94
+ password: 密码。
89
95
 
90
- 示例:
96
+ Examples:
91
97
  交互式登录
92
98
  >>> data-ops-cli auth login myuser mypassword
93
99
 
@@ -106,9 +112,12 @@ def auth(
106
112
 
107
113
  @auth_typer.command("logout")
108
114
  def logout() -> None:
109
- """登出 DataOps 平台.
115
+ """登出 DataOps 平台。
110
116
 
111
117
  清除本地保存的登录凭证,退出当前登录状态。
118
+
119
+ Examples:
120
+ >>> data-ops-cli auth logout
112
121
  """
113
122
  ret = service_logout()
114
123
  if ret:
@@ -119,12 +128,15 @@ def logout() -> None:
119
128
 
120
129
  @application_typer.command("list")
121
130
  def application_list(query: Annotated[str | None, typer.Argument(help="关键字")] = None) -> None:
122
- """列出所有可用应用.
131
+ """列出所有可用应用。
123
132
 
124
133
  显示当前用户可访问的所有应用列表,支持通过关键字过滤。
125
134
  表格显示应用的编码(code)、标题(title)和备注(remark)。
126
135
 
127
- 示例:
136
+ Args:
137
+ query: 可选关键字。
138
+
139
+ Examples:
128
140
  查看所有应用
129
141
  >>> data-ops-cli auth application list
130
142
 
@@ -148,12 +160,15 @@ def application_list(query: Annotated[str | None, typer.Argument(help="关键字
148
160
 
149
161
  @application_typer.command("set")
150
162
  def application_set(code: Annotated[str, typer.Argument(help="应用编码")]) -> None:
151
- """设置当前应用.
163
+ """设置当前应用。
152
164
 
153
165
  将指定应用设置为当前会话的默认应用,后续操作将在该应用上下文中执行。
154
166
  设置完成后显示应用的详细信息。
155
167
 
156
- 示例:
168
+ Args:
169
+ code: 应用编码。
170
+
171
+ Examples:
157
172
  设置当前应用
158
173
  >>> data-ops-cli auth application set myapp_code
159
174
  """
@@ -174,10 +189,10 @@ def application_set(code: Annotated[str, typer.Argument(help="应用编码")]) -
174
189
 
175
190
  @application_typer.command("info")
176
191
  def application_info() -> None:
177
- """显示当前应用信息.
192
+ """显示当前应用信息。
178
193
 
179
194
  查看当前已设置应用的详细信息,包括编码、标题和备注。
180
- 如果尚未设置应用,提示用户使用 auth application set 命令进行设置。
195
+ 如果尚未设置应用,提示用户使用 ``auth application set`` 命令进行设置。
181
196
  """
182
197
  application = service_get_current_application()
183
198
  if application is None: