Fix pydantic_schema_parser to handle Python 3.10+ union syntax (types.UnionType)

- Add support for types.UnionType in addition to typing.Union
- Fix AttributeError when processing str | None syntax
- Add comprehensive tests for both union syntaxes
- Handle types without __name__ attribute gracefully
- Resolves issue #3074

Co-Authored-By: João <joao@crewai.com>
This commit is contained in:
Devin AI
2025-06-26 16:26:03 +00:00
parent b09796cd3f
commit b4b6e0d803
2 changed files with 47 additions and 4 deletions

View File

@@ -92,3 +92,39 @@ def test_model_with_dict():
dict_field: Dict[str, int]
}"""
assert schema.strip() == expected_schema.strip()
def test_model_with_python310_union_syntax():
class UnionTypeModel(BaseModel):
union_field: str | None
multi_union_field: int | str | None
non_optional_union: int | str
parser = PydanticSchemaParser(model=UnionTypeModel)
schema = parser.get_schema()
expected_schema = """{
union_field: Optional[str],
multi_union_field: Optional[Union[int, str]],
non_optional_union: Union[int, str]
}"""
assert schema.strip() == expected_schema.strip()
def test_mixed_union_syntax():
class MixedUnionModel(BaseModel):
traditional_optional: Optional[str]
new_union_syntax: str | None
traditional_union: Union[int, str]
new_multi_union: int | str | float
parser = PydanticSchemaParser(model=MixedUnionModel)
schema = parser.get_schema()
expected_schema = """{
traditional_optional: Optional[str],
new_union_syntax: Optional[str],
traditional_union: Union[int, str],
new_multi_union: Union[int, str, float]
}"""
assert schema.strip() == expected_schema.strip()