update attach and export cmds

main
Fabien Benureau 11 years ago
parent 24df1b36ae
commit bc82d0de8c

@ -5,8 +5,8 @@ import open_cmd
import websearch_cmd import websearch_cmd
import remove_cmd import remove_cmd
import tag_cmd import tag_cmd
import attach_cmd
import export_cmd
# import import_cmd # import import_cmd
# import export_cmd
# import edit_cmd # import edit_cmd
# import attach_cmd
# import update_cmd # import update_cmd

@ -1,9 +1,6 @@
from .. import repo from .. import repo
from ..configs import config from ..configs import config
from ..uis import get_ui from ..uis import get_ui
from .helpers import (add_references_argument, parse_reference,
add_docfile_to_paper)
def parser(subparsers): def parser(subparsers):
parser = subparsers.add_parser('attach', parser = subparsers.add_parser('attach',
@ -12,8 +9,10 @@ def parser(subparsers):
help="copy document files into library directory (default)") help="copy document files into library directory (default)")
parser.add_argument('-C', '--nocopy', action='store_false', dest='copy', parser.add_argument('-C', '--nocopy', action='store_false', dest='copy',
help="don't copy document files (opposite of -c)") help="don't copy document files (opposite of -c)")
add_references_argument(parser, single=True) parser.add_argument('citekey',
parser.add_argument('document', help='pdf or ps file') help='citekey of the paper')
parser.add_argument('document',
help='document file')
return parser return parser
@ -24,19 +23,24 @@ def command(args):
""" """
ui = get_ui() 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: if copy is None:
copy = config().import_copy copy = config().import_copy
rp = repo.Repository(config())
key = parse_reference(rp, reference)
paper = rp.get_paper(key)
try: 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: except ValueError, v:
ui.error(v.message) ui.error(v.message)
ui.exit(1) ui.exit(1)
# TODO handle case where citekey exists except IOError, v:
ui.error(v.message)
ui.exit(1)

@ -1,19 +1,20 @@
from __future__ import print_function
import sys import sys
from pybtex.database import BibliographyData from pybtex.database import BibliographyData
from .. import repo from .. import repo
from .. import files
from .helpers import parse_references, add_references_argument
from ..configs import config from ..configs import config
from ..uis import get_ui from ..uis import get_ui
from .. import endecoder
def parser(subparsers): def parser(subparsers):
parser = subparsers.add_parser('export', parser = subparsers.add_parser('export',
help='export bibliography') help='export bibliography')
parser.add_argument('-f', '--bib-format', default='bibtex', parser.add_argument('-f', '--bib-format', default='bibtex',
help="export format") help='export format')
add_references_argument(parser) parser.add_argument('citekeys', nargs='*',
help='one or several citekeys')
return parser return parser
@ -24,17 +25,23 @@ def command(args):
ui = get_ui() ui = get_ui()
bib_format = args.bib_format bib_format = args.bib_format
references = args.references
rp = repo.Repository(config()) 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: if len(papers) == 0:
papers = rp.all_papers() papers = rp.all_papers()
bib = BibliographyData() bib = BibliographyData()
for p in papers: for p in papers:
bib.add_entry(p.citekey, p.bibentry) bib.add_entry(p.citekey, p.bibentry)
try: 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: except KeyError:
ui.error("Invalid output format: %s." % bib_format) ui.error("Invalid output format: %s." % bib_format)

@ -10,6 +10,8 @@ try:
import pybtex.database.input.bibtex import pybtex.database.input.bibtex
import pybtex.database.input.bibtexml import pybtex.database.input.bibtexml
import pybtex.database.input.bibyaml import pybtex.database.input.bibyaml
import pybtex.database.output.bibtex
import pybtex.database.output.bibtexml
import pybtex.database.output.bibyaml import pybtex.database.output.bibyaml
except ImportError: except ImportError:
@ -30,9 +32,13 @@ class EnDecoder(object):
* encode_bibdata will try to recognize exceptions * encode_bibdata will try to recognize exceptions
""" """
decode_fmt = (pybtex.database.input.bibyaml, decode_fmt = {'bibyaml' : pybtex.database.input.bibyaml,
pybtex.database.input.bibtex, 'bibtex' : pybtex.database.input.bibtex,
pybtex.database.input.bibtexml) '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): def encode_metadata(self, metadata):
return yaml.safe_dump(metadata, allow_unicode=True, encoding='UTF-8', indent = 4) 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): def decode_metadata(self, metadata_raw):
return yaml.safe_load(metadata_raw) return yaml.safe_load(metadata_raw)
def encode_bibdata(self, bibdata): def encode_bibdata(self, bibdata, fmt='bibyaml'):
"""Encode bibdata """ """Encode bibdata """
s = StringIO.StringIO() s = StringIO.StringIO()
pybtex.database.output.bibyaml.Writer().write_stream(bibdata, s) EnDecoder.encode_fmt[fmt].Writer().write_stream(bibdata, s)
return s.getvalue() return s.getvalue()
def decode_bibdata(self, bibdata_raw): def decode_bibdata(self, bibdata_raw):
"""""" """"""
bibdata_rawutf8 = unicode(bibdata_raw) bibdata_rawutf8 = unicode(bibdata_raw)
for fmt in EnDecoder.decode_fmt: for fmt in EnDecoder.decode_fmt.values():
try: try:
bibdata_stream = StringIO.StringIO(bibdata_rawutf8) bibdata_stream = StringIO.StringIO(bibdata_rawutf8)
return self._decode_bibdata(bibdata_stream, fmt.Parser()) return self._decode_bibdata(bibdata_stream, fmt.Parser())

@ -20,10 +20,10 @@ CORE_CMDS = collections.OrderedDict([
('websearch', commands.websearch_cmd), ('websearch', commands.websearch_cmd),
('remove', commands.remove_cmd), ('remove', commands.remove_cmd),
('tag', commands.tag_cmd), ('tag', commands.tag_cmd),
('attach', commands.attach_cmd),
('export', commands.export_cmd),
# ('import', commands.import_cmd), # ('import', commands.import_cmd),
# ('export', commands.export_cmd),
# ('edit', commands.edit_cmd), # ('edit', commands.edit_cmd),
# ('attach', commands.attach_cmd),
# ('update', commands.update_cmd), # ('update', commands.update_cmd),
]) ])

@ -55,7 +55,7 @@ class Repository(object):
citekey=citekey, citekey=citekey,
metadata=self.databroker.pull_metadata(citekey)) metadata=self.databroker.pull_metadata(citekey))
else: else:
raise InvalidReference raise InvalidReference('{} citekey not found'.format(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

Loading…
Cancel
Save