From da66c649f01a91a785e4732318c62abcef8f4ce5 Mon Sep 17 00:00:00 2001 From: Peter Weber Date: Wed, 15 Nov 2023 08:37:54 +0100 Subject: [PATCH] user: uses invenio access profile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replaces invenio-userprofile by the invenio access profile. * Updates several packages. * Moves `login_user_via_session` fonction in the tests as some problems occurs when a session merge is called between this function and the http request. * Removes useless babel mock in the tests. * Moves username from the invenio userprofile to the main user database. * Adds a record constructor for a record `replace_refs` as it is not done anymore by invenio. * Adds tests to check the existance of `_updated` and `_created` in the document index. * Removes document types for elasticsearch operations. * Adds marshmalow schema for user profile. * Uses node 18 for the production images. * Updates dependencies for Flask2. * Corrects problems from newer modules. * Closes #3405. Co-Authored-by: Peter Weber Co-Authored-by: Johnny MarieĢthoz --- .../workflows/continuous-integration-test.yml | 8 +- .github/workflows/labeler.yml | 1 - Dockerfile.base | 12 +- data/users.json | 2 +- docs/conf.py | 2 +- poetry.lock | 2167 ++++++++++------- pyproject.toml | 91 +- rero_ils/accounts_views.py | 2 +- ...5cbcad66_migrate_obsolete_country_codes.py | 13 +- rero_ils/config.py | 46 +- rero_ils/filter.py | 2 +- rero_ils/jsonschemas/utils.py | 19 +- .../modules/acquisition/acq_accounts/api.py | 2 +- .../acquisition/acq_accounts/extensions.py | 2 +- .../acquisition/acq_order_lines/api.py | 2 +- .../acquisition/acq_order_lines/extensions.py | 2 +- .../modules/acquisition/acq_orders/api.py | 2 +- .../acq_receipt_lines/extensions.py | 2 +- rero_ils/modules/api.py | 79 +- rero_ils/modules/babel_extractors.py | 2 +- rero_ils/modules/cli/index.py | 20 +- .../dojson/contrib/jsontodc/model.py | 2 +- .../dojson/contrib/jsontomarc21/model.py | 2 +- rero_ils/modules/documents/dumpers/indexer.py | 6 + rero_ils/modules/documents/views.py | 2 +- .../modules/entities/remote_entities/sync.py | 1 + rero_ils/modules/entities/views.py | 6 +- rero_ils/modules/ext.py | 7 +- rero_ils/modules/holdings/api.py | 2 +- rero_ils/modules/ill_requests/api.py | 2 +- rero_ils/modules/ill_requests/forms.py | 12 +- rero_ils/modules/ill_requests/views.py | 2 +- rero_ils/modules/indexer_utils.py | 12 +- rero_ils/modules/item_types/api.py | 2 +- rero_ils/modules/items/api/circulation.py | 2 +- rero_ils/modules/items/api/record.py | 2 +- rero_ils/modules/libraries/api.py | 2 +- rero_ils/modules/loans/api.py | 4 +- rero_ils/modules/local_fields/api.py | 2 +- rero_ils/modules/locations/api.py | 2 +- rero_ils/modules/operation_logs/logs/api.py | 5 +- .../modules/patron_transactions/extensions.py | 2 +- rero_ils/modules/patron_transactions/utils.py | 2 +- rero_ils/modules/patron_types/api.py | 2 +- rero_ils/modules/patrons/api.py | 39 +- rero_ils/modules/patrons/cli.py | 51 +- rero_ils/modules/patrons/listener.py | 6 +- rero_ils/modules/patrons/schemas/json.py | 3 +- rero_ils/modules/patrons/tasks.py | 4 +- rero_ils/modules/patrons/utils.py | 39 + rero_ils/modules/patrons/views.py | 8 +- rero_ils/modules/selfcheck/admin.py | 2 +- rero_ils/modules/selfcheck/api.py | 4 +- rero_ils/modules/selfcheck/utils.py | 8 +- rero_ils/modules/stats/views.py | 10 +- rero_ils/modules/tasks.py | 6 +- rero_ils/modules/templates/schemas/json.py | 2 +- rero_ils/modules/users/api.py | 123 +- .../users/jsonschemas/users/user-v0.0.1.json | 22 +- rero_ils/modules/users/schemas.py | 63 + rero_ils/modules/utils.py | 4 +- rero_ils/modules/vendors/api.py | 2 +- rero_ils/modules/views.py | 7 +- rero_ils/theme/menus.py | 2 +- .../security/email/reset_instructions.html | 4 +- .../security/email/reset_instructions.txt | 4 +- .../security/email/reset_notice.html | 4 +- .../templates/security/email/reset_notice.txt | 4 +- rero_ils/utils.py | 69 +- scripts/setup | 4 + scripts/test | 48 +- .../circulation/test_actions_views_checkin.py | 4 +- .../test_actions_views_extend_loan_request.py | 2 +- tests/api/conftest.py | 14 +- tests/api/items/test_items_rest.py | 2 +- tests/api/items/test_items_serializer.py | 11 - tests/api/loans/test_loans_rest.py | 4 +- tests/api/loans/test_loans_rest_views.py | 2 +- .../notifications/test_notifications_rest.py | 4 +- .../test_operation_logs_rest.py | 2 +- tests/api/patrons/test_patrons_marshmallow.py | 4 +- tests/api/patrons/test_patrons_rest.py | 2 +- tests/api/stats/conftest.py | 2 +- tests/api/test_serializers.py | 4 +- tests/api/test_translations.py | 17 +- tests/api/test_user_authentication.py | 2 +- tests/api/users/test_users_rest.py | 11 - tests/conftest.py | 4 +- tests/data/data.json | 1 - .../test_acq_accounts_jsonresolver.py | 4 +- .../acq_accounts/test_acq_accounts_mapping.py | 2 +- .../test_acq_invoices_jsonresolver.py | 4 +- .../test_acq_order_lines_jsonresolver.py | 4 +- .../test_acq_orders_jsonresolver.py | 4 +- .../ui/acq_orders/test_acq_orders_mapping.py | 2 +- .../test_acq_receipt_lines_jsonresolver.py | 4 +- .../test_acq_receipt_lines_mapping.py | 9 +- .../test_acq_receipts_jsonresolver.py | 4 +- .../acq_receipts/test_acq_receipts_mapping.py | 2 +- tests/ui/budgets/test_budgets_jsonresolver.py | 4 +- tests/ui/budgets/test_budgets_mapping.py | 4 +- .../collections/test_collections_mapping.py | 2 +- tests/ui/conftest.py | 37 +- tests/ui/documents/test_documents_api.py | 5 + .../documents/test_documents_jsonresolver.py | 4 +- tests/ui/documents/test_documents_mapping.py | 8 +- .../test_local_entities_jsonresolver.py | 4 +- tests/ui/holdings/test_holdings_api.py | 2 +- .../ui/holdings/test_holdings_jsonresolver.py | 4 +- tests/ui/holdings/test_holdings_mapping.py | 2 +- .../test_ill_requests_jsonresolver.py | 4 +- .../test_item_types_jsonresolver.py | 4 +- .../ui/item_types/test_item_types_mapping.py | 2 +- tests/ui/items/test_items_jsonresolver.py | 4 +- .../libraries/test_libraries_jsonresolver.py | 4 +- tests/ui/libraries/test_libraries_mapping.py | 2 +- tests/ui/loans/test_loans_jsonresolver.py | 4 +- .../test_local_fields_jsonresolver.py | 4 +- .../locations/test_locations_jsonresolver.py | 4 +- tests/ui/locations/test_locations_mapping.py | 2 +- .../test_organisations_jsonresolver.py | 4 +- ..._patron_transaction_events_jsonresolver.py | 4 +- .../test_patron_transactions_jsonresolver.py | 4 +- .../test_patron_types_jsonresolver.py | 4 +- tests/ui/patrons/test_patrons_api.py | 11 +- tests/ui/patrons/test_patrons_jsonresolver.py | 4 +- tests/ui/patrons/test_patrons_mapping.py | 2 +- tests/ui/stats/test_stats_report_n_patrons.py | 2 +- .../stats_cfg/test_stats_cfg_jsonresolver.py | 4 +- tests/ui/templates/test_templates_api.py | 2 +- tests/ui/templates/test_templates_mapping.py | 2 +- tests/ui/test_indexer_utils.py | 8 +- tests/ui/users/test_forms.py | 7 +- tests/ui/users/test_schema.py | 44 + tests/ui/vendors/test_vendors_jsonresolver.py | 4 +- tests/ui/vendors/test_vendors_mapping.py | 2 +- tests/unit/conftest.py | 108 +- tests/unit/documents/test_documents_dojson.py | 6 +- .../documents/test_documents_dojson_dc.py | 2 +- tests/unit/test_patrons_jsonschema.py | 4 +- tests/unit/test_users_jsonschema.py | 1 - tests/utils.py | 50 +- 142 files changed, 1940 insertions(+), 1683 deletions(-) create mode 100644 rero_ils/modules/users/schemas.py create mode 100644 tests/ui/users/test_schema.py diff --git a/.github/workflows/continuous-integration-test.yml b/.github/workflows/continuous-integration-test.yml index a9be85155d..c5a5af1167 100644 --- a/.github/workflows/continuous-integration-test.yml +++ b/.github/workflows/continuous-integration-test.yml @@ -13,18 +13,18 @@ jobs: # with: # access_token: ${{ github.token }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: '14' + node-version: '16' - name: Docker compose up run: docker-compose up -d - name: Set up Python 3.9 - uses: actions/setup-python@v3 + uses: actions/setup-python@v4 with: python-version: 3.9 diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 301fa6c309..b24f1e51cc 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,7 +1,6 @@ name: "PR Labeler" on: - pull_request_target - jobs: triage: runs-on: ubuntu-latest diff --git a/Dockerfile.base b/Dockerfile.base index 28852babc2..aa8225ca1f 100644 --- a/Dockerfile.base +++ b/Dockerfile.base @@ -25,13 +25,11 @@ RUN pip install --upgrade setuptools wheel pip poetry # # uwsgi uwsgitop uwsgi-tools # Install Node -RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - -RUN apt-get install --no-install-recommends -y nodejs && rm -rf /var/lib/apt/lists/* - -# RUN npm update - -# RUN python -m site -# RUN python -m site --user-site +RUN apt-get update && apt-get install -y ca-certificates curl gnupg +RUN mkdir -p /etc/apt/keyrings +RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg +RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list +RUN apt-get update && apt-get install nodejs -y # Install Invenio ENV WORKING_DIR=/invenio diff --git a/data/users.json b/data/users.json index 19a568c201..48616c0107 100644 --- a/data/users.json +++ b/data/users.json @@ -751,7 +751,7 @@ }, { "pid": "30", - "birth_date": "1800-01-01", + "birth_date": "1900-01-01", "city": "no indication", "email": "thelibrarian@example.org", "username": "thelibrarian", diff --git a/docs/conf.py b/docs/conf.py index 27f582b47e..4cf0bfdea2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -81,7 +81,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'english' # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: diff --git a/poetry.lock b/poetry.lock index 5f2bfdfd02..eaefbf5a38 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -13,13 +13,13 @@ files = [ [[package]] name = "alembic" -version = "1.12.1" +version = "1.10.4" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.7" files = [ - {file = "alembic-1.12.1-py3-none-any.whl", hash = "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb"}, - {file = "alembic-1.12.1.tar.gz", hash = "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"}, + {file = "alembic-1.10.4-py3-none-any.whl", hash = "sha256:43942c3d4bf2620c466b91c0f4fca136fe51ae972394a0cc8b90810d664e4f5c"}, + {file = "alembic-1.10.4.tar.gz", hash = "sha256:295b54bbb92c4008ab6a7dcd1e227e668416d6f84b98b3c4446a2bc6214a556b"}, ] [package.dependencies] @@ -48,7 +48,7 @@ vine = ">=5.0.0,<6.0.0" name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -optional = false +optional = true python-versions = "*" files = [ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, @@ -103,16 +103,6 @@ files = [ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - [[package]] name = "attrs" version = "23.1.0" @@ -239,13 +229,13 @@ files = [ [[package]] name = "bootstrap-flask" -version = "2.3.2" +version = "2.3.3" description = "Bootstrap 4 & 5 helper for your Flask projects." optional = false python-versions = "*" files = [ - {file = "Bootstrap-Flask-2.3.2.tar.gz", hash = "sha256:f94ba6309d61c058fb5fb581bc3344cef389a6da69cf655330d101fa4a161db7"}, - {file = "Bootstrap_Flask-2.3.2-py2.py3-none-any.whl", hash = "sha256:2505257518c2efa1df645b5d87b4dc62dd28f6b3c04130ba82d735890f307715"}, + {file = "Bootstrap-Flask-2.3.3.tar.gz", hash = "sha256:8c40d846e12af0e66d673bcb883d8344fd5ea95244f54e5b119e680e000ccf49"}, + {file = "Bootstrap_Flask-2.3.3-py2.py3-none-any.whl", hash = "sha256:4c3d1f1b8ee19081dfc80e03aba5cb19cd92a8d54ba0ba98cee69acffded91d0"}, ] [package.dependencies] @@ -278,41 +268,40 @@ virtualenv = ["virtualenv (>=20.0.35)"] [[package]] name = "cachelib" -version = "0.9.0" +version = "0.10.2" description = "A collection of cache libraries in the same API interface." optional = false python-versions = ">=3.7" files = [ - {file = "cachelib-0.9.0-py3-none-any.whl", hash = "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3"}, - {file = "cachelib-0.9.0.tar.gz", hash = "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5"}, + {file = "cachelib-0.10.2-py3-none-any.whl", hash = "sha256:42d49f2fad9310dd946d7be73d46776bcd4d5fde4f49ad210cfdd447fbdfc346"}, + {file = "cachelib-0.10.2.tar.gz", hash = "sha256:593faeee62a7c037d50fc835617a01b887503f972fb52b188ae7e50e9cb69740"}, ] [[package]] name = "celery" -version = "5.1.2" +version = "5.2.7" description = "Distributed Task Queue." optional = false -python-versions = ">=3.6," +python-versions = ">=3.7" files = [ - {file = "celery-5.1.2-py3-none-any.whl", hash = "sha256:9dab2170b4038f7bf10ef2861dbf486ddf1d20592290a1040f7b7a1259705d42"}, - {file = "celery-5.1.2.tar.gz", hash = "sha256:8d9a3de9162965e97f8e8cc584c67aad83b3f7a267584fa47701ed11c3e0d4b0"}, + {file = "celery-5.2.7-py3-none-any.whl", hash = "sha256:138420c020cd58d6707e6257b6beda91fd39af7afde5d36c6334d175302c0e14"}, + {file = "celery-5.2.7.tar.gz", hash = "sha256:fafbd82934d30f8a004f81e8f7a062e31413a23d444be8ee3326553915958c6d"}, ] [package.dependencies] billiard = ">=3.6.4.0,<4.0" -click = ">=7.0,<8.0" +click = ">=8.0.3,<9.0" click-didyoumean = ">=0.0.3" click-plugins = ">=1.1.1" -click-repl = ">=0.1.6" -kombu = ">=5.1.0,<6.0" -pytz = ">0.0-dev" -setuptools = "*" +click-repl = ">=0.2.0" +kombu = ">=5.2.3,<6.0" +pytz = ">=2021.3" vine = ">=5.0.0,<6.0" [package.extras] arangodb = ["pyArango (>=1.3.2)"] auth = ["cryptography"] -azureblockblob = ["azure-storage-blob (==12.6.0)"] +azureblockblob = ["azure-storage-blob (==12.9.0)"] brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] cassandra = ["cassandra-driver (<3.21.0)"] consul = ["python-consul2"] @@ -322,21 +311,21 @@ couchdb = ["pycouchdb"] django = ["Django (>=1.11)"] dynamodb = ["boto3 (>=1.9.178)"] elasticsearch = ["elasticsearch"] -eventlet = ["eventlet (>=0.26.1)"] -gevent = ["gevent (>=1.0.0)"] +eventlet = ["eventlet (>=0.32.0)"] +gevent = ["gevent (>=1.5.0)"] librabbitmq = ["librabbitmq (>=1.5.0)"] memcache = ["pylibmc"] -mongodb = ["pymongo[srv] (>=3.3.0)"] +mongodb = ["pymongo[srv] (>=3.11.1)"] msgpack = ["msgpack"] pymemcache = ["python-memcached"] pyro = ["pyro4"] pytest = ["pytest-celery"] -redis = ["redis (>=3.2.0)"] +redis = ["redis (>=3.4.1,!=4.0.0,!=4.0.1)"] s3 = ["boto3 (>=1.9.125)"] slmq = ["softlayer-messaging (>=1.0.3)"] solar = ["ephem"] sqlalchemy = ["sqlalchemy"] -sqs = ["boto3 (>=1.9.125)", "pycurl (==7.43.0.5)"] +sqs = ["kombu[sqs]"] tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=1.3.1)"] @@ -344,13 +333,13 @@ zstd = ["zstandard"] [[package]] name = "certifi" -version = "2023.7.22" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] @@ -600,15 +589,18 @@ files = [ [[package]] name = "click" -version = "7.1.2" +version = "8.0.4" description = "Composable command line interface toolkit" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" files = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, + {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, + {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, ] +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "click-didyoumean" version = "0.3.0" @@ -738,34 +730,34 @@ toml = ["toml"] [[package]] name = "cryptography" -version = "39.0.2" +version = "41.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"}, - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0"}, - {file = "cryptography-39.0.2-cp36-abi3-win32.whl", hash = "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480"}, - {file = "cryptography-39.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3"}, - {file = "cryptography-39.0.2.tar.gz", hash = "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, + {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, + {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, + {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, + {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, + {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, + {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, + {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, + {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, + {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, ] [package.dependencies] @@ -774,22 +766,22 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"] -sdist = ["setuptools-rust (>=0.11.4)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -tox = ["tox"] [[package]] name = "dateparser" -version = "1.1.8" +version = "1.2.0" description = "Date parsing library designed to parse dates from HTML pages" optional = false python-versions = ">=3.7" files = [ - {file = "dateparser-1.1.8-py2.py3-none-any.whl", hash = "sha256:070b29b5bbf4b1ec2cd51c96ea040dc68a614de703910a91ad1abba18f9f379f"}, - {file = "dateparser-1.1.8.tar.gz", hash = "sha256:86b8b7517efcc558f085a142cdb7620f0921543fcabdb538c8a4c4001d8178e3"}, + {file = "dateparser-1.2.0-py2.py3-none-any.whl", hash = "sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830"}, + {file = "dateparser-1.2.0.tar.gz", hash = "sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30"}, ] [package.dependencies] @@ -850,6 +842,23 @@ ordered-set = ">=4.1.0,<4.2.0" [package.extras] cli = ["clevercsv (==0.7.1)", "click (==8.0.3)", "pyyaml (==5.4.1)", "toml (==0.10.2)"] +[[package]] +name = "dictdiffer" +version = "0.9.0" +description = "Dictdiffer is a library that helps you to diff and patch dictionaries." +optional = false +python-versions = "*" +files = [ + {file = "dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595"}, + {file = "dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578"}, +] + +[package.extras] +all = ["Sphinx (>=3)", "check-manifest (>=0.42)", "mock (>=1.3.0)", "numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "numpy (>=1.20.0)", "pytest (==5.4.3)", "pytest (>=6)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=3)", "sphinx-rtd-theme (>=0.2)", "tox (>=3.7.0)"] +docs = ["Sphinx (>=3)", "sphinx-rtd-theme (>=0.2)"] +numpy = ["numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "numpy (>=1.20.0)"] +tests = ["check-manifest (>=0.42)", "mock (>=1.3.0)", "pytest (==5.4.3)", "pytest (>=6)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=3)", "tox (>=3.7.0)"] + [[package]] name = "dnspython" version = "2.4.2" @@ -1005,13 +1014,13 @@ idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -1033,24 +1042,24 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "flask" -version = "1.1.4" +version = "2.2.5" description = "A simple framework for building complex web applications." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, - {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, + {file = "Flask-2.2.5-py3-none-any.whl", hash = "sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"}, + {file = "Flask-2.2.5.tar.gz", hash = "sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0"}, ] [package.dependencies] -click = ">=5.1,<8.0" -itsdangerous = ">=0.24,<2.0" -Jinja2 = ">=2.10.1,<3.0" -Werkzeug = ">=0.15,<2.0" +click = ">=8.0" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.0" +Jinja2 = ">=3.0" +Werkzeug = ">=2.2.2" [package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] -docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] +async = ["asgiref (>=3.2)"] dotenv = ["python-dotenv"] [[package]] @@ -1090,21 +1099,21 @@ Flask-SQLAlchemy = "*" SQLAlchemy = "*" [[package]] -name = "flask-babelex" -version = "0.9.4" -description = "Adds i18n/l10n support to Flask applications" +name = "flask-babel" +version = "4.0.0" +description = "Adds i18n/l10n support for Flask applications." optional = false -python-versions = "*" +python-versions = ">=3.8,<4.0" files = [ - {file = "Flask-BabelEx-0.9.4.tar.gz", hash = "sha256:39a59ccee9386a9d52d80b9101224402036aedc2c7873b11deef6e4e21cace27"}, - {file = "Flask_BabelEx-0.9.4-py3-none-any.whl", hash = "sha256:f744d0557cb04cafed733cfa96e7373b46263d4cf79a2c5988c65085f360d873"}, + {file = "flask_babel-4.0.0-py3-none-any.whl", hash = "sha256:638194cf91f8b301380f36d70e2034c77ee25b98cb5d80a1626820df9a6d4625"}, + {file = "flask_babel-4.0.0.tar.gz", hash = "sha256:dbeab4027a3f4a87678a11686496e98e1492eb793cbdd77ab50f4e9a2602a593"}, ] [package.dependencies] -Babel = ">=1.0" -Flask = "*" -Jinja2 = ">=2.5" -speaklater = ">=1.2" +Babel = ">=2.12" +Flask = ">=2.0" +Jinja2 = ">=3.1" +pytz = ">=2022.7" [[package]] name = "flask-breadcrumbs" @@ -1129,36 +1138,36 @@ tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.3.11)", "moc [[package]] name = "flask-caching" -version = "2.1.0" +version = "2.0.1" description = "Adds caching support to Flask applications." optional = false python-versions = ">=3.7" files = [ - {file = "Flask-Caching-2.1.0.tar.gz", hash = "sha256:b7500c145135836a952e3de3a80881d9654e327a29c852c9265607f5c449235c"}, - {file = "Flask_Caching-2.1.0-py3-none-any.whl", hash = "sha256:f02645a629a8c89800d96dc8f690a574a0d49dcd66c7536badc6d362ba46b716"}, + {file = "Flask-Caching-2.0.1.tar.gz", hash = "sha256:10df200a03f032af60077befe41779dd94898b67c82040d34e87210b71ba2638"}, + {file = "Flask_Caching-2.0.1-py3-none-any.whl", hash = "sha256:703df847cbe904d8ddffd5f5fb320e236a31cb7bebac4a93d6b1701dd16dbf37"}, ] [package.dependencies] -cachelib = ">=0.9.0,<0.10.0" -Flask = "*" +cachelib = ">=0.9.0" +Flask = "<3" [[package]] name = "flask-celeryext" -version = "0.4.3" +version = "0.5.0" description = "\"Flask-CeleryExt is a simple integration layer between Celery and Flask.\"" optional = false python-versions = ">=3.6" files = [ - {file = "Flask-CeleryExt-0.4.3.tar.gz", hash = "sha256:1ad8e84cabffef8d38461e700d8fd1e8389367e6eec532a024d3c294f5097766"}, - {file = "Flask_CeleryExt-0.4.3-py2.py3-none-any.whl", hash = "sha256:aa05cc9d061ce0abe1f2000ab1e430f25a8bd2cc7d5e6ff35cb74063914cc88c"}, + {file = "Flask-CeleryExt-0.5.0.tar.gz", hash = "sha256:a23a0293bbe8e134233119e003e83ce9fe4f2caaf3fc23d91e09d252c7beb6e5"}, + {file = "Flask_CeleryExt-0.5.0-py2.py3-none-any.whl", hash = "sha256:9c4b5c3c157923c86f3c92980bf3a58d0949a2dbf5d3a14b87135bb20d19b71b"}, ] [package.dependencies] celery = ">=5.1.0" -Flask = ">=1.1" +Flask = ">=2.2.0" [package.extras] -tests = ["Sphinx (>=4.2.0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", "docker-services-cli (>=0.4.0)", "msgpack-python (>=0.5.6)", "pytest (>=6,<7)", "pytest-black (>=0.3.12)", "pytest-cov (>=3.0.0)", "pytest-flask (>=1.2.0)", "pytest-isort (>=3.0.0)", "pytest-mock (>=2.0.0)", "pytest-pydocstyle (>=2.2.0)", "redis (>=4.1.4)"] +tests = ["Sphinx (>=4.2.0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", "docker-services-cli (>=0.4.0)", "importlib-metadata (<5)", "msgpack-python (>=0.5.6)", "pytest (>=6,<7.2.0)", "pytest-black (>=0.3.12)", "pytest-cov (>=3.0.0)", "pytest-flask (>=1.2.0)", "pytest-isort (>=3.0.0)", "pytest-mock (>=2.0.0)", "pytest-pydocstyle (>=2.2.0)", "redis (>=4.1.4)"] [[package]] name = "flask-collect-invenio" @@ -1245,16 +1254,18 @@ six = ">=1.4.1" [[package]] name = "flask-login" -version = "0.4.1" -description = "User session management for Flask" +version = "0.6.3" +description = "User authentication and session management for Flask." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "Flask-Login-0.4.1.tar.gz", hash = "sha256:c815c1ac7b3e35e2081685e389a665f2c74d7e077cb93cecabaea352da4752ec"}, + {file = "Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333"}, + {file = "Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d"}, ] [package.dependencies] -Flask = "*" +Flask = ">=1.0.4" +Werkzeug = ">=1.0.1" [[package]] name = "flask-mail" @@ -1323,30 +1334,30 @@ blinker = "*" Flask = "*" [[package]] -name = "flask-security" -version = "3.0.0" -description = "Simple security for Flask apps." +name = "flask-security-invenio" +version = "3.3.3" +description = "\"Simple security for Flask apps.\"" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "Flask-Security-3.0.0.tar.gz", hash = "sha256:d61daa5f5a48f89f30f50555872bdf581b2c65804668b0313345cd7beff26432"}, - {file = "Flask_Security-3.0.0-py2.py3-none-any.whl", hash = "sha256:ef837c03558db41335c8dabd16ae4977af0a5ef0c2cdecf738e33ef5202ce489"}, + {file = "Flask-Security-Invenio-3.3.3.tar.gz", hash = "sha256:f638c77f8e56a5f56ad5a133ae87b4751226aec9aa077e08b12f12be4d1e6798"}, + {file = "Flask_Security_Invenio-3.3.3-py2.py3-none-any.whl", hash = "sha256:b27aecd4c2294287d2c3341dfdcd0d5a431fcc2af7d77f86e8adfbb98728ab71"}, ] [package.dependencies] -Flask = ">=0.11" -Flask-BabelEx = ">=0.9.3" -Flask-Login = ">=0.3.0" -Flask-Mail = ">=0.7.3" -Flask-Principal = ">=0.3.3" -Flask-WTF = ">=0.13.1" -itsdangerous = ">=0.21" +email-validator = ">=1.0.5" +Flask = ">=1.1.4,<2.3.0" +Flask-Babel = ">=2.0.0" +Flask-Login = ">=0.4.1" +Flask-Mail = ">=0.9.1" +Flask-Principal = ">=0.4.0" +Flask-WTF = ">=1.1.0" +itsdangerous = ">=2.0" passlib = ">=1.7" +speaklater = ">=1.3" [package.extras] -all = ["Flask-CLI (>=0.4.0)", "Flask-CLI (>=0.4.0)", "Flask-Mongoengine (>=0.7.0)", "Flask-Mongoengine (>=0.7.0)", "Flask-Peewee (>=0.6.5)", "Flask-Peewee (>=0.6.5)", "Flask-SQLAlchemy (>=1.0)", "Flask-SQLAlchemy (>=1.0)", "Flask-Sphinx-Themes (>=1.0.1)", "Flask-Sphinx-Themes (>=1.0.1)", "Sphinx (>=1.4.2)", "Sphinx (>=1.4.2)", "bcrypt (>=1.0.2)", "bcrypt (>=1.0.2)", "check-manifest (>=0.25)", "check-manifest (>=0.25)", "coverage (>=4.0)", "coverage (>=4.0)", "isort (>=4.2.2)", "isort (>=4.2.2)", "mock (>=1.3.0)", "mock (>=1.3.0)", "mongoengine (>=0.10.0)", "mongoengine (>=0.10.0)", "pony (>=0.7.1)", "pony (>=0.7.1)", "pydocstyle (>=1.0.0)", "pydocstyle (>=1.0.0)", "pytest (>=3.0.5)", "pytest (>=3.0.5)", "pytest-cache (>=1.0)", "pytest-cache (>=1.0)", "pytest-cov (>=2.4.0)", "pytest-cov (>=2.4.0)", "pytest-flakes (>=1.0.1)", "pytest-flakes (>=1.0.1)", "pytest-pep8 (>=1.0.6)", "pytest-pep8 (>=1.0.6)", "pytest-translations (>=1.0.4)", "pytest-translations (>=1.0.4)", "sqlalchemy (>=0.8.0)", "sqlalchemy (>=0.8.0)"] -docs = ["Flask-Sphinx-Themes (>=1.0.1)", "Sphinx (>=1.4.2)"] -tests = ["Flask-CLI (>=0.4.0)", "Flask-Mongoengine (>=0.7.0)", "Flask-Peewee (>=0.6.5)", "Flask-SQLAlchemy (>=1.0)", "bcrypt (>=1.0.2)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "mongoengine (>=0.10.0)", "pony (>=0.7.1)", "pydocstyle (>=1.0.0)", "pytest (>=3.0.5)", "pytest-cache (>=1.0)", "pytest-cov (>=2.4.0)", "pytest-flakes (>=1.0.1)", "pytest-pep8 (>=1.0.6)", "pytest-translations (>=1.0.4)", "sqlalchemy (>=0.8.0)"] +tests = ["Flask-SQLAlchemy (>=2.5.1)", "Flask-Sphinx-Themes (>=1.0.2)", "Werkzeug (>=1.0.1,<2.3.0)", "bcrypt (>=3.1.0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", "mock (>=1.3.0)", "msgcheck (>=2.9)", "pytest (>=6,<7)", "pytest-cov (>=2.10.1)", "pytest-flask (>=1.0.0)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=4.2.0,<5)"] [[package]] name = "flask-shell-ipython" @@ -1415,56 +1426,61 @@ tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.3.21)", "pyd [[package]] name = "flask-wiki" -version = "0.2.2" +version = "0.3.1" description = "Simple file-based wiki for Flask" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.8.0,<4.0.0" files = [ - {file = "flask-wiki-0.2.2.tar.gz", hash = "sha256:e7b8a6aec7e66919b5539739a3075620ea9c3196cedb8404d561ab61e8b6a10d"}, - {file = "flask_wiki-0.2.2-py3-none-any.whl", hash = "sha256:da48e8a0425656d74566104c4827b81af7f7df3816032c566885d69be94224fd"}, + {file = "flask_wiki-0.3.1-py3-none-any.whl", hash = "sha256:5710466475a7498c07a0a9e1074179bc72c21570bbafada175a59f6a3521453f"}, + {file = "flask_wiki-0.3.1.tar.gz", hash = "sha256:19bf4e7c75eb1681f089121eb54b23d1c4bdb70637122d2683ea1b3ef5c20144"}, ] [package.dependencies] babel = ">=2.9.1" +beautifulsoup4 = "<5.0.0" bootstrap-flask = "*" -flask = "<2.0.0" -flask-babelex = "*" +click = "<9.0.0" +flask = "<3.0.0" +flask-babel = ">=3.0.0" flask-wtf = "*" -jinja2 = ">=2.11.3" -Markdown = "<3.4" -pip = ">=21.1" -pygments = ">=2.7.4" -werkzeug = ">=0.15,<2.0" +jinja2 = ">=3.0.0" +markdown = "<3.4.0" +py = "<2.0.0" +pytest = "<8.0.0" +pytest-pycodestyle = "<3.0.0" +pytest-pydocstyle = "<3.0.0" +werkzeug = ">=0.15" +whoosh = "<3.0.0" wtforms = "<3.0.0" [[package]] name = "flask-wtf" -version = "0.15.1" -description = "Simple integration of Flask and WTForms." +version = "1.2.1" +description = "Form rendering, validation, and CSRF protection for Flask with WTForms." optional = false -python-versions = ">= 3.6" +python-versions = ">=3.8" files = [ - {file = "Flask-WTF-0.15.1.tar.gz", hash = "sha256:ff177185f891302dc253437fe63081e7a46a4e99aca61dfe086fb23e54fff2dc"}, - {file = "Flask_WTF-0.15.1-py2.py3-none-any.whl", hash = "sha256:6ff7af73458f182180906a37a783e290bdc8a3817fe4ad17227563137ca285bf"}, + {file = "flask_wtf-1.2.1-py3-none-any.whl", hash = "sha256:fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287"}, + {file = "flask_wtf-1.2.1.tar.gz", hash = "sha256:8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695"}, ] [package.dependencies] -Flask = "*" +flask = "*" itsdangerous = "*" -WTForms = "*" +wtforms = "*" [package.extras] email = ["email-validator"] [[package]] name = "freezegun" -version = "1.2.2" +version = "1.3.1" description = "Let your Python tests travel through time" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "freezegun-1.2.2-py3-none-any.whl", hash = "sha256:ea1b963b993cb9ea195adbd893a48d573fda951b0da64f60883d7e988b606c9f"}, - {file = "freezegun-1.2.2.tar.gz", hash = "sha256:cd22d1ba06941384410cd967d8a99d5ae2442f57dfafeff2fda5de8dc5c05446"}, + {file = "freezegun-1.3.1-py3-none-any.whl", hash = "sha256:065e77a12624d05531afa87ade12a0b9bdb53495c4573893252a055b545ce3ea"}, + {file = "freezegun-1.3.1.tar.gz", hash = "sha256:48984397b3b58ef5dfc645d6a304b0060f612bcecfdaaf45ce8aff0077a6cb6a"}, ] [package.dependencies] @@ -1472,17 +1488,17 @@ python-dateutil = ">=2.7" [[package]] name = "ftfy" -version = "6.1.1" +version = "6.1.3" description = "Fixes mojibake and other problems with Unicode, after the fact" optional = false -python-versions = ">=3.7,<4" +python-versions = ">=3.8,<4" files = [ - {file = "ftfy-6.1.1-py3-none-any.whl", hash = "sha256:0ffd33fce16b54cccaec78d6ec73d95ad370e5df5a25255c8966a6147bd667ca"}, - {file = "ftfy-6.1.1.tar.gz", hash = "sha256:bfc2019f84fcd851419152320a6375604a0f1459c281b5b199b2cd0d2e727f8f"}, + {file = "ftfy-6.1.3-py3-none-any.whl", hash = "sha256:e49c306c06a97f4986faa7a8740cfe3c13f3106e85bcec73eb629817e671557c"}, + {file = "ftfy-6.1.3.tar.gz", hash = "sha256:693274aead811cff24c1e8784165aa755cd2f6e442a5ec535c7d697f6422a422"}, ] [package.dependencies] -wcwidth = ">=0.2.5" +wcwidth = ">=0.2.12,<0.3.0" [[package]] name = "future" @@ -1494,15 +1510,106 @@ files = [ {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, ] +[[package]] +name = "github3-py" +version = "4.0.1" +description = "Python wrapper for the GitHub API(http://developer.github.com/v3)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "github3.py-4.0.1-py3-none-any.whl", hash = "sha256:a89af7de25650612d1da2f0609622bcdeb07ee8a45a1c06b2d16a05e4234e753"}, + {file = "github3.py-4.0.1.tar.gz", hash = "sha256:30d571076753efc389edc7f9aaef338a4fcb24b54d8968d5f39b1342f45ddd36"}, +] + +[package.dependencies] +pyjwt = {version = ">=2.3.0", extras = ["crypto"]} +python-dateutil = ">=2.6.0" +requests = ">=2.18" +uritemplate = ">=3.0.0" + +[package.extras] +dev = ["build", "github3-py[test]", "tox (>=3.1.3)", "twine", "wheel"] +test = ["betamax (>=0.5.1)", "betamax-matchers (>=0.3.0)", "pytest (>=7.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "greenlet" +version = "3.0.1" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, + {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, + {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, + {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, + {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, + {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, + {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, + {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, + {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, + {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, + {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, + {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, + {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, + {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, + {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, +] + +[package.extras] +docs = ["Sphinx"] +test = ["objgraph", "psutil"] + [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -1594,132 +1701,67 @@ infinity = ">=0.1.3" [package.extras] test = ["Pygments (>=1.2)", "flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] -[[package]] -name = "invenio" -version = "3.4.1" -description = "Invenio Digital Library Framework." -optional = false -python-versions = "*" -files = [ - {file = "invenio-3.4.1-py2.py3-none-any.whl", hash = "sha256:eddc4d9e8f0f8a1e2efada5a582c9b45d9fe3e49740051e2fe0fe8ec999f94f0"}, - {file = "invenio-3.4.1.tar.gz", hash = "sha256:d480e1847c681220624563c28f44a0bcc24eb7457e80b9594ff1c285c86bd69b"}, -] - -[package.dependencies] -invenio-access = {version = ">=1.4.1,<1.5.0", optional = true, markers = "extra == \"auth\""} -invenio-accounts = {version = ">=1.4.3,<1.5.0", optional = true, markers = "extra == \"auth\""} -invenio-admin = {version = ">=1.3.0,<1.4.0", optional = true, markers = "extra == \"base\""} -invenio-app = ">=1.3.1,<1.4.0" -invenio-assets = {version = ">=1.2.5,<1.3.0", optional = true, markers = "extra == \"base\""} -invenio-base = ">=1.2.4,<1.3.0" -invenio-cache = ">=1.1.0,<1.2.0" -invenio-celery = ">=1.2.2,<1.3.0" -invenio-config = ">=1.0.3,<1.1.0" -invenio-db = {version = ">=1.0.8,<1.1.0", extras = ["postgresql", "versioning"], optional = true, markers = "extra == \"postgresql\""} -invenio-formatter = {version = ">=1.1.0,<1.2.0", optional = true, markers = "extra == \"base\""} -invenio-i18n = ">=1.3.0,<1.4.0" -invenio-logging = {version = ">=1.3.0,<1.4.0", optional = true, markers = "extra == \"base\""} -invenio-mail = {version = ">=1.0.2,<1.1.0", optional = true, markers = "extra == \"base\""} -invenio-oauth2server = {version = ">=1.3.2,<1.4.0", optional = true, markers = "extra == \"auth\""} -invenio-oauthclient = {version = ">=1.4.0,<1.5.0", optional = true, markers = "extra == \"auth\""} -invenio-rest = {version = ">=1.2.3,<1.3.0", optional = true, markers = "extra == \"base\""} -invenio-search = {version = ">=1.4.1,<1.5.0", extras = ["elasticsearch7"], optional = true, markers = "extra == \"elasticsearch7\""} -invenio-theme = {version = ">=1.3.5,<1.4.0", optional = true, markers = "extra == \"base\""} -invenio-userprofiles = {version = ">=1.2.1,<1.3.0", optional = true, markers = "extra == \"auth\""} -pytest-invenio = {version = ">=1.4.0,<1.5.0", optional = true, markers = "extra == \"tests\""} -Sphinx = {version = ">=3,<4", optional = true, markers = "extra == \"docs\""} - -[package.extras] -all = ["Sphinx (>=3,<4)", "invenio-access (>=1.4.1,<1.5.0)", "invenio-accounts (>=1.4.3,<1.5.0)", "invenio-admin (>=1.3.0,<1.4.0)", "invenio-assets (>=1.2.5,<1.3.0)", "invenio-files-rest (>=1.2.0,<1.3.0)", "invenio-formatter (>=1.1.0,<1.2.0)", "invenio-iiif (>=1.1.0,<1.2.0)", "invenio-indexer (>=1.2.0,<1.3.0)", "invenio-jsonschemas (>=1.1.1,<1.2.0)", "invenio-logging (>=1.3.0,<1.4.0)", "invenio-mail (>=1.0.2,<1.1.0)", "invenio-oaiserver (>=1.2.0,<1.3.0)", "invenio-oauth2server (>=1.3.2,<1.4.0)", "invenio-oauthclient (>=1.4.0,<1.5.0)", "invenio-pidstore (>=1.2.1,<1.3.0)", "invenio-previewer (>=1.3.2,<1.4.0)", "invenio-records (>=1.4.0,<1.6.0)", "invenio-records-files (>=1.2.1,<1.3.0)", "invenio-records-rest (>=1.8.0,<1.9.0)", "invenio-records-ui (>=1.2.0,<1.3.0)", "invenio-rest (>=1.2.3,<1.3.0)", "invenio-search-ui (>=2.0.0,<2.1.0)", "invenio-theme (>=1.3.5,<1.4.0)", "invenio-userprofiles (>=1.2.1,<1.3.0)", "pytest-invenio (>=1.4.0,<1.5.0)"] -auth = ["invenio-access (>=1.4.1,<1.5.0)", "invenio-accounts (>=1.4.3,<1.5.0)", "invenio-oauth2server (>=1.3.2,<1.4.0)", "invenio-oauthclient (>=1.4.0,<1.5.0)", "invenio-userprofiles (>=1.2.1,<1.3.0)"] -base = ["invenio-admin (>=1.3.0,<1.4.0)", "invenio-assets (>=1.2.5,<1.3.0)", "invenio-formatter (>=1.1.0,<1.2.0)", "invenio-logging (>=1.3.0,<1.4.0)", "invenio-mail (>=1.0.2,<1.1.0)", "invenio-rest (>=1.2.3,<1.3.0)", "invenio-theme (>=1.3.5,<1.4.0)"] -docs = ["Sphinx (>=3,<4)"] -elasticsearch5 = ["invenio-search[elasticsearch5] (>=1.4.1,<1.5.0)"] -elasticsearch6 = ["invenio-search[elasticsearch6] (>=1.4.1,<1.5.0)"] -elasticsearch7 = ["invenio-search[elasticsearch7] (>=1.4.1,<1.5.0)"] -files = ["invenio-files-rest (>=1.2.0,<1.3.0)", "invenio-iiif (>=1.1.0,<1.2.0)", "invenio-previewer (>=1.3.2,<1.4.0)", "invenio-records-files (>=1.2.1,<1.3.0)"] -metadata = ["invenio-indexer (>=1.2.0,<1.3.0)", "invenio-jsonschemas (>=1.1.1,<1.2.0)", "invenio-oaiserver (>=1.2.0,<1.3.0)", "invenio-pidstore (>=1.2.1,<1.3.0)", "invenio-records (>=1.4.0,<1.6.0)", "invenio-records-rest (>=1.8.0,<1.9.0)", "invenio-records-ui (>=1.2.0,<1.3.0)", "invenio-search-ui (>=2.0.0,<2.1.0)"] -mysql = ["invenio-db[mysql,versioning] (>=1.0.8,<1.1.0)"] -postgresql = ["invenio-db[postgresql,versioning] (>=1.0.8,<1.1.0)"] -sqlite = ["invenio-db[versioning] (>=1.0.8,<1.1.0)"] -tests = ["pytest-invenio (>=1.4.0,<1.5.0)"] - [[package]] name = "invenio-access" -version = "1.4.2" +version = "2.0.0" description = "Invenio module for common role based access control." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-access-1.4.2.tar.gz", hash = "sha256:7eb70182bd4ff1ea3a3caa1f8b029aafb49c42e573c0c6497ca9cfaf1c97dc80"}, - {file = "invenio_access-1.4.2-py2.py3-none-any.whl", hash = "sha256:463cde5a24edab0c147ec7922372e6f46ac940409320e223334bf5f9e62e9d87"}, + {file = "invenio-access-2.0.0.tar.gz", hash = "sha256:b2627255dc13dba29932e27a599a9e753f1cffa383012b581ffc213856c1aa54"}, + {file = "invenio_access-2.0.0-py2.py3-none-any.whl", hash = "sha256:d56ae0c2448b7a5c2bd85d81ae2e57ca6c65399ab3846bb9480d0911df42c565"}, ] [package.dependencies] -invenio-accounts = ">=1.2.1" +invenio-accounts = ">=3.0.0" invenio-admin = ">=1.2.0" -invenio-base = ">=1.2.3" -invenio-i18n = ">=1.2.0" +invenio-base = ">=1.2.11" +invenio-i18n = ">=2.0.0" [package.extras] -all = ["Sphinx (>=3)", "cachelib (>=0.1)", "pytest-invenio (>=1.4.1)", "redis (>=2.10.5)"] -docs = ["Sphinx (>=3)"] -mysql = ["invenio-db[mysql,versioning] (>=1.0.8)"] -postgresql = ["invenio-db[postgresql,versioning] (>=1.0.8)"] -sqlite = ["invenio-db[sqlite,versioning] (>=1.0.8)"] -tests = ["cachelib (>=0.1)", "pytest-invenio (>=1.4.1)", "redis (>=2.10.5)"] +tests = ["cachelib (>=0.1)", "invenio-db[mysql,postgresql] (>=1.1.2)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.1)", "redis (>=2.10.5)", "sphinx (>=4.5)"] [[package]] name = "invenio-accounts" -version = "1.4.11" +version = "3.5.0" description = "Invenio user management and authentication." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-accounts-1.4.11.tar.gz", hash = "sha256:d5d24490b7d389fb31bdf4421ccad51f4777028e727c188838d3bf52fa003b0b"}, - {file = "invenio_accounts-1.4.11-py2.py3-none-any.whl", hash = "sha256:8d065df658536aad70ab2d2deae75a7c4bbb01099fc7e4388ece54bccd0a23c3"}, + {file = "invenio-accounts-3.5.0.tar.gz", hash = "sha256:29771065fd8762a1caf0deaa9411022fff183525a3d36d15807dce28cf554459"}, + {file = "invenio_accounts-3.5.0-py2.py3-none-any.whl", hash = "sha256:321e6431316ca43df68c4fb1e8fb3a86ac20af16c4f19362a235c206e7a45919"}, ] [package.dependencies] cryptography = ">=3.0.0" -email-validator = ">=1.0.5" -Flask-Breadcrumbs = ">=0.4.0" Flask-KVSession-Invenio = ">=0.6.3" -Flask-Login = ">=0.3.0,<0.5.0" -Flask-Mail = ">=0.9.1" -Flask-Menu = ">=0.5.0" -Flask-Security = ">=3.0.0" -Flask-WTF = ">=0.14.3" -invenio-base = ">=1.2.9" +Flask-Security-Invenio = ">=3.2.0" invenio-celery = ">=1.2.3" -invenio-i18n = ">=1.3.1" +invenio-i18n = ">=2.0.0" +invenio-mail = ">=1.0.2" invenio-rest = ">=1.2.4" -invenio-theme = ">=1.3.4" +invenio-theme = ">=2.0.0" maxminddb-geolite2 = ">=2017.404" -passlib = ">=1.7.1" pyjwt = ">=1.5.0" -redis = ">=2.10.5" simplekv = ">=0.11.2" ua-parser = ">=0.7.3" [package.extras] admin = ["invenio-admin (>=1.2.1)"] -all = ["Sphinx (==4.2.0)", "invenio-admin (>=1.2.1)", "pytest-invenio (>=1.4.2)"] -docs = ["Sphinx (==4.2.0)"] -mysql = ["invenio-db[mysql,versioning] (>=1.0.9)"] -postgresql = ["invenio-db[postgresql,versioning] (>=1.0.9)"] -sqlite = ["invenio-db[versioning] (>=1.0.9)"] -tests = ["pytest-invenio (>=1.4.2)"] +mysql = ["invenio-db[mysql] (>=1.0.14)"] +postgresql = ["invenio-db[postgresql] (>=1.0.14)"] +sqlite = ["invenio-db (>=1.0.14)"] +tests = ["invenio-app (>=1.3.3)", "mock (>=1.3.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.1.4)", "sphinx (>=4.2.0,<5)"] [[package]] name = "invenio-admin" -version = "1.3.2" -description = "Invenio module that adds administration panel to the system." +version = "1.4.0" +description = "\"Invenio module that adds administration panel to the system.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-admin-1.3.2.tar.gz", hash = "sha256:59148b6c2dd2583531c0b181314a7dfa3c7a48f9928966506641fd803bdc4df8"}, - {file = "invenio_admin-1.3.2-py2.py3-none-any.whl", hash = "sha256:d4bd634d7c12d567429fdba9eecdf6202e9a8da7abfee3da311aee43ec9f0f2c"}, + {file = "invenio-admin-1.4.0.tar.gz", hash = "sha256:2e257df24e300d992799d377a3ca7bbf64e7c7002a9b8890ee56667a2209d76a"}, + {file = "invenio_admin-1.4.0-py2.py3-none-any.whl", hash = "sha256:2c1138d5664c8d6e76bfb7378960b1945fb4af3dda325515aab68f33e1e5f4ae"}, ] [package.dependencies] @@ -1729,12 +1771,10 @@ Flask-Principal = ">=0.4.0" invenio-accounts = ">=1.2.1" invenio-base = ">=1.2.9" invenio-db = ">=1.0.9" +invenio-i18n = ">=2.0.0" [package.extras] -access = ["invenio-access (>=1.0.0)"] -all = ["Sphinx (>=4.2.0)", "invenio-access (>=1.0.0)", "invenio-theme (>=1.3.4)", "pytest-invenio (>=1.4.3)"] -docs = ["Sphinx (>=4.2.0)"] -tests = ["invenio-theme (>=1.3.4)", "pytest-invenio (>=1.4.3)"] +tests = ["invenio-access (>=1.0.0)", "invenio-theme (>=1.3.4)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.3)", "sphinx (>=4.5)"] [[package]] name = "invenio-app" @@ -1762,13 +1802,13 @@ tests = ["pytest-invenio (>=1.4.7)", "sphinx (>=4.2.0,<5)"] [[package]] name = "invenio-assets" -version = "1.2.8" -description = "Media assets management for Invenio." +version = "2.0.0" +description = "\"Media assets management for Invenio.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-assets-1.2.8.tar.gz", hash = "sha256:c42ed533d6e6055f0d15e19d6b14db5e7d06bac094823f1d2af4599f0237a33b"}, - {file = "invenio_assets-1.2.8-py2.py3-none-any.whl", hash = "sha256:09a6b981034d65e51482f5e123434d5ff2c89e102d4ec92a675ab68d8dae90a9"}, + {file = "invenio-assets-2.0.0.tar.gz", hash = "sha256:b69c3ac40b35fe3553388f254ddde5272513581a9c7ce60a0292dc6aca66b750"}, + {file = "invenio_assets-2.0.0-py2.py3-none-any.whl", hash = "sha256:c1b31bd57e4e6ccc3f2fed8b719ba4be487f2d0738c626693266ce0a366442fc"}, ] [package.dependencies] @@ -1778,9 +1818,7 @@ invenio-base = ">=1.2.5" node-semver = ">=0.1.1,<0.2.0" [package.extras] -all = ["Sphinx (>=1.5.1)", "mock (>=1.3.0)", "pytest-invenio (>=1.4.0)"] -docs = ["Sphinx (>=1.5.1)"] -tests = ["mock (>=1.3.0)", "pytest-invenio (>=1.4.0)"] +tests = ["mock (>=1.3.0)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-base" @@ -1848,38 +1886,34 @@ tests = ["Sphinx (==4.2.0)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio ( [[package]] name = "invenio-circulation" -version = "1.0.0a36" -description = "Invenio module for the circulation of bibliographic items." +version = "3.0.0a1" +description = "Invenio Circulation Module" optional = false -python-versions = ">=3" -files = [] -develop = false +python-versions = ">=3.8" +files = [ + {file = "invenio-circulation-3.0.0a1.tar.gz", hash = "sha256:96b08cd5eb69274ada27141ea06308947d71f6efcdaa6bd0e76511ada8798461"}, + {file = "invenio_circulation-3.0.0a1-py2.py3-none-any.whl", hash = "sha256:5813650aef8d27d4f1e848f2a0c16c957a705c9dd6f1fc9a61078f9d1536a76f"}, +] [package.dependencies] arrow = ">=0.15.0" -invenio-access = ">=1.3.1" +Babel = ">=2.8" +invenio-access = ">=2.0.0" invenio-base = ">=1.2.4" -invenio-jsonschemas = ">=1.0.1" -invenio-logging = ">=1.2.1" -invenio-pidstore = ">=1.1.0" -invenio-records-rest = ">=1.6.4" -jsonschema = ">=3.0.0,<4.0.0" - -[package.extras] -all = ["Flask (>=1.1.0,<2.0.0)", "Sphinx (>=4.2.0)", "celery[pytest] (>=4.4.0,<5.1)", "invenio-app (>=1.3.1)", "invenio-jsonschemas (>=1.0.1)", "mock (>=2.0.0)", "pytest-invenio (>=1.4.1,<1.5.0)", "pytest-mock (>=1.6.0)"] -docs = ["Sphinx (>=4.2.0)"] -elasticsearch6 = ["invenio-search[elasticsearch6] (>=1.3.1,<1.4.0)"] -elasticsearch7 = ["elasticsearch (>=7.0.0,<7.14)", "invenio-search[elasticsearch7] (>=1.3.1,<1.4.0)"] -mysql = ["invenio-db[mysql,versioning] (>=1.0.9,<1.1.0)"] -postgresql = ["invenio-db[postgresql,versioning] (>=1.0.9,<1.1.0)"] -sqlite = ["invenio-db[versioning] (>=1.0.9,<1.1.0)"] -tests = ["Flask (>=1.1.0,<2.0.0)", "celery[pytest] (>=4.4.0,<5.1)", "invenio-app (>=1.3.1)", "invenio-jsonschemas (>=1.0.1)", "mock (>=2.0.0)", "pytest-invenio (>=1.4.1,<1.5.0)", "pytest-mock (>=1.6.0)"] +invenio-indexer = ">=2.0.0" +invenio-jsonschemas = ">=1.1.4" +invenio-logging = ">=2.0.0" +invenio-pidstore = ">=1.3.0" +invenio-records-rest = ">=2.2.0" +jsonschema = ">=3.0.0" -[package.source] -type = "git" -url = "https://github.com/inveniosoftware/invenio-circulation.git" -reference = "v1.0.0a36" -resolved_reference = "fe6f28c41d4c0d447d9ef4d0dabd530741f73063" +[package.extras] +elasticsearch7 = ["elasticsearch (>=7.0.0,<7.14)", "invenio-search[elasticsearch7] (>=2.0.0,<3.0.0)"] +mysql = ["invenio-db[mysql,versioning] (>=1.0.0,<2.0.0)"] +opensearch2 = ["invenio-search[opensearch2] (>=2.0.0,<3.0.0)"] +postgresql = ["invenio-db[postgresql,versioning] (>=1.0.0,<2.0.0)"] +sqlite = ["invenio-db[versioning] (>=1.0.0,<2.0.0)"] +tests = ["Flask (>=2.2.0,<2.3.0)", "celery[pytest] (>=4.4.0,<5.3)", "invenio-app (>=1.3.1)", "invenio-jsonschemas (>=1.0.1)", "mock (>=2.0.0)", "pydocstyle (==6.1.1)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.1.0,<3.0.0)", "pytest-mock (>=1.6.0)", "sphinx (>=5)"] [[package]] name = "invenio-config" @@ -1902,93 +1936,92 @@ tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock [[package]] name = "invenio-db" -version = "1.0.14" -description = "\"Database management for Invenio.\"" +version = "1.1.5" +description = "Database management for Invenio." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "invenio-db-1.0.14.tar.gz", hash = "sha256:40b2f4f2a4f080c802fad9c4ede1b04eb5d0db7a89d842a9816c0a29e8f4f846"}, - {file = "invenio_db-1.0.14-py2.py3-none-any.whl", hash = "sha256:11276056623d049c362858c48dbafde0b3402eff8a1b18289c4c49d7abd7f4bf"}, + {file = "invenio-db-1.1.5.tar.gz", hash = "sha256:c02120e22d22498fcd23c3761a1d160c177261c760c38ccfddb4d671fcb7ddef"}, + {file = "invenio_db-1.1.5-py2.py3-none-any.whl", hash = "sha256:cbbe6d53678a04e21afd8220498a9ddde041bf5c7afd66df00fb46907b109c13"}, ] [package.dependencies] +alembic = ">=1.10.0,<1.11.0" Flask-Alembic = ">=2.0.1" Flask-SQLAlchemy = ">=2.1,<3.0.0" invenio-base = ">=1.2.10" psycopg2-binary = {version = ">=2.8.6", optional = true, markers = "extra == \"postgresql\""} -SQLAlchemy = ">=1.2.18,<1.5.0" +SQLAlchemy = {version = ">=1.2.18,<1.5.0", extras = ["asyncio"]} SQLAlchemy-Continuum = ">=1.3.12" SQLAlchemy-Utils = ">=0.33.1,<0.39" [package.extras] mysql = ["pymysql (>=0.10.1)"] postgresql = ["psycopg2-binary (>=2.8.6)"] -tests = ["Sphinx (==4.2.0)", "cryptography (>=2.1.4)", "pytest-invenio (>=1.4.5)"] +tests = ["Sphinx (>=4.5.0)", "cryptography (>=2.1.4)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.5)"] [[package]] name = "invenio-formatter" -version = "1.1.6" +version = "2.0.1" description = "\"Jinja utilities for Invenio.\"" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "invenio-formatter-1.1.6.tar.gz", hash = "sha256:8cbbf34a5424469402f54f1d1c14972ff79acf6215334c107d1a69d40a4339ca"}, - {file = "invenio_formatter-1.1.6-py2.py3-none-any.whl", hash = "sha256:fd2af96ac0550f8289acc52fdd80def1999a6d4532e3d5a63e42ece3d6c601c9"}, + {file = "invenio-formatter-2.0.1.tar.gz", hash = "sha256:f21111ef17c74144ed79b9dbeee2536c4f7d8b235da7e88766f9575b3432c220"}, + {file = "invenio_formatter-2.0.1-py2.py3-none-any.whl", hash = "sha256:cc652ede9564b3f0273fd2f71fd82f46784356a32aa92f070e171866183e9e4c"}, ] [package.dependencies] arrow = ">=0.7.0" bleach = ">=3.1.0" -Flask-BabelEx = ">=0.9.4" invenio-base = ">=1.2.5" -invenio-i18n = ">=1.2.0" -Pillow = ">=3.2.0,<10.0.0" +invenio-i18n = ">=2.0.0" +Pillow = ">=10.0.0" [package.extras] -tests = ["CairoSVG (>=1.0.20)", "Pillow (>=3.2.0,<10.0.0)", "Sphinx (>=1.8.0)", "mock (>=4.0.3)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.1,<1.5.0)"] +tests = ["CairoSVG (>=1.0.20)", "Pillow (>=10.0.0)", "Sphinx (>=1.8.0)", "mock (>=4.0.3)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.1)"] [[package]] name = "invenio-i18n" -version = "1.3.3" +version = "2.1.1" description = "Invenio internationalization (I18N) module." optional = false python-versions = ">=3.7" files = [ - {file = "invenio-i18n-1.3.3.tar.gz", hash = "sha256:357a0f32d6cd37377d2cbd5ed35742e5f1bfc8134d72c9e198b7a75afaf779ce"}, - {file = "invenio_i18n-1.3.3-py2.py3-none-any.whl", hash = "sha256:2fe68fbd16ecb1f3781dda596bc442c393e73a546ec06138becb95f921c50f9d"}, + {file = "invenio-i18n-2.1.1.tar.gz", hash = "sha256:915e011a22acfe71e83a4c1bf8ab2a7a064d977b28ba631ede0e0ab2aa0cb592"}, + {file = "invenio_i18n-2.1.1-py2.py3-none-any.whl", hash = "sha256:057a2d67b3453a7dd2e7d70881074ed5c4dc983615472467cb6b5057366246fa"}, ] [package.dependencies] Babel = ">=2.8" -Flask-BabelEx = ">=0.9.4" +Flask-Babel = ">=3.0.0" invenio-base = ">=1.2.11" [package.extras] -tests = ["invenio-accounts[mysql,postgresql] (>=1.4.13)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.6)", "sphinx (>=4.5)"] +tests = ["Flask-Login (>=0.6.2)", "invenio-assets (>=1.3.0,<2.0.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.6)", "sphinx (>=4.5)"] [[package]] name = "invenio-indexer" -version = "1.2.7" -description = "Record indexer for Invenio." +version = "2.2.1" +description = "\"Record indexer for Invenio.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-indexer-1.2.7.tar.gz", hash = "sha256:8945e350d056eae9b3f480f743dd05965b6bb5476d5713febafd4ed7c5459538"}, - {file = "invenio_indexer-1.2.7-py2.py3-none-any.whl", hash = "sha256:28fb0518330761483be96841461cd5560e41fc10bd97fe5ebca33fdd2e3dad39"}, + {file = "invenio-indexer-2.2.1.tar.gz", hash = "sha256:363483581a9594465337821fbf0f2527fb140bc177098d2f9754921799cac483"}, + {file = "invenio_indexer-2.2.1-py2.py3-none-any.whl", hash = "sha256:2d026658d612059136881835e208b4a9b72a647b191f1917d568972c174303d1"}, ] [package.dependencies] -invenio-db = ">=1.0.14" -invenio-pidstore = ">=1.2.0" -invenio-records = ">=1.4.0" +invenio-db = ">=1.0.14,<2.0.0" +invenio-pidstore = ">=1.2.0,<2.0.0" +invenio-records = ">=2.0.0,<3.0.0" pytz = ">=2016.4" [package.extras] -all = ["Sphinx (>=4.2.0,<5)", "attrs (>=17.4.0)", "pytest-invenio (>=1.4.6)", "redis (>=3.4.0)"] -docs = ["Sphinx (>=4.2.0,<5)"] -elasticsearch6 = ["invenio-search[elasticsearch6] (>=1.4.0)"] -elasticsearch7 = ["invenio-search[elasticsearch7] (>=1.4.0)"] -tests = ["attrs (>=17.4.0)", "pytest-invenio (>=1.4.6)", "redis (>=3.4.0)"] +elasticsearch7 = ["elasticsearch (>=7.5.0,<7.14.0)", "invenio-search[elasticsearch7] (>=2.1.0,<3.0.0)"] +opensearch1 = ["invenio-search[opensearch1] (>=2.1.0,<3.0.0)"] +opensearch2 = ["invenio-search[opensearch2] (>=2.1.0,<3.0.0)"] +tests = ["attrs (>=17.4.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.1.0,<3.0.0)", "redis (>=3.4.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-jsonschemas" @@ -2014,37 +2047,33 @@ tests = ["jsonresolver[jsonschema] (>=0.2.1)", "mock (>=1.3.0)", "pytest-invenio [[package]] name = "invenio-logging" -version = "1.3.2" -description = "Module providing logging capabilities." +version = "2.1.0" +description = "\"Module providing logging capabilities.\"" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "invenio-logging-1.3.2.tar.gz", hash = "sha256:8c01c4dcc5604b996d30bf69dc35948536639943f5cb3d0da5240105ea08b533"}, - {file = "invenio_logging-1.3.2-py2.py3-none-any.whl", hash = "sha256:353c4aba5ddb334ee45b801a2bc0b22e73e363163a776f0b3360d850dc3013ff"}, + {file = "invenio-logging-2.1.0.tar.gz", hash = "sha256:2b3d849f32f9bfd1aa636d951d952b6df2fa2b85a350080dd5a90e3ff7e56592"}, + {file = "invenio_logging-2.1.0-py2.py3-none-any.whl", hash = "sha256:7537b9902171517208552893eea3efb76fb3b55558671ea4ea6fd218d4fbc89b"}, ] [package.dependencies] invenio-celery = ">=1.2.4" invenio-db = ">=1.0.12" -raven = {version = ">=6", extras = ["flask"], optional = true, markers = "extra == \"sentry\""} -sentry-sdk = {version = ">=1.0.0", extras = ["flask"], optional = true, markers = "extra == \"sentry-sdk\""} +sentry-sdk = {version = ">=1.0.0", extras = ["flask"], optional = true, markers = "extra == \"sentry_sdk\""} [package.extras] -all = ["Sphinx (>=1.5.1)", "flask-login (>=0.3.2,<0.5.0)", "httpretty (>=0.8.14)", "iniconfig (>=1.1.1)", "mock (>=1.3.0)", "pytest-invenio (>=1.4.2)", "raven[flask] (>=6)", "sentry-sdk[flask] (>=1.0.0)"] -docs = ["Sphinx (>=1.5.1)"] -sentry = ["raven[flask] (>=6)"] sentry-sdk = ["sentry-sdk[flask] (>=1.0.0)"] -tests = ["flask-login (>=0.3.2,<0.5.0)", "httpretty (>=0.8.14)", "iniconfig (>=1.1.1)", "mock (>=1.3.0)", "pytest-invenio (>=1.4.2)"] +tests = ["flask-login (>=0.6.1)", "httpretty (>=0.8.14)", "iniconfig (>=1.1.1)", "mock (>=1.3.0)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.2)", "sentry-sdk[flask] (>=1.0.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-mail" -version = "1.0.2" +version = "2.1.0" description = "Invenio-Mail is an integration layer between Invenio and Flask-Mail." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-mail-1.0.2.tar.gz", hash = "sha256:898952aa8984426074fd92b60bbe3ac67117cae0c724724aa63476416a7b7647"}, - {file = "invenio_mail-1.0.2-py2.py3-none-any.whl", hash = "sha256:fcd9ec4a89e0e68d09a9b9a638ee625e260ef98d6bc9d7aa172ec3969a95933f"}, + {file = "invenio-mail-2.1.0.tar.gz", hash = "sha256:fe2e660faab86653288eb9732ce06702f2c9b0fefbabe9fea1aaf49efed708e9"}, + {file = "invenio_mail-2.1.0-py2.py3-none-any.whl", hash = "sha256:d31824cdfa7aff15e0ff67f20258cca87adc4548a4711d4b0bd6e318b30cfd2f"}, ] [package.dependencies] @@ -2052,10 +2081,7 @@ Flask = ">=0.11.1" Flask-Mail = ">=0.9.1" [package.extras] -all = ["Flask-CeleryExt (>=0.2.2)", "Sphinx (>=1.4.2)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "pydocstyle (>=1.0.0)", "pytest (>=2.8.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)"] -celery = ["Flask-CeleryExt (>=0.2.2)"] -docs = ["Flask-CeleryExt (>=0.2.2)", "Sphinx (>=1.4.2)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "pydocstyle (>=1.0.0)", "pytest (>=2.8.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)"] +tests = ["Flask-CeleryExt (>=0.2.2)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-oaiharvester" @@ -2086,15 +2112,42 @@ url = "https://github.com/inveniosoftware/invenio-oaiharvester.git" reference = "v1.0.0a4" resolved_reference = "fe55e095a8e78b36cfad875f752f2facc2908bae" +[[package]] +name = "invenio-oaiserver" +version = "2.2.1" +description = "\"Invenio module that implements OAI-PMH server.\"" +optional = false +python-versions = ">=3.7" +files = [ + {file = "invenio-oaiserver-2.2.1.tar.gz", hash = "sha256:4f3092674c6170642580bb298b1eb96bae3ae47dbab8336defcf1e90a7ba8411"}, + {file = "invenio_oaiserver-2.2.1-py2.py3-none-any.whl", hash = "sha256:fcbce7ed2255db75b4af05d6665a2c1c692e0f40acdf74c2d6cdd49dab6e38cc"}, +] + +[package.dependencies] +arrow = ">=0.17.0" +dojson = ">=1.3.0,<2.0.0" +invenio-base = ">=1.2.11,<2.0.0" +invenio-i18n = ">=2.0.0,<3.0.0" +invenio-pidstore = ">=1.2.2,<2.0.0" +invenio-records = ">=2.0.0,<3.0.0" +invenio-rest = ">=1.2.4,<2.0.0" +lxml = ">=4.3.0" + +[package.extras] +elasticsearch7 = ["invenio-search[elasticsearch7] (>=2.1.0,<3.0.0)"] +opensearch1 = ["invenio-search[opensearch1] (>=2.1.0,<3.0.0)"] +opensearch2 = ["invenio-search[opensearch2] (>=2.1.0,<3.0.0)"] +tests = ["Sphinx (>=4.5.0)", "invenio-admin (>=1.3.0,<2.0.0)", "invenio-celery (>=1.2.5,<2.0.0)", "invenio-db[mysql,postgresql,versioning] (>=1.0.9,<2.0.0)", "invenio-indexer (>=2.1.0,<3.0.0)", "invenio-jsonschemas (>=1.1.3,<2.0.0)", "mock (>=1.3.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.1.0,<3.0.0)"] + [[package]] name = "invenio-oauth2server" -version = "1.3.8" +version = "2.2.1" description = "\"Invenio module that implements OAuth 2 server.\"" optional = false python-versions = ">=3.7" files = [ - {file = "invenio-oauth2server-1.3.8.tar.gz", hash = "sha256:2e86c0a98843218aa5a3924dcbd46f0b25baa735d3410aaee73ad8bcb3286d72"}, - {file = "invenio_oauth2server-1.3.8-py2.py3-none-any.whl", hash = "sha256:c35c46d0c2bdf644e5730438d763fc3e7695a66d3a4a4ffe1bb215e196ff7339"}, + {file = "invenio-oauth2server-2.2.1.tar.gz", hash = "sha256:b8fe74b8369e2fc515bccbafde50470c3bc46f29083ddc90fa36b36b163a316e"}, + {file = "invenio_oauth2server-2.2.1-py2.py3-none-any.whl", hash = "sha256:9fdc9371bc22a94b780e9d2704c20e3e4969c0cedac0d772badaab75109a43f9"}, ] [package.dependencies] @@ -2106,7 +2159,7 @@ future = ">=0.16.0" importlib-metadata = ">=4.4" invenio-accounts = ">=1.3.1" invenio-base = ">=1.2.4" -invenio-i18n = ">=1.2.0" +invenio-i18n = ">=2.0.0" invenio-theme = ">=1.3.4" pyjwt = ">=1.5.0" requests-oauthlib = ">=1.1.0,<1.2.0" @@ -2118,47 +2171,42 @@ tests = ["invenio-admin (>=1.2.1)", "invenio-db[mysql,postgresql,versioning] (>= [[package]] name = "invenio-oauthclient" -version = "1.4.4" -description = "Invenio module that provides OAuth web authorization support." +version = "3.5.1" +description = "\"Invenio module that provides OAuth web authorization support.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-oauthclient-1.4.4.tar.gz", hash = "sha256:47672a8e2fa005f831df8e0c0dfaa3ee5ed29bf49f42b6bd194d6587f9d87ed4"}, - {file = "invenio_oauthclient-1.4.4-py2.py3-none-any.whl", hash = "sha256:ad2d697f9772fcad30bcd1afc966e013f7e76881cc550110a6ce0f594240a80f"}, + {file = "invenio-oauthclient-3.5.1.tar.gz", hash = "sha256:69b8b0f645adb380f87a6986e0b2b9d37eb6026dac937f7478f2b38966fc7afd"}, + {file = "invenio_oauthclient-3.5.1-py2.py3-none-any.whl", hash = "sha256:a7e64d07de7ee81056fb7fd0254a53260c776c5e019c7482e674175bae25f9fe"}, ] [package.dependencies] blinker = ">=1.4" -Flask-Breadcrumbs = ">=0.5.0" -Flask-OAuthlib = ">=0.9.5" -invenio-accounts = ">=1.3.0" -invenio-base = ">=1.2.3" -invenio-i18n = ">=1.2.0" -invenio-mail = ">=1.0.0" -invenio-theme = ">=1.3.4" +Flask-OAuthlib = ">=0.9.6" +"github3.py" = ">=1.0.0a4" +invenio-accounts = ">=3.0.0" +invenio-admin = ">=1.0.0" +invenio-base = ">=1.2.11" +invenio-i18n = ">=2.0.0" +invenio-mail = ">=1.0.2" +invenio-theme = ">=1.3.12" oauthlib = ">=1.1.2,<3.0.0" requests-oauthlib = ">=0.6.2,<1.2.0" +"uritemplate.py" = ">=0.2.0,<2.0" uritools = ">=1.0.1" [package.extras] -admin = ["invenio-admin (>=1.0.0)"] -all = ["SQLAlchemy-Continuum (>=1.2.1)", "Sphinx (>=3.0.0,<3.4.2)", "github3.py (>=1.0.0a4)", "httpretty (>=0.8.14)", "invenio-admin (>=1.0.0)", "invenio-userprofiles (>=1.0.0)", "mock (>=1.3.0)", "oauthlib (>=1.1.2,<3.0.0)", "pytest-invenio (>=1.4.0)", "requests-oauthlib (>=0.6.2,<1.2.0)", "simplejson (>=3.8)", "uritemplate.py (>=0.2.0,<2.0)"] -docs = ["Sphinx (>=3.0.0,<3.4.2)"] -github = ["github3.py (>=1.0.0a4)", "uritemplate.py (>=0.2.0,<2.0)"] -mysql = ["invenio-db[mysql] (>=1.0.5)"] -postgresql = ["invenio-db[postgresql] (>=1.0.5)"] -sqlite = ["invenio-db (>=1.0.5)"] -tests = ["SQLAlchemy-Continuum (>=1.2.1)", "httpretty (>=0.8.14)", "invenio-userprofiles (>=1.0.0)", "mock (>=1.3.0)", "oauthlib (>=1.1.2,<3.0.0)", "pytest-invenio (>=1.4.0)", "requests-oauthlib (>=0.6.2,<1.2.0)", "simplejson (>=3.8)"] +tests = ["httpretty (>=0.8.14)", "invenio-db[mysql,postgresql,versioning] (>=1.0.9,<2.0.0)", "invenio-userprofiles (>=2.0.0.dev3)", "mock (>=1.3.0)", "oauthlib (>=1.1.2,<3.0.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.2)", "requests-oauthlib (>=0.6.2,<1.2.0)", "simplejson (>=3.8)", "sphinx (>=4.5)"] [[package]] name = "invenio-pidstore" -version = "1.2.4" +version = "1.3.1" description = "\"Invenio module that stores and registers persistent identifiers.\"" optional = false python-versions = ">=3.7" files = [ - {file = "invenio-pidstore-1.2.4.tar.gz", hash = "sha256:557704abccc35a9f8153536641a66145c8690c26aacef13ef0ca44192208e749"}, - {file = "invenio_pidstore-1.2.4-py2.py3-none-any.whl", hash = "sha256:8459c6afa5682f3f6d8bc170628b50e0df60ebe7b403f6553597acdf29dfc12a"}, + {file = "invenio-pidstore-1.3.1.tar.gz", hash = "sha256:51eaa9a000b067f2e6fda72603a33d6ecd1d05f43f2f93d4de4d9aa4ad9fb7d9"}, + {file = "invenio_pidstore-1.3.1-py2.py3-none-any.whl", hash = "sha256:7b4f398744984c46a8e5730532d0423021b8fa3c576e0f170f74334af6323454"}, ] [package.dependencies] @@ -2166,99 +2214,90 @@ base32-lib = ">=1.0.1" importlib-metadata = ">=4.4" importlib-resources = ">=5.0" invenio-base = ">=1.2.5" -invenio-i18n = ">=1.2.0" +invenio-i18n = ">=2.0.0" [package.extras] -tests = ["Flask-Menu (>=0.5.1)", "SQLAlchemy-Continuum (>=1.3.11)", "Sphinx (>=4.5.0)", "datacite (>=0.1.0)", "invenio-access (>=1.0.0)", "invenio-accounts (>=1.4.0)", "invenio-admin (>=1.2.0)", "invenio-db[mysql,postgresql,versioning] (>=1.0.9,<2.0.0)", "mock (>=3.0.0)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.0)"] +tests = ["Flask-Menu (>=0.5.1)", "SQLAlchemy-Continuum (>=1.3.11)", "Sphinx (>=4.5.0)", "datacite (>=0.1.0)", "invenio-access (>=1.0.0)", "invenio-accounts (>=1.4.0)", "invenio-admin (>=1.2.0)", "invenio-db[mysql,postgresql,versioning] (>=1.0.9,<2.0.0)", "mock (>=3.0.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.0)"] [[package]] name = "invenio-records" -version = "1.6.1" +version = "2.1.0" description = "Invenio-Records is a metadata storage module." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-records-1.6.1.tar.gz", hash = "sha256:8eb0f0343ecb8c6f968e9b66162046131eef34739a33f26b2c16b84f2e987353"}, - {file = "invenio_records-1.6.1-py2.py3-none-any.whl", hash = "sha256:0dafee31de372969be1f56ed672a535b5cd5d0fdf17c8f1a0b37cc0eab79819e"}, + {file = "invenio-records-2.1.0.tar.gz", hash = "sha256:be7e3490b3c892aea92c35401d92c2d21a631826597365300bfec8bea8a4502b"}, + {file = "invenio_records-2.1.0-py2.py3-none-any.whl", hash = "sha256:b00662cdb9b6d2660d299a78df4d6504e838d2228af1f1f529451b4e09617db1"}, ] [package.dependencies] arrow = ">=0.16.0" -invenio-base = ">=1.2.3" -invenio-celery = ">=1.2.2" -invenio-i18n = ">=1.2.0" +invenio-celery = ">=1.2.4,<2.0.0" +invenio-i18n = ">=2.0.0,<3.0.0" jsonpatch = ">=1.26" jsonref = ">=0.2" jsonresolver = ">=0.3.1" -jsonschema = ">=3.0.0,<5.0.0" +jsonschema = ">=4.3.0,<5.0.0" [package.extras] -admin = ["invenio-admin (>=1.2.1)"] -all = ["Sphinx (==4.2.0)", "invenio-admin (>=1.2.1)", "pytest-invenio (>=1.4.1)"] -docs = ["Sphinx (==4.2.0)"] -mysql = ["invenio-db[mysql,versioning] (>=1.0.9,<1.1.0)"] -postgresql = ["invenio-db[postgresql,versioning] (>=1.0.9,<1.1.0)"] -sqlite = ["invenio-db[versioning] (>=1.0.9,<1.1.0)"] -tests = ["pytest-invenio (>=1.4.1)"] +admin = ["invenio-admin (>=1.2.1,<2.0.0)"] +mysql = ["invenio-db[mysql,versioning] (>=1.0.14,<2.0.0)"] +postgresql = ["invenio-db[postgresql,versioning] (>=1.0.14,<2.0.0)"] +sqlite = ["invenio-db[versioning] (>=1.0.14,<2.0.0)"] +tests = ["invenio-admin (>=1.4.0,<2.0.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.1.0,<3.0.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-records-permissions" -version = "0.13.2" +version = "0.19.2" description = "Permission policies for Invenio records." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-records-permissions-0.13.2.tar.gz", hash = "sha256:a08a818c9dd4e8f94d8e8162490c5a4a780c5d3de3964cac4e28c9ecb528c658"}, - {file = "invenio_records_permissions-0.13.2-py2.py3-none-any.whl", hash = "sha256:168813230c99389b42a9983f4c52ce410e622332fc544ff5ed27a6ae7817e86b"}, + {file = "invenio-records-permissions-0.19.2.tar.gz", hash = "sha256:3c3aa3b7924162955609432b8a97dd3119e91eba50f22e071b9e932000505ec1"}, + {file = "invenio_records_permissions-0.19.2-py2.py3-none-any.whl", hash = "sha256:2eebb9334bc1c1d9a6bae2241e86c727a1343370fce27fea93bac42fe91cfa23"}, ] [package.dependencies] -invenio-access = ">=1.4.2,<2.0.0" -invenio-i18n = ">=1.2.0" -invenio-records = ">=1.4.0" +invenio-access = ">=2.0.0,<3.0.0" +invenio-i18n = ">=2.0.0,<3.0.0" +invenio-records = ">=2.0.0,<3.0.0" [package.extras] -all = ["Sphinx (==4.2.0)", "invenio-accounts (>=2.0.0)", "invenio-app (>=1.3.0)", "pytest-invenio (>=1.4.13,<2.0.0)", "pytest-mock (>=1.6.0)"] -docs = ["Sphinx (==4.2.0)"] -elasticsearch6 = ["invenio-search[elasticsearch6] (>=1.4.1,<2.0.0)"] -elasticsearch7 = ["invenio-search[elasticsearch7] (>=1.4.1,<2.0.0)"] -mysql = ["invenio-db[mysql,versioning] (>=1.0.9,<2.0.0)"] -postgresql = ["invenio-db[postgresql,versioning] (>=1.0.9,<2.0.0)"] -sqlite = ["invenio-db[versioning] (>=1.0.9,<2.0.0)"] -tests = ["invenio-accounts (>=2.0.0)", "invenio-app (>=1.3.0)", "pytest-invenio (>=1.4.13,<2.0.0)", "pytest-mock (>=1.6.0)"] +elasticsearch7 = ["invenio-search[elasticsearch7] (>=2.1.0,<3.0.0)"] +opensearch1 = ["invenio-search[opensearch1] (>=2.1.0,<3.0.0)"] +opensearch2 = ["invenio-search[opensearch2] (>=2.1.0,<3.0.0)"] +tests = ["Sphinx (==4.2.0)", "invenio-accounts (>=3.0.0,<4.0.0)", "invenio-app (>=1.3.0,<2.0.0)", "invenio-db[mysql,postgresql,versioning] (>=1.0.9,<2.0.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.1.0,<3.0.0)", "pytest-mock (>=1.6.0)"] [[package]] name = "invenio-records-rest" -version = "1.8.0" -description = "REST API for invenio-records." +version = "2.2.0" +description = "\"REST API for invenio-records.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-records-rest-1.8.0.tar.gz", hash = "sha256:70ba741f19f8c9a1ae14a700d82c632175e881fd786ffdc4692f2718482e8dd1"}, - {file = "invenio_records_rest-1.8.0-py2.py3-none-any.whl", hash = "sha256:67fb753131e00bd20aef9d1011d51bcb407d1a30ef2e4af8647bf3b92f2b999e"}, + {file = "invenio-records-rest-2.2.0.tar.gz", hash = "sha256:12082c188bd3b687d07ab689980c53cebc7919550f1d82cd9447c132384d7e1d"}, + {file = "invenio_records_rest-2.2.0-py2.py3-none-any.whl", hash = "sha256:3d28a073a51f6e53ae8e3b999a494255fda0d7e886dfa17b1261272cfc4ce488"}, ] [package.dependencies] bleach = ">=2.1.3" ftfy = ">=4.4.3" -invenio-base = ">=1.2.3" -invenio-i18n = ">=1.3.0" -invenio-indexer = ">=1.2.0" -invenio-pidstore = ">=1.2.1" -invenio-records = ">=1.4.0" -invenio-rest = ">=1.2.3" +invenio-base = ">=1.2.5,<2.0.0" +invenio-i18n = ">=2.0.0,<3.0.0" +invenio-indexer = ">=2.1.0,<3.0.0" +invenio-pidstore = ">=1.2.1,<2.0.0" +invenio-records = ">=2.0.0,<3.0.0" +invenio-rest = ">=1.2.4,<2.0.0" [package.extras] -all = ["Flask-Login (>=0.3.2)", "Sphinx (>=3.3.1)", "citeproc-py (>=0.5.1)", "citeproc-py-styles (>=0.1.2)", "datacite (>=1.0.1)", "dcxml (>=0.1.2)", "invenio-config (>=1.0.2)", "invenio-db[all] (>=1.0.8)", "pyld (>=1.0.5,<2)", "pytest-invenio (>=1.4.0)"] -citeproc = ["citeproc-py (>=0.5.1)", "citeproc-py-styles (>=0.1.2)"] +citeproc = ["citeproc-py (>=0.6.0)", "citeproc-py-styles (>=0.1.3)"] datacite = ["datacite (>=1.0.1)"] -docs = ["Sphinx (>=3.3.1)"] dublincore = ["dcxml (>=0.1.2)"] -elasticsearch5 = ["invenio-search[elasticsearch5] (>=1.2.0)"] -elasticsearch6 = ["invenio-search[elasticsearch6] (>=1.2.0)"] -elasticsearch7 = ["invenio-search[elasticsearch7] (>=1.2.0)"] +elasticsearch7 = ["invenio-search[elasticsearch7] (>=2.1.0,<3.0.0)"] jsonld = ["pyld (>=1.0.5,<2)"] -tests = ["Flask-Login (>=0.3.2)", "invenio-config (>=1.0.2)", "invenio-db[all] (>=1.0.8)", "pytest-invenio (>=1.4.0)"] +opensearch1 = ["invenio-search[opensearch1] (>=2.1.0,<3.0.0)"] +opensearch2 = ["invenio-search[opensearch2] (>=2.1.0,<3.0.0)"] +tests = ["Flask-Login (>=0.3.2)", "citeproc-py (>=0.6.0)", "citeproc-py-styles (>=0.1.3)", "cryptography (>=2.1.4)", "datacite (>=1.0.1)", "dcxml (>=0.1.2)", "invenio-config (>=1.0.2,<2.0.0)", "invenio-db[mysql,postgresql] (>=1.0.9,<2.0.0)", "mock (>=4)", "pyld (>=1.0.5,<2)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.0.0,<3.0.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-records-ui" @@ -2284,86 +2323,103 @@ tests = ["invenio-access (>=1.0.0)", "invenio-accounts (>=1.3.0)", "invenio-db[m [[package]] name = "invenio-rest" -version = "1.2.8" -description = "REST API module for Invenio." +version = "1.3.0" +description = "\"REST API module for Invenio.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-rest-1.2.8.tar.gz", hash = "sha256:4bb0958dbbcb7cada2c8214afb349249eb562e602d767477b285afc9e9de479f"}, - {file = "invenio_rest-1.2.8-py2.py3-none-any.whl", hash = "sha256:80c348282715b4a40855f8ea04f3f3acbda7d4f37e8e60e81f91115e31f8883b"}, + {file = "invenio-rest-1.3.0.tar.gz", hash = "sha256:5f74a777f01bfffe0d6ae85ad3b541df0c08e5bdf83b4abfc057a3d7dbadc70b"}, + {file = "invenio_rest-1.3.0-py2.py3-none-any.whl", hash = "sha256:6f7c415fc72cd4564c2ad527f2e3333355d172c1d492431b33ba78ca1129c0e4"}, ] [package.dependencies] Flask-CORS = ">=2.1.0" invenio-base = ">=1.2.5" +invenio-logging = {version = ">=2.1.0", extras = ["sentry-sdk"]} itsdangerous = ">=1.1,<2.1" marshmallow = ">=2.15.2" webargs = ">=5.5.0,<6.0.0" [package.extras] -all = ["Sphinx (==4.2.0)", "pytest-invenio (>=1.4.0)", "xmltodict (>=0.11.0)"] -docs = ["Sphinx (==4.2.0)"] -tests = ["Sphinx (==4.2.0)", "pytest-invenio (>=1.4.0)", "xmltodict (>=0.11.0)"] +tests = ["Sphinx (>=4.5.0)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.0)", "xmltodict (>=0.11.0)"] [[package]] name = "invenio-search" -version = "1.4.2" -description = "Invenio module for information retrieval." +version = "2.2.0" +description = "\"Invenio module for information retrieval.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "invenio-search-1.4.2.tar.gz", hash = "sha256:1d6f09424b731a335a6f8e05c8e5c55c29b3277486c9ac7534d2c15648e1d7ab"}, - {file = "invenio_search-1.4.2-py2.py3-none-any.whl", hash = "sha256:50bfbd4f7bc56f05504084305de205e5b93498ccee83741ca0dd4a0fdcc5334a"}, + {file = "invenio-search-2.2.0.tar.gz", hash = "sha256:a1cc8161512adda03eedf110c41123ee2f22039853b4adf4657c0e8718a148cd"}, + {file = "invenio_search-2.2.0-py2.py3-none-any.whl", hash = "sha256:5813ae9d4a6c48ac14e74c4dee34251c76c3d969720d0730d8e308c0bd3dc644"}, ] [package.dependencies] +dictdiffer = ">=0.9.0" elasticsearch = {version = ">=7.0.0,<7.14", optional = true, markers = "extra == \"elasticsearch7\""} elasticsearch-dsl = {version = ">=7.0.0,<8.0.0", optional = true, markers = "extra == \"elasticsearch7\""} -invenio-base = ">=1.2.3" +invenio-base = ">=1.2.3,<2.0.0" [package.extras] -all = ["Sphinx (>=3)", "invenio-accounts (>=1.4.0)", "invenio-db[versioning] (>=1.0.0)", "mock (>=1.3.0)", "pytest-invenio (>=1.4.0)"] -docs = ["Sphinx (>=3)", "invenio-accounts (>=1.4.0)"] -elasticsearch2 = ["elasticsearch (>=2.0.0,<3.0.0)", "elasticsearch-dsl (>=2.0.0,<3.0.0)"] -elasticsearch5 = ["elasticsearch (>=5.0.0,<6.0.0)", "elasticsearch-dsl (>=5.1.0,<6.0.0)"] -elasticsearch6 = ["elasticsearch (>=6.0.0,<7.0.0)", "elasticsearch-dsl (>=6.0.0,<6.2.0)"] elasticsearch7 = ["elasticsearch (>=7.0.0,<7.14)", "elasticsearch-dsl (>=7.0.0,<8.0.0)"] -tests = ["invenio-db[versioning] (>=1.0.0)", "mock (>=1.3.0)", "pytest-invenio (>=1.4.0)"] +opensearch1 = ["opensearch-dsl (>=1.0.0,<2.0.0)", "opensearch-py (>=1.1.0,<2.0.0)"] +opensearch2 = ["opensearch-dsl (>=2.0.0,<3.0.0)", "opensearch-py (>=2.0.0,<3.0.0)"] +tests = ["Sphinx (>=3)", "invenio-accounts (>=2.0.0,<3.0.0)", "invenio-db[versioning] (>=1.0.0,<2.0.0)", "mock (>=1.3.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.0.0,<3.0.0)"] + +[[package]] +name = "invenio-search-ui" +version = "2.8.2" +description = "UI for Invenio-Search." +optional = false +python-versions = ">=3.7" +files = [ + {file = "invenio-search-ui-2.8.2.tar.gz", hash = "sha256:ff91e162c69eaa3812eccf2df4fe106bbbbda06885f94e3e520d87d32821b0c5"}, + {file = "invenio_search_ui-2.8.2-py2.py3-none-any.whl", hash = "sha256:7e62035e43808e7bc82b33c6f13c5ff20b6e0e43b2d27eb48a56f9e5b5853288"}, +] + +[package.dependencies] +Babel = ">=2.8" +invenio-assets = ">=2.0.0" +invenio-base = ">=1.2.11" +invenio-i18n = ">=2.0.0,<3.0.0" + +[package.extras] +tests = ["invenio-db (>=1.0.8)", "invenio-records (>=1.0.0)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.11)", "sphinx (>=4.5)"] [[package]] name = "invenio-sip2" -version = "0.6.19" +version = "0.6.22" description = "Invenio module that add a SIP2 communication for library self-check service" optional = false python-versions = ">=3.7,<3.10" files = [ - {file = "invenio_sip2-0.6.19-py3-none-any.whl", hash = "sha256:6bdb34ba23898bbc7523b6463b967c90d793ead365b4f40fae889861e28f4fd2"}, - {file = "invenio_sip2-0.6.19.tar.gz", hash = "sha256:0a0965073f380be88af9689eb13eb670e5d37a8f954e85f586a8099fd2581b38"}, + {file = "invenio_sip2-0.6.22-py3-none-any.whl", hash = "sha256:8030c7eff1c84d77ba9c5a70801fe8729f15a867551d7d3aa332ad673693c60d"}, + {file = "invenio_sip2-0.6.22.tar.gz", hash = "sha256:9ccc54ecc4cd912c531812cb08b8c14893db948dd75f2b2db78ec662ea9a6c4b"}, ] [package.dependencies] -Flask = "<3.0.0" -invenio-access = ">=1.3.1" -invenio-base = ">=1.2.3" +Flask = ">=2.2.0,<2.3.0" +invenio-access = ">=2.0.0,<3.0.0" +invenio-base = ">=1.2.11,<1.3.0" +invenio-i18n = ">=2.0.0,<3.0.0" jsonpickle = ">=1.2" -markupsafe = ">=1.1.0,<2.1.0" mock = ">=4.0.3,<5.0.0" psutil = ">=5.9.0,<6.0.0" pycountry = ">=19.7.15" -pytest-invenio = ">=1.4.0,<1.4.12" +pytest-invenio = ">=2.1.0,<=3.0.0" python-dateutil = ">=2.8.2,<3.0.0" -SQLAlchemy = ">=1.2.18,<1.4.0" -SQLAlchemy-Utils = ">=0.33.1,<0.36" +SQLAlchemy = ">=1.2.18,<1.5.0" +SQLAlchemy-Utils = ">=0.33.1,<0.39" [[package]] name = "invenio-theme" -version = "1.3.32" +version = "2.5.7" description = "\"Invenio standard theme.\"" optional = false python-versions = ">=3.7" files = [ - {file = "invenio-theme-1.3.32.tar.gz", hash = "sha256:175a5d724fa597feca0e22d7a4d74dacdc2dbd773f1b8cf03beebf9e11850fcb"}, - {file = "invenio_theme-1.3.32-py2.py3-none-any.whl", hash = "sha256:edb83b45259a3db44e4e38322ea22f146103133b78af6863224e150d51ef2d45"}, + {file = "invenio-theme-2.5.7.tar.gz", hash = "sha256:020eba28f19238d55c73116bc89f0dcd7a4027407c612c025a6b62eacd1ea9ef"}, + {file = "invenio_theme-2.5.7-py2.py3-none-any.whl", hash = "sha256:82680c020900a8b1d0503d5e5a5e0df0022464f3d3186ad7aaaf6dc9043256d2"}, ] [package.dependencies] @@ -2371,66 +2427,31 @@ Flask-Breadcrumbs = ">=0.4.0" Flask-Menu = ">=0.5.0,<1.0.0" invenio-assets = ">=1.2.7" invenio-base = ">=1.2.5" -invenio-i18n = ">=1.3.1" +invenio-i18n = ">=2.0.0" jsmin = ">=3.0.0" [package.extras] -tests = ["Sphinx (==4.2.0)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.2)"] - -[[package]] -name = "invenio-userprofiles" -version = "1.2.1" -description = "User profiles module for Invenio." -optional = false -python-versions = "*" -files = [] -develop = false - -[package.dependencies] -Flask-Breadcrumbs = ">=0.5.0" -Flask-Mail = ">=0.9.1" -Flask-Menu = ">=0.5.0" -Flask-WTF = ">=0.14.3" -invenio-accounts = ">=1.2.1" -invenio-base = ">=1.2.2" -invenio-i18n = ">=1.2.0" -invenio-theme = ">=1.3.4" - -[package.extras] -admin = ["invenio-admin (>=1.2.0)"] -all = ["Sphinx (>=1.4.2,<3.0.0)", "invenio-admin (>=1.2.0)", "invenio-mail (>=1.0.0)", "pytest-invenio (>=1.4.0)"] -docs = ["Sphinx (>=1.4.2,<3.0.0)", "invenio-mail (>=1.0.0)"] -mysql = ["invenio-db[mysql] (>=1.0.5)"] -postgresql = ["invenio-db[postgresql] (>=1.0.5)"] -sqlite = ["invenio-db (>=1.0.5)"] -tests = ["pytest-invenio (>=1.4.0)"] - -[package.source] -type = "git" -url = "https://github.com/rero/invenio-userprofiles.git" -reference = "v1.2.1-rero2.0" -resolved_reference = "41d2b471cde1a93f660ba7bf0037ee3fb80b65fc" +tests = ["Sphinx (==4.2.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.2)"] [[package]] name = "ipython" -version = "8.17.2" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.9" files = [ - {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, - {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" @@ -2489,13 +2510,13 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "itsdangerous" -version = "1.1.0" -description = "Various helpers to pass data to untrusted environments and back." +version = "2.0.1" +description = "Safely pass data to untrusted environments and back." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" files = [ - {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, - {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, + {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, + {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, ] [[package]] @@ -2519,20 +2540,20 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "2.11.3" +version = "3.1.2" description = "A very fast and expressive template engine." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "jsmin" @@ -2566,7 +2587,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, ] [package.dependencies] @@ -2596,73 +2616,83 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] name = "jsonref" -version = "0.3.0" +version = "1.1.0" description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." optional = false -python-versions = ">=3.3,<4.0" +python-versions = ">=3.7" files = [ - {file = "jsonref-0.3.0-py3-none-any.whl", hash = "sha256:9480ad1b500f7e795daeb0ef29f9c55ae3a9ab38fb8d6659b6f4868acb5a5bc8"}, - {file = "jsonref-0.3.0.tar.gz", hash = "sha256:68b330c6815dc0d490dbb3d65ccda265ddde9f7856fd2f3322f971d456ea7549"}, + {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, + {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, ] [[package]] name = "jsonresolver" -version = "0.3.1" +version = "0.3.2" description = "JSON data resolver with support for plugins." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "jsonresolver-0.3.1-py2.py3-none-any.whl", hash = "sha256:f17a526988456d9895023ae3580714d6ce6af5656869d11d9860dc4a799cf6d4"}, - {file = "jsonresolver-0.3.1.tar.gz", hash = "sha256:2d8090f6a1fe92e70f2903f05515415bde7ce46402e528279f865bce4ee689ca"}, + {file = "jsonresolver-0.3.2-py2.py3-none-any.whl", hash = "sha256:33ed39dc582db4b011a1356ebb76c43317f069f01f98f357da9a4cdb6a6539d5"}, + {file = "jsonresolver-0.3.2.tar.gz", hash = "sha256:66d70fd43d0b961a18aa09917bd1a49400f0adb7ed70fb2611188f319f306ed9"}, ] [package.dependencies] pluggy = ">=0.10.0,<1.0" -six = ">=1.12.0" werkzeug = ">=1.0.0" [package.extras] -all = ["Sphinx (>=1.5.1)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "jsonref (>=0.1)", "jsonschema (>=2.5.1)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest (>=3.6.0)", "pytest-cache (>=1.0)", "pytest-cov (>=2.8.1)", "pytest-pep8 (>=1.0.6)", "requests (>=2.7.0)"] -docs = ["Sphinx (>=1.5.1)"] -jsonref = ["jsonref (>=0.1)"] +jsonref = ["jsonref (>=1.0.0)"] jsonschema = ["jsonschema (>=2.5.1)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest (>=3.6.0)", "pytest-cache (>=1.0)", "pytest-cov (>=2.8.1)", "pytest-pep8 (>=1.0.6)", "requests (>=2.7.0)"] +tests = ["jsonref (>=1.0.0)", "jsonschema (>=2.5.1)", "mock (>=1.3.0)", "pytest-black (>=0.3.0)", "pytest-cache (>=1.0)", "pytest-invenio (>=2.0.0,<3.0.0)", "requests (>=2.7.0)", "sphinx (>=4.5)"] [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.20.0" description = "An implementation of JSON Schema validation for Python" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, + {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, + {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, ] [package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" [package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.11.2" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.11.2-py3-none-any.whl", hash = "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93"}, + {file = "jsonschema_specifications-2023.11.2.tar.gz", hash = "sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8"}, +] + +[package.dependencies] +referencing = ">=0.31.0" [[package]] name = "kombu" -version = "5.3.3" +version = "5.3.4" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.3-py3-none-any.whl", hash = "sha256:6cd5c5d5ef77538434b8f81f3e265c414269418645dbb47dbf130a8a05c3e357"}, - {file = "kombu-5.3.3.tar.gz", hash = "sha256:1491df826cfc5178c80f3e89dd6dfba68e484ef334db81070eb5cb8094b31167"}, + {file = "kombu-5.3.4-py3-none-any.whl", hash = "sha256:63bb093fc9bb80cfb3a0972336a5cec1fa7ac5f9ef7e8237c6bf8dda9469313e"}, + {file = "kombu-5.3.4.tar.gz", hash = "sha256:0bb2e278644d11dea6272c17974a3dbb9688a949f3bb60aeb5b791329c44fadc"}, ] [package.dependencies] @@ -2722,6 +2752,8 @@ files = [ {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, @@ -2819,13 +2851,13 @@ source = ["Cython (>=0.29.35)"] [[package]] name = "mako" -version = "1.2.4" +version = "1.3.0" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, + {file = "Mako-1.3.0-py3-none-any.whl", hash = "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9"}, + {file = "Mako-1.3.0.tar.gz", hash = "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"}, ] [package.dependencies] @@ -2868,80 +2900,61 @@ Markdown = ">=3.0.1" [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -2980,13 +2993,63 @@ traitlets = "*" [[package]] name = "maxminddb" -version = "2.4.0" +version = "2.5.1" description = "Reader for the MaxMind DB format" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "maxminddb-2.4.0.tar.gz", hash = "sha256:81e54e53408bd502650e5969ccba16780af659ec1db1c44b2c997e4330a5ed96"}, -] + {file = "maxminddb-2.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:62e93a8e99937bf4307eeece3ca37e1161325ebf9363c4ce195410fb5daf64a0"}, + {file = "maxminddb-2.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea2e27a507b53dfbf2ba2ba85c98682a1ad2dac3f9941a7bffa5cb86150d0c47"}, + {file = "maxminddb-2.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01b0341bd6bee431bb8c07c7ac0ed221250c7390b125c025b7d57578e78e8a3"}, + {file = "maxminddb-2.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:607344b1079ea647629bf962dcea7580ec864faaad3f5aae650e2e8652121d89"}, + {file = "maxminddb-2.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c2901daebd7c8a702302315e7a58cdc38e626406ad4a05b4d48634897d5f5a3"}, + {file = "maxminddb-2.5.1-cp310-cp310-win32.whl", hash = "sha256:7805ae8c9de433c38939ada2e376706a9f6740239f61fd445927b88f5b42c267"}, + {file = "maxminddb-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:f1e5bd58b71f322dc6c16a95a129433b1bc229d4b714f870a61c2367425396ee"}, + {file = "maxminddb-2.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0bbbd58b300aaddf985f763720bdebba9f7a73168ff9f57168117f630ad1c06"}, + {file = "maxminddb-2.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a6751e2e89d62d53217870bcc2a8c887dc56ae370ba1b74e52e880761916e54"}, + {file = "maxminddb-2.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ecb1be961f1969be047d07743093f0dcf2f6d4ec3a06a4555587f380a96f6e7"}, + {file = "maxminddb-2.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1e091c2b44673c218ee2df23adbc0b6d04fd5c646cfcb6c6fe26fb849434812a"}, + {file = "maxminddb-2.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09b295c401c104ae0e30f66c1a3f3c2aa4ba2cbe12a787576499356a5a4d6c1"}, + {file = "maxminddb-2.5.1-cp311-cp311-win32.whl", hash = "sha256:3d52c693baf07bba897d109b0ecb067f21fd0cc0fb266d67db456e85b80d699e"}, + {file = "maxminddb-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:4c67621e842c415ce336ab019a9f087305dfcf24c095b68b8e9d27848f6f6d91"}, + {file = "maxminddb-2.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17ea454f61631b9815d420d48d00663f8718fc7de30be53ffcec0f73989475eb"}, + {file = "maxminddb-2.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef4d508c899ce0f37de731340759c68bfd1102a39a873675c71fae2c8d71ad97"}, + {file = "maxminddb-2.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e5ca423b1e310f0327536f5ed1a2c6e08d83289a7f909e021590b0b477cae2"}, + {file = "maxminddb-2.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0a21abd85e10e5e0f60244b49c3db17e7e48befd4972e62a62833d91e2acbb49"}, + {file = "maxminddb-2.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:85a302d79577efe5bc308647394ffdc535dd5f062644c41103604ccf24931a05"}, + {file = "maxminddb-2.5.1-cp312-cp312-win32.whl", hash = "sha256:dd28c434fb44f825dde6a75df2c338d44645791b03480af66a4d993f93801e10"}, + {file = "maxminddb-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:b477852cf1741d9187b021e23723e64b063794bbf946a9b5b84cc222f3caf58a"}, + {file = "maxminddb-2.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1e1a19f9740f586362f47862d0095b54d50b9d465babcaa8a563746132fe5be"}, + {file = "maxminddb-2.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d654895b546a47e85f2e071b98e377a60bb03cd643b9423017fa66fcd5adedce"}, + {file = "maxminddb-2.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0702da59b9670a72761b65cb1a52bc3032d8f6799bdab641cb8350ad5740580b"}, + {file = "maxminddb-2.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2e20a70c1545d6626dcd4ce2d7ecf3d566d978ea64cb37e7952f93baff66b812"}, + {file = "maxminddb-2.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0cbd272db3202e948c9088e48dec62add071a47971d84ceb11d2cb2880f83e5a"}, + {file = "maxminddb-2.5.1-cp38-cp38-win32.whl", hash = "sha256:fbd01fc7d7b5b2befe914e8cdb5ed3a1c5476e57b765197cceff8d897f33d012"}, + {file = "maxminddb-2.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:fe0af3ba9e1a78ed5f2ad32fc18d18b78ef233e7d0c627e1a77a525a7eb0c241"}, + {file = "maxminddb-2.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d772be68cce812f7c4b15ae8c68e624c8b88ff83071e3903ca5b5f55e343c25"}, + {file = "maxminddb-2.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e7b3ad87d5352ed3f496bd42bffbf9f896245278b0d8e76afa1382e42a7ae"}, + {file = "maxminddb-2.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:892c11a8694394e97d3ac0f8d5974ea588c732d14e721f22095c58b4f584c144"}, + {file = "maxminddb-2.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3ce1f42bdfce7b86cb5a56cba730fed611fb879d867e6024f0d520257bef6891"}, + {file = "maxminddb-2.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6667948e7501a513caef90edda2d367865097239d4c2381eb3998e9905af7209"}, + {file = "maxminddb-2.5.1-cp39-cp39-win32.whl", hash = "sha256:500d321bdefe4dcd351e4390a79b7786aab49b0536bedfa0788e5ffb0e91e421"}, + {file = "maxminddb-2.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:93f7055779caf7753810f1e2c6444af6d727393fd116ffa0767fbd54fb8c9bbf"}, + {file = "maxminddb-2.5.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8cee4315da7cdd3f2a18f1ab1418953a7a9eda65e63095b01f03c7d3645d633e"}, + {file = "maxminddb-2.5.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97eac5af102cede4b5f57cecb25e8f949fa4e4a8d812bed575539951c60ecaf"}, + {file = "maxminddb-2.5.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:526744b12075051fa20979090c111cc3a42a3b55e2714818270c7b84a41a8cfe"}, + {file = "maxminddb-2.5.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:fad45cd2f2e3c5fbebacb8d172a60fb22443222e549bf740a0bc7eeb849e5ce7"}, + {file = "maxminddb-2.5.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b98ed5c34955c48e72d35daed713ba4a6833a8a6d1204e79d2c85e644049792"}, + {file = "maxminddb-2.5.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639aee8abd63a95baa12b94b6f3a842d51877d631879c7d08c98c68dc44a84c3"}, + {file = "maxminddb-2.5.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a7a73ab4bbc16b81983531c99fa102a0c7dae459db958c17fea48c981f5e764"}, + {file = "maxminddb-2.5.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:aae262da1940a67c3ba765c49e2308947ce68ff647f87630002c306433a98ca1"}, + {file = "maxminddb-2.5.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b223c53077a736c304b63cf5afceb928975fbd12ddae5afd6b71370bab7b4700"}, + {file = "maxminddb-2.5.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:969d0057ea5472e0b574c5293c4f3ecf49585362351c543e8ea55dc48b60f1eb"}, + {file = "maxminddb-2.5.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4d36cf3d390f02d2bdf53d9efefb92be7bd70e07a5a86cdb79020c48c2d81b7"}, + {file = "maxminddb-2.5.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:188173c07dce0692fd5660a6eb7ea8c126d7b3a4b61496c8a8ee9e8b10186ff5"}, + {file = "maxminddb-2.5.1.tar.gz", hash = "sha256:4807d374e645bd68334e4f487ba85a27189dbc1267a98e644aa686a7927e0559"}, +] + +[package.dependencies] +setuptools = ">=68.2.2" [[package]] name = "maxminddb-geolite2" @@ -3145,15 +3208,18 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "packaging" -version = "23.2" +version = "21.3" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + [[package]] name = "parso" version = "0.8.3" @@ -3199,13 +3265,13 @@ files = [ [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -3213,94 +3279,71 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "9.5.0" +version = "10.1.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -[[package]] -name = "pip" -version = "23.3.1" -description = "The PyPA recommended tool for installing Python packages." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pip-23.3.1-py3-none-any.whl", hash = "sha256:55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b"}, - {file = "pip-23.3.1.tar.gz", hash = "sha256:1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174"}, -] - [[package]] name = "pluggy" version = "0.13.1" @@ -3346,13 +3389,13 @@ files = [ [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.41" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, ] [package.dependencies] @@ -3419,6 +3462,7 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -3427,6 +3471,8 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -3537,20 +3583,20 @@ files = [ [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.3.0" description = "Python docstring style checker" optional = false python-versions = ">=3.6" files = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, ] [package.dependencies] -snowballstemmer = "*" +snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml"] +toml = ["tomli (>=1.2.3)"] [[package]] name = "pyflakes" @@ -3565,17 +3611,18 @@ files = [ [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" @@ -3588,6 +3635,9 @@ files = [ {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + [package.extras] crypto = ["cryptography (>=3.4.0)"] dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] @@ -3596,19 +3646,31 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pynpm" -version = "0.1.2" -description = "Python interface to your NPM and package.json." +version = "0.2.0" +description = "\"Python interface to your NPM and package.json.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "pynpm-0.1.2-py2.py3-none-any.whl", hash = "sha256:3f03fbf667549f8b8b7e0419eef88d1b21833ce288f96de66fbb761b9f4c4061"}, - {file = "pynpm-0.1.2.tar.gz", hash = "sha256:8a6d3f9423760cf3c142db3bf9bda5a075e8a91837e7d2e2b0a3de5be5e26da2"}, + {file = "pynpm-0.2.0-py2.py3-none-any.whl", hash = "sha256:a04d58e4c3d46be26eaae9abd1cf59109a7670c5edd9cacd90e1d3b3afdd77c0"}, + {file = "pynpm-0.2.0.tar.gz", hash = "sha256:212a1e5f86fe8b790945dd856682c6dcd8eddc6f8803a51e7046fe427d7f801b"}, ] [package.extras] -all = ["Sphinx (>=1.5.1)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "pydocstyle (>=1.0.0)", "pytest (>=2.8.0)", "pytest-cache (>=1.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)"] -docs = ["Sphinx (>=1.5.1)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "pydocstyle (>=1.0.0)", "pytest (>=2.8.0)", "pytest-cache (>=1.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)"] +tests = ["pytest-black (>=0.3.0,<0.3.10)", "pytest-cache (>=1.0)", "pytest-invenio (>=1.4.0)", "sphinx (>=4.5)"] + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyproject-hooks" @@ -3624,70 +3686,28 @@ files = [ [package.dependencies] tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -[[package]] -name = "pyrsistent" -version = "0.20.0" -description = "Persistent/Functional/Immutable data structures" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, - {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, - {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, - {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, - {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, - {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, - {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, -] - [[package]] name = "pytest" -version = "6.2.5" +version = "7.1.3" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, ] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" py = ">=1.8.2" -toml = "*" +tomli = ">=1.0.0" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" @@ -3728,33 +3748,35 @@ docs = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pytest-invenio" -version = "1.4.11" +version = "2.1.6" description = "Pytest fixtures for Invenio." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "pytest-invenio-1.4.11.tar.gz", hash = "sha256:ef0fcbd249e09b7e08458e697165d2dd643e2434be4182eeaa86a2b7da4787a7"}, - {file = "pytest_invenio-1.4.11-py2.py3-none-any.whl", hash = "sha256:7844d22333bf0f238c16abe7bc38ce220aebff2078cd58358db34da1c41ae9bb"}, + {file = "pytest-invenio-2.1.6.tar.gz", hash = "sha256:174f35361c7552d39b3d68bbd96efe463f024ce8d026625393a3af0be7ebde64"}, + {file = "pytest_invenio-2.1.6-py2.py3-none-any.whl", hash = "sha256:1dfdf50880b67821b08acc2aa3a8378ed3971f98b6e6e9763ab6fef5ffa49e91"}, ] [package.dependencies] check-manifest = ">=0.42" coverage = ">=5.3,<6" docker-services-cli = ">=0.4.0" +Flask = ">=1.1.4,<2.3.0" importlib-metadata = ">=4.4" importlib-resources = ">=5.0" -pytest = ">=6,<7" +pytest = ">=6,<7.2.0" pytest-cov = ">=3.0.0" pytest-flask = ">=1.2.0" pytest-isort = ">=3.0.0" pytest-pycodestyle = ">=2.2.0" -pytest-pydocstyle = ">=2.2.0" +pytest-pydocstyle = ">=2.2.3" selenium = ">=3.7.0,<4" [package.extras] -all = ["Sphinx (>=4.2.0)", "elasticsearch (>=7.0.0,<7.14)", "elasticsearch-dsl (>=7.0.0,<8.0.0)", "invenio-celery (>=1.2.4)", "invenio-db (>=1.0.12,<1.1.0)", "invenio-files-rest (>=1.3.2)", "invenio-mail (>=1.0.2,<1.1.0)", "invenio-search (>=1.4.2,<1.5.0)"] -docs = ["Sphinx (>=4.2.0)"] -tests = ["elasticsearch (>=7.0.0,<7.14)", "elasticsearch-dsl (>=7.0.0,<8.0.0)", "invenio-celery (>=1.2.4)", "invenio-db (>=1.0.12,<1.1.0)", "invenio-files-rest (>=1.3.2)", "invenio-mail (>=1.0.2,<1.1.0)", "invenio-search (>=1.4.2,<1.5.0)"] +elasticsearch7 = ["invenio-search[elasticsearch7] (>=2.1.0,<3.0.0)"] +opensearch1 = ["invenio-search[opensearch1] (>=2.1.0,<3.0.0)"] +opensearch2 = ["invenio-search[opensearch2] (>=2.1.0,<3.0.0)"] +tests = ["invenio-celery (>=1.2.4,<2.0.0)", "invenio-db (>=1.0.12,<2.0.0)", "invenio-files-rest (>=1.3.2,<2.0.0)", "invenio-mail (>=1.0.2,<2.0.0)", "invenio-search (>=2.1.0,<3.0.0)", "pytest-black (>=0.3.0)", "sphinx (>=4.5)"] [[package]] name = "pytest-isort" @@ -3773,37 +3795,38 @@ pytest = ">=5.0" [[package]] name = "pytest-pycodestyle" -version = "2.2.1" +version = "2.3.1" description = "pytest plugin to run pycodestyle" optional = false -python-versions = "~=3.6" +python-versions = "~=3.7" files = [ - {file = "pytest-pycodestyle-2.2.1.tar.gz", hash = "sha256:64b1512303bf05d96a4d5de5e4022ee9ba98255b5ed39b2a2a4acc3e0b0a8533"}, + {file = "pytest-pycodestyle-2.3.1.tar.gz", hash = "sha256:2901327b8e6beab90298a9803074483efe560e191bef81d9e18119b141222830"}, ] [package.dependencies] +py = "*" pycodestyle = "*" -pytest = ">=5.4" +pytest = ">=7.0" [package.extras] tests = ["pytest-isort"] [[package]] name = "pytest-pydocstyle" -version = "2.2.1" +version = "2.3.2" description = "pytest plugin to run pydocstyle" optional = false -python-versions = "~=3.6" +python-versions = "~=3.7" files = [ - {file = "pytest-pydocstyle-2.2.1.tar.gz", hash = "sha256:bbb82942ea6ea96dc035f2bc645a4f25eb4078df606e1520351d8c37719facfd"}, + {file = "pytest-pydocstyle-2.3.2.tar.gz", hash = "sha256:a30b28d49607b2fcd7b24678ab6c4e27a288710a34b3a0f1f90f3497e88771c3"}, ] [package.dependencies] pydocstyle = "*" -pytest = ">=5.4" +pytest = ">=7.0" [package.extras] -tests = ["pytest-isort", "pytest-pycodestyle (>=2.1,<3.0)"] +tests = ["pytest-isort", "pytest-pycodestyle (>=2.3,<3.0)"] [[package]] name = "python-dateutil" @@ -3913,25 +3936,6 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] -[[package]] -name = "raven" -version = "6.10.0" -description = "Raven is a client for Sentry (https://getsentry.com)" -optional = false -python-versions = "*" -files = [ - {file = "raven-6.10.0-py2.py3-none-any.whl", hash = "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4"}, - {file = "raven-6.10.0.tar.gz", hash = "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54"}, -] - -[package.dependencies] -blinker = {version = ">=1.1", optional = true, markers = "extra == \"flask\""} -Flask = {version = ">=0.8", optional = true, markers = "extra == \"flask\""} - -[package.extras] -flask = ["Flask (>=0.8)", "blinker (>=1.1)"] -tests = ["Flask (>=0.8)", "Flask-Login (>=0.2.0)", "ZConfig", "aiohttp", "anyjson", "blinker (>=1.1)", "blinker (>=1.1)", "bottle", "celery (>=2.5)", "coverage (<4)", "exam (>=0.5.2)", "flake8 (==3.5.0)", "logbook", "mock", "nose", "pytest (>=3.2.0,<3.3.0)", "pytest-cov (==2.5.1)", "pytest-flake8 (==1.0.0)", "pytest-pythonpath (==0.7.2)", "pytest-timeout (==1.2.1)", "pytest-xdist (==1.18.2)", "pytz", "requests", "sanic (>=0.7.0)", "tornado (>=4.1,<5.0)", "tox", "webob", "webtest", "wheel"] - [[package]] name = "redis" version = "5.0.1" @@ -3963,6 +3967,21 @@ files = [ [package.dependencies] jsonpickle = "1.4.2" +[[package]] +name = "referencing" +version = "0.31.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.31.1-py3-none-any.whl", hash = "sha256:c19c4d006f1757e3dd75c4f784d38f8698d87b649c54f9ace14e5e8c9667c01d"}, + {file = "referencing-0.31.1.tar.gz", hash = "sha256:81a1471c68c9d5e3831c30ad1dd9815c45b558e596653db751a2bfdd17b3b9ec"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "regex" version = "2023.10.3" @@ -4101,44 +4120,239 @@ rsa = ["oauthlib[signedtoken] (>=2.1.0,<3.0.0)"] [[package]] name = "rero-invenio-base" -version = "0.2.1" +version = "0.2.2" description = "Generic backend libraries for RERO Invenio instances." optional = false -python-versions = ">=3.8,<3.10" -files = [ - {file = "rero_invenio_base-0.2.1-py3-none-any.whl", hash = "sha256:265c3ea644c0c39bc02409f8777a06442bb88ca2edcc2066b55d8791c56fbd02"}, - {file = "rero_invenio_base-0.2.1.tar.gz", hash = "sha256:4071a8de2201e35a22055fc42580ef2eaadb95f70c5319622b150dff3d30453a"}, -] +python-versions = ">=3.8, <3.10" +files = [] +develop = false [package.dependencies] -docker-services-cli = ">=0.6.1,<0.7.0" +docker-services-cli = "^0.6.1" dparse = ">=0.5.2" -invenio-db = {version = ">=1.0.14,<1.1.0", extras = ["postgresql"]} -invenio-indexer = "<2.2.0" +invenio-db = {version = ">=1.1.0,<1.2.0", extras = ["postgresql"]} +invenio-indexer = "<3.0.0" invenio-records-rest = "<2.3.0" -invenio-search = {version = ">=1.4.2,<3.0.0", extras = ["elasticsearch7"]} +invenio-search = {version = "<3.0.0", extras = ["elasticsearch7"]} jsonpatch = "<=2.0" Mako = ">=1.2.2" -pydocstyle = ">=6.1.1,<6.2.0" +pydocstyle = ">=6.1.1" PyYAML = "<=7.0" +sqlalchemy = ">=1.3.0,<1.5.0" + +[package.source] +type = "git" +url = "https://github.com/rero/rero-invenio-base.git" +reference = "master" +resolved_reference = "b19153de02bdb9ad02d55bc3fb645f85e576cf1f" + +[[package]] +name = "rpds-py" +version = "0.13.2" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.13.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d"}, + {file = "rpds_py-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d"}, + {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f"}, + {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea"}, + {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1"}, + {file = "rpds_py-0.13.2-cp310-none-win32.whl", hash = "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc"}, + {file = "rpds_py-0.13.2-cp310-none-win_amd64.whl", hash = "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd"}, + {file = "rpds_py-0.13.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad"}, + {file = "rpds_py-0.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c"}, + {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8"}, + {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e"}, + {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d"}, + {file = "rpds_py-0.13.2-cp311-none-win32.whl", hash = "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7"}, + {file = "rpds_py-0.13.2-cp311-none-win_amd64.whl", hash = "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211"}, + {file = "rpds_py-0.13.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381"}, + {file = "rpds_py-0.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee"}, + {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2"}, + {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7"}, + {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60"}, + {file = "rpds_py-0.13.2-cp312-none-win32.whl", hash = "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d"}, + {file = "rpds_py-0.13.2-cp312-none-win_amd64.whl", hash = "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27"}, + {file = "rpds_py-0.13.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1"}, + {file = "rpds_py-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083"}, + {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a"}, + {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66"}, + {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b"}, + {file = "rpds_py-0.13.2-cp38-none-win32.whl", hash = "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab"}, + {file = "rpds_py-0.13.2-cp38-none-win_amd64.whl", hash = "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1"}, + {file = "rpds_py-0.13.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c"}, + {file = "rpds_py-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53"}, + {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b"}, + {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0"}, + {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468"}, + {file = "rpds_py-0.13.2-cp39-none-win32.whl", hash = "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c"}, + {file = "rpds_py-0.13.2-cp39-none-win_amd64.whl", hash = "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31"}, + {file = "rpds_py-0.13.2.tar.gz", hash = "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f"}, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.5" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruamel.yaml-0.18.5-py3-none-any.whl", hash = "sha256:a013ac02f99a69cdd6277d9664689eb1acba07069f912823177c5eced21a6ada"}, + {file = "ruamel.yaml-0.18.5.tar.gz", hash = "sha256:61917e3a35a569c1133a8f772e1226961bf5a1198bea7e23f06a0841dea1ab0e"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] [[package]] name = "safety" -version = "1.10.3" -description = "Checks installed dependencies for known vulnerabilities." +version = "2.3.5" +description = "Checks installed dependencies for known vulnerabilities and licenses." optional = false -python-versions = ">=3.5" +python-versions = "*" files = [ - {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"}, - {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"}, + {file = "safety-2.3.5-py3-none-any.whl", hash = "sha256:2227fcac1b22b53c1615af78872b48348661691450aa25d6704a5504dbd1f7e2"}, + {file = "safety-2.3.5.tar.gz", hash = "sha256:a60c11f8952f412cbb165d70cb1f673a3b43a2ba9a93ce11f97e6a4de834aa3a"}, ] [package.dependencies] -Click = ">=6.0" -dparse = ">=0.5.1" -packaging = "*" +Click = ">=8.0.2" +dparse = ">=0.6.2" +packaging = ">=21.0,<22.0" requests = "*" -setuptools = "*" +"ruamel.yaml" = ">=0.17.21" +setuptools = ">=19.3" + +[package.extras] +github = ["jinja2 (>=3.1.0)", "pygithub (>=1.43.3)"] +gitlab = ["python-gitlab (>=1.3.0)"] [[package]] name = "selenium" @@ -4156,54 +4370,67 @@ urllib3 = "*" [[package]] name = "sentry-sdk" -version = "1.6.0" +version = "1.38.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.6.0.tar.gz", hash = "sha256:b82ad57306d5546713f15d5d70daea0408cf7f998c7566db16e0e6257e51e561"}, - {file = "sentry_sdk-1.6.0-py2.py3-none-any.whl", hash = "sha256:ddbd191b6f4e696b7845b4d87389898ae1207981faf114f968a57363aa6be03c"}, + {file = "sentry-sdk-1.38.0.tar.gz", hash = "sha256:8feab81de6bbf64f53279b085bd3820e3e737403b0a0d9317f73a2c3374ae359"}, + {file = "sentry_sdk-1.38.0-py2.py3-none-any.whl", hash = "sha256:0017fa73b8ae2d4e57fd2522ee3df30453715b29d2692142793ec5d5f90b94a6"}, ] [package.dependencies] blinker = {version = ">=1.1", optional = true, markers = "extra == \"flask\""} certifi = "*" flask = {version = ">=0.11", optional = true, markers = "extra == \"flask\""} -urllib3 = ">=1.10.0" +markupsafe = {version = "*", optional = true, markers = "extra == \"flask\""} +urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} [package.extras] aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] -flask = ["blinker (>=1.1)", "flask (>=0.11)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] rq = ["rq (>=0.6)"] sanic = ["sanic (>=0.8)"] sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=5)"] [[package]] name = "setuptools" -version = "66.1.1" +version = "69.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-66.1.1-py3-none-any.whl", hash = "sha256:6f590d76b713d5de4e49fe4fbca24474469f53c83632d5d0fd056f7ff7e8112b"}, - {file = "setuptools-66.1.1.tar.gz", hash = "sha256:ac4008d396bc9cd983ea483cb7139c0240a07bbc74ffb6232fceffedc6cf03a8"}, + {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, + {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "sickle" @@ -4384,80 +4611,89 @@ files = [ [[package]] name = "sphinx" -version = "3.4.1" +version = "5.3.0" description = "Python documentation generator" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "Sphinx-3.4.1-py3-none-any.whl", hash = "sha256:aeef652b14629431c82d3fe994ce39ead65b3fe87cf41b9a3714168ff8b83376"}, - {file = "Sphinx-3.4.1.tar.gz", hash = "sha256:e450cb205ff8924611085183bf1353da26802ae73d9251a8fcdf220a8f8712ef"}, + {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, + {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.12" -imagesize = "*" -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.12" requests = ">=2.5.0" -setuptools = "*" -snowballstemmer = ">=1.1" +snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.790)"] -test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.4" +version = "1.0.7" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, + {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, + {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "1.0.5" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, + {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.1" +version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, + {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, + {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] @@ -4478,140 +4714,145 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "1.0.6" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, + {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "1.1.9" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, + {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.3.24" +version = "1.4.50" description = "Database Abstraction Library" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "SQLAlchemy-1.3.24-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:87a2725ad7d41cd7376373c15fd8bf674e9c33ca56d0b8036add2d634dba372e"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win32.whl", hash = "sha256:f597a243b8550a3a0b15122b14e49d8a7e622ba1c9d29776af741f1845478d79"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win_amd64.whl", hash = "sha256:fc4cddb0b474b12ed7bdce6be1b9edc65352e8ce66bc10ff8cbbfb3d4047dbf4"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f1149d6e5c49d069163e58a3196865e4321bad1803d7886e07d8710de392c548"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:14f0eb5db872c231b20c18b1e5806352723a3a89fb4254af3b3e14f22eaaec75"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:e98d09f487267f1e8d1179bf3b9d7709b30a916491997137dd24d6ae44d18d79"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:fc1f2a5a5963e2e73bac4926bdaf7790c4d7d77e8fc0590817880e22dd9d0b8b"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win32.whl", hash = "sha256:f3c5c52f7cb8b84bfaaf22d82cb9e6e9a8297f7c2ed14d806a0f5e4d22e83fb7"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win_amd64.whl", hash = "sha256:0352db1befcbed2f9282e72843f1963860bf0e0472a4fa5cf8ee084318e0e6ab"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:2ed6343b625b16bcb63c5b10523fd15ed8934e1ed0f772c534985e9f5e73d894"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:34fcec18f6e4b24b4a5f6185205a04f1eab1e56f8f1d028a2a03694ebcc2ddd4"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e47e257ba5934550d7235665eee6c911dc7178419b614ba9e1fbb1ce6325b14f"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:816de75418ea0953b5eb7b8a74933ee5a46719491cd2b16f718afc4b291a9658"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win32.whl", hash = "sha256:26155ea7a243cbf23287f390dba13d7927ffa1586d3208e0e8d615d0c506f996"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win_amd64.whl", hash = "sha256:f03bd97650d2e42710fbe4cf8a59fae657f191df851fc9fc683ecef10746a375"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a006d05d9aa052657ee3e4dc92544faae5fcbaafc6128217310945610d862d39"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1e2f89d2e5e3c7a88e25a3b0e43626dba8db2aa700253023b82e630d12b37109"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0d5d862b1cfbec5028ce1ecac06a3b42bc7703eb80e4b53fceb2738724311443"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0172423a27fbcae3751ef016663b72e1a516777de324a76e30efa170dbd3dd2d"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win32.whl", hash = "sha256:d37843fb8df90376e9e91336724d78a32b988d3d20ab6656da4eb8ee3a45b63c"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win_amd64.whl", hash = "sha256:c10ff6112d119f82b1618b6dc28126798481b9355d8748b64b9b55051eb4f01b"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:861e459b0e97673af6cc5e7f597035c2e3acdfb2608132665406cded25ba64c7"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5de2464c254380d8a6c20a2746614d5a436260be1507491442cf1088e59430d2"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d375d8ccd3cebae8d90270f7aa8532fe05908f79e78ae489068f3b4eee5994e8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:014ea143572fee1c18322b7908140ad23b3994036ef4c0d630110faf942652f8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win32.whl", hash = "sha256:6607ae6cd3a07f8a4c3198ffbf256c261661965742e2b5265a77cd5c679c9bba"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win_amd64.whl", hash = "sha256:fcb251305fa24a490b6a9ee2180e5f8252915fb778d3dafc70f9cc3f863827b9"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01aa5f803db724447c1d423ed583e42bf5264c597fd55e4add4301f163b0be48"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4d0e3515ef98aa4f0dc289ff2eebb0ece6260bbf37c2ea2022aad63797eacf60"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bce28277f308db43a6b4965734366f533b3ff009571ec7ffa583cb77539b84d6"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8110e6c414d3efc574543109ee618fe2c1f96fa31833a1ff36cc34e968c4f233"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win32.whl", hash = "sha256:ee5f5188edb20a29c1cc4a039b074fdc5575337c9a68f3063449ab47757bb064"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win_amd64.whl", hash = "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b"}, - {file = "SQLAlchemy-1.3.24.tar.gz", hash = "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519"}, -] - -[package.extras] +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00665725063692c42badfd521d0c4392e83c6c826795d38eb88fb108e5660e5"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85292ff52ddf85a39367057c3d7968a12ee1fb84565331a36a8fead346f08796"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0fed0f791d78e7767c2db28d34068649dfeea027b83ed18c45a423f741425cb"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db4db3c08ffbb18582f856545f058a7a5e4ab6f17f75795ca90b3c38ee0a8ba4"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14b0cacdc8a4759a1e1bd47dc3ee3f5db997129eb091330beda1da5a0e9e5bd7"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fb9cb60e0f33040e4f4681e6658a7eb03b5cb4643284172f91410d8c493dace"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cb501d585aa74a0f86d0ea6263b9c5e1d1463f8f9071392477fd401bd3c7cc"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a7a66297e46f85a04d68981917c75723e377d2e0599d15fbe7a56abed5e2d75"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1db0221cb26d66294f4ca18c533e427211673ab86c1fbaca8d6d9ff78654293"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7dbe6369677a2bea68fe9812c6e4bbca06ebfa4b5cde257b2b0bf208709131"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a9bddb60566dc45c57fd0a5e14dd2d9e5f106d2241e0a2dc0c1da144f9444516"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82dd4131d88395df7c318eeeef367ec768c2a6fe5bd69423f7720c4edb79473c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:273505fcad22e58cc67329cefab2e436006fc68e3c5423056ee0513e6523268a"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3257a6e09626d32b28a0c5b4f1a97bced585e319cfa90b417f9ab0f6145c33c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d69738d582e3a24125f0c246ed8d712b03bd21e148268421e4a4d09c34f521a5"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34e1c5d9cd3e6bf3d1ce56971c62a40c06bfc02861728f368dcfec8aeedb2814"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1fcee5a2c859eecb4ed179edac5ffbc7c84ab09a5420219078ccc6edda45436"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbaf6643a604aa17e7a7afd74f665f9db882df5c297bdd86c38368f2c471f37d"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e70e0673d7d12fa6cd363453a0d22dac0d9978500aa6b46aa96e22690a55eab"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b881ac07d15fb3e4f68c5a67aa5cdaf9eb8f09eb5545aaf4b0a5f5f4659be18"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6997da81114daef9203d30aabfa6b218a577fc2bd797c795c9c88c9eb78d49"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdb77e1789e7596b77fd48d99ec1d2108c3349abd20227eea0d48d3f8cf398d9"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:128a948bd40780667114b0297e2cc6d657b71effa942e0a368d8cc24293febb3"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d526aeea1bd6a442abc7c9b4b00386fd70253b80d54a0930c0a216230a35be"}, + {file = "SQLAlchemy-1.4.50.tar.gz", hash = "sha256:3b97ddf509fc21e10b09403b5219b06c5b558b27fc2453150274fa4e70707dbf"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", optional = true, markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\" or extra == \"asyncio\")"} + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mysql = ["mysqlclient"] -oracle = ["cx-oracle"] -postgresql = ["psycopg2"] -postgresql-pg8000 = ["pg8000 (<1.16.6)"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] [[package]] name = "sqlalchemy-continuum" -version = "1.3.15" +version = "1.4.0" description = "Versioning and auditing extension for SQLAlchemy." optional = false python-versions = "*" files = [ - {file = "SQLAlchemy-Continuum-1.3.15.tar.gz", hash = "sha256:a52689d1580daabc496ca8420fa742d62b371bc43921d6c06374192e52e0c409"}, - {file = "SQLAlchemy_Continuum-1.3.15-py3-none-any.whl", hash = "sha256:d2ecc798500f5d5195ecd2143f7d1eabb0aa46e0f213e38bfeb4331d25cc08d3"}, + {file = "SQLAlchemy-Continuum-1.4.0.tar.gz", hash = "sha256:464f9a5b106352b5ee44f139312cb358c592d25eeaae3537c0eac72c2fafb5e5"}, + {file = "SQLAlchemy_Continuum-1.4.0-py3-none-any.whl", hash = "sha256:a1de72660bb026cfaa6b8922ef79efaed5e7bc5e423f1d792d4c38e08ffaf3ae"}, ] [package.dependencies] -six = "*" -SQLAlchemy = ">=1.0.8" +SQLAlchemy = ">=1.4.0" SQLAlchemy-Utils = ">=0.30.12" [package.extras] flask = ["Flask (>=0.9)"] flask-login = ["Flask-Login (>=0.2.9)"] -flask-sqlalchemy = ["Flask-SQLAlchemy (>=1.0,<3.0.0)"] -flexmock = ["flexmock (>=0.9.7)"] +flask-sqlalchemy = ["Flask-SQLAlchemy (>=1.0)"] i18n = ["SQLAlchemy-i18n (>=0.8.4,!=1.1.0)"] -test = ["Flask (>=0.9)", "Flask-Login (>=0.2.9)", "Flask-SQLAlchemy (>=1.0,<3.0.0)", "PyMySQL (>=0.8.0)", "SQLAlchemy-i18n (>=0.8.4,!=1.1.0)", "flexmock (>=0.9.7)", "psycopg2 (>=2.4.6)", "pytest (>=2.3.5)", "six (>=1.4.0)"] +test = ["Flask (>=0.9)", "Flask-Login (>=0.2.9)", "Flask-SQLAlchemy (>=1.0)", "PyMySQL (>=0.8.0)", "SQLAlchemy-i18n (>=0.8.4,!=1.1.0)", "psycopg2 (>=2.4.6)", "pytest (>=2.3.5)"] [[package]] name = "sqlalchemy-utils" -version = "0.35.0" +version = "0.38.3" description = "Various utility functions for SQLAlchemy." optional = false -python-versions = "*" +python-versions = "~=3.6" files = [ - {file = "SQLAlchemy-Utils-0.35.0.tar.gz", hash = "sha256:01f0f0ebed696386bc7bf9231cd6894087baba374dd60f40eb1b07512d6b1a5e"}, + {file = "SQLAlchemy-Utils-0.38.3.tar.gz", hash = "sha256:9f9afba607a40455cf703adfa9846584bf26168a0c5a60a70063b70d65051f4d"}, + {file = "SQLAlchemy_Utils-0.38.3-py3-none-any.whl", hash = "sha256:5c13b5d08adfaa85f3d4e8ec09a75136216fad41346980d02974a70a77988bf9"}, ] [package.dependencies] -six = "*" -SQLAlchemy = ">=1.0" +SQLAlchemy = ">=1.3" [package.extras] -anyjson = ["anyjson (>=0.3.3)"] arrow = ["arrow (>=0.3.4)"] babel = ["Babel (>=1.3)"] color = ["colour (>=0.0.4)"] encrypted = ["cryptography (>=0.6)"] -enum = ["enum34"] intervals = ["intervals (>=0.7.1)"] -ipaddress = ["ipaddr"] password = ["passlib (>=1.6,<2.0)"] +pendulum = ["pendulum (>=2.0.5)"] phone = ["phonenumbers (>=5.9.2)"] -test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "mock (==2.0.0)", "pg8000 (>=1.12.4)", "psycopg2 (>=2.5.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] -test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "anyjson (>=0.3.3)", "arrow (>=0.3.4)", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "enum34", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "ipaddr", "isort (>=4.2.2)", "mock (==2.0.0)", "passlib (>=1.6,<2.0)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg2 (>=2.5.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] timezone = ["python-dateutil"] url = ["furl (>=0.4.1)"] @@ -4658,18 +4899,18 @@ files = [ [[package]] name = "traitlets" -version = "5.13.0" +version = "5.14.0" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, - {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, + {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, + {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "types-python-dateutil" @@ -4732,6 +4973,28 @@ files = [ {file = "ua_parser-0.18.0-py2.py3-none-any.whl", hash = "sha256:9d94ac3a80bcb0166823956a779186c746b50ea4c9fd9bf30fdb758553c38950"}, ] +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + +[[package]] +name = "uritemplate-py" +version = "1.0.1" +description = "URI templates" +optional = false +python-versions = "*" +files = [ + {file = "uritemplate.py-1.0.1-py2-none-any.whl", hash = "sha256:f34e1594bc95eb4e1ed3f10bcd7bd09b344dc42d512af2e3f5b0c73f879cbb0e"}, + {file = "uritemplate.py-1.0.1.tar.gz", hash = "sha256:0114a587830229bd1dea03bfb8201a04d212d648ce16847f6f5887771305886a"}, +] + [[package]] name = "uritools" version = "4.0.2" @@ -4865,13 +5128,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.9" +version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, - {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, ] [[package]] @@ -4910,19 +5173,33 @@ files = [ [[package]] name = "werkzeug" -version = "1.0.1" +version = "2.2.3" description = "The comprehensive WSGI web application library." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, - {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, + {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, + {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, ] +[package.dependencies] +MarkupSafe = ">=2.1.1" + [package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "pytest-timeout", "sphinx", "sphinx-issues", "tox"] watchdog = ["watchdog"] +[[package]] +name = "whoosh" +version = "2.7.4" +description = "Fast, pure-Python full text indexing, search, and spell checking library." +optional = false +python-versions = "*" +files = [ + {file = "Whoosh-2.7.4-py2.py3-none-any.whl", hash = "sha256:aa39c3c3426e3fd107dcb4bde64ca1e276a65a889d9085a6e4b54ba82420a852"}, + {file = "Whoosh-2.7.4.tar.gz", hash = "sha256:7ca5633dbfa9e0e0fa400d3151a8a0c4bec53bd2ecedc0a67705b17565c31a83"}, + {file = "Whoosh-2.7.4.zip", hash = "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"}, +] + [[package]] name = "wtforms" version = "2.3.3" @@ -5025,4 +5302,4 @@ sip2 = ["invenio-sip2"] [metadata] lock-version = "2.0" python-versions = ">= 3.9, <3.10" -content-hash = "2ed6577b3d5f5cc6445640661f096d76c384fde49010fe2552b5790f9d307fb2" +content-hash = "1b6a13b405c5603eb193646d40f25b68f31f7bf221ca8280f0d1a433b274da06" diff --git a/pyproject.toml b/pyproject.toml index f04235fd0d..fac667929b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,22 +30,49 @@ uwsgitop = ">=0.11" ## Third party invenio modules used by RERO ILS invenio-oaiharvester = { git = "https://github.com/inveniosoftware/invenio-oaiharvester.git", tag = "v1.0.0a4" } -invenio-circulation = { git = "https://github.com/inveniosoftware/invenio-circulation.git", tag = "v1.0.0a36" } - -## Invenio 3.4 base modules used by RERO ILS -# same as invenio metadata extras without invenio-search-ui -invenio-indexer = ">=1.2.0,<1.3.0" -invenio-jsonschemas = ">=1.1.1,<1.2.0" -invenio-pidstore = ">=1.2.1,<1.3.0" -invenio-records-rest = ">=1.8.0,<1.9.0" +invenio-circulation = {version = "^3.0.0a1", allow-prereleases = true} + +invenio-search = {version = ">=2.1.0,<3.0.0", extras = ["elasticsearch7"]} +# Invenio core modules +invenio-app = ">=1.3.4,<1.4.0" +invenio-base = ">=1.2.16,<1.3.0" +invenio-cache = ">=1.1.1,<1.2.0" +invenio-celery = ">=1.2.5,<1.3.0" +invenio-config = ">=1.0.3,<1.1.0" +invenio-i18n = ">=2.0.0,<3.0.0" +invenio-db = {version = ">=1.1.0,<1.2.0", extras = ["postgresql"]} +# Invenio base bundle +invenio-admin = ">=1.4.0,<1.5.0" +# invenio-assets = ">=3.0.0,<4.0.0" Ƈ Error: Patch file found for package semantic-ui-less which is not present at node_modules/semantic-ui-less +invenio-assets = ">=2.0.0,<3.0.0" +invenio-formatter = ">=2.0.0,<3.0.0" +invenio-logging = {version = ">=2.0.0,<3.0.0"} +invenio-mail = ">=2.0.0,<3.0.0" +invenio-rest = ">=1.3.0,<1.4.0" +invenio-theme = ">=2.5.7,<3.0.0" +# Invenio auth bundle +invenio-access = ">=2.0.0,<3.0.0" +invenio-accounts = ">=3.0.0,<4.0.0" +invenio-oauth2server = ">=2.0.0,<3.0.0" +invenio-oauthclient = ">=3.0.0,<4.0.0" +# Invenio metadata bundle +invenio-indexer = ">=2.2.0,<3.0.0" +invenio-jsonschemas = ">=1.1.4,<1.2.0" +invenio-oaiserver = ">=2.2.0,<2.3.0" +invenio-pidstore = ">=1.3.0,<1.4.0" +invenio-records-rest = ">=2.2.0,<2.3.0" invenio-records-ui = ">=1.2.0,<1.3.0" -invenio-records = ">=1.4.0,<1.7.0" +invenio-records = "2.1.0,<2.2.0" +invenio-search-ui = ">=2.4.0,<3.0.0" -## Default from Invenio -invenio = {version = ">=3.4.0,<3.5.0", extras = ["base", "postgresql", "auth", "elasticsearch7", "docs", "tests" ]} +invenio-records-permissions = ">=0.13.0" -# TODO: jsonschema 4.0.0 is not working with invenio because there is a new parameter type! -jsonschema = "<4.0.0" +# Pinned due to before_first_request deprecation https://flask.palletsprojects.com/en/2.2.x/api/#flask.Flask.before_first_request +Flask = ">=2.2.0,<2.3.0" +sentry-sdk = ">=1.0.0" # normaly in invenio-logging = {version = ">=2.0.0,<3.0.0", extras = ["sentry_sdk"]} +dojson = ">=1.4.0" +# TODO: dojson problem = AttributeError: 'Group' object has no attribute 'resultcallback' +click = "<8.1.0" ## RERO ILS specific python modules PyYAML = ">=5.3.1" @@ -57,63 +84,45 @@ xmltodict = "*" redisbeat = ">1.2.5, <1.3.0" jsonpickle = ">=1.4.1" ciso8601 = "*" -# TODO: to be removed when the thumbnail will be refactored -invenio-userprofiles = {git = "https://github.com/rero/invenio-userprofiles.git", tag = "v1.2.1-rero2.0"} ## Additionnal constraints on python modules markdown-captions = "*" zipp = "*" ## Deployment -# sentry -invenio-logging = { version = ">=1.3.0,<1.4.0", extras = ["sentry-sdk", "sentry"] } python-dotenv = ">=0.13.0" +pydocstyle = ">=6.1.1" ## Third party optional modules used by RERO ILS -invenio-sip2 = ">=0.6.16" -flask-cors = ">3.0.8" -celery = ">=5.0.0" -cryptography = ">38.0.2,<40.0" +invenio-sip2 = ">=0.6.22" freezegun = "^1.1.0" lazyreader = ">1.0.0" jinja2 = ">2.11.2" jsonmerge = "^1.8.0" num2words = "^0.5.10" -Flask = "<2.0.0" iso639 = "^0.1.4" dcxml = "^0.1.2" DeepDiff = "^5.5.0" docutils = "<0.18.0" wtforms = "<3.0.0" -flask-wtf = "<1.0.0" -# TODO: ImportError: cannot import name 'soft_unicode' from 'markupsafe' -markupsafe = "<2.1.0" poethepoet = "^0.12.3" -flask-wiki = "^0.2.2" -pytest-invenio = ">=1.4.0,<1.4.12" # to avoid conflict for urllib3 -sentry-sdk = "<1.6.1" dparse = ">=0.5.2" Mako = ">=1.2.2" -rero-invenio-base = "^0.2.1" -jsonref = "<1.0.0" -dojson = "^1.4.0" -jsonresolver = "<0.3.2" -pydocstyle = ">=6.1.1,<6.2" -# to solve: pytz -setuptools = "<67.0.0" -invenio-records-permissions = "^0.13.0" +rero-invenio-base = { git = "https://github.com/rero/rero-invenio-base.git", branch = "master" } +# rero-invenio-base = "^0.2.1" +jsonresolver = "*" # needed for elasticsearch 7.13.4 urllib3 = "<2.0.0" +pyparsing = "^3.1.1" +flask-wiki = "^0.3.1" [tool.poetry.dev-dependencies] ## Python packages development dependencies (order matters) #---------------------------------------------------------- ## Default from Invenio -pytest-invenio = ">=1.4.0,<1.5.0" -# TODO: ther is a problem with sphinx 3.4.2 -# RuntimeError: Working outside of application context. -Sphinx = ">=3,<3.4.2" +pytest-invenio = ">=2.1.6,<3.0.0" +Sphinx = ">=4.5.0" Flask-Debugtoolbar = ">=0.10.1" ## RERO ILS specific python packages safety = ">=1.8" @@ -176,7 +185,6 @@ notifications = "rero_ils.modules.notifications.views:blueprint" patron_types = "rero_ils.modules.patron_types.views:blueprint" patrons = "rero_ils.modules.patrons.views:api_blueprint" permissions ="rero_ils.modules.views:api_blueprint" -rero_ils = "rero_ils.modules.views:api_blueprint" users = "rero_ils.modules.users.api_views:api_blueprint" stats_cfg = "rero_ils.modules.stats_cfg.views:api_blueprint" @@ -194,7 +202,6 @@ item_types = "rero_ils.modules.item_types.views:blueprint" notifications = "rero_ils.modules.notifications.views:blueprint" patron_types = "rero_ils.modules.patron_types.views:blueprint" patrons = "rero_ils.modules.patrons.views:blueprint" -rero_ils = "rero_ils.theme.views:blueprint" stats = "rero_ils.modules.stats.views:blueprint" templates = "rero_ils.modules.templates.views:blueprint" theme = "rero_ils.theme.views:blueprint" diff --git a/rero_ils/accounts_views.py b/rero_ils/accounts_views.py index f19a7d0057..54006e288b 100644 --- a/rero_ils/accounts_views.py +++ b/rero_ils/accounts_views.py @@ -20,7 +20,7 @@ from flask import abort, after_this_request, current_app from flask import request as flask_request from flask.views import MethodView -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from flask_security.confirmable import requires_confirmation from flask_security.utils import get_message, verify_and_update_password from invenio_accounts.utils import change_user_password diff --git a/rero_ils/alembic/add75cbcad66_migrate_obsolete_country_codes.py b/rero_ils/alembic/add75cbcad66_migrate_obsolete_country_codes.py index 99fdad7a4f..406bbf700e 100644 --- a/rero_ils/alembic/add75cbcad66_migrate_obsolete_country_codes.py +++ b/rero_ils/alembic/add75cbcad66_migrate_obsolete_country_codes.py @@ -21,12 +21,15 @@ from logging import getLogger from invenio_db import db -from invenio_userprofiles.models import UserProfile from rero_ils.dojson.utils import _OBSOLETE_COUNTRIES_MAPPING from rero_ils.modules.documents.api import Document, DocumentsSearch from rero_ils.modules.patrons.api import Patron, PatronsSearch +# TODO: Flask2 +# from invenio_userprofiles.models import UserProfile + + # revision identifiers, used by Alembic. revision = 'add75cbcad66' down_revision = 'e3eb396b39bb' @@ -94,10 +97,10 @@ def fix_users(query, old_country, new_country): LOGGER.info(f'Found {len(ptrn_pids)} patrons with {old_country}.') fix_patrons(ptrn_pids, old_country, new_country) - query = UserProfile.query.filter_by(country=old_country) - if query.count() > 0: - LOGGER.info(f'Found {query.count()} users with {old_country}.') - fix_users(query, old_country, new_country) + # query = UserProfile.query.filter_by(country=old_country) + # if query.count() > 0: + # LOGGER.info(f'Found {query.count()} users with {old_country}.') + # fix_users(query, old_country, new_country) def downgrade(): diff --git a/rero_ils/config.py b/rero_ils/config.py index a67a71ea95..128659953d 100644 --- a/rero_ils/config.py +++ b/rero_ils/config.py @@ -147,6 +147,7 @@ exclude_terms_filter, i18n_terms_filter, or_terms_filter_by_criteria from .utils import TranslatedList, get_current_language +APP_THEME = ['bootstrap3'] def _(x): """Identity function used to trigger string extraction.""" @@ -285,6 +286,9 @@ def _(x): ACCOUNTS_USERINFO_HEADERS = False #: User profile +from rero_ils.modules.users.schemas import UserProfile + +ACCOUNTS_USER_PROFILE_SCHEMA = UserProfile RERO_PUBLIC_USERPROFILES_READONLY = False RERO_PUBLIC_USERPROFILES_READONLY_FIELDS = [ 'first_name', @@ -608,7 +612,6 @@ def _(x): pid_fetcher='collection_id', search_class='rero_ils.modules.collections.api:CollectionsSearch', search_index='collections', - search_type=None, indexer_class='rero_ils.modules.collections.api:CollectionsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' @@ -638,7 +641,6 @@ def _(x): pid_fetcher='document_id', search_class='rero_ils.modules.documents.api:DocumentsSearch', search_index='documents', - search_type=None, indexer_class='rero_ils.modules.documents.api:DocumentsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -696,7 +698,6 @@ def _(x): pid_fetcher='ill_request_id', search_class='rero_ils.modules.ill_requests.api:ILLRequestsSearch', search_index='ill_requests', - search_type=None, indexer_class='rero_ils.modules.ill_requests.api:ILLRequestsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -731,7 +732,6 @@ def _(x): pid_fetcher='item_id', search_class='rero_ils.modules.items.api:ItemsSearch', search_index='items', - search_type=None, indexer_class='rero_ils.modules.items.api:ItemsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -769,7 +769,6 @@ def _(x): search_class='rero_ils.modules.item_types.api:ItemTypesSearch', search_index='item_types', indexer_class='rero_ils.modules.item_types.api:ItemTypesIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -802,7 +801,6 @@ def _(x): search_class='rero_ils.modules.stats.api.api:StatsSearch', search_index='stats', indexer_class='rero_ils.modules.stats.api.api:StatsIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', 'text/csv': 'rero_ils.modules.stats.serializers:csv_v1_response', @@ -837,7 +835,6 @@ def _(x): search_index='stats_cfg', indexer_class=\ 'rero_ils.modules.stats_cfg.api:StatsConfigurationIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -875,7 +872,6 @@ def _(x): search_class='rero_ils.modules.holdings.api:HoldingsSearch', search_index='holdings', indexer_class='rero_ils.modules.holdings.api:HoldingsIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -907,7 +903,6 @@ def _(x): pid_fetcher='local_field_id', search_class='rero_ils.modules.local_fields.api:LocalFieldsSearch', search_index='local_fields', - search_type=None, indexer_class='rero_ils.modules.local_fields.api:LocalFieldsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' @@ -940,7 +935,6 @@ def _(x): search_class='rero_ils.modules.patrons.api:PatronsSearch', search_index='patrons', indexer_class='rero_ils.modules.patrons.api:PatronsIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -973,7 +967,6 @@ def _(x): pid_fetcher='patron_transaction_id', search_class='rero_ils.modules.patron_transactions.api:PatronTransactionsSearch', search_index='patron_transactions', - search_type=None, indexer_class='rero_ils.modules.patron_transactions.api:PatronTransactionsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' @@ -1012,7 +1005,6 @@ def _(x): search_class=('rero_ils.modules.patron_transaction_events.api:' 'PatronTransactionEventsSearch'), search_index='patron_transaction_events', - search_type=None, indexer_class='rero_ils.modules.patron_transaction_events.api:PatronTransactionEventsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' @@ -1050,7 +1042,6 @@ def _(x): pid_fetcher='patron_type_id', search_class='rero_ils.modules.patron_types.api:PatronTypesSearch', search_index='patron_types', - search_type=None, indexer_class='rero_ils.modules.patron_types.api:PatronTypesIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' @@ -1086,7 +1077,6 @@ def _(x): search_index='organisations', indexer_class=('rero_ils.modules.organisations.api:' 'OrganisationsIndexer'), - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1118,7 +1108,6 @@ def _(x): search_class='rero_ils.modules.libraries.api:LibrariesSearch', search_index='libraries', indexer_class='rero_ils.modules.libraries.api:LibrariesIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1150,7 +1139,6 @@ def _(x): search_class='rero_ils.modules.locations.api:LocationsSearch', search_index='locations', indexer_class='rero_ils.modules.locations.api:LocationsIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1187,7 +1175,6 @@ def _(x): search_class='rero_ils.modules.entities.remote_entities.api:RemoteEntitiesSearch', search_index='remote_entities', indexer_class='rero_ils.modules.entities.remote_entities.api:RemoteEntitiesIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1222,7 +1209,6 @@ def _(x): search_class='rero_ils.modules.entities.local_entities.api:LocalEntitiesSearch', search_index='local_entities', indexer_class='rero_ils.modules.entities.local_entities.indexer:LocalEntitiesIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1282,7 +1268,6 @@ def _(x): search_class='rero_ils.modules.circ_policies.api:CircPoliciesSearch', search_index='circ_policies', indexer_class='rero_ils.modules.circ_policies.api:CircPoliciesIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1317,7 +1302,6 @@ def _(x): search_index='notifications', indexer_class=('rero_ils.modules.notifications.api:' 'NotificationsIndexer'), - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1350,7 +1334,6 @@ def _(x): pid_fetcher='vendor_id', search_class='rero_ils.modules.vendors.api:VendorsSearch', search_index='vendors', - search_type=None, indexer_class='rero_ils.modules.vendors.api:VendorsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -1385,7 +1368,6 @@ def _(x): pid_fetcher='acq_account_id', search_class='rero_ils.modules.acquisition.acq_accounts.api:AcqAccountsSearch', search_index='acq_accounts', - search_type=None, indexer_class='rero_ils.modules.acquisition.acq_accounts.api:AcqAccountsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -1425,7 +1407,6 @@ def _(x): pid_fetcher='budget_id', search_class='rero_ils.modules.acquisition.budgets.api:BudgetsSearch', search_index='budgets', - search_type=None, indexer_class='rero_ils.modules.acquisition.budgets.api:BudgetsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -1460,7 +1441,6 @@ def _(x): pid_fetcher='acq_order_id', search_class='rero_ils.modules.acquisition.acq_orders.api:AcqOrdersSearch', search_index='acq_orders', - search_type=None, indexer_class='rero_ils.modules.acquisition.acq_orders.api:AcqOrdersIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -1500,7 +1480,6 @@ def _(x): pid_fetcher='acq_order_line_id', search_class='rero_ils.modules.acquisition.acq_order_lines.api:AcqOrderLinesSearch', search_index='acq_order_lines', - search_type=None, indexer_class=('rero_ils.modules.acquisition.acq_order_lines.api:' 'AcqOrderLinesIndexer'), record_serializers={ @@ -1537,7 +1516,6 @@ def _(x): pid_fetcher='acq_receipt_id', search_class='rero_ils.modules.acquisition.acq_receipts.api:AcqReceiptsSearch', search_index='acq_receipts', - search_type=None, indexer_class='rero_ils.modules.acquisition.acq_receipts.api:AcqReceiptsIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -1573,7 +1551,6 @@ def _(x): pid_fetcher='acq_receipt_line_id', search_class='rero_ils.modules.acquisition.acq_receipt_lines.api:AcqReceiptLinesSearch', search_index='acq_receipt_lines', - search_type=None, indexer_class='rero_ils.modules.acquisition.acq_receipt_lines.api:AcqReceiptLinesIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -1614,7 +1591,6 @@ def _(x): pid_fetcher='acq_invoice_id', search_class='rero_ils.modules.acquisition.acq_invoices.api:AcquisitionInvoicesSearch', search_index='acq_invoices', - search_type=None, indexer_class='rero_ils.modules.acquisition.acq_invoices.api:AcquisitionInvoicesIndexer', record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response', @@ -1651,7 +1627,6 @@ def _(x): search_class='rero_ils.modules.templates.api:TemplatesSearch', search_index='templates', indexer_class='rero_ils.modules.templates.api:TemplatesIndexer', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -1682,7 +1657,6 @@ def _(x): pid_minter='recid', pid_fetcher='operation_log_id', search_index='operation_logs', - search_type=None, record_serializers={ 'application/json': 'rero_ils.modules.serializers:json_v1_response' }, @@ -3137,6 +3111,9 @@ def _(x): # address SECURITY_SEND_PASSWORD_CHANGE_EMAIL = False +# flask-security 3.3.3 +SECURITY_PASSWORD_SINGLE_HASH = True + # Misc INDEXER_REPLACE_REFS = True INDEXER_RECORD_TO_INDEX = 'rero_ils.modules.indexer_utils.record_to_index' @@ -3340,7 +3317,6 @@ def _(x): search_class=LoansSearch, search_index='loans', indexer_class='rero_ils.modules.loans.api:LoansIndexer', - search_type=None, record_serializers={ 'application/json': 'invenio_records_rest.serializers:json_v1_response', }, @@ -3524,8 +3500,14 @@ def _(x): # WIKI # ==== WIKI_CONTENT_DIR = './wiki' +WIKI_INDEX_DIR = './wiki/_index' WIKI_URL_PREFIX = '/help' -WIKI_LANGUAGES = ['en', 'fr', 'de', 'it'] +WIKI_LANGUAGES = { + 'en': 'English', + 'fr': 'French', + 'de': 'German', + 'it': 'Italian' +} WIKI_CURRENT_LANGUAGE = get_current_language WIKI_UPLOAD_FOLDER = os.path.join(WIKI_CONTENT_DIR, 'files') WIKI_BASE_TEMPLATE = 'rero_ils/page_wiki.html' diff --git a/rero_ils/filter.py b/rero_ils/filter.py index 162b47fbe3..88589733d3 100644 --- a/rero_ils/filter.py +++ b/rero_ils/filter.py @@ -25,7 +25,7 @@ import dateparser from babel.dates import format_date, format_datetime, format_time from flask import current_app, render_template -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_i18n.ext import current_i18n from jinja2 import TemplateNotFound from markupsafe import Markup diff --git a/rero_ils/jsonschemas/utils.py b/rero_ils/jsonschemas/utils.py index 9841a38a44..06ce25da0a 100644 --- a/rero_ils/jsonschemas/utils.py +++ b/rero_ils/jsonschemas/utils.py @@ -18,7 +18,7 @@ """JSON schemas utils.""" from invenio_jsonschemas.proxies import current_jsonschemas -from jsonref import JsonLoader as JsonRefLoader +from jsonresolver.contrib.jsonref import _JsonLoader try: from functools import lru_cache @@ -26,17 +26,26 @@ from functools32 import lru_cache -class JsonLoader(JsonRefLoader): - """Json schema loader. +class JsonLoader(_JsonLoader): + """JsonLoader. - We have to add local $ref loading to the base class. - https://invenio-jsonschemas.readthedocs.io/en/latest/configuration.html + Provides a callable which takes a URI, and returns the loaded JSON referred + to by that URI. Uses :mod:`requests` if available for HTTP URIs, and falls + back to :mod:`urllib`. By default it keeps a cache of previously loaded + documents. + :param store: A pre-populated dictionary matching URIs to loaded JSON + documents + :param cache_results: If this is set to false, the internal cache of + loaded JSON documents is not used """ @lru_cache(maxsize=1000) def get_remote_json(self, uri, **kwargs): """Get remote json. + We have to add local $ref loading to the base class. + https://invenio-jsonschemas.readthedocs.io/en/latest/configuration.html + Adds loading of $ref locally for the application instance. See: github invenio-jsonschemas ext.py. :param uri: The URI of the JSON document to load. diff --git a/rero_ils/modules/acquisition/acq_accounts/api.py b/rero_ils/modules/acquisition/acq_accounts/api.py index 8155cc5046..9d4c8ed01b 100644 --- a/rero_ils/modules/acquisition/acq_accounts/api.py +++ b/rero_ils/modules/acquisition/acq_accounts/api.py @@ -21,7 +21,7 @@ from functools import partial from elasticsearch_dsl import Q -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.acquisition.acq_invoices.api import \ AcquisitionInvoicesSearch diff --git a/rero_ils/modules/acquisition/acq_accounts/extensions.py b/rero_ils/modules/acquisition/acq_accounts/extensions.py index cc31dc1abc..0454d9e4ab 100644 --- a/rero_ils/modules/acquisition/acq_accounts/extensions.py +++ b/rero_ils/modules/acquisition/acq_accounts/extensions.py @@ -17,7 +17,7 @@ # along with this program. If not, see . """Extension for AcqAccount records.""" -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_records.extensions import RecordExtension from jsonschema import ValidationError diff --git a/rero_ils/modules/acquisition/acq_order_lines/api.py b/rero_ils/modules/acquisition/acq_order_lines/api.py index e5899e58aa..9186ff43b1 100644 --- a/rero_ils/modules/acquisition/acq_order_lines/api.py +++ b/rero_ils/modules/acquisition/acq_order_lines/api.py @@ -22,7 +22,7 @@ from datetime import datetime from functools import partial -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from werkzeug.utils import cached_property from rero_ils.modules.acquisition.api import AcquisitionIlsRecord diff --git a/rero_ils/modules/acquisition/acq_order_lines/extensions.py b/rero_ils/modules/acquisition/acq_order_lines/extensions.py index 582013c775..a764ddbc1d 100644 --- a/rero_ils/modules/acquisition/acq_order_lines/extensions.py +++ b/rero_ils/modules/acquisition/acq_order_lines/extensions.py @@ -18,7 +18,7 @@ """Extension for acquisition account records.""" -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_records.extensions import RecordExtension from jsonschema import ValidationError diff --git a/rero_ils/modules/acquisition/acq_orders/api.py b/rero_ils/modules/acquisition/acq_orders/api.py index 7f2541541f..f08165c6a8 100644 --- a/rero_ils/modules/acquisition/acq_orders/api.py +++ b/rero_ils/modules/acquisition/acq_orders/api.py @@ -20,7 +20,7 @@ from datetime import datetime, timezone from functools import partial -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_records_rest.utils import obj_or_import_string from rero_ils.modules.acquisition.acq_order_lines.api import AcqOrderLine, \ diff --git a/rero_ils/modules/acquisition/acq_receipt_lines/extensions.py b/rero_ils/modules/acquisition/acq_receipt_lines/extensions.py index 80ac4f6bf2..66a1eea219 100644 --- a/rero_ils/modules/acquisition/acq_receipt_lines/extensions.py +++ b/rero_ils/modules/acquisition/acq_receipt_lines/extensions.py @@ -18,7 +18,7 @@ """Acquisition Receipt line record extensions.""" from datetime import datetime -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_records.extensions import RecordExtension from jsonschema import ValidationError from sqlalchemy.orm.exc import NoResultFound diff --git a/rero_ils/modules/api.py b/rero_ils/modules/api.py index 95ee258210..0714cbcdd9 100644 --- a/rero_ils/modules/api.py +++ b/rero_ils/modules/api.py @@ -24,23 +24,20 @@ import click import pytz from celery import current_app as current_celery_app -from elasticsearch import VERSION as ES_VERSION from elasticsearch.exceptions import NotFoundError from elasticsearch.helpers import bulk -from elasticsearch.helpers import expand_action as default_expand_action from flask import current_app from invenio_db import db from invenio_indexer.api import RecordIndexer from invenio_indexer.signals import before_record_index -from invenio_indexer.utils import _es7_expand_action from invenio_pidstore.errors import PIDDoesNotExistError from invenio_pidstore.models import PersistentIdentifier, PIDStatus from invenio_records.api import Record from invenio_records_rest.utils import obj_or_import_string from invenio_search import current_search from invenio_search.api import RecordsSearch +from invenio_search.engine import search from jsonschema import FormatChecker -from jsonschema.compat import str_types from jsonschema.exceptions import ValidationError from kombu.compat import Consumer from sqlalchemy import text @@ -56,7 +53,7 @@ @ils_record_format_checker.checks('idn-email') def _strong_email_validation(instance) -> bool: """Allow to validate an email address (only email format, not DNS).""" - if not isinstance(instance, str_types): + if not isinstance(instance, str): return False # DEV NOTE : If this regexp changes, you also need to alter the regexp # into `email.validator.ts` file into @rero/ng-core. The best solution @@ -553,6 +550,13 @@ def get_metadata_identifier_names(cls): identifier = cls.provider.identifier return metadata, identifier + def replace_refs(self): + """Replace the ``$ref`` keys within the JSON. + + Note: needed for jsonref>=1.0.0 + """ + return (type(self))(super().replace_refs()) + def resolve(self): """Resolve references data. @@ -579,19 +583,18 @@ def delete(self, record): """ return super().delete(record, refresh='true') - def bulk_index(self, record_id_iterator, doc_type=None, index=None): + def bulk_index(self, record_id_iterator, doc_type=None): """Bulk index records. :param record_id_iterator: Iterator yielding record UUIDs. """ self._bulk_op( - record_id_iterator, op_type='index', doc_type=doc_type, - index=index) + record_id_iterator, op_type='index', doc_type=doc_type) - def process_bulk_queue(self, es_bulk_kwargs=None, stats_only=True): + def process_bulk_queue(self, search_bulk_kwargs=None, stats_only=True): """Process bulk indexing queue. - :param dict es_bulk_kwargs: Passed to + :param dict search_bulk_kwargs: Passed to :func:`elasticsearch:elasticsearch.helpers.bulk`. :param boolean stats_only: if `True` only report number of successful/failed operations instead of just number of @@ -604,19 +607,18 @@ def process_bulk_queue(self, es_bulk_kwargs=None, stats_only=True): exchange=self.mq_exchange.name, routing_key=self.mq_routing_key, ) + req_timeout = current_app.config['INDEXER_BULK_REQUEST_TIMEOUT'] - es_bulk_kwargs = es_bulk_kwargs or {} + search_bulk_kwargs = search_bulk_kwargs or {} + count = bulk( self.client, self._actionsiter(consumer.iterqueue()), stats_only=stats_only, request_timeout=req_timeout, - expand_action_callback=( - _es7_expand_action if ES_VERSION[0] >= 7 - else default_expand_action - ), - **es_bulk_kwargs + expand_action_callback=search.helpers.expand_action, + **search_bulk_kwargs ) consumer.close() @@ -631,6 +633,32 @@ def _get_record_class(self, payload): pid_type = payload.get('doc_type', 'rec') return get_record_class_from_schema_or_pid_type(pid_type=pid_type) + # + # Low-level implementation + # + def _bulk_op(self, record_id_iterator, op_type, index=None, doc_type=None): + """Index record in the search engine asynchronously. + + :param record_id_iterator: dIterator that yields record UUIDs. + :param op_type: Indexing operation (one of ``index``, ``create``, + ``delete`` or ``update``). + :param index: The search engine index. (Default: ``None``) + :param doc_type: The Elasticsearch doc_type. (Default: ``None``) + """ + with self.create_producer() as producer: + for rec in record_id_iterator: + data = dict( + id=str(rec), + op=op_type, + index=index, + doc_type=doc_type + ) + producer.publish( + data, + declare=[self.mq_queue], + **self.mq_publish_kwargs, + ) + def _actionsiter(self, message_iterator): """Iterate bulk actions. @@ -662,30 +690,30 @@ def _index_action(self, payload): :param payload: Decoded message body. :return: Dictionary defining an Elasticsearch bulk 'index' action. """ - with db.session.begin_nested(): - record = self.record_cls.get_record(payload['id']) - index, doc_type = self.record_to_index(record) + record = self.record_cls.get_record(payload['id']) + index = self.record_to_index(record) arguments = {} index = payload.get('index') or index - body = self._prepare_record(record, index, doc_type, arguments) - return { + body = self._prepare_record(record, index, arguments) + action = { '_op_type': 'index', '_index': index, - '_type': doc_type, '_id': str(record.id), '_version': record.revision_id, '_version_type': self._version_type, '_source': body - } | arguments + } + action.update(arguments) + + return action def _prepare_record( - self, record, index, doc_type, arguments=None, **kwargs): + self, record, index, arguments=None, **kwargs): """Prepare record data for indexing. :param record: The record to prepare. :param index: The Elasticsearch index. - :param doc_type: The Elasticsearch document type. :param arguments: The arguments to send to Elasticsearch upon indexing. :param **kwargs: Extra parameters. :return: The record metadata. @@ -719,7 +747,6 @@ def _prepare_record( json=data, record=record, index=index, - doc_type=doc_type, arguments={} if arguments is None else arguments, **kwargs ) diff --git a/rero_ils/modules/babel_extractors.py b/rero_ils/modules/babel_extractors.py index 8783d93f02..1f15ed78d2 100644 --- a/rero_ils/modules/babel_extractors.py +++ b/rero_ils/modules/babel_extractors.py @@ -20,7 +20,7 @@ import re import six -from flask_babelex import gettext as _ +from flask_babel import gettext as _ KEY_VAL_REGEX = re.compile(r'"(.*?)"\s*:\s*"(.*?)"') diff --git a/rero_ils/modules/cli/index.py b/rero_ils/modules/cli/index.py index 82493b444f..03568970db 100644 --- a/rero_ils/modules/cli/index.py +++ b/rero_ils/modules/cli/index.py @@ -31,7 +31,7 @@ from invenio_pidstore.models import PersistentIdentifier, PIDStatus from invenio_records.models import RecordMetadata from invenio_records_rest.utils import obj_or_import_string -from invenio_search.cli import es_version_check, index +from invenio_search.cli import index, search_version_check from invenio_search.proxies import current_search, current_search_client from jsonpatch import make_patch from kombu import Queue @@ -95,7 +95,7 @@ def run(delayed, concurrency, with_stats, version_type=None, queue=None, 'kwargs': { 'version_type': version_type, 'queue': queue, - 'es_bulk_kwargs': {'raise_on_error': raise_on_error}, + 'search_bulk_kwargs': {'raise_on_error': raise_on_error}, 'stats_only': not with_stats } } @@ -118,7 +118,7 @@ def run(delayed, concurrency, with_stats, version_type=None, queue=None, routing_key=queue, ) name, count = indexer.process_bulk_queue( - es_bulk_kwargs={'raise_on_error': raise_on_error}, + search_bulk_kwargs={'raise_on_error': raise_on_error}, stats_only=(not with_stats) ) click.secho( @@ -133,17 +133,15 @@ def run(delayed, concurrency, with_stats, version_type=None, queue=None, @click.option('-f', '--from_date', 'from_date') @click.option('-u', '--until_date', 'until_date') @click.option('-d', '--direct', 'direct', is_flag=True, default=False) -@click.option('-i', '--index', 'index') @click.option('-q', '--queue', 'queue', default='indexer') @with_appcontext -def reindex(pid_types, from_date, until_date, direct, index, queue): +def reindex(pid_types, from_date, until_date, direct, queue): """Reindex records. :param pid_type: Pid type. :param from_date: Index records from date. :param until_date: Index records until date. :param direct: Use record class for indexing. - :param index: Index name to index. :param queue: Queue name to use. """ endpoints = current_app.config.get('RECORDS_REST_ENDPOINTS') @@ -196,7 +194,7 @@ def reindex(pid_types, from_date, until_date, direct, index, queue): indxer = IlsRecordsIndexer( queue=simple_queue, routing_key=queue) indxer.bulk_index( - (x[0] for x in query), doc_type=pid_type, index=index) + (x[0] for x in query), doc_type=pid_type) else: click.echo('Can not index by date.') else: @@ -254,7 +252,7 @@ def reindex_missing(pid_types, verbose): @index.command() @click.option('--force', is_flag=True, default=False) @with_appcontext -@es_version_check +@search_version_check def init(force): """Initialize registered templates, aliases and mappings.""" # TODO: to remove once it is fixed in invenio-search module @@ -274,7 +272,7 @@ def init(force): @index.command('switch_index') @with_appcontext -@es_version_check +@search_version_check @click.argument('old') @click.argument('new') def switch_index(old, new): @@ -293,7 +291,7 @@ def switch_index(old, new): @index.command('create_index') @with_appcontext -@es_version_check +@search_version_check @click.option( '-t', '--templates/--no-templates', 'templates', is_flag=True, default=True) @@ -335,7 +333,7 @@ def create_index(resource, index, verbose, templates): @click.option( '-s', '--settings/--no-settings', 'settings', is_flag=True, default=False) @with_appcontext -@es_version_check +@search_version_check def update_mapping(aliases, settings): """Update the mapping of a given alias.""" if not aliases: diff --git a/rero_ils/modules/documents/dojson/contrib/jsontodc/model.py b/rero_ils/modules/documents/dojson/contrib/jsontodc/model.py index 69685a1dad..969f914778 100644 --- a/rero_ils/modules/documents/dojson/contrib/jsontodc/model.py +++ b/rero_ils/modules/documents/dojson/contrib/jsontodc/model.py @@ -18,7 +18,7 @@ """RERO-ILS Dublin Core model definition.""" from dojson import Overdo, utils -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.documents.extensions import TitleExtension from rero_ils.modules.entities.models import EntityType diff --git a/rero_ils/modules/documents/dojson/contrib/jsontomarc21/model.py b/rero_ils/modules/documents/dojson/contrib/jsontomarc21/model.py index aa7ab42e03..e045695e3c 100644 --- a/rero_ils/modules/documents/dojson/contrib/jsontomarc21/model.py +++ b/rero_ils/modules/documents/dojson/contrib/jsontomarc21/model.py @@ -21,7 +21,7 @@ from dojson import utils from dojson.contrib.to_marc21.model import Underdo from flask import current_app -from flask_babelex import gettext as translate +from flask_babel import gettext as translate from rero_ils.modules.documents.utils import display_alternate_graphic_first from rero_ils.modules.documents.views import create_title_responsibilites diff --git a/rero_ils/modules/documents/dumpers/indexer.py b/rero_ils/modules/documents/dumpers/indexer.py index da6d650076..57645306f5 100644 --- a/rero_ils/modules/documents/dumpers/indexer.py +++ b/rero_ils/modules/documents/dumpers/indexer.py @@ -240,6 +240,12 @@ def dump(self, record, data): self._process_sort_title(record, data) self._process_host_document(record, data) self._process_provision_activity(record, data) + # import pytz + # from datetime import datetime + # iso_now = pytz.utc.localize(datetime.utcnow()).isoformat() + # for date_field in ['_created', '_updated']: + # if not data.get(date_field): + # data[date_field] = iso_now # TODO: compare record with those in DB to check which authors have # to be deleted from index diff --git a/rero_ils/modules/documents/views.py b/rero_ils/modules/documents/views.py index 4860d1a30e..2ae9d4ae6f 100644 --- a/rero_ils/modules/documents/views.py +++ b/rero_ils/modules/documents/views.py @@ -25,7 +25,7 @@ import click from elasticsearch_dsl.query import Q from flask import Blueprint, current_app, render_template, url_for -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from flask_login import current_user from invenio_records_ui.signals import record_viewed diff --git a/rero_ils/modules/entities/remote_entities/sync.py b/rero_ils/modules/entities/remote_entities/sync.py index caf8a9c4dc..e2328a5f98 100644 --- a/rero_ils/modules/entities/remote_entities/sync.py +++ b/rero_ils/modules/entities/remote_entities/sync.py @@ -339,6 +339,7 @@ def sync_record(self, pid): dbcommit=True, reindex=True ) + RemoteEntitiesSearch.flush_and_refresh() self.logger.info( f'Create a new MEF {entity["type"]} ' f'record(pid: {new_mef_pid})') diff --git a/rero_ils/modules/entities/views.py b/rero_ils/modules/entities/views.py index c83e5b5c9f..3061324d88 100644 --- a/rero_ils/modules/entities/views.py +++ b/rero_ils/modules/entities/views.py @@ -18,7 +18,7 @@ """Blueprint used for entities.""" from flask import Blueprint, abort, current_app, render_template -from flask_babelex import gettext as _ +from flask_babel import lazy_gettext as _ from invenio_i18n.ext import current_i18n from rero_ils.modules.entities.models import EntityType @@ -35,7 +35,7 @@ ) -@blueprint.route('//') +@blueprint.route('//') def entity_detailed_view(viewcode, type, pid): """Display entity view (local or remote). @@ -44,6 +44,8 @@ def entity_detailed_view(viewcode, type, pid): :param: pid: Resource PID. :returns: The html rendering of the resource. """ + if type not in ['local', 'remote']: + abort(404) entity_class = LocalEntity if type == 'local' else RemoteEntity if not (record := entity_class.get_record_by_pid(pid)): abort(404, _('Entity not found.')) diff --git a/rero_ils/modules/ext.py b/rero_ils/modules/ext.py index cddd0d56db..c189bd12ec 100644 --- a/rero_ils/modules/ext.py +++ b/rero_ils/modules/ext.py @@ -37,7 +37,6 @@ from invenio_records.signals import after_record_insert, after_record_update, \ before_record_update from invenio_records_rest.errors import JSONSchemaValidationError -from invenio_userprofiles.signals import after_profile_update from jsonschema.exceptions import ValidationError from rero_ils.filter import address_block, empty_data, format_date_filter, \ @@ -75,8 +74,7 @@ enrich_patron_transaction_data from rero_ils.modules.patrons.api import current_librarian, current_patrons from rero_ils.modules.patrons.listener import \ - create_subscription_patron_transaction, enrich_patron_data, \ - update_from_profile + create_subscription_patron_transaction, enrich_patron_data from rero_ils.modules.permissions import LibraryNeed, OrganisationNeed, \ OwnerNeed from rero_ils.modules.sru.views import SRUDocumentsSearch @@ -311,9 +309,6 @@ def register_signals(self, app): oaiharvest_finished.connect(publish_harvested_records, weak=False) - # invenio-userprofiles signal - after_profile_update.connect(update_from_profile) - # store the username in the session user_logged_in.connect(set_user_name) user_logged_out.connect(remove_user_name) diff --git a/rero_ils/modules/holdings/api.py b/rero_ils/modules/holdings/api.py index 4b83f13725..ec69d78257 100644 --- a/rero_ils/modules/holdings/api.py +++ b/rero_ils/modules/holdings/api.py @@ -27,7 +27,7 @@ from dateutil.relativedelta import relativedelta from elasticsearch_dsl import Q from flask import current_app -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_records_rest.utils import obj_or_import_string from jinja2 import Environment diff --git a/rero_ils/modules/ill_requests/api.py b/rero_ils/modules/ill_requests/api.py index e34ad38ac6..bdbd3ce35c 100644 --- a/rero_ils/modules/ill_requests/api.py +++ b/rero_ils/modules/ill_requests/api.py @@ -24,7 +24,7 @@ from dateutil.relativedelta import * from elasticsearch_dsl.query import Q from flask import current_app -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch from rero_ils.modules.fetchers import id_fetcher diff --git a/rero_ils/modules/ill_requests/forms.py b/rero_ils/modules/ill_requests/forms.py index 11a7430a21..ff8df103e4 100644 --- a/rero_ils/modules/ill_requests/forms.py +++ b/rero_ils/modules/ill_requests/forms.py @@ -17,8 +17,8 @@ """Forms definitions about ILL request in public view.""" -from flask_babelex import gettext as _ -from flask_babelex import lazy_gettext +from flask_babel import gettext as _ +from flask_babel import lazy_gettext from flask_wtf import FlaskForm from wtforms import FormField, IntegerField, RadioField, SelectField, \ StringField, TextAreaField, validators @@ -118,7 +118,7 @@ class Meta: render_kw={'placeholder': 'https://...'} ) - def validate(self): + def validate(self, **kwargs): """Custom validation for this form.""" if self.url.data: self.origin.validators = [ @@ -129,7 +129,7 @@ def validate(self): validators.DataRequired(), validators.URL(require_tld=False) ] - return super().validate() + return super().validate(kwargs) class ILLRequestForm(FlaskForm): @@ -165,9 +165,9 @@ class ILLRequestForm(FlaskForm): ] ) - def validate(self): + def validate(self, **kwargs): """Add custom validation on the form.""" - form_validate = super().validate() + form_validate = super().validate(kwargs) # if 'copy' is set to True, then 'pages' is required field custom_validate = True diff --git a/rero_ils/modules/ill_requests/views.py b/rero_ils/modules/ill_requests/views.py index 37bc0a12d6..c3477838b5 100644 --- a/rero_ils/modules/ill_requests/views.py +++ b/rero_ils/modules/ill_requests/views.py @@ -21,7 +21,7 @@ from flask import Blueprint, current_app, flash, redirect, render_template, \ request, url_for -from flask_babelex import gettext as _ +from flask_babel import lazy_gettext as _ from rero_ils.modules.documents.api import Document from rero_ils.modules.documents.views import create_title_text diff --git a/rero_ils/modules/indexer_utils.py b/rero_ils/modules/indexer_utils.py index c90e0d368a..b75fd3a3d6 100644 --- a/rero_ils/modules/indexer_utils.py +++ b/rero_ils/modules/indexer_utils.py @@ -28,11 +28,11 @@ def record_to_index(record): """Get index/doc_type given a record. - It tries to extract from `record['$schema']` the index and doc_type. + It tries to extract from `record['$schema']` the index. If it fails, return the default values. :param record: The record object. - :return: Tuple (index, doc_type). + :return: index. """ index_names = current_search.mappings.keys() schema = record.get('$schema', '') @@ -43,10 +43,8 @@ def record_to_index(record): if re.search(r'/mef/', schema): schema = re.sub(r'/mef/', '/remote_entities/', schema) schema = re.sub(r'mef-contribution', 'remote_entity', schema) - index, doc_type = schema_to_index(schema, index_names=index_names) - if index and doc_type: - return index, doc_type + if index := schema_to_index(schema, index_names=index_names): + return index else: - return (current_app.config['INDEXER_DEFAULT_INDEX'], - current_app.config['INDEXER_DEFAULT_DOC_TYPE']) + return current_app.config['INDEXER_DEFAULT_INDEX'] diff --git a/rero_ils/modules/item_types/api.py b/rero_ils/modules/item_types/api.py index 18718fe504..25df8d8c3f 100644 --- a/rero_ils/modules/item_types/api.py +++ b/rero_ils/modules/item_types/api.py @@ -23,7 +23,7 @@ from functools import partial from elasticsearch_dsl import Q -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from .models import ItemTypeIdentifier, ItemTypeMetadata from ..api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch diff --git a/rero_ils/modules/items/api/circulation.py b/rero_ils/modules/items/api/circulation.py index 9c6e8659cc..5e51796fd6 100644 --- a/rero_ils/modules/items/api/circulation.py +++ b/rero_ils/modules/items/api/circulation.py @@ -22,7 +22,7 @@ from datetime import datetime from flask import current_app -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_circulation.api import get_loan_for_item from invenio_circulation.errors import ItemNotAvailableError, \ NoValidTransitionAvailableError diff --git a/rero_ils/modules/items/api/record.py b/rero_ils/modules/items/api/record.py index f00b618d7b..e032ff56d6 100644 --- a/rero_ils/modules/items/api/record.py +++ b/rero_ils/modules/items/api/record.py @@ -21,7 +21,7 @@ import pytz from elasticsearch_dsl.query import Q -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.api import IlsRecord from rero_ils.modules.holdings.models import HoldingTypes diff --git a/rero_ils/modules/libraries/api.py b/rero_ils/modules/libraries/api.py index 33aa81e481..4c3f894490 100644 --- a/rero_ils/modules/libraries/api.py +++ b/rero_ils/modules/libraries/api.py @@ -25,7 +25,7 @@ from dateutil import parser from dateutil.rrule import FREQNAMES, rrule from elasticsearch_dsl import Q -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch from rero_ils.modules.fetchers import id_fetcher diff --git a/rero_ils/modules/loans/api.py b/rero_ils/modules/loans/api.py index ce6440ffed..dedad7311d 100644 --- a/rero_ils/modules/loans/api.py +++ b/rero_ils/modules/loans/api.py @@ -25,7 +25,7 @@ from dateutil.relativedelta import relativedelta from elasticsearch_dsl import A, Q from flask import current_app -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_circulation.errors import MissingRequiredParameterError from invenio_circulation.pidstore.fetchers import loan_pid_fetcher from invenio_circulation.pidstore.minters import loan_pid_minter @@ -999,7 +999,7 @@ def can_anonymize(cls, loan_data=None, patron=None): patron = patron or Patron.get_record_by_pid(patron_pid) keep_history = True if patron: - keep_history = patron.user.profile.keep_history + keep_history = patron.user.user_profile.get('keep_history', True) else: msg = f'Can not anonymize loan: {loan_data.get("pid")} ' \ f'no patron: {loan_data.get("patron_pid")}' diff --git a/rero_ils/modules/local_fields/api.py b/rero_ils/modules/local_fields/api.py index da944efaf4..d403078270 100644 --- a/rero_ils/modules/local_fields/api.py +++ b/rero_ils/modules/local_fields/api.py @@ -21,7 +21,7 @@ from functools import partial from elasticsearch_dsl import Q -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from .models import LocalFieldIdentifier, LocalFieldMetadata from ..api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch diff --git a/rero_ils/modules/locations/api.py b/rero_ils/modules/locations/api.py index 4952de952c..9c6b48764f 100644 --- a/rero_ils/modules/locations/api.py +++ b/rero_ils/modules/locations/api.py @@ -20,7 +20,7 @@ from functools import partial from elasticsearch_dsl.query import Q -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch from rero_ils.modules.fetchers import id_fetcher diff --git a/rero_ils/modules/operation_logs/logs/api.py b/rero_ils/modules/operation_logs/logs/api.py index f4822f5121..d147b37c56 100644 --- a/rero_ils/modules/operation_logs/logs/api.py +++ b/rero_ils/modules/operation_logs/logs/api.py @@ -45,8 +45,9 @@ def _get_patron_data(cls, patron): 'name': patron.formatted_name, 'type': patron_type['name'] if patron_type else None, 'age': patron.age, - 'postal_code': patron.user.profile.postal_code, - 'gender': patron.user.profile.gender or 'no_information', + 'postal_code': patron.user.user_profile.get( + 'postal_code', 'no_information'), + 'gender': patron.user.user_profile.get('gender', 'no_information'), 'pid': patron.pid, 'hashed_pid': hashed_pid } diff --git a/rero_ils/modules/patron_transactions/extensions.py b/rero_ils/modules/patron_transactions/extensions.py index 52c10af721..d2fd7ed8da 100644 --- a/rero_ils/modules/patron_transactions/extensions.py +++ b/rero_ils/modules/patron_transactions/extensions.py @@ -18,7 +18,7 @@ """Patron transactions record extensions.""" -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_records.extensions import RecordExtension from rero_ils.modules.patron_transaction_events.api import \ diff --git a/rero_ils/modules/patron_transactions/utils.py b/rero_ils/modules/patron_transactions/utils.py index bb8e29f8ce..8cfacdde03 100644 --- a/rero_ils/modules/patron_transactions/utils.py +++ b/rero_ils/modules/patron_transactions/utils.py @@ -19,7 +19,7 @@ """Utility functions about PatronTransactions.""" from datetime import datetime, timezone -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from .api import PatronTransaction, PatronTransactionsSearch from ..utils import get_ref_for_pid diff --git a/rero_ils/modules/patron_types/api.py b/rero_ils/modules/patron_types/api.py index 0af556556e..5844dd8f38 100644 --- a/rero_ils/modules/patron_types/api.py +++ b/rero_ils/modules/patron_types/api.py @@ -23,7 +23,7 @@ from functools import partial from elasticsearch_dsl import Q -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from .models import PatronTypeIdentifier, PatronTypeMetadata from ..api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch diff --git a/rero_ils/modules/patrons/api.py b/rero_ils/modules/patrons/api.py index 6f5691ad5c..b9564bbcfc 100644 --- a/rero_ils/modules/patrons/api.py +++ b/rero_ils/modules/patrons/api.py @@ -23,8 +23,8 @@ from elasticsearch_dsl import Q from flask import current_app -from flask_babelex import gettext as _ -from flask_babelex import ngettext +from flask_babel import gettext as _ +from flask_babel import ngettext from flask_login import current_user from invenio_circulation.proxies import current_circulation from invenio_db import db @@ -48,7 +48,6 @@ from rero_ils.modules.users.models import UserRole from rero_ils.modules.utils import extracted_data_from_ref, \ get_patron_from_arguments, get_ref_for_pid, sorted_pids -from rero_ils.utils import create_user_from_data from .extensions import UserDataExtension from .models import CommunicationChannel, PatronIdentifier, PatronMetadata @@ -66,24 +65,6 @@ if UserRole.PATRON in patron.get('roles', []) ]) - -def create_patron_from_data(data, delete_pid=False, dbcommit=False, - reindex=False): - """Create a patron and a user from a data dict. - - :param data - dictionary representing a library user - :param dbcommit - commit the changes in the db after the creation - :param reindex - index the record after the creation - :returns: - A `Patron` instance - """ - data = create_user_from_data(data) - return Patron.create( - data=data, - delete_pid=delete_pid, - dbcommit=dbcommit, - reindex=reindex) - - # provider PatronProvider = type( 'PatronProvider', @@ -520,9 +501,12 @@ def set_keep_history(self, keep_history, dbcommit=True, reindex=True): :param dbcommit - commit the changes :param reindex - index the changes """ - self.user.profile.keep_history = keep_history + user = self._get_user_by_user_id(self.get('user_id')) + profile = user.user_profile + profile['keep_history'] = keep_history + user.user_profile = profile + db.session.merge(user) if dbcommit: - db.session.merge(self.user) db.session.commit() if reindex: self.reindex() @@ -748,10 +732,10 @@ def is_expired(self): @property def formatted_name(self): """Return the best possible human-readable patron name.""" - profile = self.user.profile + profile = self.user.user_profile name_parts = [ - profile.last_name.strip(), - profile.first_name.strip() + profile.get('last_name', '').strip(), + profile.get('first_name', '').strip() ] return ', '.join(filter(None, name_parts)) @@ -880,7 +864,8 @@ def age(self): :returns: Age of the patron as ``int`` """ - birth_date = self.user.profile.birth_date + birth_date = self.user.user_profile['birth_date'] + birth_date = datetime.strptime(birth_date, '%Y-%m-%d') today = date.today() return today.year - birth_date.year - ( (today.month, today.day) < (birth_date.month, birth_date.day)) diff --git a/rero_ils/modules/patrons/cli.py b/rero_ils/modules/patrons/cli.py index ae4edbf462..ae9ea9a8d9 100644 --- a/rero_ils/modules/patrons/cli.py +++ b/rero_ils/modules/patrons/cli.py @@ -23,13 +23,10 @@ import os import sys import traceback -from datetime import datetime import click from flask import current_app from flask.cli import with_appcontext -from flask_security.confirmable import confirm_user -from invenio_accounts.ext import hash_password from invenio_db import db from invenio_jsonschemas.proxies import current_jsonschemas from jsonmerge import Merger @@ -38,8 +35,9 @@ from werkzeug.local import LocalProxy from rero_ils.modules.patrons.models import CommunicationChannel +from rero_ils.modules.users.api import User -from .api import User, create_patron_from_data +from .utils import create_patron_from_data from ..patrons.api import Patron, PatronProvider from ..providers import append_fixtures_new_identifiers from ..utils import JsonWriter, get_schema_for_resource, read_json_record @@ -83,34 +81,7 @@ def import_users(infile, append, verbose, password, lazy, dont_stop_on_error, pids = [] error_records = [] for count, patron_data in enumerate(data, 1): - password = patron_data.get('password', password) - username = patron_data['username'] - if password: - patron_data.pop('password', None) - if verbose: - user_record = User.get_by_username(username) - if not user_record: - click.secho('{count: <8} Creating user: {username}'.format( - count=count, - username=username - ) - ) - else: - user = user_record.user - for field in profile_fields: - value = patron_data.get(field) - if value is not None: - if field == 'birth_date': - value = datetime.strptime(value, '%Y-%m-%d') - setattr(user.profile, field, value) - db.session.merge(user) - db.session.commit() - click.secho('{count: <8} User updated: {username}'.format( - count=count, - username=username - ), - fg='yellow' - ) + try: # patron creation patron = None @@ -120,22 +91,14 @@ def import_users(infile, append, verbose, password, lazy, dont_stop_on_error, if not patron: patron = create_patron_from_data( data=patron_data, - dbcommit=False, - reindex=False + dbcommit=True, + reindex=True ) - user = patron.user - user.password = hash_password(password) - user.active = True - db.session.merge(user) - db.session.commit() - confirm_user(user) - patron.reindex() pids.append(patron.pid) else: # remove profile fields from patron record - for field in profile_fields: - patron_data.pop(field, None) - patron.update(data=patron_data, dbcommit=True, reindex=True) + patron.update( + data=User.remove_fields(data), dbcommit=True, reindex=True) if verbose: click.secho('{count: <8} Patron updated: {username}' .format(count=count, username=username), diff --git a/rero_ils/modules/patrons/listener.py b/rero_ils/modules/patrons/listener.py index d5b09ab398..4506334dba 100644 --- a/rero_ils/modules/patrons/listener.py +++ b/rero_ils/modules/patrons/listener.py @@ -65,14 +65,14 @@ def create_subscription_patron_transaction(sender, record=None, **kwargs): record.add_subscription(ptty, start_date, end_date) -def update_from_profile(sender, profile=None, **kwargs): +def update_from_profile(sender, user, **kwargs): """Update the patron linked with the user profile data. :param profile - the rero user profile """ - for patron in Patron.get_patrons_by_user(profile.user): + for patron in Patron.get_patrons_by_user(user): patron.reindex() if patron.is_patron: from ..loans.api import anonymize_loans - if not profile.keep_history: + if not user.user_profile.get('keep_history', True): anonymize_loans(patron=patron, dbcommit=True, reindex=True) diff --git a/rero_ils/modules/patrons/schemas/json.py b/rero_ils/modules/patrons/schemas/json.py index 32765284f6..9f5535cada 100644 --- a/rero_ils/modules/patrons/schemas/json.py +++ b/rero_ils/modules/patrons/schemas/json.py @@ -85,7 +85,8 @@ def remove_user_data(self, data, many, **kwargs): :return Data cleared from user profile information. """ data = data if many else [data] - profile_fields = set(User.profile_fields + ['username', 'email']) + profile_fields = set( + User.profile_fields + ['username', 'email', 'password']) for record in data: for field in profile_fields: record.pop(field, None) diff --git a/rero_ils/modules/patrons/tasks.py b/rero_ils/modules/patrons/tasks.py index 35d9afcf0d..6d2c26f5d9 100644 --- a/rero_ils/modules/patrons/tasks.py +++ b/rero_ils/modules/patrons/tasks.py @@ -24,6 +24,8 @@ from celery import shared_task from flask import current_app +from rero_ils.modules.users.api import User + from .api import Patron from ..patron_types.api import PatronType from ..utils import add_years, set_timestamp @@ -56,7 +58,7 @@ def is_obsolete(subscription, end_date=None): # `create_subscription_patron_transaction`. This listener will # create a new subscription if needed patron.update( - Patron.remove_user_data(patron.dumps()), + User.remove_fields(patron.dumps()), dbcommit=True, reindex=True ) diff --git a/rero_ils/modules/patrons/utils.py b/rero_ils/modules/patrons/utils.py index 613959ab31..79367bb5ee 100644 --- a/rero_ils/modules/patrons/utils.py +++ b/rero_ils/modules/patrons/utils.py @@ -20,6 +20,8 @@ from flask_login import current_user from marshmallow import ValidationError +from rero_ils.modules.users.api import User + def user_has_patron(user=current_user): """Test if user has a patron.""" @@ -68,3 +70,40 @@ def validate_role_changes(user, changes, raise_exc=True): return False # No problems were detected return True + + +def create_user_from_data(data, send_email=False): + """Create a user and set the profile fields from a data. + + :param data: A dict containing a mix of patron and user data. + :param send_email - send the reset password email to the user + :returns: The modified dict. + """ + user = User.get_by_username(data.get('username')) + if not user: + user = User.create(data, send_email) + user_id = user.id + else: + user_id = user.user.id + data['user_id'] = user_id + + return User.remove_fields(data) + + +def create_patron_from_data( + data, dbcommit=True, reindex=True, send_email=False +): + """Create a patron and a user from a data dict. + + :param data - dictionary representing a library user + :param send_email - send the reset password email to the user + :returns: - A `Patron` instance + """ + from .api import Patron + data = create_user_from_data(data, send_email) + ptrn = Patron.create( + data=data, + delete_pid=False, + dbcommit=dbcommit, + reindex=reindex) + return ptrn diff --git a/rero_ils/modules/patrons/views.py b/rero_ils/modules/patrons/views.py index 23e9ae6a7e..0fd6e4794e 100644 --- a/rero_ils/modules/patrons/views.py +++ b/rero_ils/modules/patrons/views.py @@ -25,9 +25,9 @@ from flask import Blueprint, abort, current_app, jsonify, render_template from flask import request as flask_request -from flask_babelex import format_currency -from flask_babelex import gettext as _ -from flask_babelex import lazy_gettext +from flask_babel import format_currency +from flask_babel import lazy_gettext +from flask_babel import lazy_gettext as _ from flask_breadcrumbs import register_breadcrumb from flask_login import current_user, login_required from flask_menu import register_menu @@ -361,7 +361,7 @@ def get_institution_code(institution): # Birthdate if 'birthdate' in token_scopes: - data['birthdate'] = current_user.profile.birth_date.isoformat() + data['birthdate'] = current_user.user_profile.get('birth_date') # Patron types if 'patron_types' in token_scopes: diff --git a/rero_ils/modules/selfcheck/admin.py b/rero_ils/modules/selfcheck/admin.py index 81834f7c69..44bbbdbb10 100644 --- a/rero_ils/modules/selfcheck/admin.py +++ b/rero_ils/modules/selfcheck/admin.py @@ -20,7 +20,7 @@ from flask_admin.contrib.sqla import ModelView from flask_admin.form.fields import DateTimeField -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from werkzeug.local import LocalProxy from wtforms.fields import SelectField from wtforms.validators import DataRequired diff --git a/rero_ils/modules/selfcheck/api.py b/rero_ils/modules/selfcheck/api.py index ede88a2b1e..d8536b94cb 100644 --- a/rero_ils/modules/selfcheck/api.py +++ b/rero_ils/modules/selfcheck/api.py @@ -21,7 +21,7 @@ from datetime import datetime, timezone from flask import current_app -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_circulation.errors import CirculationException, \ ItemNotAvailableError @@ -96,7 +96,7 @@ def authorize_patron(barcode, password, **kwargs): if patron and patron.is_patron: # User email is an optional field. When User hasn't email address, # we take his username as login. - user_login = patron.user.email or patron.user.profile.username + user_login = patron.user.email or patron.user.username return authorize_selfckeck_user(user_login, password) return False diff --git a/rero_ils/modules/selfcheck/utils.py b/rero_ils/modules/selfcheck/utils.py index 623da0b478..3efe3550a6 100644 --- a/rero_ils/modules/selfcheck/utils.py +++ b/rero_ils/modules/selfcheck/utils.py @@ -86,11 +86,11 @@ def format_patron_address(patron): city=address.get('city') ) else: - profile = patron.user.profile + profile = patron.user.user_profile formated_address = '{street}, {postal_code} {city}'.format( - street=profile.street.strip(), - postal_code=profile.postal_code.strip(), - city=profile.city.strip() + street=profile['street'].strip(), + postal_code=profile['postal_code'].strip(), + city=profile['city'].strip() ) # Should never append, but can be imported from an old system return formated_address.replace(r'\n', ' ').replace(r'\r', ' ')\ diff --git a/rero_ils/modules/stats/views.py b/rero_ils/modules/stats/views.py index f85da079a3..3d2ef23132 100644 --- a/rero_ils/modules/stats/views.py +++ b/rero_ils/modules/stats/views.py @@ -161,7 +161,7 @@ def stats_librarian_queries(record_pid): # JINJA FILTERS =============================================================== -@jinja2.contextfilter +@jinja2.pass_context @blueprint.app_template_filter() def yearmonthfilter(context, value, format="%Y-%m-%dT%H:%M:%S"): """Convert datetime in local timezone. @@ -177,7 +177,7 @@ def yearmonthfilter(context, value, format="%Y-%m-%dT%H:%M:%S"): return f"{month_name} {value.year}" -@jinja2.contextfilter +@jinja2.pass_context @blueprint.app_template_filter() def stringtodatetime(context, value, format="%Y-%m-%dT%H:%M:%S"): """Convert string to datetime. @@ -188,7 +188,7 @@ def stringtodatetime(context, value, format="%Y-%m-%dT%H:%M:%S"): return datetime.datetime.strptime(value, format) -@jinja2.contextfilter +@jinja2.pass_context @blueprint.app_template_filter() def sort_dict_by_key(context, dictionary): """Sort dict by dict of keys. @@ -200,7 +200,7 @@ def sort_dict_by_key(context, dictionary): return StatCSVSerializer.sort_dict_by_key(dictionary) -@jinja2.contextfilter +@jinja2.pass_context @blueprint.app_template_filter() def sort_dict_by_library(context, dictionary): """Sort dict by library name. @@ -212,7 +212,7 @@ def sort_dict_by_library(context, dictionary): return sorted(dictionary, key=lambda v: v['library']['name']) -@jinja2.contextfilter +@jinja2.pass_context @blueprint.app_template_filter() def process_data(context, value): """Process data. diff --git a/rero_ils/modules/tasks.py b/rero_ils/modules/tasks.py index bec8045891..3841dc2891 100644 --- a/rero_ils/modules/tasks.py +++ b/rero_ils/modules/tasks.py @@ -26,14 +26,14 @@ @shared_task(ignore_result=True) -def process_bulk_queue(version_type=None, queue=None, es_bulk_kwargs=None, +def process_bulk_queue(version_type=None, queue=None, search_bulk_kwargs=None, stats_only=True): """Process bulk indexing queue. :param str version_type: Elasticsearch version type. :param Queue queue: Queue to use. :param str routing_key: Routing key to use. - :param dict es_bulk_kwargs: Passed to + :param dict search_bulk_kwargs: Passed to :func:`elasticsearch:elasticsearch.helpers.bulk`. :param boolean stats_only: if `True` only report number of successful/failed operations instead of just number of @@ -52,7 +52,7 @@ def process_bulk_queue(version_type=None, queue=None, es_bulk_kwargs=None, routing_key=queue ) return indexer.process_bulk_queue( - es_bulk_kwargs=es_bulk_kwargs, stats_only=stats_only) + search_bulk_kwargs=search_bulk_kwargs, stats_only=stats_only) @shared_task(ignore_result=True) diff --git a/rero_ils/modules/templates/schemas/json.py b/rero_ils/modules/templates/schemas/json.py index 92849a1bec..66d7bf54ca 100644 --- a/rero_ils/modules/templates/schemas/json.py +++ b/rero_ils/modules/templates/schemas/json.py @@ -19,7 +19,7 @@ """Marshmallow schema for JSON representation of `Template` resources.""" from functools import partial -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_records_rest.schemas import StrictKeysMixin from invenio_records_rest.schemas.fields import GenFunction, SanitizedUnicode from marshmallow import ValidationError, fields, validates, validates_schema diff --git a/rero_ils/modules/users/api.py b/rero_ils/modules/users/api.py index fd63f4c6dc..c5a297d6e4 100644 --- a/rero_ils/modules/users/api.py +++ b/rero_ils/modules/users/api.py @@ -18,23 +18,20 @@ """API for manipulating users.""" -from datetime import datetime from flask import current_app, url_for -from flask_babelex import lazy_gettext as _ +from flask_babel import lazy_gettext as _ from flask_login import current_user from flask_security.confirmable import confirm_user from flask_security.recoverable import send_reset_password_instructions -from invenio_accounts.ext import hash_password +from flask_security.utils import hash_password from invenio_accounts.models import User as BaseUser from invenio_db import db from invenio_jsonschemas import current_jsonschemas -from invenio_records.validators import PartialDraft4Validator from invenio_records_rest.utils import obj_or_import_string -from invenio_userprofiles.models import UserProfile +from jsonschema import Draft4Validator from jsonschema.exceptions import ValidationError from sqlalchemy import func -from sqlalchemy.orm.exc import NoResultFound from werkzeug.local import LocalProxy from ..api import ils_record_format_checker @@ -86,9 +83,12 @@ class User(object): profile_fields = [ 'first_name', 'last_name', 'street', 'postal_code', 'gender', - 'city', 'birth_date', 'username', 'home_phone', 'business_phone', + 'city', 'birth_date', 'home_phone', 'business_phone', 'mobile_phone', 'other_phone', 'keep_history', 'country' ] + user_fields = [ + 'email', 'username', 'password' + ] def __init__(self, user): """User class initializer.""" @@ -100,37 +100,34 @@ def id(self): return self.user.id @classmethod - def create(cls, data, **kwargs): + def create(cls, data, send_email=True, **kwargs): """User record creation. :param cls - class object :param data - dictionary representing a user record + :param send_email - send the reset password email to the user """ with db.session.begin_nested(): - email = data.pop('email', None) - data.pop('roles', None) # Generate password if not present - password = data.pop('password', None) - if not password: - password = password_generator() - cls._validate(data=data) + profile = { + k: v for k, v in data.items() + if k in cls.profile_fields + } + if profile: + cls._validate(profile) + password = data.get('password', password_generator()) + cls._validate_password(password=password) user = BaseUser( + username=data.get('username'), password=hash_password(password), - profile=data, active=True) + user_profile=profile, active=True) db.session.add(user) - profile = user.profile - for field in cls.profile_fields: - value = data.get(field) - if value is not None: - if field == 'birth_date': - value = datetime.strptime(value, '%Y-%m-%d') - setattr(profile, field, value) # send the reset password notification for new users - if email: + if email := data.get('email'): user.email = email db.session.merge(user) db.session.commit() - if user.email: + if data.get('email') and send_email: send_reset_password_instructions(user) confirm_user(user) return cls(user) @@ -141,49 +138,40 @@ def update(self, data): :param data - dictionary representing a user record to update """ from ..patrons.listener import update_from_profile - data.pop('roles', None) - self._validate(data=data) - email = data.pop('email', None) - password = data.pop('password', None) + profile = {k: v for k, v in data.items() if k in self.profile_fields} + if profile: + self._validate(profile) + if password := data.get('password'): + self._validate_password(password=password) + user = self.user with db.session.begin_nested(): - if user.profile is None: - user.profile = UserProfile(user_id=user.id) - profile = user.profile - for field in self.profile_fields: - if field == 'birth_date': - setattr( - profile, field, - datetime.strptime(data.get(field), '%Y-%m-%d')) - else: - setattr(profile, field, data.get(field, '')) if password: user.password = hash_password(password) - - if email and email != user.email: + user.username = data.get('username') + if email := data.get('email'): user.email = email - # remove the email from user data - elif not email and user.email: - user.email = None + else: + user._email = None + user.user_profile = profile db.session.merge(user) db.session.commit() confirm_user(user) - update_from_profile('user', self.user.profile) + update_from_profile('user', self.user) return self @classmethod def _validate(cls, data, **kwargs): """Validate user record against schema.""" - if 'password' in data: - cls._validate_password(data['password']) - default_user_schema = get_schema_for_resource('user') - if schema := data.pop('$schema', default_user_schema): - _records_state.validate( - data, - schema, - format_checker=ils_record_format_checker, - cls=PartialDraft4Validator - ) + schema = get_schema_for_resource('user') + data['$schema'] = schema + _records_state.validate( + data, + schema, + format_checker=ils_record_format_checker, + cls=Draft4Validator + ) + data.pop('$schema') return data @classmethod @@ -194,6 +182,17 @@ def _validate_password(cls, password): except PasswordValidatorException as e: raise ValidationError(str(e)) from e + @classmethod + @property + def fields(cls): + """Validate password.""" + return cls.profile_fields + cls.user_fields + + @classmethod + def remove_fields(cls, data): + """.""" + return {k: v for k, v in data.items() if k not in cls.fields} + @classmethod def get_record(cls, user_id): """Get a user by a user_id. @@ -225,14 +224,11 @@ def dumps_metadata(self, dump_patron: bool = False) -> dict: metadata = { 'roles': [r.name for r in self.user.roles] } - if self.user.profile: - for field in self.profile_fields: - if value := getattr(self.user.profile, field): - if field == 'birth_date': - value = datetime.strftime(value, '%Y-%m-%d') - metadata[field] = value + metadata.update(self.user.user_profile) if self.user.email: metadata['email'] = self.user.email + if self.user.username: + metadata['username'] = self.user.username if dump_patron: for patron in Patron.get_patrons_by_user(self.user): metadata.setdefault('patrons', []).append({ @@ -251,11 +247,8 @@ def get_by_username(cls, username): :param username - the user name :return: the user record """ - try: - profile = UserProfile.get_by_username(username) - return cls(profile.user) - except NoResultFound: - return None + if base_user := BaseUser.query.filter_by(username=username).first(): + return cls(base_user) @classmethod def get_by_email(cls, email): diff --git a/rero_ils/modules/users/jsonschemas/users/user-v0.0.1.json b/rero_ils/modules/users/jsonschemas/users/user-v0.0.1.json index 6f89e145b6..986302e455 100644 --- a/rero_ils/modules/users/jsonschemas/users/user-v0.0.1.json +++ b/rero_ils/modules/users/jsonschemas/users/user-v0.0.1.json @@ -7,7 +7,6 @@ "propertiesOrder": [ "first_name", "last_name", - "username", "email", "password", "street", @@ -26,8 +25,7 @@ "$schema", "first_name", "last_name", - "birth_date", - "username" + "birth_date" ], "properties": { "$schema": { @@ -105,24 +103,6 @@ ] } }, - "username": { - "title": "Username", - "description": "Login username for the web interface.", - "type": "string", - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-_]{2}[a-zA-Z0-9-_]*$", - "minLength": 3, - "maxLength": 255, - "widget": { - "formlyConfig": { - "validation": { - "messages": { - "patternMessage": "Username must start with a letter or a number, be at least three characters long and only contain alphanumeric characters, dashes and underscores.", - "uniqueUsernameMessage": "This username is already taken." - } - } - } - } - }, "street": { "title": "Street", "description": "Street and number of the address.", diff --git a/rero_ils/modules/users/schemas.py b/rero_ils/modules/users/schemas.py new file mode 100644 index 0000000000..1100eaa153 --- /dev/null +++ b/rero_ils/modules/users/schemas.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# +# RERO ILS +# Copyright (C) 2019-2022 RERO +# Copyright (C) 2019-2022 UCLouvain +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +"""Models for RERO-ILS users.""" +from marshmallow import Schema, fields + + +class UserProfile(Schema): + """A custom user profile schema.""" + + last_name = fields.String() + """Last name of person.""" + + first_name = fields.String() + """First name of person.""" + + gender = fields.String() + """Gender of person.""" + + birth_date = fields.Date() + """Birth date of person.""" + + street = fields.String() + """Street address of person.""" + + postal_code = fields.String() + """Postal code address of person.""" + + city = fields.String() + """City address of person.""" + + country = fields.String() + """Country address of person.""" + + home_phone = fields.String() + """Home phone number of person.""" + + business_phone = fields.String() + """Business phone number of person.""" + + mobile_phone = fields.String() + """Mobile phone number of person.""" + + other_phone = fields.String() + """Other phone number of person.""" + + keep_history = fields.Boolean() + """Boolean stating to keep loan history or not.""" diff --git a/rero_ils/modules/utils.py b/rero_ils/modules/utils.py index 33f61ca259..dec7edf9c3 100644 --- a/rero_ils/modules/utils.py +++ b/rero_ils/modules/utils.py @@ -38,8 +38,8 @@ import sqlalchemy from dateutil import parser from flask import current_app, session -from flask_babelex import gettext as _ -from flask_babelex import ngettext +from flask_babel import gettext as _ +from flask_babel import ngettext from flask_login import current_user from invenio_accounts.models import Role from invenio_cache import current_cache diff --git a/rero_ils/modules/vendors/api.py b/rero_ils/modules/vendors/api.py index 6930716a7f..f868c7cc26 100644 --- a/rero_ils/modules/vendors/api.py +++ b/rero_ils/modules/vendors/api.py @@ -20,7 +20,7 @@ from functools import partial -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.acquisition.acq_invoices.api import \ AcquisitionInvoicesSearch diff --git a/rero_ils/modules/views.py b/rero_ils/modules/views.py index 37323af36e..3eae3e3671 100644 --- a/rero_ils/modules/views.py +++ b/rero_ils/modules/views.py @@ -25,7 +25,6 @@ import requests from flask import Blueprint, abort, current_app, jsonify, make_response, \ request -from flask_babelex import get_domain from rero_ils.modules.utils import cached, get_all_roles @@ -153,15 +152,15 @@ def translations(ln): :param ln: language ISO 639-1 Code (two chars). """ - domain = get_domain() - paths = domain.paths + babel = current_app.extensions['babel'] + paths = babel.default_directories try: path = next(p for p in paths if p.find('rero_ils') > -1) except StopIteration: current_app.logger.error(f'translations for {ln} does not exist') abort(404) - po_file_name = f'{path}/{ln}/LC_MESSAGES/{domain.domain}.po' + po_file_name = f'{path}/{ln}/LC_MESSAGES/{babel.default_domain}.po' if not os.path.isfile(po_file_name): abort(404) try: diff --git a/rero_ils/theme/menus.py b/rero_ils/theme/menus.py index 4b6000001f..e7e30be4b0 100644 --- a/rero_ils/theme/menus.py +++ b/rero_ils/theme/menus.py @@ -20,7 +20,7 @@ from functools import partial from flask import current_app, request, session -from flask_babelex import gettext as _ +from flask_babel import lazy_gettext as _ from flask_login import current_user from flask_menu import current_menu from invenio_i18n.ext import current_i18n diff --git a/rero_ils/theme/templates/security/email/reset_instructions.html b/rero_ils/theme/templates/security/email/reset_instructions.html index 0b73c9b4d2..4e8a0c6a9b 100644 --- a/rero_ils/theme/templates/security/email/reset_instructions.html +++ b/rero_ils/theme/templates/security/email/reset_instructions.html @@ -18,8 +18,8 @@ #} -{%- if user.profile.first_name and user.profile.last_name %} -

{{ _('Dear') }} {{ user.profile.first_name }} {{ user.profile.last_name }},

+{%- if user.user_profile.first_name and user.user_profile.last_name %} +

{{ _('Dear') }} {{ user.user_profile.first_name }} {{ user.user_profile.last_name }},

{%- else %}

{{ _('Dear patron') }},

{%- endif %} diff --git a/rero_ils/theme/templates/security/email/reset_instructions.txt b/rero_ils/theme/templates/security/email/reset_instructions.txt index 9797724663..9156455cd6 100644 --- a/rero_ils/theme/templates/security/email/reset_instructions.txt +++ b/rero_ils/theme/templates/security/email/reset_instructions.txt @@ -1,6 +1,6 @@ -{%- if user.profile.first_name and user.profile.last_name %} -

{{ _('Dear') }} {{ user.profile.first_name }} {{ user.profile.last_name }},

+{%- if user.user_profile.first_name and user.user_profile.last_name %} +

{{ _('Dear') }} {{ user.user_profile.first_name }} {{ user.user_profile.last_name }},

{%- else %}

{{ _('Dear patron') }},

{%- endif %} diff --git a/rero_ils/theme/templates/security/email/reset_notice.html b/rero_ils/theme/templates/security/email/reset_notice.html index 7b0a331027..4774d290a1 100644 --- a/rero_ils/theme/templates/security/email/reset_notice.html +++ b/rero_ils/theme/templates/security/email/reset_notice.html @@ -18,8 +18,8 @@ #} -{%- if user.profile.first_name and user.profile.last_name %} -

{{ _('Dear') }} {{ user.profile.first_name }} {{ user.profile.last_name }},

+{%- if user.user_profile.first_name and user.user_profile.last_name %} +

{{ _('Dear') }} {{ user.user_profile.first_name }} {{ user.user_profile.last_name }},

{%- else %}

{{ _('Dear patron') }},

{%- endif %} diff --git a/rero_ils/theme/templates/security/email/reset_notice.txt b/rero_ils/theme/templates/security/email/reset_notice.txt index 138266d4a1..baabb28f33 100644 --- a/rero_ils/theme/templates/security/email/reset_notice.txt +++ b/rero_ils/theme/templates/security/email/reset_notice.txt @@ -1,5 +1,5 @@ -{%- if user.profile.first_name and user.profile.last_name %} -

{{ _('Dear') }} {{ user.profile.first_name }} {{ user.profile.last_name }},

+{%- if user.user_profile.first_name and user.user_profile.last_name %} +

{{ _('Dear') }} {{ user.user_profile.first_name }} {{ user.user_profile.last_name }},

{%- else %}

{{ _('Dear patron') }},

{%- endif %} diff --git a/rero_ils/utils.py b/rero_ils/utils.py index 2acbc55823..d6d1c7124f 100644 --- a/rero_ils/utils.py +++ b/rero_ils/utils.py @@ -17,20 +17,12 @@ """Utilities functions for rero-ils.""" -from copy import deepcopy -from datetime import datetime import iso639 from flask import current_app -from flask_babelex import gettext -from flask_security.confirmable import confirm_user -from invenio_accounts.ext import hash_password -from invenio_accounts.models import User as BaseUser -from invenio_db import db +from flask_babel import gettext from invenio_i18n.ext import current_i18n -from rero_ils.modules.utils import password_generator - def unique_list(data): """Unicity of list.""" @@ -39,8 +31,7 @@ def unique_list(data): def get_current_language(): """Return the current selected locale.""" - loc = current_i18n.locale - return loc.language + return current_i18n.locale.language def get_i18n_supported_languages(): @@ -69,62 +60,6 @@ def remove_empties_from_dict(a_dict): return new_dict or None -def create_user_from_data(data): - """Create a user and set the profile fields from a data. - - :param data: A dict containing a mix of patron and user data. - :returns: The modified dict. - """ - from .modules.users.api import User - data = deepcopy(data) - profile_fields = [ - 'first_name', 'last_name', 'street', 'postal_code', 'gender', - 'city', 'birth_date', 'username', 'home_phone', 'business_phone', - 'mobile_phone', 'other_phone', 'keep_history', 'country', 'email', - 'password' - ] - user = User.get_by_username(data.get('username')) - if not user: - with db.session.begin_nested(): - # create the user - password = data.get('password') - if not password: - length = current_app.config.get( - 'RERO_ILS_PASSWORD_MIN_LENGTH', 8) - special_char = current_app.config.get( - 'RERO_ILS_PASSWORD_SPECIAL_CHAR') - password = password_generator( - length=length, special_char=special_char) - password = hash_password(password) - user = BaseUser(password=password, profile=dict(), active=True) - db.session.add(user) - # set the user fields - if data.get('email') is not None: - user.email = data['email'] - profile = user.profile - # set the profile - for field in profile_fields: - value = data.get(field) - if value is not None: - if field == 'birth_date': - value = datetime.strptime(value, '%Y-%m-%d') - setattr(profile, field, value) - db.session.merge(user) - db.session.commit() - confirm_user(user) - user_id = user.id - else: - user_id = user.user.id - # remove the user fields from the data - for field in profile_fields: - try: - del data[field] - except KeyError: - pass - data['user_id'] = user_id - return data - - def language_iso639_2to1(lang): """Convert a bibliographic language to alpha2. diff --git a/scripts/setup b/scripts/setup index 77d6db7c6b..b771812ef1 100755 --- a/scripts/setup +++ b/scripts/setup @@ -653,6 +653,10 @@ eval ${PREFIX} invenio reroils stats collect librarian eval ${PREFIX} invenio reroils stats report collect-all month eval ${PREFIX} invenio reroils stats report collect-all year +info_msg "Initialize wiki search" +eval ${PREFIX} invenio flask_wiki init-index +eval ${PREFIX} invenio flask_wiki index + date success_msg "Perfect ${PROGRAM}! See you soonā€¦" exit 0 diff --git a/scripts/test b/scripts/test index 51fbd3d0e0..22f6703efa 100755 --- a/scripts/test +++ b/scripts/test @@ -67,35 +67,25 @@ if [[ -z "${VIRTUAL_ENV}" ]]; then fi function pretests () { -# +============================+===========+==========================+==========+ -# | flask | 1.1.4 | <2.2.5 | 55261 | -# | flask-security | 3.0.0 | <3.1.0 | 45183 | -# | flask-security | 3.0.0 | >0 | 44501 | -# | pillow | 9.5.0 | <10.0.1 | 61489 | -# | sqlalchemy | 1.3.24 | <2.0.0b1 | 51668 | -# | sqlalchemy-utils | 0.35.0 | >=0.27.0 | 42194 | -# | wtforms | 2.3.3 | <3.0.0a1 | 42852 | -# | werkzeug | 1.0.1 | <2.2.3 | 53325 | -# | werkzeug | 1.0.1 | <2.2.3 | 53326 | -# | celery | 5.1.2 | <5.2.0 | 42498 | -# | celery | 5.1.2 | <5.2.2 | 43738 | -# | click | 7.1.2 | <8.0.0 | 47833 | -# | cryptography | 39.0.2 | <41.0.0 | 59062 | -# | cryptography | 39.0.2 | <41.0.2 | 59473 | -# | cryptography | 39.0.2 | >=0.8,<41.0.3 | 60224 | -# | cryptography | 39.0.2 | >=0.8,<41.0.3 | 60225 | -# | cryptography | 39.0.2 | >=0.8,<41.0.3 | 60223 | -# | py | 1.11.0 | <=1.11.0 | 51457 | -# | safety | 1.10.3 | <2.2.0 | 51358 | -# | sentry-sdk | 1.6.0 | <1.14.0 | 53812 | -# | flask-caching | 2.1.0 | <=2.1.0 | 40459 | -# | pillow | 9.5.0 | <10.0.0 | 62156 | -# | werkzeug | 1.0.1 | <2.3.8 | 62019 | -# | cryptography | 39.0.2 | <41.0.4 | 62451 | -# | cryptography | 39.0.2 | <41.0.5 | 62452 | -# | cryptography | 39.0.2 | >=3.1,<41.0.6 | 62556 | -# +==============================================================================+ - safety check -i 40459 -i 45183 -i 44501 -i 51668 -i 42194 -i 42852 -i 53325 -i 53326 -i 54456 -i 42498 -i 43738 -i 47833 -i 51457 -i 51358 -i 59473 -i 55261 -i 53812 -i 59956 -i 59062 -i 59473 -i 60224 -i 60225 -i 60223 -i 61489 -i 62019 -i 62156 -i 62451 -i 62452 -i 62556 + # -> Vulnerability found in flask-caching version 2.0.1 + # Vulnerability ID: 40459 + # -> Vulnerability found in sqlalchemy version 1.4.50 + # Vulnerability ID: 51668 + # -> Vulnerability found in sqlalchemy-utils version 0.38.3 + # Vulnerability ID: 42194 + # -> Vulnerability found in wtforms version 2.3.3 + # Vulnerability ID: 42852 + # -> Vulnerability found in werkzeug version 2.2.3 + # Vulnerability ID: 62019 + # -> Vulnerability found in py version 1.11.0 + # Vulnerability ID: 51457 + info_msg "Check vulnerabilities:" + safety_exceptions="-i 40459 -i 51668 -i 42194 -i 42852 -i 62019 -i 51457" + msg=$(safety check -o text ${safety_exceptions}) || { + echo "Safety vulnerabilites found for packages:" $(safety check -o bare ${safety_exceptions}) + echo "Run:" "safety check -o screen ${safety_exceptions} | grep -i vulnerability" "for more details" + exit 1 + } info_msg "Check json:" invenio reroils utils check_json tests/data rero_ils/modules data info_msg "Check license:" diff --git a/tests/api/circulation/test_actions_views_checkin.py b/tests/api/circulation/test_actions_views_checkin.py index 5facaed5fa..9f7ca3bbea 100644 --- a/tests/api/circulation/test_actions_views_checkin.py +++ b/tests/api/circulation/test_actions_views_checkin.py @@ -19,7 +19,7 @@ from datetime import date, datetime, timedelta, timezone from flask import url_for -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from invenio_accounts.testutils import login_user_via_session from utils import get_json, postdata @@ -128,7 +128,6 @@ def test_checkin_overdue_item( item_on_loan_martigny_patron_and_loan_on_loan): """Test a checkin for an overdue item with incremental fees.""" - login_user_via_session(client, librarian_martigny.user) item, patron, loan = item_on_loan_martigny_patron_and_loan_on_loan # Update the circulation policy corresponding to the loan @@ -155,6 +154,7 @@ def test_checkin_overdue_item( # Check overdues preview API and check result url = url_for('api_loan.preview_loan_overdue', loan_pid=loan.pid) + login_user_via_session(client, librarian_martigny.user) res = client.get(url) data = get_json(res) assert res.status_code == 200 diff --git a/tests/api/circulation/test_actions_views_extend_loan_request.py b/tests/api/circulation/test_actions_views_extend_loan_request.py index dc78e20b31..958c2fc230 100644 --- a/tests/api/circulation/test_actions_views_extend_loan_request.py +++ b/tests/api/circulation/test_actions_views_extend_loan_request.py @@ -79,7 +79,6 @@ def test_extend_loan( item_on_loan_martigny_patron_and_loan_on_loan, yesterday): """Test frontend extend action.""" - login_user_via_session(client, librarian_martigny.user) item, patron, loan = item_on_loan_martigny_patron_and_loan_on_loan # Update loan `end_date` to play with "extend" function without problem loan['end_date'] = loan['start_date'] @@ -98,6 +97,7 @@ def test_extend_loan( transaction_location_pid=loc_public_martigny.pid ) + login_user_via_session(client, librarian_martigny.user) res, _ = postdata(client, 'api_item.extend_loan', params) assert res.status_code == 403 diff --git a/tests/api/conftest.py b/tests/api/conftest.py index 52be5d9dad..c30e220ab7 100644 --- a/tests/api/conftest.py +++ b/tests/api/conftest.py @@ -23,7 +23,7 @@ from datetime import datetime import pytest -from invenio_accounts.ext import hash_password +from flask_security.utils import hash_password from invenio_accounts.models import User from utils import flush_index @@ -42,12 +42,14 @@ def user_with_profile(db, default_user_password): active=True, ) db.session.add(user) - profile = user.profile - profile.birth_date = datetime(1990, 1, 1) - profile.first_name = 'User' - profile.last_name = 'With Profile' - profile.city = 'Nowhere' + profile = dict( + birth_date=datetime(1990, 1, 1), + first_name='User', + last_name='With Profile', + city='Nowhere' + ) profile.username = 'user_with_profile' + user.user_profile = profile db.session.merge(user) db.session.commit() return user diff --git a/tests/api/items/test_items_rest.py b/tests/api/items/test_items_rest.py index 340875163d..c033e08874 100644 --- a/tests/api/items/test_items_rest.py +++ b/tests/api/items/test_items_rest.py @@ -908,7 +908,6 @@ def test_requested_loans_to_validate( item_type_standard_martigny, item2_lib_martigny, json_header, item_type_missing_martigny, patron_sion, circulation_policies): """Test requested loans to validate.""" - login_user_via_session(client, librarian_martigny.user) holding_pid = item2_lib_martigny.holding_pid holding = Holding.get_record_by_pid(holding_pid) @@ -933,6 +932,7 @@ def test_requested_loans_to_validate( library_pid = librarian_martigny.replace_refs()['libraries'][0]['pid'] + login_user_via_session(client, librarian_martigny.user) res, _ = postdata( client, 'api_item.librarian_request', diff --git a/tests/api/items/test_items_serializer.py b/tests/api/items/test_items_serializer.py index fab7f8de89..6f471364ac 100644 --- a/tests/api/items/test_items_serializer.py +++ b/tests/api/items/test_items_serializer.py @@ -25,7 +25,6 @@ def test_serializers( client, - db, item_lib_martigny, # on shelf document, item_lib_fully, # on loan @@ -122,11 +121,6 @@ def test_serializers( data = get_csv(response) assert data - document['provisionActivity'][0]['type'] = 'bf:Publication' - db.session.rollback() - # restore initial item on Elasticsearch - item.reindex() - # with temporary_item_type item_type = item_type_on_site_martigny circulation = [ @@ -143,13 +137,8 @@ def test_serializers( } item.commit() item.reindex() - list_url = url_for('invenio_records_rest.item_list', q=f'pid:{item.pid}') response = client.get(list_url, headers=rero_json_header) data = response.json['hits']['hits'] assert circulation == \ data[0]['metadata']['item_type']['circulation_information'] - - db.session.rollback() - item_type.reindex() - item.reindex() diff --git a/tests/api/loans/test_loans_rest.py b/tests/api/loans/test_loans_rest.py index bfe80232dd..d1a649f9c8 100644 --- a/tests/api/loans/test_loans_rest.py +++ b/tests/api/loans/test_loans_rest.py @@ -528,8 +528,6 @@ def test_timezone_due_date(client, librarian_martigny, circ_policy_short_martigny, lib_martigny): """Test that timezone affects due date regarding library location.""" - # Login to perform action - login_user_via_session(client, librarian_martigny.user) # Close the library all days. Except Monday. del lib_martigny['exception_dates'] @@ -596,6 +594,8 @@ def test_timezone_due_date(client, librarian_martigny, dbcommit=True, reindex=True ) + # Login to perform action + login_user_via_session(client, librarian_martigny.user) # Checkout the item res, data = postdata( diff --git a/tests/api/loans/test_loans_rest_views.py b/tests/api/loans/test_loans_rest_views.py index be5ab23f81..3f18e54ad1 100644 --- a/tests/api/loans/test_loans_rest_views.py +++ b/tests/api/loans/test_loans_rest_views.py @@ -30,7 +30,6 @@ def test_loan_can_extend(client, patron_martigny, item_lib_martigny, loc_public_martigny, librarian_martigny, circulation_policies, json_header): """Test is loan can extend.""" - login_user(client, patron_martigny) params = { 'patron_pid': patron_martigny.pid, 'transaction_location_pid': loc_public_martigny.pid, @@ -43,6 +42,7 @@ def test_loan_can_extend(client, patron_martigny, item_lib_martigny, list_url = url_for( 'api_loan.can_extend', loan_pid=loan.pid) + login_user(client, patron_martigny) response = client.get(list_url, headers=json_header) assert response.status_code == 200 assert get_json(response) == { diff --git a/tests/api/notifications/test_notifications_rest.py b/tests/api/notifications/test_notifications_rest.py index f0cdc13633..3a24993298 100644 --- a/tests/api/notifications/test_notifications_rest.py +++ b/tests/api/notifications/test_notifications_rest.py @@ -784,11 +784,11 @@ def test_request_notifications_temp_item_type( ): """Test request notifications with item type with negative availability.""" mailbox.clear() - login_user_via_session(client, librarian_martigny.user) item_lib_martigny['temporary_item_type'] = { - '$ref': get_ref_for_pid('itty', item_type_missing_martigny.pid) + '$ref': get_ref_for_pid('itty', item_type_missing_martigny.pid) } item_lib_martigny.update(item_lib_martigny, dbcommit=True, reindex=True) + login_user_via_session(client, librarian_martigny.user) res, data = postdata( client, diff --git a/tests/api/operation_logs/test_operation_logs_rest.py b/tests/api/operation_logs/test_operation_logs_rest.py index 7fd3144fc3..f15ca22e38 100644 --- a/tests/api/operation_logs/test_operation_logs_rest.py +++ b/tests/api/operation_logs/test_operation_logs_rest.py @@ -105,7 +105,6 @@ def test_operation_log_on_item( item_lib_martigny ): """Test operation log on Item.""" - login_user_via_session(client, librarian_martigny.user) # Get the operation log index fake_data = {'date': datetime.now().isoformat()} @@ -119,6 +118,7 @@ def test_operation_log_on_item( q = f'record.type:item AND record.value:{item.pid}' es_url = url_for('invenio_records_rest.oplg_list', q=q, sort='mostrecent') + login_user_via_session(client, librarian_martigny.user) res = client.get(es_url) data = get_json(res) assert data['hits']['total']['value'] == 1 diff --git a/tests/api/patrons/test_patrons_marshmallow.py b/tests/api/patrons/test_patrons_marshmallow.py index 2656fab1f1..9adc188374 100644 --- a/tests/api/patrons/test_patrons_marshmallow.py +++ b/tests/api/patrons/test_patrons_marshmallow.py @@ -24,8 +24,8 @@ from utils import postdata from rero_ils.modules.patrons.api import Patron +from rero_ils.modules.patrons.utils import create_user_from_data from rero_ils.modules.users.models import UserRole -from rero_ils.utils import create_user_from_data def test_patrons_marshmallow_loaders( @@ -38,6 +38,8 @@ def test_patrons_marshmallow_loaders( # Using 'console' commands, no matter connected user, all operations are # allowed on a Patron, even changes any roles. user_data = create_user_from_data(system_librarian_martigny_data_tmp) + from rero_ils.modules.users.api import User + user_data = User.remove_fields(user_data) patron = Patron.create(user_data, dbcommit=True, reindex=True) assert patron and patron['roles'] == [UserRole.FULL_PERMISSIONS] diff --git a/tests/api/patrons/test_patrons_rest.py b/tests/api/patrons/test_patrons_rest.py index 53e37713ba..866e76efaa 100644 --- a/tests/api/patrons/test_patrons_rest.py +++ b/tests/api/patrons/test_patrons_rest.py @@ -32,8 +32,8 @@ from rero_ils.modules.patron_transactions.api import PatronTransaction from rero_ils.modules.patrons.api import Patron from rero_ils.modules.patrons.models import CommunicationChannel +from rero_ils.modules.patrons.utils import create_user_from_data from rero_ils.modules.utils import extracted_data_from_ref, get_ref_for_pid -from rero_ils.utils import create_user_from_data def test_patrons_shortcuts( diff --git a/tests/api/stats/conftest.py b/tests/api/stats/conftest.py index 12e17bf7b5..07914145c4 100644 --- a/tests/api/stats/conftest.py +++ b/tests/api/stats/conftest.py @@ -62,7 +62,7 @@ def stats_librarian(item_lib_martigny, item_lib_fully, item_lib_sion): @pytest.fixture(scope='module') -def stats_report_martigny(stats_cfg_martigny): +def stats_report_martigny(stats_cfg_martigny, item_lib_martigny): """Stats fixture for librarian.""" stat_report = StatsReport(stats_cfg_martigny) values = stat_report.collect() diff --git a/tests/api/test_serializers.py b/tests/api/test_serializers.py index 0a817fdf46..ae8fec2b66 100644 --- a/tests/api/test_serializers.py +++ b/tests/api/test_serializers.py @@ -38,7 +38,6 @@ def test_operation_logs_serializers( lib_martigny_data ): """Test serializers for operation logs.""" - login_user(client, patron_martigny) params = { 'patron_pid': patron_martigny.pid, 'transaction_location_pid': loc_public_martigny.pid, @@ -51,6 +50,7 @@ def test_operation_logs_serializers( # Force update ES index flush_index(OperationLogsSearch.Meta.index) list_url = url_for('invenio_records_rest.oplg_list') + login_user(client, patron_martigny) response = client.get(list_url, headers=rero_json_header) assert response.status_code == 200 data = get_json(response) @@ -132,7 +132,6 @@ def test_loans_serializers( circulation_policies ): """Test serializers for loans.""" - login_user(client, patron_martigny) # create somes loans on same item with different state params = { 'patron_pid': patron_martigny.pid, @@ -162,6 +161,7 @@ def test_loans_serializers( params=params, copy_item=True) list_url = url_for('invenio_records_rest.loanid_list') + login_user(client, patron_martigny) response = client.get(list_url, headers=rero_json_header) assert response.status_code == 200 data = get_json(response) diff --git a/tests/api/test_translations.py b/tests/api/test_translations.py index a77d4886a7..bf0c57b091 100644 --- a/tests/api/test_translations.py +++ b/tests/api/test_translations.py @@ -16,7 +16,6 @@ # along with this program. If not, see . """Test translations API.""" -import mock from flask import url_for from utils import get_json @@ -46,17 +45,13 @@ def test_translations_exceptions(client, app): # ... class FakeDomain(object): # ... paths = [] # - magic_mock = mock.MagicMock(return_value=type( - 'FakeDomain', (object,), dict(paths=[]) - )) - with mock.patch('rero_ils.modules.views.get_domain', magic_mock): - res = client.get( - url_for( - 'api_blueprint.translations', - ln='dummy_language' - ) + res = client.get( + url_for( + 'api_blueprint.translations', + ln='dummy_language' ) - assert res.status_code == 404 + ) + assert res.status_code == 404 res = client.get( url_for( diff --git a/tests/api/test_user_authentication.py b/tests/api/test_user_authentication.py index 7aa3b1c480..b6cbb5d2f4 100644 --- a/tests/api/test_user_authentication.py +++ b/tests/api/test_user_authentication.py @@ -19,7 +19,7 @@ import re from flask import url_for -from flask_babelex import gettext +from flask_babel import gettext from flask_security.recoverable import send_password_reset_notice from invenio_accounts.testutils import login_user_via_session from utils import get_json, postdata diff --git a/tests/api/users/test_users_rest.py b/tests/api/users/test_users_rest.py index 791af0079f..53d80b7c9d 100644 --- a/tests/api/users/test_users_rest.py +++ b/tests/api/users/test_users_rest.py @@ -41,18 +41,7 @@ def test_users_post_put(client, user_data_tmp, librarian_martigny, assert res.status_code == 401 login_user_via_session(client, librarian_martigny.user) - - # test invalid create - user_data_tmp['toto'] = 'toto' - res, data = postdata( - client, - 'api_users.users_list', - user_data_tmp - ) - assert res.status_code == 400 - # test with invalid password - user_data_tmp.pop('toto') user_data_tmp['first_name'] = 1 user_data_tmp['password'] = '12345' res, data = postdata( diff --git a/tests/conftest.py b/tests/conftest.py index f6c4f255da..e32c6266ae 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,7 +27,7 @@ from dotenv import load_dotenv pytest_plugins = ( - # 'celery.contrib.pytest', + 'celery.contrib.pytest', 'fixtures.circulation', 'fixtures.metadata', 'fixtures.organisations', @@ -39,7 +39,7 @@ @pytest.fixture(scope='module') -def es(appctx): +def search(appctx): """Setup and teardown all registered Elasticsearch indices. Scope: module diff --git a/tests/data/data.json b/tests/data/data.json index 94cf02f374..47d6d94936 100644 --- a/tests/data/data.json +++ b/tests/data/data.json @@ -5187,7 +5187,6 @@ "first_name": "John", "last_name": "Smith", "birth_date": "1974-03-21", - "username": "smith_john", "street": "1600 Donald Trump Avenue NW", "postal_code": "20500", "city": "Washington, D.C.", diff --git a/tests/ui/acq_accounts/test_acq_accounts_jsonresolver.py b/tests/ui/acq_accounts/test_acq_accounts_jsonresolver.py index c3aacc6320..7756f42865 100644 --- a/tests/ui/acq_accounts/test_acq_accounts_jsonresolver.py +++ b/tests/ui/acq_accounts/test_acq_accounts_jsonresolver.py @@ -34,11 +34,11 @@ def test_acq_accounts_jsonresolver(acq_account_fiction_martigny): # deleted record acq_account_fiction_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'acq_account': {'$ref': 'https://bib.rero.ch/api/acq_accounts/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/acq_accounts/test_acq_accounts_mapping.py b/tests/ui/acq_accounts/test_acq_accounts_mapping.py index c864d4f3ba..3fd0c871f0 100644 --- a/tests/ui/acq_accounts/test_acq_accounts_mapping.py +++ b/tests/ui/acq_accounts/test_acq_accounts_mapping.py @@ -22,7 +22,7 @@ AcqAccountsSearch -def test_acq_accounts_es_mapping(es, db, acq_account_fiction_martigny_data, +def test_acq_accounts_es_mapping(search, db, acq_account_fiction_martigny_data, budget_2020_martigny, lib_martigny): """Test acquisition account elasticsearch mapping.""" search = AcqAccountsSearch() diff --git a/tests/ui/acq_invoices/test_acq_invoices_jsonresolver.py b/tests/ui/acq_invoices/test_acq_invoices_jsonresolver.py index 2272277522..a1d3ad3de6 100644 --- a/tests/ui/acq_invoices/test_acq_invoices_jsonresolver.py +++ b/tests/ui/acq_invoices/test_acq_invoices_jsonresolver.py @@ -33,11 +33,11 @@ def test_acq_invoices_jsonresolver(acq_invoice_fiction_martigny): # deleted record acq_invoice_fiction_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'acq_invoice': {'$ref': 'https://bib.rero.ch/api/acq_invoices/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/acq_order_lines/test_acq_order_lines_jsonresolver.py b/tests/ui/acq_order_lines/test_acq_order_lines_jsonresolver.py index 64cde10dbd..33d78db057 100644 --- a/tests/ui/acq_order_lines/test_acq_order_lines_jsonresolver.py +++ b/tests/ui/acq_order_lines/test_acq_order_lines_jsonresolver.py @@ -36,7 +36,7 @@ def test_acq_order_lines_jsonresolver( # deleted record acq_order_line_fiction_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ @@ -45,4 +45,4 @@ def test_acq_order_lines_jsonresolver( } }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/acq_orders/test_acq_orders_jsonresolver.py b/tests/ui/acq_orders/test_acq_orders_jsonresolver.py index 896a8573f7..95951030ab 100644 --- a/tests/ui/acq_orders/test_acq_orders_jsonresolver.py +++ b/tests/ui/acq_orders/test_acq_orders_jsonresolver.py @@ -33,11 +33,11 @@ def test_acq_orders_jsonresolver(acq_order_fiction_martigny): # deleted record acq_order_fiction_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'acq_order': {'$ref': 'https://bib.rero.ch/api/acq_orders/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/acq_orders/test_acq_orders_mapping.py b/tests/ui/acq_orders/test_acq_orders_mapping.py index 6b346ee2ce..2d6dc393f3 100644 --- a/tests/ui/acq_orders/test_acq_orders_mapping.py +++ b/tests/ui/acq_orders/test_acq_orders_mapping.py @@ -22,7 +22,7 @@ AcqOrdersSearch -def test_acq_orders_es_mapping(es, db, lib_martigny, vendor_martigny, +def test_acq_orders_es_mapping(search, db, lib_martigny, vendor_martigny, acq_order_fiction_martigny_data): """Test acquisition orders elasticsearch mapping.""" search = AcqOrdersSearch() diff --git a/tests/ui/acq_receipt_lines/test_acq_receipt_lines_jsonresolver.py b/tests/ui/acq_receipt_lines/test_acq_receipt_lines_jsonresolver.py index eb1ad7f601..6e8083675d 100644 --- a/tests/ui/acq_receipt_lines/test_acq_receipt_lines_jsonresolver.py +++ b/tests/ui/acq_receipt_lines/test_acq_receipt_lines_jsonresolver.py @@ -33,10 +33,10 @@ def test_acq_receipt_lines_jsonresolver(acq_receipt_line_1_fiction_martigny): # deleted record acq_receipt_line_1_fiction_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record data = {'$ref': 'https://bib.rero.ch/api/acq_receipt_lines/n_e'} rec = Record.create({'acq_receipt_line': data}) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/acq_receipt_lines/test_acq_receipt_lines_mapping.py b/tests/ui/acq_receipt_lines/test_acq_receipt_lines_mapping.py index b2990ec8d6..9c0ab13f65 100644 --- a/tests/ui/acq_receipt_lines/test_acq_receipt_lines_mapping.py +++ b/tests/ui/acq_receipt_lines/test_acq_receipt_lines_mapping.py @@ -23,10 +23,11 @@ AcqReceiptLine, AcqReceiptLinesSearch -def test_acq_receipt_lines_es_mapping(es, db, lib_martigny, vendor_martigny, - acq_receipt_line_1_fiction_martigny, - acq_receipt_line_1_fiction_martigny_data - ): +def test_acq_receipt_lines_es_mapping( + search, db, lib_martigny, vendor_martigny, + acq_receipt_line_1_fiction_martigny, + acq_receipt_line_1_fiction_martigny_data +): """Test acquisition receipt lines elasticsearch mapping.""" search = AcqReceiptLinesSearch() mapping = get_mapping(search.Meta.index) diff --git a/tests/ui/acq_receipts/test_acq_receipts_jsonresolver.py b/tests/ui/acq_receipts/test_acq_receipts_jsonresolver.py index 779beced36..75c1246b59 100644 --- a/tests/ui/acq_receipts/test_acq_receipts_jsonresolver.py +++ b/tests/ui/acq_receipts/test_acq_receipts_jsonresolver.py @@ -33,10 +33,10 @@ def test_acq_receipts_jsonresolver(acq_receipt_fiction_martigny): # deleted record acq_receipt_fiction_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record data = {'$ref': 'https://bib.rero.ch/api/acq_receipts/n_e'} rec = Record.create({'acq_receipt': data}) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/acq_receipts/test_acq_receipts_mapping.py b/tests/ui/acq_receipts/test_acq_receipts_mapping.py index 51879ccc95..dfe1099239 100644 --- a/tests/ui/acq_receipts/test_acq_receipts_mapping.py +++ b/tests/ui/acq_receipts/test_acq_receipts_mapping.py @@ -23,7 +23,7 @@ AcqReceiptsSearch -def test_acq_receipts_es_mapping(es, db, lib_martigny, vendor_martigny, +def test_acq_receipts_es_mapping(search, db, lib_martigny, vendor_martigny, acq_order_fiction_martigny, acq_account_fiction_martigny, acq_receipt_fiction_martigny_data): diff --git a/tests/ui/budgets/test_budgets_jsonresolver.py b/tests/ui/budgets/test_budgets_jsonresolver.py index 662487468e..4144d62481 100644 --- a/tests/ui/budgets/test_budgets_jsonresolver.py +++ b/tests/ui/budgets/test_budgets_jsonresolver.py @@ -34,11 +34,11 @@ def test_budgets_jsonresolver(budget_2017_martigny): # deleted record budget_2017_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'budget': {'$ref': 'https://bib.rero.ch/api/budgets/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/budgets/test_budgets_mapping.py b/tests/ui/budgets/test_budgets_mapping.py index f72c57fdc0..a4ebd9acae 100644 --- a/tests/ui/budgets/test_budgets_mapping.py +++ b/tests/ui/budgets/test_budgets_mapping.py @@ -21,7 +21,9 @@ from rero_ils.modules.acquisition.budgets.api import Budget, BudgetsSearch -def test_budgets_es_mapping(es, db, org_martigny, budget_2017_martigny_data): +def test_budgets_es_mapping( + search, db, org_martigny, budget_2017_martigny_data +): """Test acquisition budget elasticsearch mapping.""" search = BudgetsSearch() mapping = get_mapping(search.Meta.index) diff --git a/tests/ui/collections/test_collections_mapping.py b/tests/ui/collections/test_collections_mapping.py index 24e1bf6fef..98a959ca29 100644 --- a/tests/ui/collections/test_collections_mapping.py +++ b/tests/ui/collections/test_collections_mapping.py @@ -21,7 +21,7 @@ from rero_ils.modules.collections.api import Collection, CollectionsSearch -def test_collections_es_mapping(es, db, org_martigny, coll_martigny_1_data, +def test_collections_es_mapping(search, db, org_martigny, coll_martigny_1_data, item_lib_martigny, item2_lib_martigny): """Test collections elasticsearch mapping.""" search = CollectionsSearch() diff --git a/tests/ui/conftest.py b/tests/ui/conftest.py index 91585a0621..67bdaa2bf8 100644 --- a/tests/ui/conftest.py +++ b/tests/ui/conftest.py @@ -17,11 +17,8 @@ """Common pytest fixtures and plugins.""" - -from datetime import datetime - import pytest -from invenio_accounts.ext import hash_password +from flask_security.utils import hash_password from invenio_accounts.models import User from invenio_search import current_search_client @@ -30,20 +27,20 @@ def user_with_profile(db, default_user_password): """Create a simple invenio user with a profile.""" with db.session.begin_nested(): + profile = dict( + birth_date='1990-01-01', + first_name='User', + last_name='With Profile', + city='Nowhere' + ) user = User( email='user_with_profile@test.com', + username='user_with_profile', password=hash_password(default_user_password), - profile={}, + user_profile=profile, active=True, ) db.session.add(user) - profile = user.profile - profile.birth_date = datetime(1990, 1, 1) - profile.first_name = 'User' - profile.last_name = 'With Profile' - profile.city = 'Nowhere' - profile.username = 'user_with_profile' - db.session.merge(user) db.session.commit() user.password_plaintext = default_user_password return user @@ -53,19 +50,19 @@ def user_with_profile(db, default_user_password): def user_without_email(db, default_user_password): """Create a simple invenio user without email.""" with db.session.begin_nested(): + profile = dict( + birth_date='1990-01-01', + first_name='User', + last_name='With Profile', + city='Nowhere' + ) user = User( password=hash_password(default_user_password), - profile={}, + user_profile=profile, + username='user_without_email', active=True, ) db.session.add(user) - profile = user.profile - profile.birth_date = datetime(1990, 1, 1) - profile.first_name = 'User' - profile.last_name = 'With Profile' - profile.city = 'Nowhere' - profile.username = 'user_without_email' - db.session.merge(user) db.session.commit() user.password_plaintext = default_user_password return user diff --git a/tests/ui/documents/test_documents_api.py b/tests/ui/documents/test_documents_api.py index 2ac96c389f..7e119a7ff4 100644 --- a/tests/ui/documents/test_documents_api.py +++ b/tests/ui/documents/test_documents_api.py @@ -355,6 +355,11 @@ def test_document_indexing(document, export_document): ] assert record.partOf[0].document.title == parent_titles.pop() + # check updated created should exists + record = next(s.source(['_updated', '_created']).scan()) + assert record._updated + assert record._created + # restore initial data document['title'].pop(-1) document['title'][0]['mainTitle'][1]['value'] = orig_title diff --git a/tests/ui/documents/test_documents_jsonresolver.py b/tests/ui/documents/test_documents_jsonresolver.py index 330320d714..b8b28a8a83 100644 --- a/tests/ui/documents/test_documents_jsonresolver.py +++ b/tests/ui/documents/test_documents_jsonresolver.py @@ -32,11 +32,11 @@ def test_documents_jsonresolver(document): # deleted record document.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'document': {'$ref': 'https://bib.rero.ch/api/documents/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/documents/test_documents_mapping.py b/tests/ui/documents/test_documents_mapping.py index 9f9bb5ebc0..e5ad3c458c 100644 --- a/tests/ui/documents/test_documents_mapping.py +++ b/tests/ui/documents/test_documents_mapping.py @@ -27,9 +27,11 @@ @mock.patch('requests.Session.get') -def test_document_es_mapping(mock_contributions_mef_get, es, db, org_martigny, - document_data_ref, item_lib_martigny, - entity_person_response_data): +def test_document_es_mapping( + mock_contributions_mef_get, search, db, org_martigny, + document_data_ref, item_lib_martigny, + entity_person_response_data +): """Test document elasticsearch mapping.""" search = DocumentsSearch() mapping = get_mapping(search.Meta.index) diff --git a/tests/ui/entities/local_entities/test_local_entities_jsonresolver.py b/tests/ui/entities/local_entities/test_local_entities_jsonresolver.py index f233f37f61..2e272d16e4 100644 --- a/tests/ui/entities/local_entities/test_local_entities_jsonresolver.py +++ b/tests/ui/entities/local_entities/test_local_entities_jsonresolver.py @@ -37,11 +37,11 @@ def test_local_entities_jsonresolver(local_entity_person2): # deleted record local_entity_person2.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'local_entity': {'$ref': 'https://bib.rero.ch/api/local_entities/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/holdings/test_holdings_api.py b/tests/ui/holdings/test_holdings_api.py index 0e136928c4..0ddb8bc724 100644 --- a/tests/ui/holdings/test_holdings_api.py +++ b/tests/ui/holdings/test_holdings_api.py @@ -32,7 +32,7 @@ delete_standard_holdings_having_no_items -def test_holding_create(db, es, document, org_martigny, +def test_holding_create(db, search, document, org_martigny, loc_public_martigny, item_type_standard_martigny, holding_lib_martigny_data): """Test holding creation.""" diff --git a/tests/ui/holdings/test_holdings_jsonresolver.py b/tests/ui/holdings/test_holdings_jsonresolver.py index 42b987e608..10fc5fa885 100644 --- a/tests/ui/holdings/test_holdings_jsonresolver.py +++ b/tests/ui/holdings/test_holdings_jsonresolver.py @@ -35,11 +35,11 @@ def test_holdings_jsonresolver(holding_lib_martigny): # deleted record holding_lib_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'holding': {'$ref': 'https://bib.rero.ch/api/holdings/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/holdings/test_holdings_mapping.py b/tests/ui/holdings/test_holdings_mapping.py index 8ca1852727..7267013358 100644 --- a/tests/ui/holdings/test_holdings_mapping.py +++ b/tests/ui/holdings/test_holdings_mapping.py @@ -21,7 +21,7 @@ from rero_ils.modules.holdings.api import Holding, HoldingsSearch -def test_holding_es_mapping(es, db, loc_public_martigny, +def test_holding_es_mapping(search, db, loc_public_martigny, item_type_standard_martigny, document, holding_lib_martigny_data): """Test holding elasticsearch mapping.""" diff --git a/tests/ui/ill_requests/test_ill_requests_jsonresolver.py b/tests/ui/ill_requests/test_ill_requests_jsonresolver.py index 23e5e9f20d..352286fed8 100644 --- a/tests/ui/ill_requests/test_ill_requests_jsonresolver.py +++ b/tests/ui/ill_requests/test_ill_requests_jsonresolver.py @@ -34,11 +34,11 @@ def test_ill_requests_jsonresolver(ill_request_martigny): # deleted record ill_request_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'ill_request': {'$ref': 'https://bib.rero.ch/api/ill_requests/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/item_types/test_item_types_jsonresolver.py b/tests/ui/item_types/test_item_types_jsonresolver.py index eea297df5d..93c0435106 100644 --- a/tests/ui/item_types/test_item_types_jsonresolver.py +++ b/tests/ui/item_types/test_item_types_jsonresolver.py @@ -34,11 +34,11 @@ def test_item_types_jsonresolver(item_type_standard_martigny): # deleted record item_type_standard_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'item_type': {'$ref': 'https://bib.rero.ch/api/item_types/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/item_types/test_item_types_mapping.py b/tests/ui/item_types/test_item_types_mapping.py index 1f2d54e2f4..6f6e95075f 100644 --- a/tests/ui/item_types/test_item_types_mapping.py +++ b/tests/ui/item_types/test_item_types_mapping.py @@ -24,7 +24,7 @@ from rero_ils.modules.item_types.api import ItemType, ItemTypesSearch -def test_item_type_es_mapping(es, db, org_martigny, item_type_data_tmp): +def test_item_type_es_mapping(search, db, org_martigny, item_type_data_tmp): """Test item type elasticsearch mapping.""" search = ItemTypesSearch() mapping = get_mapping(search.Meta.index) diff --git a/tests/ui/items/test_items_jsonresolver.py b/tests/ui/items/test_items_jsonresolver.py index 85632c7730..ee1531c0af 100644 --- a/tests/ui/items/test_items_jsonresolver.py +++ b/tests/ui/items/test_items_jsonresolver.py @@ -32,11 +32,11 @@ def test_items_jsonresolver(item_lib_martigny): # deleted record item_lib_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'item': {'$ref': 'https://bib.rero.ch/api/items/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/libraries/test_libraries_jsonresolver.py b/tests/ui/libraries/test_libraries_jsonresolver.py index dc30c6c481..b3aa884433 100644 --- a/tests/ui/libraries/test_libraries_jsonresolver.py +++ b/tests/ui/libraries/test_libraries_jsonresolver.py @@ -33,11 +33,11 @@ def test_libraries_jsonresolver(lib_martigny): # deleted record library.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'library': {'$ref': 'https://bib.rero.ch/api/libraries/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/libraries/test_libraries_mapping.py b/tests/ui/libraries/test_libraries_mapping.py index 0c064fd4f5..1ecaac7146 100644 --- a/tests/ui/libraries/test_libraries_mapping.py +++ b/tests/ui/libraries/test_libraries_mapping.py @@ -22,7 +22,7 @@ from rero_ils.modules.libraries.api import LibrariesSearch, Library -def test_library_es_mapping(es, db, lib_martigny_data, org_martigny): +def test_library_es_mapping(search, db, lib_martigny_data, org_martigny): """Test library elasticsearch mapping.""" search = LibrariesSearch() mapping = get_mapping(search.Meta.index) diff --git a/tests/ui/loans/test_loans_jsonresolver.py b/tests/ui/loans/test_loans_jsonresolver.py index 16c715e22e..8cb45f2631 100644 --- a/tests/ui/loans/test_loans_jsonresolver.py +++ b/tests/ui/loans/test_loans_jsonresolver.py @@ -32,11 +32,11 @@ def test_loans_jsonresolver(loan_pending_martigny): # deleted record loan_pending_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'loan': {'$ref': 'https://bib.rero.ch/api/loans/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/local_fields/test_local_fields_jsonresolver.py b/tests/ui/local_fields/test_local_fields_jsonresolver.py index 71f7f374f5..bda88b0eb3 100644 --- a/tests/ui/local_fields/test_local_fields_jsonresolver.py +++ b/tests/ui/local_fields/test_local_fields_jsonresolver.py @@ -35,11 +35,11 @@ def test_local_field_jsonresolver(local_field_martigny): # deleted record local_field.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'local_fields': {'$ref': 'https://bib.rero.ch/api/local_fields/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/locations/test_locations_jsonresolver.py b/tests/ui/locations/test_locations_jsonresolver.py index 3b7fd72916..f38c76f9ac 100644 --- a/tests/ui/locations/test_locations_jsonresolver.py +++ b/tests/ui/locations/test_locations_jsonresolver.py @@ -32,11 +32,11 @@ def test_locations_jsonresolver(loc_public_martigny): # deleted record loc_public_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'location': {'$ref': 'https://bib.rero.ch/api/locations/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/locations/test_locations_mapping.py b/tests/ui/locations/test_locations_mapping.py index c459f36132..efa5b00eb9 100644 --- a/tests/ui/locations/test_locations_mapping.py +++ b/tests/ui/locations/test_locations_mapping.py @@ -22,7 +22,7 @@ from rero_ils.modules.locations.api import Location, LocationsSearch -def test_location_es_mapping(es, db, loc_public_martigny_data, +def test_location_es_mapping(search, db, loc_public_martigny_data, lib_martigny, org_martigny): """Test library elasticsearch mapping.""" search = LocationsSearch() diff --git a/tests/ui/organisations/test_organisations_jsonresolver.py b/tests/ui/organisations/test_organisations_jsonresolver.py index c3b9e8f0f0..6bbb5c62fc 100644 --- a/tests/ui/organisations/test_organisations_jsonresolver.py +++ b/tests/ui/organisations/test_organisations_jsonresolver.py @@ -34,11 +34,11 @@ def test_organisations_jsonresolver(app, organisation_temp): # deleted record organisation_temp.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'organisation': {'$ref': 'https://bib.rero.ch/api/organisations/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/patron_transaction_events/test_patron_transaction_events_jsonresolver.py b/tests/ui/patron_transaction_events/test_patron_transaction_events_jsonresolver.py index 91b25d45ff..036b14b33f 100644 --- a/tests/ui/patron_transaction_events/test_patron_transaction_events_jsonresolver.py +++ b/tests/ui/patron_transaction_events/test_patron_transaction_events_jsonresolver.py @@ -38,7 +38,7 @@ def test_patron_transaction_event_jsonresolver( # deleted record patron_transaction_overdue_event_saxon.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create( @@ -48,4 +48,4 @@ def test_patron_transaction_event_jsonresolver( 'https://bib.rero.ch/api/patron_transaction_events/n_e'}} ) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/patron_transactions/test_patron_transactions_jsonresolver.py b/tests/ui/patron_transactions/test_patron_transactions_jsonresolver.py index 48bb19c90d..7be124de9b 100644 --- a/tests/ui/patron_transactions/test_patron_transactions_jsonresolver.py +++ b/tests/ui/patron_transactions/test_patron_transactions_jsonresolver.py @@ -40,7 +40,7 @@ def test_patron_transaction_jsonresolver(patron_transaction_overdue_martigny): # deleted record patron_transaction_overdue_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create( @@ -49,4 +49,4 @@ def test_patron_transaction_jsonresolver(patron_transaction_overdue_martigny): '$ref': 'https://bib.rero.ch/api/patron_transactions/n_e'}} ) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/patron_types/test_patron_types_jsonresolver.py b/tests/ui/patron_types/test_patron_types_jsonresolver.py index b2d61df6a3..95b26c9fbe 100644 --- a/tests/ui/patron_types/test_patron_types_jsonresolver.py +++ b/tests/ui/patron_types/test_patron_types_jsonresolver.py @@ -34,11 +34,11 @@ def test_patron_types_jsonresolver(app, patron_type_tmp): # deleted record patron_type_tmp.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'patron_type': {'$ref': 'https://bib.rero.ch/api/patron_types/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/patrons/test_patrons_api.py b/tests/ui/patrons/test_patrons_api.py index d699be295f..dac76d5134 100644 --- a/tests/ui/patrons/test_patrons_api.py +++ b/tests/ui/patrons/test_patrons_api.py @@ -28,8 +28,8 @@ from rero_ils.modules.patrons.api import Patron, PatronsSearch, \ patron_id_fetcher from rero_ils.modules.patrons.models import CommunicationChannel +from rero_ils.modules.patrons.utils import create_user_from_data from rero_ils.modules.users.models import UserRole -from rero_ils.utils import create_user_from_data def test_patron_extended_validation(app, patron_martigny, @@ -157,9 +157,10 @@ def test_patron_create(app, roles, lib_martigny, librarian_martigny_data_tmp, user = User.query.filter_by(id=ptrn.get('user_id')).first() assert user and user.active for field in ['first_name', 'last_name', 'street', 'postal_code', 'city', - 'username', 'home_phone']: - assert getattr(user.profile, field) == l_martigny_data_tmp.get(field) - assert user.profile.birth_date.strftime('%Y-%m-%d') == \ + 'home_phone']: + assert user.user_profile.get(field) == l_martigny_data_tmp.get(field) + assert user.username == l_martigny_data_tmp.get('username') + assert user.user_profile.get('birth_date') == \ l_martigny_data_tmp.get('birth_date') user_roles = [r.name for r in user.roles] assert set(user_roles) == set(ptrn.get('roles')) @@ -237,6 +238,8 @@ def test_patron_create_without_email(app, roles, patron_type_children_martigny, patron_martigny_data_tmp = \ create_user_from_data(patron_martigny_data_tmp) + from rero_ils.modules.users.api import User + patron_martigny_data_tmp = User.remove_fields(patron_martigny_data_tmp) # communication channel require at least one email patron_martigny_data_tmp['patron']['communication_channel'] = 'email' diff --git a/tests/ui/patrons/test_patrons_jsonresolver.py b/tests/ui/patrons/test_patrons_jsonresolver.py index 26bf172f12..f25afe4e9d 100644 --- a/tests/ui/patrons/test_patrons_jsonresolver.py +++ b/tests/ui/patrons/test_patrons_jsonresolver.py @@ -34,11 +34,11 @@ def test_patrons_jsonresolver(system_librarian_martigny): # deleted record system_librarian_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'patron': {'$ref': 'https://bib.rero.ch/api/patrons/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/patrons/test_patrons_mapping.py b/tests/ui/patrons/test_patrons_mapping.py index ed50849bb8..ac438f3d24 100644 --- a/tests/ui/patrons/test_patrons_mapping.py +++ b/tests/ui/patrons/test_patrons_mapping.py @@ -23,7 +23,7 @@ def test_patron_es_mapping( - roles, es, lib_martigny, librarian_martigny_data_tmp): + roles, search, lib_martigny, librarian_martigny_data_tmp): """Test patron elasticsearch mapping.""" search = PatronsSearch() mapping = get_mapping(search.Meta.index) diff --git a/tests/ui/stats/test_stats_report_n_patrons.py b/tests/ui/stats/test_stats_report_n_patrons.py index 96a574d379..c8b8cb9df1 100644 --- a/tests/ui/stats/test_stats_report_n_patrons.py +++ b/tests/ui/stats/test_stats_report_n_patrons.py @@ -55,7 +55,7 @@ def patch_creation_date(patron, date): } assert StatsReport(cfg).collect() == [[0]] - from rero_ils.modules.patrons.api import create_patron_from_data + from rero_ils.modules.patrons.utils import create_patron_from_data patron_martigny = create_patron_from_data( data={k: v for k, v in patron_martigny_data.items() if k != 'pid'}, diff --git a/tests/ui/stats_cfg/test_stats_cfg_jsonresolver.py b/tests/ui/stats_cfg/test_stats_cfg_jsonresolver.py index 1b078434e8..2e4fa4c324 100644 --- a/tests/ui/stats_cfg/test_stats_cfg_jsonresolver.py +++ b/tests/ui/stats_cfg/test_stats_cfg_jsonresolver.py @@ -34,11 +34,11 @@ def test_stats_cfg_jsonresolver(stats_cfg_martigny): # deleted record stats_cfg_martigny.delete() with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ 'stats_cfg': {'$ref': 'https://bib.rero.ch/api/stats_cfg/n_e'} }) with pytest.raises(JsonRefError): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() diff --git a/tests/ui/templates/test_templates_api.py b/tests/ui/templates/test_templates_api.py index 474af24970..c118af7ba8 100644 --- a/tests/ui/templates/test_templates_api.py +++ b/tests/ui/templates/test_templates_api.py @@ -27,7 +27,7 @@ from rero_ils.modules.utils import get_ref_for_pid -def test_template_create(db, es, templ_doc_public_martigny_data, +def test_template_create(db, search, templ_doc_public_martigny_data, org_martigny, system_librarian_martigny): """Test template creation.""" templ_doc_public_martigny_data['toto'] = 'toto' diff --git a/tests/ui/templates/test_templates_mapping.py b/tests/ui/templates/test_templates_mapping.py index ca979ec6b3..aee9699473 100644 --- a/tests/ui/templates/test_templates_mapping.py +++ b/tests/ui/templates/test_templates_mapping.py @@ -22,7 +22,7 @@ from rero_ils.modules.templates.api import Template, TemplatesSearch -def test_template_es_mapping(es, db, templ_doc_public_martigny_data, +def test_template_es_mapping(search, db, templ_doc_public_martigny_data, org_martigny, system_librarian_martigny, librarian_martigny): """Test template elasticsearch mapping.""" diff --git a/tests/ui/test_indexer_utils.py b/tests/ui/test_indexer_utils.py index adcf30fe30..72c69e9958 100644 --- a/tests/ui/test_indexer_utils.py +++ b/tests/ui/test_indexer_utils.py @@ -59,23 +59,23 @@ def test_record_to_index(app): assert record_to_index({ '$schema': 'https://bib.rero.ch/schemas/' 'documents/document-v0.0.1.json' - }) == ('documents-document-v0.0.1', '_doc') + }) == 'documents-document-v0.0.1' assert record_to_index({ '$schema': 'https://bib.rero.ch/schemas/' 'documents/document-v0.0.1.json' - }) == ('documents-document-v0.0.1', '_doc') + }) == 'documents-document-v0.0.1' # for mef-mef-contributions assert record_to_index({ '$schema': 'https://mef.rero.ch/schemas/' 'mef/mef-contribution-v0.0.1.json' - }) == ('remote_entities-remote_entity-v0.0.1', '_doc') + }) == 'remote_entities-remote_entity-v0.0.1' # for others assert record_to_index({ '$schema': 'https://bib.rero.ch/schemas/' 'organisations/organisation-v0.0.1.json' - }) == ('organisations-organisation-v0.0.1', '_doc') + }) == 'organisations-organisation-v0.0.1' def test_get_resource_from_ES(document): diff --git a/tests/ui/users/test_forms.py b/tests/ui/users/test_forms.py index d06c980b9d..46919d41f2 100644 --- a/tests/ui/users/test_forms.py +++ b/tests/ui/users/test_forms.py @@ -97,7 +97,7 @@ def test_register_form(client, app): } res = client.post(url_for('security.register'), data=form_data) assert res.status_code == 302 - assert res.location == 'http://localhost/' + assert res.location == '/' form_data = { 'email': 'foo@bar.com', @@ -106,11 +106,12 @@ def test_register_form(client, app): } res = client.post(url_for('security.register'), data=form_data) assert res.status_code == 302 - assert res.location == 'http://localhost/' + assert res.location == '/' @mock.patch('flask_security.views.reset_password_token_status', - mock.MagicMock(return_value=[False, False, {}])) + mock.MagicMock( + return_value=[False, False, {'email': 'foo@foo.com'}])) @mock.patch('flask_security.views.update_password', mock.MagicMock()) def test_reset_password_form(client, app): diff --git a/tests/ui/users/test_schema.py b/tests/ui/users/test_schema.py new file mode 100644 index 0000000000..c966e5ccb1 --- /dev/null +++ b/tests/ui/users/test_schema.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# RERO ILS +# Copyright (C) 2023 RERO +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +"""Tests Schema for users.""" +import pytest +from invenio_accounts.models import User + + +def test_custom_schema(app): + """Test register form.""" + user = User(email="admin@inveniosoftware.org") + user.user_profile = { + "first_name": "Louis", + "last_name": "Roduit", + "gender": "male", + "birth_date": "1947-06-07", + "street": "Avenue Leopold-Robert, 13", + "postal_code": "1920", + "city": "Martigny", + "country": "sz", + "home_phone": "+41324993156", + "business_phone": "+41324993156", + "mobile_phone": "+41324993156", + "other_phone": "+41324993156", + } + assert user + with pytest.raises(ValueError): + user.user_profile = { + "username": "admin", + } diff --git a/tests/ui/vendors/test_vendors_jsonresolver.py b/tests/ui/vendors/test_vendors_jsonresolver.py index 5731c6aea4..8e327636db 100644 --- a/tests/ui/vendors/test_vendors_jsonresolver.py +++ b/tests/ui/vendors/test_vendors_jsonresolver.py @@ -34,7 +34,7 @@ def test_vendors_jsonresolver(app, vendor_martigny): # deleted record vendor_martigny.delete() with pytest.raises(Exception): - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() # non existing record rec = Record.create({ @@ -42,5 +42,5 @@ def test_vendors_jsonresolver(app, vendor_martigny): }) with pytest.raises(JsonRefError) as error: - rec.replace_refs().dumps() + type(rec)(rec.replace_refs()).dumps() assert 'PIDDoesNotExistError' in str(error) diff --git a/tests/ui/vendors/test_vendors_mapping.py b/tests/ui/vendors/test_vendors_mapping.py index 8268bd967a..94f564e21f 100644 --- a/tests/ui/vendors/test_vendors_mapping.py +++ b/tests/ui/vendors/test_vendors_mapping.py @@ -21,7 +21,7 @@ from rero_ils.modules.vendors.api import Vendor, VendorsSearch -def test_budgets_es_mapping(es, db, org_martigny, vendor_martigny_data): +def test_budgets_es_mapping(search, db, org_martigny, vendor_martigny_data): """Test vendors elasticsearch mapping.""" search = VendorsSearch() mapping = get_mapping(search.Meta.index) diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index fc3cb5c2fb..de6923bc0f 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -38,169 +38,169 @@ def create_app(): @pytest.fixture() -def circ_policy_schema(monkeypatch): +def circ_policy_schema(): """Circ policy Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.circ_policies.jsonschemas', 'circ_policies/circ_policy-v0.0.1.json', ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def template_schema(monkeypatch): +def template_schema(): """Template Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.templates.jsonschemas', 'templates/template-v0.0.1.json', ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def notification_schema(monkeypatch): +def notification_schema(): """Notifications Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.notifications.jsonschemas', '/notifications/notification-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def item_type_schema(monkeypatch): +def item_type_schema(): """Item type Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.item_types.jsonschemas', '/item_types/item_type-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def acq_account_schema(monkeypatch): +def acq_account_schema(): """Acq account Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.acquisition.acq_accounts.jsonschemas', '/acq_accounts/acq_account-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def acq_order_schema(monkeypatch): +def acq_order_schema(): """Acq order Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.acquisition.acq_orders.jsonschemas', '/acq_orders/acq_order-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def acq_order_line_schema(monkeypatch): +def acq_order_line_schema(): """Acq order line Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.acquisition.acq_order_lines.jsonschemas', '/acq_order_lines/acq_order_line-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def acq_receipt_line_schema(monkeypatch): +def acq_receipt_line_schema(): """Acq receipt line Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.acquisition.acq_receipt_lines.jsonschemas', '/acq_receipt_lines/acq_receipt_line-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def budget_schema(monkeypatch): +def budget_schema(): """Budget Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.acquisition.budgets.jsonschemas', '/budgets/budget-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def library_schema(monkeypatch): +def library_schema(): """Library Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.libraries.jsonschemas', 'libraries/library-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def local_fields_schema(monkeypatch): +def local_fields_schema(): """Local fields Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.local_fields.jsonschemas', 'local_fields/local_field-v0.0.1.json') - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def location_schema(monkeypatch): +def location_schema(): """Location Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.locations.jsonschemas', 'locations/location-v0.0.1.json') - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def patron_transaction_schema(monkeypatch): +def patron_transaction_schema(): """Patron transaction Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.patron_transactions.jsonschemas', 'patron_transactions/patron_transaction-v0.0.1.json') - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def patron_transaction_event_schema(monkeypatch): +def patron_transaction_event_schema(): """Patron transaction event Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.patron_transaction_events.jsonschemas', 'patron_transaction_events/patron_transaction_event-v0.0.1.json') - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def organisation_schema(monkeypatch): +def organisation_schema(): """Organisation Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.organisations.jsonschemas', 'organisations/organisation-v0.0.1.json', ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def patron_type_schema(monkeypatch): +def patron_type_schema(): """Patron type Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.patron_types.jsonschemas', '/patron_types/patron_type-v0.0.1.json', ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def patron_schema(monkeypatch): +def patron_schema(): """Patron Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.patrons.jsonschemas', '/patrons/patron-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture(scope="function") @@ -213,90 +213,90 @@ def patron_martigny_data_tmp_with_id(patron_martigny_data_tmp): @pytest.fixture() -def remote_entities_schema(monkeypatch): +def remote_entities_schema(): """Remote entity Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.entities.remote_entities.jsonschemas', '/remote_entities/remote_entity-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def local_entities_schema(monkeypatch): +def local_entities_schema(): """Local entity Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.entities.local_entities.jsonschemas', '/local_entities/local_entity-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def document_schema(monkeypatch): +def document_schema(): """Jsonschema for documents.""" schema_in_bytes = resource_string( 'rero_ils.modules.documents.jsonschemas', 'documents/document-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def item_schema(monkeypatch): +def item_schema(): """Item Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.items.jsonschemas', 'items/item-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def user_schema(monkeypatch): +def user_schema(): """User Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.users.jsonschemas', 'users/user-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def holding_schema(monkeypatch): +def holding_schema(): """Holdings Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.holdings.jsonschemas', '/holdings/holding-v0.0.1.json') - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def ill_request_schema(monkeypatch): +def ill_request_schema(): """ILL requests JSONSchema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.ill_requests.jsonschemas', '/ill_requests/ill_request-v0.0.1.json') - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def operation_log_schema(monkeypatch): +def operation_log_schema(): """Operation log Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.operation_logs.jsonschemas', 'operation_logs/operation_log-v0.0.1.json' ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() -def vendors_schema(monkeypatch): +def vendors_schema(): """Local fields Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.vendors.jsonschemas', 'vendors/vendor-v0.0.1.json') - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) @pytest.fixture() @@ -564,10 +564,10 @@ def mef_record_with_idref_gnd_rero(mef_record_with_idref_gnd_rero_data): @pytest.fixture() -def stats_cfg_schema(monkeypatch): +def stats_cfg_schema(): """Template Jsonschema for records.""" schema_in_bytes = resource_string( 'rero_ils.modules.stats_cfg.jsonschemas', 'stats_cfg/stat_cfg-v0.0.1.json', ) - return get_schema(monkeypatch, schema_in_bytes) + return get_schema(schema_in_bytes) diff --git a/tests/unit/documents/test_documents_dojson.py b/tests/unit/documents/test_documents_dojson.py index 0ec5d82d4a..a1d9c41dc3 100644 --- a/tests/unit/documents/test_documents_dojson.py +++ b/tests/unit/documents/test_documents_dojson.py @@ -5448,7 +5448,7 @@ def test_marc21_to_identified_by_from_035(): @mock.patch('requests.Session.get') -def test_marc21_to_electronicLocator_from_856(mock_cover_get): +def test_marc21_to_electronicLocator_from_856(mock_cover_get, app): """Test dojson electronicLocator from 856.""" marc21xml = """ @@ -5475,7 +5475,7 @@ def test_marc21_to_electronicLocator_from_856(mock_cover_get): { 'url': 'http://reader.digitale-s.de/r/d/XXX.html', 'type': 'versionOfResource', - 'content': 'fullText', + 'content': 'full text', 'public_note': 'Vol. 1' } ] @@ -5597,7 +5597,7 @@ def test_marc21_to_identified_by_from_930(): @mock.patch('requests.Session.get') -def test_get_mef_link(mock_get, capsys): +def test_get_mef_link(mock_get, capsys, app): """Test get mef contribution link""" mock_get.return_value = mock_response(json_data={ diff --git a/tests/unit/documents/test_documents_dojson_dc.py b/tests/unit/documents/test_documents_dojson_dc.py index 8189e3fef1..fc0990f4f7 100644 --- a/tests/unit/documents/test_documents_dojson_dc.py +++ b/tests/unit/documents/test_documents_dojson_dc.py @@ -19,7 +19,7 @@ from __future__ import absolute_import, print_function -from flask_babelex import gettext as _ +from flask_babel import gettext as _ from rero_ils.modules.documents.dojson.contrib.jsontodc import dublincore diff --git a/tests/unit/test_patrons_jsonschema.py b/tests/unit/test_patrons_jsonschema.py index 076ac9c535..dfad8ea750 100644 --- a/tests/unit/test_patrons_jsonschema.py +++ b/tests/unit/test_patrons_jsonschema.py @@ -121,14 +121,14 @@ def test_additional_email(app, patron_martigny): user = patron_martigny.user original_user_email = user.email - user.email = None + user._email = None patron_martigny['patron']['communication_channel'] = 'email' with pytest.raises(ValidationError) as e: Patron.validate(patron_martigny) assert 'At least one email should be defined for an email ' \ 'communication channel' in str(e) - user.email = original_user_email + user._email = original_user_email def test_phone(patron_schema, patron_martigny_data_tmp_with_id): diff --git a/tests/unit/test_users_jsonschema.py b/tests/unit/test_users_jsonschema.py index 9ce0f7745b..bbded3746d 100644 --- a/tests/unit/test_users_jsonschema.py +++ b/tests/unit/test_users_jsonschema.py @@ -40,7 +40,6 @@ def test_user_all_jsonschema_keys_values( {'key': 'last_name', 'value': 25}, {'key': 'birth_date', 'value': 25}, {'key': 'gender', 'value': 25}, - {'key': 'username', 'value': 25}, {'key': 'street', 'value': 25}, {'key': 'postal_code', 'value': 25}, {'key': 'city', 'value': 25}, diff --git a/tests/utils.py b/tests/utils.py index 85118349f2..c4d962c935 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -22,7 +22,6 @@ from datetime import datetime, timedelta, timezone import jsonref -import requests import xmltodict from flask import url_for from invenio_accounts.testutils import login_user_via_session, \ @@ -49,8 +48,8 @@ from rero_ils.modules.locations.api import Location from rero_ils.modules.organisations.api import Organisation from rero_ils.modules.patron_types.api import PatronType -from rero_ils.modules.patrons.api import Patron, PatronsSearch, \ - create_patron_from_data +from rero_ils.modules.patrons.api import Patron, PatronsSearch +from rero_ils.modules.patrons.utils import create_patron_from_data from rero_ils.modules.selfcheck.models import SelfcheckTerminal @@ -246,27 +245,9 @@ def check_timezone_date(timezone, date, expected=None): assert tocheck_date.hour == hour, error_msg -def mocked_requests_get(*args, **kwargs): +def jsonloader(uri, **kwargs): """This method will be used by the mock to replace requests.get.""" - class MockResponse: - """Mock response class. - - This class will get a json schema directly from the source file. - Examples: - https://bib.rero.ch/schemas/documents/document-v0.0.1.json -> - rero_ils.modules.documents.jsonschemas.document-v0.0.1.json - https://bib.rero.ch/schemas/common/languages-v0.0.1.json -> - rero_ils.jsonschemas.common.languages-v0.0.1.json - """ - - def __init__(self, json_data, status_code): - self.json_data = json_data - self.status_code = status_code - - def json(self): - return self.json_data - - ref_split = args[0].split('/') + ref_split = uri.split('/') # TODO: find a better way to determine name and path. if ref_split[-2] == 'common': path = 'rero_ils.jsonschemas' @@ -288,32 +269,25 @@ def json(self): ) schema_in_bytes = resource_string(path, name) - if not schema_in_bytes: - return MockResponse({}, 404) schema = json.loads(schema_in_bytes.decode('utf8')) - if not schema: - return MockResponse({}, 404) - return MockResponse(schema, 200) + return schema -def get_schema(monkeypatch, schema_in_bytes): +def get_schema(schema_in_bytes): """Get json schema and replace $refs. For the resolving of the $ref we have to catch the request.get and get the referenced json schema directly from the resource. - :param monkeypatch: https://docs.pytest.org/en/stable/monkeypatch.html :schema_in_bytes: schema in bytes. :returns: resolved json schema. """ - # apply the monkeypatch for requests.get to mocked_requests_get - monkeypatch.setattr(requests, "get", mocked_requests_get) - schema = jsonref.loads(schema_in_bytes.decode('utf8')) + schema = jsonref.loads(schema_in_bytes.decode('utf8'), loader=jsonloader) # Replace all remaining $refs - while schema != jsonref.loads(jsonref.dumps(schema)): - schema = jsonref.loads(jsonref.dumps(schema)) + while schema != jsonref.loads(jsonref.dumps(schema), loader=jsonloader): + schema = jsonref.loads(jsonref.dumps(schema), loader=jsonloader) return schema @@ -403,11 +377,7 @@ def create_patron(data): :param data: - A dict containing a mix of user and patron data. :returns: - A freshly created Patron instance. """ - ptrn = create_patron_from_data( - data=data, - delete_pid=False, - dbcommit=True, - reindex=True) + ptrn = create_patron_from_data(data=data) flush_index(PatronsSearch.Meta.index) return ptrn