commonmeta-py 0.30__py3-none-any.whl → 0.32__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
commonmeta/__init__.py CHANGED
@@ -10,7 +10,7 @@ commonmeta-py is a Python library to convert scholarly metadata
10
10
  """
11
11
 
12
12
  __title__ = "commonmeta-py"
13
- __version__ = "0.30"
13
+ __version__ = "0.32"
14
14
  __author__ = "Martin Fenner"
15
15
  __license__ = "MIT"
16
16
 
commonmeta/constants.py CHANGED
@@ -1,4 +1,5 @@
1
1
  """Constants for commonmeta-py"""
2
+
2
3
  from typing import Optional, TypedDict, List
3
4
 
4
5
 
@@ -585,3 +586,29 @@ COMMONMETA_CONTRIBUTOR_ROLES = [
585
586
  "Maintainer",
586
587
  "Other",
587
588
  ]
589
+
590
+ INVENIORDM_IDENTIFIER_TYPES = {
591
+ "Ark": "ark",
592
+ "ArXiv": "arxiv",
593
+ "Bibcode": "ads",
594
+ "CrossrefFunderID": "crossreffunderid",
595
+ "DOI": "doi",
596
+ "EAN13": "ean13",
597
+ "EISSN": "eissn",
598
+ "GRID": "grid",
599
+ "Handle": "handle",
600
+ "IGSN": "igsn",
601
+ "ISBN": "isbn",
602
+ "ISNI": "isni",
603
+ "ISSN": "issn",
604
+ "ISTC": "istc",
605
+ "LISSN": "lissn",
606
+ "LSID": "lsid",
607
+ "PMID": "pmid",
608
+ "PURL": "purl",
609
+ "UPC": "upc",
610
+ "URL": "url",
611
+ "URN": "urn",
612
+ "W3ID": "w3id",
613
+ "Other": "other",
614
+ }
commonmeta/utils.py CHANGED
@@ -1106,3 +1106,16 @@ def timer_func(func):
1106
1106
  return value
1107
1107
 
1108
1108
  return function_timer
1109
+
1110
+
1111
+ def id_from_url(url: Optional[str]) -> Optional[str]:
1112
+ """Return a ID from a URL"""
1113
+ if url is None:
1114
+ return None
1115
+
1116
+ f = furl(url)
1117
+ # check for allowed scheme if string is a URL
1118
+ if f.host is not None and f.scheme not in ["http", "https", "ftp"]:
1119
+ return None
1120
+
1121
+ return str(f.path).strip("/")
@@ -1,13 +1,13 @@
1
1
  """InvenioRDM writer for commonmeta-py"""
2
2
 
3
3
  import orjson as json
4
- import pydash as py_
4
+ from typing import Optional
5
5
 
6
- from ..utils import to_inveniordm
7
- from ..base_utils import compact, wrap, presence, parse_attributes
8
- from ..doi_utils import doi_from_url, validate_suffix
9
- from ..constants import CM_TO_INVENIORDM_TRANSLATIONS
10
- from ..utils import pages_as_string, get_language, validate_orcid
6
+ from ..base_utils import compact, wrap, parse_attributes
7
+ from ..date_utils import get_iso8601_date
8
+ from ..doi_utils import doi_from_url
9
+ from ..constants import CM_TO_INVENIORDM_TRANSLATIONS, INVENIORDM_IDENTIFIER_TYPES
10
+ from ..utils import get_language, validate_orcid, id_from_url
11
11
 
12
12
 
13
13
  def write_inveniordm(metadata):
@@ -23,7 +23,9 @@ def write_inveniordm(metadata):
23
23
  identifiers = [
24
24
  {
25
25
  "identifier": i.get("identifier", None),
26
- "scheme": i.get("identifierType", None),
26
+ "scheme": INVENIORDM_IDENTIFIER_TYPES.get(
27
+ i.get("identifierType", None), "other"
28
+ ),
27
29
  }
28
30
  for i in wrap(metadata.identifiers)
29
31
  if i.get("id", None) != metadata.id
@@ -40,6 +42,8 @@ def write_inveniordm(metadata):
40
42
  if container.get("identifierType", None) == "ISSN"
41
43
  else None
42
44
  )
45
+
46
+ subjects = [to_inveniordm_subject(i) for i in wrap(metadata.subjects)]
43
47
  data = compact(
44
48
  {
45
49
  "pids": {
@@ -60,15 +64,16 @@ def write_inveniordm(metadata):
60
64
  "publisher": metadata.publisher.get("name", None)
61
65
  if metadata.publisher
62
66
  else None,
63
- "publication_date": metadata.date.get("published")
67
+ "publication_date": get_iso8601_date(metadata.date.get("published"))
64
68
  if metadata.date.get("published", None)
65
69
  else None,
66
70
  "dates": [
67
- {"date": metadata.date.get("updated"), "type": "updated"}
71
+ {
72
+ "date": metadata.date.get("updated"),
73
+ "type": {"id": "updated"},
74
+ }
68
75
  ],
69
- "subjects": parse_attributes(
70
- wrap(metadata.subjects), content="subject", first=False
71
- ),
76
+ "subjects": subjects,
72
77
  "description": parse_attributes(
73
78
  metadata.descriptions, content="description", first=True
74
79
  ),
@@ -112,15 +117,47 @@ def to_inveniordm_creator(creator: dict) -> dict:
112
117
  elif creator.get("name", None):
113
118
  name = creator.get("name", None)
114
119
 
115
- return {
116
- "person_or_org": compact(
120
+ return compact(
121
+ {
122
+ "person_or_org": compact(
123
+ {
124
+ "name": name,
125
+ "given_name": creator.get("givenName", None),
126
+ "family_name": creator.get("familyName", None),
127
+ "type": _type.lower() + "al" if _type else None,
128
+ "identifiers": format_identifier(creator.get("id", None)),
129
+ }
130
+ ),
131
+ "affiliations": to_inveniordm_affiliations(creator),
132
+ }
133
+ )
134
+
135
+
136
+ def to_inveniordm_subject(subject: dict) -> dict:
137
+ """Convert subjects to inveniordm subjects"""
138
+ return compact(
139
+ {
140
+ "id": subject.get("id", None),
141
+ "subject": subject.get("subject", None),
142
+ }
143
+ )
144
+
145
+
146
+ def to_inveniordm_affiliations(creator: dict) -> Optional[list]:
147
+ """Convert affiliations to inveniordm affiliations.
148
+ Returns None if creator is not a person."""
149
+
150
+ def format_affiliation(affiliation):
151
+ return compact(
117
152
  {
118
- "name": name,
119
- "given_name": creator.get("givenName", None),
120
- "family_name": creator.get("familyName", None),
121
- "type": _type.lower() + "al" if _type else None,
122
- "identifiers": format_identifier(creator.get("id", None)),
123
- "affiliation": creator.get("affiliations", None),
153
+ "id": id_from_url(affiliation.get("id", None)),
154
+ "name": affiliation.get("name", None),
124
155
  }
125
156
  )
126
- }
157
+
158
+ if creator.get("type", None) != "Person":
159
+ return None
160
+
161
+ return compact(
162
+ [format_affiliation(i) for i in wrap(creator.get("affiliations", None))]
163
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: commonmeta-py
3
- Version: 0.30
3
+ Version: 0.32
4
4
  Summary: Library for conversions to/from the Commonmeta scholarly metadata format
5
5
  Home-page: https://python.commonmeta.org
6
6
  License: MIT
@@ -1,9 +1,9 @@
1
- commonmeta/__init__.py,sha256=XHZvIRHYbOUr54ZbWsDXfsLaA652FoU7zL-j_wX9_hM,1779
1
+ commonmeta/__init__.py,sha256=39W6oIc0av4brPAFRuXXJ5wLX43-XDRtrl6X1evn1Oc,1779
2
2
  commonmeta/api_utils.py,sha256=-ZHGVZZhJqnjnsLtp4-PoeHYbDqL0cQme7W70BEjo4U,2677
3
3
  commonmeta/author_utils.py,sha256=zBIPTgP5n7Zx57xomJ2h7x0dvC0AV8gJ2gPoYeDy5Lo,8348
4
4
  commonmeta/base_utils.py,sha256=0t6fr9XGeeTBoMlKSAMI7p_EmKsA6wYRW0roEBXVcc8,3722
5
5
  commonmeta/cli.py,sha256=0IJF1SQ1sKPg7M0Gb8fpX2nBps-G0L13o01__M6c5Z0,6104
6
- commonmeta/constants.py,sha256=L9WeJL6e5G_PlSmmjYFBCILGfVeLlLrkujGBH-Yy-rA,15885
6
+ commonmeta/constants.py,sha256=fB2oMjnPYCJG3Zx6080u0R0ujmXkPRLGSgYOulWyOFw,16411
7
7
  commonmeta/crossref_utils.py,sha256=uffkjbs3732yCzD7hEA5lZ9ZZ648Mftl_n0GGcnEPHc,21918
8
8
  commonmeta/date_utils.py,sha256=amF3E0ZJlh8yY5eY3aVXQyAO1x2WuZHJXw-ajOEcdUQ,5808
9
9
  commonmeta/doi_utils.py,sha256=Dt6K9ADD2ga2WNsOzfX9f29gnubhn7xqeKL7U5pEpBs,8209
@@ -57,7 +57,7 @@ commonmeta/resources/styles/modern-language-association.csl,sha256=HI2iU4krze1aH
57
57
  commonmeta/resources/styles/vancouver.csl,sha256=lun3_i2oTilgsANk4LjFao2UDPQlGj_hgFgKAWC_DF8,12878
58
58
  commonmeta/schema_utils.py,sha256=Ep8suJgqtgDAvbjVkQxwzAY1MqwwqPwNRKDTMAxMQTg,915
59
59
  commonmeta/translators.py,sha256=RpGJtKNLjmz41VREZDY7KyyE2eXOi8j7m-da4jHmknI,1362
60
- commonmeta/utils.py,sha256=qJOEnjKbpLGPEhc2n_VGB0ifRohE_zWT1VtyUv8_OFY,39463
60
+ commonmeta/utils.py,sha256=3OX4BfOkDTkHye4-xpGoTfMrPMvN-02FdS_IBOfoRvw,39796
61
61
  commonmeta/writers/__init__.py,sha256=47-snms6xBHkoEXKYV1DBtH1npAtlVtvY29Z4Zr45qI,45
62
62
  commonmeta/writers/bibtex_writer.py,sha256=s3hIJIgWvSG7TAriZMRQEAyuitw6ebwWSI1YcYFQ-do,4971
63
63
  commonmeta/writers/citation_writer.py,sha256=RjaNh9EALxq6gfODLRWVJxGxPArGd6ZiHUlkYnCT6MA,2355
@@ -65,11 +65,11 @@ commonmeta/writers/commonmeta_writer.py,sha256=2qlttCfYpGhfVjrYkjzbIra7AywssRLT3
65
65
  commonmeta/writers/crossref_xml_writer.py,sha256=0Ds494RnXfdfjWw5CLX1kwV2zP7gqffdVqO-X74Uc6c,492
66
66
  commonmeta/writers/csl_writer.py,sha256=rlCeShkvC6ui9By0yVfNCMay_JfaZ4AooUPOPg-g-2M,2819
67
67
  commonmeta/writers/datacite_writer.py,sha256=G7Lr0aZ4sAEdbfXe3dG4Y6AyGUKA9UWr_iiaQRDnV24,6233
68
- commonmeta/writers/inveniordm_writer.py,sha256=lfuNdyHxyQa3rfioM8kGZh-p6h8Grl2B581f_feN8f8,4464
68
+ commonmeta/writers/inveniordm_writer.py,sha256=oWxGweLdIUSw0pcP9SHlS0XCUYV-WqiuR4owKdkAps4,5499
69
69
  commonmeta/writers/ris_writer.py,sha256=AcnCszS3WY9lF594NbFBtLylsA8ownnYp_XLQJ84Ios,2093
70
70
  commonmeta/writers/schema_org_writer.py,sha256=5j002uCNLdlScZMNQmPjodcVWqaBh2z38zL1H4lo2hY,5741
71
- commonmeta_py-0.30.dist-info/LICENSE,sha256=746hEF2wZCKkcckk5-_DcBLtHewfaEMS4iXTlA1PVwk,1074
72
- commonmeta_py-0.30.dist-info/METADATA,sha256=GUODVocf6zYFgKtJ52NJqmgXvnQmNLdSiD32HYX0xv0,8331
73
- commonmeta_py-0.30.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
74
- commonmeta_py-0.30.dist-info/entry_points.txt,sha256=vbcDw3_2lMTKdcAL2VUF4DRYRpKuzXVYLMCdgKVf88U,49
75
- commonmeta_py-0.30.dist-info/RECORD,,
71
+ commonmeta_py-0.32.dist-info/LICENSE,sha256=746hEF2wZCKkcckk5-_DcBLtHewfaEMS4iXTlA1PVwk,1074
72
+ commonmeta_py-0.32.dist-info/METADATA,sha256=jrhitlV03nvAJ8VaKjwqHHK6tegUJrnsvEi9TcpfbqI,8331
73
+ commonmeta_py-0.32.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
74
+ commonmeta_py-0.32.dist-info/entry_points.txt,sha256=vbcDw3_2lMTKdcAL2VUF4DRYRpKuzXVYLMCdgKVf88U,49
75
+ commonmeta_py-0.32.dist-info/RECORD,,