Skip to content

Commit 481de96

Browse files
feat(executors): add workflow name and metadata
1 parent 0a8100a commit 481de96

3 files changed

Lines changed: 40 additions & 3 deletions

File tree

libs/executors/garf/executors/workflows/workflow.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,23 @@ def context(self) -> ExecutionContext:
155155
)
156156

157157

158+
class WorkflowMetadata(pydantic.BaseModel):
159+
"""Contains optional metadata on workflow.
160+
161+
Attributes:
162+
description: Brief description of workflow.
163+
version: Version of workflow.
164+
required_garf_version: Minimal required version of garf-executors package.
165+
required_fetchers:
166+
Fetchers needed for workflow with minimal required version.
167+
"""
168+
169+
description: str | None = None
170+
version: str | None = None
171+
required_garf_version: str | None = None
172+
required_fetchers: dict[str, str] | None = None
173+
174+
158175
class Workflow(pydantic.BaseModel):
159176
"""Orchestrates execution of queries for multiple fetchers.
160177
@@ -169,6 +186,8 @@ class Workflow(pydantic.BaseModel):
169186
prefix: str | pathlib.Path | None = pydantic.Field(
170187
default=None, excluded=True
171188
)
189+
name: str | None = None
190+
metadata: WorkflowMetadata = WorkflowMetadata()
172191

173192
def model_post_init(self, __context__) -> None:
174193
if self.execution_config:
@@ -215,8 +234,11 @@ def from_file(
215234
try:
216235
if isinstance(path, str):
217236
path = pathlib.Path(path)
237+
metadata = data.get('metadata') or WorkflowMetadata()
218238
return Workflow(
219239
steps=data.get('steps'),
240+
name=data.get('name') or str(path.stem),
241+
metadata=metadata,
220242
context=context,
221243
prefix=path.parent,
222244
execution_config=config.Config.from_file(config_file)

libs/executors/tests/unit/workflows/test_workflow.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ class TestWorkflow:
5555
'destination_folder': '/tmp',
5656
},
5757
}
58-
]
58+
],
59+
'name': 'test workflow',
60+
'metadata': {'description': 'Test Workflow'},
5961
}
6062

6163
def test_from_file_returns_correct_context_from_data(self, tmp_path):
@@ -64,13 +66,18 @@ def test_from_file_returns_correct_context_from_data(self, tmp_path):
6466
yaml.dump(self.data, f, encoding='utf-8')
6567
workflow = Workflow.from_file(tmp_workflow)
6668
expected_workflow = Workflow(
67-
steps=self.data.get('steps'), prefix=tmp_workflow.parent
69+
steps=self.data.get('steps'),
70+
name='test workflow',
71+
metadata={
72+
'description': 'Test Workflow',
73+
},
74+
prefix=tmp_workflow.parent,
6875
)
6976
assert workflow == expected_workflow
7077

7178
def test_save_returns_correct_data(self, tmp_path):
7279
tmp_workflow = tmp_path / 'workflow.yaml'
73-
workflow = Workflow(steps=self.data.get('steps'))
80+
workflow = Workflow(**self.data)
7481
workflow.save(tmp_workflow)
7582
with open(tmp_workflow, 'r', encoding='utf-8') as f:
7683
workflow_data = yaml.safe_load(f)

libs/executors/tests/unit/workflows/test_workflow.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ common_context: &empty_context
88
macro: {}
99
template: {}
1010

11+
name: test_workflow
12+
metadata:
13+
description: Test Workflow
14+
version: 0.0.0
15+
required_garf_version: 0.0.0
16+
required_fetchers:
17+
google-ads: 0.0.0
18+
1119
steps:
1220
- alias: test
1321
fetcher: fake

0 commit comments

Comments
 (0)