Skip to content

Commit

Permalink
add tests related to ConfigWorkflow
Browse files Browse the repository at this point in the history
  • Loading branch information
DropD committed Jan 14, 2025
1 parent 5608e2e commit 954869b
Show file tree
Hide file tree
Showing 8 changed files with 113 additions and 7 deletions.
2 changes: 2 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ path = "src/sirocco/__init__.py"
extra-dependencies = [
"ipdb"
]
default-args = []
extra-args = ["--doctest-modules"]

[[tool.hatch.envs.hatch-test.matrix]]
python = ["3.12"]
Expand Down
43 changes: 42 additions & 1 deletion src/sirocco/parsing/_yaml_data_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,15 @@

from isoduration import parse_duration
from isoduration.types import Duration # pydantic needs type # noqa: TCH002
from pydantic import BaseModel, ConfigDict, Discriminator, Field, Tag, field_validator, model_validator
from pydantic import (
BaseModel,
ConfigDict,
Discriminator,
Field,
Tag,
field_validator,
model_validator,
)

from sirocco.parsing._utils import TimeUtils

Expand Down Expand Up @@ -387,6 +395,39 @@ def get_plugin_from_named_base_model(data: dict) -> str:


class ConfigWorkflow(BaseModel):
"""
The root of the configuration tree.
Examples:
minimal yaml to generate:
>>> import textwrap
>>> import pydantic_yaml
>>> config = textwrap.dedent(
... '''
... cycles:
... - minimal_cycle:
... tasks:
... - task_a:
... tasks:
... - task_b:
... plugin: shell
... data:
... available:
... - foo:
... generated:
... - bar:
... '''
... )
>>> wf = pydantic_yaml.parse_yaml_raw_as(ConfigWorkflow, config)
minimum programmatically created instance
>>> empty_wf = ConfigWorkflow(cycles=[], tasks=[], data={})
"""

name: str | None = None
rootdir: Path | None = None
cycles: list[ConfigCycle]
Expand Down
11 changes: 5 additions & 6 deletions src/sirocco/pretty_print.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def as_block(self, header: str, body: str) -> str:
Example:
>>> print(PrettyPrinter().as_block("header", "foo\nbar"))
>>> print(PrettyPrinter().as_block("header", "foo\\nbar"))
header:
foo
bar
Expand All @@ -50,7 +50,7 @@ def as_item(self, content: str) -> str:
- foo
>>> pp = PrettyPrinter()
>>> print(pp.as_item(pp.as_block("header", "multiple\nlines\nof text")))
>>> print(pp.as_item(pp.as_block("header", "multiple\\nlines\\nof text")))
- header:
multiple
lines
Expand Down Expand Up @@ -87,14 +87,13 @@ def format_basic(self, obj: core.GraphItem) -> str:
>>> from datetime import datetime
>>> print(
... PrettyPrinter().format_basic(
... Task(
... name=foo,
... core.Task(
... name="foo",
... coordinates={"date": datetime(1000, 1, 1).date()},
... workflow=None,
... )
... )
... )
foo [1000-01-01]
foo [date: 1000-01-01]
"""
name = obj.name
if obj.coordinates:
Expand Down
Empty file added tests/unit_tests/__init__.py
Empty file.
Empty file.
23 changes: 23 additions & 0 deletions tests/unit_tests/core/test_workflow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from sirocco import pretty_print
from sirocco.core import workflow
from sirocco.parsing import _yaml_data_models as models


def test_minimal_workflow():
minimal_config = models.ConfigWorkflow(
cycles=[],
tasks=[{"some_task": {"plugin": "shell"}}],
data=models.ConfigData(
available=[models.ConfigAvailableData(foo={})],
generated=[models.ConfigGeneratedData(bar={})],
),
)

testee = workflow.Workflow(minimal_config)

pretty_print.PrettyPrinter().format(testee)

assert testee.name is None
assert len(list(testee.tasks)) == 0
assert len(list(testee.cycles)) == 0
assert testee.data[("foo", {})].available
Empty file.
41 changes: 41 additions & 0 deletions tests/unit_tests/parsing/test_yaml_data_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import textwrap

from sirocco.parsing import _yaml_data_models as models


def test_workflow_test_internal_dicts():
testee = models.ConfigWorkflow(
cycles=[],
tasks=[{"some_task": {"plugin": "shell"}}],
data=models.ConfigData(
available=[models.ConfigAvailableData(foo={})],
generated=[models.ConfigGeneratedData(bar={})],
),
)
assert testee.data_dict["foo"].name == "foo"
assert testee.data_dict["bar"].name == "bar"
assert testee.task_dict["some_task"].name == "some_task"


def test_load_workflow_config(tmp_path):
minimal_config = textwrap.dedent(
"""
cycles:
- minimal:
tasks:
- a:
tasks:
- b:
plugin: shell
data:
available:
- c:
generated:
- d:
"""
)
minimal = tmp_path / "minimal.yml"
minimal.write_text(minimal_config)
testee = models.load_workflow_config(str(minimal))
assert testee.name == "minimal"
assert testee.rootdir == tmp_path

0 comments on commit 954869b

Please sign in to comment.