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.
Files changed (36) hide show
  1. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/PKG-INFO +8 -4
  2. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/CLI_DOCS.md +6 -2
  3. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/catalog/custom_repo_commands.py +72 -3
  4. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/lineage/lineage_commands.py +21 -0
  5. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/pyproject.toml +2 -2
  6. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/LICENSE +0 -0
  7. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/__init__.py +0 -0
  8. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/__main__.py +0 -0
  9. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/__version__.py +0 -0
  10. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/__init__.py +0 -0
  11. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/bigconfig_commands.py +0 -0
  12. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/bigconfig/bigconfig_options.py +0 -0
  13. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/catalog/__init__.py +0 -0
  14. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/catalog/catalog_commands.py +0 -0
  15. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/collections/__init__.py +0 -0
  16. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/collections/collection_commands.py +0 -0
  17. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/configure/__init__.py +0 -0
  18. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/configure/configure_commands.py +0 -0
  19. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/deltas/__init__.py +0 -0
  20. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/deltas/deltas_commands.py +0 -0
  21. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/enums.py +0 -0
  22. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/exceptions/__init__.py +0 -0
  23. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/exceptions/exceptions.py +0 -0
  24. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/functions.py +0 -0
  25. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/global_options.py +0 -0
  26. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/issues/__init__.py +0 -0
  27. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/issues/issue_commands.py +0 -0
  28. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/lineage/__init__.py +0 -0
  29. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/metric/__init__.py +0 -0
  30. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/metric/metric_commands.py +0 -0
  31. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/__init__.py +0 -0
  32. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/cicd_conf.py +0 -0
  33. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/github_report.py +0 -0
  34. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/model/vendor_report.py +0 -0
  35. {bigeye_cli-0.8.2 → bigeye_cli-0.8.3}/bigeye_cli/workspace/__init__.py +0 -0
  36. {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.2
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.1,<0.12.0)
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.2
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&#x27;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&#x27;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&#x27;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&#x27;s per-request depth ceiling (lineage.max_depth) that truncates a single full fetch, and keeps each request small so very large graphs don&#x27;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_&lt;root&gt;.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
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&#x27;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&#x27;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&#x27;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&#x27;s per-request depth ceiling (lineage.max_depth) that truncates a single full fetch, and keeps each request small so very large graphs don&#x27;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_&lt;root&gt;.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
- matches = controller.resolve_catalog_path(parse_catalog_path(value))
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
- raise typer.Exit(code=1)
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(wb, path_node_ids=path_node_ids, cleanup_stale=cleanup_stale)
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.2"
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.1"
22
+ bigeye-sdk = "^0.11.2"
23
23
  rich = "^14.1.0"
24
24
  PyGithub = '^1.59.1'
25
25
 
File without changes