diff --git a/patacrep/songbook/__main__.py b/patacrep/songbook/__main__.py index 5713b4a9..004f3e95 100644 --- a/patacrep/songbook/__main__.py +++ b/patacrep/songbook/__main__.py @@ -9,6 +9,7 @@ import textwrap import sys from patacrep.build import SongbookBuilder, DEFAULT_STEPS +from patacrep.utils import yesno from patacrep import __version__ from patacrep import errors import patacrep.encoding @@ -37,6 +38,16 @@ class VerboseAction(argparse.Action): def __call__(self, *_args, **_kwargs): LOGGER.setLevel(logging.DEBUG) +def yesno_type(string): + """Interpret argument as a "yes" or a "no". + + Raise `argparse.ArgumentTypeError` if string cannot be analysed. + """ + try: + return yesno(string) + except ValueError as error: + raise argparse.ArgumentTypeError(str(error)) + def argument_parser(args): """Parse arguments""" parser = argparse.ArgumentParser( @@ -68,6 +79,15 @@ def argument_parser(args): """) ) + parser.add_argument( + '--cache', '-c', nargs=1, + help=textwrap.dedent("""\ + Enable song cache. + """), + type=yesno_type, + default=[True], + ) + parser.add_argument( '--steps', '-s', nargs=1, type=str, action=ParseStepsAction, @@ -107,7 +127,7 @@ def main(): options = argument_parser(sys.argv[1:]) - songbook_path = options.book[0] + songbook_path = options.book[-1] if os.path.exists(songbook_path + ".sb") and not os.path.exists(songbook_path): songbook_path += ".sb" @@ -147,6 +167,7 @@ def main(): datadirs.append(os.path.dirname(os.path.abspath(songbook_path))) songbook['datadir'] = datadirs + songbook['_cache'] = options.cache[0] try: sb_builder = SongbookBuilder(songbook, basename) diff --git a/patacrep/songs/__init__.py b/patacrep/songs/__init__.py index 129c8045..a36c17bc 100644 --- a/patacrep/songs/__init__.py +++ b/patacrep/songs/__init__.py @@ -104,7 +104,7 @@ class Song: self.encoding = config["encoding"] self.config = config - if datadir: + if self.datadir and self.config['_cache']: # Only songs in datadirs are cached self._filehash = hashlib.md5( open(self.fullpath, 'rb').read() @@ -155,7 +155,7 @@ class Song: def _write_cache(self): """If relevant, write a dumbed down version of self to the cache.""" - if self.datadir: + if self.datadir and self.config['_cache']: cached = {} for attribute in self.cached_attributes: cached[attribute] = getattr(self, attribute) diff --git a/patacrep/songs/convert/__main__.py b/patacrep/songs/convert/__main__.py index 6b40dca4..2880cdab 100644 --- a/patacrep/songs/convert/__main__.py +++ b/patacrep/songs/convert/__main__.py @@ -7,24 +7,21 @@ import os import logging import sys -from patacrep.build import DEFAULT_CONFIG from patacrep import files +from patacrep.build import DEFAULT_CONFIG +from patacrep.utils import yesno LOGGER = logging.getLogger(__name__) def __usage(): return "python3 -m patacrep.songs.convert INPUTFORMAT OUTPUTFORMAT FILES" -def yesno(prompt): - while True: - answer = input("{} [yn] ".format(prompt)) - if answer.strip().lower() == "y": - return True - if answer.strip().lower() == "n": - return False - def confirm(destname): - return yesno("File '{}' already exist. Overwrite?".format(destname)) + while True + try: + return yesno(input("File '{}' already exist. Overwrite? [yn] ".format(destname))) + except ValueError: + continue if __name__ == "__main__": if len(sys.argv) < 4: diff --git a/patacrep/utils.py b/patacrep/utils.py index 6d9eab4c..998fe738 100644 --- a/patacrep/utils.py +++ b/patacrep/utils.py @@ -59,3 +59,19 @@ class DictOfDict(UserDict): DictOfDict._update(left[key], right[key]) else: left[key] = right[key] + +def yesno(string): + """Interpret string argument as a boolean. + + May raise `ValueError` if argument cannot be interpreted. + """ + yes_strings = ["y", "yes", "true", "1"] + no_strings = ["n", "no", "false", "0"] + if string.lower() in yes_strings: + return True + if string.lower() in no_strings: + return False + raise ValueError("'{}' is supposed to be one of {}.".format( + string, + ", ".join(["'{}'".format(string) for string in yes_strings + no_strings]), + )) diff --git a/test/test_compilation/test_compilation.py b/test/test_compilation/test_compilation.py index 0444efa2..f2c6d09c 100644 --- a/test/test_compilation/test_compilation.py +++ b/test/test_compilation/test_compilation.py @@ -111,7 +111,7 @@ class FileTest(unittest.TestCase, metaclass=dynamic.DynamicTest): @staticmethod def compile_songbook(songbook, steps=None): """Compile songbook, and return the command return code.""" - command = [sys.executable, '-m', 'patacrep.songbook', songbook] + command = [sys.executable, '-m', 'patacrep.songbook', '--cache=no', songbook, '-v'] if steps: command.extend(['--steps', steps])