Skip to content

Commit d219806

Browse files
committed
Extract archives to a single zip file
1 parent bfee03a commit d219806

File tree

3 files changed

+65
-16
lines changed

3 files changed

+65
-16
lines changed

code_submitter/extract_archives.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env python3
22

33
import asyncio
4+
import zipfile
45
import argparse
56
from pathlib import Path
67

@@ -9,33 +10,24 @@
910
from . import utils, config
1011

1112

12-
async def async_main(submissions_directory: Path) -> None:
13-
submissions_directory.mkdir(parents=True, exist_ok=True)
13+
async def async_main(output_archive: Path) -> None:
14+
output_archive.parent.mkdir(parents=True, exist_ok=True)
1415

1516
database = databases.Database(config.DATABASE_URL)
1617

17-
async with database.transaction():
18-
submissions = await utils.get_chosen_submissions(database)
19-
20-
for team, (_, content) in submissions.items():
21-
(submissions_directory / f'{team.upper()}.zip').write_bytes(content)
22-
23-
(submissions_directory / 'summary.txt').write_text(
24-
"".join(
25-
"{}: {}\n".format(team, id_)
26-
for team, (id_, _) in submissions.items()
27-
),
28-
)
18+
with zipfile.ZipFile(output_archive) as zf:
19+
async with database.transaction():
20+
utils.collect_submissions(database, zf)
2921

3022

3123
def parse_args() -> argparse.Namespace:
3224
parser = argparse.ArgumentParser()
33-
parser.add_argument('submissions_directory', type=Path)
25+
parser.add_argument('output_archive', type=Path)
3426
return parser.parse_args()
3527

3628

3729
def main(args: argparse.Namespace) -> None:
38-
asyncio.get_event_loop().run_until_complete(async_main(args.submissions_directory))
30+
asyncio.get_event_loop().run_until_complete(async_main(args.output_archive))
3931

4032

4133
if __name__ == '__main__':

code_submitter/utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from typing import Dict, Tuple
2+
from zipfile import ZipFile
23

34
import databases
45
from sqlalchemy.sql import select
@@ -32,3 +33,22 @@ async def get_chosen_submissions(
3233

3334
# Rely on later keys replacing earlier occurrences of the same key.
3435
return {x['team']: (x['id'], x['content']) for x in rows}
36+
37+
38+
def summarise(submissions: Dict[str, Tuple[int, bytes]]) -> str:
39+
return "".join(
40+
"{}: {}\n".format(team, id_)
41+
for team, (id_, _) in sorted(submissions.items())
42+
)
43+
44+
45+
async def collect_submissions(
46+
database: databases.Database,
47+
zipfile: ZipFile,
48+
) -> None:
49+
submissions = await get_chosen_submissions(database)
50+
51+
for team, (_, content) in submissions.items():
52+
zipfile.writestr(f'{team.upper()}.zip', content)
53+
54+
zipfile.writestr('summary.txt', summarise(submissions))

tests/tests_utils.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import io
2+
import zipfile
13
import datetime
24

35
import test_utils
@@ -72,3 +74,38 @@ def test_get_chosen_submissions_multiple_chosen(self) -> None:
7274
},
7375
result,
7476
)
77+
78+
def test_collect_submissions(self) -> None:
79+
self.await_(self.database.execute(
80+
ChoiceHistory.insert().values(
81+
archive_id=8888888888,
82+
username='someone_else',
83+
created=datetime.datetime(2020, 8, 8, 12, 0),
84+
),
85+
))
86+
self.await_(self.database.execute(
87+
ChoiceHistory.insert().values(
88+
archive_id=1111111111,
89+
username='test_user',
90+
created=datetime.datetime(2020, 3, 3, 12, 0),
91+
),
92+
))
93+
self.await_(self.database.execute(
94+
ChoiceHistory.insert().values(
95+
archive_id=2222222222,
96+
username='test_user',
97+
created=datetime.datetime(2020, 2, 2, 12, 0),
98+
),
99+
))
100+
101+
with zipfile.ZipFile(io.BytesIO(), mode='w') as zf:
102+
self.await_(utils.collect_submissions(self.database, zf))
103+
104+
self.assertEqual(
105+
{
106+
'summary.txt': b'ABC: 8888888888\nSRZ2: 1111111111\n',
107+
'SRZ2.zip': b'1111111111',
108+
'ABC.zip': b'8888888888',
109+
},
110+
{x: zf.open(x).read() for x in zf.namelist()},
111+
)

0 commit comments

Comments
 (0)