# SPDX-FileCopyrightText: Fondation RERO+ # SPDX-License-Identifier: AGPL-3.0-or-later # --------------------------------------------------------------------------- # Build system # --------------------------------------------------------------------------- [build-system] requires = ["uv_build<1.0.0"] build-backend = "uv_build" [tool.uv.build-backend] module-root = "." [tool.uv] package = true # --------------------------------------------------------------------------- # Project metadata # --------------------------------------------------------------------------- [project] name = "rero-ils" version = "1.30.1" description = "The elegant solution for heritage, public and school libraries or networks." authors = [{name = "RERO+", email = "software@rero.ch"}] keywords = ["rero-ils", "invenio", "integrated library system"] license = "AGPL-3.0-or-later" urls = {homepage = "https://www.rero.ch/en/products/ils", repository="https://github.com/rero/rero-ils"} requires-python = ">=3.14,<3.15" dependencies = [ ## Third party invenio modules used by RERO ILS "invenio-oaiharvester>=1.0.0a4", "invenio-circulation>=4.0.0", "invenio-search[elasticsearch7]>=3.0.0", # Invenio core modules "invenio-app>=3.0.0", "invenio-base>=2.0.0", "invenio-celery>=2.0.2", "invenio-config>=1.0.3", "invenio-i18n>=3.4.2", "invenio-db[postgresql]>=2.0.0", # Invenio base bundle "invenio-admin>=1.6.0", "invenio-assets>=4.0.0", "invenio-logging[sentry]>=4.0.0", "invenio-mail>=2.0.0", "invenio-rest>=3.0.0", # Invenio auth bundle "invenio-access>=4.0.0", "invenio-accounts>=6.0.0", "invenio-oauth2server>=6.1.0", "invenio-oauthclient>=5.0.0", # Invenio metadata bundle "invenio-indexer>=4.0.0", "invenio-jsonschemas>=2.0.0", "invenio-oaiserver>=4.0.0", "invenio-pidstore>=3.0.0", "invenio-records-rest>=6.0.2", "invenio-records-ui>=2.0.0", "invenio-records>=4.0.0", "invenio-search-ui>=4.0.0", "invenio-records-permissions>=0.13.0", "python-dotenv>=0.13.0", "sentry-sdk", "dojson>=1.4.0", ## RERO specific python modules "rero-invenio-base>=1.3.0", "rero-invenio-files>=1.0.0", "rero-invenio-thumbnails>=2.0.0", "flask-wiki>=4.0.0", ## RERO ILS specific python modules "PyYAML>=5.3.1", "dateparser>=1.1.1", "isbnlib>=3.9.1", "requests>=2.23.0", "polib", "xmltodict", "ciso8601", ## Third party modules used by RERO ILS "lazyreader>=1.0.0", "jinja2>2.11.2", "jsonmerge>=1.8.0", "num2words>=0.5.10", "iso639>=0.1.4", "dcxml>=0.1.2", "DeepDiff>=5.5.0", "jsonresolver", "click>=8.3.3", # needed for elasticsearch 7.13.4 "urllib3<2.0.0", "dnspython>=2.4.2", "babel>=2.16.0", "levenshtein>=0.26.0", "unidecode>=1.3.8", "poethepoet", "sqlalchemy-celery-beat>=0.8.3", "bootstrap-flask>=2.5.0", "flask-admin>=1.6.1", "invenio-sip2>=0.6.25", ] [dependency-groups] dev = [ ## Default from Invenio "pytest-invenio>=3.0.0", "coveralls>=4.0.1", "Flask-Debugtoolbar>=0.10.1", ## RERO ILS specific python packages "freezegun>=1.1.0", "pip-audit>=2.8.0", "ruff>=0.12.8", "pytest-ruff>=0.5", "pytest-playwright>=0.8.0", "playwright>=1.30.0" ] prod = [ "uwsgi>=2.0.30", "uwsgitop>=0.11", ] # --------------------------------------------------------------------------- # Entry points # --------------------------------------------------------------------------- [project.entry-points."app.console_scripts"] rero-ils = "invenio_app.cli:cli" [project.entry-points."babel.extractors"] json = "rero_ils.modules.babel_extractors:extract_json" [project.entry-points."dojson.cli"] head = "rero_ils.dojson.cli:head" reverse = "rero_ils.dojson.cli:reverse" [project.entry-points."dojson.cli.dump"] pjson = "rero_ils.dojson.cli:pretty_json_dump" [project.entry-points."dojson.cli.rule"] marc21_dnb_to_json = "rero_ils.modules.documents.dojson.contrib.marc21tojson:marc21_dnb" marc21_kul_to_json = "rero_ils.modules.documents.dojson.contrib.marc21tojson:marc21_kul" marc21_loc_to_json = "rero_ils.modules.documents.dojson.contrib.marc21tojson:marc21_loc" marc21_rero_to_json = "rero_ils.modules.documents.dojson.contrib.marc21tojson:marc21_rero" marc21_slsp_to_json = "rero_ils.modules.documents.dojson.contrib.marc21tojson:marc21_slsp" marc21_ugent_to_json = "rero_ils.modules.documents.dojson.contrib.marc21tojson:marc21_ugent" unimarc_to_json = "rero_ils.modules.documents.dojson.contrib.unimarctojson:unimarc" [project.entry-points."flask.commands"] reroils = "rero_ils.modules.cli.reroils:reroils" [project.entry-points."invenio_admin.views"] selfcheck_users_accounts = "rero_ils.modules.selfcheck.admin:selfcheck_terminal_adminview" [project.entry-points."invenio_assets.webpack"] reroils_theme = "rero_ils.theme.webpack:theme" [project.entry-points."invenio_base.api_apps"] invenio_i18n = "invenio_i18n:InvenioI18N" rero-ils = "rero_ils.modules.ext:REROILSAPP" [project.entry-points."invenio_base.api_blueprints"] acq_accounts = "rero_ils.modules.acquisition.acq_accounts.views:api_blueprint" acq_orders = "rero_ils.modules.acquisition.acq_orders.views:api_blueprint" acq_receipts = "rero_ils.modules.acquisition.acq_receipts.views:api_blueprint" circ_policies = "rero_ils.modules.circ_policies.views:blueprint" documents = "rero_ils.modules.documents.api_views:api_blueprint" holdings = "rero_ils.modules.holdings.api_views:api_blueprint" imports = "rero_ils.modules.imports.views:api_blueprint" item_types = "rero_ils.modules.item_types.views:blueprint" items = "rero_ils.modules.items.views:api_blueprint" libraries = "rero_ils.modules.libraries.api_views:api_blueprint" loans = "rero_ils.modules.loans.api_views:api_blueprint" local_entities = "rero_ils.modules.entities.local_entities.views:api_blueprint" migration_data = "rero_ils.modules.migrations.data.views:api_blueprint" migrations = "rero_ils.modules.migrations.views:api_blueprint" monitoring = "rero_ils.modules.monitoring.views:api_blueprint" 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" remote_entities = "rero_ils.modules.entities.remote_entities.views:api_blueprint" stats_cfg = "rero_ils.modules.stats_cfg.views:api_blueprint" users = "rero_ils.modules.users.api_views:api_blueprint" [project.entry-points."invenio_base.api_converters"] nooppid = "rero_ils.converters:NoopPIDConverter" [project.entry-points."invenio_base.apps"] rero-ils = "rero_ils.modules.ext:REROILSAPP" [project.entry-points."invenio_base.blueprints"] circ_policies = "rero_ils.modules.circ_policies.views:blueprint" collections = "rero_ils.modules.collections.views:blueprint" documents = "rero_ils.modules.documents.views:blueprint" entities = "rero_ils.modules.entities.views:blueprint" holdings = "rero_ils.modules.holdings.views:blueprint" ill_requests = "rero_ils.modules.ill_requests.views:blueprint" 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" stats = "rero_ils.modules.stats.views:blueprint" templates = "rero_ils.modules.templates.views:blueprint" theme = "rero_ils.theme.views:blueprint" users = "rero_ils.modules.users.views:blueprint" [project.entry-points."invenio_base.finalize_app"] rero_ils = "rero_ils.modules.ext:finalize_app" rero_files = "rero_invenio_files.ext:finalize_app" [project.entry-points."invenio_celery.tasks"] api_harvester = "rero_ils.modules.api_harvester.tasks" api_harvester_memovs = "rero_ils.modules.api_harvester.memovs.tasks" collections = "rero_ils.modules.collections.tasks" documents = "rero_ils.modules.documents.tasks" holdings = "rero_ils.modules.holdings.tasks" indexer_locent = "rero_ils.modules.entities.local_entities.indexer" items = "rero_ils.modules.items.tasks" libraries = "rero_ils.modules.libraries.tasks" loans = "rero_ils.modules.loans.tasks" locations = "rero_ils.modules.locations.tasks" modules = "rero_ils.modules.tasks" notifications = "rero_ils.modules.notifications.tasks" patrons = "rero_ils.modules.patrons.tasks" remote_entities = "rero_ils.modules.entities.remote_entities.tasks" stats = "rero_ils.modules.stats.tasks" [project.entry-points."invenio_config.module"] rero_ils = "rero_ils.config" [project.entry-points."invenio_db.alembic"] rero_ils = "rero_ils:alembic" [project.entry-points."invenio_db.models"] acq_accounts = "rero_ils.modules.acquisition.acq_accounts.models" acq_order_lines = "rero_ils.modules.acquisition.acq_order_lines.models" acq_orders = "rero_ils.modules.acquisition.acq_orders.models" acq_receipt_lines = "rero_ils.modules.acquisition.acq_receipt_lines.models" acq_receipts = "rero_ils.modules.acquisition.acq_receipts.models" api_harvester = "rero_ils.modules.api_harvester.models" budgets = "rero_ils.modules.acquisition.budgets.models" circ_policies = "rero_ils.modules.circ_policies.models" collections = "rero_ils.modules.collections.models" documents = "rero_ils.modules.documents.models" holdings = "rero_ils.modules.holdings.models" ill_requests = "rero_ils.modules.ill_requests.models" item_types = "rero_ils.modules.item_types.models" items = "rero_ils.modules.items.models" libraries = "rero_ils.modules.libraries.models" local_entities = "rero_ils.modules.entities.local_entities.models" local_fields = "rero_ils.modules.local_fields.models" locations = "rero_ils.modules.locations.models" notifications = "rero_ils.modules.notifications.models" organisations = "rero_ils.modules.organisations.models" patron_transaction_events = "rero_ils.modules.patron_transaction_events.models" patron_transactions = "rero_ils.modules.patron_transactions.models" patron_types = "rero_ils.modules.patron_types.models" patrons = "rero_ils.modules.patrons.models" remote_entities = "rero_ils.modules.entities.remote_entities.models" selfcheck = "rero_ils.modules.selfcheck.models" stats = "rero_ils.modules.stats.models" stats_cfg = "rero_ils.modules.stats_cfg.models" templates = "rero_ils.modules.templates.models" vendors = "rero_ils.modules.vendors.models" [project.entry-points."invenio_i18n.translations"] messages = "rero_ils" messages_wiki = "flask_wiki" [project.entry-points."invenio_jsonschemas.schemas"] acq_accounts = "rero_ils.modules.acquisition.acq_accounts.jsonschemas" acq_order_lines = "rero_ils.modules.acquisition.acq_order_lines.jsonschemas" acq_orders = "rero_ils.modules.acquisition.acq_orders.jsonschemas" acq_receipt_lines = "rero_ils.modules.acquisition.acq_receipt_lines.jsonschemas" acq_receipts = "rero_ils.modules.acquisition.acq_receipts.jsonschemas" budgets = "rero_ils.modules.acquisition.budgets.jsonschemas" circ_policies = "rero_ils.modules.circ_policies.jsonschemas" collections = "rero_ils.modules.collections.jsonschemas" common = "rero_ils.jsonschemas" documents = "rero_ils.modules.documents.jsonschemas" files = "rero_ils.modules.files.jsonschemas" holdings = "rero_ils.modules.holdings.jsonschemas" ill_requests = "rero_ils.modules.ill_requests.jsonschemas" item_types = "rero_ils.modules.item_types.jsonschemas" items = "rero_ils.modules.items.jsonschemas" libraries = "rero_ils.modules.libraries.jsonschemas" loans = "rero_ils.modules.loans.jsonschemas" local_entities = "rero_ils.modules.entities.local_entities.jsonschemas" local_fields = "rero_ils.modules.local_fields.jsonschemas" locations = "rero_ils.modules.locations.jsonschemas" notifications = "rero_ils.modules.notifications.jsonschemas" operation_logs = "rero_ils.modules.operation_logs.jsonschemas" organisations = "rero_ils.modules.organisations.jsonschemas" patron_transaction_events = "rero_ils.modules.patron_transaction_events.jsonschemas" patron_transactions = "rero_ils.modules.patron_transactions.jsonschemas" patron_types = "rero_ils.modules.patron_types.jsonschemas" patrons = "rero_ils.modules.patrons.jsonschemas" remote_entities = "rero_ils.modules.entities.remote_entities.jsonschemas" stats = "rero_ils.modules.stats.jsonschemas" stats_cfg = "rero_ils.modules.stats_cfg.jsonschemas" templates = "rero_ils.modules.templates.jsonschemas" users = "rero_ils.modules.users.jsonschemas" vendors = "rero_ils.modules.vendors.jsonschemas" [project.entry-points."invenio_oauth2server.scopes"] fullname = "rero_ils.oauth.scopes:fullname" birthdate = "rero_ils.oauth.scopes:birthdate" expiration_date = "rero_ils.oauth.scopes:expiration_date" institution = "rero_ils.oauth.scopes:institution" patron_type = "rero_ils.oauth.scopes:patron_type" # deprecated scopes patron_types = "rero_ils.oauth.scopes:patron_types" [project.entry-points."invenio_pidstore.fetchers"] acq_account_id = "rero_ils.modules.acquisition.acq_accounts.api:acq_account_id_fetcher" acq_order_id = "rero_ils.modules.acquisition.acq_orders.api:acq_order_id_fetcher" acq_order_line_id = "rero_ils.modules.acquisition.acq_order_lines.api:acq_order_line_id_fetcher" acq_receipt_id = "rero_ils.modules.acquisition.acq_receipts.api:acq_receipt_id_fetcher" acq_receipt_line_id = "rero_ils.modules.acquisition.acq_receipt_lines.api:acq_receipt_line_id_fetcher" budget_id = "rero_ils.modules.acquisition.budgets.api:budget_id_fetcher" circ_policy_id = "rero_ils.modules.circ_policies.api:circ_policy_id_fetcher" collection_id = "rero_ils.modules.collections.api:collection_id_fetcher" document_id = "rero_ils.modules.documents.api:document_id_fetcher" entity_id = "rero_ils.modules.entities.fetchers:id_fetcher" holding_id = "rero_ils.modules.holdings.api:holding_id_fetcher" ill_request_id = "rero_ils.modules.ill_requests.api:ill_request_id_fetcher" item_id = "rero_ils.modules.items.api:item_id_fetcher" item_type_id = "rero_ils.modules.item_types.api:item_type_id_fetcher" library_id = "rero_ils.modules.libraries.api:library_id_fetcher" local_entity_id = "rero_ils.modules.entities.local_entities.api:local_entity_id_fetcher" local_field_id = "rero_ils.modules.local_fields.api:local_field_id_fetcher" location_id = "rero_ils.modules.locations.api:location_id_fetcher" notification_id = "rero_ils.modules.notifications.api:notification_id_fetcher" operation_log_id = "rero_ils.modules.operation_logs.api:operation_log_id_fetcher" organisation_id = "rero_ils.modules.organisations.api:organisation_id_fetcher" patron_id = "rero_ils.modules.patrons.api:patron_id_fetcher" patron_transaction_event_id = "rero_ils.modules.patron_transaction_events.api:patron_transaction_event_id_fetcher" patron_transaction_id = "rero_ils.modules.patron_transactions.api:patron_transaction_id_fetcher" patron_type_id = "rero_ils.modules.patron_types.api:patron_type_id_fetcher" remote_entity_id = "rero_ils.modules.entities.remote_entities.api:remote_entity_id_fetcher" stat_cfg_id = "rero_ils.modules.stats_cfg.api:stat_cfg_id_fetcher" stat_id = "rero_ils.modules.stats.api.api:stat_id_fetcher" template_id = "rero_ils.modules.templates.api:template_id_fetcher" vendor_id = "rero_ils.modules.vendors.api:vendor_id_fetcher" [project.entry-points."invenio_pidstore.minters"] acq_account_id = "rero_ils.modules.acquisition.acq_accounts.api:acq_account_id_minter" acq_order_id = "rero_ils.modules.acquisition.acq_orders.api:acq_order_id_minter" acq_order_line_id = "rero_ils.modules.acquisition.acq_order_lines.api:acq_order_line_id_minter" acq_receipt_id = "rero_ils.modules.acquisition.acq_receipts.api:acq_receipt_id_minter" acq_receipt_line_id = "rero_ils.modules.acquisition.acq_receipt_lines.api:acq_receipt_line_id_minter" budget_id = "rero_ils.modules.acquisition.budgets.api:budget_id_minter" circ_policy_id = "rero_ils.modules.circ_policies.api:circ_policy_id_minter" collection_id = "rero_ils.modules.collections.api:collection_id_minter" document_id = "rero_ils.modules.documents.api:document_id_minter" entity_id = "rero_ils.modules.entities.minters:id_minter" holding_id = "rero_ils.modules.holdings.api:holding_id_minter" ill_request_id = "rero_ils.modules.ill_requests.api:ill_request_id_minter" item_id = "rero_ils.modules.items.api:item_id_minter" item_type_id = "rero_ils.modules.item_types.api:item_type_id_minter" library_id = "rero_ils.modules.libraries.api:library_id_minter" local_entity_id = "rero_ils.modules.entities.local_entities.api:local_entity_id_minter" local_field_id = "rero_ils.modules.local_fields.api:local_field_id_minter" location_id = "rero_ils.modules.locations.api:location_id_minter" notification_id = "rero_ils.modules.notifications.api:notification_id_minter" organisation_id = "rero_ils.modules.organisations.api:organisation_id_minter" patron_id = "rero_ils.modules.patrons.api:patron_id_minter" patron_transaction_event_id = "rero_ils.modules.patron_transaction_events.api:patron_transaction_event_id_minter" patron_transaction_id = "rero_ils.modules.patron_transactions.api:patron_transaction_id_minter" patron_type_id = "rero_ils.modules.patron_types.api:patron_type_id_minter" remote_entity_id = "rero_ils.modules.entities.remote_entities.api:remote_entity_id_minter" stat_cfg_id = "rero_ils.modules.stats_cfg.api:stat_cfg_id_minter" stat_id = "rero_ils.modules.stats.api.api:stat_id_minter" template_id = "rero_ils.modules.templates.api:template_id_minter" vendor_id = "rero_ils.modules.vendors.api:vendor_id_minter" [project.entry-points."invenio_records.jsonresolver"] acq_accounts = "rero_ils.modules.acquisition.acq_accounts.jsonresolver" acq_order_lines = "rero_ils.modules.acquisition.acq_order_lines.jsonresolver" acq_orders = "rero_ils.modules.acquisition.acq_orders.jsonresolver" acq_receipts = "rero_ils.modules.acquisition.acq_receipts.jsonresolver" budgets = "rero_ils.modules.acquisition.budgets.jsonresolver" documents = "rero_ils.modules.documents.jsonresolver" holdings = "rero_ils.modules.holdings.jsonresolver" ill_requests = "rero_ils.modules.ill_requests.jsonresolver" item_types = "rero_ils.modules.item_types.jsonresolver" items = "rero_ils.modules.items.jsonresolver" libraries = "rero_ils.modules.libraries.jsonresolver" loans = "rero_ils.modules.loans.jsonresolver" local_entities = "rero_ils.modules.entities.local_entities.jsonresolver" locations = "rero_ils.modules.locations.jsonresolver" notifications = "rero_ils.modules.notifications.jsonresolver" organisations = "rero_ils.modules.organisations.jsonresolver" patron_transaction_events = "rero_ils.modules.patron_transaction_events.jsonresolver" patron_transactions = "rero_ils.modules.patron_transactions.jsonresolver" patron_types = "rero_ils.modules.patron_types.jsonresolver" patrons = "rero_ils.modules.patrons.jsonresolver" stats_cfg = "rero_ils.modules.stats_cfg.jsonresolver" templates = "rero_ils.modules.templates.jsonresolver" vendors = "rero_ils.modules.vendors.jsonresolver" [project.entry-points."invenio_search.mappings"] acq_accounts = "rero_ils.modules.acquisition.acq_accounts.mappings" acq_order_lines = "rero_ils.modules.acquisition.acq_order_lines.mappings" acq_orders = "rero_ils.modules.acquisition.acq_orders.mappings" acq_receipt_lines = "rero_ils.modules.acquisition.acq_receipt_lines.mappings" acq_receipts = "rero_ils.modules.acquisition.acq_receipts.mappings" budgets = "rero_ils.modules.acquisition.budgets.mappings" circ_policies = "rero_ils.modules.circ_policies.mappings" collections = "rero_ils.modules.collections.mappings" documents = "rero_ils.modules.documents.mappings" files = "rero_ils.modules.files.mappings" holdings = "rero_ils.modules.holdings.mappings" ill_requests = "rero_ils.modules.ill_requests.mappings" item_types = "rero_ils.modules.item_types.mappings" items = "rero_ils.modules.items.mappings" libraries = "rero_ils.modules.libraries.mappings" loans = "rero_ils.modules.loans.mappings" local_entities = "rero_ils.modules.entities.local_entities.mappings" local_fields = "rero_ils.modules.local_fields.mappings" locations = "rero_ils.modules.locations.mappings" notifications = "rero_ils.modules.notifications.mappings" organisations = "rero_ils.modules.organisations.mappings" patron_transaction_events = "rero_ils.modules.patron_transaction_events.mappings" patron_transactions = "rero_ils.modules.patron_transactions.mappings" patron_types = "rero_ils.modules.patron_types.mappings" patrons = "rero_ils.modules.patrons.mappings" remote_entities = "rero_ils.modules.entities.remote_entities.mappings" stats = "rero_ils.modules.stats.mappings" stats_cfg = "rero_ils.modules.stats_cfg.mappings" templates = "rero_ils.modules.templates.mappings" vendors = "rero_ils.modules.vendors.mappings" [project.entry-points."invenio_search.templates"] migrations = "rero_ils.modules.migrations.es_templates:list_search_templates" operation_logs = "rero_ils.modules.operation_logs.es_templates:list_search_templates" rero_ils = "rero_ils.es_templates:list_search_templates" # --------------------------------------------------------------------------- # Tool configurations # --------------------------------------------------------------------------- [tool.poe.tasks] # Scripts bootstrap = {cmd = "./scripts/bootstrap", help = "Runs bootstrap"} console = {cmd = "invenio shell", help = "Opens invenio shell"} server = {cmd = "./scripts/server", help = "Starts the server"} setup = {cmd = "./scripts/setup", help = "Runs full setup"} setup_e2e = {cmd = "./scripts/setup --e2e", help = "Minimal setup for E2E tests (orgs, libs, locs, item types, patron types, circ policies, users — no documents/items)"} update = {cmd = "./scripts/update", help = "Runs update"} # Code quality format = {cmd = "ruff format rero_ils tests", help = "Formats all files"} lint = {cmd = "ruff check rero_ils tests", help = "Checks linting"} # Tests e2e = {cmd = "pytest tests/e2e -m \"e2e and not chromium_only\" --base-url https://localhost:5000 --browser chromium --browser firefox --browser webkit -o \"addopts=--color=yes\"", help = "Runs cross-browser E2E tests (requires a running RERO ILS instance)"} e2e_chromium = {cmd = "pytest tests/e2e -m e2e --base-url https://localhost:5000 --browser chromium -o \"addopts=--color=yes\"", help = "Runs all E2E tests on Chromium including chromium_only tests (requires a running RERO ILS instance)"} e2e_firefox = {cmd = "pytest tests/e2e -m \"e2e and not chromium_only\" --base-url https://localhost:5000 --browser firefox -o \"addopts=--color=yes\"", help = "Runs Playwright E2E tests on Firefox, skipping Chromium-only tests (requires a running RERO ILS instance)"} e2e_webkit = {cmd = "pytest tests/e2e -m \"e2e and not chromium_only\" --base-url https://localhost:5000 --browser webkit -o \"addopts=--color=yes\"", help = "Runs Playwright E2E tests on WebKit, skipping Chromium-only tests (requires a running RERO ILS instance)"} run_tests = {cmd = "./scripts/test", help = "Runs all tests"} tests = {cmd = "pytest", help = "pytest"} tests_debug = {cmd = "pytest -s -vv --no-cov", help = "pytest -s -vv --no-cov"} # Translations compile_catalog = {cmd = "pybabel compile -d rero_ils/translations/", help = "compile message catalogs to MO files"} extract_messages = {cmd = "pybabel extract rero_ils/ -F babel.ini --project --copyright-holder=RERO --project=RERO_ILS --msgid-bugs-address=software@rero.ch -o rero_ils/translations/messages.pot -c NOTE", help = "extract messages from source files and generate a POT file"} init_catalog = {cmd = "pybabel init -i rero_ils/translations/messages.pot -d rero_ils/translations/", help = "create new message catalogs from a POT file"} update_catalog = {cmd = "pybabel update -i rero_ils/translations/messages.pot -d rero_ils/translations", help = "update existing message catalogs from a POT file"} # Release management. python-semantic-release runs in an isolated uvx environment: # its dependency tree (which caps click) has no reason to constrain ours. [tool.poe.tasks.changelog] cmd = "uvx --from python-semantic-release@latest semantic-release changelog" help = "Preview the next changelog without making changes" [tool.poe.tasks.version] cmd = "uvx --from python-semantic-release@latest semantic-release version --print" help = "Print the next version number without making changes" [tool.poe.tasks.release] cmd = "uvx --from python-semantic-release@latest semantic-release version --no-push --no-tag --no-commit" help = "Generate changelog and bump version locally (does not push, tag, or commit - for local testing only)" [tool.semantic_release] version_toml = ["pyproject.toml:project.version"] version_variables = ["rero_ils/version.py:__version__"] tag_format = "v{version}" commit_message = "chore(release): v{version}" build_command = """ uv lock --upgrade-package rero-ils git add uv.lock """ [tool.semantic_release.commit_author] env = "GIT_COMMIT_AUTHOR" default = "github-actions[bot] " [tool.semantic_release.commit_parser_options] allowed_tags = ["feat", "fix", "docs", "style", "refactor", "perf", "test", "build", "ci", "chore"] minor_tags = ["feat"] patch_tags = ["fix", "perf", "chore", "docs", "style", "refactor", "test", "build", "ci"] [tool.semantic_release.changelog] exclude_commit_patterns = [ "chore\\(release\\):.*", ] mode = "update" [tool.semantic_release.branches.staging] match = "staging" prerelease = false [tool.pytest.ini_options] addopts = "--color=yes --ruff --exclude-warning-annotations --doctest-modules --cov=rero_ils --cov-report=term-missing --ignore=rero_ils/config.py --ignore=tests/e2e -m \"not external\"" testpaths = ["tests", "rero_ils"] markers = [ "external: mark a test as dealing with external services.", "e2e: mark a test as a Playwright end-to-end test (requires a running instance).", "chromium_only: mark a test as Chromium-only (Angular PrimeNG form submission incompatible with Playwright Firefox/WebKit).", ] filterwarnings = [ "ignore::PendingDeprecationWarning", # marshmallow: 'missing' argument renamed to 'load_default' (upstream fix needed) "ignore::DeprecationWarning:marshmallow", # iso639: uses codecs.open() internally "ignore:.*codecs\\.open.*:DeprecationWarning", # jsonmerge uses jsonschema.RefResolver which was deprecated in jsonschema 4.18 "ignore:.*RefResolver.*:DeprecationWarning", # pytest-playwright: false positive when session-scoped browser fixture is used with multiple --browser flags "ignore:When using unittest.TestCase specifying multiple browsers is not supported:UserWarning", ] [tool.ruff] target-version = "py314" extend-exclude = ["config.py"] line-length = 120 [tool.ruff.lint] extend-select = ["A", "C4", "D", "F", "I", "INT", "ISC", "N", "PERF", "PIE", "Q", "RET", "RUF", "SIM", "T20", "UP", "W"] ignore = [ "A001", # builtin-variable-shadowing "A002", # builtin-argument-shadowing "BLE001", # blind-except: catching `Exception` is deliberate around external services and harvesters "D401", # non-imperative-mood: docstring wording is left to the author "DTZ", # flake8-datetimez: naive dates are intentional (MARC dates, circulation dates, display) "F403", # undefined-local-with-import-star "F841", # unused-variable "INT001", # f-string-in-get-text-func-call "N801", # invalid-class-name "N802", # invalid-function-name: dojson handlers mirror the MARC field names "N803", # invalid-argument-name "N806", # non-lowercase-variable-in-function "N818", # error-suffix-on-exception-name "PERF401", # manual-list-comprehension "RUF012", # mutable-class-default: Invenio base classes rely on mutable class attributes "RUF059", # unused-unpacked-variable "SIM102", # collapsible-if "SIM115", # open-file-with-context-handler "T201", # print ] [tool.ruff.lint.per-file-ignores] # MARC transliteration fixtures deliberately mix Cyrillic and Latin look-alikes. "tests/**" = ["RUF001"] # ambiguous-unicode-character-string [tool.ruff.lint.pydocstyle] convention = "pep257"