mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
raise attribute error (#2443)
* raise attribute error * fix compute defaults
This commit is contained in:
@@ -7,14 +7,15 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Changed
|
||||
|
||||
- Setting attributes with a `compute_` method will now raise an `AttributeError` https://github.com/Textualize/textual/issues/2383
|
||||
- Unknown psuedo-selectors will now raise a tokenizer error (previously they were silently ignored) https://github.com/Textualize/textual/pull/2445
|
||||
|
||||
### Added
|
||||
|
||||
- Watch methods can now optionally be private https://github.com/Textualize/textual/issues/2382
|
||||
|
||||
### Changed
|
||||
|
||||
- Unknown psuedo-selectors will now raise a tokenizer error (previously they were silently ignored) https://github.com/Textualize/textual/pull/2445
|
||||
|
||||
## [0.22.3] - 2023-04-29
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -174,6 +174,12 @@ class Reactive(Generic[ReactiveType]):
|
||||
_rich_traceback_omit = True
|
||||
|
||||
self._initialize_reactive(obj, self.name)
|
||||
|
||||
if hasattr(obj, self.compute_name):
|
||||
raise AttributeError(
|
||||
f"Can't set {obj}.{self.name!r}; reactive attributes with a compute method are read-only"
|
||||
)
|
||||
|
||||
name = self.name
|
||||
current_value = getattr(obj, name)
|
||||
# Check for validate function
|
||||
@@ -276,7 +282,9 @@ class Reactive(Generic[ReactiveType]):
|
||||
compute_method = getattr(obj, f"compute_{compute}")
|
||||
except AttributeError:
|
||||
continue
|
||||
current_value = getattr(obj, f"_reactive_{compute}")
|
||||
current_value = getattr(
|
||||
obj, f"_reactive_{compute}", getattr(obj, f"_default_{compute}", None)
|
||||
)
|
||||
value = compute_method()
|
||||
setattr(obj, f"_reactive_{compute}", value)
|
||||
if value != current_value:
|
||||
|
||||
@@ -336,7 +336,6 @@ class ProgressBar(Widget, can_focus=False):
|
||||
self.show_percentage = show_percentage
|
||||
self.show_eta = show_eta
|
||||
|
||||
self.percentage = None
|
||||
self.total = total
|
||||
|
||||
def compose(self) -> ComposeResult:
|
||||
|
||||
@@ -356,6 +356,9 @@ async def test_compute():
|
||||
app.start = 10
|
||||
assert app.count_double == 14
|
||||
|
||||
with pytest.raises(AttributeError):
|
||||
app.count_double = 100
|
||||
|
||||
|
||||
async def test_watch_compute():
|
||||
"""Check that watching a computed attribute works."""
|
||||
|
||||
Reference in New Issue
Block a user