From dc4710b56cbd427ca47ea2da7b45b1f669c4d45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20M=2E=20Martins?= Date: Wed, 8 Dec 2021 22:52:25 +0100 Subject: [PATCH] Replacing encode_default instance check with strict type check (#3197) * Replacing encode_default instance check with strict type check * Adding change notes * Changing to dictionary indexing in tests * Adding explicit Enum check and returning its value --- changes/3190-joaommartins.md | 1 + pydantic/schema.py | 4 +++- tests/test_schema.py | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 changes/3190-joaommartins.md diff --git a/changes/3190-joaommartins.md b/changes/3190-joaommartins.md new file mode 100644 index 0000000..74af4f1 --- /dev/null +++ b/changes/3190-joaommartins.md @@ -0,0 +1 @@ +Always use `Enum` value as default in generated JSON schema. \ No newline at end of file diff --git a/pydantic/schema.py b/pydantic/schema.py index fd90121..727fc72 100644 --- a/pydantic/schema.py +++ b/pydantic/schema.py @@ -922,7 +922,9 @@ def multitypes_literal_field_for_schema(values: Tuple[Any, ...], field: ModelFie def encode_default(dft: Any) -> Any: - if isinstance(dft, (int, float, str)): + if isinstance(dft, Enum): + return dft.value + elif isinstance(dft, (int, float, str)): return dft elif sequence_like(dft): t = dft.__class__ diff --git a/tests/test_schema.py b/tests/test_schema.py index 709f4aa..709b468 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -1435,6 +1435,26 @@ def test_list_default(): } +def test_enum_str_default(): + class MyEnum(str, Enum): + FOO = 'foo' + + class UserModel(BaseModel): + friends: MyEnum = MyEnum.FOO + + assert UserModel.schema()['properties']['friends']['default'] is MyEnum.FOO.value + + +def test_enum_int_default(): + class MyEnum(IntEnum): + FOO = 1 + + class UserModel(BaseModel): + friends: MyEnum = MyEnum.FOO + + assert UserModel.schema()['properties']['friends']['default'] is MyEnum.FOO.value + + def test_dict_default(): class UserModel(BaseModel): friends: Dict[str, float] = {'a': 1.1, 'b': 2.2}