pyproject.toml
Rama staging · réplica de lectura del repositorio original.
# 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] <github-actions[bot]@users.noreply.github.com>"
[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"