Merge pull request #159 from pubs/fix/doc_add

Fixes #144: behavior of add_copy mode during add.

- correctly handles `add_copy` mode and configuration,
- adds option top force 'copy' mode in `add` command,
- reverts default to `copy` instead of move for the `add` command,
- fixes assumption in tests about the default,
- do not try to delete the source when it is an URL,
- set default to `copy` during `import` commands and provides option for `move` or `link` alternatives.
main
Olivier Mangin 7 years ago committed by GitHub
commit 4f57aecfa4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -8,6 +8,8 @@
### Implemented enhancements ### Implemented enhancements
- Adds `move`, and `link` options for handling of documents during `import` (copy being the default). Makes `copy` the default for document handling during `add`. [(#159)](https://github.com/pubs/pubs/pull/159)
- Support for downloading arXiv reference from their ID ([#146](https://github.com/pubs/pubs/issues/146) by [joe-antognini](https://github.com/joe-antognini)) - Support for downloading arXiv reference from their ID ([#146](https://github.com/pubs/pubs/issues/146) by [joe-antognini](https://github.com/joe-antognini))
- Better feedback when an error is encountered while adding a reference from a DOI, ISBN or arXiv ID [#155](https://github.com/pubs/pubs/issues/155) - Better feedback when an error is encountered while adding a reference from a DOI, ISBN or arXiv ID [#155](https://github.com/pubs/pubs/issues/155)
@ -34,6 +36,8 @@
### Fixed bugs ### Fixed bugs
- [[#144]](https://github.com/pubs/pubs/issues/144) More robust handling of the `doc_add` options [(#159)](https://github.com/pubs/pubs/pull/159)
- [[#149]](https://github.com/pubs/pubs/issues/149) More robust handling of parsing and citekey errors [(#87)](https://github.com/pubs/pubs/pull/87) - [[#149]](https://github.com/pubs/pubs/issues/149) More robust handling of parsing and citekey errors [(#87)](https://github.com/pubs/pubs/pull/87)
- [[#148]](https://github.com/pubs/pubs/issues/148) Fix compatibility with Pyfakefs 3.7 [(#151)](https://github.com/pubs/pubs/pull/151) - [[#148]](https://github.com/pubs/pubs/issues/148) Fix compatibility with Pyfakefs 3.7 [(#151)](https://github.com/pubs/pubs/pull/151)

@ -0,0 +1,18 @@
"""Contains code that is reused over commands, like argument definition
or help messages.
"""
def add_doc_copy_arguments(parser, copy=True):
doc_add_group = parser.add_mutually_exclusive_group()
doc_add_group.add_argument(
'-L', '--link', action='store_const', dest='doc_copy', const='link',
default=None,
help="don't copy document files, just create a link.")
if copy:
doc_add_group.add_argument(
'-C', '--copy', action='store_const', dest='doc_copy', const='copy',
help="copy document (keep source).")
doc_add_group.add_argument(
'-M', '--move', action='store_const', dest='doc_copy', const='move',
help="move document (copy and remove source).")

@ -12,6 +12,7 @@ from .. import apis
from .. import pretty from .. import pretty
from .. import utils from .. import utils
from .. import endecoder from .. import endecoder
from ..command_utils import add_doc_copy_arguments
from ..completion import CommaSeparatedTagsCompletion from ..completion import CommaSeparatedTagsCompletion
@ -36,10 +37,7 @@ def parser(subparsers, conf):
).completer = CommaSeparatedTagsCompletion(conf) ).completer = CommaSeparatedTagsCompletion(conf)
parser.add_argument('-k', '--citekey', help='citekey associated with the paper;\nif not provided, one will be generated automatically.', parser.add_argument('-k', '--citekey', help='citekey associated with the paper;\nif not provided, one will be generated automatically.',
default=None, type=p3.u_maybe) default=None, type=p3.u_maybe)
parser.add_argument('-L', '--link', action='store_false', dest='copy', default=True, add_doc_copy_arguments(parser)
help="don't copy document files, just create a link.")
parser.add_argument('-M', '--move', action='store_true', dest='move', default=False,
help="move document instead of of copying (ignored if --link).")
return parser return parser
@ -140,25 +138,20 @@ def command(conf, args):
'{}, using {} instead.').format(bib_docfile, docfile)) '{}, using {} instead.').format(bib_docfile, docfile))
# create the paper # create the paper
copy = args.copy doc_add = args.doc_copy
if copy is None: if doc_add is None:
copy = conf['main']['doc_add'] in ('copy', 'move') doc_add = conf['main']['doc_add']
move = args.move
if move is None:
move = conf['main']['doc_add'] == 'move'
rp.push_paper(p) rp.push_paper(p)
ui.message('added to pubs:\n{}'.format(pretty.paper_oneliner(p))) ui.message('added to pubs:\n{}'.format(pretty.paper_oneliner(p)))
if docfile is not None: if docfile is not None:
rp.push_doc(p.citekey, docfile, copy=copy or args.move) rp.push_doc(p.citekey, docfile, copy=(doc_add in ('copy', 'move')))
if copy: if doc_add == 'move' and content.content_type(docfile) != 'url':
if move: content.remove_file(docfile)
content.remove_file(docfile)
if doc_add == 'move':
if copy: ui.message('{} was moved to the pubs repository.'.format(docfile))
if move: elif doc_add == 'copy':
ui.message('{} was moved to the pubs repository.'.format(docfile))
else:
ui.message('{} was copied to the pubs repository.'.format(docfile)) ui.message('{} was copied to the pubs repository.'.format(docfile))
rp.close() rp.close()

@ -7,10 +7,11 @@ from .. import repo
from .. import endecoder from .. import endecoder
from .. import bibstruct from .. import bibstruct
from .. import color from .. import color
from .. import content
from ..paper import Paper from ..paper import Paper
from ..uis import get_ui from ..uis import get_ui
from ..content import system_path, read_text_file from ..content import system_path, read_text_file
from ..command_utils import add_doc_copy_arguments
_ABORT_USE_IGNORE_MSG = "Aborting import. Use --ignore-malformed to ignore." _ABORT_USE_IGNORE_MSG = "Aborting import. Use --ignore-malformed to ignore."
@ -18,18 +19,22 @@ _IGNORING_MSG = " Ignoring it."
def parser(subparsers, conf): def parser(subparsers, conf):
parser = subparsers.add_parser('import', parser = subparsers.add_parser(
help='import paper(s) to the repository') 'import',
parser.add_argument('bibpath', help='import paper(s) to the repository')
help='path to bibtex, bibtexml or bibyaml file (or directory)') parser.add_argument(
parser.add_argument('-L', '--link', action='store_false', dest='copy', default=True, 'bibpath',
help="don't copy document files, just create a link.") help='path to bibtex, bibtexml or bibyaml file (or directory)')
parser.add_argument('keys', nargs='*', parser.add_argument(
help="one or several keys to import from the file") 'keys', nargs='*',
parser.add_argument('-O', '--overwrite', action='store_true', default=False, help="one or several keys to import from the file")
help="Overwrite keys already in the database") parser.add_argument(
parser.add_argument('-i', '--ignore-malformed', action='store_true', default=False, '-O', '--overwrite', action='store_true', default=False,
help="Ignore malformed and unreadable files and entries") help="Overwrite keys already in the database")
parser.add_argument(
'-i', '--ignore-malformed', action='store_true', default=False,
help="Ignore malformed and unreadable files and entries")
add_doc_copy_arguments(parser, copy=False)
return parser return parser
@ -90,9 +95,7 @@ def command(conf, args):
ui = get_ui() ui = get_ui()
bibpath = args.bibpath bibpath = args.bibpath
copy = args.copy doc_import = args.doc_copy or 'copy'
if copy is None:
copy = conf['main']['doc_add'] in ('copy', 'move')
rp = repo.Repository(conf) rp = repo.Repository(conf)
# Extract papers from bib # Extract papers from bib
@ -106,7 +109,9 @@ def command(conf, args):
if docfile is None: if docfile is None:
ui.warning("No file for {}.".format(p.citekey)) ui.warning("No file for {}.".format(p.citekey))
else: else:
rp.push_doc(p.citekey, docfile, copy=copy) rp.push_doc(p.citekey, docfile,
# FIXME should move the file if configured to do so. copy=(doc_import in ('copy', 'move')))
if doc_import == 'move' and content.content_type(docfile) != 'url':
content.remove_file(docfile)
rp.close() rp.close()

@ -11,7 +11,7 @@ docsdir = string(default="docsdir://")
# Specify if a document should be copied or moved in the docdir, or only # Specify if a document should be copied or moved in the docdir, or only
# linked when adding a publication. # linked when adding a publication.
doc_add = option('copy', 'move', 'link', default='move') doc_add = option('copy', 'move', 'link', default='copy')
# the command to use when opening document files # the command to use when opening document files
open_cmd = string(default=None) open_cmd = string(default=None)

@ -292,9 +292,66 @@ class TestAdd(URLContentTestCase):
'pubs add data/pagerank.bib --link -d data/pagerank.pdf', 'pubs add data/pagerank.bib --link -d data/pagerank.pdf',
] ]
self.execute_cmds(cmds) self.execute_cmds(cmds)
self.assertEqual(os.listdir( self.assertEqual(
os.path.join(self.default_pubs_dir, 'doc')), os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
[]) [])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_nocopy_from_config_does_not_copy(self):
self.execute_cmds(['pubs init'])
config = conf.load_conf()
config['main']['doc_add'] = 'link'
conf.save_conf(config)
cmds = ['pubs add data/pagerank.bib -d data/pagerank.pdf']
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
[])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_copy(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib --copy -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_copy_from_config(self):
self.execute_cmds(['pubs init'])
config = conf.load_conf()
config['main']['doc_add'] = 'copy'
conf.save_conf(config)
cmds = ['pubs add data/pagerank.bib -d data/pagerank.pdf']
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_move(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib --move -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertFalse(os.path.exists('data/pagerank.pdf'))
def test_add_doc_move_from_config(self):
self.execute_cmds(['pubs init'])
config = conf.load_conf()
config['main']['doc_add'] = 'move'
conf.save_conf(config)
cmds = ['pubs add data/pagerank.bib -d data/pagerank.pdf']
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertFalse(os.path.exists('data/pagerank.pdf'))
def test_add_move_removes_doc(self): def test_add_move_removes_doc(self):
cmds = ['pubs init', cmds = ['pubs init',

Loading…
Cancel
Save