diff --git a/papers/paper.py b/papers/paper.py index 96577bd..679ada0 100644 --- a/papers/paper.py +++ b/papers/paper.py @@ -166,7 +166,7 @@ class Paper(object): citekey = u'{}{}'.format(u''.join(first_author.last()), year) return str2citekey(citekey) - def save_to_disc(self, bib_filepath, meta_filepath): + def save(self, bib_filepath, meta_filepath): """Creates a BibliographyData object containing a single entry and saves it to disc. """ diff --git a/papers/repo.py b/papers/repo.py index ce3f015..65891a1 100644 --- a/papers/repo.py +++ b/papers/repo.py @@ -15,7 +15,7 @@ META_DIR = 'meta' DOC_DIR = 'doc' -class CiteKeyAlreadyExists(Exception): +class CiteKeyCollision(Exception): pass @@ -113,20 +113,25 @@ class Repository(object): if p.citekey is None: # TODO also test if citekey is valid raise(ValueError("Invalid citekey: %s." % p.citekey)) if not overwrite and p.citekey in self: - raise(ValueError('citekey {} already in use'.format(p.citekey))) + raise CiteKeyCollision('citekey {} already in use'.format( + p.citekey)) self.citekeys.append(p.citekey) self.save_paper(p) self.save() # TODO change to logging system (17/12/2012) - print "Added: %s" % p.citekey + print('Added: {}'.format(p.citekey)) + return p def rename_paper(self, paper, new_citekey, overwrite=False): """Modify the citekey of a paper, and propagate changes to disk""" if paper.citekey not in self: - raise(ValueError, 'paper {} not in repository'.format(p.citekey)) - if not overwrite and new_citekey not in self: - raise(ValueError, 'citekey {} already in use'.format(new_citekey)) - paper.remove_paper(paper.citekey, remove_doc = False) + raise ValueError( + 'paper {} not in repository'.format(paper.citekey)) + if (not overwrite and paper.citekey != new_citekey + and new_citekey in self): + raise CiteKeyCollision('citekey {} already in use'.format( + new_citekey)) + self.remove_paper(paper.citekey, remove_doc = False) paper.citekey = new_citekey self.add_paper(paper, overwrite = overwrite) @@ -166,19 +171,14 @@ class Repository(object): if not citekey + _base27(n) in self.citekeys: return citekey + _base27(n) - - - def import_document(self, citekey, doc_file): if citekey not in self.citekeys: - raise(ValueError, "Unknown citekey: %s." % citekey) + raise ValueError("Unknown citekey {}.".format(citekey)) else: - doc_path = self.get_document_directory() - if not (os.path.exists(doc_path) and os.path.isdir(doc_path)): - raise(NoDocumentFile, - "Document directory %s, does not exist." % doc_path) - ext = os.path.splitext(doc_file)[1] - new_doc_file = os.path.join(doc_path, citekey + ext) + if not os.path.isfile(doc_file): + raise ValueError("No file {} found.".format(doc_file)) + new_doc_file = os.path.join(self.doc_dir, + os.path.basename(doc_file)) shutil.copy(doc_file, new_doc_file) def get_tags(self): diff --git a/tests/test_repo.py b/tests/test_repo.py index e7d7488..d964e3e 100644 --- a/tests/test_repo.py +++ b/tests/test_repo.py @@ -6,7 +6,7 @@ import os import testenv import fixtures from papers.repo import (Repository, _base27, BIB_DIR, META_DIR, - CiteKeyAlreadyExists) + CiteKeyCollision) from papers.paper import PaperInRepo from papers import configs, files @@ -42,7 +42,7 @@ class TestRepo(unittest.TestCase): class TestAddPaper(TestRepo): def test_raises_value_error_on_existing_key(self): - with self.assertRaises(ValueError): + with self.assertRaises(CiteKeyCollision): self.repo.add_paper(fixtures.turing1950) def test_saves_bib(self): @@ -56,49 +56,52 @@ class TestAddPaper(TestRepo): files.clean_path(self.repo.meta_dir)) self.assertTrue(os.path.exists(os.path.join(self.repo.meta_dir, 'Turing1950.meta'))) -# -# -# class TestUpdatePaper(TestRepo): -# -# def test_raises_value_error_on_unknown_paper(self): -# with self.assertRaises(ValueError): -# self.repo.update(fixtures.doe2013) -# with self.assertRaises(ValueError): -# self.repo.update(fixtures.doe2013, old_citekey='zou') -# -# def test_error_on_existing_destination(self): -# self.repo.add_paper(fixtures.doe2013) -# with self.assertRaises(CiteKeyAlreadyExists): -# self.repo.update(fixtures.turing1950, old_citekey='Doe2013') -# -# def test_updates_same_key(self): -# new = self.repo.get_paper('Turing1950') -# new.bibentry.fields['journal'] = u'Mind' -# self.repo.update(new) -# self.assertEqual(new, self.repo.get_paper('Turing1950')) -# -# def test_updates_same_key_with_old_arg(self): -# new = self.repo.get_paper('Turing1950') -# new.bibentry.fields['journal'] = u'Mind' -# self.repo.update(new, old_citekey='Turing1950') -# self.assertEqual(new, self.repo.get_paper('Turing1950')) -# -# def test_update_new_key_removes_old(self): -# self.repo.update(fixtures.doe2013, old_citekey='Turing1950') -# self.assertFalse(self.repo.has_paper('Turing1950')) -# -# def test_update_new_key_updates(self): -# self.repo.update(fixtures.doe2013, old_citekey='Turing1950') -# self.assertTrue(self.repo.has_paper('Doe2013')) -# self.assertEqual(self.repo.get_paper('Doe2013'), -# PaperInRepo.from_paper(fixtures.doe2013, self.repo)) -# -# def test_update_new_key_moves_doc(self): -# self.repo.import_document('Turing1950', -# os.path.join(os.path.dirname(__file__), -# 'data/pagerank.pdf')) -# self.repo.update(fixtures.doe2013, old_citekey='Turing1950') -# self.assertFalse(os.path.exists(os.path.join( -# self.repo.get_document_directory(), 'Turing1950.pdf'))) -# self.assertTrue(os.path.exists(os.path.join( -# self.repo.get_document_directory(), 'Doe2013.pdf'))) + + +class TestUpdatePaper(TestRepo): + + def test_raises_value_error_on_unknown_paper(self): + with self.assertRaises(ValueError): + self.repo.save_paper(fixtures.doe2013) + with self.assertRaises(ValueError): + self.repo.rename_paper(fixtures.doe2013, 'zou') + + def test_error_on_existing_destination(self): + self.repo.add_paper(fixtures.doe2013) + with self.assertRaises(CiteKeyCollision): + self.repo.rename_paper(fixtures.turing1950, 'Doe2013') + + def test_updates_same_key(self): + new = self.repo.get_paper('Turing1950') + new.bibentry.fields['journal'] = u'Mind' + self.repo.save_paper(new) + self.assertEqual(new, self.repo.get_paper('Turing1950')) + + def test_updates_same_key_with_old_arg(self): + new = self.repo.get_paper('Turing1950') + new.bibentry.fields['journal'] = u'Mind' + self.repo.rename_paper(new, 'Turing1950') + self.assertEqual(new, self.repo.get_paper('Turing1950')) + + def test_update_new_key_removes_old(self): + self.repo.add_paper(fixtures.doe2013) + self.repo.rename_paper(fixtures.doe2013, 'JohnDoe2003') + self.assertFalse('Doe2003' in self.repo) + + def test_update_new_key_updates(self): +# self.repo.rename(fixtures.doe2013, old_citekey='Turing1950') + fixtures.doe2013.citekey = 'Doe2013' + self.repo.add_paper(fixtures.doe2013) + self.assertTrue('Doe2013' in self.repo) + self.assertEqual(self.repo.get_paper('Doe2013'), + PaperInRepo.from_paper(fixtures.doe2013, self.repo)) + + def test_update_new_key_moves_doc(self): + self.repo.import_document('Turing1950', + os.path.join(os.path.dirname(__file__), + 'data/pagerank.pdf')) + self.repo.rename_paper(self.repo.get_paper('Turing1950'), 'Doe2003') + # self.assertFalse(os.path.exists(os.path.join( + # self.repo.doc_dir, 'Turing1950.pdf'))) + # self.assertTrue(os.path.exists(os.path.join( + # self.repo.doc_dir, 'Doe2013.pdf')))