Get attribute access type fix (#3803)

* add failing test

* catch unhandled NotImplementedError
This commit is contained in:
benedikt-bartscher 2024-08-29 18:45:24 +02:00 committed by GitHub
parent 8f396fc348
commit dd6feff13f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 52 additions and 1 deletions

View File

@ -240,9 +240,14 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
""" """
from reflex.model import Model from reflex.model import Model
attr = getattr(cls, name, None) try:
attr = getattr(cls, name, None)
except NotImplementedError:
attr = None
if hint := get_property_hint(attr): if hint := get_property_hint(attr):
return hint return hint
if ( if (
hasattr(cls, "__fields__") hasattr(cls, "__fields__")
and name in cls.__fields__ and name in cls.__fields__

View File

@ -94,6 +94,15 @@ class SQLAClass(SQLABase):
""" """
return self.name return self.name
@hybrid_property
def first_label(self) -> Optional[SQLALabel]:
"""First label property.
Returns:
First label
"""
return self.labels[0] if self.labels else None
class ModelClass(rx.Model): class ModelClass(rx.Model):
"""Test reflex model.""" """Test reflex model."""
@ -125,6 +134,15 @@ class ModelClass(rx.Model):
""" """
return self.name return self.name
@property
def first_label(self) -> Optional[SQLALabel]:
"""First label property.
Returns:
First label
"""
return self.labels[0] if self.labels else None
class BaseClass(rx.Base): class BaseClass(rx.Base):
"""Test rx.Base class.""" """Test rx.Base class."""
@ -156,6 +174,15 @@ class BaseClass(rx.Base):
""" """
return self.name return self.name
@property
def first_label(self) -> Optional[SQLALabel]:
"""First label property.
Returns:
First label
"""
return self.labels[0] if self.labels else None
class BareClass: class BareClass:
"""Bare python class.""" """Bare python class."""
@ -187,6 +214,15 @@ class BareClass:
""" """
return self.name return self.name
@property
def first_label(self) -> Optional[SQLALabel]:
"""First label property.
Returns:
First label
"""
return self.labels[0] if self.labels else None
@attrs.define @attrs.define
class AttrClass: class AttrClass:
@ -219,6 +255,15 @@ class AttrClass:
""" """
return self.name return self.name
@property
def first_label(self) -> Optional[SQLALabel]:
"""First label property.
Returns:
First label
"""
return self.labels[0] if self.labels else None
@pytest.fixture( @pytest.fixture(
params=[ params=[
@ -254,6 +299,7 @@ def cls(request: pytest.FixtureRequest) -> type:
pytest.param("dict_str_str", Dict[str, str], id="Dict[str, str]"), pytest.param("dict_str_str", Dict[str, str], id="Dict[str, str]"),
pytest.param("str_property", str, id="str_property"), pytest.param("str_property", str, id="str_property"),
pytest.param("str_or_int_property", Union[str, int], id="str_or_int_property"), pytest.param("str_or_int_property", Union[str, int], id="str_or_int_property"),
pytest.param("first_label", Optional[SQLALabel], id="first_label"),
], ],
) )
def test_get_attribute_access_type(cls: type, attr: str, expected: GenericType) -> None: def test_get_attribute_access_type(cls: type, attr: str, expected: GenericType) -> None: