Skip to content

Commit f6fab94

Browse files
authored
Remove 090 deprecations (#6292)
* remove state_auto_setters deprecations * delay router data url deprecations * remove overlay_component * delay Passing strings to disable_plugins * remove codeblock * remove Non-string keys in get_value * fix tests * deprecate state_auto_setters * precommit * remove Overriding default primary key * adjust tests
1 parent ea90a03 commit f6fab94

File tree

11 files changed

+96
-225
lines changed

11 files changed

+96
-225
lines changed

packages/reflex-base/src/reflex_base/config.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ class BaseConfig:
238238

239239
env_file: str | None = None
240240

241-
state_auto_setters: bool | None = None
241+
state_auto_setters: bool = False
242242

243243
show_built_with_reflex: bool | None = None
244244

@@ -352,6 +352,21 @@ def _post_init(self, **kwargs):
352352
if not self._skip_plugins_checks:
353353
self._add_builtin_plugins()
354354

355+
# Warn if state_auto_setters is explicitly set.
356+
if "state_auto_setters" in kwargs:
357+
if kwargs["state_auto_setters"]:
358+
reason = (
359+
"auto setters will be removed; use explicit event handlers instead"
360+
)
361+
else:
362+
reason = "state_auto_setters=False is already the default and the option will be removed"
363+
console.deprecate(
364+
feature_name="state_auto_setters",
365+
reason=reason,
366+
deprecation_version="0.9.0",
367+
removal_version="1.0",
368+
)
369+
355370
# Update default URLs if ports were set
356371
kwargs.update(env_kwargs)
357372
self._non_default_attributes = set(kwargs.keys())
@@ -381,7 +396,7 @@ def _normalize_disable_plugins(self):
381396
feature_name="Passing strings to disable_plugins",
382397
reason="pass Plugin classes directly instead, e.g. disable_plugins=[SitemapPlugin]",
383398
deprecation_version="0.8.28",
384-
removal_version="0.9.0",
399+
removal_version="1.0",
385400
)
386401
try:
387402
from reflex_base.environment import interpret_plugin_class_env

packages/reflex-base/src/reflex_base/utils/compat.py

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import sys
44
from collections.abc import Mapping
5-
from typing import TYPE_CHECKING, Any
6-
7-
if TYPE_CHECKING:
8-
from pydantic.fields import FieldInfo
5+
from typing import Any
96

107

118
async def windows_hot_reload_lifespan_hack():
@@ -51,19 +48,3 @@ def annotations_from_namespace(namespace: Mapping[str, Any]) -> dict[str, Any]:
5148
if annotate := get_annotate_from_class_namespace(namespace):
5249
return call_annotate_function(annotate, format=Format.FORWARDREF)
5350
return namespace.get("__annotations__", {})
54-
55-
56-
def sqlmodel_field_has_primary_key(field_info: "FieldInfo") -> bool:
57-
"""Determines if a field is a primary.
58-
59-
Args:
60-
field_info: a rx.model field
61-
62-
Returns:
63-
If field_info is a primary key (Bool)
64-
"""
65-
if getattr(field_info, "primary_key", None) is True:
66-
return True
67-
if getattr(field_info, "sa_column", None) is None:
68-
return False
69-
return bool(getattr(field_info.sa_column, "primary_key", None)) # pyright: ignore[reportAttributeAccessIssue]

packages/reflex-components-markdown/src/reflex_components_markdown/markdown.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
field,
1818
)
1919
from reflex_base.components.tags.tag import Tag
20-
from reflex_base.utils import console
2120
from reflex_base.utils.imports import ImportDict, ImportTypes, ImportVar
2221
from reflex_base.vars.base import LiteralVar, Var, VarData
2322
from reflex_base.vars.number import ternary_operation
@@ -242,14 +241,6 @@ def create(
242241

243242
# Update the base component map with the custom component map.
244243
component_map = {**get_base_component_map(), **props.pop("component_map", {})}
245-
if "codeblock" in component_map:
246-
console.deprecate(
247-
feature_name="'codeblock' in component_map",
248-
reason="Use 'pre' instead of 'codeblock' to customize code block rendering in markdown",
249-
deprecation_version="0.8.25",
250-
removal_version="0.9.0",
251-
)
252-
component_map["pre"] = component_map.pop("codeblock")
253244

254245
# Get the markdown source.
255246
src = children[0]

pyi_hashes.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.pyi": "e10210239ce7dc18980e70eec19b9353",
4141
"packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.pyi": "2a93782c63e82a6939411273fe2486d9",
4242
"packages/reflex-components-lucide/src/reflex_components_lucide/icon.pyi": "f654cc9cb305712b485fcd676935c0c1",
43-
"packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "9c11bca2c4c5b722f55aba969f383e74",
43+
"packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "2d6efa2d5f2586a7036d606a24fb425d",
4444
"packages/reflex-components-moment/src/reflex_components_moment/moment.pyi": "ad4b084d94e50311f761d69b3173e357",
4545
"packages/reflex-components-plotly/src/reflex_components_plotly/plotly.pyi": "241b80584f3e029145e6e003d1c476f2",
4646
"packages/reflex-components-radix/src/reflex_components_radix/__init__.pyi": "b2f485bfde4978047b7b944cf15d92cb",

reflex/app.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,6 @@ class App(MiddlewareMixin, LifespanMixin):
332332

333333
reset_style: bool = dataclasses.field(default=True)
334334

335-
overlay_component: Component | ComponentCallable | None = dataclasses.field(
336-
default=None
337-
)
338-
339335
app_wraps: dict[tuple[int, str], Callable[[bool], Component | None]] = (
340336
dataclasses.field(
341337
default_factory=lambda: {
@@ -1092,22 +1088,6 @@ def _add_overlay_to_component(
10921088

10931089
return Fragment.create(overlay_component, *children)
10941090

1095-
def _setup_overlay_component(self):
1096-
"""If a State is not used and no overlay_component is specified, do not render the connection modal."""
1097-
if self.overlay_component is None:
1098-
return
1099-
console.deprecate(
1100-
feature_name="overlay_component",
1101-
reason="Use `extra_app_wraps` to add the overlay component instead.",
1102-
deprecation_version="0.8.2",
1103-
removal_version="0.9.0",
1104-
)
1105-
overlay_component = self._generate_component(self.overlay_component)
1106-
for k, component in self._pages.items():
1107-
self._pages[k] = self._add_overlay_to_component(
1108-
component, overlay_component
1109-
)
1110-
11111091
def _setup_sticky_badge(self):
11121092
"""Add the sticky badge to the app."""
11131093
from reflex_base.components.component import memo
@@ -1285,7 +1265,6 @@ def get_compilation_time() -> str:
12851265
self._add_optional_endpoints()
12861266

12871267
self._validate_var_dependencies()
1288-
self._setup_overlay_component()
12891268

12901269
if config.show_built_with_reflex is None:
12911270
if (

reflex/istate/data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def page(self) -> PageData:
239239
feature_name="RouterData.page",
240240
reason="Use RouterData.url instead",
241241
deprecation_version="0.8.1",
242-
removal_version="0.9.0",
242+
removal_version="1.0",
243243
)
244244
return self._page
245245

reflex/model.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
from reflex_base.utils import console
1414
from reflex_base.utils.serializers import serializer
1515

16-
from reflex.utils.compat import sqlmodel_field_has_primary_key
17-
1816
if TYPE_CHECKING:
1917
from typing import TypeVar
2018

@@ -369,26 +367,6 @@ class Model(sqlmodel.SQLModel):
369367
"extra": "allow",
370368
}
371369

372-
@classmethod
373-
def __pydantic_init_subclass__(cls):
374-
"""Drop the default primary key field if any primary key field is defined."""
375-
non_default_primary_key_fields = [
376-
field_name
377-
for field_name, field_info in cls.model_fields.items()
378-
if field_name != "id" and sqlmodel_field_has_primary_key(field_info)
379-
]
380-
if non_default_primary_key_fields:
381-
cls.model_fields.pop("id", None)
382-
console.deprecate(
383-
feature_name="Overriding default primary key",
384-
reason=(
385-
"Register sqlmodel.SQLModel classes with `@rx.ModelRegistry.register`"
386-
),
387-
deprecation_version="0.8.15",
388-
removal_version="0.9.0",
389-
)
390-
super().__pydantic_init_subclass__()
391-
392370
@staticmethod
393371
def create_all():
394372
"""Create all the tables."""

reflex/state.py

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -222,20 +222,8 @@ def __call__(self, *args: Any) -> EventSpec:
222222
EventHandlerValueError: If the given Var name is not a str
223223
NotImplementedError: If the setter for the given Var is async
224224
"""
225-
from reflex_base.config import get_config
226225
from reflex_base.utils.exceptions import EventHandlerValueError
227226

228-
config = get_config()
229-
if config.state_auto_setters is None and self.state is not None:
230-
console.deprecate(
231-
feature_name="state_auto_setters defaulting to True",
232-
reason="The default value will be changed to False in a future release. Set state_auto_setters explicitly or define setters explicitly. "
233-
f"Used {self.state.__name__}.setvar without defining it.",
234-
deprecation_version="0.8.9",
235-
removal_version="0.9.0",
236-
dedupe=True,
237-
)
238-
239227
if args:
240228
if not isinstance(args[0], str):
241229
msg = f"Var name must be passed as a string, got {args[0]!r}"
@@ -1073,7 +1061,7 @@ def _init_var(cls, name: str, prop: Var):
10731061
)
10741062
raise VarTypeError(msg)
10751063
cls._set_var(name, prop)
1076-
if cls.is_user_defined() and get_config().state_auto_setters is not False:
1064+
if cls.is_user_defined() and get_config().state_auto_setters is True:
10771065
cls._create_setter(name, prop)
10781066
cls._set_default_value(name, prop)
10791067

@@ -1170,29 +1158,8 @@ def _create_setter(cls, name: str, prop: Var):
11701158
name: The name of the var.
11711159
prop: The var to create a setter for.
11721160
"""
1173-
from reflex_base.config import get_config
1174-
1175-
config = get_config()
11761161
create_event_handler_kwargs = {}
11771162

1178-
if config.state_auto_setters is None:
1179-
1180-
class EventHandlerDeprecatedSetter(EventHandler):
1181-
def __call__(self, *args, **kwargs):
1182-
console.deprecate(
1183-
feature_name="state_auto_setters defaulting to True",
1184-
reason="The default value will be changed to False in a future release. Set state_auto_setters explicitly or define setters explicitly. "
1185-
f"Used {setter_name} in {cls.__name__} without defining it.",
1186-
deprecation_version="0.8.9",
1187-
removal_version="0.9.0",
1188-
dedupe=True,
1189-
)
1190-
return super().__call__(*args, **kwargs)
1191-
1192-
create_event_handler_kwargs["event_handler_cls"] = (
1193-
EventHandlerDeprecatedSetter
1194-
)
1195-
11961163
setter_name = Var._get_setter_name_for_name(name)
11971164
if setter_name not in cls.__dict__:
11981165
event_handler = cls._create_event_handler(
@@ -1874,19 +1841,6 @@ def get_value(self, key: str) -> Any:
18741841
Raises:
18751842
TypeError: If the key is not a string or MutableProxy.
18761843
"""
1877-
if isinstance(key, MutableProxy):
1878-
# Legacy behavior from v0.7.14: handle non-string keys with deprecation warning
1879-
from reflex_base.utils import console
1880-
1881-
console.deprecate(
1882-
feature_name="Non-string keys in get_value",
1883-
reason="Passing non-string keys to get_value is deprecated and will no longer be supported",
1884-
deprecation_version="0.8.0",
1885-
removal_version="0.9.0",
1886-
)
1887-
1888-
return key.__wrapped__
1889-
18901844
if isinstance(key, str):
18911845
if isinstance(val := getattr(self, key), MutableProxy):
18921846
return val.__wrapped__

tests/units/test_app.py

Lines changed: 6 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
from reflex_base.vars.base import computed_var
2828
from reflex_components_core.base.bare import Bare
2929
from reflex_components_core.base.fragment import Fragment
30-
from reflex_components_core.core.cond import Cond
3130
from reflex_components_radix.themes.typography.text import Text
3231
from sqlalchemy.engine.base import Engine
3332
from starlette.applications import Starlette
@@ -37,7 +36,7 @@
3736

3837
import reflex as rx
3938
from reflex import AdminDash, constants
40-
from reflex.app import App, ComponentCallable, default_overlay_component, upload
39+
from reflex.app import App, ComponentCallable, upload
4140
from reflex.environment import environment
4241
from reflex.istate.manager.disk import StateManagerDisk
4342
from reflex.istate.manager.memory import StateManagerMemory
@@ -523,6 +522,11 @@ async def test_dynamic_var_event(
523522
clean_registration_context.register_base_state(test_state)
524523
state = test_state() # pyright: ignore [reportCallIssue]
525524
state.add_var("int_val", int, 0)
525+
526+
def set_int_val(self, value: int):
527+
self.int_val = value
528+
529+
state._add_event_handler("set_int_val", set_int_val)
526530
async with mock_base_state_event_processor as processor:
527531
await processor.enqueue(
528532
token,
@@ -1933,63 +1937,6 @@ async def test_process_events(
19331937
await mock_root_event_context.state_manager.close()
19341938

19351939

1936-
@pytest.mark.parametrize(
1937-
("state", "overlay_component", "exp_page_child"),
1938-
[
1939-
(None, default_overlay_component, Fragment),
1940-
(None, None, None),
1941-
(None, Text.create("foo"), Text),
1942-
(State, default_overlay_component, Fragment),
1943-
(State, None, None),
1944-
(State, Text.create("foo"), Text),
1945-
(State, lambda: Text.create("foo"), Text),
1946-
],
1947-
)
1948-
def test_overlay_component(
1949-
state: type[State] | None,
1950-
overlay_component: Component | ComponentCallable | None,
1951-
exp_page_child: type[Component] | None,
1952-
):
1953-
"""Test that the overlay component is set correctly.
1954-
1955-
Args:
1956-
state: The state class to pass to App.
1957-
overlay_component: The overlay_component to pass to App.
1958-
exp_page_child: The type of the expected child in the page fragment.
1959-
"""
1960-
app = App(_state=state, overlay_component=overlay_component)
1961-
app._setup_overlay_component()
1962-
if exp_page_child is None:
1963-
assert app.overlay_component is None
1964-
elif isinstance(exp_page_child, Fragment):
1965-
assert app.overlay_component is not None
1966-
generated_component = app._generate_component(app.overlay_component)
1967-
assert isinstance(generated_component, Fragment)
1968-
assert isinstance(
1969-
generated_component.children[0],
1970-
Cond, # ConnectionModal is a Cond under the hood
1971-
)
1972-
else:
1973-
assert app.overlay_component is not None
1974-
assert isinstance(
1975-
app._generate_component(app.overlay_component),
1976-
exp_page_child,
1977-
)
1978-
1979-
app.add_page(rx.box("Index"), route="/test")
1980-
# overlay components are wrapped during compile only
1981-
app._compile_page("test")
1982-
app._setup_overlay_component()
1983-
page = app._pages["test"]
1984-
1985-
if exp_page_child is not None:
1986-
assert len(page.children) == 4
1987-
children_types = (type(child) for child in page.children)
1988-
assert exp_page_child in children_types # pyright: ignore [reportOperatorIssue]
1989-
else:
1990-
assert len(page.children) == 3
1991-
1992-
19931940
@pytest.fixture
19941941
def compilable_app(tmp_path: Path) -> Generator[tuple[App, Path], None, None]:
19951942
"""Fixture for an app that can be compiled.

tests/units/test_model.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class ChildModel(Model):
5050

5151

5252
def test_default_primary_key(model_default_primary: Model):
53-
"""Test that if a primary key is not defined a default is added.
53+
"""Test that if no primary key is defined, an "id" field is added.
5454
5555
Args:
5656
model_default_primary: Fixture.
@@ -59,12 +59,12 @@ def test_default_primary_key(model_default_primary: Model):
5959

6060

6161
def test_custom_primary_key(model_custom_primary: Model):
62-
"""Test that if a primary key is defined no default key is added.
62+
"""Test that if a primary key is defined it is not overridden.
6363
6464
Args:
6565
model_custom_primary: Fixture.
6666
"""
67-
assert "id" not in type(model_custom_primary).model_fields
67+
assert "id" in type(model_custom_primary).model_fields
6868

6969

7070
@pytest.mark.filterwarnings(

0 commit comments

Comments
 (0)