Skip to content

Commit 563f0d1

Browse files
authored
Merge pull request #252 from pehrsoderman/restructure-problem2html
Restructure problem2html and problem2pdf
2 parents 75cd6f3 + 102b723 commit 563f0d1

File tree

3 files changed

+39
-25
lines changed

3 files changed

+39
-25
lines changed

problemtools/problem2html.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
from .ProblemPlasTeX import ProblemsetMacros
1515
from . import template
1616

17-
def convert(args: list[str]|None = None) -> None:
18-
options = parse_args(args)
19-
17+
def convert(options: argparse.Namespace) -> None:
2018
problem = os.path.realpath(options.problem)
2119

2220
problembase = os.path.splitext(os.path.basename(problem))[0]
@@ -111,7 +109,7 @@ def convert(args: list[str]|None = None) -> None:
111109
os.chdir(origcwd)
112110

113111

114-
def parse_args(args: list[str]|None) -> argparse.Namespace:
112+
def get_parser() -> argparse.Namespace:
115113
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
116114

117115
parser.add_argument('-b', '--body-only', dest='bodyonly', action='store_true', help='only generate HTML body, no HTML headers', default=False)
@@ -123,18 +121,15 @@ def parse_args(args: list[str]|None) -> argparse.Namespace:
123121
parser.add_argument('-l', '--language', dest='language', help='choose alternate language (2-letter code)', default=None)
124122
parser.add_argument('-L', '--log-level', dest='loglevel', help='set log level (debug, info, warning, error, critical)', default='warning')
125123
parser.add_argument('-q', '--quiet', dest='quiet', action='store_true', help="quiet", default=False)
124+
parser.add_argument('-i', '--imgbasedir', dest='imgbasedir', default='')
126125
parser.add_argument('problem', help='the problem to convert')
127126

128-
if args is not None:
129-
options = parser.parse_args(args)
130-
else:
131-
options = parser.parse_args()
132-
133-
options.imgbasedir = ''
134-
return options
127+
return parser
135128

136129
def main() -> None:
137-
convert()
130+
parser = get_parser()
131+
options = parser.parse_args()
132+
convert(options)
138133

139134

140135
if __name__ == '__main__':

problemtools/problem2pdf.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
from . import template
99

1010

11-
def convert(args: list[str]|None = None) -> bool:
12-
options = parse_args(args)
11+
def convert(options: argparse.Namespace) -> bool:
1312

1413
problem = os.path.realpath(options.problem)
1514
problembase = os.path.splitext(os.path.basename(problem))[0]
@@ -46,7 +45,7 @@ def convert(args: list[str]|None = None) -> bool:
4645

4746
return status == 0
4847

49-
def parse_args(args: list[str]|None) -> argparse.Namespace:
48+
def get_parser() -> argparse.Namespace:
5049
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
5150

5251
parser.add_argument('-o', '--output', dest='destfile', help="output file name", default='${problem}.pdf')
@@ -55,14 +54,13 @@ def parse_args(args: list[str]|None) -> argparse.Namespace:
5554
parser.add_argument('-n', '--no-pdf', dest='nopdf', action='store_true', help='run pdflatex in -draftmode', default=False)
5655
parser.add_argument('problem', help='the problem to convert')
5756

58-
if args is not None:
59-
return parser.parse_args(args)
60-
61-
return parser.parse_args()
57+
return parser
6258

6359

6460
def main() -> None:
65-
convert()
61+
parser = get_parser()
62+
options = parser.parse_args()
63+
convert(options)
6664

6765

6866
if __name__ == '__main__':

problemtools/verifyproblem.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import sys
1616
import copy
1717
import random
18+
import traceback
19+
1820
import argparse
1921
import shlex
2022

@@ -398,6 +400,10 @@ def get_subgroups(self) -> list[TestCaseGroup]:
398400
return [child for child in self._items if isinstance(child, TestCaseGroup)]
399401

400402

403+
def get_subgroup(self, name):
404+
return next((child for child in self._items if isinstance(child, TestCaseGroup) and os.path.basename(child._datadir) == name), None)
405+
406+
401407
def has_custom_groups(self) -> bool:
402408
return any(group.get_subgroups() for group in self.get_subgroups())
403409

@@ -1076,16 +1082,26 @@ def check(self, args: argparse.Namespace) -> bool:
10761082

10771083
for lang in self.languages:
10781084
try:
1079-
if not problem2pdf.convert([self._problem.probdir, '--language', lang, '--no-pdf', '--quiet']):
1085+
options = problem2pdf.get_parser().parse_args([None])
1086+
options.problem = self._problem.probdir
1087+
options.language = lang
1088+
options.nopdf = True
1089+
options.quiet = True
1090+
if not problem2pdf.convert(options):
10801091
langparam = f' --language {lang}' if lang != '' else ''
10811092
self.error(f'Could not compile problem statement for language "{lang}". Run problem2pdf{langparam} on the problem to diagnose.')
10821093
except Exception as e:
1083-
self.error(f'Error raised when checking problem statement for language {lang}:\n{e}')
1094+
self.error(f'Error raised when checking problem statement for language {lang}:\n{e}\n{traceback.format_exc()}')
10841095
try:
1085-
problem2html.convert([self._problem.probdir, '--dest-dir', os.path.join(self._problem.tmpdir, 'html'), '--language', lang, '--quiet'])
1086-
except Exception:
1096+
options = problem2html.get_parser().parse_args([None])
1097+
options.problem = self._problem.probdir
1098+
options.destdir = os.path.join(self._problem.tmpdir, 'html')
1099+
options.language = lang
1100+
options.quiet = True
1101+
problem2html.convert(options)
1102+
except Exception as e:
10871103
langparam = f' --language {lang}' if lang != '' else ''
1088-
self.error(f'Could not convert problem statement to html for language "{lang}". Run problem2html{langparam} on the problem to diagnose.')
1104+
self.error(f'Could not convert problem statement to html for language "{lang}". Run problem2html{langparam} on the problem to diagnose.\n{e}\n{traceback.format_exc()}')
10891105
return self._check_res
10901106

10911107
def __str__(self) -> str:
@@ -1138,6 +1154,11 @@ def check(self, args: argparse.Namespace) -> bool:
11381154

11391155
return self._check_res
11401156

1157+
1158+
def get_attachment_paths(self):
1159+
return self.attachments
1160+
1161+
11411162
def __str__(self) -> str:
11421163
return 'attachments'
11431164

0 commit comments

Comments
 (0)