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.
Files changed (44) hide show
  1. {steve_cli-0.3.9 → steve_cli-0.3.13}/PKG-INFO +1 -1
  2. {steve_cli-0.3.9 → steve_cli-0.3.13}/pyproject.toml +1 -1
  3. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/cli.py +2 -2
  4. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/decorators/lineage_job.py +4 -0
  5. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/collector.py +9 -4
  6. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/storage.py +11 -4
  7. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/PKG-INFO +1 -1
  8. {steve_cli-0.3.9 → steve_cli-0.3.13}/README.md +0 -0
  9. {steve_cli-0.3.9 → steve_cli-0.3.13}/setup.cfg +0 -0
  10. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/__init__.py +0 -0
  11. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/decorators/__init__.py +0 -0
  12. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/__init__.py +0 -0
  13. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/__init__.py +0 -0
  14. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/logging.py +0 -0
  15. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/null.py +0 -0
  16. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/adapters/openlineage.py +0 -0
  17. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/port.py +0 -0
  18. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/lineage/registry.py +0 -0
  19. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/__init__.py +0 -0
  20. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/__init__.py +0 -0
  21. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/__init__.py +0 -0
  22. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/csv.py +0 -0
  23. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/excel.py +0 -0
  24. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/generic.py +0 -0
  25. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/json.py +0 -0
  26. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/extractors/parquet.py +0 -0
  27. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/port.py +0 -0
  28. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/metadata/registry.py +0 -0
  29. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/parquet.py +0 -0
  30. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/protocol.py +0 -0
  31. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage/s3.py +0 -0
  32. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/storage.py +0 -0
  33. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/__init__.py +0 -0
  34. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/__init__.py +0 -0
  35. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/great_expectations.py +0 -0
  36. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/null.py +0 -0
  37. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/adapters/validoopsie.py +0 -0
  38. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/port.py +0 -0
  39. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli/validation/registry.py +0 -0
  40. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/SOURCES.txt +0 -0
  41. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/dependency_links.txt +0 -0
  42. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/entry_points.txt +0 -0
  43. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/requires.txt +0 -0
  44. {steve_cli-0.3.9 → steve_cli-0.3.13}/steve_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steve-cli
3
- Version: 0.3.9
3
+ Version: 0.3.13
4
4
  Summary: A simple CLI tool to run jobs from jobs.yaml with proper environment setup
5
5
  Author: Frank
6
6
  License: MIT
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "steve-cli"
8
- version = "0.3.9"
8
+ version = "0.3.13"
9
9
  description = "A simple CLI tool to run jobs from jobs.yaml with proper environment setup"
10
10
  readme = "README.md"
11
11
  license = {text = "MIT"}
@@ -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 .workspace.env')
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 / ".workspace.env"]
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steve-cli
3
- Version: 0.3.9
3
+ Version: 0.3.13
4
4
  Summary: A simple CLI tool to run jobs from jobs.yaml with proper environment setup
5
5
  Author: Frank
6
6
  License: MIT
File without changes
File without changes