diff --git a/papers/repo.py b/papers/repo.py index 0113468..8f67424 100644 --- a/papers/repo.py +++ b/papers/repo.py @@ -136,9 +136,23 @@ class Repository(object): and new_citekey in self): raise CiteKeyCollision('citekey {} already in use'.format( new_citekey)) + self.remove_paper(paper.citekey, remove_doc = False) + old_citekey = paper.citekey paper.citekey = new_citekey self.add_paper(paper, overwrite = overwrite) + self._move_doc(old_citekey, paper) + + def _move_doc(self, old_citekey, paper): + """Fragile. Make more robust""" + try: + old_docfile = self.find_document(old_citekey) + ext = os.path.splitext(old_docfile)[1] + new_docfile = os.path.join(self.doc_dir, paper.citekey + ext) + shutil.move(old_docfile, new_docfile) + paper.set_external_document(new_docfile) + except NoDocumentFile: + pass def _bibfile(self, citekey): return os.path.join(self.bib_dir, citekey + '.bibyaml') @@ -176,14 +190,21 @@ class Repository(object): if not citekey + _base27(n) in self.citekeys: return citekey + _base27(n) + def find_document(self, citekey): + found = glob.glob('{}/{}.*'.format(self.doc_dir, citekey)) + if found: + return found[0] + else: + raise NoDocumentFile + def import_document(self, citekey, doc_file): if citekey not in self.citekeys: - raise ValueError("Unknown citekey {}.".format(citekey)) + raise(ValueError, "Unknown citekey: %s." % citekey) else: 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)) + ext = os.path.splitext(doc_file)[1] + new_doc_file = os.path.join(self.doc_dir, citekey + ext) shutil.copy(doc_file, new_doc_file) def get_tags(self): diff --git a/tests/test_repo.py b/tests/test_repo.py index 0b8098a..58ef258 100644 --- a/tests/test_repo.py +++ b/tests/test_repo.py @@ -101,7 +101,7 @@ class TestUpdatePaper(TestRepo): 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'))) + 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, 'Doe2003.pdf'))) diff --git a/tests/test_usecase.py b/tests/test_usecase.py index 79590a1..16d008d 100644 --- a/tests/test_usecase.py +++ b/tests/test_usecase.py @@ -1,10 +1,11 @@ -import sys, os +import sys, os, shutil, glob import unittest import pkgutil import testenv import fake_filesystem import fake_filesystem_shutil +import fake_filesystem_glob from papers import papers_cmd from papers import color @@ -12,23 +13,27 @@ from papers.p3 import io real_os = os real_open = open +real_shutil = shutil +real_glob = glob -fake_os, fake_open, fake_shutil = None, None, None +fake_os, fake_open, fake_shutil, fake_glob = None, None, None, None def _create_fake_fs(): - global fake_os, fake_open, fake_shutil + global fake_os, fake_open, fake_shutil, fake_glob fake_fs = fake_filesystem.FakeFilesystem() fake_os = fake_filesystem.FakeOsModule(fake_fs) fake_open = fake_filesystem.FakeFileOpen(fake_fs) fake_shutil = fake_filesystem_shutil.FakeShutilModule(fake_fs) + fake_glob = fake_filesystem_glob.FakeGlobModule(fake_fs) fake_fs.CreateDirectory(fake_os.path.expanduser('~')) __builtins__['open'] = fake_open __builtins__['file'] = fake_open - sys.modules['os'] = fake_os + sys.modules['os'] = fake_os sys.modules['shutil'] = fake_shutil + sys.modules['glob'] = fake_glob import papers for importer, modname, ispkg in pkgutil.walk_packages( @@ -102,7 +107,7 @@ class TestAdd(unittest.TestCase): papers_cmd.execute('papers init -p /not_default'.split()) papers_cmd.execute('papers add -b /data/pagerank.bib -d /data/pagerank.pdf'.split()) - self.assertEqual(set(fake_os.listdir('/not_default/doc')), {'pagerank.pdf'}) + self.assertEqual(set(fake_os.listdir('/not_default/doc')), {'Page99.pdf'}) class TestList(unittest.TestCase):