steve-cli 0.3.9__tar.gz → 0.3.13__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.
- {steve_cli-0.3.9 → steve_cli-0.3.13}/PKG-INFO +1 -1
- {steve_cli-0.3.9 → steve_cli-0.3.13}/pyproject.toml +1 -1
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/cli.py +2 -2
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/decorators/lineage_job.py +4 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/collector.py +9 -4
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/storage.py +11 -4
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/PKG-INFO +1 -1
- {steve_cli-0.3.9 → steve_cli-0.3.13}/README.md +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/setup.cfg +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/decorators/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/logging.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/null.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/openlineage.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/port.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/registry.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/csv.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/excel.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/generic.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/json.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/parquet.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/port.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/registry.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/parquet.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/protocol.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/s3.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/__init__.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/great_expectations.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/null.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/validoopsie.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/port.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/registry.py +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/SOURCES.txt +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/dependency_links.txt +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/entry_points.txt +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/requires.txt +0 -0
- {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/top_level.txt +0 -0
|
@@ -567,11 +567,11 @@ def _list_bucket(storage_kwargs: dict, label: str, bucket_name: str) -> tuple:
|
|
|
567
567
|
|
|
568
568
|
@main.command("buckets")
|
|
569
569
|
@click.option('--env-file', '-e', type=click.Path(path_type=Path), multiple=True,
|
|
570
|
-
help='Path to .env file(s). Can be specified multiple times. Defaults to .env and .
|
|
570
|
+
help='Path to .env file(s). Can be specified multiple times. Defaults to .env and .workspaces.env')
|
|
571
571
|
def buckets(env_file: tuple):
|
|
572
572
|
"""List all S3 buckets detected from env variables and show their files as a tree."""
|
|
573
573
|
cwd = Path.cwd()
|
|
574
|
-
env_files = [Path(f) for f in env_file] if env_file else [cwd / ".env", cwd / ".
|
|
574
|
+
env_files = [Path(f) for f in env_file] if env_file else [cwd / ".env", cwd / ".workspaces.env"]
|
|
575
575
|
for ef in env_files:
|
|
576
576
|
load_dotenv(ef)
|
|
577
577
|
tiers = ["bronze", "silver", "gold"]
|
|
@@ -26,6 +26,10 @@ def lineage_job(
|
|
|
26
26
|
|
|
27
27
|
@functools.wraps(fn)
|
|
28
28
|
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
29
|
+
from dotenv import load_dotenv
|
|
30
|
+
load_dotenv(".env", override=False)
|
|
31
|
+
load_dotenv(".workspaces.env", override=False)
|
|
32
|
+
|
|
29
33
|
session = make_session(
|
|
30
34
|
namespace=namespace,
|
|
31
35
|
job_name=job_name,
|
|
@@ -18,16 +18,21 @@ class LineageSession:
|
|
|
18
18
|
_inputs: set[str] = field(default_factory=set)
|
|
19
19
|
_outputs: set[str] = field(default_factory=set)
|
|
20
20
|
_facets: Dict[str, Dict[str, Any]] = field(default_factory=dict)
|
|
21
|
+
_dataset_namespaces: Dict[str, str] = field(default_factory=dict)
|
|
21
22
|
|
|
22
|
-
def record_read(self, dataset: str, facets: Dict[str, Any] | None = None) -> None:
|
|
23
|
+
def record_read(self, dataset: str, facets: Dict[str, Any] | None = None, namespace: str | None = None) -> None:
|
|
23
24
|
self._inputs.add(dataset)
|
|
24
25
|
if facets:
|
|
25
26
|
self._facets.setdefault(dataset, {}).update(facets)
|
|
27
|
+
if namespace:
|
|
28
|
+
self._dataset_namespaces[dataset] = namespace
|
|
26
29
|
|
|
27
|
-
def record_write(self, dataset: str, facets: Dict[str, Any] | None = None) -> None:
|
|
30
|
+
def record_write(self, dataset: str, facets: Dict[str, Any] | None = None, namespace: str | None = None) -> None:
|
|
28
31
|
self._outputs.add(dataset)
|
|
29
32
|
if facets:
|
|
30
33
|
self._facets.setdefault(dataset, {}).update(facets)
|
|
34
|
+
if namespace:
|
|
35
|
+
self._dataset_namespaces[dataset] = namespace
|
|
31
36
|
|
|
32
37
|
def attach_facets(self, dataset: str, facets: Dict[str, Any]) -> None:
|
|
33
38
|
self._facets.setdefault(dataset, {}).update(facets)
|
|
@@ -42,8 +47,8 @@ class LineageSession:
|
|
|
42
47
|
namespace=self.namespace,
|
|
43
48
|
run_id=self.run_id,
|
|
44
49
|
state=state,
|
|
45
|
-
inputs=[DatasetRef(namespace=self.namespace, name=x, facets=self._facets.get(x, {})) for x in self._inputs],
|
|
46
|
-
outputs=[DatasetRef(namespace=self.namespace, name=x, facets=self._facets.get(x, {})) for x in self._outputs],
|
|
50
|
+
inputs=[DatasetRef(namespace=self._dataset_namespaces.get(x, self.namespace), name=x, facets=self._facets.get(x, {})) for x in self._inputs],
|
|
51
|
+
outputs=[DatasetRef(namespace=self._dataset_namespaces.get(x, self.namespace), name=x, facets=self._facets.get(x, {})) for x in self._outputs],
|
|
47
52
|
run_facets=run_facets or {},
|
|
48
53
|
)
|
|
49
54
|
|
|
@@ -58,23 +58,30 @@ class LineageStorage:
|
|
|
58
58
|
self.__resolved = self._storage_or_factory # type: ignore[assignment]
|
|
59
59
|
return self.__resolved
|
|
60
60
|
|
|
61
|
+
@property
|
|
62
|
+
def _dataset_namespace(self) -> str | None:
|
|
63
|
+
s = self._storage
|
|
64
|
+
if hasattr(s, 'endpoint') and hasattr(s, 'bucket'):
|
|
65
|
+
return f"{s.endpoint.rstrip('/')}/{s.bucket}"
|
|
66
|
+
return None
|
|
67
|
+
|
|
61
68
|
def put_file(self, local_path: str, path: str) -> None:
|
|
62
69
|
self._storage.put_file(local_path, path)
|
|
63
|
-
self._session.record_write(path)
|
|
70
|
+
self._session.record_write(path, namespace=self._dataset_namespace)
|
|
64
71
|
|
|
65
72
|
def get_file(self, path: str, local_path: str) -> None:
|
|
66
73
|
self._storage.get_file(path, local_path)
|
|
67
|
-
self._session.record_read(path)
|
|
74
|
+
self._session.record_read(path, namespace=self._dataset_namespace)
|
|
68
75
|
|
|
69
76
|
def put_bytes(self, data: bytes, path: str) -> None:
|
|
70
77
|
self._storage.put_bytes(data, path)
|
|
71
78
|
facets = _extract_facets(data, path)
|
|
72
|
-
self._session.record_write(path, facets or None)
|
|
79
|
+
self._session.record_write(path, facets or None, namespace=self._dataset_namespace)
|
|
73
80
|
|
|
74
81
|
def get_bytes(self, path: str) -> bytes:
|
|
75
82
|
data = self._storage.get_bytes(path)
|
|
76
83
|
facets = _extract_facets(data, path)
|
|
77
|
-
self._session.record_read(path, facets or None)
|
|
84
|
+
self._session.record_read(path, facets or None, namespace=self._dataset_namespace)
|
|
78
85
|
return data
|
|
79
86
|
|
|
80
87
|
def read(self, path: str) -> DatasetHandle:
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|