All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
4.5.0 - 2026-05-01
- API: added
ApiEntityAbstractas a convenience base combining searchable/query filter and response model behaviors for entity DTOs.
- API markers: standardized marker usage around
ApiField(...)flags across core services, ODM persisted entities, and API utility tests while preserving response/update/search semantics.
4.4.4 - 2026-05-01
- API/query utilities: consolidated pagination, query abstractions/resolvers/types, and API response/searchable model helpers under
core.utils.api; updated ODM plugin imports and coverage to match the new module layout.
4.4.3 - 2026-04-18
- API:
get_updateable_fieldsnow descends into nestedApiResponseModelAbstractfields that are marked only withApiResponseField, so dotted updateable paths matchreconcile_update_requestfor PUT payloads under API-only containers.
- Tests: coverage for updateable path collection and reconciliation (optional nested containers, deep API-only chains, combined
ApiResponseField/UpdateableFieldmarkers,added/removedchange kinds).
4.4.2 - 2026-04-17
- CI: merged SBOM generation and Grype vulnerability scan into a single
dependency-scanjob and updated release dependencies accordingly, simplifying the pipeline while preserving artifacts used by release.
4.4.1 - 2026-04-17
- CI: workflow now uses runner-embedded Poetry/uv binaries from
/home/runner/.local/bininstead of reinstalling toolchain dependencies in jobs, reducing setup overhead while keeping release publishing intact.
4.4.0 - 2026-04-17
- API response models: add
UpdateableField, PUT request model generation, and update reconciliation helpers that merge payloads by policy, track changed/ignored paths, and support strict rejection of non-updateable fields.
4.3.2 - 2026-04-16
- Aiopika:
AbstractListenerpasses the bound queue’s exclusivity (and an optionalexclusiveconstructor override, including explicitFalse) toconsumeinstead of always using an exclusive consumer;Queueexposes anexclusiveread-only property.
4.3.1 - 2026-04-14
- CI release job: extract GitHub release notes when the
CHANGELOG.mdversion line uses Keep a Changelog’s dated form (## [x.y.z] - YYYY-MM-DD), not only a bare## [x.y.z]line.
4.3.0 - 2026-04-14
- Application builder:
build_as_uvicorn_utils,build_as_hypercorn_utils, andbuild_and_serveforward**kwargstobuild()for callers that need late FastAPI wiring.
- Queries: narrow mypy noise on dynamic
create_modelwhen building nestedSearchableEntityquery filter models.
4.2.1 - 2026-04-14
- Release: GitHub release notes extraction now matches the
CHANGELOG.mdversion header exactly and fails the workflow when notes for the tag are missing/empty, preventing silent blank release descriptions.
4.2.0 - 2026-04-14
- Server: optional Hypercorn ASGI support alongside Uvicorn (
core.utils.hypercorn, app builder wiring, config), with integration coverage for ASGI servers.
4.1.1 - 2026-04-14
- Audit:
AuditEventObject.pre_publish_hook(entity)now provides a default hook for redacting or transforming audited entities before publish.
- Audit:
AbstractAuditPublisherService.publishnow delegates toAbstractPublisher.publishand wraps broker failures asAuditServiceErrorwithout recursive self-calls. - Audit: default routing-key prefix now uses a valid topic segment (
all) so the publisher service can be imported and instantiated safely.
4.1.0 - 2026-04-12
- Audit:
AuditableEntityuses a permissive Pydanticmodel_config(extra="allow",arbitrary_types_allowed=True) so auditable actors can carry extended or non-JSON-native fields when needed.
4.0.1 - 2026-04-12
- Audit:
AuditableEntityis a standalone model again;PersistedAuditableEntitysubclasses it withrevision_idand optional auto-generatedidaligned toPersistedEntitywithout multipleBaseModelinheritance.
4.0.0 - 2026-04-12
- Audit:
UseCaseName, optionalAuditEventObject.use_case(defaultunknown) andmetadata, andPersistedAuditableEntityfor ODM-backed documents.
- Breaking:
AuditableEntitynow subclassesPersistedEntitywith a requiredid, addspublished/published_at, and drops embeddedentity_name,domain_name,service_namefields and their getters (domain/service remain onAuditEventObject).
3.4.0 - 2026-04-11
- Queries:
QueryResolvercoerces query strings toenum.Flag/enum.IntFlag,enum.Enum(includingStrEnumandIntEnum), and other leaf types via aTypeAdapterfallback (for exampledatetime).
3.3.0 - 2026-04-11
- Queries:
QueryFieldOperationacceptsT | list[T]forvalueand validates that lists are only used within/ninoperators; ODM builder tests cover UUIDidfilters.
- Queries:
QueryResolvercoercestyping.NewTypeover any supported scalar supertype (for exampleNewType(..., str)), not onlyuuid.UUID.
3.2.1 - 2026-04-11
- ODM:
ODMQueryBuildermaps filter fieldidto MongoDB_idso match documents align with Beanie primary key storage.
3.2.0 - 2026-04-11
- ODM:
PersistedEntitymixes inSearchableEntityandApiResponseModelAbstract;id,created_at, andupdated_atuseApiResponseFieldandSearchableFieldso shared query and response model builders apply consistently.
3.1.1 - 2026-04-11
- Queries:
QueryResolverpreservestyping.NewTypeannotations when deriving field types so values such asNewType(..., uuid.UUID)coerce from query strings touuid.UUID(not plainstr).
3.1.0 - 2026-04-11
- Services: Audit (
AuditableEntity,AuditEventObject), Hydra (HydraTokenIntrospectObject), and Kratos session/identity DTOs mix inSearchableEntityandApiResponseModelAbstract, with fields marked viaAnnotated[..., ApiResponseField, SearchableField]for the shared query and response model builders. - Tests: OpenTelemetry integration teardown flushes and shuts down the meter provider using the configured closing timeout.
3.0.0 - 2026-04-11
- API:
ApiResponseFieldmarker;ApiResponseModelAbstract.build_response_modelderives exposed fields fromAnnotated[..., ApiResponseField]instead ofFIELDS_ALLOWED_FOR_RESPONSE. - Queries:
SearchableFieldmarker,QueryFilterNestedAbstract, andSearchableEntity.build_nested_query_filter_modelfor nested filter segments;SearchableEntity.build_query_filter_modelderives searchable fields fromAnnotated[..., SearchableField]instead ofSEARCHABLE_FIELDSor dotted path lists. - Queries:
QueryResolvercoercesuuid.UUID(includingNewTypewrappers overUUID) from query strings.
- Breaking:
ApiResponseModelAbstractdropsFIELDS_ALLOWED_FOR_RESPONSEand dotted nested path configuration; nestApiResponseModelAbstractsubclasses to shape nested responses. - Breaking:
SearchableEntitydropsSEARCHABLE_FIELDSand dotted nested paths; nestSearchableEntitysubclasses so nested filters map to inner models (with dotted query keys via existing resolver rules).
2.1.1 - 2026-04-10
- Queries:
SearchableEntity.build_query_filter_modelsubclassesQueryAbstract, so generated filter models include pagination and sort fields; the previous standaloneQueryFilterAbstractmodel was removed andQueryFilterAbstractis now an alias toQueryAbstractincore.utils.queries.
2.1.0 - 2026-04-10
- Dynamic API response model builder (
ApiResponseModelAbstract,ApiResponseSchemaBase) for nested Pydantic projections using dotted field paths. - Shared
pydantic_path_fieldshelpers to resolve dotted paths and detect prefix conflicts. QueryFilterAbstractandSearchableEntityto build optionalQueryField-typed filter models from searchable field lists, with unit tests for API and query utilities.
2.0.1 - 2026-04-07
- Aiopika: listener decodes message bodies as UTF-8 JSON; malformed JSON, decode errors, and validation failures are logged and the delivery is rejected with requeue
- Tests: unit tests for
AbstractListenersetup, consume registration, close, and_on_messagesuccess and error paths
2.0.0 - 2026-04-06
- Audit: required
entity,domain, andserviceonAuditEventObject; exportDomainName,EntityFunctionalEventName,EntityName, andServiceNamefrom the audit package
- Audit (breaking): publisher and listener services use
AuditEventObject[AuditableEntity]; routing-key pattern is documented as{prefix}.{domain}.{service}.{what}.{why}
- Aiopika: AMQP
connect_robustfailures are raised asAiopikaPluginBaseError
1.0.0 - 2026-04-06
- Aiopika: validated
PartStr,AbstractName,RoutingKey,QueueName, andExchangeName; fluent builders for routing keys, queue names, and exchange names; topic wildcard*support for listener-style patterns; unit tests for types, builders,GenericMessage, andAbstractPublisher.publish - Audit:
AuditServiceErrorincludesaudit_eventandrouting_keycontext when audit publish fails
- Aiopika:
GenericMessageinitializes an optional incoming delivery reference; publisher treats failed serialization, broker errors, missing confirmation, andBasic.ReturnasAiopikaPluginBaseError
- Aiopika:
GenericMessage.ack/rejectbehave when no incoming message is bound
- Audit (breaking):
AuditableEntityno longer uses private attributes for metadata; callers must passentity_name,domain_name, andservice_name(excluded from default serialization)
0.24.0 - 2026-04-05
- Core:
QueryResolver.from_modelregisters query-string keys for nested filter models (non-QueryAbstractBaseModelfields produce dotted paths such asobject1.field1) and forFieldvalidation_alias/AliasChoices; optional-union nested models are supported when exactly one branch is such a model; self-referential nested graphs are skipped safely after the first visit - Core:
QueryAbstract.get_fieldsflattens nested filter models into entries keyed by each nestedQueryFieldname (so ODM filters keep dotted Mongo paths) - ODM:
ODMQueryBuilderandODMFindQueryinodm_plugin.queriesto translateQueryAbstractinto MongoDB match filters and Beaniefindkwargs (skip,limit,sort), including multi-operation merge per field - Tests: unit tests for the ODM query builder; integration tests with Beanie/MongoDB and a FastAPI-style resolver chain
0.23.0 - 2026-04-04
- Core:
core.utils.queriespackage —QueryField,QuerySort,QueryFieldOperatorEnum,QueryResolver, andQueryAbstractfor filter/sort query parsing and coercion from FastAPI requests - Core: unit tests for query types, field names, resolver behavior,
QueryAbstract, and docstring-aligned examples
- Core: pagination helpers —
resolve_offsetmoved topaginations.helpers;paginationsre-exportsPaginationPageOffset,PaginationSize, andresolve_offsetonly
0.22.1 - 2026-03-17
- JWT: raise dedicated
ExpiredJWTErrorwhen bearer token is expired for clearer error handling and differentiation from generic invalid token errors
0.22.0 - 2026-03-14
- Core: CSRF exception handler with structured logging returning 403 on invalid token
- Core:
register_csrf_protect_exception_handler(app)to register CSRF exception handler on FastAPI app - Core: validation exception handler and
register_exception_handlers(app)for FastAPI
- Core: CSRF registration function renamed to
register_csrf_protect_exception_handler(fromregister_exception_handler)
0.21.1 - 2026-03-14
- Dev: explicit black dependency from pyproject.toml (formatting remains via pre-commit)
0.21.0 - 2026-03-13
- Core: CSRF configuration model and dependency helpers to integrate
fastapi-csrf-protectviaRootConfig.csrfand application state
0.20.0 - 2026-03-02
- JWT: configurable bearer token extraction strategies for bearer token resolution
0.19.2 - 2026-02-28
- JWT:
audiencemoved fromBaseApplicationConfigtoJWTBearerAuthenticationConfig; Hydra OAuth2 client credentials service now acceptsconfiganddefault_audienceinstead of application config
0.19.1 - 2026-02-26
- Aiohttp plugin: extracted
AioHttpResourceDepends.export_from_statehelper to reuse FastAPI application state export logic
0.19.0 - 2026-02-25
- JWT/Hydra: in-memory JWKS store configuration helper from Hydra introspect services and FastAPI dependency for Hydra JWKS store (
configure_jwks_in_memory_store_from_hydra_introspect_services,DependsHydraJWKStoreMemory)
- JWT: documentation and authentication abstractions updated to use
JWTAuthenticationServiceAbstract,GenericJWTBearerTokenDecoder, issuer typeOAuth2Issuer, and issuer-aware JWK stores
- Repo: removed legacy
.cursorconfiguration directory and.gitmodulesmetadata from version control
0.18.0 - 2026-02-23
- JWT:
JWTBearerAuthenticationConfigBuilderto build config from application YAML - JWT:
DependsJWTBearerAuthenticationConfigfor FastAPI state injection - JWT:
JWTBearerAuthenticationConfigBuilderErrorandCONFIG_FILENAMEonApplicationAbstract - Unit tests for JWT config builder and dependency in
test_configs.py
0.17.1 - 2026-02-23
- JWT: single issuer in config, generic decoder/verifier, and issuer-by-kid in JWK stores
0.17.0 - 2026-02-16
- ODM plugin:
PersistedEntityis now generic over entity ID type (PersistedEntity[BookEntityId]) for typed IDs with improved docstring and usage example
0.16.1 - 2026-02-14
- KratosSessionObject validation update
0.16.0 - 2026-01-25
- Pagination utilities module (
core/utils/paginations/)PaginationSizetype with validation (1-200 range, default 50)PaginationPageOffsettype with validation (min 0, default 0)depends_pagination_page_offset()for FastAPI dependency injectiondepends_pagination_page_size()for FastAPI dependency injectionresolve_offset()utility function to calculate database offset from page offset and page size- Comprehensive unit test suite (191 lines, 5 test classes)
- Query filter helper module (
core/utils/query_helper.py)QueryFilterHelperclass for validating and transforming query parameters in FastAPI endpointsQueryFilterValidationErrorexception for invalid filter valuesQueryFilterUnauthorizedErrorexception for unauthorized filter keys- Support for type transformation and validation of query parameters
- Configurable error handling (raise on unauthorized/invalid filters)
- Comprehensive unit test suite (530 lines)
0.15.1 - 2026-01-25
- Added exception for protobuf waiting fix in Grype configuration
0.15.0 - 2026-01-24
- Exception mapping utilities module (
core/utils/exceptions.py) ExceptionMappingdataclass for defining source-to-target exception mappingsexception_mapperdecorator for mapping exceptions in sync and async functionsExceptionMapperclass for wrapping method calls with exception mappingExceptionMappingContextcontext manager supporting both sync and async contexts- Support for context hooks (sync and async) to inject context into target exceptions
- Exception chaining preserved via
raise ... fromsyntax - Comprehensive test suite for exception mapping utilities (72 tests)