diff --git a/papers/commands/__init__.py b/papers/commands/__init__.py index e415aa0..d5b7100 100644 --- a/papers/commands/__init__.py +++ b/papers/commands/__init__.py @@ -5,8 +5,8 @@ import open_cmd import websearch_cmd import remove_cmd import tag_cmd +import attach_cmd +import export_cmd # import import_cmd -# import export_cmd # import edit_cmd -# import attach_cmd # import update_cmd diff --git a/papers/commands/attach_cmd.py b/papers/commands/attach_cmd.py index 3a4b00a..a3caf52 100644 --- a/papers/commands/attach_cmd.py +++ b/papers/commands/attach_cmd.py @@ -1,9 +1,6 @@ from .. import repo from ..configs import config from ..uis import get_ui -from .helpers import (add_references_argument, parse_reference, - add_docfile_to_paper) - def parser(subparsers): parser = subparsers.add_parser('attach', @@ -12,8 +9,10 @@ def parser(subparsers): help="copy document files into library directory (default)") parser.add_argument('-C', '--nocopy', action='store_false', dest='copy', help="don't copy document files (opposite of -c)") - add_references_argument(parser, single=True) - parser.add_argument('document', help='pdf or ps file') + parser.add_argument('citekey', + help='citekey of the paper') + parser.add_argument('document', + help='document file') return parser @@ -24,19 +23,24 @@ def command(args): """ ui = get_ui() - copy = args.copy - reference = args.reference - document = args.document + rp = repo.Repository(config()) + paper = rp.pull_paper(args.citekey) + copy = args.copy if copy is None: copy = config().import_copy - rp = repo.Repository(config()) - key = parse_reference(rp, reference) - paper = rp.get_paper(key) + try: - add_docfile_to_paper(rp, paper, docfile=document, copy=copy) + document = args.document + if copy: + document = rp.databroker.copy_doc(paper.citekey, document) + else: + pass # TODO warn if file does not exists + paper.docpath = document except ValueError, v: ui.error(v.message) ui.exit(1) -# TODO handle case where citekey exists + except IOError, v: + ui.error(v.message) + ui.exit(1) diff --git a/papers/commands/export_cmd.py b/papers/commands/export_cmd.py index 37e5d46..1a729ea 100644 --- a/papers/commands/export_cmd.py +++ b/papers/commands/export_cmd.py @@ -1,19 +1,20 @@ +from __future__ import print_function import sys from pybtex.database import BibliographyData from .. import repo -from .. import files -from .helpers import parse_references, add_references_argument from ..configs import config from ..uis import get_ui +from .. import endecoder def parser(subparsers): parser = subparsers.add_parser('export', help='export bibliography') parser.add_argument('-f', '--bib-format', default='bibtex', - help="export format") - add_references_argument(parser) + help='export format') + parser.add_argument('citekeys', nargs='*', + help='one or several citekeys') return parser @@ -24,17 +25,23 @@ def command(args): ui = get_ui() bib_format = args.bib_format - references = args.references rp = repo.Repository(config()) - papers = [rp.get_paper(c) - for c in parse_references(rp, references)] + + try: + papers = [rp.pull_paper(c) for c in args.citekeys] + except repo.InvalidReference, v: + ui.error(v) + ui.exit(1) + if len(papers) == 0: papers = rp.all_papers() bib = BibliographyData() for p in papers: bib.add_entry(p.citekey, p.bibentry) try: - files.write_bibdata(bib, sys.stdout, bib_format) + exporter = endecoder.EnDecoder() + bibdata_raw = exporter.encode_bibdata(bib, fmt=bib_format) + print(bibdata_raw, end='') except KeyError: ui.error("Invalid output format: %s." % bib_format) diff --git a/papers/endecoder.py b/papers/endecoder.py index d264603..2febb27 100644 --- a/papers/endecoder.py +++ b/papers/endecoder.py @@ -10,6 +10,8 @@ try: import pybtex.database.input.bibtex import pybtex.database.input.bibtexml import pybtex.database.input.bibyaml + import pybtex.database.output.bibtex + import pybtex.database.output.bibtexml import pybtex.database.output.bibyaml except ImportError: @@ -30,9 +32,13 @@ class EnDecoder(object): * encode_bibdata will try to recognize exceptions """ - decode_fmt = (pybtex.database.input.bibyaml, - pybtex.database.input.bibtex, - pybtex.database.input.bibtexml) + decode_fmt = {'bibyaml' : pybtex.database.input.bibyaml, + 'bibtex' : pybtex.database.input.bibtex, + 'bibtexml': pybtex.database.input.bibtexml} + + encode_fmt = {'bibyaml' : pybtex.database.output.bibyaml, + 'bibtex' : pybtex.database.output.bibtex, + 'bibtexml': pybtex.database.output.bibtexml} def encode_metadata(self, metadata): return yaml.safe_dump(metadata, allow_unicode=True, encoding='UTF-8', indent = 4) @@ -40,16 +46,16 @@ class EnDecoder(object): def decode_metadata(self, metadata_raw): return yaml.safe_load(metadata_raw) - def encode_bibdata(self, bibdata): + def encode_bibdata(self, bibdata, fmt='bibyaml'): """Encode bibdata """ s = StringIO.StringIO() - pybtex.database.output.bibyaml.Writer().write_stream(bibdata, s) + EnDecoder.encode_fmt[fmt].Writer().write_stream(bibdata, s) return s.getvalue() def decode_bibdata(self, bibdata_raw): """""" bibdata_rawutf8 = unicode(bibdata_raw) - for fmt in EnDecoder.decode_fmt: + for fmt in EnDecoder.decode_fmt.values(): try: bibdata_stream = StringIO.StringIO(bibdata_rawutf8) return self._decode_bibdata(bibdata_stream, fmt.Parser()) diff --git a/papers/papers_cmd.py b/papers/papers_cmd.py index 7e5f94d..9135371 100644 --- a/papers/papers_cmd.py +++ b/papers/papers_cmd.py @@ -20,10 +20,10 @@ CORE_CMDS = collections.OrderedDict([ ('websearch', commands.websearch_cmd), ('remove', commands.remove_cmd), ('tag', commands.tag_cmd), + ('attach', commands.attach_cmd), + ('export', commands.export_cmd), # ('import', commands.import_cmd), - # ('export', commands.export_cmd), # ('edit', commands.edit_cmd), - # ('attach', commands.attach_cmd), # ('update', commands.update_cmd), ]) diff --git a/papers/repo.py b/papers/repo.py index cb60e6f..557968d 100644 --- a/papers/repo.py +++ b/papers/repo.py @@ -55,7 +55,7 @@ class Repository(object): citekey=citekey, metadata=self.databroker.pull_metadata(citekey)) else: - raise InvalidReference + raise InvalidReference('{} citekey not found'.format(citekey)) def push_paper(self, paper, overwrite=False, event=True): """ Push a paper to disk