Adds exception catching in main command.
This commit is contained in:
parent
7f6dde2f0c
commit
b12c6297f0
@ -21,7 +21,6 @@ def command(conf, args):
|
|||||||
ui = get_ui()
|
ui = get_ui()
|
||||||
rp = repo.Repository(conf)
|
rp = repo.Repository(conf)
|
||||||
|
|
||||||
try:
|
|
||||||
papers = []
|
papers = []
|
||||||
if len(args.citekeys) < 1:
|
if len(args.citekeys) < 1:
|
||||||
papers = rp.all_papers()
|
papers = rp.all_papers()
|
||||||
@ -36,6 +35,3 @@ def command(conf, args):
|
|||||||
exporter = endecoder.EnDecoder()
|
exporter = endecoder.EnDecoder()
|
||||||
bibdata_raw = exporter.encode_bibdata(bib)
|
bibdata_raw = exporter.encode_bibdata(bib)
|
||||||
ui.message(bibdata_raw)
|
ui.message(bibdata_raw)
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
ui.error(e.message)
|
|
||||||
|
@ -32,6 +32,7 @@ CORE_CMDS = collections.OrderedDict([
|
|||||||
|
|
||||||
def execute(raw_args=sys.argv):
|
def execute(raw_args=sys.argv):
|
||||||
|
|
||||||
|
try:
|
||||||
conf_parser = argparse.ArgumentParser(prog="pubs", add_help=False)
|
conf_parser = argparse.ArgumentParser(prog="pubs", add_help=False)
|
||||||
conf_parser.add_argument("-c", "--config", help="path to config file",
|
conf_parser.add_argument("-c", "--config", help="path to config file",
|
||||||
type=str, metavar="FILE")
|
type=str, metavar="FILE")
|
||||||
@ -49,15 +50,11 @@ def execute(raw_args=sys.argv):
|
|||||||
|
|
||||||
# Loading config
|
# Loading config
|
||||||
if len(remaining_args) > 0 and remaining_args[0] != 'init':
|
if len(remaining_args) > 0 and remaining_args[0] != 'init':
|
||||||
try:
|
|
||||||
conf = config.load_conf(path=conf_path, check=False)
|
conf = config.load_conf(path=conf_path, check=False)
|
||||||
if update.update_check(conf, path=conf.filename):
|
if update.update_check(conf, path=conf.filename):
|
||||||
# an update happened, reload conf.
|
# an update happened, reload conf.
|
||||||
conf = config.load_conf(path=conf_path, check=False)
|
conf = config.load_conf(path=conf_path, check=False)
|
||||||
config.check_conf(conf)
|
config.check_conf(conf)
|
||||||
except IOError as e:
|
|
||||||
print('error: {}'.format(str(e)))
|
|
||||||
sys.exit()
|
|
||||||
else:
|
else:
|
||||||
conf = config.load_default_conf()
|
conf = config.load_default_conf()
|
||||||
conf.filename = conf_path
|
conf.filename = conf_path
|
||||||
@ -85,3 +82,6 @@ def execute(raw_args=sys.argv):
|
|||||||
args = parser.parse_args(remaining_args)
|
args = parser.parse_args(remaining_args)
|
||||||
args.prog = "pubs" # FIXME?
|
args.prog = "pubs" # FIXME?
|
||||||
args.func(conf, args)
|
args.func(conf, args)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
uis.get_ui().handle_exception(e)
|
||||||
|
27
pubs/repo.py
27
pubs/repo.py
@ -12,12 +12,26 @@ def _base27(n):
|
|||||||
return _base27((n - 1) // 26) + chr(ord('a') + ((n - 1) % 26)) if n else ''
|
return _base27((n - 1) // 26) + chr(ord('a') + ((n - 1) % 26)) if n else ''
|
||||||
|
|
||||||
|
|
||||||
|
class CiteKeyError(Exception):
|
||||||
|
|
||||||
|
default_message = "Wrong citekey: {}."
|
||||||
|
|
||||||
|
def __init__(self, citekey, message=None):
|
||||||
|
self.message = message
|
||||||
|
self.citekey = citekey
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return self.message or self.default_msg.format(self.citekey)
|
||||||
|
|
||||||
|
|
||||||
class CiteKeyCollision(Exception):
|
class CiteKeyCollision(Exception):
|
||||||
pass
|
|
||||||
|
default_message = "Citekey already in use: {}."
|
||||||
|
|
||||||
|
|
||||||
class InvalidReference(Exception):
|
class CiteKeyNotFound(Exception):
|
||||||
pass
|
|
||||||
|
default_message = "Could not find citekey: {}."
|
||||||
|
|
||||||
|
|
||||||
class Repository(object):
|
class Repository(object):
|
||||||
@ -63,7 +77,7 @@ class Repository(object):
|
|||||||
citekey=citekey,
|
citekey=citekey,
|
||||||
metadata=self.databroker.pull_metadata(citekey))
|
metadata=self.databroker.pull_metadata(citekey))
|
||||||
else:
|
else:
|
||||||
raise InvalidReference('{} citekey not found'.format(citekey))
|
raise CiteKeyNotFound(citekey)
|
||||||
|
|
||||||
def push_paper(self, paper, overwrite=False, event=True):
|
def push_paper(self, paper, overwrite=False, event=True):
|
||||||
""" Push a paper to disk
|
""" Push a paper to disk
|
||||||
@ -73,7 +87,7 @@ class Repository(object):
|
|||||||
"""
|
"""
|
||||||
bibstruct.check_citekey(paper.citekey)
|
bibstruct.check_citekey(paper.citekey)
|
||||||
if (not overwrite) and (paper.citekey in self):
|
if (not overwrite) and (paper.citekey in self):
|
||||||
raise CiteKeyCollision('citekey {} already in use'.format(paper.citekey))
|
raise CiteKeyCollision(paper.citekey)
|
||||||
if not paper.added:
|
if not paper.added:
|
||||||
paper.added = datetime.now()
|
paper.added = datetime.now()
|
||||||
self.databroker.push_bibentry(paper.citekey, paper.bibentry)
|
self.databroker.push_bibentry(paper.citekey, paper.bibentry)
|
||||||
@ -130,7 +144,8 @@ class Repository(object):
|
|||||||
else:
|
else:
|
||||||
# check if new_citekey does not exists
|
# check if new_citekey does not exists
|
||||||
if new_citekey in self:
|
if new_citekey in self:
|
||||||
raise CiteKeyCollision("can't rename paper to {}, conflicting files exists".format(new_citekey))
|
msg = "Can't rename paper to {}, citekey already exists.".format(new_citekey)
|
||||||
|
raise CiteKeyCollision(new_citekey, message=msg)
|
||||||
|
|
||||||
# move doc file if necessary
|
# move doc file if necessary
|
||||||
if self.databroker.in_docsdir(paper.docpath):
|
if self.databroker.in_docsdir(paper.docpath):
|
||||||
|
@ -62,6 +62,7 @@ class PrintUI(object):
|
|||||||
errors='replace')
|
errors='replace')
|
||||||
self._stderr = codecs.getwriter(self.encoding)(_get_raw_stderr(),
|
self._stderr = codecs.getwriter(self.encoding)(_get_raw_stderr(),
|
||||||
errors='replace')
|
errors='replace')
|
||||||
|
self.debug = conf.get('debug', False)
|
||||||
|
|
||||||
def message(self, *messages, **kwargs):
|
def message(self, *messages, **kwargs):
|
||||||
kwargs['file'] = self._stdout
|
kwargs['file'] = self._stdout
|
||||||
@ -82,6 +83,13 @@ class PrintUI(object):
|
|||||||
def exit(self, error_code=1):
|
def exit(self, error_code=1):
|
||||||
sys.exit(error_code)
|
sys.exit(error_code)
|
||||||
|
|
||||||
|
def handle_exception(self, exc):
|
||||||
|
if self.debug:
|
||||||
|
raise exc
|
||||||
|
else:
|
||||||
|
self.error(exc)
|
||||||
|
self.exit()
|
||||||
|
|
||||||
|
|
||||||
class InputUI(PrintUI):
|
class InputUI(PrintUI):
|
||||||
"""UI class. Stores configuration parameters and system information.
|
"""UI class. Stores configuration parameters and system information.
|
||||||
|
@ -5,7 +5,7 @@ import dotdot
|
|||||||
import fake_env
|
import fake_env
|
||||||
import fixtures
|
import fixtures
|
||||||
|
|
||||||
from pubs.repo import Repository, _base27, CiteKeyCollision, InvalidReference
|
from pubs.repo import Repository, _base27, CiteKeyCollision, CiteKeyNotFound
|
||||||
from pubs.paper import Paper
|
from pubs.paper import Paper
|
||||||
from pubs import config
|
from pubs import config
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ class TestUpdatePaper(TestRepo):
|
|||||||
def test_update_new_key_removes_old(self):
|
def test_update_new_key_removes_old(self):
|
||||||
paper = self.repo.pull_paper('turing1950computing')
|
paper = self.repo.pull_paper('turing1950computing')
|
||||||
self.repo.rename_paper(paper, 'Turing1950')
|
self.repo.rename_paper(paper, 'Turing1950')
|
||||||
with self.assertRaises(InvalidReference):
|
with self.assertRaises(CiteKeyNotFound):
|
||||||
self.repo.pull_paper('turing1950computing')
|
self.repo.pull_paper('turing1950computing')
|
||||||
self.assertNotIn('turing1950computing', self.repo)
|
self.assertNotIn('turing1950computing', self.repo)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user