Adds basic export capabilities.

main
Olivier Mangin 12 years ago
parent 0d413697e7
commit 3e6a1403b9

@ -1,6 +1,7 @@
import add_cmd
import add_library_cmd
import import_cmd
import export_cmd
import init_cmd
import list_cmd
import open_cmd

@ -0,0 +1,29 @@
import sys
import pybtex
from pybtex.database import BibliographyData
from .. import repo
from .. import files
def parser(subparsers, config):
parser = subparsers.add_parser('export',
help='export bibliography')
parser.add_argument('-f', '--bib-format', default='bibtex',
help="export format")
return parser
def command(config, ui, bib_format):
"""
:param bib_format (in 'bibtex', 'yaml')
"""
rp = repo.Repository.from_directory()
bib = BibliographyData()
for p in rp.all_papers():
bib.add_entry(p.citekey, p.bibentry)
try:
files.write_bibdata(bib, sys.stdout, bib_format)
except KeyError:
ui.error("Invalid output format: %s." % bib_format)

@ -27,11 +27,16 @@ except ImportError:
_papersdir = None
BIB_EXTENSIONS = ['.bib', '.bibyaml', '.bibml', '.yaml']
FORMATS = {'bib': pybtex.database.input.bibtex,
'xml': pybtex.database.input.bibtexml,
'yml': pybtex.database.input.bibyaml,
'yaml': pybtex.database.input.bibyaml,
'bibyaml': pybtex.database.input.bibyaml}
FORMATS_INPUT = {'bib': pybtex.database.input.bibtex,
'xml': pybtex.database.input.bibtexml,
'yml': pybtex.database.input.bibyaml,
'yaml': pybtex.database.input.bibyaml,
'bibyaml': pybtex.database.input.bibyaml}
FORMATS_OUTPUT = {'bib': pybtex.database.output.bibtex,
'xml': pybtex.database.output.bibtexml,
'yml': pybtex.database.output.bibyaml,
'yaml': pybtex.database.output.bibyaml,
'bibyaml': pybtex.database.output.bibyaml}
def clean_path(path):
@ -112,10 +117,14 @@ def load_bibdata(filename, filepath):
return load_externalbibfile(filepath)
def write_bibdata(bib_data, file_, format_):
writer = FORMATS_OUTPUT[format_].Writer()
writer.write_stream(bib_data, file_)
def save_bibdata(bib_data, filepath):
with open(filepath, 'w') as f:
parser = pybtex.database.output.bibyaml.Writer()
parser.write_stream(bib_data, f)
write_bibdata(bib_data, f, 'yaml')
def save_meta(meta_data, filepath):
@ -131,7 +140,7 @@ def load_meta(filepath):
def load_externalbibfile(fullbibpath):
check_file(fullbibpath, fail=True)
filename, ext = os.path.splitext(os.path.split(fullbibpath)[1])
if ext[1:] in FORMATS.keys():
if ext[1:] in FORMATS_INPUT.keys():
with open(fullbibpath) as f:
return parse_bibdata(f, ext[1:])
else:
@ -147,7 +156,7 @@ def parse_bibdata(content, format_):
:content: stream
:param format_: (bib|xml|yml)
"""
parser = FORMATS[format_].Parser()
parser = FORMATS_INPUT[format_].Parser()
return parser.parse_stream(content)

@ -14,6 +14,7 @@ cmds = collections.OrderedDict([
('add', commands.add_cmd),
('add_library', commands.add_library_cmd),
('import', commands.import_cmd),
('export', commands.export_cmd),
('list', commands.list_cmd),
('edit', commands.edit_cmd),
('open', commands.open_cmd),

@ -63,3 +63,6 @@ class UI:
d = 0 if default in (True, 'y', 'yes') else 1
return (True, False)[self.input_choice(['yes', 'no'], ['y', 'n'],
default=d, question=question)]
def error(self, message):
self.print_("%s: %s" % (colored('error', 'red'), message))

@ -4,7 +4,8 @@ import shutil
import os
import fixtures
from papers.repo import Repository, _str_incr, _to_suffix, BIB_DIR, META_DIR
from papers.repo import (Repository, _str_incr, _to_suffix, BIB_DIR, META_DIR,
CiteKeyAlreadyExists)
from papers.paper import PaperInRepo
@ -65,9 +66,9 @@ class TestUpdatePaper(TestRepo):
with self.assertRaises(ValueError):
self.repo.update(fixtures.doe2013, old_citekey='zou')
def test_raises_value_error_on_existing_destination(self):
def test_error_on_existing_destination(self):
self.repo.add_paper(fixtures.doe2013)
with self.assertRaises(ValueError):
with self.assertRaises(CiteKeyAlreadyExists):
self.repo.update(fixtures.turing1950, old_citekey='Doe2013')
def test_updates_same_key(self):

Loading…
Cancel
Save