Skip to content

Evaluate griffe for SDK API tooling (breaking-change detection, docs, conformance) #49

Description

@vdavez

Summary

Evaluate adopting griffe in tango-python. Griffe loads a Python package into a structured API model (modules → classes → functions, with signatures, type annotations, defaults, and parsed docstrings) — statically, without importing. Three headline uses: griffe dump (API → JSON), griffe check old new (breaking-change detection between two git refs, exits non-zero in CI), and it's the engine behind mkdocstrings for doc generation.

Where it fits (ranked)

1. Breaking-change / semver gating on releases — strongest fit, lowest effort

This is a versioned PyPI package (currently 1.2.0) with a large CHANGELOG.md and semver expectations, but nothing checks the public surface across releases today. griffe check in CI would flag when a PR removes/renames a public method, drops or reorders a parameter, or changes an annotation — i.e. whether a release needs a major bump.

Proposed spike:

  • Add griffe to dev deps.
  • CI step: griffe check tango --against <latest-tag> (or compare two refs in the lint workflow).
  • Surface the diff on PRs as a release/semver signal.

2. Generate docs/API_REFERENCE.md instead of hand-maintaining it

docs/API_REFERENCE.md is ~61KB of hand-written markdown with a manual TOC, and makegov/docs fetches it at build time (→ sdks/python/api-reference.md). The docs site already runs MkDocs but not mkdocstrings. griffe/mkdocstrings could render the reference from the actual client.py signatures + docstrings, removing the drift risk.

Caveat: the docs build currently pulls pre-rendered markdown and doesn't import the SDK, so wiring mkdocstrings means the docs build needs the package installed. Medium value, medium effort.

3. Back scripts/check_filter_shape_conformance.py with griffe instead of raw ast.parse

That script already hand-rolls ast.parse(client.py) to extract method params/annotations. griffe provides a cleaner resolved model (signatures, defaults, inherited members) for free. This is a refactor, not new capability — only worth it if the AST-walking becomes a maintenance burden.

Important caveat

griffe sees only Python. It cannot tell whether the SDK matches the server API — that's exactly what the OpenAPI-derived contracts/filter_shape_contract.json checker does. griffe complements that contract check (catches Python-side regressions); it never replaces it.

Scope: this is Python-only — does NOT cover tango-node

griffe parses Python source, so it does nothing for the TypeScript SDK. The equivalent tooling for tango-node would be a separate effort:

  • API Extractor — closest analog: API report + breaking-change review + doc model
  • TypeDoc — docs generation
  • @arethetypeswrong/cli — published-types sanity

If we like the griffe outcome here, file a sibling issue on makegov/tango-node for the TS equivalent.

Proposed next step

Start with #1 (highest value-to-effort, doesn't touch the docs pipeline, directly supports CHANGELOG/semver discipline). Prototype the CI check and review the diff it reports against the current release before deciding on #2/#3.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions