Repository navigation
Fix minItems for all-optional array-like Structs - #1124
Conversation
Merging this PR will improve performance by 10.99%
Performance Changes
Tip Curious why this is faster? Comment Comparing Footnotes
|
fallenmi
left a comment
There was a problem hiding this comment.
Verified exact head 58ae07bcad83e518d749b7580a69cf91f7b3f4de.
- Exact base
a1ebbcdcf65b794370956e41c8c925cc366ed6f0failed 8/50 matrix cases: every tagged or untagged array-like Struct with zero required and 1–4 defaulted fields advertisedminItemsone too high, while the decoder accepted the minimal payload. - The head and a clean current-main integration pass all 50 combinations (0–4 required × 0–4 defaulted × tag on/off), with schema
minItemsmatching the decoder minimum. - Exact-head full unit suite: 6,052 passed / 473 skipped. Current-main integration: 6,052 passed / 473 skipped. Ruff check/format and
git diff --checkare clean; all live upstream checks are green.
The counter correction also preserves the mixed required/default and zero-field boundaries. Approving this unchanged head.
Reviewed with OpenAI Codex assistance
Siyet
left a comment
There was a problem hiding this comment.
Thx for the fix! The schema now matches the decoder when every field has a default
Problem
For an
array_like=TrueStruct where every user field has a default,msgspec.json.schemareportsminItemsone too high. An untagged Struct getsminItems: 1even thoughmsgspec.json.decodeaccepts[]and fills all defaults; a tagged Struct similarly gets 2 even though a tag-only array is valid. Generated schemas therefore reject payloads accepted by msgspec itself.The trailing-default loop stored the zero-based
enumerateindex and later used it as a count. When the loop never encountered a required field, that count was one short.Fix
Count trailing optional fields explicitly before calculating
minItems. The existing required-field and empty-Struct boundaries remain unchanged.The regression test covers both tagged and untagged Structs and includes a
default_factory, while checking the generated schema against the public decoder contract.Testing
just test tests/unit/test_schema.py— 124 passed, 2 skippedjust test— 6412 passed, 113 skippedjust check— lint, format, and spelling checks passed