bigeye-cli 0.8.1__tar.gz → 0.8.3__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.
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/PKG-INFO +10 -4
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/CLI_DOCS.md +8 -2
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/catalog/custom_repo_commands.py +72 -3
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/lineage/lineage_commands.py +52 -2
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/pyproject.toml +2 -2
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/LICENSE +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/__main__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/__version__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/bigconfig_commands.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/bigconfig_options.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/catalog/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/catalog/catalog_commands.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/collections/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/collections/collection_commands.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/configure/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/configure/configure_commands.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/deltas/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/deltas/deltas_commands.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/enums.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/exceptions/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/exceptions/exceptions.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/functions.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/global_options.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/issues/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/issues/issue_commands.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/lineage/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/metric/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/metric/metric_commands.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/model/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/model/cicd_conf.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/model/github_report.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/model/vendor_report.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/workspace/__init__.py +0 -0
- {bigeye_cli-0.8.1 → bigeye_cli-0.8.3}/bigeye_cli/workspace/workspace_commands.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: bigeye-cli
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.3
|
|
4
4
|
Summary: Bigeye CLI offers developer tools for maintaining your developer workspace.
|
|
5
5
|
Home-page: https://docs.bigeye.com/docs
|
|
6
6
|
License: Proprietary
|
|
@@ -12,13 +12,13 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
14
|
Requires-Dist: PyGithub (>=1.59.1,<2.0.0)
|
|
15
|
-
Requires-Dist: bigeye-sdk (>=0.11.
|
|
15
|
+
Requires-Dist: bigeye-sdk (>=0.11.2,<0.12.0)
|
|
16
16
|
Requires-Dist: click (>=8.1.8,<9.0.0)
|
|
17
17
|
Requires-Dist: rich (>=14.1.0,<15.0.0)
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
19
|
|
|
20
20
|
# **Bigeye CLI**
|
|
21
|
-
Version: 0.8.
|
|
21
|
+
Version: 0.8.3
|
|
22
22
|
## Installation
|
|
23
23
|
|
|
24
24
|
**Setting up your local/build environment**
|
|
@@ -197,7 +197,7 @@ Configuration Commands for Bigeye CLI
|
|
|
197
197
|
**Usage**:
|
|
198
198
|
|
|
199
199
|
```console
|
|
200
|
-
$ bigeye configure [OPTIONS] COMMAND [ARGS]...
|
|
200
|
+
$ bigeye configure [OPTIONS] [COMMAND] [ARGS]...
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
**Options**:
|
|
@@ -1343,6 +1343,8 @@ $ bigeye catalog custom-repo import [OPTIONS]
|
|
|
1343
1343
|
* `-w, --workspace TEXT`: Name of the workspace configuration. [env var: BIGEYE_WORKSPACE; default: DEFAULT]
|
|
1344
1344
|
* `-f, --file TEXT`: Path to the custom repository .xlsx workbook. [required]
|
|
1345
1345
|
* `--cleanup-stale`: Delete nodes/edges present in Bigeye but missing from the sheet. Off by default.
|
|
1346
|
+
* `--skip-unresolved-edges / --no-skip-unresolved-edges`: Import the rest instead of aborting when some edge endpoints don't resolve to a Bigeye node (default: on). Skipped endpoints are written to the unresolved log. Pass --no-skip-unresolved-edges to abort on any unresolved endpoint. [default: skip-unresolved-edges]
|
|
1347
|
+
* `--unresolved-log TEXT`: Path for the unresolved-endpoints log. Defaults to custom_repo_unresolved.log in the current working directory. [default: custom_repo_unresolved.log]
|
|
1346
1348
|
* `--help`: Show this message and exit.
|
|
1347
1349
|
|
|
1348
1350
|
### `bigeye catalog custom-repo export`
|
|
@@ -2015,6 +2017,8 @@ $ bigeye lineage export-graphs [OPTIONS]
|
|
|
2015
2017
|
* `--direction [upstream|downstream|both]`: Direction to traverse: upstream, downstream, or both. [default: both]
|
|
2016
2018
|
* `--content [all|nodes|edges|attributes]`: What each per-graph report contains: all, nodes, edges, or attributes. [default: all]
|
|
2017
2019
|
* `--include-etl / --no-include-etl`: Include or exclude ETL operator nodes. Defaults to including them. [default: include-etl]
|
|
2020
|
+
* `--depth INTEGER`: Per-window traversal depth. When set, the graph is built in bounded depth-hop windows (re-rooting at the lineage frontier) up to the workspace's lineage.max_depth, avoiding the oversized single response that fails on very large graphs. Applies to every FQN; a per-row 'depth' column in the FQNs file overrides it for that row. Omit to request the full graph in one call (the previous behavior).
|
|
2021
|
+
* `--concurrency INTEGER`: Max concurrent window requests when --depth is used. Lower it to reduce client memory and server load on wide graphs. [default: 8]
|
|
2018
2022
|
* `-o, --output TEXT`: Output .zip path. Defaults to lineage_graphs.zip in the current directory.
|
|
2019
2023
|
* `--help`: Show this message and exit.
|
|
2020
2024
|
|
|
@@ -2042,6 +2046,8 @@ $ bigeye lineage export-end-to-end [OPTIONS]
|
|
|
2042
2046
|
* `--direction [upstream|downstream|both]`: Direction to trace: upstream, downstream, or both. [default: both]
|
|
2043
2047
|
* `--granularity [schema|table|column]`: Hop level: schema, table, or column. Defaults to each root's own level.
|
|
2044
2048
|
* `--max-paths INTEGER`: Per-root cap on enumerated paths. Truncation is logged, never silent. [default: 10000]
|
|
2049
|
+
* `--depth INTEGER`: Per-window traversal depth. When set, each root's graph is fetched in bounded depth-hop windows, re-rooting at the lineage frontier until the lineage is exhausted end-to-end. This escapes the backend's per-request depth ceiling (lineage.max_depth) that truncates a single full fetch, and keeps each request small so very large graphs don't fail. Omit to request the graph in one call (the previous behavior, capped at the backend depth limit).
|
|
2050
|
+
* `--concurrency INTEGER`: Max concurrent window requests when --depth is used. Lower it to reduce client memory and server load on wide graphs. Ignored without --depth. [default: 8]
|
|
2045
2051
|
* `-o, --output TEXT`: Output .csv path. Defaults to end_to_end_<root>.csv in the current directory.
|
|
2046
2052
|
* `--help`: Show this message and exit.
|
|
2047
2053
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# **Bigeye CLI**
|
|
2
|
-
Version: 0.8.
|
|
2
|
+
Version: 0.8.3
|
|
3
3
|
## Installation
|
|
4
4
|
|
|
5
5
|
**Setting up your local/build environment**
|
|
@@ -178,7 +178,7 @@ Configuration Commands for Bigeye CLI
|
|
|
178
178
|
**Usage**:
|
|
179
179
|
|
|
180
180
|
```console
|
|
181
|
-
$ bigeye configure [OPTIONS] COMMAND [ARGS]...
|
|
181
|
+
$ bigeye configure [OPTIONS] [COMMAND] [ARGS]...
|
|
182
182
|
```
|
|
183
183
|
|
|
184
184
|
**Options**:
|
|
@@ -1324,6 +1324,8 @@ $ bigeye catalog custom-repo import [OPTIONS]
|
|
|
1324
1324
|
* `-w, --workspace TEXT`: Name of the workspace configuration. [env var: BIGEYE_WORKSPACE; default: DEFAULT]
|
|
1325
1325
|
* `-f, --file TEXT`: Path to the custom repository .xlsx workbook. [required]
|
|
1326
1326
|
* `--cleanup-stale`: Delete nodes/edges present in Bigeye but missing from the sheet. Off by default.
|
|
1327
|
+
* `--skip-unresolved-edges / --no-skip-unresolved-edges`: Import the rest instead of aborting when some edge endpoints don't resolve to a Bigeye node (default: on). Skipped endpoints are written to the unresolved log. Pass --no-skip-unresolved-edges to abort on any unresolved endpoint. [default: skip-unresolved-edges]
|
|
1328
|
+
* `--unresolved-log TEXT`: Path for the unresolved-endpoints log. Defaults to custom_repo_unresolved.log in the current working directory. [default: custom_repo_unresolved.log]
|
|
1327
1329
|
* `--help`: Show this message and exit.
|
|
1328
1330
|
|
|
1329
1331
|
### `bigeye catalog custom-repo export`
|
|
@@ -1996,6 +1998,8 @@ $ bigeye lineage export-graphs [OPTIONS]
|
|
|
1996
1998
|
* `--direction [upstream|downstream|both]`: Direction to traverse: upstream, downstream, or both. [default: both]
|
|
1997
1999
|
* `--content [all|nodes|edges|attributes]`: What each per-graph report contains: all, nodes, edges, or attributes. [default: all]
|
|
1998
2000
|
* `--include-etl / --no-include-etl`: Include or exclude ETL operator nodes. Defaults to including them. [default: include-etl]
|
|
2001
|
+
* `--depth INTEGER`: Per-window traversal depth. When set, the graph is built in bounded depth-hop windows (re-rooting at the lineage frontier) up to the workspace's lineage.max_depth, avoiding the oversized single response that fails on very large graphs. Applies to every FQN; a per-row 'depth' column in the FQNs file overrides it for that row. Omit to request the full graph in one call (the previous behavior).
|
|
2002
|
+
* `--concurrency INTEGER`: Max concurrent window requests when --depth is used. Lower it to reduce client memory and server load on wide graphs. [default: 8]
|
|
1999
2003
|
* `-o, --output TEXT`: Output .zip path. Defaults to lineage_graphs.zip in the current directory.
|
|
2000
2004
|
* `--help`: Show this message and exit.
|
|
2001
2005
|
|
|
@@ -2023,6 +2027,8 @@ $ bigeye lineage export-end-to-end [OPTIONS]
|
|
|
2023
2027
|
* `--direction [upstream|downstream|both]`: Direction to trace: upstream, downstream, or both. [default: both]
|
|
2024
2028
|
* `--granularity [schema|table|column]`: Hop level: schema, table, or column. Defaults to each root's own level.
|
|
2025
2029
|
* `--max-paths INTEGER`: Per-root cap on enumerated paths. Truncation is logged, never silent. [default: 10000]
|
|
2030
|
+
* `--depth INTEGER`: Per-window traversal depth. When set, each root's graph is fetched in bounded depth-hop windows, re-rooting at the lineage frontier until the lineage is exhausted end-to-end. This escapes the backend's per-request depth ceiling (lineage.max_depth) that truncates a single full fetch, and keeps each request small so very large graphs don't fail. Omit to request the graph in one call (the previous behavior, capped at the backend depth limit).
|
|
2031
|
+
* `--concurrency INTEGER`: Max concurrent window requests when --depth is used. Lower it to reduce client memory and server load on wide graphs. Ignored without --depth. [default: 8]
|
|
2026
2032
|
* `-o, --output TEXT`: Output .csv path. Defaults to end_to_end_<root>.csv in the current directory.
|
|
2027
2033
|
* `--help`: Show this message and exit.
|
|
2028
2034
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
from datetime import datetime
|
|
2
3
|
from typing import Dict, List, Optional, Tuple
|
|
3
4
|
|
|
4
5
|
import typer
|
|
@@ -6,6 +7,7 @@ import typer
|
|
|
6
7
|
from bigeye_cli import global_options
|
|
7
8
|
from bigeye_cli.functions import cli_client_factory
|
|
8
9
|
from bigeye_sdk.controller.custom_repository_controller import CustomRepositoryController
|
|
10
|
+
from bigeye_sdk.generated.com.bigeye.models.generated import DataNodeType
|
|
9
11
|
from bigeye_sdk.log import get_logger
|
|
10
12
|
from bigeye_sdk.model.custom_repository_excel import (
|
|
11
13
|
SHEET_EDGES,
|
|
@@ -34,6 +36,38 @@ def _print_errors(header: str, errors: List[WorkbookValidationError]) -> None:
|
|
|
34
36
|
typer.echo(f" {error.format()}", err=True)
|
|
35
37
|
|
|
36
38
|
|
|
39
|
+
def _write_unresolved_log(
|
|
40
|
+
log_path: str, repo_name: str, unresolved: List[WorkbookValidationError]
|
|
41
|
+
) -> bool:
|
|
42
|
+
"""Write a log file naming the edge endpoints that could not be resolved to a
|
|
43
|
+
unique Bigeye node — either no match (the column/object does not exist) or more
|
|
44
|
+
than one match (ambiguous). Best-effort: returns False and warns if the file
|
|
45
|
+
cannot be written (the same endpoints are also printed to stderr).
|
|
46
|
+
|
|
47
|
+
Each endpoint is a catalog path 'Repo.schema.table.column' (or a warehouse FQN);
|
|
48
|
+
its final segment is the column/object in question.
|
|
49
|
+
"""
|
|
50
|
+
lines = [
|
|
51
|
+
"Custom repository import — unresolved edge endpoints",
|
|
52
|
+
f"Repository: {repo_name}",
|
|
53
|
+
f"Generated: {datetime.now().isoformat(timespec='seconds')}",
|
|
54
|
+
f"Count: {len(unresolved)}",
|
|
55
|
+
"",
|
|
56
|
+
"These endpoints could not be resolved to a unique Bigeye node (no match, or",
|
|
57
|
+
"more than one), so the edges referencing them were skipped. Each line below",
|
|
58
|
+
"states the reason and the endpoint value.",
|
|
59
|
+
"",
|
|
60
|
+
]
|
|
61
|
+
lines.extend(error.format() for error in unresolved)
|
|
62
|
+
try:
|
|
63
|
+
with open(log_path, "w") as f:
|
|
64
|
+
f.write("\n".join(lines) + "\n")
|
|
65
|
+
return True
|
|
66
|
+
except OSError as e:
|
|
67
|
+
typer.echo(f"Warning: could not write unresolved log to '{log_path}': {e}", err=True)
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
|
|
37
71
|
def _resolve_paths(
|
|
38
72
|
wb: CustomRepoWorkbook, controller: CustomRepositoryController
|
|
39
73
|
) -> Tuple[Dict[str, int], List[WorkbookValidationError]]:
|
|
@@ -46,7 +80,11 @@ def _resolve_paths(
|
|
|
46
80
|
controller.warm_warehouse_cache(endpoints)
|
|
47
81
|
for endpoint_type, value in endpoints:
|
|
48
82
|
if endpoint_type == EdgeEndpointType.CUSTOM.value:
|
|
49
|
-
|
|
83
|
+
# CUSTOM endpoints are catalog paths into custom-repository nodes; the
|
|
84
|
+
# type filter keeps the search off same-named warehouse/MetaCenter nodes.
|
|
85
|
+
matches = controller.resolve_catalog_path(
|
|
86
|
+
parse_catalog_path(value), search_type=DataNodeType.DATA_NODE_TYPE_CUSTOM
|
|
87
|
+
)
|
|
50
88
|
else:
|
|
51
89
|
matches = controller.resolve_warehouse_fqn(endpoint_type, value)
|
|
52
90
|
if not matches:
|
|
@@ -108,6 +146,19 @@ def import_repo(
|
|
|
108
146
|
"--cleanup-stale",
|
|
109
147
|
help="Delete nodes/edges present in Bigeye but missing from the sheet. Off by default.",
|
|
110
148
|
),
|
|
149
|
+
skip_unresolved_edges: bool = typer.Option(
|
|
150
|
+
True,
|
|
151
|
+
"--skip-unresolved-edges/--no-skip-unresolved-edges",
|
|
152
|
+
help="Import the rest instead of aborting when some edge endpoints don't resolve "
|
|
153
|
+
"to a Bigeye node (default: on). Skipped endpoints are written to the unresolved "
|
|
154
|
+
"log. Pass --no-skip-unresolved-edges to abort on any unresolved endpoint.",
|
|
155
|
+
),
|
|
156
|
+
unresolved_log: str = typer.Option(
|
|
157
|
+
"custom_repo_unresolved.log",
|
|
158
|
+
"--unresolved-log",
|
|
159
|
+
help="Path for the unresolved-endpoints log. Defaults to "
|
|
160
|
+
"custom_repo_unresolved.log in the current working directory.",
|
|
161
|
+
),
|
|
111
162
|
):
|
|
112
163
|
"""Import a custom repository from an Excel workbook."""
|
|
113
164
|
client = cli_client_factory(bigeye_conf, config_file, workspace)
|
|
@@ -126,10 +177,28 @@ def import_repo(
|
|
|
126
177
|
|
|
127
178
|
path_node_ids, unresolved = _resolve_paths(wb, controller)
|
|
128
179
|
if unresolved:
|
|
180
|
+
log_written = _write_unresolved_log(unresolved_log, wb.repo_name, unresolved)
|
|
129
181
|
_print_errors("Could not resolve all catalog path references", unresolved)
|
|
130
|
-
|
|
182
|
+
log_hint = f" (see '{unresolved_log}')" if log_written else ""
|
|
183
|
+
if not skip_unresolved_edges:
|
|
184
|
+
typer.echo(
|
|
185
|
+
f"{len(unresolved)} unresolved endpoint(s){log_hint}. "
|
|
186
|
+
f"Re-run with --skip-unresolved-edges to import the rest.",
|
|
187
|
+
err=True,
|
|
188
|
+
)
|
|
189
|
+
raise typer.Exit(code=1)
|
|
190
|
+
typer.echo(
|
|
191
|
+
f"Skipping {len(unresolved)} unresolvable endpoint(s){log_hint} "
|
|
192
|
+
f"and importing the rest.",
|
|
193
|
+
err=True,
|
|
194
|
+
)
|
|
131
195
|
|
|
132
|
-
config = build_config(
|
|
196
|
+
config = build_config(
|
|
197
|
+
wb,
|
|
198
|
+
path_node_ids=path_node_ids,
|
|
199
|
+
cleanup_stale=cleanup_stale,
|
|
200
|
+
drop_unresolved_edges=skip_unresolved_edges,
|
|
201
|
+
)
|
|
133
202
|
result = controller.sync_from_config(config, wait_for_completion=True)
|
|
134
203
|
|
|
135
204
|
log.info(
|
|
@@ -266,6 +266,21 @@ def export_graphs(
|
|
|
266
266
|
"--include-etl/--no-include-etl",
|
|
267
267
|
help="Include or exclude ETL operator nodes. Defaults to including them.",
|
|
268
268
|
),
|
|
269
|
+
depth: Optional[int] = typer.Option(
|
|
270
|
+
None,
|
|
271
|
+
"--depth",
|
|
272
|
+
help="Per-window traversal depth. When set, the graph is built in bounded depth-hop "
|
|
273
|
+
"windows (re-rooting at the lineage frontier) up to the workspace's lineage.max_depth, "
|
|
274
|
+
"avoiding the oversized single response that fails on very large graphs. Applies to "
|
|
275
|
+
"every FQN; a per-row 'depth' column in the FQNs file overrides it for that row. "
|
|
276
|
+
"Omit to request the full graph in one call (the previous behavior).",
|
|
277
|
+
),
|
|
278
|
+
concurrency: int = typer.Option(
|
|
279
|
+
8,
|
|
280
|
+
"--concurrency",
|
|
281
|
+
help="Max concurrent window requests when --depth is used. Lower it to reduce client "
|
|
282
|
+
"memory and server load on wide graphs.",
|
|
283
|
+
),
|
|
269
284
|
output: Optional[str] = typer.Option(
|
|
270
285
|
None,
|
|
271
286
|
"--output",
|
|
@@ -279,19 +294,31 @@ def export_graphs(
|
|
|
279
294
|
and writes one folder per FQN (nodes/edges/attributes) plus a top-level manifest of
|
|
280
295
|
successes and failures.
|
|
281
296
|
"""
|
|
297
|
+
if depth is not None and depth < 1:
|
|
298
|
+
typer.echo("--depth must be a positive integer (1 or greater).", err=True)
|
|
299
|
+
raise typer.Exit(code=1)
|
|
300
|
+
|
|
282
301
|
client = cli_client_factory(bigeye_conf, config_file, workspace)
|
|
283
302
|
controller = LineageCustomReporting(client)
|
|
284
303
|
|
|
285
304
|
try:
|
|
286
|
-
|
|
305
|
+
specs = read_fqns_file(fqns_file)
|
|
287
306
|
except OSError as e:
|
|
288
307
|
typer.echo(f"Could not read FQNs file '{fqns_file}': {e}", err=True)
|
|
289
308
|
raise typer.Exit(code=1)
|
|
290
309
|
|
|
291
|
-
if not
|
|
310
|
+
if not specs:
|
|
292
311
|
typer.echo(f"No FQNs found in '{fqns_file}'.", err=True)
|
|
293
312
|
raise typer.Exit(code=1)
|
|
294
313
|
|
|
314
|
+
fqns = [spec.fqn for spec in specs]
|
|
315
|
+
# Per-row depth wins; --depth is the default for rows without one. No depth anywhere -> full graph.
|
|
316
|
+
depth_by_fqn = {
|
|
317
|
+
spec.fqn: (spec.depth if spec.depth is not None else depth)
|
|
318
|
+
for spec in specs
|
|
319
|
+
if (spec.depth if spec.depth is not None else depth) is not None
|
|
320
|
+
}
|
|
321
|
+
|
|
295
322
|
output_path = output or "lineage_graphs.zip"
|
|
296
323
|
summary = controller.export_graphs(
|
|
297
324
|
fqns=fqns,
|
|
@@ -299,6 +326,8 @@ def export_graphs(
|
|
|
299
326
|
content=content,
|
|
300
327
|
include_etl=include_etl,
|
|
301
328
|
output_path=output_path,
|
|
329
|
+
depth_by_fqn=depth_by_fqn or None,
|
|
330
|
+
concurrency=concurrency,
|
|
302
331
|
)
|
|
303
332
|
|
|
304
333
|
log.info(
|
|
@@ -337,6 +366,21 @@ def export_end_to_end(
|
|
|
337
366
|
"--max-paths",
|
|
338
367
|
help="Per-root cap on enumerated paths. Truncation is logged, never silent.",
|
|
339
368
|
),
|
|
369
|
+
depth: Optional[int] = typer.Option(
|
|
370
|
+
None,
|
|
371
|
+
"--depth",
|
|
372
|
+
help="Per-window traversal depth. When set, each root's graph is fetched in bounded depth-hop "
|
|
373
|
+
"windows, re-rooting at the lineage frontier until the lineage is exhausted end-to-end. "
|
|
374
|
+
"This escapes the backend's per-request depth ceiling (lineage.max_depth) that truncates a "
|
|
375
|
+
"single full fetch, and keeps each request small so very large graphs don't fail. Omit to "
|
|
376
|
+
"request the graph in one call (the previous behavior, capped at the backend depth limit).",
|
|
377
|
+
),
|
|
378
|
+
concurrency: int = typer.Option(
|
|
379
|
+
8,
|
|
380
|
+
"--concurrency",
|
|
381
|
+
help="Max concurrent window requests when --depth is used. Lower it to reduce client "
|
|
382
|
+
"memory and server load on wide graphs. Ignored without --depth.",
|
|
383
|
+
),
|
|
340
384
|
output: Optional[str] = typer.Option(
|
|
341
385
|
None,
|
|
342
386
|
"--output",
|
|
@@ -351,6 +395,10 @@ def export_end_to_end(
|
|
|
351
395
|
collapsed to the chosen (or root-inferred) granularity — column/field hops roll
|
|
352
396
|
up to their containing table/object (warehouse tables, ETL targets, BI objects).
|
|
353
397
|
"""
|
|
398
|
+
if depth is not None and depth < 1:
|
|
399
|
+
typer.echo("--depth must be a positive integer (1 or greater).", err=True)
|
|
400
|
+
raise typer.Exit(code=1)
|
|
401
|
+
|
|
354
402
|
client = cli_client_factory(bigeye_conf, config_file, workspace)
|
|
355
403
|
controller = LineageCustomReporting(client)
|
|
356
404
|
|
|
@@ -361,6 +409,8 @@ def export_end_to_end(
|
|
|
361
409
|
granularity=granularity,
|
|
362
410
|
output_path=output_path,
|
|
363
411
|
max_paths=max_paths,
|
|
412
|
+
depth=depth,
|
|
413
|
+
concurrency=concurrency,
|
|
364
414
|
)
|
|
365
415
|
|
|
366
416
|
log.info(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "bigeye-cli"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.3"
|
|
4
4
|
description = "Bigeye CLI offers developer tools for maintaining your developer workspace."
|
|
5
5
|
license = "Proprietary"
|
|
6
6
|
authors = ["Bigeye <support@bigeye.com>"]
|
|
@@ -19,7 +19,7 @@ bigeye = "bigeye_cli.__main__:app"
|
|
|
19
19
|
[tool.poetry.dependencies]
|
|
20
20
|
python = "^3.11.0"
|
|
21
21
|
click = "^8.1.8"
|
|
22
|
-
bigeye-sdk = "^0.11.
|
|
22
|
+
bigeye-sdk = "^0.11.2"
|
|
23
23
|
rich = "^14.1.0"
|
|
24
24
|
PyGithub = '^1.59.1'
|
|
25
25
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|