@@ -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+
252284def _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