data-ops-cli 0.2.1__py3-none-any.whl → 0.2.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-ops-cli
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Requires-Python: <3.14,>=3.11
5
5
  Requires-Dist: requests
6
6
  Requires-Dist: pydantic-core
@@ -1,23 +1,23 @@
1
- dataops_cli/__init__.py,sha256=HfjVOrpTnmZ-xVFCYSVmX50EXaBQeJteUHG-PD6iQs8,22
1
+ dataops_cli/__init__.py,sha256=m6kyaNpwBcP1XYcqrelX2oS3PJuOnElOcRdBa9pEb8c,22
2
2
  dataops_cli/constants.py,sha256=Nc0ZofLF_sX_wDyVDvvrZPKOj6c_jahEOXmhy5phvF8,293
3
- dataops_cli/exceptions.py,sha256=16orv-vSvIai9Fi-q8iSV9C5lLKPimMmjBRYDTD0fCc,405
3
+ dataops_cli/exceptions.py,sha256=GnNqDlMfgjMiL0Kp-H0KZMDJdRAckG6kd3V-NJiugFg,575
4
4
  dataops_cli/session.py,sha256=6agqEwJSL024vf2OHg8CiucmFGmQT1yEY4mao-NQp9E,5344
5
- dataops_cli/utils.py,sha256=qeO06dqy_aWLdX9kN8tyXyFU5N-GRhzefpIRRqz-eOc,3335
5
+ dataops_cli/utils.py,sha256=-7iBbYjp9JM5LhuCkNhYoNITa26YJxyhd_oTYzPjERU,3740
6
6
  dataops_cli/cli/__init__.py,sha256=TvJw3xrE81YSwUrauHaJwQsRNf-YAlxLnadce1KYo4c,67
7
- dataops_cli/cli/auth.py,sha256=yEN2cFMRT45KxHMSYGWQAvUqkdx5mWzjuIAkAFeJQMs,5625
8
- dataops_cli/cli/data_table.py,sha256=eoqnXxFGq6u9se7VpYHXlxMeFKomJzsFrKTquiYyYSM,1460
9
- dataops_cli/cli/dataset.py,sha256=vUWOqo59P6ss7OU8035DjzqO_eFwSOd-sncbWpq3XqE,3442
10
- dataops_cli/cli/datasource.py,sha256=EvUaIDRV6WIK-X20zGlJkhD9XTIc4sT-E_8HiUByYEI,3481
7
+ dataops_cli/cli/auth.py,sha256=7kM0c0hjALZ-u7-RsNZhwRct5kshA2S5_zmqSlFVzc4,6381
8
+ dataops_cli/cli/data_table.py,sha256=vzzC7naHBNKe5aYsxjkFUdTHkQrkgsVHY3w_SGi3tKo,9402
9
+ dataops_cli/cli/dataset.py,sha256=9r3T7tlXUg2swALAjlpcyRm_N2XZ6ui7r6AJYtOg1zA,3387
10
+ dataops_cli/cli/datasource.py,sha256=E3B_Uspo0lQ5iApptqex45nSBNkvHQnGD9XtuJImClY,3361
11
11
  dataops_cli/cli/factory.py,sha256=Miib8v8iTylw7pUfvp4NV19bTKwpEQGTg1l8Lhj4uGA,1553
12
12
  dataops_cli/cli/metrics.py,sha256=CioC_l2DHlg3s97_-kAfLihdz7tLgOwb9lo2AIngb5I,6195
13
13
  dataops_cli/cli/ref.py,sha256=jfc5EhkXrhqUwu4IuftEjUepPB3d6SK4ZDhrh40YGOE,4765
14
14
  dataops_cli/cli/report.py,sha256=-qo5Nz31bCI_y8dvPoBnpn4-ggQ0Leo5mUsmiWBzNJ8,2437
15
- dataops_cli/cli/table.py,sha256=iHDUHvjp1dZFJEe7cDplp3Phx4hAz1L0O8p-qfzTNWs,7488
15
+ dataops_cli/cli/table.py,sha256=5EoDrV32FSCLuyvhNl3yz5LSorAFL6Rw1oWNBcx9Iwg,7495
16
16
  dataops_cli/cli/utils.py,sha256=Qi3BGmZgIapasHAGCYVdOS8deYz5GmZIqKd289HYgeE,529
17
- dataops_cli/cli/widget.py,sha256=7rvBR4RS1zAg9j48yzLjWQvDF9vBN3H7TYRFjkpGOqU,1744
18
- dataops_cli/cli/workflow.py,sha256=HxZcR71ykPkLI5QoF9IutwLrmaPbTvxHxgnd9aHnMIU,4802
17
+ dataops_cli/cli/widget.py,sha256=7Kzie7GqNf1vLK2O9G1HVSJnzjUGRHJqGaypVCEkLsE,1745
18
+ dataops_cli/cli/workflow.py,sha256=Do0bwV9kHSSOICW5RELLJoL34fLhf7tIcqcOSokKFLw,4804
19
19
  dataops_cli/runner/__init__.py,sha256=BursdHKoU_4Bq-BhrYxNCJ88SpUajeMzVrnLMpbC4fc,767
20
- dataops_cli/runner/schemas/nacos/__init__.py,sha256=E_E8GI3ijWIRwXob34Oy6JaQaIir3qbF32aslmNrrVQ,147
20
+ dataops_cli/runner/schemas/nacos/__init__.py,sha256=yXsULXK8G5IiZz2c26yrVhtvflbDLwgTkajm74YAA10,146
21
21
  dataops_cli/runner/schemas/nacos/config.py,sha256=pHrwJRoDGQNuqMVoQnkmNF0ENqUqcmUvp-j3Q_YgTx0,1326
22
22
  dataops_cli/runner/schemas/nacos/constants.py,sha256=034uKkGHqlfcOzk1CvG92OhBZM_5oBx1WHfZGzOuE7g,4262
23
23
  dataops_cli/runner/schemas/nacos/instance.py,sha256=jRHSYLcOLSdVEzS6ol7z1Ta7kK7E5pSu199eMSV1kMo,3974
@@ -30,30 +30,32 @@ dataops_cli/runner/schemas/nacos/service.py,sha256=C-27WmWW-ziZuplMTp2-xcIIPONVm
30
30
  dataops_cli/runner/utils/__init__.py,sha256=C0e_iiM80fScn_FGL4-HIRwmsHADiyN5TQ08a75FgQk,880
31
31
  dataops_cli/runner/utils/common.py,sha256=fz7uUjVRluZUUUaIhw2b9OXvs5k9M_W0l4TH6oxGilg,6282
32
32
  dataops_cli/runner/utils/dbConn_base.py,sha256=3reXPJ9uAcOVhl3sRNe4MPplYpKfG5DTfW0ETaqXeEo,8239
33
- dataops_cli/runner/utils/dbConn_sync.py,sha256=C8l1zzbDMeGryt-mPStVbTc7Q16dVLMt6cfJ7WjdfI8,12938
33
+ dataops_cli/runner/utils/dbConn_sync.py,sha256=QG9_9ExNGeTWGkXmf6r16nSbu3YXLBchKU5STo3s08c,12938
34
34
  dataops_cli/runner/utils/duckdb_manager.py,sha256=xIREgkx6hcAbt6cYSTEHfGPGu7QgZsCwQrU4u2Vb1ng,6902
35
35
  dataops_cli/runner/utils/log.py,sha256=EwctSAohPIP1wo2FtUTjv5kswyoGHK70-2CFlyQ9yN4,1438
36
36
  dataops_cli/runner/utils/nacos.py,sha256=HSJyjswRk1ohzzUEjn4yRDtWKPjgsU_yYoS1nh5TWss,2994
37
37
  dataops_cli/runner/utils/neo4j_sync.py,sha256=cbpb4K5QUHcD1DuJg7_KeoBi8N1DLwru2sbiDMq779M,6603
38
- dataops_cli/schems/__init__.py,sha256=-bOjpAo_FfR7FnnyGJOLgmoOoHVOXvpmZ0zlGSURHCA,373
38
+ dataops_cli/schems/__init__.py,sha256=xK0fa3LMvpQLIzVt-9GY-DC7C1z1c0xf5ZRlvicePKM,600
39
+ dataops_cli/schems/data_table.py,sha256=SV_OR_pAzagVGZybgF5VjuqnHErAJO0lMBbbghWD_Jw,17292
39
40
  dataops_cli/schems/datasource.py,sha256=2b0dUf0xdO0J9fV5V1eCEM9Hj6ERButULuChl34i0Ik,2287
40
41
  dataops_cli/schems/enums.py,sha256=3lCxF5E4Jo1LUw9ZbA2-PiIbSGaYLBmrwQdlwdcmh-k,1438
41
42
  dataops_cli/schems/group.py,sha256=TvH0nsrGz1DpftrLAPpHqQuhMNgu0e5gu_Og3PiVnBc,1306
42
- dataops_cli/schems/meta.py,sha256=_tNcSm_s7OIJbx6kQaJ0CB7_oc0Wlym3Ac9uERjBZaM,4499
43
+ dataops_cli/schems/meta.py,sha256=lHkk97cn2-lzIYgqGdIfE_KQvL8Os-bKl2jKhh4MK5Q,5938
43
44
  dataops_cli/schems/query.py,sha256=AWH0P51lkBQEKhotIOoqJaOEIEoaWaiT_r7hSXlzK2Q,6455
44
45
  dataops_cli/schems/report.py,sha256=Eklh1gMaRoPDvgrWZIBrLkQXhB0KuuAteJUzOzZngb8,493
46
+ dataops_cli/schems/table.py,sha256=Y0ebyXYCw4vBhBgHyPXCz_4yVALAxMkQQlxSQsjJNs0,394
45
47
  dataops_cli/schems/user.py,sha256=mAPgLCCKeoC7qvOj6TOSC2xI3OrL7P5eNOGy4R3RVyw,2522
46
- dataops_cli/schems/widget.py,sha256=bzxkzh2ATGawjznZgLf7F_7nYrNkfddAnpRuC8ptX5k,21572
47
- dataops_cli/schems/workflow.py,sha256=KQr7bAlJtuUUxeVUVPrN7x4DL_iKHhNR3OuxVnYnsAc,1805
48
- dataops_cli/sdk/__init__.py,sha256=8e2ItcT178lDGO1OisQJdNr-pkC-SAf5HGbtercdkiY,335
49
- dataops_cli/sdk/auth.py,sha256=lqbG5WfGI_ylFCog5_lAWd43VuT25YbzLifggKeDO8Q,3936
50
- dataops_cli/sdk/data_table.py,sha256=rLPUK8Dk8ih_DSbFweL5B-fHtBhFMec1o9lFT-VbFTU,2083
51
- dataops_cli/sdk/datasource.py,sha256=Nsj1uqksigUG4f9U9i8Oc1J_jZhzcd9c6WqmdJUOmNs,1276
52
- dataops_cli/sdk/meta.py,sha256=V4lXHAvK0mRC3VBXacZPwdQk8OQ4bMGgjbGg3LRkExE,8628
48
+ dataops_cli/schems/widget.py,sha256=q1zsVv9g0bS_Fev_IRzHaH86T3cQfwzS5fcm5VhVMrM,21691
49
+ dataops_cli/schems/workflow.py,sha256=opRkEwYXntTO-BCOLcZJK2joA32qELpdnN6pI2LS_2Y,1805
50
+ dataops_cli/sdk/__init__.py,sha256=7aGMRkNbuHPj4e4_Lz537Dy0M64A2CiVsfUL_a_zuuw,961
51
+ dataops_cli/sdk/auth.py,sha256=75dyLs_cmgDm2vSjkiS8WhO_y3DW3lKHBXsOMmYut74,3978
52
+ dataops_cli/sdk/data_table.py,sha256=eQ1VmmyOo5zITWIl4QvebcnYyajudV_-xSA16saKrTw,6940
53
+ dataops_cli/sdk/datasource.py,sha256=BqeKEQKRhhLxSGM0wKBsGvh48NW7a5SlqRjLRSfh9AM,2043
54
+ dataops_cli/sdk/meta.py,sha256=oBjefAKCd1o10NxM0tQOmQyAHOJZfqv_DESX5_FcVpA,16443
53
55
  dataops_cli/sdk/ref.py,sha256=BPttMiqaW7z1nuCvgY0nV6d-u1O1i_EbEJ7ZrL0KhFY,1925
54
- dataops_cli/sdk/report.py,sha256=3WQrNluI8sH80Pm_30bjtTuDhu0H-JZtuOpw0HmX22s,418
55
- dataops_cli/sdk/table.py,sha256=PbFI5MatzYMtvsQpZEKyVHNQ-LwUuCHWwyoaJzKtxSw,5730
56
- dataops_cli/sdk/workflow.py,sha256=uTlqzZVZUgQExTQ3N0b_bokqMcp-rCENV9H7D9OfyZA,508
56
+ dataops_cli/sdk/report.py,sha256=uBmfgPCzqRMJQk8yS3kqSMLgOKijKEDRNOWamhjC6mw,376
57
+ dataops_cli/sdk/table.py,sha256=zNaoqZMIC2Ot-gIsy-smf6eBlw0LVH6-s0ycfzlO6Dw,6646
58
+ dataops_cli/sdk/workflow.py,sha256=go39E4Cc96bEuNW0pGeDvZZwonkKQ5njMaFTwLW-3jE,472
57
59
  dataops_cli/tiptap/__init__.py,sha256=UaHc1Q0T6OtmN02WNxTY1tp1-Iw8wzZjIyZE6rlMBgQ,612
58
60
  dataops_cli/tiptap/builder.py,sha256=w8lzbCcRo-AOFRvOoN3b_JV4hNLch_iSPbcYIcSqelk,2245
59
61
  dataops_cli/tiptap/constants.py,sha256=mkD8wRxKxPyvGl7V-csl8W4VRehfuUYJsm_2lWTS2Xk,3055
@@ -62,8 +64,8 @@ dataops_cli/tiptap/parse_utils.py,sha256=iJ4_gean-tkPXks4UShXuyPAkUwwFh41WL6cS7G
62
64
  dataops_cli/tiptap/render_utils.py,sha256=f5CDNLm0Y3uPXD0oPEjq4cKw1hDvWviY3IVlfS05vzE,21021
63
65
  dataops_cli/tiptap/renderers.py,sha256=qHAeYZeJf1Wip0svKtmy-28uFSeoTELzh3iE8bAQwaw,1235
64
66
  dataops_cli/tiptap/tool.py,sha256=7Uxoq-Kv_3XzU5ZW0k16wzwz79nhQf8D6qq7ygxERLw,27902
65
- data_ops_cli-0.2.1.dist-info/METADATA,sha256=33xzlMcc6PPkzL5ddA_zRina1_iKucLb5Z72hN8CvQ0,503
66
- data_ops_cli-0.2.1.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
67
- data_ops_cli-0.2.1.dist-info/entry_points.txt,sha256=vc_2b5byVdLofaQ2ppuPM484AcaZnGsaHdcMKmtcSkU,53
68
- data_ops_cli-0.2.1.dist-info/top_level.txt,sha256=KFHplpKxwE9_wWypzVLESa4eLkOBsk-iUD_Qbld2IcY,12
69
- data_ops_cli-0.2.1.dist-info/RECORD,,
67
+ data_ops_cli-0.2.2.dist-info/METADATA,sha256=T_6XcM0uKaqxt2yeEsc6Yzy97JwvC8ez-PFaFCfZbgc,503
68
+ data_ops_cli-0.2.2.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
69
+ data_ops_cli-0.2.2.dist-info/entry_points.txt,sha256=vc_2b5byVdLofaQ2ppuPM484AcaZnGsaHdcMKmtcSkU,53
70
+ data_ops_cli-0.2.2.dist-info/top_level.txt,sha256=KFHplpKxwE9_wWypzVLESa4eLkOBsk-iUD_Qbld2IcY,12
71
+ data_ops_cli-0.2.2.dist-info/RECORD,,
dataops_cli/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.2.1"
1
+ __version__ = "0.2.2"
dataops_cli/cli/auth.py CHANGED
@@ -12,7 +12,6 @@ import typer
12
12
  from rich.console import Console
13
13
  from rich.table import Table
14
14
 
15
- from dataops_cli.cli.datasource import get_datasource_config
16
15
  from dataops_cli.constants import USER_INFO_FILE
17
16
  from dataops_cli.exceptions import AuthenticationError
18
17
  from dataops_cli.schems import UserInfo
@@ -23,6 +22,7 @@ from dataops_cli.sdk.auth import (
23
22
  service_logout,
24
23
  service_set_application,
25
24
  )
25
+ from dataops_cli.sdk.datasource import get_application_datasource_config
26
26
  from dataops_cli.utils import get_work_dir
27
27
 
28
28
  auth_typer = typer.Typer(name="auth", help="认证相关命令", no_args_is_help=True)
@@ -43,14 +43,30 @@ def auth_status() -> None:
43
43
  print("未登录")
44
44
  else:
45
45
  user_info = UserInfo.model_validate_json(target_path.read_bytes())
46
-
47
- # application
48
- application = service_get_current_application()
49
- if application is None:
50
- print(f"用户 `{user_info.user_name}` 已登录, 应用未设置")
46
+ try:
47
+ # application
48
+ application = service_get_current_application()
49
+ datasource_config = get_application_datasource_config()
50
+ except AuthenticationError:
51
+ print(f"{user_info.true_name}({user_info.user_name})登录过期,请重新登录")
51
52
  else:
52
- print(f"用户 `{user_info.user_name}` 已登录, 应用设置为 `{application.CODE}`")
53
- get_datasource_config()
53
+ if application is None:
54
+ print(f"{user_info.true_name}({user_info.user_name})已登录, 应用未设置")
55
+ else:
56
+ print(
57
+ f"{user_info.true_name}({user_info.user_name})已登录, 应用设置为{application.LABEL_CN}({application.CODE})"
58
+ )
59
+
60
+ table = Table(
61
+ "datasource",
62
+ "功能",
63
+ title=f"应用数据源配置\n{application.LABEL_CN}({application.CODE})",
64
+ )
65
+ table.add_row(datasource_config.main.name, "主数据源")
66
+ table.add_row(datasource_config.hazard_read.name, "隐患读数据源")
67
+ table.add_row(datasource_config.hazard_write.name, "隐患写数据源")
68
+ console = Console(no_color=True)
69
+ console.print(table)
54
70
 
55
71
 
56
72
  @auth_typer.command("login", no_args_is_help=True)
@@ -1,21 +1,37 @@
1
+ """多维表格 (DataTable) CLI 命令模块.
2
+
3
+ 提供多维表格的列表查询和详情功能。
4
+ """
5
+
1
6
  from __future__ import annotations
2
7
 
3
- from typing import Annotated
8
+ from typing import Annotated, Optional
4
9
 
5
10
  import typer
6
11
  from rich.console import Console
7
12
  from rich.table import Table
8
13
 
14
+ from dataops_cli.cli.utils import render_table
9
15
  from dataops_cli.exceptions import DataOpsError
10
- from dataops_cli.schems import MetaType
16
+ from dataops_cli.schems import MetaType, PageParam, SqlQueryParam
17
+ from dataops_cli.sdk import (
18
+ service_get_data_table_by_code,
19
+ service_get_data_table_by_name,
20
+ service_get_data_table_data_by_code,
21
+ service_get_data_table_data_by_name,
22
+ )
11
23
  from dataops_cli.sdk.meta import release_list_list
12
24
  from dataops_cli.utils import filter_nodes_by_pattern
13
25
 
14
26
  # ---------------------------------------------------------------------------
15
- # CLI 命令(薄包装,负责输出渲染)
27
+ # CLI 命令
16
28
  # ---------------------------------------------------------------------------
17
29
 
18
- data_table_typer = typer.Typer(name="data_table", help="多维表格相关", no_args_is_help=True)
30
+ data_table_typer = typer.Typer(
31
+ name="data_table",
32
+ help="多维表格相关",
33
+ no_args_is_help=True,
34
+ )
19
35
 
20
36
 
21
37
  @data_table_typer.command("list")
@@ -23,8 +39,23 @@ def list_datatable(
23
39
  datasource: Annotated[str | None, typer.Argument(help="数据源")] = None,
24
40
  query: Annotated[str | None, typer.Option("-q", "--query", help="正则表达式")] = None,
25
41
  ) -> None:
42
+ """列出所有多维表格.
43
+
44
+ 从元数据服务获取多维表格列表,支持通过正则表达式按名称、标题或备注进行过滤。
45
+
46
+ 示例:
47
+ 列出所有多维表格
48
+ >>> data-ops-cli data_table list
49
+
50
+ 按数据源过滤
51
+ >>> data-ops-cli data_table list my_datasource
52
+
53
+ 按名称/标题/备注过滤
54
+ >>> data-ops-cli data_table list --query ".*报表.*"
55
+ >>> data-ops-cli data_table list -q "日报"
56
+ """
26
57
  try:
27
- group_nodes = release_list_list(MetaType.DATA_TABLE.value, datasource=datasource)
58
+ group_nodes = release_list_list(MetaType.DATA_TABLE, datasource=datasource)
28
59
  except DataOpsError as e:
29
60
  typer.echo(f"错误: {e.message}")
30
61
  raise typer.Exit(code=1) from None
@@ -32,12 +63,198 @@ def list_datatable(
32
63
  if query:
33
64
  group_nodes = filter_nodes_by_pattern(group_nodes, query, include_digest=True)
34
65
 
35
- table = Table("code", "alias", "remark")
66
+ table = Table("code", "title", "remark")
36
67
  console = Console(no_color=True)
37
68
  for column in group_nodes:
38
69
  table.add_row(column.CODE, column.TITLE, column.REMARK or "")
39
70
  console.print(table)
40
71
 
41
72
 
73
+ @data_table_typer.command("detail", no_args_is_help=True)
74
+ def get_datatable_detail(
75
+ arg1: Annotated[str, typer.Argument(help="编码或数据源")],
76
+ name: Annotated[Optional[str], typer.Argument(help="表名")] = None,
77
+ ) -> None:
78
+ """获取多维表格的完整详情.
79
+
80
+ 根据多维表格编码获取详细信息,包括字段定义、模型配置、查询配置等。
81
+ 支持通过 --field 选项输出指定字段。
82
+
83
+ 示例:
84
+ 获取多维表格完整信息
85
+ >>> data-ops-cli data_table detail dt_code_001
86
+
87
+ 只输出字段列表 (fields)
88
+ >>> data-ops-cli data_table detail dt_code_001 --field data.fields
89
+
90
+ 输出指定字段的 JSON
91
+ >>> data-ops-cli data_table detail dt_code_001 -f data
92
+ """
93
+ try:
94
+ meta = (
95
+ service_get_data_table_by_name(arg1, name)
96
+ if name
97
+ else service_get_data_table_by_code(arg1)
98
+ )
99
+ except DataOpsError as e:
100
+ typer.echo(e.message)
101
+ raise typer.Exit(code=1) from None
102
+
103
+ table = Table("field", "value", show_header=False)
104
+ table.add_row("datasource", meta.data.model.datasource)
105
+ table.add_row("引用类型", meta.data.model.ref_type)
106
+ table.add_row("引用编码", meta.data.model.ref_code)
107
+ table.add_row("引用表名", meta.data.model.table_name)
108
+
109
+ console = Console(no_color=True)
110
+ console.print(table)
111
+
112
+ table = Table("column(visable)", "type", "title", "visible", title="字段")
113
+ for field in meta.data.fields:
114
+ table.add_row(field.name + f"({'√' if field.visible else 'x'})", field.type, field.title)
115
+ console.print(table)
116
+
117
+ # TODO 完善输出
118
+
119
+
120
+ # @data_table_typer.command("create", no_args_is_help=True)
121
+ # def create_datatable(
122
+ # code: Annotated[str, typer.Argument(help="多维表格编码")],
123
+ # title: Annotated[str, typer.Argument(help="中文标题")],
124
+ # data_file: Annotated[
125
+ # str,
126
+ # typer.Argument(
127
+ # help="meta.data JSON 文件路径或 JSON 字符串 (以 { 开头视为 JSON, 否则视为文件路径)"
128
+ # ),
129
+ # ],
130
+ # remark: Annotated[str | None, typer.Option("-r", "--remark", help="备注")] = None,
131
+ # ) -> None:
132
+ # """创建多维表格.
133
+
134
+ # 从本地 JSON 文件读取 meta.data 配置并创建多维表格。
135
+
136
+ # 示例:
137
+ # 从文件创建
138
+ # >>> data-ops-cli data_table create dt_code_001 "测试表格" ./data_table.json
139
+
140
+ # 直接传入 JSON 字符串
141
+ # >>> data-ops-cli data_table create dt_code_001 "测试表格" '{"model": {...}, "fields": [...]}'
142
+ # """
143
+ # # 解析 data: 可能是文件路径或 JSON 字符串
144
+ # data: dict
145
+ # if data_file.strip().startswith("{"):
146
+ # try:
147
+ # data = json.loads(data_file)
148
+ # except json.JSONDecodeError as e:
149
+ # typer.echo(f"错误: JSON 解析失败: {e}")
150
+ # raise typer.Exit(code=1) from None
151
+ # else:
152
+ # path = Path(data_file)
153
+ # if not path.exists():
154
+ # typer.echo(f"错误: 文件不存在: {data_file}")
155
+ # raise typer.Exit(code=1) from None
156
+ # try:
157
+ # data = json.loads(path.read_text(encoding="utf-8"))
158
+ # except json.JSONDecodeError as e:
159
+ # typer.echo(f"错误: JSON 文件解析失败: {e}")
160
+ # raise typer.Exit(code=1) from None
161
+
162
+ # try:
163
+ # result = service_create_data_table(code=code, title=title, data=data)
164
+ # cuid = result.get("cuid", "") if isinstance(result, dict) else ""
165
+ # typer.echo(f"成功创建多维表格: code={code}, cuid={cuid}")
166
+ # except DataOpsError as e:
167
+ # typer.echo(f"错误: {e.message}")
168
+ # raise typer.Exit(code=1) from None
169
+
170
+
171
+ # @data_table_typer.command("update", no_args_is_help=True)
172
+ # def update_datatable(
173
+ # code: Annotated[str, typer.Argument(help="多维表格编码")],
174
+ # title: Annotated[str, typer.Argument(help="中文标题")],
175
+ # data_file: Annotated[
176
+ # str,
177
+ # typer.Argument(help="meta.data JSON 文件路径或 JSON 字符串"),
178
+ # ],
179
+ # cuid: Annotated[
180
+ # str | None, typer.Option("-c", "--cuid", help="元数据 CUID (更新时必传)")
181
+ # ] = None,
182
+ # ) -> None:
183
+ # """更新多维表格.
184
+
185
+ # 从本地 JSON 文件读取 meta.data 配置并更新多维表格。
186
+ # 需要通过 --cuid 指定要更新的元数据 CUID。
187
+
188
+ # 示例:
189
+ # 从文件更新
190
+ # >>> data-ops-cli data_table update dt_code_001 "测试表格" ./data_table.json --cuid abc123
191
+
192
+ # 直接传入 JSON 字符串
193
+ # >>> data-ops-cli data_table update dt_code_001 "测试表格" '{"model": {...}, "fields": [...]}' -c abc123
194
+ # """
195
+ # if not cuid:
196
+ # typer.echo("错误: 更新操作需要 --cuid 参数,请先通过 detail 命令获取 CUID")
197
+ # raise typer.Exit(code=1) from None
198
+
199
+ # # 解析 data: 可能是文件路径或 JSON 字符串
200
+ # data: dict
201
+ # if data_file.strip().startswith("{"):
202
+ # try:
203
+ # data = json.loads(data_file)
204
+ # except json.JSONDecodeError as e:
205
+ # typer.echo(f"错误: JSON 解析失败: {e}")
206
+ # raise typer.Exit(code=1) from None
207
+ # else:
208
+ # path = Path(data_file)
209
+ # if not path.exists():
210
+ # typer.echo(f"错误: 文件不存在: {data_file}")
211
+ # raise typer.Exit(code=1) from None
212
+ # try:
213
+ # data = json.loads(path.read_text(encoding="utf-8"))
214
+ # except json.JSONDecodeError as e:
215
+ # typer.echo(f"错误: JSON 文件解析失败: {e}")
216
+ # raise typer.Exit(code=1) from None
217
+
218
+ # try:
219
+ # service_update_data_table(code=code, title=title, data=data, cuid=cuid)
220
+ # typer.echo(f"成功更新多维表格: code={code}, cuid={cuid}")
221
+ # except DataOpsError as e:
222
+ # typer.echo(f"错误: {e.message}")
223
+ # raise typer.Exit(code=1) from None
224
+
225
+
226
+ @data_table_typer.command("data", no_args_is_help=True)
227
+ def get_datatable_data(
228
+ arg1: Annotated[str, typer.Argument(help="编码或数据源")],
229
+ name: Annotated[Optional[str], typer.Argument(help="表名")] = None,
230
+ page: Annotated[int, typer.Option("--page", "-p", min=0, help="耶稣")] = 0,
231
+ size: Annotated[int, typer.Option("--size", "-l", min=0, help="单页数")] = 20,
232
+ query_param: Annotated[
233
+ str | None, typer.Option("--query", "-q", help="查询参数(SqlQueryParam)")
234
+ ] = None,
235
+ ) -> None:
236
+ """获取多维表格数据.
237
+
238
+ 示例:
239
+ >>> data-ops-cli data_table data dt_code_001
240
+ """
241
+ pp = PageParam(start=page, limit=size)
242
+ qp = SqlQueryParam.model_validate_json(query_param) if query_param else SqlQueryParam()
243
+
244
+ try:
245
+ data = (
246
+ service_get_data_table_data_by_name(arg1, name, pp, qp)
247
+ if name
248
+ else service_get_data_table_data_by_code(arg1, pp, qp)
249
+ )
250
+ except DataOpsError as e:
251
+ typer.echo(f"错误: {e.message}")
252
+ raise typer.Exit(code=1) from None
253
+ if not data:
254
+ print("未查询到数据")
255
+ return
256
+ print(render_table(data))
257
+
258
+
42
259
  if __name__ == "__main__":
43
260
  list_datatable()
@@ -5,8 +5,7 @@ from rich.console import Console
5
5
  from rich.table import Table
6
6
 
7
7
  from dataops_cli.exceptions import DataOpsError
8
- from dataops_cli.schems.datasource import MetaDataSourceDDL
9
- from dataops_cli.schems.enums import MetaType
8
+ from dataops_cli.schems import DataSourceDDL, MetaType
10
9
  from dataops_cli.sdk.meta import release_list_get_by_code, release_list_list
11
10
  from dataops_cli.utils import filter_nodes_by_pattern
12
11
 
@@ -62,7 +61,7 @@ def get_dataset_detail_by_code(
62
61
  >>> data-ops-cli dataset detail my_dataset_code --full
63
62
  """
64
63
  try:
65
- meta = release_list_get_by_code(MetaType.DATASET.value, code, _class=MetaDataSourceDDL)
64
+ meta = release_list_get_by_code(MetaType.DATASET.value, code, _class=DataSourceDDL)
66
65
  except DataOpsError as e:
67
66
  typer.echo(f"错误: {e.message}")
68
67
  raise typer.Exit(code=1) from None
@@ -18,7 +18,7 @@ from dataops_cli.exceptions import DataOpsError
18
18
  from dataops_cli.schems import (
19
19
  InnerMetaType,
20
20
  )
21
- from dataops_cli.sdk.datasource import get_datasource
21
+ from dataops_cli.sdk.datasource import get_application_datasource_config, get_datasource
22
22
  from dataops_cli.sdk.meta import release_list_list
23
23
  from dataops_cli.sdk.table import (
24
24
  service_get_table_data_by_name,
@@ -47,16 +47,13 @@ def get_datasource_config() -> None:
47
47
  >>> data-ops-cli datasource config
48
48
  """
49
49
  application = get_application()
50
- # 主数据源
51
- datasource_main = get_datasource()
52
- # 隐患读数据源
53
- datasource_hazard_read = get_datasource(param_name="datasource_hazard_read")
54
- # 隐患写数据源
55
- datasource_hazard_write = get_datasource(param_name="datasource_hazard_write")
56
- table = Table("name", "功能", title=f"{application.LABEL_CN}({application.CODE})\n数据源配置")
57
- table.add_row(datasource_main.name, "主数据源")
58
- table.add_row(datasource_hazard_read.name, "隐患读数据源")
59
- table.add_row(datasource_hazard_write.name, "隐患写数据源")
50
+ datasource_config = get_application_datasource_config(application.CUID)
51
+ table = Table(
52
+ "name", "功能", title=f"应用数据源配置\n{application.LABEL_CN}({application.CODE})"
53
+ )
54
+ table.add_row(datasource_config.main.name, "主数据源")
55
+ table.add_row(datasource_config.hazard_read.name, "隐患读数据源")
56
+ table.add_row(datasource_config.hazard_write.name, "隐患写数据源")
60
57
  console = Console(no_color=True)
61
58
  console.print(table)
62
59
 
dataops_cli/cli/table.py CHANGED
@@ -86,10 +86,11 @@ def get_table_detail(
86
86
  >>> data-ops-cli table detail mydatasource t_user --full
87
87
  """
88
88
  try:
89
- if name:
90
- meta = service_get_table_detail_by_name(arg1, name)
91
- else:
92
- meta = service_get_table_detail_by_code(arg1)
89
+ meta = (
90
+ service_get_table_detail_by_name(arg1, name)
91
+ if name
92
+ else service_get_table_detail_by_code(arg1)
93
+ )
93
94
  except DataOpsError as e:
94
95
  typer.echo(f"错误: {e.message}")
95
96
  raise typer.Exit(code=1) from None
dataops_cli/cli/widget.py CHANGED
@@ -55,5 +55,6 @@ def detail_widget(
55
55
 
56
56
  typer.echo(json.dumps(meta.data, indent=2, ensure_ascii=False))
57
57
 
58
+
58
59
  if __name__ == "__main__":
59
60
  list_widget()
@@ -108,7 +108,7 @@ def get_workflow_detail(
108
108
 
109
109
  print(f"{n_id}:", to_json(node.data.config).decode("utf-8"))
110
110
  if code_content:
111
- print(f"```{node.data.config.get('language', '')}")
111
+ print(f"\n```{node.data.config.get('language', '')}")
112
112
  print(code_content)
113
113
  print("```")
114
114
  if node_id:
dataops_cli/exceptions.py CHANGED
@@ -17,3 +17,15 @@ class AuthenticationError(DataOpsError):
17
17
  """认证失败异常。"""
18
18
 
19
19
  pass
20
+
21
+
22
+ class FailedToCreateError(DataOpsError):
23
+ """创建失败异常。"""
24
+
25
+ pass
26
+
27
+
28
+ class FailedToUpdateError(DataOpsError):
29
+ """更新失败异常。"""
30
+
31
+ pass
@@ -2,4 +2,4 @@ from .config import NacosSettings
2
2
  from .instance import Instance
3
3
  from .service import Service
4
4
 
5
- __all__ = ['Service', 'Instance', 'NacosSettings']
5
+ __all__ = ["Service", "Instance", "NacosSettings"]
@@ -310,8 +310,8 @@ class DatabaseConn(DatabaseConnBase):
310
310
  if len(args) > 1 and isinstance(args[0], list):
311
311
  return sql, list(map(tuple, args))
312
312
  else:
313
- # return sql, tuple(args)
314
- return sql, args
313
+ return sql, tuple(args)
314
+ # return sql, args
315
315
  else:
316
316
  return sql, args
317
317
 
@@ -1,9 +1,20 @@
1
- from .datasource import MetaDataSourceDDL
1
+ from .data_table import DataTableData, MetaDataTable
2
+ from .datasource import DataSourceDDL, MetaDataSourceDDL
2
3
  from .enums import InnerMetaType, MetaType
3
4
  from .group import GroupNode
4
- from .meta import Meta, MetaBase, MetaRef, MetaRelease
5
+ from .meta import (
6
+ DEFAULT_META_DATA_TYPE,
7
+ META_DATA_TYPE,
8
+ Meta,
9
+ MetaBase,
10
+ MetaCreate,
11
+ MetaRef,
12
+ MetaRelease,
13
+ MetaUpdate,
14
+ )
5
15
  from .query import PageParam, SqlCondition, SqlQueryParam, SqlSort
6
- from .report import ReportMeta
16
+ from .report import ReportMeta, ReportMetaData
17
+ from .table import DataDict
7
18
  from .user import Application, UserInfo
8
- from .workflow import MetaWorkflow
9
19
  from .widget import WidgetMeta
20
+ from .workflow import DataWorkflow, MetaWorkflow