Skip to content

Conversation

@corydolphin
Copy link
Contributor

Tests were using incomplete node construction that relied on default None values. This change makes tests more representative in preparation for non-nullable required fields.

Introduce benchmarks using a large (~117KB) GraphQL query to measure
parse and pickle serialization performance. These provide a baseline
for comparing serialization approaches in subsequent commits.

Baseline performance (measrued on a Macbook Pro M4 Max):
- Parse:         81ms
- Pickle encode: 24ms
- Pickle decode: 42ms
- Roundtrip:     71ms
Prepares AST for immutability by using tuples instead of lists for
collection fields. This aligns with the JavaScript GraphQL library
which uses readonly arrays, and enables future frozen datastructures.
Python 3.9 reaches end-of-life October 2025. Python 3.10 adoption is
now mainstream - major frameworks (strawberry, Django 5.0, FastAPI) require it.

This enables modern Python features:
- Dataclasses with `kw_only`
- Union types with `|` syntax (PEP 604)
- isinstance() with union types directly
- match statements for pattern matching
Modifies the AST visitor to use copy-on-write semantics when applying
edits. Instead of mutating nodes in place, the visitor now creates new
node instances with the edited values. This prepares for frozen AST
nodes while maintaining backwards compatibility.

The visitor accumulates edits and applies them by constructing new
nodes, enabling the transition to immutable data structures.
- Update test_visitor.py to properly type-annotate the visitor class attribute
  and add assertion before using selection_set
- Update test_schema_parser.py to use more precise types that match GraphQL spec:
  - NonNullTypeNode's inner type can only be NamedTypeNode or ListTypeNode
  - Schema definitions use ConstDirectiveNode, not DirectiveNode
  - Default values use ConstValueNode, not ValueNode
  - OperationTypeDefinition's type_ must be NamedTypeNode
@corydolphin corydolphin force-pushed the fix-tests-to-use-proper-ast-node branch from 8a48871 to 6c91ccf Compare January 7, 2026 05:17
@codspeed-hq
Copy link

codspeed-hq bot commented Jan 8, 2026

CodSpeed Performance Report

Merging this PR will not alter performance

Comparing corydolphin:fix-tests-to-use-proper-ast-node (96b61b6) with main (9c3735e)

Summary

✅ 18 untouched benchmarks

@Cito Cito merged commit a4b38e2 into graphql-python:main Jan 8, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants