5.0.0
Backwards-incompatible changes
- Safir now depends on Pydantic v2. Python code that uses any part of Safir related to Pydantic will also need to update to Pydantic v2, since the API is significantly different. See the Pydantic migration guide for more information.
safir.pydantic.validate_exactly_one_of
is now a Pydantic model validator. It must be called withmode="after"
, since it operates in the model rather than on a raw dictionary.- Remove the
GitHubAppClientFactory.create_app_client
method, which does not work with the Gidgethub API. Instead, the documentation shows how to create a JWT with theGitHubAppClientFactory
and pass it with requests. safir.github.GitHubAppClientFactory
now expects the application ID and installation ID (forcreate_installation_client
) to be of typeint
, notstr
. This appears to match what GitHub's API returns, but not what Gidgethub expects. The ID is converted to a string when passing it to Gidgethub.
New features
- Allow the
safir.logging.LogLevel
enum to be created from strings of any case, which will allow the logging level to be specified with any case for Safir applications that use Pydantic to validate the field. - Add validated but ignored optional
propagation_policy
arguments to every delete method of the Kubernetes mock for better compatibility with the actual Kubernetes API. Previously, this argument was only accepted bydelete_namespaced_job
. - All mock Kubernetes methods now accept and ignore a
_request_timeout
error for better compatibility with the Kubernetes API. - Add delete, list, and watch support for persistent volume claims to the Kubernetes mock.
Bug fixes
safir.database.datetime_to_db
,safir.datetime.format_datetime_for_logging
, andsafir.datetime.isodatetime
now accept anydatetime
object with a time zone whose offset from UTC is 0, rather than only thedatetime.UTC
time zone object.safir.pydantic.normalize_datetime
now explicitly rejects input other than seconds since epoch or datetime objects with a validation error rather than attempting to treat the input as a datetime object and potentially throwing more obscure errors.- The
_request_timeout
parameters to mock Kubernetes methods now accept a float instead of an int to more correctly match the types of kubernetes_asyncio. The mock still does not accept a tuple of timeouts. - Avoid reusing the same metadata object when creating a
Pod
from aJob
. Previous versions modified thespec
part of theJob
when adding additional metadata to the childPod
.
Other changes
- Safir is now tested with Python 3.12 as well as Python 3.11.
What's Changed
- DM-398710: Remove GitHubAppClientFactory.create_app_client by @jonathansick in #207
- DM-40744: Convert to Pydantic v2 by @rra in #204
- Doc fix: spawn_uvicorn example by @fritzm in #209
- Update kubernetes-asyncio requirement from <26 to <27 by @dependabot in #208
- Update kubernetes-asyncio requirement from <27 to <28 by @dependabot in #210
- Fix spawn_uvicorn documentation by @rra in #211
- DM-23878: Allow log level enum with any case by @rra in #212
- Update kubernetes-asyncio requirement from <28 to <29 by @dependabot in #213
- DM-41630: Add propagation_policy to Kubernetes mock deletes by @rra in #214
- DM-41630: Support _request_timeout in Kubernetes mock by @rra in #215
- DM-41630: Fix type of Kubernetes mock _request_timeout by @rra in #218
- DM-41630: Update development Redis dependencies by @rra in #216
- DM-41630: Convert to FastAPI lifespan functions by @rra in #217
- DM-41708: Fix Pod creation from Job in Kubernetes mock by @rra in #221
- DM-41708: Add more mocks for Kubernetes PVCs by @rra in #220
- DM-41820: Fix annotations on Pod created from Job by @rra in #222
- DM-41998: Add support for Python 3.12 by @rra in #223
- DM-41998: Prepare 5.0.0 release by @rra in #224
Full Changelog: 4.5.0...5.0.0