Skip to content

fix: support Python 3.9 type generation - #1094

Closed
sornapudisuresh wants to merge 1 commit into
supabase:masterfrom
sornapudisuresh:fix/1088-python-typing-extensions
Closed

fix: support Python 3.9 type generation#1094
sornapudisuresh wants to merge 1 commit into
supabase:masterfrom
sornapudisuresh:fix/1088-python-typing-extensions

Conversation

@sornapudisuresh

Copy link
Copy Markdown

Summary

  • import NotRequired and TypeAlias from typing_extensions
  • support generated Python types on Python 3.9 and 3.10
  • add a focused regression test and update the integration snapshot

Test plan

  • npm run check
  • Prettier check passed
  • focused Python generator unit test passed
  • Python generator integration test passed
  • imports validated with Pydantic on Python 3.9, 3.10, and 3.11

Fixes #1088

@tushardev-365

Copy link
Copy Markdown

Ran the 3.9/3.10 smoke test I offered. Took your branch's generated header (the typing_extensions import) with a TypedDict using NotRequired plus a TypeAlias, and it imports cleanly on both 3.9 and 3.10. The pre-fix form (those two names from typing) still throws the original ImportError on both, and 3.12 passes either way as expected. Fix looks good.

@sornapudisuresh

Copy link
Copy Markdown
Author

Thanks @tushardev-365 for verifying both the pre-fix failure and corrected imports on Python 3.9 and 3.10!

@sornapudisuresh

Copy link
Copy Markdown
Author

Hi @avallete @soedirgo, the workflow runs for commit 8e9c137 appear to have expired after remaining pending for about 30 days. Could someone with maintainer access approve or re-run the fork workflows? The code is unchanged. Thank you!

@spydon

spydon commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thank you for the contribution! postgres-meta's type generation is moving to the shared @supabase/postgrest-typegen package in supabase/sdk (see #1084), so open template fixes are being re-landed there. Your fix (importing NotRequired and TypeAlias from typing_extensions so generated modules work on Python 3.9 and 3.10) has been ported in supabase/sdk#124 with credit to this PR.

@spydon spydon closed this Aug 31, 2026
spydon added a commit to supabase/sdk that referenced this pull request Sep 1, 2026
…extensions

NotRequired only exists in typing from Python 3.11 and TypeAlias from
3.10, so the generated module failed to import on Python 3.9 and 3.10.
typing_extensions ships them for all supported versions and is already
a required dependency of pydantic, so the import is always available.

Ported from supabase/postgres-meta#1094
spydon added a commit to supabase/sdk that referenced this pull request Sep 1, 2026
…columns, composite nullability (#124)

## Summary

Ports the worthwhile Python generator fixes from postgres-meta's open
template PRs into this package (the templates are being deleted in favor
of this package in supabase/postgres-meta#1084, so open fixes there are
triaged and re-landed here). Four fixes, one commit each:

1. **Identifier escaping** (from supabase/postgres-meta#1082): enum
`Literal` labels and `Field(alias=...)` values were interpolated
unescaped, so a quote, backslash, or newline in a database name broke
the generated module. A shared `escapePythonString` helper (JSON
escaping, a strict subset of Python's) now covers all three
interpolation sites.
2. **Python 3.9/3.10 support** (from supabase/postgres-meta#1094):
`NotRequired` (3.11+) and `TypeAlias` (3.10+) now import from
`typing_extensions`, which is always installed as a required dependency
of pydantic.
3. **Deserialized json/jsonb** (from supabase/postgres-meta#1129):
`json`/`jsonb` map to pydantic's `JsonValue` instead of `Json[Any]`.
PostgREST returns these columns already deserialized, while `Json[Any]`
validates a JSON *string* and parses it, so every generated model with a
JSON column failed `model_validate` (supabase/supabase-py#1597).
4. **Composite type nullability** (the Python side of
supabase/postgres-meta#1063, reimplemented): composite type attributes
cannot carry NOT NULL constraints in Postgres, so their fields now emit
`Optional[...]`. The origin PR's Python hunks were dead code (an unused
`PythonDomain` class and a type-map entry for a name Postgres never
emits), so the actual fix was implemented instead of ported.

## Triage of origin PRs

| postgres-meta PR | Verdict | Reasoning |
|---|---|---|
| #1082 | Ported | Real invalid-syntax bug, correct approach. |
| #1094 | Ported | Import failure on Python 3.9/3.10, independently
verified by community comments on the PR. |
| #1129 | Ported | Every JSON column failed validation at runtime;
`JsonValue` is pydantic's native type for a parsed JSON value. |
| #1063 (python part) | Reimplemented | Real bug, but the PR's Python
changes did not actually fix it (dead code); the underlying fix is one
line in `typeToClass`. |
| #1072 (`frozen=True`) | Skipped | Author-labeled feature and an
opinionated behavior change that breaks consumers who mutate row models;
belongs behind a generator option if wanted. |
| #808 | Skipped | 2023 draft fully superseded by the
maintainer-authored template this package ports. |

## Validation

- Unit tests per fix (pathological enum labels and aliases, import block
assertions, json/jsonb mapping, composite `Optional` fields).
- Parity golden regenerated (39 lines): the `typing_extensions` import
split, 16 `Json[Any]` to `JsonValue` occurrences, and two composite
attributes gaining `Optional[...]`; reviewed line by line and the golden
gate was verified to actually trip on corruption.
- The regenerated golden imports cleanly under pydantic, passes `mypy`,
and runtime checks confirm deserialized JSON and `None` composite fields
now validate.
- `check-types`, `format-and-lint`, `knip`, `build`, `test` (97 pass,
includes Docker-backed introspection and parity) all green.
- Note: the nightly parity job against real postgres-meta will show this
intentional drift until postgres-meta consumes a release containing it
(supabase/postgres-meta#1084 replaces the templates with this package,
closing the gap).
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.

python typegen output fails to import on python 3.9 and 3.10 (NotRequired, TypeAlias from typing)

3 participants