16
16
# See the License for the specific language governing permissions and
17
17
# limitations under the License.
18
18
"""DOI API integration."""
19
- import re
20
19
import urllib
21
20
22
21
import attr
23
22
import requests
24
23
25
24
from renku .cli ._providers .api import ProviderApi
26
25
27
- doi_regexp = re .compile (
28
- r'(doi:\s*|(?:https?://)?(?:dx\.)?doi\.org/)?(10\.\d+(.\d+)*/.+)$' ,
29
- flags = re .I
30
- )
31
- """See http://en.wikipedia.org/wiki/Digital_object_identifier."""
32
-
33
26
DOI_BASE_URL = 'https://dx.doi.org'
34
27
35
28
@@ -39,22 +32,35 @@ def make_doi_url(doi):
39
32
40
33
41
34
@attr .s
42
- class DOIMetadata :
35
+ class DOIMetadataSerializer :
43
36
"""Response from doi.org for DOI metadata."""
44
37
45
38
id = attr .ib (kw_only = True )
46
- DOI = attr .ib (kw_only = True )
47
- URL = attr .ib (kw_only = True )
39
+
40
+ doi = attr .ib (kw_only = True )
41
+
42
+ url = attr .ib (kw_only = True )
43
+
48
44
type = attr .ib (kw_only = True , default = None )
45
+
49
46
categories = attr .ib (kw_only = True , default = None )
47
+
50
48
author = attr .ib (kw_only = True , default = None )
49
+
51
50
version = attr .ib (kw_only = True , default = None )
51
+
52
52
issued = attr .ib (kw_only = True , default = None )
53
+
53
54
title = attr .ib (kw_only = True , default = None )
55
+
54
56
abstract = attr .ib (kw_only = True , default = None )
57
+
55
58
language = attr .ib (kw_only = True , default = None )
59
+
56
60
publisher = attr .ib (kw_only = True , default = None )
57
61
62
+ container_title = attr .ib (kw_only = True , default = None )
63
+
58
64
59
65
@attr .s
60
66
class DOIProvider (ProviderApi ):
@@ -66,9 +72,14 @@ class DOIProvider(ProviderApi):
66
72
timeout = attr .ib (default = 3 )
67
73
68
74
@staticmethod
69
- def is_doi (uri ):
70
- """Check if uri is DOI."""
71
- return doi_regexp .match (uri )
75
+ def _serialize (response ):
76
+ """Serialize HTTP response for DOI."""
77
+ return DOIMetadataSerializer (
78
+ ** {
79
+ key .replace ('-' , '_' ).lower (): value
80
+ for key , value in response .items ()
81
+ }
82
+ )
72
83
73
84
def _query (self , doi ):
74
85
"""Retrieve metadata for given doi."""
@@ -85,4 +96,4 @@ def _query(self, doi):
85
96
def find_record (self , uri ):
86
97
"""Finds DOI record."""
87
98
response = self ._query (uri ).json ()
88
- return DOIMetadata ( ** response )
99
+ return DOIProvider . _serialize ( response )
0 commit comments