add tests for pubkey generation
This commit is contained in:
parent
d2ecdd5669
commit
d073e60711
@ -61,6 +61,18 @@ class CitekeyFormatter(Formatter):
|
||||
def __init__(self):
|
||||
super(CitekeyFormatter, self).__init__()
|
||||
|
||||
def format_field(self, val, fmt):
|
||||
if len(fmt) > 0 and fmt[0] == 'u':
|
||||
s = str(val).upper()
|
||||
fmt = fmt[1:]
|
||||
elif len(fmt) > 0 and fmt[0] == 'l':
|
||||
s = str(val).lower()
|
||||
fmt = fmt[1:]
|
||||
else:
|
||||
s = val
|
||||
return str2citekey(s.__format__(fmt))
|
||||
|
||||
|
||||
def get_value(self, key, args, kwds):
|
||||
if len(args) == 0:
|
||||
raise ValueError('Must pass bibtex entry to the format method')
|
||||
@ -73,41 +85,24 @@ class CitekeyFormatter(Formatter):
|
||||
key = 'author'
|
||||
|
||||
if key == 'first_word' and 'title' in entry:
|
||||
return CitekeyFormatter._U(entry['title'].split(' ')[0])
|
||||
return entry['title'].split(' ')[0]
|
||||
if key == 'author_last_name' and 'author' in entry:
|
||||
return CitekeyFormatter._U(author_last(entry['author'][0]))
|
||||
return author_last(entry['author'][0])
|
||||
else:
|
||||
if key in entry:
|
||||
return CitekeyFormatter._U(entry[key])
|
||||
return entry[key]
|
||||
else:
|
||||
raise ValueError(
|
||||
"No {} defined: cannot generate a citekey.".format(okey))
|
||||
|
||||
class _U(str):
|
||||
def __init__(self, value):
|
||||
super(CitekeyFormatter._U, self).__init__(value)
|
||||
|
||||
def __format__(self, fmt):
|
||||
val = self
|
||||
if len(fmt) > 0 and fmt[0] == 'u':
|
||||
s = val.upper()
|
||||
fmt = fmt[1:]
|
||||
elif len(fmt) > 0 and fmt[0] == 'l':
|
||||
s = val.lower()
|
||||
fmt = fmt[1:]
|
||||
else:
|
||||
s = str(val)
|
||||
return s.__format__(fmt)
|
||||
|
||||
|
||||
def generate_citekey(bibdata, format_string='{author_last_name:l}{year}{first_word:l}'):
|
||||
def generate_citekey(bibdata, format_string='{author_last_name}{year}'):
|
||||
""" Generate a citekey from bib_data.
|
||||
|
||||
:raise ValueError: if no author nor editor is defined.
|
||||
"""
|
||||
citekey, entry = get_entry(bibdata)
|
||||
citekey = CitekeyFormatter().format(format_string, entry)
|
||||
return str2citekey(citekey)
|
||||
return citekey
|
||||
|
||||
|
||||
def extract_docfile(bibdata, remove=False):
|
||||
|
@ -34,15 +34,21 @@ debug = boolean(default=False)
|
||||
# If true the citekey is normalized using the 'citekey_format' on adding new publications.
|
||||
normalize_citekey = boolean(default=False)
|
||||
|
||||
# String specifying how to format the citekey. The following
|
||||
# String specifying how to format the citekey. All strings of
|
||||
# the form '{{substitution:modifier}}' and '{{substitution}}' will
|
||||
# be substituted with their appropriate values. The following
|
||||
# substitutions are used:
|
||||
# %a: last name of the first author in lowercase
|
||||
# %A: last name of the first author in PascalCase
|
||||
# %Y: four letter year of release (e.g. 2019)
|
||||
# %y: two last letters of release year (e.g. 19)
|
||||
# %w: first word in the title in lowercase
|
||||
# %W: first work in the title
|
||||
citekey_format = string(default='%a%Y')
|
||||
# author_last_name: last name of the first author
|
||||
# year: year of publication
|
||||
# first_word: first word of the title
|
||||
# modifiers:
|
||||
# l: converts the text to lowercase
|
||||
# u: converts the text to uppercase
|
||||
# examples:
|
||||
# {{author_last_name:l}}{{year}} generates 'yang2020'
|
||||
# {{author_last_name}}{{year}}{{first_word}} generates 'Yang2020Towards'
|
||||
# {{author_last_name:u}}{{year}} generates 'YANG2020'
|
||||
citekey_format = string(default='{{author_last_name:l}}{{year}}')
|
||||
|
||||
[formating]
|
||||
|
||||
|
@ -32,6 +32,46 @@ class TestGenerateCitekey(unittest.TestCase):
|
||||
key = bibstruct.generate_citekey(bibentry)
|
||||
self.assertEqual(key, 'Salinger1961')
|
||||
|
||||
def test_no_modifier(self):
|
||||
template = '{author_last_name}{year}'
|
||||
bibentry = copy.deepcopy(fixtures.doe_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'Doe2013')
|
||||
|
||||
bibentry = copy.deepcopy(fixtures.franny_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'Salinger1961')
|
||||
|
||||
def test_all_keys(self):
|
||||
template = '{author_last_name}-{year}-{first_word}'
|
||||
bibentry = copy.deepcopy(fixtures.doe_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'Doe-2013-Nice')
|
||||
|
||||
bibentry = copy.deepcopy(fixtures.franny_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'Salinger-1961-Franny')
|
||||
|
||||
def test_l_modifier(self):
|
||||
template = '{author_last_name:l}{year:l}'
|
||||
bibentry = copy.deepcopy(fixtures.doe_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'doe2013')
|
||||
|
||||
bibentry = copy.deepcopy(fixtures.franny_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'salinger1961')
|
||||
|
||||
def test_u_modifier(self):
|
||||
template = '{author_last_name:u}{year:u}'
|
||||
bibentry = copy.deepcopy(fixtures.doe_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'DOE2013')
|
||||
|
||||
bibentry = copy.deepcopy(fixtures.franny_bibentry)
|
||||
key = bibstruct.generate_citekey(bibentry, template)
|
||||
self.assertEqual(key, 'SALINGER1961', template)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Loading…
x
Reference in New Issue
Block a user