FlowerPower 0.31.1__tar.gz → 0.31.2__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.
- {flowerpower-0.31.1/src/FlowerPower.egg-info → flowerpower-0.31.2}/PKG-INFO +1 -1
- {flowerpower-0.31.1 → flowerpower-0.31.2}/pyproject.toml +2 -1
- {flowerpower-0.31.1 → flowerpower-0.31.2/src/FlowerPower.egg-info}/PKG-INFO +1 -1
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/manager.py +34 -5
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/visualizer.py +25 -11
- {flowerpower-0.31.1 → flowerpower-0.31.2}/LICENSE +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/README.md +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/setup.cfg +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/SOURCES.txt +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/dependency_links.txt +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/entry_points.txt +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/requires.txt +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/top_level.txt +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/base.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/exceptions.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/adapter.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/builder.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/builder_adapter.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/builder_executor.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/run.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/project/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/project/adapter.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/cfg.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/pipeline.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/utils.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/flowerpower.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/base.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/config_manager.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/executor.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/io.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/lifecycle_manager.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/pipeline.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/registry.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/plugins/io/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/_backend.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/executor.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/general.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/hamilton.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/logging.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/retry.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/__init__.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/adapter.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/callback.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/config.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/executor.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/filesystem.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/logging.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/misc.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/monkey.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/open_telemetry.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/security.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/templates.py +0 -0
- {flowerpower-0.31.1 → flowerpower-0.31.2}/tests/test_flowerpower_project.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: FlowerPower
|
3
|
-
Version: 0.31.
|
3
|
+
Version: 0.31.2
|
4
4
|
Summary: A simple workflow framework for building and managing data processing pipelines
|
5
5
|
Author-email: "Volker L." <ligno.blades@gmail.com>
|
6
6
|
Project-URL: Homepage, https://github.com/legout/flowerpower
|
@@ -4,7 +4,7 @@ description = "A simple workflow framework for building and managing data proces
|
|
4
4
|
authors = [{ name = "Volker L.", email = "ligno.blades@gmail.com" }]
|
5
5
|
readme = "README.md"
|
6
6
|
requires-python = ">= 3.11"
|
7
|
-
version = "0.31.
|
7
|
+
version = "0.31.2"
|
8
8
|
keywords = ["hamilton", "workflow", "pipeline", "scheduler", "dask", "ray"]
|
9
9
|
|
10
10
|
dependencies = [
|
@@ -76,6 +76,7 @@ dev-dependencies = [
|
|
76
76
|
"numpy>=2.3.3",
|
77
77
|
"matplotlib>=3.10.6",
|
78
78
|
"seaborn>=0.13.2",
|
79
|
+
"pyyaml>=6.0.3",
|
79
80
|
]
|
80
81
|
package = true
|
81
82
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: FlowerPower
|
3
|
-
Version: 0.31.
|
3
|
+
Version: 0.31.2
|
4
4
|
Summary: A simple workflow framework for building and managing data processing pipelines
|
5
5
|
Author-email: "Volker L." <ligno.blades@gmail.com>
|
6
6
|
Project-URL: Homepage, https://github.com/legout/flowerpower
|
@@ -580,11 +580,32 @@ class PipelineManager:
|
|
580
580
|
"""
|
581
581
|
return self._lifecycle_manager.list_pipelines()
|
582
582
|
|
583
|
-
def show_pipelines(self) -> None:
|
584
|
-
"""Display all available pipelines in a
|
583
|
+
def show_pipelines(self, format: str = "table") -> None:
|
584
|
+
"""Display all available pipelines in a selected format.
|
585
585
|
|
586
|
-
|
586
|
+
Args:
|
587
|
+
format: One of "table", "json", or "yaml". Defaults to "table".
|
587
588
|
"""
|
589
|
+
fmt = (format or "table").lower()
|
590
|
+
if fmt == "table":
|
591
|
+
return self.registry.show_pipelines()
|
592
|
+
names = self._lifecycle_manager.list_pipelines()
|
593
|
+
try:
|
594
|
+
if fmt == "json":
|
595
|
+
import json
|
596
|
+
print(json.dumps(names))
|
597
|
+
return None
|
598
|
+
if fmt == "yaml":
|
599
|
+
import yaml # type: ignore
|
600
|
+
print(yaml.safe_dump(names, sort_keys=False))
|
601
|
+
return None
|
602
|
+
except Exception as e:
|
603
|
+
warnings.warn(
|
604
|
+
f"Failed to format pipelines as {fmt}: {e}. Falling back to table.",
|
605
|
+
RuntimeWarning,
|
606
|
+
)
|
607
|
+
return self.registry.show_pipelines()
|
608
|
+
warnings.warn(f"Unknown format '{format}', using table.", RuntimeWarning)
|
588
609
|
return self.registry.show_pipelines()
|
589
610
|
|
590
611
|
@property
|
@@ -985,7 +1006,13 @@ class PipelineManager:
|
|
985
1006
|
)
|
986
1007
|
|
987
1008
|
# Visualizer Delegations
|
988
|
-
def save_dag(
|
1009
|
+
def save_dag(
|
1010
|
+
self,
|
1011
|
+
name: str,
|
1012
|
+
format: str = "png",
|
1013
|
+
reload: bool = False,
|
1014
|
+
output_path: str | None = None,
|
1015
|
+
) -> str:
|
989
1016
|
"""Save pipeline DAG visualization to a file.
|
990
1017
|
|
991
1018
|
Creates a visual representation of the pipeline's directed acyclic graph (DAG)
|
@@ -1020,7 +1047,9 @@ class PipelineManager:
|
|
1020
1047
|
... reload=True
|
1021
1048
|
... )
|
1022
1049
|
"""
|
1023
|
-
self.visualizer.save_dag(
|
1050
|
+
return self.visualizer.save_dag(
|
1051
|
+
name=name, format=format, reload=reload, output_path=output_path
|
1052
|
+
)
|
1024
1053
|
|
1025
1054
|
def show_dag(
|
1026
1055
|
self, name: str, format: str = "png", reload: bool = False, raw: bool = False
|
@@ -67,7 +67,8 @@ class PipelineVisualizer:
|
|
67
67
|
name: str,
|
68
68
|
format: str = "png",
|
69
69
|
reload: bool = False,
|
70
|
-
|
70
|
+
output_path: str | None = None,
|
71
|
+
) -> str:
|
71
72
|
"""
|
72
73
|
Save an image of the graph of functions for a given pipeline name.
|
73
74
|
|
@@ -86,25 +87,38 @@ class PipelineVisualizer:
|
|
86
87
|
"""
|
87
88
|
dag = self._get_dag_object(name=name, reload=reload)
|
88
89
|
|
89
|
-
#
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
90
|
+
# Determine final output path
|
91
|
+
if output_path is None:
|
92
|
+
graph_dir = posixpath.join(self.project_cfg.base_dir, "graphs")
|
93
|
+
self._fs.makedirs(graph_dir, exist_ok=True)
|
94
|
+
base = posixpath.join(graph_dir, name)
|
95
|
+
final_path = f"{base}.{format}"
|
96
|
+
render_path = base
|
97
|
+
else:
|
98
|
+
# If output_path already has an extension, use as-is; otherwise append format
|
99
|
+
if "." in posixpath.basename(output_path):
|
100
|
+
final_path = output_path
|
101
|
+
# Remove extension for graphviz render base path
|
102
|
+
render_path = final_path.rsplit(".", 1)[0]
|
103
|
+
fmt = final_path.rsplit(".", 1)[1]
|
104
|
+
if fmt != format:
|
105
|
+
# Honor explicit extension if it differs from format argument
|
106
|
+
format = fmt
|
107
|
+
else:
|
108
|
+
final_path = f"{output_path}.{format}"
|
109
|
+
render_path = output_path
|
97
110
|
|
98
111
|
# Render the DAG using the graphviz object returned by display_all_functions
|
99
112
|
dag.render(
|
100
|
-
|
113
|
+
render_path, # graphviz appends the format automatically
|
101
114
|
format=format,
|
102
115
|
cleanup=True,
|
103
116
|
view=False,
|
104
117
|
)
|
105
118
|
print(
|
106
|
-
f"📊 Saved graph for [bold blue]{self.project_cfg.name}.{name}[/bold blue] to [green]{
|
119
|
+
f"📊 Saved graph for [bold blue]{self.project_cfg.name}.{name}[/bold blue] to [green]{final_path}[/green]"
|
107
120
|
)
|
121
|
+
return final_path
|
108
122
|
|
109
123
|
def show_dag(
|
110
124
|
self,
|
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
|
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
|