Browse Source

Add a '--cache' option

pull/158/head
Louis 9 years ago
parent
commit
08e5e000b7
  1. 16
      patacrep/songbook/__main__.py
  2. 4
      patacrep/songs/__init__.py
  3. 17
      patacrep/songs/convert/__main__.py
  4. 16
      patacrep/utils.py
  5. 2
      test/test_compilation/test_compilation.py

16
patacrep/songbook/__main__.py

@ -9,6 +9,7 @@ import textwrap
import sys import sys
from patacrep.build import SongbookBuilder, DEFAULT_STEPS from patacrep.build import SongbookBuilder, DEFAULT_STEPS
from patacrep.utils import yesno
from patacrep import __version__ from patacrep import __version__
from patacrep import errors from patacrep import errors
import patacrep.encoding import patacrep.encoding
@ -37,6 +38,12 @@ class VerboseAction(argparse.Action):
def __call__(self, *_args, **_kwargs): def __call__(self, *_args, **_kwargs):
LOGGER.setLevel(logging.DEBUG) LOGGER.setLevel(logging.DEBUG)
def yesno_type(string):
try:
return yesno(string)
except ValueError as error:
raise argparse.ArgumentTypeError(str(error))
def argument_parser(args): def argument_parser(args):
"""Parse arguments""" """Parse arguments"""
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
@ -68,6 +75,14 @@ def argument_parser(args):
""") """)
) )
parser.add_argument(
'--cache', '-c', nargs=1,
help=textwrap.dedent("""\
Enable song cache.
"""),
type=yesno_type,
)
parser.add_argument( parser.add_argument(
'--steps', '-s', nargs=1, type=str, '--steps', '-s', nargs=1, type=str,
action=ParseStepsAction, action=ParseStepsAction,
@ -147,6 +162,7 @@ def main():
datadirs.append(os.path.dirname(os.path.abspath(songbook_path))) datadirs.append(os.path.dirname(os.path.abspath(songbook_path)))
songbook['datadir'] = datadirs songbook['datadir'] = datadirs
songbook['_cache'] = options.cache[0]
try: try:
sb_builder = SongbookBuilder(songbook, basename) sb_builder = SongbookBuilder(songbook, basename)

4
patacrep/songs/__init__.py

@ -104,7 +104,7 @@ class Song:
self.encoding = config["encoding"] self.encoding = config["encoding"]
self.config = config self.config = config
if datadir: if self.datadir and self.config['_cache']:
# Only songs in datadirs are cached # Only songs in datadirs are cached
self._filehash = hashlib.md5( self._filehash = hashlib.md5(
open(self.fullpath, 'rb').read() open(self.fullpath, 'rb').read()
@ -155,7 +155,7 @@ class Song:
def _write_cache(self): def _write_cache(self):
"""If relevant, write a dumbed down version of self to the cache.""" """If relevant, write a dumbed down version of self to the cache."""
if self.datadir: if self.datadir and self.config['_cache']:
cached = {} cached = {}
for attribute in self.cached_attributes: for attribute in self.cached_attributes:
cached[attribute] = getattr(self, attribute) cached[attribute] = getattr(self, attribute)

17
patacrep/songs/convert/__main__.py

@ -7,24 +7,21 @@ import os
import logging import logging
import sys import sys
from patacrep.build import DEFAULT_CONFIG
from patacrep import files from patacrep import files
from patacrep.build import DEFAULT_CONFIG
from patacrep.utils import yesno
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
def __usage(): def __usage():
return "python3 -m patacrep.songs.convert INPUTFORMAT OUTPUTFORMAT FILES" 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): 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 __name__ == "__main__":
if len(sys.argv) < 4: if len(sys.argv) < 4:

16
patacrep/utils.py

@ -59,3 +59,19 @@ class DictOfDict(UserDict):
DictOfDict._update(left[key], right[key]) DictOfDict._update(left[key], right[key])
else: else:
left[key] = right[key] 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]),
))

2
test/test_compilation/test_compilation.py

@ -108,7 +108,7 @@ class FileTest(unittest.TestCase, metaclass=dynamic.DynamicTest):
@staticmethod @staticmethod
def compile_songbook(songbook, steps=None): def compile_songbook(songbook, steps=None):
"""Compile songbook, and return the command return code.""" """Compile songbook, and return the command return code."""
command = ['python', '-m', 'patacrep.songbook', songbook, '-v'] command = ['python', '-m', 'patacrep.songbook', '--cache=no', songbook, '-v']
if steps: if steps:
command.extend(['--steps', steps]) command.extend(['--steps', steps])

Loading…
Cancel
Save