Skip to content

Commit f27bf71

Browse files
committed
test: mock module & tests
1 parent a4c1d57 commit f27bf71

File tree

8 files changed

+298
-5
lines changed

8 files changed

+298
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## Version 0.5.8 (upcoming)
4+
5+
- add 'mock' module type
36

47
## Version 0.5.5
58

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
pipeline_name: mock_pipeline_1
2+
doc: A pipeline only using the mock module
3+
steps:
4+
- step_id: step_1
5+
module_type: mock
6+
module_config:
7+
inputs_schema:
8+
first:
9+
type: string
10+
doc: The first string
11+
second:
12+
type: string
13+
doc: The second string
14+
outputs:
15+
combined:
16+
field_schema:
17+
type: string
18+
doc: The combined string
19+
data: "Hello World!"
20+
21+
input_aliases:
22+
step_1.first: first
23+
step_1.second: second

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ classifiers = [
5555

5656

5757
dependencies = [
58-
"anyio>=3.7.0",
5958
"appdirs>=1.4.4,<2.0.0",
6059
"bidict>=0.21.0",
6160
"boltons>=21.0.0",
@@ -173,6 +172,7 @@ python_api = "kiara:find_model_classes_api"
173172
"file_bundle.pick.sub_folder" = "kiara.modules.included_core_modules.filesystem:PickSubBundle"
174173
"export.file" = "kiara.modules.included_core_modules.filesystem:ExportFileModule"
175174
"render.value" = "kiara.modules.included_core_modules.render_value:ValueTypeRenderModule"
175+
"mock" = "kiara.modules.included_core_modules.mock:MockKiaraModule"
176176

177177
[project.entry-points."kiara.operation_types"]
178178

src/kiara/models/module/pipeline/__init__.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,22 +103,49 @@ def create_step(
103103
if module_type not in kiara.module_type_names:
104104

105105
if module_type in module_map.keys():
106+
106107
resolved_module_type = module_map[module_type]["module_type"]
107108
resolved_module_config = module_map[module_type]["module_config"]
109+
110+
if module_config:
111+
merged_module_config = dict(resolved_module_config)
112+
merged_module_config.setdefault("defaults", {})
113+
merged_module_config.setdefault("constants", {})
114+
defaults = module_config.get("defaults", {})
115+
constants = module_config.get("constants", {})
116+
merged_module_config["defaults"].update(defaults)
117+
merged_module_config["constants"].update(constants)
118+
else:
119+
merged_module_config = resolved_module_config
120+
108121
manifest = kiara.create_manifest(
109122
module_or_operation=resolved_module_type,
110-
config=resolved_module_config,
123+
config=merged_module_config,
111124
)
125+
112126
elif (
113127
kiara.operation_registry.is_initialized
114128
and module_type in kiara.operation_registry.operation_ids
115129
):
130+
116131
op = kiara.operation_registry.operations[module_type]
117132
resolved_module_type = op.module_type
118133
resolved_module_config = op.module_config
134+
135+
if module_config:
136+
merged_module_config = dict(resolved_module_config)
137+
merged_module_config.setdefault("defaults", {})
138+
merged_module_config.setdefault("constants", {})
139+
defaults = module_config.get("defaults", {})
140+
constants = module_config.get("constants", {})
141+
merged_module_config["defaults"].update(defaults)
142+
merged_module_config["constants"].update(constants)
143+
else:
144+
merged_module_config = resolved_module_config
145+
119146
manifest = kiara.create_manifest(
120147
module_or_operation=resolved_module_type,
121-
config=resolved_module_config,
148+
config=merged_module_config,
122149
)
123150
else:
124151
raise InvalidPipelineStepConfig(
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from typing import Any, ClassVar, Dict, Mapping
4+
5+
from boltons.strutils import slugify
6+
from pydantic import BaseModel, Field
7+
8+
from kiara.api import KiaraModule, KiaraModuleConfig, ValueMap, ValueMapSchema
9+
from kiara.defaults import DEFAULT_NO_DESC_VALUE
10+
from kiara.models.module.pipeline import PipelineConfig
11+
from kiara.modules import ModuleCharacteristics
12+
13+
14+
class MockOutput(BaseModel):
15+
field_schema: Dict[str, Any] = Field(description="The schema of the output.")
16+
data: Any = Field(description="The data of the output.", default="mock result data")
17+
18+
19+
def default_mock_output() -> Dict[str, MockOutput]:
20+
21+
schema = {
22+
"type": "any",
23+
"doc": "A result",
24+
"optional": False,
25+
}
26+
return {"result": MockOutput(field_schema=schema, data="mock result data")}
27+
28+
29+
class MockModuleConfig(KiaraModuleConfig):
30+
31+
_kiara_model_id: ClassVar = "instance.module_config.mock"
32+
33+
@classmethod
34+
def create_pipeline_config(
35+
cls, title: str, description: str, author: str, *steps: "MockModuleConfig"
36+
) -> PipelineConfig:
37+
38+
data: Dict[str, Any] = {
39+
"pipeline_name": slugify(title),
40+
"doc": description,
41+
"context": {"authors": [author]},
42+
"steps": [],
43+
}
44+
for step in steps:
45+
step_data = {
46+
"step_id": slugify(step.title),
47+
"module_type": "dummy",
48+
"module_config": {
49+
"title": step.title,
50+
"inputs_schema": step.inputs_schema,
51+
"outputs": step.outputs,
52+
"desc": step.desc,
53+
},
54+
}
55+
data["steps"].append(step_data)
56+
57+
pipeline_config = PipelineConfig.from_config(data)
58+
return pipeline_config
59+
60+
inputs_schema: Dict[str, Dict[str, Any]] = Field(
61+
description="The input fields and their types.",
62+
)
63+
64+
outputs: Dict[str, MockOutput] = Field(
65+
description="The outputs fields of the operation, along with their types and mock data.",
66+
default_factory=default_mock_output,
67+
)
68+
69+
title: str = Field(
70+
description="The title of this operation.", default="mock_operation"
71+
)
72+
desc: str = Field(
73+
description="A description of what this step does.",
74+
default=DEFAULT_NO_DESC_VALUE,
75+
)
76+
77+
78+
class MockKiaraModule(KiaraModule):
79+
80+
_module_type_name = "mock"
81+
_config_cls = MockModuleConfig
82+
83+
def create_inputs_schema(
84+
self,
85+
) -> ValueMapSchema:
86+
87+
result = {}
88+
v: Mapping[str, Any]
89+
for k, v in self.get_config_value("inputs_schema").items():
90+
data = {
91+
"type": v["type"],
92+
"doc": v.get("doc", "-- n/a --"),
93+
"optional": v.get("optional", True),
94+
}
95+
result[k] = data
96+
97+
return result
98+
99+
def create_outputs_schema(
100+
self,
101+
) -> ValueMapSchema:
102+
103+
result = {}
104+
field_name: str
105+
field_output: MockOutput
106+
for field_name, field_output in self.get_config_value("outputs").items():
107+
field_schema = field_output.field_schema
108+
if field_schema:
109+
data = {
110+
"type": field_schema["type"],
111+
"doc": field_schema.get("doc", DEFAULT_NO_DESC_VALUE),
112+
"optional": field_schema.get("optional", False),
113+
}
114+
else:
115+
data = {
116+
"type": "any",
117+
"doc": DEFAULT_NO_DESC_VALUE,
118+
"optional": False,
119+
}
120+
result[field_name] = data
121+
122+
return result
123+
124+
def _retrieve_module_characteristics(self) -> ModuleCharacteristics:
125+
126+
return ModuleCharacteristics(
127+
is_idempotent=True, is_internal=True, unique_result_values=True
128+
)
129+
130+
def process(self, inputs: ValueMap, outputs: ValueMap) -> None:
131+
132+
# config = self.get_config_value("desc")
133+
134+
mock_outputs = self.get_config_value("outputs")
135+
field_name: str
136+
field_output: MockOutput
137+
for field_name, field_output in mock_outputs.items():
138+
139+
outputs.set_value(field_name, field_output.data)

tests/test_pipelines/__init__.py

Whitespace-only changes.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# -*- coding: utf-8 -*-
2+
from kiara.api import KiaraAPI
3+
4+
5+
def test_pipeline_default_config_simple(api: KiaraAPI):
6+
7+
pipeline_config = """
8+
pipeline_name: test_pipeline
9+
steps:
10+
- step_id: step_1
11+
module_type: logic.and
12+
- step_id: step_2
13+
module_type: logic.and
14+
"""
15+
16+
op = api.get_operation(pipeline_config)
17+
assert op is not None
18+
inputs_schema = op.inputs_schema
19+
outputs_schema = op.outputs_schema
20+
assert len(inputs_schema) == 4
21+
assert len(outputs_schema) == 2
22+
23+
assert inputs_schema["step_1__a"].type == "boolean"
24+
assert outputs_schema["step_1__y"].type == "boolean"
25+
26+
27+
def test_pipeline_config_aliases(api: KiaraAPI):
28+
29+
pipeline_config = """
30+
pipeline_name: test_pipeline
31+
steps:
32+
- step_id: step_1
33+
module_type: logic.and
34+
- step_id: step_2
35+
module_type: logic.and
36+
input_aliases:
37+
step_1.a: a
38+
step_1.b: b
39+
step_2.a: c
40+
step_2.b: d
41+
"""
42+
43+
op = api.get_operation(pipeline_config)
44+
assert op is not None
45+
inputs_schema = op.inputs_schema
46+
outputs_schema = op.outputs_schema
47+
assert len(inputs_schema) == 4
48+
assert len(outputs_schema) == 2
49+
50+
assert inputs_schema["a"].type == "boolean"
51+
assert inputs_schema["b"].type == "boolean"
52+
assert inputs_schema["c"].type == "boolean"
53+
assert inputs_schema["d"].type == "boolean"
54+
55+
56+
def test_pipeline_config_aliases_2(api: KiaraAPI):
57+
58+
pipeline_config = """
59+
pipeline_name: test_pipeline
60+
steps:
61+
- step_id: step_1
62+
module_type: logic.and
63+
- step_id: step_2
64+
module_type: logic.and
65+
input_aliases:
66+
step_1.a: a
67+
step_1.b: b
68+
step_2.a: a
69+
step_2.b: b
70+
"""
71+
72+
op = api.get_operation(pipeline_config)
73+
assert op is not None
74+
inputs_schema = op.inputs_schema
75+
outputs_schema = op.outputs_schema
76+
assert len(inputs_schema) == 2
77+
assert len(outputs_schema) == 2
78+
79+
assert inputs_schema["a"].type == "boolean"
80+
assert inputs_schema["b"].type == "boolean"
81+
82+
83+
def test_pipeline_module_config(api: KiaraAPI):
84+
85+
pipeline_config = """
86+
pipeline_name: test_pipeline
87+
steps:
88+
- step_id: step_1
89+
module_type: logic.and
90+
module_config:
91+
delay: 0.1
92+
- step_id: step_2
93+
module_type: logic.and
94+
module_config:
95+
delay: 0.2
96+
input_aliases:
97+
step_1.a: a
98+
step_1.b: b
99+
step_2.a: a
100+
step_2.b: b
101+
"""
102+
103+
api.get_operation(pipeline_config)

tests/test_pipelines.py renamed to tests/test_pipelines/test_pipelines.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
# -*- coding: utf-8 -*-
2-
32
# Copyright (c) 2021, University of Luxembourg / DHARPA project
43
# Copyright (c) 2021, Markus Binsteiner
54
#
65
# Mozilla Public License, version 2.0 (see LICENSE or https://www.mozilla.org/en-US/MPL/2.0/)
76

87

9-
#
108
# def test_pipeline_default_controller_invalid_inputs(kiara: Kiara):
119
#
1210
# pipeline = kiara.create_pipeline("logic.nand")

0 commit comments

Comments
 (0)