-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tests and canonicalization for ConfigWorkflow #89
Conversation
>>> empty_wf = ConfigWorkflow(cycles=[], tasks=[], data={}) | ||
|
||
""" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Question: are we ok with this yaml snippet parsing without validation errors?
If so, should it fail with a clear message down the line or should it create a viable WorkGraph, which runs nothing?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we agreed in the meeting to produce an error, maybe it is easier for merging to do this in a subsequent PR
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
once I merge #90 into this, the error would be raised during canonicalization
|
||
pretty_print.PrettyPrinter().format(testee) | ||
|
||
assert testee.name is None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Question: What does it mean to have a core.Workflow
with name=None
, rootdir=None
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Realistically this can not happen in normal usage, (as tested in test_yaml_data_models.py
). However, downstream code has to deal with the possibility or negate the help of static type checking.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So we need to check if they are not None in the core.Workflow right? Should we make an issue to keep in mind?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Eventually, for core objects, the name
and rootdir
are compulsory but the reason for None
possibility in the user provided information is different for both of them.
name
can beNone
and then defaults in the core object to what is derived from the yaml config path.rootdir
should actually NOT be given by the user and only inferred from the yaml config path.
So if you create a canonical class:
name
would staystr | None
inConfigWorkflow
defaulting toNone
and be non defaultstr
in the canonical classrootdir
would belong to the canonical class as non defaultstr
and disappear fromConfigWorkflow
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I will adapt this in #90
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I will need to think about how to adapt the canonicalize function to allow passing in additional information though, because the additional information will be different per class if any (not sure if singledispatch is still the right match then).
def test_workflow_test_internal_dicts(): | ||
testee = models.ConfigWorkflow( | ||
cycles=[], | ||
tasks=[{"some_task": {"plugin": "shell"}}], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Question: is it a problem, that we can not currently (for testing purposes) pass actual ConfigXyzTask
instances into the constructor of ConfigWorkflow
, but have to go through this dictionary form?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think yes. As you pointed out in the last meeting, we need to decouple the components for effective testing so we need to test YAML <-> CONFIG
and CONFIG <-> GRAPH
separately which requires a creation of the config objects without a yaml string.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you think of the drafted solution in #90, splitting into a "canonical" and a "yaml-parsed" class? Note that
a) Some of this would be alleviated by idempotent validators, which that approach would introduce gradually
b) The full benefits would only kick in, once all the config classes have undergone the same process. However, testability will increase incrementally.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
made a comment there about the canonical workflow
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree with the creation of canonical
classes to remove the type ambiguities. Same as rootdir
in WorkFlowConfig
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The questions you point out would need some further changes to be implement but maybe we implement them in another PR to avoid merge conflicts and focus on the canonicalization? I approve already.
>>> empty_wf = ConfigWorkflow(cycles=[], tasks=[], data={}) | ||
|
||
""" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we agreed in the meeting to produce an error, maybe it is easier for merging to do this in a subsequent PR
|
||
pretty_print.PrettyPrinter().format(testee) | ||
|
||
assert testee.name is None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So we need to check if they are not None in the core.Workflow right? Should we make an issue to keep in mind?
* finalize ConfigWorkflow canonicalization * improve type hints
First step towards clarifying and testing the data layout from which we can reliably build workflows.
Problem
See #88. This covers steps 1-8 for
ConfigWorkflow
Changes
load_workflow_config
method to load the minimal yaml snippet