fix(deps): update poetry dependencies (master) (major) - #2428
Open
red-hat-konflux[bot] wants to merge 1 commit into
Open
fix(deps): update poetry dependencies (master) (major)#2428red-hat-konflux[bot] wants to merge 1 commit into
red-hat-konflux[bot] wants to merge 1 commit into
Conversation
Reviewer's guide (collapsed on small PRs)Reviewer's GuideDependency update PR bumping major versions of gunicorn, peewee, prometheus-async, and pytz in pyproject.toml, with corresponding changes in poetry.lock. File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com>
red-hat-konflux
Bot
force-pushed
the
konflux/mintmaker/master-master/major-poetry-deps
branch
from
August 3, 2026 18:58
717f91f to
a6eed2a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^23.0.0→^26.0.0^3.18.1→^4.0.0^25.0.0→^26.0.02025.2→2026.3Release Notes
benoitc/gunicorn (gunicorn)
v26.0.0Compare Source
Breaking Changes
eventletworker class has been dropped. Migrate togevent,gthread, ortornado.New Features
Security
authority-formrequest-target outsideCONNECTasterisk-formrequest-target outsideOPTIONSrelative-referencerequest-targetsContent-Lengthlist form (RFC 9112 section 6.3)finish_bodybyte cap_body_receiveralive across the keepalive smuggling gate so pipelined requests cannot re-enter a closed bodyproxy_allow_ipsand tighten v1/v2 parsing in the ASGI callback parser.Bug Fixes
Content-Lengthon HEAD and 304 responses (#3621)_handle_stream_endedto set_body_completein the async HTTP/2 handler so request bodies finalize correctly on stream endInvalidChunkExtensionmapping and fast-parser support in ASGI tests (#3565)Transfer-Encoding: chunkedto 100-Continue interim responses.textkey isNoneearly_hintscallback to matchprocess_headers; pass only the header name toInvalidHeader(#3588).accept())Transfer-Encodingheader for BlackSheep streamingRefactoring
BodyReceiver._closedinto separate transport and body-wait flags for clearer keepalive/EOF semantics.Changes
gunicorn_h1c >= 0.6.5. Drop the lastpython_onlytest markers; the C extension is now used wherever available (CPython only; PyPy continues to use the Python parser).h2anduvloopto thetestingextra; removeeventlet.docker/setup-qemu-action,docker/setup-buildx-action,docker/login-action,docker/build-push-action, anddocker/metadata-actionto current major versions.Full changelog: benoitc/gunicorn@25.3.0...26.0.0
v25.3.0: Gunicorn 25.3.0Compare Source
Bug Fixes
HTTP/2 ASGI Body Duplication: Fix request body being received twice in HTTP/2
ASGI requests, causing JSON parsing errors with "Extra data" messages
(#3558)
ASGI Chunked EOF Handling: Add
finish()method to callback parser to handlechunked encoding edge case where connection closes before final CRLF after zero-chunk
HTTP/2 Documentation: Fix
http_protocolsexamples to use comma-separated stringinstead of list syntax (#3561)
Chunked Encoding: Reject chunk extensions containing bare CR bytes per RFC 9112
(#3556)
Request Line Limit: Fix
--limit-request-line 0to mean unlimited as documented,instead of using default maximum. Works with both Python and fast C parser.
(#3563)
Security
Changes
Fast HTTP Parser: Update to gunicorn_h1c >= 0.6.3 for
asgi_headerspropertyand
InvalidChunkExtensionvalidation for bare CR rejectionASGI PROXY Protocol: Add PROXY protocol v1/v2 support to callback parser
Docker Images: Update to Python 3.14
v25.2.0: Gunicorn 25.2.0Compare Source
New Features
http_parser='fast'automode if version not metBug Fixes
uWSGI Async Workers: Fix
InvalidUWSGIHeader: incomplete headererror when using gevent or gthread workers with uwsgi protocol behind nginx. (#3552, PR #3554)FileWrapper Iterator Protocol: Add
__iter__and__next__methods toFileWrapperfor full PEP 3333 compliance. (#3396, PR #3550)Performance
bytearraybuffer operationsbytearray.find()directly instead of converting to bytes firstlist.pop(0)(O(1) vs O(n))v25.1.0: Gunicorn 25.1.0Compare Source
New Features
Control Interface (gunicornc): Add interactive control interface for managing
running Gunicorn instances, similar to birdc for BIRD routing daemon
(PR #3505)
show all/workers/dirty/config/stats/listenersworker add/remove/kill,dirty add/removereload,reopen,shutdown--control-socket,--control-socket-mode,--no-control-socketgunicorncfor connecting to control socketDirty Stash: Add global shared state between workers via
dirty.stash(PR #3503)
Dirty Binary Protocol: Implement efficient binary protocol for dirty arbiter IPC
using TLV (Type-Length-Value) encoding
(PR #3500)
Dirty TTIN/TTOU Signals: Add dynamic worker scaling for dirty arbiters
(PR #3504)
Changes
Documentation
v25.0.3Compare Source
What's Changed
Bug Fixes
Documentation
Full Changelog: benoitc/gunicorn@25.0.2...25.0.3
v25.0.2Compare Source
What's Changed
Bug Fixes
Other
Full Changelog: benoitc/gunicorn@25.0.1...25.0.2
v25.0.1Compare Source
Bug Fixes
HTTP/1.1 responses without Content-Length header. Without chunked encoding,
clients wait for connection close to determine end-of-response.
Changes
uvloop for async task execution
Testing
WebSocket, streaming, lifespan, framework integration (Starlette, FastAPI),
HTTP/2, and concurrency scenarios
v25.0.0: Gunicorn 25.0.0Compare Source
New Features
Dirty Arbiters: Separate process pool for executing long-running, blocking
operations (AI model loading, heavy computation) without blocking HTTP workers
(PR #3460)
--dirty-app,--dirty-workers,--dirty-timeout,--dirty-threads,--dirty-graceful-timeouton_dirty_starting,dirty_post_fork,dirty_worker_init,dirty_worker_exitPer-App Worker Allocation for Dirty Arbiters: Control how many dirty workers
load each app for memory optimization with heavy models
(PR #3473)
workersclass attribute on DirtyApp (e.g.,workers = 2)module:class:N(e.g.,myapp:HeavyModel:2)DirtyNoWorkersAvailableErrorfor graceful error handlingworkers=2: 20GB (75% savings)HTTP/2 Support (Beta): Native HTTP/2 (RFC 7540) support for improved performance
with modern clients (PR #3468)
--http-protocols,--http2-max-concurrent-streams,--http2-initial-window-size,--http2-max-frame-size,--http2-max-header-list-sizepip install gunicorn[http2]examples/http2_gevent/with Docker and testsHTTP 103 Early Hints: Support for RFC 8297 Early Hints to enable browsers to
preload resources before the final response
(PR #3468)
environ['wsgi.early_hints'](headers)callbackhttp.response.informationalmessage typeuWSGI Protocol for ASGI Worker: The ASGI worker now supports receiving requests
via the uWSGI binary protocol from nginx
(PR #3467)
Bug Fixes
Fix HTTP/2 ALPN negotiation for gevent and eventlet workers when
do_handshake_on_connectis False (the default). The TLS handshake is nowexplicitly performed before checking
selected_alpn_protocol().Fix setproctitle initialization with systemd socket activation
(#3465)
Fix
Expect: 100-continuehandling: ignore the header for HTTP/1.0 requestssince 100-continue is only valid for HTTP/1.1+
(PR #3463)
Fix missing
_expected_100_continueattribute in UWSGIRequestDisable setproctitle on macOS to prevent segfaults during process title updates
Publish full exception traceback when the application fails to load
(#3462)
Fix ASGI: quick shutdown on SIGINT/SIGQUIT, graceful on SIGTERM
Deprecations
eventletworker is deprecated and will be removed inGunicorn 26.0. Eventlet itself is no longer actively maintained.
Please migrate to
gevent,gthread, or another supported worker type.Changes
(PR #3471)
v24.1.1Compare Source
Bug Fixes
forwarded_allow_ipsandproxy_allow_ipsto remain as strings for backwardcompatibility with external tools like uvicorn. Network validation now uses strict
mode to detect invalid CIDR notation (e.g.,
192.168.1.1/24where host bits are set)(#3458,
PR #3459)
Full Changelog: benoitc/gunicorn@24.1.0...24.1.1
v24.1.0: Gunicorn 24.1.0Compare Source
New Features
Official Docker Image: Gunicorn now publishes official Docker images to GitHub Container Registry (PR #3454)
ghcr.io/benoitc/gunicornPROXY Protocol v2 Support: Extended PROXY protocol implementation to support the binary v2 format in addition to the existing text-based v1 format (PR #3451)
--proxy-protocolmodes:off,v1,v2,autoautomode (default when enabled) detects v1 or v2 automaticallyCIDR Network Support:
--forwarded-allow-ipsand--proxy-allow-fromnow accept CIDR notation (e.g.,192.168.0.0/16) for specifying trusted networks (PR #3449)Socket Backlog Metric: New
gunicorn.socket.backloggauge metric reports the current socket backlog size on Linux systems (PR #3450)InotifyReloader Enhancement: The inotify-based reloader now watches newly imported modules, not just those loaded at startup (PR #3447)
Bug Fixes
finish_body()for faster timeout detection on slow or abandoned connections (PR #3453)SSLWantReadErrorinfinish_body()to prevent worker hangs during SSL renegotiation (PR #3448)unreader.unread()to prepend data to buffer instead of appending (PR #3442)RecursionErrorwhen pickling Config objects (PR #3441)raise fromin glogging.py (PR #3440)Installation
Or use the official Docker image:
v24.0.0Compare Source
New Features
ASGI Worker (Beta): Native asyncio-based ASGI support for running async Python frameworks like FastAPI, Starlette, and Quart without external dependencies
uWSGI Binary Protocol: Support for receiving requests from nginx via
uwsgi_passdirectiveDocumentation Migration: Migrated to MkDocs with Material theme
Security
Install
coleifer/peewee (peewee)
v4.3.0Compare Source
Backwards-incompatible:
requires-python >= 3.8. I've been putting off committing toanything like this, since technically we still work on 3.7, but 3.8 is the
minimum we run on CI so it felt correct.
docidimplicit primary key on legacyFTSModel(FTS4) withrowid, which is equivalent. Usingdocidpresents no benefit andswitching to
rowidmakes operations more consistent. Users have a coupleoptions when updating:
docid = DocIDField()to your FTSModel classes.docidwithrowid. The underlying datadoes not require a migration, as docid was just an alias for rowid.
conflict was ignored,
execute()returnsNoneon every backend.Improvements:
SELECT 1and discards deadones, matching the MySQL pool's ping. Previously a connection terminated
server-side while parked in the pool was handed out and failed on first use.
close_pool()in pwasyncio no longer spins the event loop on Python3.13+ attempting to reclaim connections in use, and pool creation is now
bounded by
acquire_timeout. Connections terminated during shutdown aredetected as stale and discarded at the next checkout.
JSONFieldnegative path indexes render as$[last]/$[last-n]onMySQL/MariaDB. Previously the sqlite-only
$[#-n]form was emitted, whichMariaDB evaluates to NULL (overwriting the column when used with
set())and MySQL rejects as an invalid path.
JSONFieldmutators (set(),insert(), etc) store Python booleans asjson true/false instead of the driver's 0/1, so values written by
create()and by mutators compare consistently. Floats on MySQL/MariaDB likewise take
their json text form, as MariaDB reformats driver floats in a way that
breaks equality against the stored document.
JSONFieldinstead ofemitting
from playhouse.mysql_ext import *for a re-exported field.playhouse.pwasynciologs to thepeewee.pwasynciologger rather thanplayhouse.pwasyncio.datasetfreeze/thaw of NULL blob and datetime values. Empty CSV cellsnow import as NULL for non-text fields.
on=predicate instead of silentlyreplacing it with
true, and default toON truewhenon=is omitted.contentoption must be a Model or table-name string.Passing a Field now raises
ImproperlyConfigured: it generated DDL thatfts5 rejects outright and that fts4 silently truncated to the table name.
FTS5Model.VocabModel(): term/col/offset were declared as virtualfields and omitted from default SELECTs, the instance-type model had the
wrong column set, all three table-types shared one default table name, and
the generated class was cached with whatever database was bound at first
call. Vocab models are now built fresh per call with real fields, correct
columns and per-type default names.
FTS5Model.web_query(), which translates the query syntax users expectfrom a search box (quoted phrases, AND/OR/NOT,
-exclusion,column:filters and parentheses) into an FTS5 query. Anything else is searched as
text, so
covid-19orc++need no escaping, and the translation is alwaysa valid query. The parser lives in the new
playhouse.fts_parsermodule.Use it with search:
Doc.search(Doc.web_query(user_input)).FTS5Model.delete_command(), which removes a row using the fts5deletecommand. This is how rows are removed from external-content and contentless
tables, which need the originally-indexed values supplied back to them:
sqlite treats an omitted column as NULL, and values that do not match what
was indexed leave stale entries behind (undetectably so on a contentless
table). Peewee therefore requires a value for every indexed column; pass
Nonewhere NULL was indexed. The command exists only for those twoconfigurations - default-storage and
contentless_delete=1tables rejectit and use ordinary
DELETE.as_rowcount()is specified, along withproper return of all parts of a composite PK instead of just the 1st column.
last_insert_id()is implemented once onDatabase, with backendsoverriding
_last_insert_rowid()where the driver differs. APSW and theMariaDB connector inherit composite primary-key support as a result, having
previously returned only the first column.
View commits
v4.2.6Compare Source
written through the foreign-key descriptor. The fk id on the source
instance keeps the column's value (previously it was overwritten with
None), and accessing the attribute on a non-null fk returnsNoneinstead of raising
DoesNotExist.View commits
v4.2.5Compare Source
id()-based hash afterclone().View commits
v4.2.4Compare Source
Model.select()used as a FROM/JOIN source reduced to its pk.fn.EXISTS(compound)double-parenthesizing.x.in_(ValuesList(...))dropping parens aroundVALUES..join(on=...)mis-attaching rows when the fk is on the rhs.ON CONFLICT ... DO NOTHINGdropping the target/where/constraint.View commits
v4.2.3Compare Source
UNION/INTERSECT/EXCEPT) used as a correlatedsubquery emitting a phantom alias for the correlated outer table in every
branch but the left-most, producing invalid SQL (e.g.
no such column: t4.id). The right-hand branch renders in a fresh alias scope that no longerresolved the outer source's existing alias, it now inherits the enclosing
scope's aliases while still assigning fresh aliases to its own sources.
weightspassed as adictbeing mis-applied to thewrong columns. For FTS3/4 the implicit
docidprimary-key was included whenbuilding the weight list, shifting every column by one (raising
IndexErrorwith the Python ranking UDF, silently mis-scoring with the Cython one), for
FTS5,
UNINDEXEDcolumns were skipped even thoughbm25()weights arepositional across all columns. The list form of
weightswas unaffected..cte()clearing the source query's CTE list in place: converting a querythat carried a
with_cte(...)clause into a CTE stripped the clause from thatquery, so reusing it afterward referenced an undeclared CTE. The query is now
cloned before its CTE list is reset.
Table.select()with no arguments on aTabledeclared without columnsemitting an empty projection (
SELECT FROM ...) instead ofSELECT *.Table.insert(select_query)with nocolumnsraisingTypeErrorinsteadof rendering
INSERT INTO t SELECT ....ON DELETE/ON UPDATEactionwhen
add_not_null()orrename_column()rebuilds the constraint, silentlydowngrading e.g.
CASCADEtoRESTRICT. The actions reported byget_foreign_keys()are now carried through to the rebuilt constraint.postgres_extJSONcontains/contained_by/concatraisingAttributeError, andremove()silently rewriting the entire column, whenapplied to a
.path()-chained lookup (e.g.Model.data['a'].path('b')). Allfour now resolve the root field and full path via
_resolve_root(), matchingthe sibling
set/replace/insert/append/updatemutators.postgres_ext.JSONFielddocs: thejson-column field does notsupport the
jsonb-based mutation/concatenation builders (they raiseProgrammingError), so the misleading "Postgres casts implicitly" claim wasremoved and new code is steered to the built-in
JSONField.UNIQUE (a, b)constraintas a column when rebuilding a table (
add_not_null,drop_column, ...),raising
no column named UNIQUE;uniqueis now recognized as a constraint.CREATE TABLEkeywordsfor a table whose name is a case-insensitive substring of them (e.g.
ab,t,tab) -- the table-name substitution is now anchored to the trailingname token.
View commits
v4.2.2Compare Source
Field.__hash__again... fml. Use(model_cls, field name).Metadata.remove_ref()removing the wrong foreign-key when a modelhas multiple foreign-keys to the same target, as
list.remove()matchedthe first entry via the overloaded
Field.__eq__.CaseorCastcollapsingto its alias in an
UPDATE ... SETvalue and inON CONFLICT DO UPDATE,as
qualify_names()wrapped the value atSCOPE_COLUMN.namedtuples()on a query-builder (Table) query raisingValueErrorwhen a column name is not a valid identifier. The plain
NamedTupleCursorWrappernow passesrename=True, matching the model path.object as
None, so accessing the attribute raisedAttributeError. Theouter-join test had regressed to
endswith('OUTER')(never true). It nowalso recognizes
FULL JOINandLEFT JOIN LATERAL.ModelSelect.select_extend()mutating its receiver's default-projectionflag, so a base
Model.select()reused as a subquery stopped collapsing toits primary key. It now flags the returned clone, matching
select().distinct(True)anddistinct(False)not clearing a priordistinct(*columns), so the query kept renderingDISTINCT ON (...)insteadof a plain
DISTINCTor no distinct at all.get_indexes()shredding an expression index whose key containsa comma, e.g.
COALESCE(a, 0)split into two bogus columns. It joined theper-key definitions into a comma-delimited string and split on the comma. It
now reads the key array directly.
Model.insert(),insert({})) emittingDEFAULT VALUESand dropping python-side field defaults, inconsistent with a partial insert
which backfills them. A model with no python defaults still uses
DEFAULT VALUES.View commits
v4.2.1Compare Source
Can't ship a stub that's not complete. Missed moving server_side_cursor()
helper into the core psycopg helper.
View commits
v4.2.0Compare Source
contains,startswith,endswith,between,is_null,not_inandiregexp.PostgresqlDatabase(isolation_level=...)having no effect ontransactions. Previously only
atomic(isolation_level=...)worked.Ordering.collate()dropping thenulls=ordering.get_indexes().windows=parameter of theSelectconstructor.reraise(),__div__,__nonzero__)and assorted dead internal code.
TimestampField.local_to_utc()andTimestampField.utc_to_local().Select.columns()no longer accepts and ignores keyword arguments.Metadata.get_rel_for_model().SelectBase.exists()ignoring itsdatabaseargument.CursorWrapperindexing:cursor[n]raised IndexError for uncachedrows and
cursor[0]fetched the entire result set..namedtuples()crashing on selected columns that are not validPython identifiers.
materialized=when compounding CTEs viaunion()/union_all().ManyToManyFieldreads when the through-model foreign keys use the'!'backref sentinel.mariadbconnector - pooled connectionswere discarded on every checkout.
sqliteqstop()to drain the write queue and return True.aggregate class.
NameErrors incysqlite_ext:blob_open()andprogress().attr=keyword instead ofon_delete/on_updatefor reflected foreign keys.datasetinfinite loop on self-referential foreign keys, crash onheaderless CSV import,
thaw()validating against export rather thanimport formats, and the importer mutating live model metadata.
model_to_dictto honoronly=/exclude=for many-to-many fields,fix
resolve_multimodel_queryon queries with narrowed selections.signals.Model.save(True)reportingcreated=Falsewhenforce_insertis passed positionally.CompressedFieldcrashing onstrvalues.withhold) and CockroachDBrun_transactionretry detection under psycopg3.peeweelogger.playhouse, remove thebroken, unused
get_current_url/get_next_urlhelpers fromflask_utils.delete_instance(recursive=True)failing to cascade to the childrenof a model reachable through both nullable and non-nullable foreign-keys.
a single-argument function call, e.g.
fn.SUM(Case(...)).Tableinserts on returning-clause databases binding theprimary-key name as a parameter and returning None instead of the new id.
CompositeKeycomparisons raiseValueErrorwhen the value's length doesnot match the key, rather than silently matching on a prefix.
types, matching query execution.
FieldAlias.modelto reference the model alias rather than the aliasedmodel, alias-rooted join queries no longer construct and discard a spurious
instance of the aliased model for every result row.
playhouse.postgres_ext.JSONFieldcreatingjsonbcolumns after thecore postgres backend began mapping the JSON field-type to JSONB, its DDL
is
jsonagain, and json-vs-jsonb function selection for chained lookupsnow follows the field's declared datatype.
attribute name as flat queries (e.g.
COUNTrather thanCOUNT(1).Field.__hash__is keyed on the model's schema and table-name rather thanits class name, so same-named model classes (factories, separate modules,
schema-per-tenant layouts) no longer collide in field-keyed registries such
as backrefs, redefining or re-importing a model in place still replaces
its entries.
UnboundLocalErrorwhen joining from a model-less source to a model,e.g.
join_from(cte, SomeModel, on=...), the joined instance is stored inthe source's row dict, keyed by the model name.
BlobField,CompressedFieldand thesqlite_udf.gzip()function encodestrvalues using utf-8 instead ofraw_unicode_escape. Behavior changefor non-ASCII strings: characters
above the latin-1 range are no longer mangled into literal escape
sequences, but blobs written from non-ASCII strings by earlier versions
will not compare equal to newly-written ones.
View commits
v4.1.2Compare Source
for reporting and the initial patch.
has_key,has_keys,has_any_keys) to thecore
JSONFieldon SQLite, implemented withjson_type().contains,contained_by) to the coreJSONFieldon SQLite via a registered_pw_json_containsUDF that emulatesPostgres'
@>semantics (structural, level-aligned). The coreJSONFieldnow has full predicate parity across SQLite, Postgres, and MySQL/MariaDB.
View commits
v4.1.1Compare Source
Load()). Seedocumentation.
This replaces
prefetch(), is more flexible and also supports options forapplying a row limit to sub-results, and a strategy that materializes the ID
list (in addition to SELECT IN and JOIN strategies).
MySQLJSONField(playhouse.mysql_ext) withcontains_any()for theJSON_OVERLAPS/"match any" counterpart tocontainsfor JSON arrays.lazy_load=Falsewhen serializingrecursively with
model_to_dict(), #3055.View commits
v4.1.0Compare Source
generated before a conn was opened. We were trying to do some introspection
on the server version, but I've decided instead to make
mariadb=be adatabase param, per @alisonatwork's suggestion, with the default being
"MySQL" flavored JSON. Refs #3053
JSONFieldcontainment (contains,contained_by) no longer wraps itsargument in
CAST/JSON_COMPACTon MySQL/MariaDB, #3053.View commits
v4.0.9Compare Source
View commits
v4.0.8Compare Source
BaseQuery.aexecute()- an async twin ofexecute()available on allquery types, executing through the query's bound async database:
await User.select().aexecute(),await user.tweets.aexecute(). Returnsexactly what
execute()returns, including result rows for DML withRETURNING. Queries remain non-awaitable, this is an ordinary coroutinemethod and the only async method on queries.
playhouse.pwasynciousing "a"-prefixed coroutinecounterparts of the row-level
Modelmethods (acreate,aget,aget_or_none,aget_by_id,aget_or_create,aset_by_id,adelete_by_id,abulk_create,abulk_update,asave,adelete_instance), available via the newAsyncModel/AsyncModelMixinclasses. Each is a thin delegation through the greenletbridge, so behavior is identical to the synchronous implementation.
Note: the
Modelproperty of async databases now returns a base classthat includes these methods - relevant only if you introspect the base
class of
db.Modelsubclasses.afetch()for explicit, awaitable lazy foreign-key resolution:user = await tweet.afetch(Tweet.user). Already-loaded relations (viajoin or prefetch) return immediately without a query.
db.first(query, n=1)async helper.MissingGreenletBridgeerrors now include a hint describing the asyncAPIs to use.
APIs documented in the docs
are stable. The asyncio stress test now also runs in CI.
View commits
v4.0.7Compare Source
playhouse.pwasyncio: report correct UPDATE / DELETE rowcounts onasyncpg, roll back open transactions when connections are returned to the
pool, raise instead of deadlocking when querying during
iterate(), anddetect the MySQL / MariaDB server version.
playhouse.pwasynciofixes: a seconditerate()on a busyconnection raises instead of deadlocking, asyncpg exceptions are translated
to peewee exception types, registered aggregates / collations / window
functions / extensions and
timeoutare applied to async SQLiteconnections,
:memory:databases use a single connection,atomic()accepts transaction arguments (e.g.
lock_type), postgres connection URLsand
isolation_levelare supported,%%in raw SQL is unescaped, andattempting a query outside the greenlet bridge no longer emits "never
awaited" warnings.
playhouse.pydantic_utils: JSON fields validate asAny(nowincluding the sqlite_ext
JSONField), foreign keys may be included /excluded by field name or column name, server-side defaults like
SQL('CURRENT_TIMESTAMP')are no longer emitted as schema defaults, andrelationshipskeys are validated.JSONFieldto core that provides basic operationsand also more consistent behavior when reading data. By default the new core
JSONField treats extracted values as JSON, which is generally the correct
thing, but "text-mode" is available as a chained
.as_text()method. Seedocs.
May eventually replace the backend-specific implementations with subclasses
that inherit semantics of this new field.
Note:
playhouse.mysql_ext.JSONFieldis now the core field. The oldjson_dumps/json_loadsarguments are renameddumps/loads, theextract()method is removed (use item-access orpath()), and MySQLtables are now created with
JSONcolumns rather thanTEXT.to @abulgher, #3050.
fromisoformat()ended up causing previously-unconverted strings (Ymd)to be converted in some cases, e.g. formatting a datetime as a str (#3051).
The change I made to address this is to make explicit casts on function calls
not attempt any heuristic python-value conversion. This makes it more natural
to call
fn.whatever().cast('text')and you predictably get text out.View commits
v4.0.6Compare Source
BinaryJSONField: helpers for in-placemodifications (
set,replace,insert,append,update).BinaryJSONField(path_exists,path_match,path_query,path_query_array,path_query_first).fromisoformatas a first attempt since it's faster and more robust.db.connection_context()can be nested cleanly, #3046.pool.close_allandpool.manual_close, #3047.FixedCharField, #3048.View commits
v4.0.5Compare Source
db_value()may not get called in subclasses of PostgresJSONField / BinaryJSONField, refs #3044.
DB drivers. This simplifies checking driver-specific subclasses of standard
DB-API exceptions.
View commits
v4.0.4Compare Source
ImproperlyConfiguredif pg driver unavailable at modeldefinition-time when field db-hooks are used, rather than
AttributeError.View commits
v4.0.3Compare Source
around and trying to group things more clearly. Also added new tests covering
some gaps.
stuff like
.in(a for a in iterable if cond).FOR UPDATEclauses.paginate()method.wrapper.
graphs after multi-table selects.
View commits
v4.0.2Compare Source
db.iterate(query).DataSet module. Previously binary data was encoded as base64, going forward
hex is the new default. For base64 specify
base64_bytes=True.BinaryJSONField, support atomic removal ofsub-elements, as well as alternate helper for extracting sub-elements and
querying array length.
View commits
v4.0.1Compare Source
gr_contextis set on greenlet ingreenlet_spawnso thatcontextvars will be operable in sync handlers.
SqliteExtDatabase(it basically served no purpose in 4.0). UseSqliteDatabaseinstead.corresponding extension module rather than putting all into
playhouse.pool.dumpsoption for postgres JSON fields.View commits
v4.0.0Compare Source
asynciovia a new playhouse extension. Seethe documentation
for details.
PostgresqlDatabasecan usepsycopg(psycopg3) if it is installed. If bothpsycopg2 and psycopg3 are installed, Peewee will prefer psycopg2, but this
can be controlled by specifying
prefer_psycopg3=Truein the constructor.Same applies to
PostgresqlExtDatabase.Psycopg3Databaseclass has been moved toplayhouse.postgres_extand isnow just a thin wrapper around
PostgresqlExtDatabase.relying on the driver-provided
Json()wrapper(s).ISODateTimeFieldfor Sqlite that encodes datetimes in ISO format(more friendly when db is shared with other tools), and also properly reads
back UTC offset info.
playhouse.sqlite_ext.ClosureTableimplementation.Model.dirty_field_namesattribute that is safe for membershiptesting, since testing
x in dirty_fieldsreturns True if one or more fieldexists due to operator overloads returning a truthy Expression object.
Refs #3028.
_sqlite_extextension. The C implementations of the FTSrank functions are moved to
sqlite_udf. Most of the remaining functionalityis moved to
playhouse.cysqlite_extwhich supports it natively.Migrating
CSqliteExtDatabaseusage:You can either use
sqlite_ext.SqliteExtDatabaseor try the newcysqlite_ext.CySqliteDatabaseif you want all the old functionality and arewilling to try a new driver.
View commits
stub42/pytz (pytz)
v2026.3Compare Source
v2026.2Compare Source
v2026.1Compare Source
Configuration
📅 Schedule: (in timezone Europe/Prague)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
To execute skipped test pipelines write comment
/ok-to-test.Documentation
Find out how to configure dependency updates in MintMaker documentation or see all available configuration options in Renovate documentation.