bigeye-cli 0.8.2__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.2 → bigeye_cli-0.8.3}/PKG-INFO +8 -4
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/CLI_DOCS.md +6 -2
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/catalog/custom_repo_commands.py +72 -3
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/lineage/lineage_commands.py +21 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/pyproject.toml +2 -2
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/LICENSE +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/__main__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/__version__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/bigconfig_commands.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/bigconfig_options.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/catalog/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/catalog/catalog_commands.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/collections/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/collections/collection_commands.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/configure/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/configure/configure_commands.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/deltas/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/deltas/deltas_commands.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/enums.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/exceptions/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/exceptions/exceptions.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/functions.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/global_options.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/issues/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/issues/issue_commands.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/lineage/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/metric/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/metric/metric_commands.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/__init__.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/cicd_conf.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/github_report.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/vendor_report.py +0 -0
- {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/workspace/__init__.py +0 -0
- {bigeye_cli-0.8.2 → 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`
|
|
@@ -2044,6 +2046,8 @@ $ bigeye lineage export-end-to-end [OPTIONS]
|
|
|
2044
2046
|
* `--direction [upstream|downstream|both]`: Direction to trace: upstream, downstream, or both. [default: both]
|
|
2045
2047
|
* `--granularity [schema|table|column]`: Hop level: schema, table, or column. Defaults to each root's own level.
|
|
2046
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]
|
|
2047
2051
|
* `-o, --output TEXT`: Output .csv path. Defaults to end_to_end_<root>.csv in the current directory.
|
|
2048
2052
|
* `--help`: Show this message and exit.
|
|
2049
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`
|
|
@@ -2025,6 +2027,8 @@ $ bigeye lineage export-end-to-end [OPTIONS]
|
|
|
2025
2027
|
* `--direction [upstream|downstream|both]`: Direction to trace: upstream, downstream, or both. [default: both]
|
|
2026
2028
|
* `--granularity [schema|table|column]`: Hop level: schema, table, or column. Defaults to each root's own level.
|
|
2027
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]
|
|
2028
2032
|
* `-o, --output TEXT`: Output .csv path. Defaults to end_to_end_<root>.csv in the current directory.
|
|
2029
2033
|
* `--help`: Show this message and exit.
|
|
2030
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(
|
|
@@ -366,6 +366,21 @@ def export_end_to_end(
|
|
|
366
366
|
"--max-paths",
|
|
367
367
|
help="Per-root cap on enumerated paths. Truncation is logged, never silent.",
|
|
368
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
|
+
),
|
|
369
384
|
output: Optional[str] = typer.Option(
|
|
370
385
|
None,
|
|
371
386
|
"--output",
|
|
@@ -380,6 +395,10 @@ def export_end_to_end(
|
|
|
380
395
|
collapsed to the chosen (or root-inferred) granularity — column/field hops roll
|
|
381
396
|
up to their containing table/object (warehouse tables, ETL targets, BI objects).
|
|
382
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
|
+
|
|
383
402
|
client = cli_client_factory(bigeye_conf, config_file, workspace)
|
|
384
403
|
controller = LineageCustomReporting(client)
|
|
385
404
|
|
|
@@ -390,6 +409,8 @@ def export_end_to_end(
|
|
|
390
409
|
granularity=granularity,
|
|
391
410
|
output_path=output_path,
|
|
392
411
|
max_paths=max_paths,
|
|
412
|
+
depth=depth,
|
|
413
|
+
concurrency=concurrency,
|
|
393
414
|
)
|
|
394
415
|
|
|
395
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
|