Skip to content

Nullable enums from JSON Schema to TypedDicts are missing | None #2986

@sevanteri

Description

@sevanteri

Describe the bug
Nullable enums are not behaving consistently when generating TypedDicts.

To Reproduce

Example schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "TestModel",
  "type": "object",
  "definitions": {
    "StatusEnum": {
      "type": ["string", "null"],
      "enum": ["active", "inactive", null]
    }
  },
  "properties": {
    "required_inline": {
      "type": ["string", "null"],
      "enum": ["yes", "no", null]
    },
    "required_ref": {
      "$ref": "#/definitions/StatusEnum"
    },
    "optional_inline": {
      "type": ["string", "null"],
      "enum": ["pending", "completed", null]
    }
  },
  "required": ["required_inline", "required_ref"]
}

Used commandline:

datamodel-codegen \
    --input-file-type jsonschema \
    --input test_schema.json \
    --output-model-type typing.TypedDict \
    --output generated_model.py

Generated code:

from __future__ import annotations

from typing import Literal, TypeAlias, TypedDict

from typing_extensions import NotRequired

StatusEnum: TypeAlias = Literal['active', 'inactive']


class TestModel(TypedDict):
    required_inline: Literal['yes', 'no'] | None
    required_ref: StatusEnum
    optional_inline: NotRequired[Literal['pending', 'completed']]

The type for required_inline is the only one here that is working as expected.

Expected behavior
Expect the generated code to include None in the StatusEnum type alias, and for optional_inline field's type.

Expected code:

from __future__ import annotations

from typing import Literal, TypeAlias, TypedDict

from typing_extensions import NotRequired

StatusEnum: TypeAlias = Literal['active', 'inactive'] | None


class TestModel(TypedDict):
    required_inline: Literal['yes', 'no'] | None
    required_ref: StatusEnum
    optional_inline: NotRequired[Literal['pending', 'completed'] | None]

Version:

  • Python version: 3.12
  • datamodel-code-generator version: 0.53.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions