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.
Files changed (59) hide show
  1. {flowerpower-0.31.1/src/FlowerPower.egg-info → flowerpower-0.31.2}/PKG-INFO +1 -1
  2. {flowerpower-0.31.1 → flowerpower-0.31.2}/pyproject.toml +2 -1
  3. {flowerpower-0.31.1 → flowerpower-0.31.2/src/FlowerPower.egg-info}/PKG-INFO +1 -1
  4. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/manager.py +34 -5
  5. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/visualizer.py +25 -11
  6. {flowerpower-0.31.1 → flowerpower-0.31.2}/LICENSE +0 -0
  7. {flowerpower-0.31.1 → flowerpower-0.31.2}/README.md +0 -0
  8. {flowerpower-0.31.1 → flowerpower-0.31.2}/setup.cfg +0 -0
  9. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/SOURCES.txt +0 -0
  10. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/dependency_links.txt +0 -0
  11. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/entry_points.txt +0 -0
  12. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/requires.txt +0 -0
  13. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/FlowerPower.egg-info/top_level.txt +0 -0
  14. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/__init__.py +0 -0
  15. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/__init__.py +0 -0
  16. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/base.py +0 -0
  17. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/exceptions.py +0 -0
  18. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/__init__.py +0 -0
  19. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/adapter.py +0 -0
  20. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/builder.py +0 -0
  21. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/builder_adapter.py +0 -0
  22. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/builder_executor.py +0 -0
  23. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/pipeline/run.py +0 -0
  24. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/project/__init__.py +0 -0
  25. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cfg/project/adapter.py +0 -0
  26. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/__init__.py +0 -0
  27. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/cfg.py +0 -0
  28. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/pipeline.py +0 -0
  29. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/cli/utils.py +0 -0
  30. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/flowerpower.py +0 -0
  31. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/__init__.py +0 -0
  32. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/base.py +0 -0
  33. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/config_manager.py +0 -0
  34. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/executor.py +0 -0
  35. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/io.py +0 -0
  36. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/lifecycle_manager.py +0 -0
  37. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/pipeline.py +0 -0
  38. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/pipeline/registry.py +0 -0
  39. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/plugins/io/__init__.py +0 -0
  40. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/__init__.py +0 -0
  41. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/_backend.py +0 -0
  42. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/executor.py +0 -0
  43. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/general.py +0 -0
  44. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/hamilton.py +0 -0
  45. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/logging.py +0 -0
  46. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/settings/retry.py +0 -0
  47. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/__init__.py +0 -0
  48. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/adapter.py +0 -0
  49. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/callback.py +0 -0
  50. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/config.py +0 -0
  51. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/executor.py +0 -0
  52. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/filesystem.py +0 -0
  53. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/logging.py +0 -0
  54. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/misc.py +0 -0
  55. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/monkey.py +0 -0
  56. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/open_telemetry.py +0 -0
  57. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/security.py +0 -0
  58. {flowerpower-0.31.1 → flowerpower-0.31.2}/src/flowerpower/utils/templates.py +0 -0
  59. {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.1
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.1"
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.1
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 formatted table.
583
+ def show_pipelines(self, format: str = "table") -> None:
584
+ """Display all available pipelines in a selected format.
585
585
 
586
- Uses rich formatting for terminal display.
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(self, name: str, format: str = "png", reload: bool = False) -> None:
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(name=name, format=format, reload=reload)
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
- # Use project_cfg attributes for path and filesystem access
90
- graph_dir = posixpath.join(self.project_cfg.base_dir, "graphs")
91
- self._fs.makedirs(graph_dir, exist_ok=True)
92
-
93
- output_path = posixpath.join(
94
- graph_dir, name
95
- ) # Output filename is just the pipeline name
96
- output_path_with_ext = f"{output_path}.{format}"
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
- output_path, # graphviz appends the format automatically
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]{output_path_with_ext}[/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