def get_sqlalchemy_type(field: ModelField) -> Any:
if isinstance(field.type_, type) and field.shape == SHAPE_SINGLETON:
+ # Check enums first as an enum can also be a str, needed by Pydantic/FastAPI
+ if issubclass(field.type_, Enum):
+ return sa_Enum(field.type_)
if issubclass(field.type_, str):
if field.field_info.max_length:
return AutoString(length=field.field_info.max_length)
return Interval
if issubclass(field.type_, time):
return Time
- if issubclass(field.type_, Enum):
- return sa_Enum(field.type_)
if issubclass(field.type_, bytes):
return LargeBinary
if issubclass(field.type_, Decimal):
"""
-class MyEnum1(enum.Enum):
+class MyEnum1(str, enum.Enum):
A = "A"
B = "B"
-class MyEnum2(enum.Enum):
+class MyEnum2(str, enum.Enum):
C = "C"
D = "D"
captured = capsys.readouterr()
assert "enum_field VARCHAR(1) NOT NULL" in captured.out
assert "CREATE TYPE" not in captured.out
+
+
+def test_json_schema_flat_model():
+ assert FlatModel.schema() == {
+ "title": "FlatModel",
+ "type": "object",
+ "properties": {
+ "id": {"title": "Id", "type": "string", "format": "uuid"},
+ "enum_field": {"$ref": "#/definitions/MyEnum1"},
+ },
+ "required": ["id", "enum_field"],
+ "definitions": {
+ "MyEnum1": {
+ "title": "MyEnum1",
+ "description": "An enumeration.",
+ "enum": ["A", "B"],
+ "type": "string",
+ }
+ },
+ }
+
+
+def test_json_schema_inherit_model():
+ assert InheritModel.schema() == {
+ "title": "InheritModel",
+ "type": "object",
+ "properties": {
+ "id": {"title": "Id", "type": "string", "format": "uuid"},
+ "enum_field": {"$ref": "#/definitions/MyEnum2"},
+ },
+ "required": ["id", "enum_field"],
+ "definitions": {
+ "MyEnum2": {
+ "title": "MyEnum2",
+ "description": "An enumeration.",
+ "enum": ["C", "D"],
+ "type": "string",
+ }
+ },
+ }