Skip to content

Commit b3a4690

Browse files
fix: should fix compiler engine for python 3.14
1 parent 69886aa commit b3a4690

10 files changed

Lines changed: 97 additions & 33 deletions

File tree

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM python:3.13-slim-trixie AS runtime
1+
FROM python:3.14-slim-trixie AS runtime
22

33
# Install dependencies
44
RUN apt-get update &&\

Pipfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ boto3-stubs = {extras = ["s3"], version = "*"}
1212
[dev-packages]
1313

1414
[requires]
15-
python_version = "3.13"
15+
python_version = "3.14"

Pipfile.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from rcc import main
22

3-
main()
3+
if __name__ == "__main__":
4+
main()

src/rcc/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def main():
7878
task_queue = mp.JoinableQueue()
7979
engine_workers = [
8080
mp.Process(
81-
target=rcc.engine.process_commits, args=(data_provider, task_queue)
81+
target=rcc.engine.process_commits, args=(data_provider, task_queue, cfg)
8282
)
8383
for _ in range(cfg.num_workers)
8484
]

src/rcc/config.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,26 @@ def __init__(self, config_dict):
2626
def update(self, other):
2727
"""Update stored configuration using another `Config` or `dict`."""
2828
if isinstance(other, Config):
29-
self.__config__.update(other.__config__)
29+
self._Config__config__.update(other._Config__config__)
3030
elif isinstance(other, dict):
3131
_check_dict(other)
32-
self.__config__.update(other)
32+
self._Config__config__.update(other)
33+
34+
def get_dict(self):
35+
"""Return the underlying configuration dictionary."""
36+
return self.__config__
3337

3438
def __getattr__(self, name):
3539
return self.__config__[name]
3640

41+
def __getstate__(self):
42+
"""Return state for pickling."""
43+
return {"_Config__config__": self.__config__}
44+
45+
def __setstate__(self, state):
46+
"""Restore state from pickling."""
47+
self.__config__ = state["_Config__config__"]
48+
3749
def __repr__(self):
3850
return self.__config__.__repr__()
3951

src/rcc/engine.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import logging
99
import os
1010
import shutil
11+
import sys
1112
import zipfile
1213

1314
import docker
@@ -234,7 +235,13 @@ async def run(data_provider, commit, test_cases, base_dir, remote_dir):
234235
def run_tests(
235236
data_provider, storage_provider, commit, test_cases, base_dir, remote_dir
236237
):
237-
loop = asyncio.get_event_loop()
238+
try:
239+
loop = asyncio.get_event_loop()
240+
except RuntimeError:
241+
# No event loop in current thread, create a new one
242+
loop = asyncio.new_event_loop()
243+
asyncio.set_event_loop(loop)
244+
238245
run_task = run(data_provider, commit, test_cases, base_dir, remote_dir)
239246
loop.run_until_complete(run_task)
240247
# loop.close()
@@ -304,8 +311,9 @@ def rmtree_handler(_func, _path, exc_info):
304311
shutil.rmtree(base_dir, onexc=rmtree_handler)
305312

306313

307-
def process_commit(data_provider, commit):
308-
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
314+
def process_commit(data_provider, commit, cfg=None):
315+
if cfg is None:
316+
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
309317
logger = logging.getLogger(rcc.config.DEFAULT_LOGGER)
310318
logger.debug(
311319
"[{c.id}]"
@@ -396,10 +404,27 @@ def process_commit(data_provider, commit):
396404
logger.debug("[{c.id}] Commit processing done".format(c=commit))
397405

398406

399-
def process_commits(data_provider, commit_queue):
407+
def process_commits(data_provider, commit_queue, cfg=None):
408+
# Set up logging for worker process
400409
logger = logging.getLogger(rcc.config.DEFAULT_LOGGER)
410+
411+
# Only add handlers if logger doesn't have any (worker processes don't inherit parent's handlers)
412+
if not logger.handlers:
413+
logger.setLevel(logging.DEBUG)
414+
console_handler = logging.StreamHandler(sys.stderr)
415+
console_fmt = logging.Formatter(
416+
"[%(asctime)s] %(module)s:%(lineno)d: <%(process)d> %(message)s"
417+
)
418+
console_handler.setFormatter(console_fmt)
419+
logger.addHandler(console_handler)
420+
401421
logger.debug("Worker started")
402422

423+
# Register configuration if provided
424+
if cfg is not None:
425+
# Access the underlying configuration dictionary
426+
rcc.config.from_dict(rcc.config.DEFAULT_CONFIG, cfg.get_dict())
427+
403428
# exceptions that stop the worker
404429
non_retryable_exceptions = (
405430
KeyboardInterrupt,
@@ -418,7 +443,7 @@ def process_commits(data_provider, commit_queue):
418443
# Hint to stop processing, mark empty task as done (in finally block) and bail
419444
break
420445

421-
process_commit(data_provider, commit)
446+
process_commit(data_provider, commit, cfg)
422447

423448
# If exception should stop the worker
424449
except non_retryable_exceptions as e:

src/rcc/tests/engine/known_issues/test_process_commit.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import datetime
22
import logging
3-
import multiprocessing as mp
43
import os
5-
import rcc.config
6-
import rcc.engine
7-
import rcc.provider.data
8-
import rcc.provider.storage
94
import shutil
105
import sys
116
import unittest
12-
import zipfile
137

8+
import rcc.config
9+
import rcc.engine
10+
import rcc.provider.data
11+
import rcc.provider.storage
1412
from rcc.model import Commit, TestCase
1513

1614
# Metadata sample
@@ -41,7 +39,12 @@
4139
"expected_status": Commit.STATUS_COMPLETED,
4240
"exercise": {
4341
"id": 1,
44-
"test_cases": [{"id": 10, "out_type": TestCase.IO_TYPE_TEXT,},],
42+
"test_cases": [
43+
{
44+
"id": 10,
45+
"out_type": TestCase.IO_TYPE_TEXT,
46+
},
47+
],
4548
},
4649
},
4750
{
@@ -53,7 +56,11 @@
5356
"exercise": {
5457
"id": 2,
5558
"test_cases": [
56-
{"id": i, "out_type": TestCase.IO_TYPE_TEXT,} for i in range(4)
59+
{
60+
"id": i,
61+
"out_type": TestCase.IO_TYPE_TEXT,
62+
}
63+
for i in range(4)
5764
],
5865
},
5966
},
@@ -66,7 +73,11 @@
6673
"exercise": {
6774
"id": 3,
6875
"test_cases": [
69-
{"id": 10, "out_type": TestCase.IO_TYPE_TEXT, "files": ["3.in"],},
76+
{
77+
"id": 10,
78+
"out_type": TestCase.IO_TYPE_TEXT,
79+
"files": ["3.in"],
80+
},
7081
],
7182
},
7283
},
@@ -79,7 +90,11 @@
7990
"exercise": {
8091
"id": 4,
8192
"test_cases": [
82-
{"id": i, "out_type": TestCase.IO_TYPE_TEXT,} for i in range(1, 11)
93+
{
94+
"id": i,
95+
"out_type": TestCase.IO_TYPE_TEXT,
96+
}
97+
for i in range(1, 11)
8398
],
8499
},
85100
},
@@ -230,5 +245,6 @@ def test_process_commit_known_issues(self):
230245
for metadata in commit_metadata:
231246
commit = build_commit(metadata)
232247
with self.subTest(name=commit.user_email):
233-
rcc.engine.process_commit(self.data_prov, commit)
248+
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
249+
rcc.engine.process_commit(self.data_prov, commit, cfg)
234250
self.assertEqual(commit.status, metadata["expected_status"])

src/rcc/tests/engine/test_process_commit_hello.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ def setUp(self):
217217
self.storage_from_config = rcc.provider.storage.from_config
218218
rcc.provider.storage.from_config = MockStorageProvider
219219
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
220+
if cfg is None:
221+
# Register a default configuration for tests
222+
cfg = rcc.config.from_dict(rcc.config.DEFAULT_CONFIG, {})
220223
cfg.update({"max_output_file_size": 1024 * 1024})
221224
self.handler = logging.StreamHandler(sys.stderr)
222225
self.handler.setLevel(logging.DEBUG)
@@ -233,7 +236,8 @@ def tearDown(self):
233236
logger.removeHandler(self.handler)
234237

235238
def run_test_process_commit(self, commit):
236-
rcc.engine.process_commit(self.data_prov, commit)
239+
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
240+
rcc.engine.process_commit(self.data_prov, commit, cfg)
237241
self.assertEqual(commit.status, Commit.STATUS_COMPLETED)
238242
self.assertEqual(commit.score, 10)
239243
self.assertEqual(commit.corrects, 1)

src/rcc/tests/engine/test_process_commit_zip.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,10 @@ def setUp(self):
185185
self.data_prov = hello.MockDataProvider()
186186
self.S3Provider = rcc.provider.storage.S3
187187
rcc.provider.storage.S3 = MockStorageProvider
188+
# Ensure configuration is registered for tests
189+
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
190+
if cfg is None:
191+
cfg = rcc.config.from_dict(rcc.config.DEFAULT_CONFIG, {})
188192
self.handler = logging.StreamHandler(sys.stdout)
189193
self.handler.setLevel(logging.DEBUG)
190194
self.handler.setFormatter(
@@ -199,7 +203,8 @@ def tearDown(self):
199203
logger.removeHandler(self.handler)
200204

201205
def run_test_process_commit(self, commit):
202-
rcc.engine.process_commit(self.data_prov, commit)
206+
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
207+
rcc.engine.process_commit(self.data_prov, commit, cfg)
203208
self.assertEqual(commit.status, Commit.STATUS_COMPLETED)
204209
self.assertEqual(commit.score, 10)
205210
self.assertEqual(commit.corrects, 1)
@@ -222,7 +227,8 @@ def test_process_commit_zip_hs(self):
222227

223228
def test_process_commit_zip_java(self):
224229
commit = build_commit(5, "java", "hello.zip", "Zip/Makefile")
225-
rcc.engine.process_commit(self.data_prov, commit)
230+
cfg = rcc.config.get_config(rcc.config.DEFAULT_CONFIG)
231+
rcc.engine.process_commit(self.data_prov, commit, cfg)
226232
self.run_test_process_commit(commit)
227233

228234
# def test_process_commit_zip_m(self):

0 commit comments

Comments
 (0)