From b40b114bb4ab90ee7ea1638242a7392926c4ad66 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 23 Dec 2019 09:10:42 +0100 Subject: [PATCH] Feat: from optparse to click --- bopytex/__main__.py | 94 +++++++++++++++++++++++++++- bopytex/bopytex.py | 146 +++++++++----------------------------------- 2 files changed, 121 insertions(+), 119 deletions(-) diff --git a/bopytex/__main__.py b/bopytex/__main__.py index 519c2cf..26d8085 100644 --- a/bopytex/__main__.py +++ b/bopytex/__main__.py @@ -2,11 +2,101 @@ # encoding: utf-8 -from .bopytex import main +import click +import logging +from .bopytex import produce_and_compile -main() +formatter = logging.Formatter("%(name)s :: %(levelname)s :: %(message)s") +steam_handler = logging.StreamHandler() +steam_handler.setLevel(logging.DEBUG) +steam_handler.setFormatter(formatter) +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(steam_handler) +@click.command() +@click.argument( + "template", + type=click.Path(exists=True), + nargs=1, + #help="File with the template. The name should have the following form tpl_... .", +) +@click.option( + "-w", + "--working-dir", + type=click.Path(exists=True), + help="Where fed templates and compiled files will be placed", +) +@click.option( + "-s", + "--students-csv", + type=str, + default='', + help="CSV containing list of students names", +) +@click.option( + "-d", + "--dirty", + is_flag=True, + default=False, + help="Do not clean after compilation", +) +@click.option( + "-n", + "--no-compile", + is_flag=True, + default=False, + help="Do not compile source code", +) +@click.option( + "-N", + "--number_subjects", + type=int, + default=1, + help="The number of subjects to make", +) +@click.option( + "-j", + "--no-join", + is_flag=True, + default=False, + help="Do not join pdfs to a single pdf and remove individuals", +) +@click.option( + "-O", + "--only-corr", + is_flag=True, + default=False, + help="Create and compile only correction from existing subjects", +) +@click.option( + "-c", + "--corr", + is_flag=True, + default=False, + help="Create and compile correction while making subjects", +) +@click.option( + "-C", + "--crazy", + is_flag=True, + default=False, + help="Crazy mode. Tries and tries again until template feeding success!", +) +def cli(**options): + """ Bopytex + + Feed the template (tpl_...) and then compile it with latex. + + """ + logger.debug(f"CI parser gets {options}") + produce_and_compile(options) + + +if __name__ == "__main__": + cli() + # ----------------------------- # Reglages pour 'vim' # vim:set autoindent expandtab tabstop=4 shiftwidth=4: diff --git a/bopytex/bopytex.py b/bopytex/bopytex.py index 0d21994..9542558 100755 --- a/bopytex/bopytex.py +++ b/bopytex/bopytex.py @@ -8,10 +8,8 @@ Producing then compiling templates import csv import os import logging -import optparse -import sys -from path import Path +from pathlib import Path import pytex from mapytex import Expression, Integer, Decimal import bopytex.filters as filters @@ -47,18 +45,18 @@ def setup(): def get_working_dir(options): """ Get the working directory """ - if options.working_dir: - working_dir = Path(options.working_dir) + if options["working_dir"]: + working_dir = Path(options["working_dir"]) else: try: - template = Path(options.template) + template = Path(options["template"]) except TypeError: raise ValueError( "Need to set the working directory \ or to give a template" ) else: - working_dir = template.dirname() + working_dir = template.parent logger.debug(f"The output directory will be {working_dir}") return working_dir @@ -113,39 +111,48 @@ def produce_and_compile(options): """ working_dir = get_working_dir(options) - if options.only_corr: - options.corr = True + if options["only_corr"]: + options["corr"] = True tex_files = working_dir.files("[0-9]*_*.tex") else: - template = Path(options.template).name + template = Path(options["template"]).name logger.debug(f"Template will be {template}") - if options.student_csv: + if options["students_csv"]: list_infos = [ {"num": f"{i+1:02d}", "name": s} - for (i, s) in enumerate(extract_student_csv(options.student_csv)) + for (i, s) in enumerate(extract_student_csv(options["students_csv"])) ] else: - list_infos = [{"num": f"{i+1:02d}"} for i in range(options.num_subj)] + list_infos = [ + {"num": f"{i+1:02d}"} for i in range(options["number_subjects"]) + ] tex_files = [] for infos in list_infos: dest = working_dir / Path(template.replace("tpl", infos["num"])) logger.debug(f"Feeding template toward {dest}") tex_files.append(dest) - if options.crazy: + if options["crazy"]: while True: try: - pytex.feed(working_dir / template, {"infos": infos}, output=dest, force=1) + pytex.feed( + working_dir / template, + {"infos": infos}, + output=dest, + force=1, + ) except: pass else: break else: - pytex.feed(working_dir / template, {"infos": infos}, output=dest, force=1) + pytex.feed( + working_dir / template, {"infos": infos}, output=dest, force=1 + ) logger.debug(f"{dest} fed") - if not options.no_compil: + if not options["no_compil"]: pdf_files = [] for texfile in tex_files: logger.debug(f"Start compiling {texfile}") @@ -154,7 +161,7 @@ def produce_and_compile(options): pdf_files.append(str(texfile[:-4] + ".pdf")) logger.debug(f"Compiled files : {pdf_files}") - if not options.no_join and not options.no_compil: + if not options["no_join"] and not options["no_compil"]: pdfjoin( pdf_files, template.replace("tpl", "all").replace(".tex", ".pdf"), @@ -162,18 +169,18 @@ def produce_and_compile(options): rm_pdfs=1, ) - if options.corr: + if options["corr"]: pdf_files = [] for texfile in tex_files: corr_fname = activate_printanswers(texfile) - if not options.no_compil: + if not options["no_compil"]: logger.debug(f"Start compiling {texfile}") pytex.pdflatex(corr_fname) logger.debug(f"End compiling {texfile}") pdf_files.append(str(corr_fname[:-4] + ".pdf")) deactivate_printanswers(corr_fname) - if not options.no_join and not options.no_compil: + if not options["no_join"] and not options["no_compil"]: pdfjoin( pdf_files, template.replace("tpl", "corr").replace(".tex", ".pdf"), @@ -181,105 +188,10 @@ def produce_and_compile(options): rm_pdfs=1, ) - if not options.dirty: + if not options["dirty"]: pytex.clean(working_dir) -def main(): - setup() - - parser = optparse.OptionParser() - parser.add_option( - "-t", - "--template", - action="store", - type="string", - dest="template", - help="File with the template. The name should have the following form tpl_... .", - ) - parser.add_option( - "-w", - "--working-dir", - action="store", - type="string", - dest="working_dir", - help="Where fed templates and compiled files will be placed", - ) - parser.add_option( - "-N", - "--number_subjects", - action="store", - type="int", - dest="num_subj", - default=1, - help="The number of subjects to make", - ) - parser.add_option( - "-s", - "--students", - action="store", - type="string", - dest="student_csv", - help="CSV containing list of students names", - ) - parser.add_option( - "-d", - "--dirty", - action="store_true", - dest="dirty", - help="Do not clean after compilation", - ) - parser.add_option( - "-n", - "--no-compile", - action="store_true", - dest="no_compil", - help="Do not compile source code", - ) - parser.add_option( - "-j", - "--no-join", - action="store_true", - dest="no_join", - help="Do not join pdf and clean single pdf", - ) - parser.add_option( - "-O", - "--only-corr", - action="store_true", - dest="only_corr", - help="Create and compile only correction from existing subjects", - ) - parser.add_option( - "-c", - "--corr", - action="store_true", - dest="corr", - help="Create and compile correction while making subjects", - ) - parser.add_option( - "-C", - "--crazy", - action="store_true", - dest="crazy", - help="Crazy mode. Tries and tries again until template feeding success!", - ) - - (options, _) = parser.parse_args() - - logger.debug(f"CI parser gets {options}") - - if not options.template: - print("I need a template!") - sys.exit(0) - - produce_and_compile(options) - - -if __name__ == "__main__": - main() - - # ----------------------------- # Reglages pour 'vim' # vim:set autoindent expandtab tabstop=4 shiftwidth=4: