Skip to content

v0.11.1

Choose a tag to compare

@github-actions github-actions released this 09 Oct 22:55
· 6 commits to master since this release

Docs

  • Capability boundaries rewritten as the full input/output matrix:
    a structured-inputs table (path convertors, query models, body shapes,
    Depends, scalars, alias wire contract), two new degradation rows (unbound
    TypeVar at a route boundary, unannotated body parameters), mixed-type
    Literal in the skip list, and a "Conventions the bridge follows" table
    collecting the FastAPI-side derivation rules (tags/domains, function
    names, descriptions, requiredness per model family, exclude/deprecated,
    optional headers, multi-verb priority, naming collisions).

Fixed

  • TypeVar-degraded routes now carry the real reason in their SDL note.
    Route-output classification runs ONCE at scan time
    (scanner.OutputPlan) and every reader — startup notice, readiness
    report, SDL field note — consumes the same plan, ending five verified
    disagreements between the three former detectors: the misleading
    "declares no response type" guidance on generic routes, first-match
    audit vs stacked SDL notes, void+filter audited as degraded (a bodyless
    response has nothing to filter), Any+filter showing two different
    stories, and the filter⇒JSON decision smeared across four sites.

Changed

  • Input/output handling systematically reorganized (four refactors,
    zero behavior change beyond the fix above):

    • type_builder's six near-clone field builders (model/TypedDict/
      dataclass × input/output) unified on FieldSpec: three family
      extractors produce normalized field records, one _build_fields
      loop owns sanitize/wire-key/degrade/union/empty handling that was
      copy-pasted six times (1052 → 1041 lines while gaining the
      abstraction)
    • _build_route_info (158 lines) decomposed into a gate sequence
      (_FlatParams, five named gates, _route_params, _trial_route_types)
      with _make_param as the single ParamInfo/gname producer
    • wire-name/default/note helpers single-sourced (request_wire_name,
      output_wire_name, graphql_default, append_note); all three
      cross-module private imports made public or moved home
  • Test suite reorganized into layers. tests/ now mirrors altitude
    instead of git history: unit/ (one module under test, no handler
    execution), integration/ (through RouterGraphQLHandler),
    e2e/ (ASGI / fastmcp Client), guards/ (meta pins), plus a shared
    tests/support/ package (sample models, app factories, MCP/HTTP
    protocol helpers) that replaces ~19 copy-pasted factories and
    per-file model redefinitions. A make_handler conftest fixture owns
    handler lifecycle. Four assertion-level duplicates merged
    (filter_passthrough_headers ×2, introspection, list-type, path-param
    restatement); layered assertions deliberately kept. Ticket-wave labels
    (G5-G11/H1/M1, P0-2, R1/R4, B1, O1/O2, D1) moved from names and
    section markers into docstrings.

Added

  • Seventeen gap tests lift coverage from 95.1% to 96.7%:
    unknown-domain errors for the remaining progressive tools, fragment
    arms of the unroll-limit walk, HEAD/OPTIONS-only routes, empty
    TypedDict/dataclass input raises, output-side AliasChoices fallback,
    input-side hyphenated TypedDict keys, dataclass field degradation on
    both sides, non-JSON 2xx bodies, long error-body truncation, and
    syntax errors on the unguarded parse path.