Skip to content

Commit 57d26ec

Browse files
committed
[problem] Move determining fields interactive, multipass, and custom_output to constructor of ProblemSettings
1 parent 9565dd6 commit 57d26ec

File tree

1 file changed

+26
-23
lines changed

1 file changed

+26
-23
lines changed

bin/problem.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,12 @@ def __init__(
104104

105105

106106
class ProblemSettings:
107-
def __init__(self, yamldata: dict[str, Any], legacy_time_limit: Optional[float] = None):
107+
def __init__(
108+
self,
109+
yamldata: dict[str, Any],
110+
problem: "Problem",
111+
legacy_time_limit: Optional[float] = None,
112+
):
108113
assert isinstance(yamldata, dict)
109114

110115
if "name" in yamldata and isinstance(yamldata["name"], str):
@@ -122,13 +127,25 @@ def __init__(self, yamldata: dict[str, Any], legacy_time_limit: Optional[float]
122127
fatal(f"problem_format_version {self.problem_format_version} not supported")
123128

124129
if self.is_legacy():
125-
self.validation: str = parse_setting(yamldata, "validation", "default")
130+
mode = parse_validation(parse_setting(yamldata, "validation", "default"))
126131
else:
127-
self.type = parse_setting(yamldata, "type", "pass-fail")
128132
if "validation" in yamldata:
129133
warn(
130134
"problem.yaml: 'validation' is removed in 2023-07-draft, please use 'type' instead"
131135
)
136+
mode = set(parse_setting(yamldata, "type", "pass-fail").split(" "))
137+
self.interactive: bool = "interactive" in mode
138+
self.multi_pass: bool = "multi-pass" in mode
139+
self.custom_output: bool = (
140+
self.interactive
141+
or self.multi_pass
142+
or (
143+
"custom" in mode
144+
if self.is_legacy()
145+
# TODO: output_validator should be singular, but DOMjudge does not support this yet, so this should be fixed during export.
146+
else (problem.path / "output_validators").exists()
147+
)
148+
)
132149

133150
self.name: dict[str, str] = parse_setting(yamldata, "name", {"en": ""})
134151
self.uuid: str = parse_setting(yamldata, "uuid", "")
@@ -287,27 +304,13 @@ def _read_settings(self):
287304
yaml_path.write_text(raw)
288305
log("Added new UUID to problem.yaml")
289306

290-
self.settings = ProblemSettings(yaml_data, self._get_legacy_time_limit(yaml_data))
291-
self.limits = self.settings.limits
307+
self.settings = ProblemSettings(yaml_data, self, self._get_legacy_time_limit(yaml_data))
292308

293-
# TODO: Move these checks to ProblemSettings, but do keep the alias-fields in Problem.
294-
mode = (
295-
parse_validation(self.settings.validation)
296-
if self.settings.is_legacy()
297-
else set(self.settings.type.split(" "))
298-
)
299-
self.interactive = "interactive" in mode
300-
self.multipass = "multi-pass" in mode
301-
self.custom_output = (
302-
self.interactive
303-
or self.multipass
304-
or (
305-
"custom" in mode
306-
if self.settings.is_legacy()
307-
# TODO: output_validator should be singular, but DOMjudge does not support this yet, so this should be fixed during export.
308-
else (self.path / "output_validators").exists()
309-
)
310-
)
309+
# Aliasing fields makes life easier for us 😛
310+
self.limits: ProblemLimits = self.settings.limits
311+
self.interactive: bool = self.settings.interactive
312+
self.multipass: bool = self.settings.multi_pass
313+
self.custom_output: bool = self.settings.custom_output
311314

312315
# Handle dependencies...
313316
has_validation_passes = self.limits.validation_passes is not None

0 commit comments

Comments
 (0)