Skip to content
This repository was archived by the owner on Oct 23, 2023. It is now read-only.

Commit 0d33a24

Browse files
committed
Refactored duplicated evaluate_task logic for the uis
1 parent 07c1a9a commit 0d33a24

3 files changed

Lines changed: 35 additions & 32 deletions

File tree

python/formats/ioi_format.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -267,32 +267,22 @@ def evaluate_task(frontend: Frontend, task: Task, solutions: List[Solution],
267267
task,
268268
dict((st_num, [tc for tc in st.testcases.keys()])
269269
for st_num, st in task.subtasks.items()), config.ui == UIS.PRINT)
270+
curses_ui = None
271+
finish_ui = None
270272
if config.ui == UIS.CURSES:
271273
curses_ui = IOICursesUI(ui_interface)
272-
curses_ui.start()
274+
if config.ui != UIS.SILENT:
275+
finish_ui = IOIFinishUI(config, task, ui_interface)
273276

274-
try:
277+
with ui_interface.run_in_ui(curses_ui, finish_ui):
275278
ins, outs, vals = generate_inputs(frontend, task, ui_interface, config)
276279
evaluate_solutions(frontend, ins, outs, vals, solutions, ui_interface,
277280
config)
278281

279282
sanity_pre_checks(task, solutions, frontend, config, ui_interface)
280283
frontend.evaluate()
281284
sanity_post_checks(task, solutions, ui_interface)
282-
except:
283-
if config.ui == UIS.CURSES:
284-
curses_ui.stop()
285-
traceback.print_exc()
286-
return ui_interface
287-
288-
if config.ui == UIS.CURSES:
289-
if curses_ui.errored:
290-
return ui_interface
291-
curses_ui.stop()
292285

293-
if config.ui != UIS.SILENT:
294-
finish_ui = IOIFinishUI(config, task, ui_interface)
295-
finish_ui.print()
296286
return ui_interface
297287

298288

python/formats/terry_format.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,14 @@ def evaluate_task(frontend: Frontend, task: TerryTask,
8989
solutions: List[SourceFile],
9090
config: Config) -> TerryUIInterface:
9191
ui_interface = TerryUIInterface(task, config.ui == UIS.PRINT)
92+
curses_ui = None
93+
finish_ui = None
9294
if config.ui == UIS.CURSES:
9395
curses_ui = TerryCursesUI(ui_interface)
94-
curses_ui.start()
96+
if config.ui != UIS.SILENT:
97+
finish_ui = TerryFinishUI(config, task, ui_interface)
9598

96-
try:
99+
with ui_interface.run_in_ui(curses_ui, finish_ui):
97100
task.generator.prepare(frontend, config)
98101
ui_interface.add_non_solution(task.generator)
99102
if task.validator:
@@ -111,19 +114,6 @@ def evaluate_task(frontend: Frontend, task: TerryTask,
111114
evaluate_solution(frontend, task, solution, config, ui_interface)
112115

113116
frontend.evaluate()
114-
except:
115-
if config.ui == UIS.CURSES:
116-
curses_ui.stop()
117-
traceback.print_exc()
118-
return ui_interface
119-
120-
if config.ui == UIS.CURSES:
121-
if curses_ui.errored:
122-
return ui_interface
123-
curses_ui.stop()
124-
if config.ui != UIS.SILENT:
125-
finish_ui = TerryFinishUI(config, task, ui_interface)
126-
finish_ui.print()
127117
return ui_interface
128118

129119

python/uis/__init__.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#!/usr/bin/env python3
22
import curses
33
from abc import ABC, abstractmethod
4+
from contextlib import contextmanager
45
from enum import Enum
56
import signal
67
import threading
78
import time
8-
from typing import Dict, List
9+
from typing import Dict, List, Optional
910
import traceback
1011

1112
from task_maker.config import Config
@@ -136,15 +137,37 @@ def add_error(self, message: str):
136137
self.printer.red("ERROR ", bold=True)
137138
self.printer.text(message.strip() + "\n")
138139

140+
@contextmanager
141+
def run_in_ui(self, curses_ui: Optional["CursesUI"],
142+
finish_ui: Optional["FinishUI"]):
143+
if curses_ui:
144+
curses_ui.start()
145+
try:
146+
yield
147+
except:
148+
if curses_ui:
149+
curses_ui.stop()
150+
traceback.print_exc()
151+
return
152+
else:
153+
if curses_ui:
154+
curses_ui.stop()
155+
if finish_ui:
156+
finish_ui.print()
139157

140-
class FinishUI:
158+
159+
class FinishUI(ABC):
141160
LIMITS_MARGIN = 0.8
142161

143162
def __init__(self, config: Config, interface: UIInterface):
144163
self.config = config
145164
self.interface = interface
146165
self.printer = StdoutPrinter()
147166

167+
@abstractmethod
168+
def print(self):
169+
pass
170+
148171
def _print_compilation(self, solution: str,
149172
result: SourceFileCompilationResult,
150173
max_sol_len: int):

0 commit comments

Comments
 (0)