Skip to content

5.17.0 — 2026-10-20

← 5.18.0 | 5.16.1 → | ↑ 5.x series

Added

Adapters - gRPC

  • In-memory Rate Limit Stores - Added SQLite-backed rate-limit stores that need no Redis.
    • Added InMemoryRateLimitStore and AsyncInMemoryRateLimitStore, which satisfy the RateLimitStore ports
    • Opt in through the store argument of the interceptor; the Redis default is unchanged

Changed

Adapters - SQLAlchemy

  • Base Adapter Modules - Split archipy/adapters/base/sqlalchemy/adapters.py into focused modules with no behavior change.
    • Added mixins.py, query_helpers.py, sync_adapter.py and async_adapter.py
    • adapters.py re-exports every name, so existing import paths keep working

Configs

  • Config Section Modules - Moved the config classes out of config_template.py into per-section modules under archipy/configs/sections/.
    • config_template.py re-exports every class, so from archipy.configs.config_template import X keeps working without a deprecation warning
    • Fields, defaults and validators are unchanged

Helpers - OpenTelemetry

  • OtelRuntime Modules - Split OtelRuntime into focused private modules for process state, provider builders, adoption, publication, flush and shutdown, and the logging handler.
    • OtelRuntime keeps every method as a thin delegate, so OtelUtils is unchanged

Models - Types

  • Precise Types - Replaced Any in the Vault lease DTO and the Keycloak lookup cache.
    • VaultLeaseDTO.data is now dict[str, JsonValue]
    • Cached Keycloak lookups are generic over the fetched value

Fixed

Adapters - Kafka

  • Unreachable Broker - validate_connection now reports an unreachable broker as UnavailableError instead of InternalError.

Adapters - ScyllaDB

  • CQL Error Mapping - CQL syntax errors now map to InvalidArgumentError.
    • RequestValidationException was not caught by the except clauses of execute

Configs

  • PostgreSQL DSN Port - The port is now taken from a PostgreSQL DSN such as postgresql+psycopg://u:p@host:6432/db when PORT was not set.
    • PORT defaults to 5432, which previously overrode the DSN port

Models - DTOs

  • Decimal Range Values - A non-numeric decimal range value is now reported as InvalidArgumentError.
    • Decimal("abc") raises decimal.InvalidOperation, which the validator did not catch

Tests

Tests - Adapters

  • Adapter Coverage - Added BDD scenarios for Kafka, Redis, ScyllaDB, SQLAlchemy, Vault and email adapters.
    • Kafka: unreachable brokers, invalid settings, topics
    • Redis: hash reads, set scans and pops, multi-key exists
    • ScyllaDB: CRUD round trips, missing tables, invalid CQL
    • SQLAlchemy: get_by_uuid, delete, bulk_delete, wrong session manager configuration, lazy default session manager
    • Vault: incomplete auth settings and token file
  • Elasticsearch Stability - Refresh the index before scanning it and treat an already existing index as created.
  • Container Readiness - Elasticsearch and Kafka test containers wait for readiness and poll.
  • Mailpit - Stopped Mailpit from waiting 20 seconds on every SMTP connection.

Tests - Helpers

  • Helper Coverage - Added scenarios for JWT token types, version and subject extraction, config validation, gRPC trusted proxy chains and the native TrustedHost and HTTPS redirect middleware.

Chore

Chore - CI

  • Parallel Behave Runner - Added scripts/behave_parallel.py, which runs one Behave process per feature file, with the Behave workflow using it.
  • CI Logs - Features log in plain format so failures keep their trace, and the hidden .behave-logs folder is uploaded.
  • Docs Check - Added make docs-check (mkdocs build --strict) with a pull request workflow, and fixed four broken links.
  • Lint Scope - make lint now includes packages/.

Chore - Coverage

  • Coverage Target - Added make coverage, which runs Behave under coverage, and coverage now measures the adapter packages.

Chore - Docs

  • Package READMEs - Documented install, usage and the config section in each package README.

Dependencies

  • Raised Lower Bounds - fastapi>=0.146.0, httpx2>=2.14.0 (core, parsian-ipg, saman-ipg), coverage>=7.16.2 and import-linter>=2.15.