Skip to content

Conversation

@corydolphin
Copy link
Contributor

Fixes a number of type-safety issues which would be revealed when we make the AST nodes strictly typed.

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
- Handle token.value being str | None by using `or ""` fallback
- Fix parse_variable_definition to not use `and` for side effects
- Use properly typed variable in parse_nullability_assertion
- These fixes prepare for stricter type checking in frozen dataclasses
@corydolphin corydolphin requested a review from Cito as a code owner January 7, 2026 05:19
@corydolphin corydolphin changed the title Fix parser type safety for stricter AST types 6: Fix parser type safety for stricter AST types Jan 7, 2026
@codspeed-hq
Copy link

codspeed-hq bot commented Jan 8, 2026

Merging this PR will not alter performance

Summary

✅ 14 untouched benchmarks
🆕 4 new benchmarks

Performance Changes

Benchmark BASE HEAD Efficiency
🆕 test_pickle_large_query_encode N/A 110.6 ms N/A
🆕 test_pickle_large_query_decode N/A 207.9 ms N/A
🆕 test_pickle_large_query_roundtrip N/A 317.8 ms N/A
🆕 test_parse_large_query N/A 423.2 ms N/A

Comparing corydolphin:fix-parser-type-safety (505d347) with main (283d002)

Open in CodSpeed

@Cito Cito merged commit 020ec1f 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