Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/py_avro_schema/_schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -1156,8 +1156,13 @@ def __init__(self, py_type: Type, namespace: Optional[str] = None, options: Opti
super().__init__(py_type, namespace=namespace, options=options)
py_type = _type_from_annotated(py_type)

# Try to get resolved type hints, but fall back to raw annotations if there are unresolved forward refs
try:
type_hints = get_type_hints(py_type, include_extras=True)
except NameError:
type_hints = py_type.__annotations__
self.py_fields: list[tuple[str, type]] = []
for k, v in py_type.__annotations__.items():
for k, v in type_hints.items():
self.py_fields.append((k, v))
# We store __init__ parameters with default values. They can be used as defaults for the record.
self.signature_fields = {
Expand Down
Empty file added tests/models/__init__.py
Empty file.
9 changes: 9 additions & 0 deletions tests/models/forward.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import annotations

Name = str


class PyClass:
"""For testing imports with future annotations"""

name: Name
17 changes: 17 additions & 0 deletions tests/test_plain_class.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,20 @@ class PyType:

expected = {"fields": [{"name": "details", "type": "string"}], "name": "PyType", "type": "record"}
assert_schema(PyType, expected)


def test_type_aliases():
Name = str

class PyClass:
name: Name

expected = {"fields": [{"name": "name", "type": "string"}], "name": "PyClass", "type": "record"}
assert_schema(PyClass, expected)


def test_type_aliases_future():
from tests.models.forward import PyClass

expected = {"fields": [{"name": "name", "type": "string"}], "name": "PyClass", "type": "record"}
assert_schema(PyClass, expected)