Skip to content

Releases: eamigo86/django-graphex

Release v1.3.0

13 Jun 22:28
a2d1d80

Choose a tag to compare

What's Changed

  • refactor(views): drop no-op try/except in body-size guard (ac3b6a8)
  • docs(installation): note Django 4.x users should use django-graphex 1.2.3 (f96a27e)
  • fix(views): body-size guard checks authoritative len(request.body), not spoofable Content-Length (df029d0)
  • test: cover defensive branches to close v1.3.0 patch-coverage gap (37da9ce)
  • docs(changelog): consolidate 1.3.0 release notes (3b3bb5c)
  • chore(release): bump version to 1.3.0 (1169ee7)
  • style(uploads): apply ruff formatting to test_base64_upload.py (9e095e3)
  • docs(uploads): add Base64FileInput reference docs, settings, changelog, and playground example (5d9e230)
  • feat(uploads): add Base64FileInput with body-size + per-field decoded-size caps (0c47aeb)
  • docs(filtering): add @filter_field reference docs, changelog entry, and playground example (ac47e35)
  • feat(filtering): add @filter_field decorator for per-field custom GraphQL filters (bee9974)
  • test(cache): drop unused resp1 binding (F841) introduced by #72 (97bd501)
  • docs(playground): showcase v1.2.2 get_queryset + safe ordering + version signal (closes #74) (406924e)
  • test(cache): fix toothless TTL test and vacuous CSRF-replay assertions (closes #72) (a2c1aeb)
  • docs: fix stale import, fragile anchor, views docstring, add ImproperlyConfigured note (closes #71) (efa395b)
  • style: apply ruff format + lint fixes to new test files and registry.py (97fc08a)
  • test(registry): remove dead reset_global_registry + document isolation strategy (b932c34)
  • test(concurrency): assert on_commit ordering invariant for version-counter race (#60) (90ea255)
  • test(cache): add multi-backend coverage for LocMemCache and DatabaseCache (b7cbdbc)
  • test(refactor): hoist shared minimal cache schema + graphql_post helper into cache_helpers.py (0c4670c)
  • refactor(compat): remove dead Django <5.x shims now that floor is 5.2 (d2b3f8c)
  • docs(compat): update compatibility statements to Django 5.2 LTS + 6.0 (238dd28)
  • build(deps): raise Django floor to 5.2, drop EOL versions from matrix (983b972)

Installation

pip install django-graphex==1.3.0

Full Changelog: v1.2.3...v1.3.0

Release v1.2.3

13 Jun 18:01
ac7681d

Choose a tag to compare

What's Changed

  • test(subscriptions): cover indexed committed-delete broadcast (4c79a5c)
  • docs(changelog): add 1.2.3 hotfix notes (b0687e6)
  • chore(release): bump version to 1.2.3 (0258b5c)
  • fix(pagination): accept 'pk' alias in ordering allowlist (closes #70) (220b240)
  • fix(subscriptions): snapshot pk at signal time in _on_delete (closes #69) (90602f9)

Installation

pip install django-graphex==1.2.3

Full Changelog: v1.2.2...v1.2.3

Release v1.2.2

13 Jun 16:58
a627dd1

Choose a tag to compare

What's Changed

  • refactor(version): single source of truth, drop hardcoded VERSION tuple (c98fef5)
  • test(v1.2.2): cover defensive branches to close patch-coverage gap (1f51229)
  • docs(changelog): add 1.2.2 release notes (87af4bf)
  • chore(release): bump version to 1.2.2 (c8b76a1)
  • fix(types): apply DjangoObjectType.get_queryset on DjangoListObjectField (completes #58) (dfdbbb0)
  • fix(docs): fix crashing version snippet, compat matrix over-claim, missing classifier (closes #67) (665230f)
  • fix(docs/ci/filtering): README 404, stale issue link, mypy drift, daphne cap, filter_fields None (closes #55) (24723e8)
  • fix(types): all_directives type mismatch + _fmap_cache through .only()-narrowing pass (closes #66) (bfd216c)
  • perf(optimizer): thread _fmap_cache through nested-list descent in _walk_filtered_prefetches (closes #57) (a7e99d7)
  • perf(optimizer): eliminate per-parent COUNT N+1 on empty window-sliced nested pages (closes #64) (e11f7a2)
  • fix(types): Meta-option hygiene — unknown options, include_fields, id KeyError, queryset (closes #65) (b1d18c8)
  • fix(converter): fold app_label into enum registry key + use parent_link for MTI guard (closes #52) (1a34940)
  • fix(nested): pk=0 upsert creates instead of updates + enum members in LIST not unwrapped to raw values (closes #51) (455feda)
  • fix(mutation): close nested-write integrity gaps — M2M bad-pk 500, reverse-FK child steal, reverse-O2O list, forward-FK list drop (closes #62) (1ef3811)
  • fix(playground): add session middleware to WebSocket ASGI stack, fix directive names and enum example (closes #54) (a028933)
  • fix(subscriptions): defer broadcasts via transaction.on_commit to suppress phantom notifications on rollback (closes #63) (fb63794)
  • fix(subscriptions): wrap sync ORM hooks and cache I/O in sync_to_async + guard disconnect AttributeError (closes #61) (e50d7a4)
  • fix(cache): multipart POST 500 + CSRF cookie replay under CACHE_ACTIVE (closes #53) (fd4985a)
  • fix(cache): version-counter correctness — on_commit bump, timeout=None, seed to 1 (closes #60) (dc19991)
  • fix(directives/pagination): wrap bad client input in GraphQLError (closes #50) (62414cc)
  • style: apply ruff format to pagination.py and test_pagination_ordering_security.py (2f39efd)
  • fix(pagination): validate ordering terms against concrete attnames (closes #59) (56c653a)
  • fix(types): invoke DjangoObjectType.get_queryset scoping hook (closes #58) (e02c46e)

Installation

pip install django-graphex==1.2.2

Full Changelog: v1.2.1...v1.2.2

Release v1.2.1

13 Jun 04:34
79cc1ec

Choose a tag to compare

What's Changed

  • fix(directives): add width ceiling to @center to prevent memory DoS (HIGH-2) (e658607)
  • fix(cache): include GET query params in fetch_cache_key hash (HIGH-1) (0d36950)
  • docs(subscriptions): correct broadcast scheduling description (R3) (0cd9941)
  • fix(subscriptions): log fire-and-forget group_send failures via done-callback (R2) (5ee380d)
  • fix(directives): bound digit-string length before int() in _extract_width_precision (R1) (06043f7)
  • style+ci: apply ruff formatting and fix tox cov-fail-under override (7beffe1)
  • fix(polish): apply LOW audit findings L1/L2/L3 (fe93c5d)
  • fix(subscriptions): remove blocking executor from _safe_group_send ASGI path (H3) (9050198)
  • fix(directives): close @Number DoS bypass for digit-fill+align specs (H2) (8826360)
  • fix(cache): heal string-token poison in _bump_cache_version (H1) (80be83d)
  • test: skip SafeGroupSendTest on channels-free base-install (11befcd)
  • test: make CheckConstraint kwarg compatible across Django 4.2–6.0 (df6721e)
  • style: apply ruff formatting to test_optimizer_perf.py (0984154)
  • ci: drop duplicate release notes and freeze uv sync (0607280)
  • docs: consolidate perform_mutate, fix imports and cross-links (72b1dc2)
  • chore: regenerate uv.lock for v1.2.1 (d3d65fa)
  • docs(changelog): fix settings namespace and @Date argument name (fafe8d1)
  • style: ruff-format and ruff-check fixes in new test files (06a6217)
  • test(coverage): close patch-diff gap to 100% — pragma guards + targeted tests (d41ad8b)
  • fix(subscriptions): replace per-call ThreadPoolExecutor with module-level singleton (83f13f7)
  • fix(directives): @Number blames value vs spec correctly in separate try blocks (9e38e98)
  • fix(views): correct double-encoded batch error, incr-based cache versioning, assert→HttpError, batch+cache bypass (5309de8)
  • fix(ci): annotate intentional except-pass blocks for bandit; pin bandit (6502e53)
  • fix(subscriptions): accept the document kwarg in execute_graphql_request override (354994b)
  • docs(types): fix residual Meta.fields → only_fields in DjangoInputObjectType examples (f436afb)
  • fix(optimizer): honor @skip/@include in _walk_filtered_prefetches (6f869df)
  • style(playground): apply ruff format to blog schema (e625308)
  • docs(changelog): add 1.2.1 release notes (43954de)
  • docs(playground): fix MAX_QUERY_DEPTH description, URL references, pyproject comment; link from main README and quickstart (e7360fa)
  • fix(playground): add permission imports, public field path, IntegrityError handling, URL trailing-slashes (e88e806)
  • docs(security): fix broken anchor http--view-hardening -> http-view-hardening in security.md (44939d8)
  • docs(nav,optimizer,changelog): B22 remove api/utils.md + nav entry, B15 custom resolver example, Part C depth-on-mutations note, 1.0.0 Django range clarification (5bfd2b9)
  • docs(directives,subscriptions,examples,readme): B16 middleware required note, B18 demultiplexer note, B19 split mutation tab groups, B21 date response tab, A5 CACHE_ACTIVE default note (9dcd185)
  • docs(pagination,migration,backends): B9 page_size_query_param semantics, B10 cursor single-field note, B11 related settings box, B1 migration steps bullets, B5 backend limits expansion (5d191fa)
  • docs(fields,mutations): B2 WHY notes, B7 client tab, B14 DjangoNestedListObjectField, B20 nested UPDATE examples, B4+B8 Pydantic consolidation, Part C mutation depth/optimizer (f0acd55)
  • docs(types): fix A1 only_fields/exclude_fields drift, A2 ListField warning, A4 union/interface API ref, B3 stream sub note, B4 remove Pydantic section (8b6bb4d)
  • test: remove guardian ghost backend, Faker factory, fix hardcoded assertions (473ec34)
  • test(tox): remove duplicate --cov flags from tox [testenv] command (3768d6c)
  • ci: SHA-pin all GitHub Actions in cicd.yaml and docs.yml (e6028b8)
  • fix(packaging): sdist allowlist, py.typed, importlib version, dep caps, metadata (305e729)
  • test(packaging): add failing tests for version importlib source, version 1.2.1, py.typed (3639add)
  • docs(optimizer): note selection-aware mutation re-read optimization (v1.2.1) (0b95f08)
  • perf(optimizer): request-scoped field-map memoization and optimized mutation re-read (e04141a)
  • test(optimizer): add failing tests for #20 — field-map memoization and mutation re-read N+1 (340e81f)
  • style(tests): ruff format test_issue_19_core_consistency (a59f63d)
  • fix(exports): add Registry and DjangoNestedListObjectField to public init (7f0a3c5)
  • fix(converter): make field ordering unconditional — remove DEBUG gate (26ff7fd)
  • test(core): add failing tests for #19 — unconditional ordering, public exports, MultiSelectField, ArrayField (245123f)
  • docs(mutations): document M2M add-vs-set divergence, explicit-null limitation, perform_mutate behavior (3b17093)
  • fix(mutations): custom-pk delete attname, isinstance enum unwrap (0f25f5c)
  • test(mutations): add failing tests for #18 — custom-pk delete, enum isinstance, perform_mutate pin (e50e907)
  • fix(pagination): explicit page validation, safe cursor decoding, conditional count (b6830c7)
  • test(pagination): add failing tests for #17 — page=0, tampered cursor, conditional COUNT (c3c5527)
  • fix(directives): cap @Number format spec, real ISO 8601 dates, DST-aware time-ago, UTF-8 base64 (d617bf7)
  • test(directives): add failing tests for #16@Number DoS, ISO date, DST time-ago, UTF-8 base64 (395f8e9)
  • fix(views): batch limit, GraphiQL SRI, AST introspection detection, single-parse cost (e82470b)
  • test(views): add failing tests for batch limit, GraphiQL SRI, AST introspection, single-parse cost (170e2c3)
  • fix(subscriptions): back the channel registry with the Django cache (46d37ee)
  • fix(tests): remove spurious asyncio mark from sync tests in test_security (6dc460c)
  • fix(subscriptions): extract session_key from context for HTTP view; normalize None/empty ownership (850856e)
  • fix(subscriptions): channel ownership guard, filter validation and delivery hardening (e0d8b67)
  • test(subscriptions): add failing security tests for channel ownership, filter validation and hardening (c25b6be)
  • style(tests): ruff format test_unique_constraint_validation (bc116f0)
  • docs(native): document UniqueConstraint validation and conditional-constraint limits (d1ba0e6)
  • fix(native): validate UniqueConstraint and exclude MTI parent links (16284e9)
  • test(native): add failing tests for UniqueConstraint validation and MTI parent_link exclusion (bfe3b83)
  • style(tests): remove unused imports from test_skip_include_directives (e8816c5)
  • docs(directives): document @skip/@include behavior in cost/depth and optimizer (fee3911)
  • fix(validation): honor @skip/@include in cost, depth, and optimizer walks (5111261)
  • test(directives): add failing tests for @skip/@include in cost, depth, optimizer (43c41da)
  • ci: run the test pipeline for release tracker branches (dd62b60)
  • docs(nav): register the caching guide in the site nav (10d6e20)
  • docs(cache): document identity-keying, version-counter invalidation, parse guard (581fe05)
  • fix(cache): identity-salted key, namespace invalidation, parse guard, sentinel, prefix typo (e8c8dff)
  • test(cache): add failing tests for cross-user leak, parse guard, sentinel (4759e92)

Installation

pip install django-graphex==1.2.1

Full Changelog: v1.2.0...v1.2.1

Release v1.2.0

12 Jun 02:53
64efac7

Choose a tag to compare

What's Changed

  • test+ci: close patch-coverage gaps (95.39%) and silence the setup-uv cache-reserve warnings (6c447d8)
  • fix(mutation): build a nested-aware input for nested_fields instead of reusing the generic [ID!] input (60e57bd)
  • docs(example): demonstrate the query optimizations (v1.1.0 + v1.2.0) in the playground (e229e8a)
  • docs(optimizer): complete query-optimization docs with a worked example per feature (dc170d5)
  • test(optimizer): cover Track 2 routing + Gap-5 guard branches (coverage 94.26% -> 95.11%) (d3295e7)
  • fix(ci): skip GFK-union narrow-path tests on Django < 5.0 + silence base-install asyncio warning (ce31590)
  • fix(optimizer): resolve bandit B112 in GFK-union content-type de-dup (a261891)
  • chore(release): bump version to 1.2.0 + complete the 1.2.0 changelog (631a091)
  • feat(optimizer): type-condition routing for GFK-union via per-content-type GenericPrefetch (Track 2 MVP, Block B) (843194c)
  • feat(types): DjangoUnionType + DjangoInterfaceType + GFK→Union converter (Track 2 MVP, Block A) (75005d5)
  • docs(optimizer): document Phase A/C/D features + 3 settings; fix stale nested-list pagination claims (19ddf1b)
  • feat(optimizer): guard inline-fragment descent against type-condition mis-attribution (Gap #5) (183d2a3)

Installation

pip install django-graphex==1.2.0

Full Changelog: v1.1.0...v1.2.0

What's Changed

  • Release v1.2.0 — union/interface types + type-condition optimizer + docs currency by @eamigo86 in #10

Full Changelog: v1.1.0...v1.2.0

Release v1.1.0

12 Jun 02:49

Choose a tag to compare

What's Changed

  • style(optimizer): ruff format + lint cleanup (CI quality gate) (73789d2)
  • refactor(optimizer): narrow hook child-model resolution excepts to (FieldDoesNotExist, AttributeError) (7d3dde4)
  • feat(optimizer): per-field optimize_ hook for nested lists (Phase E) (518c4d0)
  • style(optimizer): ruff format + lint cleanup (CI quality gate) (0467b64)
  • test(optimizer): cover .only() narrowing on a mixed annotated prefetch child (Phase D W1) (0c09f54)
  • feat(optimizer): compose AnnotatedField with window-sliced prefetch (Phase D D2) (c6fdc70)
  • style(optimizer): ruff format + lint cleanup (CI quality gate) (c9074d1)
  • feat(optimizer): AnnotatedField — GraphQL-selection-driven DB annotations (Phase D D1) (7d7c8c5)
  • fix(optimizer): filter-aware totalCount for windowed nested lists + close Phase C coverage gaps (27453a6)
  • feat(optimizer): activate window-slice nested pagination (Phase C C3) (5171a29)
  • feat(optimizer): build_window_prefetch + walker descent, dormant (Phase C C2) (42dedc8)
  • style(optimizer): ruff format + lint cleanup (CI quality gate) (dc26d41)
  • feat(optimizer): window-slice paginator hook + OPTIMIZE_NESTED_PAGINATION (Phase C C1) (e604b89)
  • style(optimizer): ruff format + lint cleanup (CI quality gate) (20b2d8f)
  • test(optimizer): drop dead Phase B red-first import guard (a8c0468)
  • fix(optimizer): drop prefetch-crossing select_related; add Phase B e2e suite (PR2) (2990fcb)
  • style(optimizer): ruff format + lint cleanup (CI quality gate) (108ba5d)
  • feat(optimizer): narrow prefetch querysets with .only() (Phase B PR1) (fdd7fde)
  • build: sync uv.lock with Django >=4.2 / version 1.1.0 (a37f878)
  • feat(optimizer): add OPTIMIZER_SAFE_MODE and optimize GenericForeignKey prefetch (2628eae)
  • build!: require Django >=4.2 (drop EOL 4.0/4.1) (81347d2)
  • refactor: inline _compat and _graphene_settings into domain modules (983e42d)
  • refactor(api)!: drop the Extra prefix from public class names (8f1c081)
  • test: mark Test* schema fixtures with test = False (b281da4)
  • docs(example): demonstrate nested writes and enable MAX_QUERY_DEPTH (cd93303)
  • docs: name graphene-django and graphene-django-extras in migration callout (ad456d6)
  • feat: default DEFAULT_PAGINATION_CLASS to LimitOffsetGraphqlPagination (88eada7)
  • docs: render :material-*: icons via pymdownx.emoji instead of plain emoji (965f0dd)
  • build: drop direct graphql-relay dependency (transitive via graphene) (1283c6e)
  • fix: correct over-strict time-ago assertion and drop unused example imports (2946f3a)
  • docs: fix material-icon shortcodes, correct naming, add cost-analysis section (66b8a6a)
  • docs(example): showcase all features in playground and rewrite its README (ffc77fb)
  • test: strengthen weak assertions and fix misleading tests (00017e9)
  • refactor: remove dead code and fix stale comments/docstring (387c58a)
  • docs: add issue forms (bug/feature) and route docs link to template chooser (ff05d43)
  • docs: switch downloads badge to pepy datasource (f65ca43)
  • fix(ci): let pytest-cov produce coverage.xml instead of coverage run (7d4b5e2)
  • ci: pass CODECOV_TOKEN to codecov upload (ae6868d)

Installation

pip install django-graphex==1.1.0

Full Changelog: v1.0.0...v1.1.0

What's Changed

  • Phase A foundations + Phase B PR1: prefetch .only() narrowing by @eamigo86 in #1
  • Phase B PR2: drop prefetch-crossing select_related + e2e suite by @eamigo86 in #9
  • Phase C C1: window-slice paginator hook + OPTIMIZE_NESTED_PAGINATION by @eamigo86 in #3
  • Phase C C2: build_window_prefetch + walker descent (dormant) by @eamigo86 in #4
  • Phase C C3: activate window-slice nested pagination + filter-aware totalCount by @eamigo86 in #5
  • Phase D D1: AnnotatedField — GraphQL-selection-driven DB annotations by @eamigo86 in #6
  • Phase D D2: compose AnnotatedField with window-sliced prefetch by @eamigo86 in #7
  • Phase E: per-field optimize_ hook for nested lists by @eamigo86 in #8

Full Changelog: v1.0.0...v1.1.0

Release v1.0.0

09 Jun 22:04

Choose a tag to compare

What's Changed

  • fix(filtering): catch FieldDoesNotExist instead of bare Exception (bc767d6)
  • ci: pin setup-uv to v7 (no moving v8 tag is published) (c375faf)
  • ci: bump actions to node24-compatible majors (d2f4d87)
  • style: apply ruff format (7d9440a)
  • fix: avoid localtime() crash in time-ago directive under USE_TZ=False (972385a)
  • docs: lead install instructions with uv, keep pip as the alternative (e389ef1)
  • ci+docs: deploy docs with the release; README requirements one per line (ea4e007)
  • ci: publish on version tags instead of every push to main (a8ad137)
  • ci: target the main branch (rename from master) in CI/CD and docs edit_uri (d95e578)
  • feat: django-graphex 1.0.0 — initial release (4808135)

Installation

pip install django-graphex==1.0.0

Full Changelog: ...v1.0.0

Full Changelog: https://github.com/eamigo86/django-graphex/commits/v1.0.0