diff --git a/pubs/bibstruct.py b/pubs/bibstruct.py index 6b05ce6..3c086df 100644 --- a/pubs/bibstruct.py +++ b/pubs/bibstruct.py @@ -25,9 +25,9 @@ def verify_bibdata(bibdata): raise ValueError('no entries in the bibdata.') if len(bibdata.entries) > 1: raise ValueError('ambiguous: multiple entries in the bibdata.') - + def get_entry(bibdata): - verify_bibdata(bibdata) + verify_bibdata(bibdata) return bibdata.entries.iteritems().next() def extract_citekey(bibdata): @@ -38,7 +38,7 @@ def extract_citekey(bibdata): def generate_citekey(bibdata): """ Generate a citekey from bib_data. - :param generate: if False, return the citekey defined in the file, + :param generate: if False, return the citekey defined in the file, does not generate a new one. :raise ValueError: if no author nor editor is defined. """ @@ -46,18 +46,18 @@ def generate_citekey(bibdata): author_key = 'author' if 'author' in entry.persons else 'editor' try: - first_author = self.bibentry.persons[author_key][0] + first_author = entry.persons[author_key][0] except KeyError: raise ValueError( 'No author or editor defined: cannot generate a citekey.') try: - year = self.bibentry.fields['year'] + year = entry.fields['year'] except KeyError: year = '' citekey = u'{}{}'.format(u''.join(first_author.last()), year) - + return str2citekey(citekey) - + def extract_docfile(bibdata, remove=False): """ Try extracting document file from bib data. Returns None if not found. diff --git a/tests/fixtures.py b/tests/fixtures.py index 78b15e0..b853288 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -1,24 +1,47 @@ +# -*- coding: utf-8 -*- + from pybtex.database import Person import testenv from pubs import endecoder import str_fixtures -turing1950 = Paper() -turing1950.bibentry.fields['title'] = u'Computing machinery and intelligence.' -turing1950.bibentry.fields['year'] = u'1950' -turing1950.bibentry.persons['author'] = [Person(u'Alan Turing')] -turing1950.citekey = turing1950.generate_citekey() -turing1950.tags = ['computer', 'AI'] +coder = endecoder.EnDecoder() + +franny_bib = """ +@article{ + Franny1961, + author = "Salinger, J. D.", + title = "Franny and Zooey", + year = "1961", +} + +""" + +doe_bib = """ +@article{ + Doe2013, + author = "Doe, John", + title = "Nice Title", + year = "2013", +} + +""" + + +franny_bibdata = coder.decode_bibdata(franny_bib) +doe_bibdata = coder.decode_bibdata(doe_bib) + + +# bibdata = coder.decode_bibdata(str_fixtures.bibtex_external0, fmt='bibtex') +# page99 = Paper(bibdata) -doe2013 = Paper() -doe2013.bibentry.fields['title'] = u'Nice title.' -doe2013.bibentry.fields['year'] = u'2013' -doe2013.bibentry.persons['author'] = [Person(u'John Doe')] -doe2013.citekey = doe2013.generate_citekey() -coder = endecoder.EnDecoder() -bibdata = coder.decode_bibdata(str_fixtures.bibtex_external0, fmt='bibtex') -page99 = Paper(bibdata) +# turing1950 = Paper() +# turing1950.bibentry.fields['title'] = u'Computing machinery and intelligence.' +# turing1950.bibentry.fields['year'] = u'1950' +# turing1950.bibentry.persons['author'] = [Person(u'Alan Turing')] +# turing1950.citekey = turing1950.generate_citekey() +# turing1950.tags = ['computer', 'AI'] diff --git a/tests/test_bibstruct.py b/tests/test_bibstruct.py new file mode 100644 index 0000000..ab16fbd --- /dev/null +++ b/tests/test_bibstruct.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +import os +import unittest +import copy + +from pybtex.database import Person + +import testenv +from pubs import bibstruct + +import fixtures + + +class TestGenerateCitekey(unittest.TestCase): + + def test_escapes_chars(self): + doe_bibdata = copy.deepcopy(fixtures.doe_bibdata) + citekey, entry = bibstruct.get_entry(doe_bibdata) + entry.persons['author'] = [Person(string=u'Zôu\\@/ , John')] + key = bibstruct.generate_citekey(doe_bibdata) + + def test_simple(self): + bibdata = copy.deepcopy(fixtures.doe_bibdata) + key = bibstruct.generate_citekey(bibdata) + self.assertEqual(key, 'Doe2013') + + bibdata = copy.deepcopy(fixtures.franny_bibdata) + key = bibstruct.generate_citekey(bibdata) + self.assertEqual(key, 'Salinger1961')