refactor for readability
This commit is contained in:
42
app/main.py
42
app/main.py
@@ -1,10 +1,8 @@
|
|||||||
import sys
|
|
||||||
|
|
||||||
import click
|
import click
|
||||||
from click import ClickException
|
from click import ClickException
|
||||||
|
|
||||||
from app.generate import generate_answers, generate_problems
|
|
||||||
from app.config import BEGIN_ANSWERS_TOKEN
|
from app.config import BEGIN_ANSWERS_TOKEN
|
||||||
|
from app.generate import generate_answers, generate_problems
|
||||||
from app.pdf import make_pdf
|
from app.pdf import make_pdf
|
||||||
|
|
||||||
|
|
||||||
@@ -24,6 +22,26 @@ def main(
|
|||||||
output_filepath: str = None,
|
output_filepath: str = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
|
validate_args(pdf, silent, output_filepath)
|
||||||
|
|
||||||
|
answers, problems = make_problems_and_answers(bits, num_problems)
|
||||||
|
|
||||||
|
if pdf:
|
||||||
|
make_pdf(
|
||||||
|
problems=problems,
|
||||||
|
answers=answers,
|
||||||
|
output_path=output_filepath or "problems.pdf",
|
||||||
|
include_answers=include_answers,
|
||||||
|
)
|
||||||
|
|
||||||
|
if not silent:
|
||||||
|
if include_answers:
|
||||||
|
click.echo(BEGIN_ANSWERS_TOKEN.join((problems, answers)))
|
||||||
|
else:
|
||||||
|
click.echo(problems)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_args(pdf, silent, output_filepath):
|
||||||
if pdf and silent:
|
if pdf and silent:
|
||||||
raise ClickException(
|
raise ClickException(
|
||||||
"please specify either `pdf` or `silent`, not both (otherwise there "
|
"please specify either `pdf` or `silent`, not both (otherwise there "
|
||||||
@@ -33,24 +51,12 @@ def main(
|
|||||||
if pdf and output_filepath and not output_filepath.endswith("pdf"):
|
if pdf and output_filepath and not output_filepath.endswith("pdf"):
|
||||||
raise ClickException("Please include an output filepath ending in '.pdf'")
|
raise ClickException("Please include an output filepath ending in '.pdf'")
|
||||||
|
|
||||||
|
|
||||||
|
def make_problems_and_answers(bits, num_problems):
|
||||||
problems = generate_problems(bits, num_problems)
|
problems = generate_problems(bits, num_problems)
|
||||||
answers = generate_answers(problems)
|
answers = generate_answers(problems)
|
||||||
|
|
||||||
problems_string = "\n\n".join(problems)
|
problems_string = "\n\n".join(problems)
|
||||||
answers_string = "\n\n".join(
|
answers_string = "\n\n".join(
|
||||||
[f"{problem} | {answer} " for problem, answer in zip(problems, answers)]
|
[f"{problem} | {answer} " for problem, answer in zip(problems, answers)]
|
||||||
)
|
)
|
||||||
|
return answers_string, problems_string
|
||||||
if pdf:
|
|
||||||
make_pdf(
|
|
||||||
problems=problems_string,
|
|
||||||
answers=answers_string,
|
|
||||||
output_path=output_filepath or "problems.pdf",
|
|
||||||
include_answers=include_answers,
|
|
||||||
)
|
|
||||||
|
|
||||||
if not silent:
|
|
||||||
if include_answers:
|
|
||||||
click.echo(BEGIN_ANSWERS_TOKEN.join((problems_string, answers_string)))
|
|
||||||
else:
|
|
||||||
click.echo(problems_string)
|
|
||||||
|
|||||||
45
app/pdf.py
45
app/pdf.py
@@ -2,6 +2,8 @@ import os
|
|||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
|
POSTSCRIPT_FILEPATH = "tempfile.ps"
|
||||||
|
|
||||||
|
|
||||||
def make_pdf(
|
def make_pdf(
|
||||||
problems: str, answers: str, output_path: str, include_answers: bool
|
problems: str, answers: str, output_path: str, include_answers: bool
|
||||||
@@ -11,29 +13,32 @@ def make_pdf(
|
|||||||
else:
|
else:
|
||||||
pdf_jobs = ("problems", problems)
|
pdf_jobs = ("problems", problems)
|
||||||
|
|
||||||
for job_name, job in pdf_jobs:
|
for job_name, text in pdf_jobs:
|
||||||
|
|
||||||
if job_name == "answers":
|
if job_name == "answers":
|
||||||
path, filename = os.path.split(output_path)
|
output_path = make_answers_path(output_path)
|
||||||
new_filename = f"{filename.split('.pdf')[0]}-answers.pdf"
|
|
||||||
output_path = os.path.join(path, new_filename)
|
|
||||||
|
|
||||||
with tempfile.NamedTemporaryFile(mode="w") as txt_file:
|
with tempfile.NamedTemporaryFile(mode="w") as txt_file:
|
||||||
txt_file.write(job)
|
write_to_txtfile(txt_file, text)
|
||||||
txt_file.flush()
|
make_postscript_file(txt_file)
|
||||||
|
make_pdf_file(output_path)
|
||||||
|
os.unlink(POSTSCRIPT_FILEPATH)
|
||||||
|
|
||||||
command = (
|
|
||||||
f"enscript --columns=4 --no-header --output=tempfile.ps {txt_file.name}"
|
|
||||||
)
|
|
||||||
print(f"command: '{command}'")
|
|
||||||
|
|
||||||
output = subprocess.check_output(command, shell=True)
|
def make_answers_path(path):
|
||||||
print(output)
|
path, filename = os.path.split(path)
|
||||||
|
new_filename = f"{filename.split('.pdf')[0]}-answers.pdf"
|
||||||
|
return os.path.join(path, new_filename)
|
||||||
|
|
||||||
command = f"ps2pdf tempfile.ps {output_path}"
|
|
||||||
print(f"command: '{command}'")
|
|
||||||
|
|
||||||
output = subprocess.check_output(command, shell=True)
|
def write_to_txtfile(txt_file, text):
|
||||||
print(output)
|
txt_file.write(text)
|
||||||
print("made pdf", output_path)
|
txt_file.flush()
|
||||||
os.unlink("tempfile.ps")
|
|
||||||
|
|
||||||
|
def make_pdf_file(output_path):
|
||||||
|
command = f"ps2pdf {POSTSCRIPT_FILEPATH} {output_path}"
|
||||||
|
subprocess.call(command, shell=True)
|
||||||
|
|
||||||
|
|
||||||
|
def make_postscript_file(txt_file):
|
||||||
|
command = f"enscript --columns=4 --no-header --output={POSTSCRIPT_FILEPATH} {txt_file.name}"
|
||||||
|
subprocess.call(command, shell=True)
|
||||||
|
|||||||
BIN
problems-answers.pdf
Normal file
BIN
problems-answers.pdf
Normal file
Binary file not shown.
BIN
problems.pdf
Normal file
BIN
problems.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user