Remove 0.3.0 deprecated features (#1947)

This commit is contained in:
Elijah Ahianyo 2023-10-19 16:44:32 +00:00 committed by GitHub
parent b652d40ee5
commit 06bdf9ed8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 27 additions and 307 deletions

View File

@ -144,18 +144,8 @@ export const applyEvent = async (event, socket) => {
return false; return false;
} }
if (event.name == "_set_cookie") {
cookies.set(event.payload.key, event.payload.value, { path: "/" });
return false;
}
if (event.name == "_remove_cookie") { if (event.name == "_remove_cookie") {
cookies.remove(event.payload.key, { path: "/", ...event.payload.options }) cookies.remove(event.payload.key, { ...event.payload.options })
return false;
}
if (event.name == "_set_local_storage") {
localStorage.setItem(event.payload.key, event.payload.value);
return false; return false;
} }

View File

@ -12,14 +12,12 @@ from .app import UploadFile as UploadFile
from .base import Base as Base from .base import Base as Base
from .compiler.utils import get_asset_path from .compiler.utils import get_asset_path
from .components import * from .components import *
from .components.base.script import client_side
from .components.component import custom_component as memo from .components.component import custom_component as memo
from .components.graphing import recharts as recharts from .components.graphing import recharts as recharts
from .components.graphing.victory import data as data from .components.graphing.victory import data as data
from .config import Config as Config from .config import Config as Config
from .config import DBConfig as DBConfig from .config import DBConfig as DBConfig
from .constants import Env as Env from .constants import Env as Env
from .event import EVENT_ARG as EVENT_ARG
from .event import EventChain as EventChain from .event import EventChain as EventChain
from .event import FileUpload as upload_files from .event import FileUpload as upload_files
from .event import background as background from .event import background as background
@ -31,9 +29,7 @@ from .event import redirect as redirect
from .event import remove_cookie as remove_cookie from .event import remove_cookie as remove_cookie
from .event import remove_local_storage as remove_local_storage from .event import remove_local_storage as remove_local_storage
from .event import set_clipboard as set_clipboard from .event import set_clipboard as set_clipboard
from .event import set_cookie as set_cookie
from .event import set_focus as set_focus from .event import set_focus as set_focus
from .event import set_local_storage as set_local_storage
from .event import set_value as set_value from .event import set_value as set_value
from .event import window_alert as window_alert from .event import window_alert as window_alert
from .middleware import Middleware as Middleware from .middleware import Middleware as Middleware
@ -48,4 +44,3 @@ from .style import color_mode as color_mode
from .style import toggle_color_mode as toggle_color_mode from .style import toggle_color_mode as toggle_color_mode
from .vars import Var as Var from .vars import Var as Var
from .vars import cached_var as cached_var from .vars import cached_var as cached_var
from .vars import get_local_storage as get_local_storage

View File

@ -7,9 +7,7 @@ from __future__ import annotations
from typing import Any, Union from typing import Any, Union
from reflex.components.component import Component from reflex.components.component import Component
from reflex.event import EventChain from reflex.vars import Var
from reflex.utils import console
from reflex.vars import BaseVar, Var
class Script(Component): class Script(Component):
@ -72,26 +70,3 @@ class Script(Component):
"on_ready": lambda: [], "on_ready": lambda: [],
"on_error": lambda: [], "on_error": lambda: [],
} }
def client_side(javascript_code) -> Var[EventChain]:
"""Create an event handler that executes arbitrary javascript code.
The provided code will have access to `args`, which come from the event itself.
The code may call functions or reference variables defined in a previously
included rx.script function.
Args:
javascript_code: The code to execute.
Returns:
An EventChain, passable to any component, that will execute the client side javascript
when triggered.
"""
console.deprecate(
feature_name="rx.client_side",
reason="and has been replaced by rx.call_script, which can be used from backend EventHandler too",
deprecation_version="0.2.9",
removal_version="0.3.0",
)
return BaseVar(_var_name=f"...args => {{{javascript_code}}}", _var_type=EventChain)

View File

@ -307,29 +307,6 @@ class Component(Base, ABC):
Returns: Returns:
The event triggers. The event triggers.
""" """
deprecated_triggers = self.get_triggers()
if deprecated_triggers:
console.deprecate(
feature_name=f"get_triggers ({self.__class__.__name__})",
reason="replaced by get_event_triggers",
deprecation_version="0.2.8",
removal_version="0.3.1",
)
deprecated_triggers = {
trigger: lambda: [] for trigger in deprecated_triggers
}
else:
deprecated_triggers = {}
deprecated_controlled_triggers = self.get_controlled_triggers()
if deprecated_controlled_triggers:
console.deprecate(
feature_name=f"get_controlled_triggers ({self.__class__.__name__})",
reason="replaced by get_event_triggers",
deprecation_version="0.2.8",
removal_version="0.3.0",
)
return { return {
EventTriggers.ON_FOCUS: lambda: [], EventTriggers.ON_FOCUS: lambda: [],
EventTriggers.ON_BLUR: lambda: [], EventTriggers.ON_BLUR: lambda: [],
@ -346,26 +323,8 @@ class Component(Base, ABC):
EventTriggers.ON_SCROLL: lambda: [], EventTriggers.ON_SCROLL: lambda: [],
EventTriggers.ON_MOUNT: lambda: [], EventTriggers.ON_MOUNT: lambda: [],
EventTriggers.ON_UNMOUNT: lambda: [], EventTriggers.ON_UNMOUNT: lambda: [],
**deprecated_triggers,
**deprecated_controlled_triggers,
} }
def get_triggers(self) -> Set[str]:
"""Get the triggers for non controlled events [DEPRECATED].
Returns:
A set of non controlled triggers.
"""
return set()
def get_controlled_triggers(self) -> Dict[str, Var]:
"""Get the event triggers that pass the component's value to the handler [DEPRECATED].
Returns:
A dict mapping the event trigger to the var that is passed to the handler.
"""
return {}
def __repr__(self) -> str: def __repr__(self) -> str:
"""Represent the component in React. """Represent the component in React.

View File

@ -210,10 +210,6 @@ class FrontendEvent(Base):
value: Any = None value: Any = None
# The default event argument.
EVENT_ARG = BaseVar(_var_name="_e", _var_type=FrontendEvent, _var_is_local=True)
class FileUpload(Base): class FileUpload(Base):
"""Class to represent a file upload.""" """Class to represent a file upload."""
@ -320,31 +316,7 @@ def set_value(ref: str, value: Any) -> EventSpec:
) )
def set_cookie(key: str, value: str) -> EventSpec: def remove_cookie(key: str, options: dict[str, Any] | None = None) -> EventSpec:
"""Set a cookie on the frontend.
Args:
key: The key identifying the cookie.
value: The value contained in the cookie.
Returns:
EventSpec: An event to set a cookie.
"""
console.deprecate(
feature_name=f"rx.set_cookie",
reason="and has been replaced by rx.Cookie, which can be used as a state var",
deprecation_version="0.2.9",
removal_version="0.3.0",
)
return server_side(
"_set_cookie",
get_fn_signature(set_cookie),
key=key,
value=value,
)
def remove_cookie(key: str, options: dict[str, Any] = {}) -> EventSpec: # noqa: B006
"""Remove a cookie on the frontend. """Remove a cookie on the frontend.
Args: Args:
@ -354,6 +326,8 @@ def remove_cookie(key: str, options: dict[str, Any] = {}) -> EventSpec: # noqa:
Returns: Returns:
EventSpec: An event to remove a cookie. EventSpec: An event to remove a cookie.
""" """
options = options or {}
options["path"] = options.get("path", "/")
return server_side( return server_side(
"_remove_cookie", "_remove_cookie",
get_fn_signature(remove_cookie), get_fn_signature(remove_cookie),
@ -362,30 +336,6 @@ def remove_cookie(key: str, options: dict[str, Any] = {}) -> EventSpec: # noqa:
) )
def set_local_storage(key: str, value: str) -> EventSpec:
"""Set a value in the local storage on the frontend.
Args:
key: The key identifying the variable in the local storage.
value: The value contained in the local storage.
Returns:
EventSpec: An event to set a key-value in local storage.
"""
console.deprecate(
feature_name=f"rx.set_local_storage",
reason="and has been replaced by rx.LocalStorage, which can be used as a state var",
deprecation_version="0.2.9",
removal_version="0.3.0",
)
return server_side(
"_set_local_storage",
get_fn_signature(set_local_storage),
key=key,
value=value,
)
def clear_local_storage() -> EventSpec: def clear_local_storage() -> EventSpec:
"""Set a value in the local storage on the frontend. """Set a value in the local storage on the frontend.
@ -409,7 +359,7 @@ def remove_local_storage(key: str) -> EventSpec:
""" """
return server_side( return server_side(
"_remove_local_storage", "_remove_local_storage",
get_fn_signature(clear_local_storage), get_fn_signature(remove_local_storage),
key=key, key=key,
) )

View File

@ -291,7 +291,7 @@ def format_prop(
TypeError: If the prop is not valid. TypeError: If the prop is not valid.
""" """
# import here to avoid circular import. # import here to avoid circular import.
from reflex.event import EVENT_ARG, EventChain from reflex.event import EventChain
try: try:
# Handle var props. # Handle var props.
@ -304,17 +304,14 @@ def format_prop(
# Handle event props. # Handle event props.
elif isinstance(prop, EventChain): elif isinstance(prop, EventChain):
if prop.args_spec is None: sig = inspect.signature(prop.args_spec) # type: ignore
arg_def = f"{EVENT_ARG}" if sig.parameters:
arg_def = ",".join(f"_{p}" for p in sig.parameters)
arg_def = f"({arg_def})"
else: else:
sig = inspect.signature(prop.args_spec) # add a default argument for addEvents if none were specified in prop.args_spec
if sig.parameters: # used to trigger the preventDefault() on the event.
arg_def = ",".join(f"_{p}" for p in sig.parameters) arg_def = "(_e)"
arg_def = f"({arg_def})"
else:
# add a default argument for addEvents if none were specified in prop.args_spec
# used to trigger the preventDefault() on the event.
arg_def = "(_e)"
chain = ",".join([format_event(event) for event in prop.events]) chain = ",".join([format_event(event) for event in prop.events])
event = f"addEvents([{chain}], {arg_def})" event = f"addEvents([{chain}], {arg_def})"

View File

@ -1518,34 +1518,3 @@ class NoRenderImportVar(ImportVar):
"""A import that doesn't need to be rendered.""" """A import that doesn't need to be rendered."""
render: Optional[bool] = False render: Optional[bool] = False
def get_local_storage(key: Var | str | None = None) -> BaseVar:
"""Provide a base var as payload to get local storage item(s).
Args:
key: Key to obtain value in the local storage.
Returns:
A BaseVar of the local storage method/function to call.
Raises:
TypeError: if the wrong key type is provided.
"""
console.deprecate(
feature_name=f"rx.get_local_storage",
reason="and has been replaced by rx.LocalStorage, which can be used as a state var",
deprecation_version="0.2.9",
removal_version="0.3.0",
)
if key is not None:
if not (isinstance(key, Var) and key._var_type == str) and not isinstance(
key, str
):
type_ = type(key) if not isinstance(key, Var) else key._var_type
raise TypeError(
f"Local storage keys can only be of type `str` or `var` of type `str`. Got `{type_}` instead."
)
key = key._var_full_name if isinstance(key, Var) else format.wrap(key, "'")
return BaseVar(_var_name=f"localStorage.getItem({key})", _var_type=str)
return BaseVar(_var_name="getAllLocalStorageItems()", _var_type=Dict)

View File

@ -7,7 +7,7 @@ from reflex.base import Base
from reflex.components.component import Component, CustomComponent, custom_component from reflex.components.component import Component, CustomComponent, custom_component
from reflex.components.layout.box import Box from reflex.components.layout.box import Box
from reflex.constants import EventTriggers from reflex.constants import EventTriggers
from reflex.event import EVENT_ARG, EventHandler from reflex.event import EventHandler
from reflex.state import State from reflex.state import State
from reflex.style import Style from reflex.style import Style
from reflex.utils import imports from reflex.utils import imports
@ -64,15 +64,16 @@ def component2() -> Type[Component]:
# A test list prop. # A test list prop.
arr: Var[List[str]] arr: Var[List[str]]
def get_controlled_triggers(self) -> Dict[str, Var]: def get_event_triggers(self) -> Dict[str, Any]:
"""Test controlled triggers. """Test controlled triggers.
Returns: Returns:
Test controlled triggers. Test controlled triggers.
""" """
return { return {
"on_open": EVENT_ARG, **super().get_event_triggers(),
"on_close": EVENT_ARG, "on_open": lambda e0: [e0],
"on_close": lambda e0: [e0],
} }
def _get_imports(self) -> imports.ImportDict: def _get_imports(self) -> imports.ImportDict:
@ -361,17 +362,6 @@ def test_var_props(component1, test_state):
assert c1.number.equals(test_state.num) assert c1.number.equals(test_state.num)
def test_get_controlled_triggers(component1, component2):
"""Test that we can get the controlled triggers of a component.
Args:
component1: A test component.
component2: A test component.
"""
assert component1().get_controlled_triggers() == dict()
assert set(component2().get_controlled_triggers()) == {"on_open", "on_close"}
def test_get_event_triggers(component1, component2): def test_get_event_triggers(component1, component2):
"""Test that we can get the triggers of a component. """Test that we can get the triggers of a component.
@ -496,6 +486,10 @@ def test_invalid_event_handler_args(component2, test_state):
# This is not okay. # This is not okay.
with pytest.raises(ValueError): with pytest.raises(ValueError):
component2.create(on_click=test_state.do_something_arg) component2.create(on_click=test_state.do_something_arg)
component2.create(on_open=test_state.do_something)
component2.create(
on_open=[test_state.do_something_arg, test_state.do_something]
)
# However lambdas are okay. # However lambdas are okay.
component2.create(on_click=lambda: test_state.do_something_arg(1)) component2.create(on_click=lambda: test_state.do_something_arg(1))
component2.create( component2.create(
@ -509,10 +503,6 @@ def test_invalid_event_handler_args(component2, test_state):
# This is okay. # This is okay.
component2.create(on_open=test_state.do_something_arg) component2.create(on_open=test_state.do_something_arg)
# do_something is allowed and will simply run while ignoring the arg
component2.create(on_open=test_state.do_something)
component2.create(on_open=[test_state.do_something_arg, test_state.do_something])
def test_get_hooks_nested(component1, component2, component3): def test_get_hooks_nested(component1, component2, component3):
"""Test that a component returns hooks from child components. """Test that a component returns hooks from child components.

View File

@ -206,21 +206,6 @@ def test_set_value():
) )
def test_set_cookie():
"""Test the event set_cookie."""
spec = event.set_cookie("testkey", "testvalue")
assert isinstance(spec, EventSpec)
assert spec.handler.fn.__qualname__ == "_set_cookie"
assert spec.args[0][0].equals(Var.create_safe("key"))
assert spec.args[0][1].equals(Var.create_safe("testkey"))
assert spec.args[1][0].equals(Var.create_safe("value"))
assert spec.args[1][1].equals(Var.create_safe("testvalue"))
assert (
format.format_event(spec)
== 'Event("_set_cookie", {key:`testkey`,value:`testvalue`})'
)
def test_remove_cookie(): def test_remove_cookie():
"""Test the event remove_cookie.""" """Test the event remove_cookie."""
spec = event.remove_cookie("testkey") spec = event.remove_cookie("testkey")
@ -229,17 +214,17 @@ def test_remove_cookie():
assert spec.args[0][0].equals(Var.create_safe("key")) assert spec.args[0][0].equals(Var.create_safe("key"))
assert spec.args[0][1].equals(Var.create_safe("testkey")) assert spec.args[0][1].equals(Var.create_safe("testkey"))
assert spec.args[1][0].equals(Var.create_safe("options")) assert spec.args[1][0].equals(Var.create_safe("options"))
assert spec.args[1][1].equals(Var.create_safe({})) assert spec.args[1][1].equals(Var.create_safe({"path": "/"}))
assert ( assert (
format.format_event(spec) format.format_event(spec)
== 'Event("_remove_cookie", {key:`testkey`,options:{}})' == 'Event("_remove_cookie", {key:`testkey`,options:{"path": "/"}})'
) )
def test_remove_cookie_with_options(): def test_remove_cookie_with_options():
"""Test the event remove_cookie with options.""" """Test the event remove_cookie with options."""
options = { options = {
"path": "/", "path": "/foo",
"domain": "example.com", "domain": "example.com",
"secure": True, "secure": True,
"sameSite": "strict", "sameSite": "strict",
@ -257,21 +242,6 @@ def test_remove_cookie_with_options():
) )
def test_set_local_storage():
"""Test the event set_local_storage."""
spec = event.set_local_storage("testkey", "testvalue")
assert isinstance(spec, EventSpec)
assert spec.handler.fn.__qualname__ == "_set_local_storage"
assert spec.args[0][0].equals(Var.create_safe("key"))
assert spec.args[0][1].equals(Var.create_safe("testkey"))
assert spec.args[1][0].equals(Var.create_safe("value"))
assert spec.args[1][1].equals(Var.create_safe("testvalue"))
assert (
format.format_event(spec)
== 'Event("_set_local_storage", {key:`testkey`,value:`testvalue`})'
)
def test_clear_local_storage(): def test_clear_local_storage():
"""Test the event clear_local_storage.""" """Test the event clear_local_storage."""
spec = event.clear_local_storage() spec = event.clear_local_storage()

View File

@ -12,7 +12,6 @@ from reflex.vars import (
ComputedVar, ComputedVar,
ImportVar, ImportVar,
Var, Var,
get_local_storage,
) )
test_vars = [ test_vars = [
@ -626,62 +625,6 @@ def test_import_var(import_var, expected):
assert import_var.name == expected assert import_var.name == expected
@pytest.mark.parametrize(
"key, expected",
[
(
"test_key",
BaseVar(_var_name="localStorage.getItem('test_key')", _var_type=str),
),
(
BaseVar(_var_name="key_var", _var_type=str),
BaseVar(_var_name="localStorage.getItem(key_var)", _var_type=str),
),
(
BaseState.val,
BaseVar(_var_name="localStorage.getItem(base_state.val)", _var_type=str),
),
(None, BaseVar(_var_name="getAllLocalStorageItems()", _var_type=Dict)),
],
)
def test_get_local_storage(key, expected):
"""Test that the right BaseVar is return when get_local_storage is called.
Args:
key: Local storage key.
expected: expected BaseVar.
"""
local_storage = get_local_storage(key)
assert local_storage._var_name == expected._var_name
assert local_storage._var_type == expected._var_type
@pytest.mark.parametrize(
"key",
[
["list", "values"],
{"name": "dict"},
10,
BaseVar(_var_name="key_var", _var_type=List),
BaseVar(_var_name="key_var", _var_type=Dict[str, str]),
],
)
def test_get_local_storage_raise_error(key):
"""Test that a type error is thrown when the wrong key type is provided.
Args:
key: Local storage key.
"""
with pytest.raises(TypeError) as err:
get_local_storage(key)
type_ = type(key) if not isinstance(key, Var) else key._var_type
assert (
err.value.args[0]
== f"Local storage keys can only be of type `str` or `var` of type `str`. Got `{type_}` instead."
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"out, expected", "out, expected",
[ [

View File

@ -4,7 +4,7 @@ from typing import Any
import pytest import pytest
from reflex.components.tags.tag import Tag from reflex.components.tags.tag import Tag
from reflex.event import EVENT_ARG, EventChain, EventHandler, EventSpec from reflex.event import EventChain, EventHandler, EventSpec
from reflex.style import Style from reflex.style import Style
from reflex.utils import format from reflex.utils import format
from reflex.vars import BaseVar, Var from reflex.vars import BaseVar, Var
@ -290,24 +290,6 @@ def test_format_cond(condition: str, true_value: str, false_value: str, expected
}, },
r'{{"a": "foo \"{ \"bar\" }\" baz", "b": val}}', r'{{"a": "foo \"{ \"bar\" }\" baz", "b": val}}',
), ),
(
EventChain(
events=[EventSpec(handler=EventHandler(fn=mock_event))], args_spec=None
),
'{_e => addEvents([Event("mock_event", {})], _e)}',
),
(
EventChain(
events=[
EventSpec(
handler=EventHandler(fn=mock_event),
args=((Var.create_safe("arg"), EVENT_ARG.target.value),),
)
],
args_spec=None,
),
'{_e => addEvents([Event("mock_event", {arg:_e.target.value})], _e)}',
),
({"a": "red", "b": "blue"}, '{{"a": "red", "b": "blue"}}'), ({"a": "red", "b": "blue"}, '{{"a": "red", "b": "blue"}}'),
(BaseVar(_var_name="var", _var_type="int"), "{var}"), (BaseVar(_var_name="var", _var_type="int"), "{var}"),
( (