invenio-vocabularies 4.2.0__tar.gz → 4.3.0__tar.gz

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 (405) hide show
  1. invenio-vocabularies-4.3.0/.github/workflows/tests.yml +40 -0
  2. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/CHANGES.rst +6 -0
  3. {invenio-vocabularies-4.2.0/invenio_vocabularies.egg-info → invenio-vocabularies-4.3.0}/PKG-INFO +8 -1
  4. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/__init__.py +1 -1
  5. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/cli.py +12 -3
  6. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/config.py +13 -0
  7. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/datastreams.py +1 -1
  8. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/datastreams.py +1 -1
  9. invenio-vocabularies-4.3.0/invenio_vocabularies/contrib/names/datastreams.py +288 -0
  10. invenio-vocabularies-4.3.0/invenio_vocabularies/contrib/names/s3client.py +44 -0
  11. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/datastreams.py +61 -13
  12. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/readers.py +8 -2
  13. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/tasks.py +14 -2
  14. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/writers.py +53 -2
  15. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/custom_fields/subject.py +1 -1
  16. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/subjects.html +1 -1
  17. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0/invenio_vocabularies.egg-info}/PKG-INFO +8 -1
  18. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/SOURCES.txt +1 -0
  19. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/requires.txt +4 -0
  20. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/setup.cfg +3 -0
  21. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_datastreams.py +38 -3
  22. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/conftest.py +8 -0
  23. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_datastreams.py +10 -9
  24. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_datastreams_tasks.py +14 -2
  25. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_tasks_resources.py +5 -1
  26. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/test_cli.py +1 -2
  27. invenio-vocabularies-4.2.0/.github/workflows/tests.yml +0 -89
  28. invenio-vocabularies-4.2.0/invenio_vocabularies/contrib/names/datastreams.py +0 -130
  29. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.dockerignore +0 -0
  30. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.editorconfig +0 -0
  31. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.git-blame-ignore-revs +0 -0
  32. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.github/workflows/i18n-pull.yml +0 -0
  33. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.github/workflows/i18n-push.yml +0 -0
  34. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.github/workflows/pypi-publish.yml +0 -0
  35. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.tx/config +0 -0
  36. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/AUTHORS.rst +0 -0
  37. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/CONTRIBUTING.rst +0 -0
  38. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/INSTALL.rst +0 -0
  39. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/LICENSE +0 -0
  40. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/MANIFEST.in +0 -0
  41. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/README.rst +0 -0
  42. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/babel.ini +0 -0
  43. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/Makefile +0 -0
  44. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/api.rst +0 -0
  45. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/authors.rst +0 -0
  46. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/changes.rst +0 -0
  47. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/conf.py +0 -0
  48. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/configuration.rst +0 -0
  49. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/contributing.rst +0 -0
  50. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/index.rst +0 -0
  51. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/installation.rst +0 -0
  52. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/license.rst +0 -0
  53. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/make.bat +0 -0
  54. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/requirements.txt +0 -0
  55. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/usage.rst +0 -0
  56. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/gen-migration.sh +0 -0
  57. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/administration/__init__.py +0 -0
  58. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/administration/views/__init__.py +0 -0
  59. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/administration/views/vocabularies.py +0 -0
  60. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/17c703ce1eb7_create_names_table.py +0 -0
  61. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/4a9a4fd235f8_create_vocabulary_schemes.py +0 -0
  62. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/4f365fced43f_create_vocabularies_tables.py +0 -0
  63. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/55a700f897b6_add_names_and_afiliations_pid_column.py +0 -0
  64. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/6312f33645c1_create_affiliations_table.py +0 -0
  65. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/676dd587542d_create_funders_vocabulary_table.py +0 -0
  66. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/8ff82dfb0be8_create_vocabularies_branch.py +0 -0
  67. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/__init__.py +0 -0
  68. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/e1146238edd3_create_awards_table.py +0 -0
  69. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/.eslintrc.yml +0 -0
  70. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/.prettierrc +0 -0
  71. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/index.js +0 -0
  72. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/package.json +0 -0
  73. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/AwardResults.js +0 -0
  74. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/CustomAwardForm.js +0 -0
  75. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FunderDropdown.js +0 -0
  76. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingField.js +0 -0
  77. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingField.test.js +0 -0
  78. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingFieldItem.js +0 -0
  79. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/FundingModal.js +0 -0
  80. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/NoAwardResults.js +0 -0
  81. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/Funding/index.js +0 -0
  82. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/forms/index.js +0 -0
  83. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/index.js +0 -0
  84. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/index.js +0 -0
  85. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/i18next-scanner.config.js +0 -0
  86. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/i18next.js +0 -0
  87. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/messages/index.js +0 -0
  88. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/package.json +0 -0
  89. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/scripts/compileCatalog.js +0 -0
  90. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/scripts/initCatalog.js +0 -0
  91. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/__init__.py +0 -0
  92. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/__init__.py +0 -0
  93. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/affiliations.py +0 -0
  94. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/api.py +0 -0
  95. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/config.py +0 -0
  96. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/facets.py +0 -0
  97. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/jsonschemas/__init__.py +0 -0
  98. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/jsonschemas/affiliations/affiliation-v1.0.0.json +0 -0
  99. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/__init__.py +0 -0
  100. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v1/__init__.py +0 -0
  101. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v1/affiliations/affiliation-v1.0.0.json +0 -0
  102. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v2/__init__.py +0 -0
  103. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v2/affiliations/affiliation-v1.0.0.json +0 -0
  104. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/v7/__init__.py +0 -0
  105. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/v7/affiliations/affiliation-v1.0.0.json +0 -0
  106. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/models.py +0 -0
  107. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/resources.py +0 -0
  108. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/schema.py +0 -0
  109. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/services.py +0 -0
  110. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/__init__.py +0 -0
  111. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/api.py +0 -0
  112. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/awards.py +0 -0
  113. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/config.py +0 -0
  114. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/datastreams.py +0 -0
  115. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/jsonschemas/__init__.py +0 -0
  116. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/jsonschemas/awards/award-v1.0.0.json +0 -0
  117. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/__init__.py +0 -0
  118. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/os-v1/__init__.py +0 -0
  119. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/os-v1/awards/award-v1.0.0.json +0 -0
  120. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/os-v2/__init__.py +0 -0
  121. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/os-v2/awards/award-v1.0.0.json +0 -0
  122. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/v7/__init__.py +0 -0
  123. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/v7/awards/award-v1.0.0.json +0 -0
  124. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/models.py +0 -0
  125. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/resources.py +0 -0
  126. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/schema.py +0 -0
  127. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/serializer.py +0 -0
  128. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/services.py +0 -0
  129. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/common/__init__.py +0 -0
  130. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/common/ror/__init__.py +0 -0
  131. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/common/ror/datastreams.py +0 -0
  132. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/__init__.py +0 -0
  133. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/api.py +0 -0
  134. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/config.py +0 -0
  135. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/facets.py +0 -0
  136. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/funders.py +0 -0
  137. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/jsonschemas/__init__.py +0 -0
  138. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/jsonschemas/funders/funder-v1.0.0.json +0 -0
  139. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/__init__.py +0 -0
  140. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/os-v1/__init__.py +0 -0
  141. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/os-v1/funders/funder-v1.0.0.json +0 -0
  142. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/os-v2/__init__.py +0 -0
  143. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/os-v2/funders/funder-v1.0.0.json +0 -0
  144. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/v7/__init__.py +0 -0
  145. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/v7/funders/funder-v1.0.0.json +0 -0
  146. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/models.py +0 -0
  147. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/resources.py +0 -0
  148. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/schema.py +0 -0
  149. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/serializer.py +0 -0
  150. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/services.py +0 -0
  151. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/__init__.py +0 -0
  152. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/api.py +0 -0
  153. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/config.py +0 -0
  154. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/jsonschemas/__init__.py +0 -0
  155. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/jsonschemas/names/name-v1.0.0.json +0 -0
  156. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/__init__.py +0 -0
  157. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/os-v1/__init__.py +0 -0
  158. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/os-v1/names/name-v1.0.0.json +0 -0
  159. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/os-v2/__init__.py +0 -0
  160. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/os-v2/names/name-v1.0.0.json +0 -0
  161. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/v7/__init__.py +0 -0
  162. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/v7/names/name-v1.0.0.json +0 -0
  163. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/models.py +0 -0
  164. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/names.py +0 -0
  165. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/resources.py +0 -0
  166. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/schema.py +0 -0
  167. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/services.py +0 -0
  168. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/__init__.py +0 -0
  169. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/api.py +0 -0
  170. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/config.py +0 -0
  171. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/facets.py +0 -0
  172. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/jsonschemas/__init__.py +0 -0
  173. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/jsonschemas/subjects/subject-v1.0.0.json +0 -0
  174. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/__init__.py +0 -0
  175. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/os-v1/__init__.py +0 -0
  176. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/os-v1/subjects/subject-v1.0.0.json +0 -0
  177. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/os-v2/__init__.py +0 -0
  178. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/os-v2/subjects/subject-v1.0.0.json +0 -0
  179. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/v7/__init__.py +0 -0
  180. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/v7/subjects/subject-v1.0.0.json +0 -0
  181. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/models.py +0 -0
  182. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/resources.py +0 -0
  183. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/schema.py +0 -0
  184. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/services.py +0 -0
  185. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/subjects.py +0 -0
  186. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/__init__.py +0 -0
  187. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/errors.py +0 -0
  188. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/factories.py +0 -0
  189. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/transformers.py +0 -0
  190. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/xml.py +0 -0
  191. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/ext.py +0 -0
  192. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/factories.py +0 -0
  193. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/fixtures.py +0 -0
  194. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/proxies.py +0 -0
  195. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/__init__.py +0 -0
  196. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/api.py +0 -0
  197. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/jsonschemas/__init__.py +0 -0
  198. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/jsonschemas/vocabularies/definitions-v1.0.0.json +0 -0
  199. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/jsonschemas/vocabularies/vocabulary-v1.0.0.json +0 -0
  200. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/__init__.py +0 -0
  201. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v1/__init__.py +0 -0
  202. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v1/vocabularies/vocabulary-v1.0.0.json +0 -0
  203. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v2/__init__.py +0 -0
  204. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v2/vocabularies/vocabulary-v1.0.0.json +0 -0
  205. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/v7/__init__.py +0 -0
  206. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/v7/vocabularies/vocabulary-v1.0.0.json +0 -0
  207. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/models.py +0 -0
  208. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/pidprovider.py +0 -0
  209. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/systemfields/__init__.py +0 -0
  210. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/systemfields/pid.py +0 -0
  211. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/systemfields/relations.py +0 -0
  212. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/__init__.py +0 -0
  213. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/config.py +0 -0
  214. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/resource.py +0 -0
  215. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/schema.py +0 -0
  216. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/serializer.py +0 -0
  217. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/__init__.py +0 -0
  218. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/components.py +0 -0
  219. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/config.py +0 -0
  220. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/custom_fields/__init__.py +0 -0
  221. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/custom_fields/vocabulary.py +0 -0
  222. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/facets.py +0 -0
  223. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/permissions.py +0 -0
  224. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/querystr.py +0 -0
  225. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/results.py +0 -0
  226. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/schema.py +0 -0
  227. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/service.py +0 -0
  228. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/tasks.py +0 -0
  229. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabularies-list.html +0 -0
  230. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabulary-details.html +0 -0
  231. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/af/LC_MESSAGES/messages.mo +0 -0
  232. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/af/LC_MESSAGES/messages.po +0 -0
  233. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ar/LC_MESSAGES/messages.mo +0 -0
  234. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ar/LC_MESSAGES/messages.po +0 -0
  235. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/bg/LC_MESSAGES/messages.mo +0 -0
  236. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/bg/LC_MESSAGES/messages.po +0 -0
  237. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ca/LC_MESSAGES/messages.mo +0 -0
  238. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ca/LC_MESSAGES/messages.po +0 -0
  239. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/cs/LC_MESSAGES/messages.mo +0 -0
  240. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/cs/LC_MESSAGES/messages.po +0 -0
  241. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/da/LC_MESSAGES/messages.mo +0 -0
  242. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/da/LC_MESSAGES/messages.po +0 -0
  243. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de/LC_MESSAGES/messages.mo +0 -0
  244. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de/LC_MESSAGES/messages.po +0 -0
  245. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_AT/LC_MESSAGES/messages.mo +0 -0
  246. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_AT/LC_MESSAGES/messages.po +0 -0
  247. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_DE/LC_MESSAGES/messages.mo +0 -0
  248. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_DE/LC_MESSAGES/messages.po +0 -0
  249. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/el/LC_MESSAGES/messages.mo +0 -0
  250. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/el/LC_MESSAGES/messages.po +0 -0
  251. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en/LC_MESSAGES/messages.mo +0 -0
  252. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en/LC_MESSAGES/messages.po +0 -0
  253. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_AT/LC_MESSAGES/messages.mo +0 -0
  254. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_AT/LC_MESSAGES/messages.po +0 -0
  255. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_HU/LC_MESSAGES/messages.mo +0 -0
  256. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_HU/LC_MESSAGES/messages.po +0 -0
  257. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es/LC_MESSAGES/messages.mo +0 -0
  258. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es/LC_MESSAGES/messages.po +0 -0
  259. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_CU/LC_MESSAGES/messages.mo +0 -0
  260. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_CU/LC_MESSAGES/messages.po +0 -0
  261. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_MX/LC_MESSAGES/messages.mo +0 -0
  262. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_MX/LC_MESSAGES/messages.po +0 -0
  263. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et/LC_MESSAGES/messages.mo +0 -0
  264. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et/LC_MESSAGES/messages.po +0 -0
  265. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et_EE/LC_MESSAGES/messages.mo +0 -0
  266. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et_EE/LC_MESSAGES/messages.po +0 -0
  267. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa/LC_MESSAGES/messages.mo +0 -0
  268. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa/LC_MESSAGES/messages.po +0 -0
  269. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa_IR/LC_MESSAGES/messages.mo +0 -0
  270. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa_IR/LC_MESSAGES/messages.po +0 -0
  271. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr/LC_MESSAGES/messages.mo +0 -0
  272. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr/LC_MESSAGES/messages.po +0 -0
  273. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_CI/LC_MESSAGES/messages.mo +0 -0
  274. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_CI/LC_MESSAGES/messages.po +0 -0
  275. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_FR/LC_MESSAGES/messages.mo +0 -0
  276. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_FR/LC_MESSAGES/messages.po +0 -0
  277. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/gl/LC_MESSAGES/messages.mo +0 -0
  278. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/gl/LC_MESSAGES/messages.po +0 -0
  279. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hi_IN/LC_MESSAGES/messages.mo +0 -0
  280. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hi_IN/LC_MESSAGES/messages.po +0 -0
  281. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hr/LC_MESSAGES/messages.mo +0 -0
  282. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hr/LC_MESSAGES/messages.po +0 -0
  283. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu/LC_MESSAGES/messages.mo +0 -0
  284. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu/LC_MESSAGES/messages.po +0 -0
  285. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu_HU/LC_MESSAGES/messages.mo +0 -0
  286. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu_HU/LC_MESSAGES/messages.po +0 -0
  287. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/it/LC_MESSAGES/messages.mo +0 -0
  288. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/it/LC_MESSAGES/messages.po +0 -0
  289. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ja/LC_MESSAGES/messages.mo +0 -0
  290. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ja/LC_MESSAGES/messages.po +0 -0
  291. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ka/LC_MESSAGES/messages.mo +0 -0
  292. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ka/LC_MESSAGES/messages.po +0 -0
  293. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/lt/LC_MESSAGES/messages.mo +0 -0
  294. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/lt/LC_MESSAGES/messages.po +0 -0
  295. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/messages.pot +0 -0
  296. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ne/LC_MESSAGES/messages.mo +0 -0
  297. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ne/LC_MESSAGES/messages.po +0 -0
  298. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/no/LC_MESSAGES/messages.mo +0 -0
  299. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/no/LC_MESSAGES/messages.po +0 -0
  300. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pl/LC_MESSAGES/messages.mo +0 -0
  301. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pl/LC_MESSAGES/messages.po +0 -0
  302. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pt/LC_MESSAGES/messages.mo +0 -0
  303. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pt/LC_MESSAGES/messages.po +0 -0
  304. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ro/LC_MESSAGES/messages.mo +0 -0
  305. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ro/LC_MESSAGES/messages.po +0 -0
  306. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ru/LC_MESSAGES/messages.mo +0 -0
  307. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ru/LC_MESSAGES/messages.po +0 -0
  308. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/rw/LC_MESSAGES/messages.mo +0 -0
  309. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/rw/LC_MESSAGES/messages.po +0 -0
  310. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sk/LC_MESSAGES/messages.mo +0 -0
  311. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sk/LC_MESSAGES/messages.po +0 -0
  312. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv/LC_MESSAGES/messages.mo +0 -0
  313. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv/LC_MESSAGES/messages.po +0 -0
  314. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv_SE/LC_MESSAGES/messages.mo +0 -0
  315. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv_SE/LC_MESSAGES/messages.po +0 -0
  316. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/tr/LC_MESSAGES/messages.mo +0 -0
  317. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/tr/LC_MESSAGES/messages.po +0 -0
  318. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk/LC_MESSAGES/messages.mo +0 -0
  319. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk/LC_MESSAGES/messages.po +0 -0
  320. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk_UA/LC_MESSAGES/messages.mo +0 -0
  321. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk_UA/LC_MESSAGES/messages.po +0 -0
  322. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  323. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
  324. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.mo +0 -0
  325. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.po +0 -0
  326. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/views.py +0 -0
  327. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/webpack.py +0 -0
  328. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/dependency_links.txt +0 -0
  329. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/entry_points.txt +0 -0
  330. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/not-zip-safe +0 -0
  331. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/top_level.txt +0 -0
  332. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/pyproject.toml +0 -0
  333. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/requirements-feature.txt +0 -0
  334. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/run-js-linter.sh +0 -0
  335. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/run-tests.sh +0 -0
  336. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/setup.py +0 -0
  337. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/conftest.py +0 -0
  338. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/conftest.py +0 -0
  339. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_api.py +0 -0
  340. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_datastreams.py +0 -0
  341. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_jsonschema.py +0 -0
  342. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_resource.py +0 -0
  343. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_schema.py +0 -0
  344. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_service.py +0 -0
  345. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/conftest.py +0 -0
  346. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_api.py +0 -0
  347. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_datastreams.py +0 -0
  348. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_jsonschema.py +0 -0
  349. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_resource.py +0 -0
  350. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_schema.py +0 -0
  351. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_service.py +0 -0
  352. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/common/ror/test_ror_datastreams.py +0 -0
  353. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/conftest.py +0 -0
  354. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_api.py +0 -0
  355. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_datastreams.py +0 -0
  356. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_jsonschema.py +0 -0
  357. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_resource.py +0 -0
  358. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_schema.py +0 -0
  359. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_service.py +0 -0
  360. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/conftest.py +0 -0
  361. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_api.py +0 -0
  362. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_jsonschema.py +0 -0
  363. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_resource.py +0 -0
  364. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_schema.py +0 -0
  365. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_service.py +0 -0
  366. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/conftest.py +0 -0
  367. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_api.py +0 -0
  368. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_facets.py +0 -0
  369. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_jsonschema.py +0 -0
  370. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_resource.py +0 -0
  371. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_schema.py +0 -0
  372. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_service.py +0 -0
  373. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/custom_fields/test_custom_fields.py +0 -0
  374. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_fixtures.py +0 -0
  375. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_readers.py +0 -0
  376. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_transformers.py +0 -0
  377. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_writers.py +0 -0
  378. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/vocabularies.yaml +0 -0
  379. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/__init__.py +0 -0
  380. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/api.py +0 -0
  381. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/jsonschemas/__init__.py +0 -0
  382. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/jsonschemas/records/record-v1.0.0.json +0 -0
  383. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/__init__.py +0 -0
  384. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v6/__init__.py +0 -0
  385. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v6/records/record-v1.0.0.json +0 -0
  386. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v7/__init__.py +0 -0
  387. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v7/records/record-v1.0.0.json +0 -0
  388. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/models.py +0 -0
  389. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/conftest.py +0 -0
  390. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_api.py +0 -0
  391. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_jsonschema.py +0 -0
  392. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_models.py +0 -0
  393. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_relationship.py +0 -0
  394. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/conftest.py +0 -0
  395. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_resources_get.py +0 -0
  396. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_resources_l10n.py +0 -0
  397. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_resources_search.py +0 -0
  398. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/conftest.py +0 -0
  399. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_labels.py +0 -0
  400. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_permissions.py +0 -0
  401. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_schema.py +0 -0
  402. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_service.py +0 -0
  403. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/test_alembic.py +0 -0
  404. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/test_factory.py +0 -0
  405. {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/test_invenio_vocabularies.py +0 -0
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # This file is part of Invenio.
4
+ # Copyright (C) 2020-2024 CERN.
5
+ # Copyright (C) 2022 Graz University of Technology.
6
+ #
7
+ # Invenio is free software; you can redistribute it and/or modify it
8
+ # under the terms of the MIT License; see LICENSE file for more details.
9
+
10
+ name: CI
11
+
12
+ on:
13
+ push:
14
+ branches:
15
+ - master
16
+ pull_request:
17
+ branches:
18
+ - master
19
+ - "maint-**"
20
+ schedule:
21
+ # * is a special character in YAML so you have to quote this string
22
+ - cron: "0 3 * * 6"
23
+ workflow_dispatch:
24
+ inputs:
25
+ reason:
26
+ description: "Reason"
27
+ required: false
28
+ default: "Manual trigger"
29
+
30
+ jobs:
31
+ Python:
32
+ uses: inveniosoftware/workflows/.github/workflows/tests-python.yml@master
33
+ with:
34
+ extras: "tests,oaipmh"
35
+
36
+ JS:
37
+ uses: inveniosoftware/workflows/.github/workflows/tests-js.yml@master
38
+ with:
39
+ js-working-directory: ./invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies
40
+ translations-working-directory: ./invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies
@@ -8,6 +8,12 @@
8
8
  Changes
9
9
  =======
10
10
 
11
+ Version v4.3.0 (released 2024-08-05)
12
+
13
+ - names: make names_exclude_regex configurable
14
+ - names: validate entry full names
15
+ - names: add orcid public data sync
16
+
11
17
  Version v4.2.0 (released 2024-07-24)
12
18
 
13
19
  - ror: check last update; use ld+json for metadata (#367)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: invenio-vocabularies
3
- Version: 4.2.0
3
+ Version: 4.3.0
4
4
  Summary: "Invenio module for managing vocabularies."
5
5
  Home-page: https://github.com/inveniosoftware/invenio-vocabularies
6
6
  Author: CERN
@@ -50,6 +50,12 @@ Description: ..
50
50
  Changes
51
51
  =======
52
52
 
53
+ Version v4.3.0 (released 2024-08-05)
54
+
55
+ - names: make names_exclude_regex configurable
56
+ - names: validate entry full names
57
+ - names: add orcid public data sync
58
+
53
59
  Version v4.2.0 (released 2024-07-24)
54
60
 
55
61
  - ror: check last update; use ld+json for metadata (#367)
@@ -250,6 +256,7 @@ Keywords: invenio vocabulary management
250
256
  Platform: any
251
257
  Classifier: Development Status :: 5 - Production/Stable
252
258
  Requires-Python: >=3.7
259
+ Provides-Extra: s3fs
253
260
  Provides-Extra: oaipmh
254
261
  Provides-Extra: tests
255
262
  Provides-Extra: elasticsearch7
@@ -10,6 +10,6 @@
10
10
 
11
11
  from .ext import InvenioVocabularies
12
12
 
13
- __version__ = "4.2.0"
13
+ __version__ = "4.3.0"
14
14
 
15
15
  __all__ = ("__version__", "InvenioVocabularies")
@@ -142,18 +142,27 @@ def convert(vocabulary, filepath=None, origin=None, target=None, num_samples=Non
142
142
  type=click.STRING,
143
143
  help="Identifier of the vocabulary item to delete.",
144
144
  )
145
- @click.option("--all", is_flag=True, default=False, help="Not supported yet.")
145
+ @click.option("--all", is_flag=True, default=False)
146
146
  @with_appcontext
147
147
  def delete(vocabulary, identifier, all):
148
148
  """Delete all items or a specific one of the vocabulary."""
149
- if not id and not all:
149
+ if not identifier and not all:
150
150
  click.secho("An identifier or the --all flag must be present.", fg="red")
151
151
  exit(1)
152
+
152
153
  vc = get_vocabulary_config(vocabulary)
153
154
  service = vc.get_service()
154
155
  if identifier:
155
156
  try:
156
- if service.delete(identifier, system_identity):
157
+ if service.delete(system_identity, identifier):
157
158
  click.secho(f"{identifier} deleted from {vocabulary}.", fg="green")
158
159
  except (PIDDeletedError, PIDDoesNotExistError):
159
160
  click.secho(f"PID {identifier} not found.")
161
+ elif all:
162
+ items = service.scan(system_identity)
163
+ for item in items.hits:
164
+ try:
165
+ if service.delete(system_identity, item["id"]):
166
+ click.secho(f"{item['id']} deleted from {vocabulary}.", fg="green")
167
+ except (PIDDeletedError, PIDDoesNotExistError):
168
+ click.secho(f"PID {item['id']} not found.")
@@ -155,3 +155,16 @@ VOCABULARIES_TYPES_SEARCH = {
155
155
  "sort": ["name", "count"],
156
156
  }
157
157
  """Vocabulary type search configuration."""
158
+
159
+ VOCABULARIES_ORCID_ACCESS_KEY = "TODO"
160
+ """ORCID access key to access the s3 bucket."""
161
+ VOCABULARIES_ORCID_SECRET_KEY = "TODO"
162
+ """ORCID secret key to access the s3 bucket."""
163
+ VOCABULARIES_ORCID_SUMMARIES_BUCKET = "v3.0-summaries"
164
+ """ORCID summaries bucket name."""
165
+ VOCABULARIES_ORCID_SYNC_MAX_WORKERS = 32
166
+ """ORCID max number of simultaneous workers/connections."""
167
+ VOCABULARIES_ORCID_SYNC_SINCE = {
168
+ "days": 1,
169
+ }
170
+ """ORCID time shift to sync. Parameters accepted are the ones passed to 'datetime.timedelta'."""
@@ -42,7 +42,7 @@ class AffiliationsRORTransformer(RORTransformer):
42
42
  *args,
43
43
  vocab_schemes=vocab_schemes,
44
44
  funder_fundref_doi_prefix=funder_fundref_doi_prefix,
45
- **kwargs
45
+ **kwargs,
46
46
  )
47
47
 
48
48
 
@@ -46,7 +46,7 @@ class FundersRORTransformer(RORTransformer):
46
46
  *args,
47
47
  vocab_schemes=vocab_schemes,
48
48
  funder_fundref_doi_prefix=funder_fundref_doi_prefix,
49
- **kwargs
49
+ **kwargs,
50
50
  )
51
51
 
52
52
 
@@ -0,0 +1,288 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2021-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
+ """Names datastreams, transformers, writers and readers."""
10
+
11
+ import csv
12
+ import io
13
+ import tarfile
14
+ from concurrent.futures import ThreadPoolExecutor, as_completed
15
+ from datetime import timedelta
16
+
17
+ import arrow
18
+ import regex as re
19
+ from flask import current_app
20
+ from invenio_access.permissions import system_identity
21
+ from invenio_records.dictutils import dict_lookup
22
+
23
+ from invenio_vocabularies.contrib.names.s3client import S3OrcidClient
24
+
25
+ from ...datastreams.errors import TransformerError
26
+ from ...datastreams.readers import BaseReader, SimpleHTTPReader
27
+ from ...datastreams.transformers import BaseTransformer
28
+ from ...datastreams.writers import ServiceWriter
29
+
30
+
31
+ class OrcidDataSyncReader(BaseReader):
32
+ """ORCiD Data Sync Reader."""
33
+
34
+ def __init__(self, origin=None, mode="r", since=None, *args, **kwargs):
35
+ """Constructor.
36
+
37
+ :param origin: Data source (e.g. filepath).
38
+ Can be none in case of piped readers.
39
+ """
40
+ super().__init__(origin=origin, mode=mode, *args, **kwargs)
41
+ self.s3_client = S3OrcidClient()
42
+ self.since = since
43
+
44
+ def _fetch_orcid_data(self, orcid_to_sync, bucket):
45
+ """Fetches a single ORCiD record from S3."""
46
+ # The ORCiD file key is located in a folder which name corresponds to the last three digits of the ORCiD
47
+ suffix = orcid_to_sync[-3:]
48
+ key = f"{suffix}/{orcid_to_sync}.xml"
49
+ try:
50
+ return self.s3_client.read_file(f"s3://{bucket}/{key}")
51
+ except Exception as e:
52
+ # TODO: log
53
+ return None
54
+
55
+ def _process_lambda_file(self, fileobj):
56
+ """Process the ORCiD lambda file and returns a list of ORCiDs to sync.
57
+
58
+ The decoded fileobj looks like the following:
59
+ orcid, path, date_created, last_modified
60
+ 0000-0001-5109-3700, http://orcid.org/0000-0001-5109-3700, 2014-08-02 15:00:00.000,2021-08-02 15:00:00.000
61
+
62
+ Yield ORCiDs to sync until the last sync date is reached.
63
+ """
64
+ date_format = "YYYY-MM-DD HH:mm:ss.SSSSSS"
65
+ date_format_no_millis = "YYYY-MM-DD HH:mm:ss"
66
+ time_shift = current_app.config["VOCABULARIES_ORCID_SYNC_SINCE"]
67
+ if self.since:
68
+ time_shift = self.since
69
+ last_sync = arrow.now() - timedelta(**time_shift)
70
+
71
+ file_content = fileobj.read().decode("utf-8")
72
+
73
+ csv_reader = csv.DictReader(file_content.splitlines())
74
+
75
+ for row in csv_reader: # Skip the header line
76
+ orcid = row["orcid"]
77
+
78
+ # Lambda file is ordered by last modified date
79
+ last_modified_str = row["last_modified"]
80
+ try:
81
+ last_modified_date = arrow.get(last_modified_str, date_format)
82
+ except arrow.parser.ParserError:
83
+ last_modified_date = arrow.get(last_modified_str, date_format_no_millis)
84
+
85
+ if last_modified_date < last_sync:
86
+ break
87
+ yield orcid
88
+
89
+ def _iter(self, orcids):
90
+ """Iterates over the ORCiD records yielding each one."""
91
+ with ThreadPoolExecutor(
92
+ max_workers=current_app.config["VOCABULARIES_ORCID_SYNC_MAX_WORKERS"]
93
+ ) as executor:
94
+ futures = [
95
+ executor.submit(
96
+ self._fetch_orcid_data,
97
+ orcid,
98
+ current_app.config["VOCABULARIES_ORCID_SUMMARIES_BUCKET"],
99
+ )
100
+ for orcid in orcids
101
+ ]
102
+ for future in as_completed(futures):
103
+ result = future.result()
104
+ if result is not None:
105
+ yield result
106
+
107
+ def read(self, item=None, *args, **kwargs):
108
+ """Streams the ORCiD lambda file, process it to get the ORCiDS to sync and yields it's data."""
109
+ # Read the file from S3
110
+ tar_content = self.s3_client.read_file(
111
+ "s3://orcid-lambda-file/last_modified.csv.tar"
112
+ )
113
+
114
+ orcids_to_sync = []
115
+ # Opens tar file and process it
116
+ with tarfile.open(fileobj=io.BytesIO(tar_content)) as tar:
117
+ # Iterate over each member (file or directory) in the tar file
118
+ for member in tar.getmembers():
119
+ # Extract the file
120
+ extracted_file = tar.extractfile(member)
121
+ if extracted_file:
122
+ # Process the file and get the ORCiDs to sync
123
+ orcids_to_sync.extend(self._process_lambda_file(extracted_file))
124
+
125
+ yield from self._iter(orcids_to_sync)
126
+
127
+
128
+ class OrcidHTTPReader(SimpleHTTPReader):
129
+ """ORCiD HTTP Reader."""
130
+
131
+ def __init__(self, *args, test_mode=True, **kwargs):
132
+ """Constructor."""
133
+ if test_mode:
134
+ origin = "https://sandbox.orcid.org/{id}"
135
+ else:
136
+ origin = "https://orcid.org/{id}"
137
+
138
+ super().__init__(origin, *args, **kwargs)
139
+
140
+
141
+ DEFAULT_NAMES_EXCLUDE_REGEX = r"[\p{P}\p{S}\p{Nd}\p{No}\p{Emoji}--,.()\-']"
142
+ """Regex to filter out names with punctuations, symbols, decimal numbers and emojis."""
143
+
144
+
145
+ class OrcidTransformer(BaseTransformer):
146
+ """Transforms an ORCiD record into a names record."""
147
+
148
+ def __init__(
149
+ self, *args, names_exclude_regex=DEFAULT_NAMES_EXCLUDE_REGEX, **kwargs
150
+ ) -> None:
151
+ """Constructor."""
152
+ self._names_exclude_regex = names_exclude_regex
153
+ super().__init__()
154
+
155
+ def _is_valid_name(self, name):
156
+ """Check whether the name passes the regex."""
157
+ if not self._names_exclude_regex:
158
+ return True
159
+ return not bool(re.search(self._names_exclude_regex, name, re.UNICODE | re.V1))
160
+
161
+ def apply(self, stream_entry, **kwargs):
162
+ """Applies the transformation to the stream entry."""
163
+ record = stream_entry.entry
164
+ person = record["person"]
165
+ orcid_id = record["orcid-identifier"]["path"]
166
+
167
+ name = person.get("name")
168
+ if name is None:
169
+ raise TransformerError(f"Name not found in ORCiD entry.")
170
+ if name.get("family-name") is None:
171
+ raise TransformerError(f"Family name not found in ORCiD entry.")
172
+
173
+ if not self._is_valid_name(name["given-names"] + name["family-name"]):
174
+ raise TransformerError(f"Invalid characters in name.")
175
+
176
+ entry = {
177
+ "id": orcid_id,
178
+ "given_name": name.get("given-names"),
179
+ "family_name": name.get("family-name"),
180
+ "identifiers": [{"scheme": "orcid", "identifier": orcid_id}],
181
+ "affiliations": [],
182
+ }
183
+
184
+ try:
185
+ employments = dict_lookup(
186
+ record, "activities-summary.employments.affiliation-group"
187
+ )
188
+ if isinstance(employments, dict):
189
+ employments = [employments]
190
+ history = set()
191
+ for employment in employments:
192
+ terminated = employment["employment-summary"].get("end-date")
193
+ affiliation = dict_lookup(
194
+ employment,
195
+ "employment-summary.organization.name",
196
+ )
197
+ if affiliation not in history and not terminated:
198
+ history.add(affiliation)
199
+ entry["affiliations"].append({"name": affiliation})
200
+ except Exception:
201
+ pass
202
+
203
+ stream_entry.entry = entry
204
+ return stream_entry
205
+
206
+
207
+ class NamesServiceWriter(ServiceWriter):
208
+ """Names service writer."""
209
+
210
+ def __init__(self, *args, **kwargs):
211
+ """Constructor."""
212
+ service_or_name = kwargs.pop("service_or_name", "names")
213
+ super().__init__(service_or_name=service_or_name, *args, **kwargs)
214
+
215
+ def _entry_id(self, entry):
216
+ """Get the id from an entry."""
217
+ return entry["id"]
218
+
219
+
220
+ VOCABULARIES_DATASTREAM_READERS = {
221
+ "orcid-http": OrcidHTTPReader,
222
+ "orcid-data-sync": OrcidDataSyncReader,
223
+ }
224
+
225
+
226
+ VOCABULARIES_DATASTREAM_TRANSFORMERS = {
227
+ "orcid": OrcidTransformer,
228
+ }
229
+ """ORCiD Data Streams transformers."""
230
+
231
+
232
+ VOCABULARIES_DATASTREAM_WRITERS = {
233
+ "names-service": NamesServiceWriter,
234
+ }
235
+ """ORCiD Data Streams transformers."""
236
+
237
+
238
+ DATASTREAM_CONFIG = {
239
+ "readers": [
240
+ {
241
+ "type": "tar",
242
+ "args": {
243
+ "regex": "\\.xml$",
244
+ },
245
+ },
246
+ {"type": "xml"},
247
+ ],
248
+ "transformers": [{"type": "orcid"}],
249
+ "writers": [
250
+ {
251
+ "type": "names-service",
252
+ "args": {
253
+ "identity": system_identity,
254
+ },
255
+ }
256
+ ],
257
+ }
258
+ """ORCiD Data Stream configuration.
259
+
260
+ An origin is required for the reader.
261
+ """
262
+
263
+ # TODO: Used on the jobs and should be set as a "PRESET" (naming to be defined)
264
+ ORCID_PRESET_DATASTREAM_CONFIG = {
265
+ "readers": [
266
+ {
267
+ "type": "orcid-data-sync",
268
+ },
269
+ {"type": "xml"},
270
+ ],
271
+ "transformers": [{"type": "orcid"}],
272
+ "writers": [
273
+ {
274
+ "type": "async",
275
+ "args": {
276
+ "writer": {
277
+ "type": "names-service",
278
+ }
279
+ },
280
+ }
281
+ ],
282
+ "batch_size": 1000,
283
+ "write_many": True,
284
+ }
285
+ """ORCiD Data Stream configuration.
286
+
287
+ An origin is required for the reader.
288
+ """
@@ -0,0 +1,44 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # This file is part of Invenio.
4
+ # Copyright (C) 2024 CERN.
5
+ #
6
+ # Invenio-Vocabularies is free software; you can redistribute it and/or
7
+ # modify it under the terms of the MIT License; see LICENSE file for more
8
+ # details.
9
+
10
+ """S3 client."""
11
+
12
+ from flask import current_app
13
+
14
+ try:
15
+ import s3fs
16
+ except ImportError:
17
+ s3fs = None
18
+
19
+
20
+ class S3Client:
21
+ """S3 client."""
22
+
23
+ def __init__(self, access_key, secret_key):
24
+ """Constructor."""
25
+ if s3fs is None:
26
+ raise Exception("s3fs is not installed.")
27
+
28
+ self.fs = s3fs.S3FileSystem(key=access_key, secret=secret_key)
29
+
30
+ def read_file(self, s3_path):
31
+ """Reads a file from S3."""
32
+ with self.fs.open(s3_path, "rb") as f:
33
+ return f.read()
34
+
35
+
36
+ class S3OrcidClient(S3Client):
37
+ """S3 ORCiD client."""
38
+
39
+ def __init__(self):
40
+ """Constructor."""
41
+ super().__init__(
42
+ access_key=current_app.config["VOCABULARIES_ORCID_ACCESS_KEY"],
43
+ secret_key=current_app.config["VOCABULARIES_ORCID_SECRET_KEY"],
44
+ )
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2021-2022 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,17 +8,41 @@
8
8
 
9
9
  """Base data stream."""
10
10
 
11
+ from flask import current_app
12
+
11
13
  from .errors import ReaderError, TransformerError, WriterError
12
14
 
13
15
 
14
16
  class StreamEntry:
15
17
  """Object to encapsulate streams processing."""
16
18
 
17
- def __init__(self, entry, errors=None):
18
- """Constructor."""
19
+ def __init__(self, entry, record=None, errors=None, op_type=None, exc=None):
20
+ """Constructor for the StreamEntry class.
21
+
22
+ :param entry (object): The entry object, usually a record dict.
23
+ :param record (object): The record object, usually a record class.
24
+ :param errors (list, optional): List of errors. Defaults to None.
25
+ :param op_type (str, optional): The operation type. Defaults to None.
26
+ :param exc (str, optional): The raised unhandled exception. Defaults to None.
27
+ """
19
28
  self.entry = entry
29
+ self.record = record
20
30
  self.filtered = False
21
31
  self.errors = errors or []
32
+ self.op_type = op_type
33
+ self.exc = exc
34
+
35
+ def log_errors(self, logger=None):
36
+ """Log the errors using the provided logger or the default logger.
37
+
38
+ :param logger (logging.Logger, optional): Logger instance to use. Defaults to None.
39
+ """
40
+ if logger is None:
41
+ logger = current_app.logger
42
+ for error in self.errors:
43
+ logger.error(f"Error in entry {self.entry}: {error}")
44
+ if self.exc:
45
+ logger.error(f"Exception in entry {self.entry}: {self.exc}")
22
46
 
23
47
 
24
48
  class DataStream:
@@ -39,15 +63,10 @@ class DataStream:
39
63
  """Checks if an stream_entry should be filtered out (skipped)."""
40
64
  return False
41
65
 
42
- def process(self, *args, **kwargs):
43
- """Iterates over the entries.
44
-
45
- Uses the reader to get the raw entries and transforms them.
46
- It will iterate over the `StreamEntry` objects returned by
47
- the reader, apply the transformations and yield the result of
48
- writing it.
49
- """
50
- for stream_entry in self.read():
66
+ def process_batch(self, batch, write_many=False):
67
+ """Process a batch of entries."""
68
+ transformed_entries = []
69
+ for stream_entry in batch:
51
70
  if stream_entry.errors:
52
71
  yield stream_entry # reading errors
53
72
  else:
@@ -58,7 +77,31 @@ class DataStream:
58
77
  transformed_entry.filtered = True
59
78
  yield transformed_entry
60
79
  else:
61
- yield self.write(transformed_entry)
80
+ transformed_entries.append(transformed_entry)
81
+ if transformed_entries:
82
+ if write_many:
83
+ yield from self.batch_write(transformed_entries)
84
+ else:
85
+ yield from (self.write(entry) for entry in transformed_entries)
86
+
87
+ def process(self, batch_size=100, write_many=False, *args, **kwargs):
88
+ """Iterates over the entries.
89
+
90
+ Uses the reader to get the raw entries and transforms them.
91
+ It will iterate over the `StreamEntry` objects returned by
92
+ the reader, apply the transformations and yield the result of
93
+ writing it.
94
+ """
95
+ batch = []
96
+ for stream_entry in self.read():
97
+ batch.append(stream_entry)
98
+ if len(batch) >= batch_size:
99
+ yield from self.process_batch(batch, write_many=write_many)
100
+ batch = []
101
+
102
+ # Process any remaining entries in the last batch
103
+ if batch:
104
+ yield from self.process_batch(batch, write_many=write_many)
62
105
 
63
106
  def read(self):
64
107
  """Recursively read the entries."""
@@ -107,6 +150,11 @@ class DataStream:
107
150
 
108
151
  return stream_entry
109
152
 
153
+ def batch_write(self, stream_entries, *args, **kwargs):
154
+ """Apply the transformations to an stream_entry. Errors are handler in the service layer."""
155
+ for writer in self._writers:
156
+ yield from writer.write_many(stream_entries)
157
+
110
158
  def total(self, *args, **kwargs):
111
159
  """The total of entries obtained from the origin."""
112
160
  raise NotImplementedError()
@@ -21,6 +21,7 @@ from json.decoder import JSONDecodeError
21
21
  import requests
22
22
  import yaml
23
23
  from lxml import etree
24
+ from lxml.html import fromstring
24
25
  from lxml.html import parse as html_parse
25
26
 
26
27
  from .errors import ReaderError
@@ -226,8 +227,13 @@ class XMLReader(BaseReader):
226
227
  def _iter(self, fp, *args, **kwargs):
227
228
  """Read and parse an XML file to dict."""
228
229
  # NOTE: We parse HTML, to skip XML validation and strip XML namespaces
229
- xml_tree = html_parse(fp).getroot()
230
- record = etree_to_dict(xml_tree)["html"]["body"].get("record")
230
+ record = None
231
+ try:
232
+ xml_tree = fromstring(fp)
233
+ record = etree_to_dict(xml_tree).get("record")
234
+ except Exception as e:
235
+ xml_tree = html_parse(fp).getroot()
236
+ record = etree_to_dict(xml_tree)["html"]["body"].get("record")
231
237
 
232
238
  if not record:
233
239
  raise ReaderError(f"Record not found in XML entry.")
@@ -15,11 +15,23 @@ from ..datastreams.factories import WriterFactory
15
15
 
16
16
 
17
17
  @shared_task(ignore_result=True)
18
- def write_entry(writer, entry):
18
+ def write_entry(writer_config, entry):
19
19
  """Write an entry.
20
20
 
21
21
  :param writer: writer configuration as accepted by the WriterFactory.
22
22
  :param entry: dictionary, StreamEntry is not serializable.
23
23
  """
24
- writer = WriterFactory.create(config=writer)
24
+ writer = WriterFactory.create(config=writer_config)
25
25
  writer.write(StreamEntry(entry))
26
+
27
+
28
+ @shared_task(ignore_result=True)
29
+ def write_many_entry(writer_config, entries):
30
+ """Write many entries.
31
+
32
+ :param writer: writer configuration as accepted by the WriterFactory.
33
+ :param entry: lisf ot dictionaries, StreamEntry is not serializable.
34
+ """
35
+ writer = WriterFactory.create(config=writer_config)
36
+ stream_entries = [StreamEntry(entry) for entry in entries]
37
+ writer.write_many(stream_entries)