Skip to content

Commit 1929138

Browse files
committed
Add new identifier type: biorxiv
This should still be a doi, but since biorxiv crossref entries don't include a journal, this will set the journal to bioRxiv
1 parent da8a2bc commit 1929138

1 file changed

Lines changed: 41 additions & 6 deletions

File tree

gitbib/gitbib.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,27 @@ def cache(ident, my_meta, *, session, ulog):
116116
except NoArxiv:
117117
ulog.error("An arxiv id was given for {}, but we couldn't get the data!".format(ident))
118118

119+
biorxiv = None
120+
if 'biorxiv' in my_meta:
121+
try:
122+
biorxiv = session.query(Crossref).filter(Crossref.doi == my_meta['biorxiv']).one()
123+
ulog.debug("{}'s biorxiv entry was cached via doi/crossref".format(ident))
124+
except NoResultFound:
125+
try:
126+
ulog.info("Fetching data for {} biorxiv via doi/crossref".format(ident))
127+
biorxiv = _fetch_crossref(ident, my_meta['biorxiv'])
128+
session.add(biorxiv)
129+
except NoCrossref:
130+
ulog.error("A biorxiv doi was given for {}, but the crossref request failed!".format(ident))
131+
132+
119133
ret = {'none': my_meta}
120134
if crossref is not None:
121135
ret['doi'] = crossref.data
122136
if arxiv is not None:
123137
ret['arxiv'] = arxiv.data
138+
if biorxiv is not None:
139+
ret['biorxiv'] = biorxiv.data
124140

125141
return ret
126142

@@ -218,8 +234,7 @@ def _container_title_logic(ctitles, *, ulog):
218234
'short': ctitles[-1],
219235
}
220236

221-
222-
def _internal_rep_doi(my_meta, their_meta, *, ulog):
237+
def _crossref_internal_rep_helper1(ulog):
223238
want = {k: lambda x: x
224239
for k in [
225240
'author',
@@ -240,15 +255,32 @@ def _internal_rep_doi(my_meta, their_meta, *, ulog):
240255
want['published-online'] = _doi_to_pydate
241256
want['title'] = lambda ts: ts[0]
242257
want['container-title'] = lambda x: _container_title_logic(x, ulog=ulog)
258+
return want
243259

244-
their_meta_keys = set(their_meta)
245-
want_keys = their_meta_keys & set(want.keys())
260+
261+
def _crossref_internal_rep_helper2(my_meta, their_meta, want, want_keys, other_keys):
246262
return {**my_meta,
247263
**{k: want[k](v) for k, v in their_meta.items() if k in want_keys},
248-
'other_keys': list(their_meta_keys - want_keys)
264+
'other_keys': list(other_keys),
249265
}
250266

251267

268+
def _internal_rep_doi(my_meta, their_meta, *, ulog):
269+
want = _crossref_internal_rep_helper1(ulog)
270+
their_meta_keys = set(their_meta)
271+
want_keys = their_meta_keys & set(want.keys())
272+
other_keys = their_meta_keys - want_keys
273+
return _crossref_internal_rep_helper2(my_meta, their_meta, want, want_keys, other_keys)
274+
275+
def _internal_rep_biorxiv(my_meta, their_meta, *, ulog):
276+
want = _crossref_internal_rep_helper1(ulog)
277+
want['container-title'] = lambda x: {'full':'bioRxiv', 'short': 'bioRxiv'}
278+
their_meta_keys = set(their_meta)
279+
want_keys = their_meta_keys & set(want.keys())
280+
other_keys = their_meta_keys - want_keys
281+
return _crossref_internal_rep_helper2(my_meta, their_meta, want, want_keys, other_keys)
282+
283+
252284
def _internal_rep_arxiv(my_meta, their_meta, *, ulog):
253285
new_their_meta = {k: v for k, v in their_meta.items() if k in ['title']}
254286
new_their_meta['published-online'] = (datetime.datetime.strptime(their_meta['published'], '%Y-%m-%dT%H:%M:%SZ')
@@ -305,16 +337,19 @@ def _internal_representation(ident, my_meta, *, session, ulog):
305337
funcs = {
306338
'doi': _internal_rep_doi,
307339
'arxiv': _internal_rep_arxiv,
340+
'biorxiv': _internal_rep_biorxiv,
308341
'none': _internal_rep_none,
309342
}
310343
their_meta = cache(ident, my_meta, session=session, ulog=ulog)
311344
# TODO: better merging.
312-
# Right now we prefer doi -> arxiv -> none
345+
# Right now we prefer doi -> arxiv -> biorxiv -> none
313346
# Really, we should merge data
314347
if 'doi' in their_meta:
315348
k = 'doi'
316349
elif 'arxiv' in their_meta:
317350
k = 'arxiv'
351+
elif 'biorxiv' in their_meta:
352+
k = 'biorxiv'
318353
else:
319354
k = 'none'
320355
return funcs[k](my_meta, their_meta[k], ulog=ulog)

0 commit comments

Comments
 (0)