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.
- invenio-vocabularies-4.3.0/.github/workflows/tests.yml +40 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/CHANGES.rst +6 -0
- {invenio-vocabularies-4.2.0/invenio_vocabularies.egg-info → invenio-vocabularies-4.3.0}/PKG-INFO +8 -1
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/__init__.py +1 -1
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/cli.py +12 -3
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/config.py +13 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/datastreams.py +1 -1
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/datastreams.py +1 -1
- invenio-vocabularies-4.3.0/invenio_vocabularies/contrib/names/datastreams.py +288 -0
- invenio-vocabularies-4.3.0/invenio_vocabularies/contrib/names/s3client.py +44 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/datastreams.py +61 -13
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/readers.py +8 -2
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/tasks.py +14 -2
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/writers.py +53 -2
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/custom_fields/subject.py +1 -1
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/subjects.html +1 -1
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0/invenio_vocabularies.egg-info}/PKG-INFO +8 -1
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/SOURCES.txt +1 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/requires.txt +4 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/setup.cfg +3 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_datastreams.py +38 -3
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/conftest.py +8 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_datastreams.py +10 -9
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_datastreams_tasks.py +14 -2
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_tasks_resources.py +5 -1
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/test_cli.py +1 -2
- invenio-vocabularies-4.2.0/.github/workflows/tests.yml +0 -89
- invenio-vocabularies-4.2.0/invenio_vocabularies/contrib/names/datastreams.py +0 -130
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.dockerignore +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.editorconfig +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.git-blame-ignore-revs +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.github/workflows/i18n-pull.yml +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.github/workflows/i18n-push.yml +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.github/workflows/pypi-publish.yml +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/.tx/config +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/AUTHORS.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/CONTRIBUTING.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/INSTALL.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/LICENSE +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/MANIFEST.in +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/README.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/babel.ini +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/Makefile +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/api.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/authors.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/changes.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/conf.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/configuration.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/contributing.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/index.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/installation.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/license.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/make.bat +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/requirements.txt +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/docs/usage.rst +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/gen-migration.sh +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/administration/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/administration/views/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/administration/views/vocabularies.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/17c703ce1eb7_create_names_table.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/4a9a4fd235f8_create_vocabulary_schemes.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/4f365fced43f_create_vocabularies_tables.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/55a700f897b6_add_names_and_afiliations_pid_column.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/6312f33645c1_create_affiliations_table.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/676dd587542d_create_funders_vocabulary_table.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/8ff82dfb0be8_create_vocabularies_branch.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/alembic/e1146238edd3_create_awards_table.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/.eslintrc.yml +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/.prettierrc +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/index.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/package.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/contrib/index.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/js/invenio_vocabularies/src/index.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/i18next-scanner.config.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/i18next.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/messages/index.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/package.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/scripts/compileCatalog.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/assets/semantic-ui/translations/invenio_vocabularies/scripts/initCatalog.js +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/affiliations.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/config.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/facets.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/jsonschemas/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/jsonschemas/affiliations/affiliation-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v1/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/os-v2/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/v7/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/mappings/v7/affiliations/affiliation-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/resources.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/affiliations/services.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/awards.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/config.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/datastreams.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/jsonschemas/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/jsonschemas/awards/award-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/os-v1/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/os-v2/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/v7/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/mappings/v7/awards/award-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/resources.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/serializer.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/awards/services.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/common/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/common/ror/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/common/ror/datastreams.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/config.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/facets.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/funders.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/jsonschemas/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/jsonschemas/funders/funder-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/os-v1/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/os-v2/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/v7/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/mappings/v7/funders/funder-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/resources.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/serializer.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/funders/services.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/config.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/jsonschemas/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/jsonschemas/names/name-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/os-v1/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/os-v2/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/v7/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/mappings/v7/names/name-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/names.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/resources.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/names/services.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/config.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/facets.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/jsonschemas/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/jsonschemas/subjects/subject-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/os-v1/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/os-v2/__init__.py +0 -0
- {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
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/v7/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/mappings/v7/subjects/subject-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/resources.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/services.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/contrib/subjects/subjects.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/errors.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/factories.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/transformers.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/xml.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/ext.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/factories.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/fixtures.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/proxies.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/jsonschemas/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/jsonschemas/vocabularies/definitions-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/jsonschemas/vocabularies/vocabulary-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v1/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v1/vocabularies/vocabulary-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v2/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/os-v2/vocabularies/vocabulary-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/v7/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/mappings/v7/vocabularies/vocabulary-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/pidprovider.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/systemfields/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/systemfields/pid.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/records/systemfields/relations.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/config.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/resource.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/resources/serializer.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/components.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/config.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/custom_fields/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/custom_fields/vocabulary.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/facets.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/permissions.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/querystr.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/results.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/service.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/services/tasks.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabularies-list.html +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/templates/semantic-ui/invenio_vocabularies/vocabulary-details.html +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/af/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/af/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ar/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ar/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/bg/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/bg/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ca/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ca/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/cs/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/cs/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/da/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/da/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_AT/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_AT/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_DE/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/de_DE/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/el/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/el/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_AT/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_AT/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_HU/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/en_HU/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_CU/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_CU/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_MX/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/es_MX/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et_EE/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/et_EE/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa_IR/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fa_IR/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_CI/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_CI/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_FR/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/fr_FR/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/gl/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/gl/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hi_IN/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hi_IN/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hr/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hr/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu_HU/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/hu_HU/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/it/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/it/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ja/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ja/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ka/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ka/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/lt/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/lt/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/messages.pot +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ne/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ne/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/no/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/no/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pl/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pl/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pt/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/pt/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ro/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ro/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ru/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/ru/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/rw/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/rw/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sk/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sk/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv_SE/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/sv_SE/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/tr/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/tr/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk_UA/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/uk_UA/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_CN/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.mo +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/translations/zh_TW/LC_MESSAGES/messages.po +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/views.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/webpack.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/dependency_links.txt +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/entry_points.txt +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/not-zip-safe +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies.egg-info/top_level.txt +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/pyproject.toml +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/requirements-feature.txt +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/run-js-linter.sh +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/run-tests.sh +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/setup.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_datastreams.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_jsonschema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_resource.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/affiliations/test_affiliations_service.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_datastreams.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_jsonschema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_resource.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/awards/test_awards_service.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/common/ror/test_ror_datastreams.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_datastreams.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_jsonschema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_resource.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/funders/test_funders_service.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_jsonschema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_resource.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/names/test_names_service.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_facets.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_jsonschema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_resource.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/contrib/subjects/test_subjects_service.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/custom_fields/test_custom_fields.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_fixtures.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_readers.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_transformers.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/test_writers.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/datastreams/vocabularies.yaml +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/jsonschemas/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/jsonschemas/records/record-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v6/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v6/records/record-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v7/__init__.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/mappings/v7/records/record-v1.0.0.json +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/mock_module/models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_api.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_jsonschema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_models.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/records/test_relationship.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_resources_get.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_resources_l10n.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/resources/test_resources_search.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/conftest.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_labels.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_permissions.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_schema.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/services/test_service.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/test_alembic.py +0 -0
- {invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/tests/test_factory.py +0 -0
- {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)
|
{invenio-vocabularies-4.2.0/invenio_vocabularies.egg-info → invenio-vocabularies-4.3.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: invenio-vocabularies
|
|
3
|
-
Version: 4.
|
|
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
|
|
@@ -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
|
|
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
|
|
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(
|
|
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'."""
|
|
@@ -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-
|
|
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
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
230
|
-
|
|
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.")
|
{invenio-vocabularies-4.2.0 → invenio-vocabularies-4.3.0}/invenio_vocabularies/datastreams/tasks.py
RENAMED
|
@@ -15,11 +15,23 @@ from ..datastreams.factories import WriterFactory
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
@shared_task(ignore_result=True)
|
|
18
|
-
def write_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=
|
|
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)
|