invenio-vocabularies 4.1.1__py2.py3-none-any.whl → 4.2.0__py2.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.

Potentially problematic release.


This version of invenio-vocabularies might be problematic. Click here for more details.

Files changed (31) hide show
  1. invenio_vocabularies/__init__.py +1 -1
  2. invenio_vocabularies/administration/views/vocabularies.py +1 -0
  3. invenio_vocabularies/cli.py +5 -3
  4. invenio_vocabularies/config.py +2 -1
  5. invenio_vocabularies/contrib/affiliations/api.py +1 -2
  6. invenio_vocabularies/contrib/affiliations/datastreams.py +33 -8
  7. invenio_vocabularies/contrib/affiliations/services.py +1 -2
  8. invenio_vocabularies/contrib/awards/awards.py +2 -1
  9. invenio_vocabularies/contrib/awards/datastreams.py +1 -0
  10. invenio_vocabularies/contrib/awards/services.py +1 -2
  11. invenio_vocabularies/contrib/common/ror/datastreams.py +39 -5
  12. invenio_vocabularies/contrib/funders/datastreams.py +38 -11
  13. invenio_vocabularies/contrib/funders/funders.py +2 -1
  14. invenio_vocabularies/datastreams/readers.py +32 -13
  15. invenio_vocabularies/datastreams/tasks.py +25 -0
  16. invenio_vocabularies/datastreams/writers.py +19 -0
  17. invenio_vocabularies/factories.py +1 -0
  18. invenio_vocabularies/records/models.py +2 -4
  19. invenio_vocabularies/records/pidprovider.py +1 -2
  20. invenio_vocabularies/resources/__init__.py +1 -0
  21. invenio_vocabularies/resources/schema.py +2 -1
  22. invenio_vocabularies/services/custom_fields/subject.py +2 -1
  23. invenio_vocabularies/services/custom_fields/vocabulary.py +1 -1
  24. invenio_vocabularies/services/tasks.py +0 -30
  25. {invenio_vocabularies-4.1.1.dist-info → invenio_vocabularies-4.2.0.dist-info}/METADATA +9 -1
  26. {invenio_vocabularies-4.1.1.dist-info → invenio_vocabularies-4.2.0.dist-info}/RECORD +31 -30
  27. {invenio_vocabularies-4.1.1.dist-info → invenio_vocabularies-4.2.0.dist-info}/AUTHORS.rst +0 -0
  28. {invenio_vocabularies-4.1.1.dist-info → invenio_vocabularies-4.2.0.dist-info}/LICENSE +0 -0
  29. {invenio_vocabularies-4.1.1.dist-info → invenio_vocabularies-4.2.0.dist-info}/WHEEL +0 -0
  30. {invenio_vocabularies-4.1.1.dist-info → invenio_vocabularies-4.2.0.dist-info}/entry_points.txt +0 -0
  31. {invenio_vocabularies-4.1.1.dist-info → invenio_vocabularies-4.2.0.dist-info}/top_level.txt +0 -0
@@ -10,6 +10,6 @@
10
10
 
11
11
  from .ext import InvenioVocabularies
12
12
 
13
- __version__ = "4.1.1"
13
+ __version__ = "4.2.0"
14
14
 
15
15
  __all__ = ("__version__", "InvenioVocabularies")
@@ -8,6 +8,7 @@
8
8
  # details.
9
9
 
10
10
  """Vocabularies admin interface."""
11
+
11
12
  from invenio_administration.views.base import (
12
13
  AdminResourceEditView,
13
14
  AdminResourceListView,
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2020-2021 CERN.
3
+ # Copyright (C) 2020-2024 CERN.
4
4
  # Copyright (C) 2021 Graz University of Technology.
5
5
  #
6
6
  # Invenio-Vocabularies is free software; you can redistribute it and/or
@@ -9,7 +9,6 @@
9
9
 
10
10
  """Commands to create and manage vocabularies."""
11
11
 
12
-
13
12
  import click
14
13
  from flask.cli import with_appcontext
15
14
  from invenio_access.permissions import system_identity
@@ -101,7 +100,10 @@ def update(vocabulary, filepath=None, origin=None):
101
100
  config = vc.get_config(filepath, origin)
102
101
 
103
102
  for w_conf in config["writers"]:
104
- w_conf["args"]["update"] = True
103
+ if w_conf["type"] == "async":
104
+ w_conf["args"]["writer"]["args"]["update"] = True
105
+ else:
106
+ w_conf["args"]["update"] = True
105
107
 
106
108
  success, errored, filtered = _process_vocab(config)
107
109
 
@@ -24,7 +24,7 @@ from .datastreams.readers import (
24
24
  ZipReader,
25
25
  )
26
26
  from .datastreams.transformers import XMLTransformer
27
- from .datastreams.writers import ServiceWriter, YamlWriter
27
+ from .datastreams.writers import AsyncWriter, ServiceWriter, YamlWriter
28
28
  from .resources import VocabulariesResourceConfig
29
29
  from .services.config import VocabulariesServiceConfig
30
30
 
@@ -134,6 +134,7 @@ VOCABULARIES_DATASTREAM_TRANSFORMERS = {
134
134
  VOCABULARIES_DATASTREAM_WRITERS = {
135
135
  "service": ServiceWriter,
136
136
  "yaml": YamlWriter,
137
+ "async": AsyncWriter,
137
138
  }
138
139
  """Data Streams writers."""
139
140
 
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2021 CERN.
3
+ # Copyright (C) 2021-2024 CERN.
4
4
  #
5
5
  # Invenio-Vocabularies is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the MIT License; see LICENSE file for more
@@ -8,7 +8,6 @@
8
8
 
9
9
  """Vocabulary affiliations."""
10
10
 
11
-
12
11
  from .affiliations import record_type
13
12
 
14
13
  Affiliation = record_type.record_cls
@@ -9,11 +9,11 @@
9
9
 
10
10
  """Affiliations datastreams, transformers, writers and readers."""
11
11
 
12
- from invenio_access.permissions import system_identity
12
+ from flask import current_app
13
13
  from invenio_i18n import lazy_gettext as _
14
14
 
15
15
  from ...datastreams.writers import ServiceWriter
16
- from .config import affiliation_schemes
16
+ from ..common.ror.datastreams import RORTransformer
17
17
 
18
18
 
19
19
  class AffiliationsServiceWriter(ServiceWriter):
@@ -29,9 +29,35 @@ class AffiliationsServiceWriter(ServiceWriter):
29
29
  return entry["id"]
30
30
 
31
31
 
32
+ class AffiliationsRORTransformer(RORTransformer):
33
+ """Affiliations ROR Transformer."""
34
+
35
+ def __init__(
36
+ self, *args, vocab_schemes=None, funder_fundref_doi_prefix=None, **kwargs
37
+ ):
38
+ """Constructor."""
39
+ if vocab_schemes is None:
40
+ vocab_schemes = current_app.config.get("VOCABULARIES_AFFILIATION_SCHEMES")
41
+ super().__init__(
42
+ *args,
43
+ vocab_schemes=vocab_schemes,
44
+ funder_fundref_doi_prefix=funder_fundref_doi_prefix,
45
+ **kwargs
46
+ )
47
+
48
+
49
+ VOCABULARIES_DATASTREAM_READERS = {}
50
+ """Affiliations datastream readers."""
51
+
32
52
  VOCABULARIES_DATASTREAM_WRITERS = {
33
53
  "affiliations-service": AffiliationsServiceWriter,
34
54
  }
55
+ """Affiliations datastream writers."""
56
+
57
+ VOCABULARIES_DATASTREAM_TRANSFORMERS = {
58
+ "ror-affiliations": AffiliationsRORTransformer,
59
+ }
60
+ """Affiliations datastream transformers."""
35
61
 
36
62
 
37
63
  DATASTREAM_CONFIG = {
@@ -46,17 +72,16 @@ DATASTREAM_CONFIG = {
46
72
  ],
47
73
  "transformers": [
48
74
  {
49
- "type": "ror",
50
- "args": {
51
- "vocab_schemes": affiliation_schemes,
52
- },
75
+ "type": "ror-affiliations",
53
76
  },
54
77
  ],
55
78
  "writers": [
56
79
  {
57
- "type": "affiliations-service",
80
+ "type": "async",
58
81
  "args": {
59
- "identity": system_identity,
82
+ "writer": {
83
+ "type": "affiliations-service",
84
+ }
60
85
  },
61
86
  }
62
87
  ],
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2021 CERN.
3
+ # Copyright (C) 2021-2024 CERN.
4
4
  #
5
5
  # Invenio-Vocabularies is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the MIT License; see LICENSE file for more
@@ -8,7 +8,6 @@
8
8
 
9
9
  """Vocabulary affiliations."""
10
10
 
11
-
12
11
  from .affiliations import record_type
13
12
 
14
13
  AffiliationsServiceConfig = record_type.service_config_cls
@@ -1,12 +1,13 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2022 CERN.
3
+ # Copyright (C) 2022-2024 CERN.
4
4
  #
5
5
  # Invenio-Vocabularies is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the MIT License; see LICENSE file for more
7
7
  # details.
8
8
 
9
9
  """Vocabulary awards."""
10
+
10
11
  from flask_resources import (
11
12
  BaseListSchema,
12
13
  JSONSerializer,
@@ -7,6 +7,7 @@
7
7
  # details.
8
8
 
9
9
  """Awards datastreams, transformers, writers and readers."""
10
+
10
11
  import io
11
12
 
12
13
  import requests
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2022 CERN.
3
+ # Copyright (C) 2022-2024 CERN.
4
4
  #
5
5
  # Invenio-Vocabularies is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the MIT License; see LICENSE file for more
@@ -8,7 +8,6 @@
8
8
 
9
9
  """Vocabulary awards."""
10
10
 
11
-
12
11
  from .awards import record_type
13
12
 
14
13
  AwardsServiceConfig = record_type.service_config_cls
@@ -10,6 +10,7 @@
10
10
  """ROR-related Datastreams Readers/Writers/Transformers module."""
11
11
 
12
12
  import io
13
+ from datetime import datetime
13
14
 
14
15
  import requests
15
16
  from idutils import normalize_ror
@@ -22,6 +23,11 @@ from invenio_vocabularies.datastreams.transformers import BaseTransformer
22
23
  class RORHTTPReader(BaseReader):
23
24
  """ROR HTTP Reader returning an in-memory binary stream of the latest ROR data dump ZIP file."""
24
25
 
26
+ def __init__(self, origin=None, mode="r", since=None, *args, **kwargs):
27
+ """Constructor."""
28
+ self._since = since
29
+ super().__init__(origin, mode, *args, **kwargs)
30
+
25
31
  def _iter(self, fp, *args, **kwargs):
26
32
  raise NotImplementedError(
27
33
  "RORHTTPReader downloads one file and therefore does not iterate through items"
@@ -34,15 +40,41 @@ class RORHTTPReader(BaseReader):
34
40
  "RORHTTPReader does not support being chained after another reader"
35
41
  )
36
42
 
43
+ # Follow the DOI to get the link of the linkset
44
+ dataset_doi_link = "https://doi.org/10.5281/zenodo.6347574"
45
+ landing_page = requests.get(dataset_doi_link, allow_redirects=True)
46
+ landing_page.raise_for_status()
47
+
37
48
  # Call the signposting `linkset+json` endpoint for the Concept DOI (i.e. latest version) of the ROR data dump.
38
49
  # See: https://github.com/inveniosoftware/rfcs/blob/master/rfcs/rdm-0071-signposting.md#provide-an-applicationlinksetjson-endpoint
39
- headers = {"Accept": "application/linkset+json"}
40
- api_url = "https://zenodo.org/api/records/6347574"
41
- api_resp = requests.get(api_url, headers=headers)
42
- api_resp.raise_for_status()
50
+ if "linkset" not in landing_page.links:
51
+ raise ReaderError("Linkset not found in the ROR dataset record.")
52
+ linkset_response = requests.get(
53
+ landing_page.links["linkset"]["url"],
54
+ headers={"Accept": "application/linkset+json"},
55
+ )
56
+ linkset_response.raise_for_status()
57
+
58
+ if self._since:
59
+ for link in linkset_response.json()["linkset"]:
60
+ if "type" in link and link["type"] == "application/ld+json":
61
+ json_ld_reponse = requests.get(
62
+ link["anchor"], headers={"Accept": link["type"]}
63
+ )
64
+ json_ld_reponse.raise_for_status()
65
+
66
+ # TODO Update to use dateCreated once the field is added to InvenioRDM. (https://github.com/inveniosoftware/invenio-rdm-records/issues/1777)
67
+ last_dump_date = json_ld_reponse.json()["datePublished"]
68
+ if datetime.fromisoformat(last_dump_date) < datetime.fromisoformat(
69
+ self._since
70
+ ):
71
+ return
72
+ break
73
+ else:
74
+ raise ReaderError("Couldn't find json-ld in publisher's linkset.")
43
75
 
44
76
  # Extract the Landing page Link Set Object located as the first (index 0) item.
45
- landing_page_linkset = api_resp.json()["linkset"][0]
77
+ landing_page_linkset = linkset_response.json()["linkset"][0]
46
78
 
47
79
  # Extract the URL of the only ZIP file linked to the record.
48
80
  landing_page_zip_items = [
@@ -164,3 +196,5 @@ class RORTransformer(BaseTransformer):
164
196
  VOCABULARIES_DATASTREAM_TRANSFORMERS = {
165
197
  "ror": RORTransformer,
166
198
  }
199
+
200
+ VOCABULARIES_DATASTREAM_WRITERS = {}
@@ -9,12 +9,11 @@
9
9
 
10
10
  """Funders datastreams, transformers, writers and readers."""
11
11
 
12
- from idutils import normalize_ror
13
- from invenio_access.permissions import system_identity
12
+ from flask import current_app
14
13
  from invenio_i18n import lazy_gettext as _
15
14
 
16
15
  from ...datastreams.writers import ServiceWriter
17
- from .config import funder_fundref_doi_prefix, funder_schemes
16
+ from ..common.ror.datastreams import RORTransformer
18
17
 
19
18
 
20
19
  class FundersServiceWriter(ServiceWriter):
@@ -30,10 +29,40 @@ class FundersServiceWriter(ServiceWriter):
30
29
  return entry["id"]
31
30
 
32
31
 
32
+ class FundersRORTransformer(RORTransformer):
33
+ """Funders ROR Transformer."""
34
+
35
+ def __init__(
36
+ self, *args, vocab_schemes=None, funder_fundref_doi_prefix=None, **kwargs
37
+ ):
38
+ """Constructor."""
39
+ if vocab_schemes is None:
40
+ vocab_schemes = current_app.config.get("VOCABULARIES_FUNDER_SCHEMES")
41
+ if funder_fundref_doi_prefix is None:
42
+ funder_fundref_doi_prefix = current_app.config.get(
43
+ "VOCABULARIES_FUNDER_DOI_PREFIX"
44
+ )
45
+ super().__init__(
46
+ *args,
47
+ vocab_schemes=vocab_schemes,
48
+ funder_fundref_doi_prefix=funder_fundref_doi_prefix,
49
+ **kwargs
50
+ )
51
+
52
+
53
+ VOCABULARIES_DATASTREAM_READERS = {}
54
+ """Funders datastreams writers."""
55
+
33
56
  VOCABULARIES_DATASTREAM_WRITERS = {
34
57
  "funders-service": FundersServiceWriter,
35
58
  }
36
- """Funders Data Streams transformers."""
59
+ """Funders datastreams writers."""
60
+
61
+
62
+ VOCABULARIES_DATASTREAM_TRANSFORMERS = {
63
+ "ror-funders": FundersRORTransformer,
64
+ }
65
+ """Funders datastreams transformers."""
37
66
 
38
67
 
39
68
  DATASTREAM_CONFIG = {
@@ -48,18 +77,16 @@ DATASTREAM_CONFIG = {
48
77
  ],
49
78
  "transformers": [
50
79
  {
51
- "type": "ror",
52
- "args": {
53
- "vocab_schemes": funder_schemes,
54
- "funder_fundref_doi_prefix": funder_fundref_doi_prefix,
55
- },
80
+ "type": "ror-funders",
56
81
  },
57
82
  ],
58
83
  "writers": [
59
84
  {
60
- "type": "funders-service",
85
+ "type": "async",
61
86
  "args": {
62
- "identity": system_identity,
87
+ "writer": {
88
+ "type": "funders-service",
89
+ }
63
90
  },
64
91
  }
65
92
  ],
@@ -1,12 +1,13 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2022 CERN.
3
+ # Copyright (C) 2022-2024 CERN.
4
4
  #
5
5
  # Invenio-Vocabularies is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the MIT License; see LICENSE file for more
7
7
  # details.
8
8
 
9
9
  """Vocabulary funders."""
10
+
10
11
  from flask_resources import (
11
12
  BaseListSchema,
12
13
  JSONSerializer,
@@ -270,19 +270,38 @@ class OAIPMHReader(BaseReader):
270
270
  self.xml.find(f".//{self._oai_namespace}metadata").getchildren()[0],
271
271
  )
272
272
 
273
- scythe.class_mapping["ListRecords"] = OAIRecord
274
- try:
275
- records = scythe.list_records(
276
- from_=self._from,
277
- until=self._until,
278
- metadata_prefix=self._metadata_prefix,
279
- set_=self._set,
280
- ignore_deleted=True,
281
- )
282
- for record in records:
283
- yield {"record": record}
284
- except oaipmh_scythe.NoRecordsMatch:
285
- raise ReaderError(f"No records found in OAI-PMH request.")
273
+ if self._verb == "ListRecords":
274
+ scythe.class_mapping["ListRecords"] = OAIRecord
275
+ try:
276
+ records = scythe.list_records(
277
+ from_=self._from,
278
+ until=self._until,
279
+ metadata_prefix=self._metadata_prefix,
280
+ set_=self._set,
281
+ ignore_deleted=True,
282
+ )
283
+ for record in records:
284
+ yield {"record": record}
285
+ except oaipmh_scythe.NoRecordsMatch:
286
+ raise ReaderError("No records found in OAI-PMH request.")
287
+ else:
288
+ scythe.class_mapping["GetRecord"] = OAIRecord
289
+ try:
290
+ headers = scythe.list_identifiers(
291
+ from_=self._from,
292
+ until=self._until,
293
+ metadata_prefix=self._metadata_prefix,
294
+ set_=self._set,
295
+ ignore_deleted=True,
296
+ )
297
+ for header in headers:
298
+ record = scythe.get_record(
299
+ identifier=header.identifier,
300
+ metadata_prefix=self._metadata_prefix,
301
+ )
302
+ yield {"record": record}
303
+ except oaipmh_scythe.NoRecordsMatch:
304
+ raise ReaderError("No records found in OAI-PMH request.")
286
305
 
287
306
  def read(self, item=None, *args, **kwargs):
288
307
  """Reads from item or opens the file descriptor from origin."""
@@ -0,0 +1,25 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2022-2024 CERN.
4
+ #
5
+ # Invenio-Vocabularies is free software; you can redistribute it and/or
6
+ # modify it under the terms of the MIT License; see LICENSE file for more
7
+ # details.
8
+
9
+ """Data Streams Celery tasks."""
10
+
11
+ from celery import shared_task
12
+
13
+ from ..datastreams import StreamEntry
14
+ from ..datastreams.factories import WriterFactory
15
+
16
+
17
+ @shared_task(ignore_result=True)
18
+ def write_entry(writer, entry):
19
+ """Write an entry.
20
+
21
+ :param writer: writer configuration as accepted by the WriterFactory.
22
+ :param entry: dictionary, StreamEntry is not serializable.
23
+ """
24
+ writer = WriterFactory.create(config=writer)
25
+ writer.write(StreamEntry(entry))
@@ -20,6 +20,7 @@ from marshmallow import ValidationError
20
20
 
21
21
  from .datastreams import StreamEntry
22
22
  from .errors import WriterError
23
+ from .tasks import write_entry
23
24
 
24
25
 
25
26
  class BaseWriter(ABC):
@@ -106,3 +107,21 @@ class YamlWriter(BaseWriter):
106
107
  yaml.safe_dump([stream_entry.entry], file, allow_unicode=True)
107
108
 
108
109
  return stream_entry
110
+
111
+
112
+ class AsyncWriter(BaseWriter):
113
+ """Writes the entries asynchronously (celery task)."""
114
+
115
+ def __init__(self, writer, *args, **kwargs):
116
+ """Constructor.
117
+
118
+ :param writer: writer to use.
119
+ """
120
+ self._writer = writer
121
+ super().__init__(*args, **kwargs)
122
+
123
+ def write(self, stream_entry, *args, **kwargs):
124
+ """Launches a celery task to write an entry."""
125
+ write_entry.delay(self._writer, stream_entry.entry)
126
+
127
+ return stream_entry
@@ -7,6 +7,7 @@
7
7
  # modify it under the terms of the MIT License; see LICENSE file for more
8
8
  # details.
9
9
  """Generate Vocabulary Config."""
10
+
10
11
  from copy import deepcopy
11
12
 
12
13
  import yaml
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2020-2021 CERN.
3
+ # Copyright (C) 2020-2024 CERN.
4
4
  #
5
5
  # Invenio-Vocabularies is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the MIT License; see LICENSE file for more
@@ -79,9 +79,7 @@ class VocabularyScheme(db.Model):
79
79
  """Create a new vocabulary subtype."""
80
80
  banned = [",", ":"]
81
81
  for b in banned:
82
- assert (
83
- b not in data["id"]
84
- ), f"No '{b}' allowed in VocabularyScheme.id" # noqa
82
+ assert b not in data["id"], f"No '{b}' allowed in VocabularyScheme.id"
85
83
 
86
84
  with db.session.begin_nested():
87
85
  obj = cls(**data)
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2021 CERN.
3
+ # Copyright (C) 2021-2024 CERN.
4
4
  #
5
5
  # Invenio-Vocabularies is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the MIT License; see LICENSE file for more
@@ -8,7 +8,6 @@
8
8
 
9
9
  """Persistent identifier provider for vocabularies."""
10
10
 
11
-
12
11
  from invenio_pidstore.models import PIDStatus
13
12
  from invenio_pidstore.providers.base import BaseProvider
14
13
 
@@ -7,6 +7,7 @@
7
7
  # details.
8
8
 
9
9
  """Resources module."""
10
+
10
11
  from invenio_vocabularies.resources.schema import L10NString, VocabularyL10Schema
11
12
 
12
13
  from .config import VocabulariesResourceConfig, VocabularyTypeResourceConfig
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2020-2021 CERN.
3
+ # Copyright (C) 2020-2024 CERN.
4
4
  # Copyright (C) 2021 Northwestern University.
5
5
  #
6
6
  # Invenio-Vocabularies is free software; you can redistribute it and/or
@@ -8,6 +8,7 @@
8
8
  # details.
9
9
 
10
10
  """Vocabulary resource schema."""
11
+
11
12
  from marshmallow import Schema, fields
12
13
 
13
14
  from invenio_vocabularies.resources.serializer import L10NString
@@ -7,6 +7,7 @@
7
7
 
8
8
 
9
9
  """Custom fields."""
10
+
10
11
  from invenio_i18n import lazy_gettext as _
11
12
 
12
13
  from ...contrib.subjects.api import Subject
@@ -25,7 +26,7 @@ class SubjectCF(VocabularyCF):
25
26
  vocabulary_id="subjects",
26
27
  schema=SubjectRelationSchema,
27
28
  ui_schema=SubjectRelationSchema,
28
- **kwargs
29
+ **kwargs,
29
30
  )
30
31
  self.pid_field = Subject.pid
31
32
 
@@ -39,7 +39,7 @@ class VocabularyCF(BaseCF):
39
39
  sort_by=None,
40
40
  schema=VocabularyRelationSchema,
41
41
  ui_schema=VocabularyL10NItemSchema,
42
- **kwargs
42
+ **kwargs,
43
43
  ):
44
44
  """Constructor."""
45
45
  super().__init__(name, **kwargs)
@@ -11,7 +11,6 @@ from celery import shared_task
11
11
  from flask import current_app
12
12
 
13
13
  from ..datastreams.factories import DataStreamFactory
14
- from ..factories import get_vocabulary_config
15
14
 
16
15
 
17
16
  @shared_task(ignore_result=True)
@@ -27,32 +26,3 @@ def process_datastream(config):
27
26
  if result.errors:
28
27
  for err in result.errors:
29
28
  current_app.logger.error(err)
30
-
31
-
32
- @shared_task()
33
- def import_funders():
34
- """Import the funders vocabulary.
35
-
36
- Only new records are imported.
37
- Existing records are not updated.
38
- """
39
- vc = get_vocabulary_config("funders")
40
- config = vc.get_config()
41
-
42
- # When importing funders via a Celery task, make sure that we are automatically downloading the ROR file,
43
- # instead of relying on a local file on the file system.
44
- if config["readers"][0]["type"] == "ror-http":
45
- readers_config_with_ror_http = config["readers"]
46
- else:
47
- readers_config_with_ror_http = [{"type": "ror-http"}] + config["readers"]
48
-
49
- ds = DataStreamFactory.create(
50
- readers_config=readers_config_with_ror_http,
51
- transformers_config=config.get("transformers"),
52
- writers_config=config["writers"],
53
- )
54
-
55
- for result in ds.process():
56
- if result.errors:
57
- for err in result.errors:
58
- current_app.logger.exception(err)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: invenio-vocabularies
3
- Version: 4.1.1
3
+ Version: 4.2.0
4
4
  Summary: "Invenio module for managing vocabularies."
5
5
  Home-page: https://github.com/inveniosoftware/invenio-vocabularies
6
6
  Author: CERN
@@ -78,6 +78,14 @@ https://invenio-vocabularies.readthedocs.io/
78
78
  Changes
79
79
  =======
80
80
 
81
+ Version v4.2.0 (released 2024-07-24)
82
+
83
+ - ror: check last update; use ld+json for metadata (#367)
84
+ - tasks: remove import funders task
85
+ - funders: add and export custom transformer
86
+ - affiliations: add and export custom transformer
87
+ - datastreams: implement asynchronous writer
88
+
81
89
  Version v4.1.1 (released 2024-07-15)
82
90
 
83
91
  - installation: use invenio-oaipmh-scythe from PyPI
@@ -1,15 +1,15 @@
1
- invenio_vocabularies/__init__.py,sha256=IfTJAejqD10k4V3mLdn1Kxt4hLZnARmLmBqRXgIrJ3o,377
2
- invenio_vocabularies/cli.py,sha256=9Gfm3jjNDX3oQnYXupxSuqwXvWnJmsQ9GmyekJ1h5Kg,5239
3
- invenio_vocabularies/config.py,sha256=o-SdebM5eZMTnpGjrwoGzeQ60q73anLBJ1n1T3mTO38,4458
1
+ invenio_vocabularies/__init__.py,sha256=fOsOa6766lKWONOkvvx15eYhnKovuRiq9tWwrXh_5HI,377
2
+ invenio_vocabularies/cli.py,sha256=0PpQttop3lTXxM29IpY70MXFFPhb9apbiutdb7WDBvw,5356
3
+ invenio_vocabularies/config.py,sha256=f3J658yL7E0ShFN99Jq2q1b5AJF1lDeiDyzijDmh8qA,4497
4
4
  invenio_vocabularies/ext.py,sha256=GujJ4UARd4Fxf4z7zznRk9JAgHamZuYCOdrKU5czg00,5987
5
- invenio_vocabularies/factories.py,sha256=r7rg9JeXe4q0cTYA20beC_2_9mYCKZJZleiU2rtwoY4,2902
5
+ invenio_vocabularies/factories.py,sha256=JBvvhg5f47Cy9cJZ1-OBalh750ErycwstLj1e9Gn4W8,2903
6
6
  invenio_vocabularies/fixtures.py,sha256=nNWwH04HFASjfj1oy5kMdcQGKmVjzUuA5wSw-ER1QAg,1585
7
7
  invenio_vocabularies/proxies.py,sha256=k7cTUgWfnCoYIuNqAj_VFi1zBN33KNNclRSVnBkObEM,711
8
8
  invenio_vocabularies/views.py,sha256=PNJ5nvc3O7ASwNe56xmqy5YaU9n3UYF3W2JwvtE_kYs,1561
9
9
  invenio_vocabularies/webpack.py,sha256=aLRm0ut3rXPb8D87pVA9mO_ODq7WOSZdsJQyU4iMLoI,1891
10
10
  invenio_vocabularies/administration/__init__.py,sha256=0bDp2Aw8aZth7C-q9Xn9rxeCUQQRoIUxoWWWwPvKbXA,308
11
11
  invenio_vocabularies/administration/views/__init__.py,sha256=31DP4jLG6q4HQlzSRiGLPxUjHPUCCl4N34y4XMuPP6g,313
12
- invenio_vocabularies/administration/views/vocabularies.py,sha256=9TOVAGMsMRufH9RglxQbKG1ylvuGX1ttlLGQ4G48H88,1289
12
+ invenio_vocabularies/administration/views/vocabularies.py,sha256=JyKr1OYF9DO89zvWCNOtNfClO_QptdHdjvgY1kkImnw,1290
13
13
  invenio_vocabularies/alembic/17c703ce1eb7_create_names_table.py,sha256=2QGs0Ofi6yd93VzIBqghNi47hrZtuLf0DylKyvVzskI,1572
14
14
  invenio_vocabularies/alembic/4a9a4fd235f8_create_vocabulary_schemes.py,sha256=Ywtp8qOFcI3PxUXemHdvy_VwdcUVtMFV1sFgNAmYrms,1054
15
15
  invenio_vocabularies/alembic/4f365fced43f_create_vocabularies_tables.py,sha256=jSrr0CLRchYADjkFeod0L-oophq2woXtRwbUU5Vytiw,3039
@@ -44,14 +44,14 @@ invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/script
44
44
  invenio_vocabularies/contrib/__init__.py,sha256=C5eDia6tAVBCrbb5hd_KnxmczyBoF87NIBUCLID-Tzc,240
45
45
  invenio_vocabularies/contrib/affiliations/__init__.py,sha256=rV8YAzBRoSKsBYcVjCNJh6j7ITuPRfurwj9HJHRjkN8,565
46
46
  invenio_vocabularies/contrib/affiliations/affiliations.py,sha256=Ph0z7bT_tudsWDKFaiksCBngsG-eO6Xpbe3KdejfLXI,1591
47
- invenio_vocabularies/contrib/affiliations/api.py,sha256=-NrA_aYxabvNMofYCnrDZ2bLP15HGDTvvhHTDuXNg-g,322
47
+ invenio_vocabularies/contrib/affiliations/api.py,sha256=5nIOvpfcseuAAg2XgblHc8jb7TAdfU79XOBRpL-p398,326
48
48
  invenio_vocabularies/contrib/affiliations/config.py,sha256=u1sHeihy0B0e6w5e3HsbrC9e8A4WTLKCYPXUdcX-ZTs,1605
49
- invenio_vocabularies/contrib/affiliations/datastreams.py,sha256=tACDv4dHcNr6d9EAi9iyoVH0z-6AakGhMy4_6eUMYYY,1650
49
+ invenio_vocabularies/contrib/affiliations/datastreams.py,sha256=oojLIh9jCE8zr0dj8KFepxPqsOn2SBSXQsX8L3XwFxs,2383
50
50
  invenio_vocabularies/contrib/affiliations/facets.py,sha256=w316MGvtdyTpRCPOpCEmMxxLraRkbFFb1VvLkFlEc9o,1229
51
51
  invenio_vocabularies/contrib/affiliations/models.py,sha256=JUcj-1ydc2Cw2Rsc24JwXE3TFBJ_6fivhUYhGq4rT8A,329
52
52
  invenio_vocabularies/contrib/affiliations/resources.py,sha256=DBEbRxQmp-o-PeZlgFG588Q4sGcruuwIL8L9O-SzCes,435
53
53
  invenio_vocabularies/contrib/affiliations/schema.py,sha256=O4s6aHcO1w4_aAfGuYLx_eLS6nctd6ktyIuHB6dMKqw,1842
54
- invenio_vocabularies/contrib/affiliations/services.py,sha256=C_6cMnh3mnL3-xxdsb16Rvm2aK4FyiaQ_qUTGylCwjo,391
54
+ invenio_vocabularies/contrib/affiliations/services.py,sha256=KJbv46c2LuQOW3xz7KVLtfZjWR8vhMRPHninlUEhrss,395
55
55
  invenio_vocabularies/contrib/affiliations/jsonschemas/__init__.py,sha256=ILyZ5kejTr0p50macMBPALQCTJSe4KEE3_cgf2p3zV4,252
56
56
  invenio_vocabularies/contrib/affiliations/jsonschemas/affiliations/affiliation-v1.0.0.json,sha256=be-glRNIBtIO87Tcyw8d68OdG4J8-ojjiCj8UJBnckg,1649
57
57
  invenio_vocabularies/contrib/affiliations/mappings/__init__.py,sha256=q7hb9lcT9KLRSGr6G7qpL8Top6wZfzj_E4uzGxnraTw,295
@@ -63,14 +63,14 @@ invenio_vocabularies/contrib/affiliations/mappings/v7/__init__.py,sha256=zr9YyyK
63
63
  invenio_vocabularies/contrib/affiliations/mappings/v7/affiliations/affiliation-v1.0.0.json,sha256=PaHChFsf9r7xRnZ_7ro8SWNEXpWv4uUYrl32g0QESZs,2096
64
64
  invenio_vocabularies/contrib/awards/__init__.py,sha256=KwCmwFalz-3pDs9iTa5TKUidBjLepnUMqpCBXRiQOO8,474
65
65
  invenio_vocabularies/contrib/awards/api.py,sha256=OXukE7PLXs45BTtqVrhvGBNqLmQaI-CgXmHTCi36LZk,303
66
- invenio_vocabularies/contrib/awards/awards.py,sha256=N-BNE2ffUu-IlfKFBjMjfYqxL0vmpO8YMPe4q4e-rTo,2695
66
+ invenio_vocabularies/contrib/awards/awards.py,sha256=FU7XKSsfEIqaQYyCFjPMDbD2z-lwGsicuLXg69HO6oE,2701
67
67
  invenio_vocabularies/contrib/awards/config.py,sha256=PlDHabkWDUzwa1Fvk_U2hG83kQYBqM1IyChg8Yg_VlY,1630
68
- invenio_vocabularies/contrib/awards/datastreams.py,sha256=4BRifAmmEw0fUxo9JK5ZUXfSrSv1wllPvuGVOfick54,8244
68
+ invenio_vocabularies/contrib/awards/datastreams.py,sha256=wQIhLGXSYCIjwXzTofpiaSjnO1XuDpiOlH5TqiGix4c,8245
69
69
  invenio_vocabularies/contrib/awards/models.py,sha256=mM-kSNf7kDH3oIbV8epxxbUi7muYqi4JreXxgWXlVzw,318
70
70
  invenio_vocabularies/contrib/awards/resources.py,sha256=_9YTqbhz8axFXGhG5y4WyjE27p9n-7e3c6HoBRditPA,411
71
71
  invenio_vocabularies/contrib/awards/schema.py,sha256=bg-09nvhEn-ipzaztK1iNbKc59saAM8v8hAW9zpKDAc,2786
72
72
  invenio_vocabularies/contrib/awards/serializer.py,sha256=MDnq41EJf_LFu-UT6qlB3-O2S7aEYePIzQ_immMnwag,1139
73
- invenio_vocabularies/contrib/awards/services.py,sha256=oExHPYgXgege9a7oLCK4LGb8FXCHfY0ekeS9HvTJLxs,367
73
+ invenio_vocabularies/contrib/awards/services.py,sha256=zwOMHqa4SyZuHopGZwEKhfw3kUHrWg73_4zMNo5kOe4,371
74
74
  invenio_vocabularies/contrib/awards/jsonschemas/__init__.py,sha256=XB2l9hr53vqTk7o9lmy18FWGhHEUvNHu8D6nMF8Bz4k,246
75
75
  invenio_vocabularies/contrib/awards/jsonschemas/awards/award-v1.0.0.json,sha256=XKHjWWmv7Ph6v-JxPsP09V_6Pr9QNJcJeZdaU5HZWwU,1117
76
76
  invenio_vocabularies/contrib/awards/mappings/__init__.py,sha256=PbM5urjiSrJSx4Ak-H_lJrOOVKGT38MrGgRv61gIbAM,243
@@ -82,13 +82,13 @@ invenio_vocabularies/contrib/awards/mappings/v7/__init__.py,sha256=fERdPp7K7ajao
82
82
  invenio_vocabularies/contrib/awards/mappings/v7/awards/award-v1.0.0.json,sha256=QJT2gS7SE47YTP2HdU4ESjMwHJBTzAH70JEhWWg9SXM,1528
83
83
  invenio_vocabularies/contrib/common/__init__.py,sha256=DdbGYRthEpQtObhY_YK4vOT9Zf7FFagQ6qtUjJOYw-M,247
84
84
  invenio_vocabularies/contrib/common/ror/__init__.py,sha256=3u2-fre1SQ-4nz3Ay0nxj3ntmMZ8Ujh_4eV-fyxfmtc,239
85
- invenio_vocabularies/contrib/common/ror/datastreams.py,sha256=Yb671-LGDmzhhBDYIp0B5eQt56RVnx3Tq1Z_NO3KncM,6359
85
+ invenio_vocabularies/contrib/common/ror/datastreams.py,sha256=joEiJwYawEaUggOZAQF6JrP8jHPfnAHmocK07nLMbO0,7893
86
86
  invenio_vocabularies/contrib/funders/__init__.py,sha256=YxFXBDnT7NM8rFwxT_Ge3xXR2n17EM0alknQq7r_Bt8,478
87
87
  invenio_vocabularies/contrib/funders/api.py,sha256=QKGGeSnPHSoBfucvpaVruXT_txYidofZ080G3IxFkIo,306
88
88
  invenio_vocabularies/contrib/funders/config.py,sha256=BbzCRIcPxSwDllhjnGmdec5A126Zs1I4ZyVUCGi3jRA,1756
89
- invenio_vocabularies/contrib/funders/datastreams.py,sha256=H-32oCR8BmtT4MRlFZHowT7axwV3dgycrPYKlmsZZec,1779
89
+ invenio_vocabularies/contrib/funders/datastreams.py,sha256=G3UBT_kXei08zAKD44oaeERbkCVkJ9q9pFUoXpk3yiQ,2480
90
90
  invenio_vocabularies/contrib/funders/facets.py,sha256=a068TVtt74Ncu0latb177LFK8EdnpbMOWecAKozA04M,1245
91
- invenio_vocabularies/contrib/funders/funders.py,sha256=nHqUoyRRW9oruN-ghmwzb9QIz_jyBgxNUpk41yvcso8,2292
91
+ invenio_vocabularies/contrib/funders/funders.py,sha256=KtUydQzQZPKtT1YMbBSIRcGc2eBmdkk5Zqavo54zK1E,2298
92
92
  invenio_vocabularies/contrib/funders/models.py,sha256=RAU-_YVOUNVCn03_XGJ2czcVwXTaZPk5w7X_bMAgMOk,314
93
93
  invenio_vocabularies/contrib/funders/resources.py,sha256=He4gXd737ovdrHL-HB9dX7AGxp1BVJ9QteIO7JWUVSE,415
94
94
  invenio_vocabularies/contrib/funders/schema.py,sha256=tEOdMU2i0z_3PkXL1yD1qIJeoAy_8n22xxv8V7iltz0,2480
@@ -143,14 +143,15 @@ invenio_vocabularies/datastreams/__init__.py,sha256=VPefh6k4Q3eYxKIW8I5zXUGucntp
143
143
  invenio_vocabularies/datastreams/datastreams.py,sha256=_jSXv2yAvSjt8btMoLJlqXOkqBzYb3Xe9m2GH50Nwag,3987
144
144
  invenio_vocabularies/datastreams/errors.py,sha256=IDUZ3gNtYGrhcOgApHCms1gNNJTyJzoMPmG5JtIeYNU,678
145
145
  invenio_vocabularies/datastreams/factories.py,sha256=H8a2gAy7KNImtdCdtqpVKC5gIvE3ON6U1Wn1_zaMlQ4,2181
146
- invenio_vocabularies/datastreams/readers.py,sha256=e-fkgjDqyUUgwpLF8ihxYChaZxGjAFLiA3J39Drt0PU,9978
146
+ invenio_vocabularies/datastreams/readers.py,sha256=9WypPQFGWEIKcrra6oC8yxdGzVG3utd3CtrGx-AUxLM,10834
147
+ invenio_vocabularies/datastreams/tasks.py,sha256=V3bm8ebdaB1tkrZWR1DuCscxSzP-O5maZecPkOF3Dyw,694
147
148
  invenio_vocabularies/datastreams/transformers.py,sha256=wspny-kazYMRHjkkyFfRVNIYzJxbjAqokRCBQ_-gXcY,1357
148
- invenio_vocabularies/datastreams/writers.py,sha256=y8AIYXdwQLmmTjuckVqOnp3KKtKWX2bOabM12LxTvOQ,3635
149
+ invenio_vocabularies/datastreams/writers.py,sha256=UkrPOKyAOu8SsNyxBgdxYelCtPcBab6kbaIw-swVxlw,4153
149
150
  invenio_vocabularies/datastreams/xml.py,sha256=HFa-lfxj7kFrr2IjeN1jxSLDfcvpBwO9nZLZF2-BryE,997
150
151
  invenio_vocabularies/records/__init__.py,sha256=Uj7O6fYdAtLOkLXUGSAYPADBB7aqP4yVs9b6OAjA158,243
151
152
  invenio_vocabularies/records/api.py,sha256=Lynt6Sz4BVN1orh0zgJ5ljhnUobEtcq8c22PmSeUo2U,1494
152
- invenio_vocabularies/records/models.py,sha256=0zOciiWY3EsEm_lNVtFecip0qgCg9JjhXoJDllrZFnc,2500
153
- invenio_vocabularies/records/pidprovider.py,sha256=ByUwsZKimRv2QlbMdJmhCejmJd2sIqwt8fISWW6aW8g,3836
153
+ invenio_vocabularies/records/models.py,sha256=36CxObDMe-D9hoGaelAlR4ggZZTyXgRmCWPxZRpWF5w,2460
154
+ invenio_vocabularies/records/pidprovider.py,sha256=uFuo-M0Wqua0QhTS2z17YpzYDySwNfJaOi7rp0S0dPs,3840
154
155
  invenio_vocabularies/records/jsonschemas/__init__.py,sha256=qr2BZMyMVvVRSeJzPCI8re2BlGokiDjeqwREkythSrQ,246
155
156
  invenio_vocabularies/records/jsonschemas/vocabularies/definitions-v1.0.0.json,sha256=1qTs-Liji01HMitT8768urX3BhYXZmHWUGqV8VmOotU,372
156
157
  invenio_vocabularies/records/jsonschemas/vocabularies/vocabulary-v1.0.0.json,sha256=x7kkCkuMNQ6tygb_RWf7QOlOtyG-kqKOH5FNnBn1cqo,1289
@@ -164,10 +165,10 @@ invenio_vocabularies/records/mappings/v7/vocabularies/vocabulary-v1.0.0.json,sha
164
165
  invenio_vocabularies/records/systemfields/__init__.py,sha256=MRLoLF3h8VYuqJ9tbbgXjXkTDUniz24pVnujLX-psZI,406
165
166
  invenio_vocabularies/records/systemfields/pid.py,sha256=5e2zZD0uHP5r32--KmuzjfHk3B5GXEV3yBuoKeit9mQ,3740
166
167
  invenio_vocabularies/records/systemfields/relations.py,sha256=UbaiuxvAZorxNN4t63Y5ePc5OUJ_cYGAxLsFcET3E-g,1528
167
- invenio_vocabularies/resources/__init__.py,sha256=pbgT2lfm2pihPFk9Zd2dU3URgjWsVMGfPd3yWTfRzkw,663
168
+ invenio_vocabularies/resources/__init__.py,sha256=UpNMJA1JacoJ2U1_dq20sds3lJK1TyMCV4zLOWpfRvI,664
168
169
  invenio_vocabularies/resources/config.py,sha256=PooKsBd3KXoApc9zoSk-fkeQhzygYdGU4lH5FgQ3W2Q,3157
169
170
  invenio_vocabularies/resources/resource.py,sha256=hJs5GD0XtcBafwgTI9n8FHK5Fb6agx8BgzF81K5vRbU,4229
170
- invenio_vocabularies/resources/schema.py,sha256=B_Y7uOSfVlogUmiDZfRpa3EWx1VJmbrzTtLachv8yEw,541
171
+ invenio_vocabularies/resources/schema.py,sha256=6stpU9qgLGoeGib3DWnyrHj6XLPxJKbEV7TVoJEK41M,542
171
172
  invenio_vocabularies/resources/serializer.py,sha256=pwfckLdkMu1MNDkocyMg1XeX6RhbfeuV4fjDO5xKDxo,1190
172
173
  invenio_vocabularies/services/__init__.py,sha256=6mi62EG21Id6x23nx0X193I6sVTakK6jOdYNEKPxXUk,522
173
174
  invenio_vocabularies/services/components.py,sha256=d9C-24dEDM63gFm75nU-dXrrjS2zZi7Nfkv40BGnHwM,1941
@@ -178,10 +179,10 @@ invenio_vocabularies/services/querystr.py,sha256=X3JHVF9B0O0iLWrnW3ok_bf_8jA-Cs_
178
179
  invenio_vocabularies/services/results.py,sha256=6LZIpzWSbt9wpRNWgjA1uIM4RFooOYTkHcp5-PnIJdU,3767
179
180
  invenio_vocabularies/services/schema.py,sha256=mwIBFylpQlWw1M6h_axc-z4Yd7X3Z1S0PxJOlZGpfrQ,4634
180
181
  invenio_vocabularies/services/service.py,sha256=rUPeb86Jv2WXzRp-RZDHLWsouCmJcqHpCmgrpLm2Vs4,6387
181
- invenio_vocabularies/services/tasks.py,sha256=Z_riU6kEsuAo1xdyYcrgPL7Y9hKPOGSMLPWYee49vSo,1776
182
+ invenio_vocabularies/services/tasks.py,sha256=AH0XifkOypsEdh8LyjmlHnPLQK5qqUJC8cNVWGkbqks,788
182
183
  invenio_vocabularies/services/custom_fields/__init__.py,sha256=QgvSsn-S1xLzbZ57pjjGTt5oI3HqzXHVjwGTtuPgzN8,421
183
- invenio_vocabularies/services/custom_fields/subject.py,sha256=k-qXbCjXPTk-Xo_W5sojFpQbkntv50odROiNyJHMzL8,2234
184
- invenio_vocabularies/services/custom_fields/vocabulary.py,sha256=eCvqrNloMMCCvqR49IQwzk2p4xapx5_bmQhd6ByJZFM,3019
184
+ invenio_vocabularies/services/custom_fields/subject.py,sha256=TrtmRgk3Vj_NxmDhC_7sM8MAIje4AGXBxYIk7nIgt0o,2236
185
+ invenio_vocabularies/services/custom_fields/vocabulary.py,sha256=oQwI8Aoi2Nr9k3eWKnde5H7RXc7qdlATSeI6coy8UR0,3020
185
186
  invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/subjects.html,sha256=h9syHkwZ6ltgjWw_0M5UoR6h6Re2imJ7uQ6M6peOyhk,686
186
187
  invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabularies-list.html,sha256=-gDwRctqIkSzh9ial8zfbA4o41ARM-Mq-THkcJ87U00,359
187
188
  invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabulary-details.html,sha256=2dfQzRFl5RwUwle245sxWGnObwJQXr-e_bBzpe_PkkA,2684
@@ -280,10 +281,10 @@ invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.mo,sha256=g1I5aNO8r
280
281
  invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.po,sha256=vg8qC8ofpAdJ3mQz7mWM1ylKDpiNWXFs7rlMdSPkgKk,4629
281
282
  invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.mo,sha256=cqSm8NtMAwrP9O6qbmtkDtRT1e9D93qpsJN5X9_PPVw,600
282
283
  invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.po,sha256=9ACePz_EpB-LfcIJajZ2kp8Q04tcdrQLOtug162ZUss,4115
283
- invenio_vocabularies-4.1.1.dist-info/AUTHORS.rst,sha256=8d0p_WWE1r9DavvzMDi2D4YIGBHiMYcN3LYxqQOj8sY,291
284
- invenio_vocabularies-4.1.1.dist-info/LICENSE,sha256=UvI8pR8jGWqe0sTkb_hRG6eIrozzWwWzyCGEpuXX4KE,1062
285
- invenio_vocabularies-4.1.1.dist-info/METADATA,sha256=so4EirpouCKXf84mwYhjdyHsj_iku-y9c16mn112qEc,7894
286
- invenio_vocabularies-4.1.1.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
287
- invenio_vocabularies-4.1.1.dist-info/entry_points.txt,sha256=qHHFkyU3r0COsKm5gCYuhP8tfsioBggxKAiEXNAbbjM,2803
288
- invenio_vocabularies-4.1.1.dist-info/top_level.txt,sha256=x1gRNbaODF_bCD0SBLM3nVOFPGi06cmGX5X94WKrFKk,21
289
- invenio_vocabularies-4.1.1.dist-info/RECORD,,
284
+ invenio_vocabularies-4.2.0.dist-info/AUTHORS.rst,sha256=8d0p_WWE1r9DavvzMDi2D4YIGBHiMYcN3LYxqQOj8sY,291
285
+ invenio_vocabularies-4.2.0.dist-info/LICENSE,sha256=UvI8pR8jGWqe0sTkb_hRG6eIrozzWwWzyCGEpuXX4KE,1062
286
+ invenio_vocabularies-4.2.0.dist-info/METADATA,sha256=2pdaEFZ5Z35PmaNmdeuq-TDu0P1X8KCeyUhZh6NvW-0,8167
287
+ invenio_vocabularies-4.2.0.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
288
+ invenio_vocabularies-4.2.0.dist-info/entry_points.txt,sha256=qHHFkyU3r0COsKm5gCYuhP8tfsioBggxKAiEXNAbbjM,2803
289
+ invenio_vocabularies-4.2.0.dist-info/top_level.txt,sha256=x1gRNbaODF_bCD0SBLM3nVOFPGi06cmGX5X94WKrFKk,21
290
+ invenio_vocabularies-4.2.0.dist-info/RECORD,,