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;
}
if (event.name == "_set_cookie") {
cookies.set(event.payload.key, event.payload.value, { path: "/" });
return false;
}
if (event.name == "_remove_cookie") {
cookies.remove(event.payload.key, { path: "/", ...event.payload.options })
return false;
}
if (event.name == "_set_local_storage") {
localStorage.setItem(event.payload.key, event.payload.value);
cookies.remove(event.payload.key, { ...event.payload.options })
return false;
}

View File

@ -12,14 +12,12 @@ from .app import UploadFile as UploadFile
from .base import Base as Base
from .compiler.utils import get_asset_path
from .components import *
from .components.base.script import client_side
from .components.component import custom_component as memo
from .components.graphing import recharts as recharts
from .components.graphing.victory import data as data
from .config import Config as Config
from .config import DBConfig as DBConfig
from .constants import Env as Env
from .event import EVENT_ARG as EVENT_ARG
from .event import EventChain as EventChain
from .event import FileUpload as upload_files
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_local_storage as remove_local_storage
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_local_storage as set_local_storage
from .event import set_value as set_value
from .event import window_alert as window_alert
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 .vars import Var as 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 reflex.components.component import Component
from reflex.event import EventChain
from reflex.utils import console
from reflex.vars import BaseVar, Var
from reflex.vars import Var
class Script(Component):
@ -72,26 +70,3 @@ class Script(Component):
"on_ready": 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:
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 {
EventTriggers.ON_FOCUS: lambda: [],
EventTriggers.ON_BLUR: lambda: [],
@ -346,26 +323,8 @@ class Component(Base, ABC):
EventTriggers.ON_SCROLL: lambda: [],
EventTriggers.ON_MOUNT: 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:
"""Represent the component in React.

View File

@ -210,10 +210,6 @@ class FrontendEvent(Base):
value: Any = None
# The default event argument.
EVENT_ARG = BaseVar(_var_name="_e", _var_type=FrontendEvent, _var_is_local=True)
class FileUpload(Base):
"""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:
"""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
def remove_cookie(key: str, options: dict[str, Any] | None = None) -> EventSpec:
"""Remove a cookie on the frontend.
Args:
@ -354,6 +326,8 @@ def remove_cookie(key: str, options: dict[str, Any] = {}) -> EventSpec: # noqa:
Returns:
EventSpec: An event to remove a cookie.
"""
options = options or {}
options["path"] = options.get("path", "/")
return server_side(
"_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:
"""Set a value in the local storage on the frontend.
@ -409,7 +359,7 @@ def remove_local_storage(key: str) -> EventSpec:
"""
return server_side(
"_remove_local_storage",
get_fn_signature(clear_local_storage),
get_fn_signature(remove_local_storage),
key=key,
)

View File

@ -291,7 +291,7 @@ def format_prop(
TypeError: If the prop is not valid.
"""
# import here to avoid circular import.
from reflex.event import EVENT_ARG, EventChain
from reflex.event import EventChain
try:
# Handle var props.
@ -304,17 +304,14 @@ def format_prop(
# Handle event props.
elif isinstance(prop, EventChain):
if prop.args_spec is None:
arg_def = f"{EVENT_ARG}"
sig = inspect.signature(prop.args_spec) # type: ignore
if sig.parameters:
arg_def = ",".join(f"_{p}" for p in sig.parameters)
arg_def = f"({arg_def})"
else:
sig = inspect.signature(prop.args_spec)
if sig.parameters:
arg_def = ",".join(f"_{p}" for p in sig.parameters)
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)"
# 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])
event = f"addEvents([{chain}], {arg_def})"

View File

@ -1518,34 +1518,3 @@ class NoRenderImportVar(ImportVar):
"""A import that doesn't need to be rendered."""
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.layout.box import Box
from reflex.constants import EventTriggers
from reflex.event import EVENT_ARG, EventHandler
from reflex.event import EventHandler
from reflex.state import State
from reflex.style import Style
from reflex.utils import imports
@ -64,15 +64,16 @@ def component2() -> Type[Component]:
# A test list prop.
arr: Var[List[str]]
def get_controlled_triggers(self) -> Dict[str, Var]:
def get_event_triggers(self) -> Dict[str, Any]:
"""Test controlled triggers.
Returns:
Test controlled triggers.
"""
return {
"on_open": EVENT_ARG,
"on_close": EVENT_ARG,
**super().get_event_triggers(),
"on_open": lambda e0: [e0],
"on_close": lambda e0: [e0],
}
def _get_imports(self) -> imports.ImportDict:
@ -361,17 +362,6 @@ def test_var_props(component1, test_state):
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):
"""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.
with pytest.raises(ValueError):
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.
component2.create(on_click=lambda: test_state.do_something_arg(1))
component2.create(
@ -509,10 +503,6 @@ def test_invalid_event_handler_args(component2, test_state):
# This is okay.
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):
"""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():
"""Test the event remove_cookie."""
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][1].equals(Var.create_safe("testkey"))
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 (
format.format_event(spec)
== 'Event("_remove_cookie", {key:`testkey`,options:{}})'
== 'Event("_remove_cookie", {key:`testkey`,options:{"path": "/"}})'
)
def test_remove_cookie_with_options():
"""Test the event remove_cookie with options."""
options = {
"path": "/",
"path": "/foo",
"domain": "example.com",
"secure": True,
"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():
"""Test the event clear_local_storage."""
spec = event.clear_local_storage()

View File

@ -12,7 +12,6 @@ from reflex.vars import (
ComputedVar,
ImportVar,
Var,
get_local_storage,
)
test_vars = [
@ -626,62 +625,6 @@ def test_import_var(import_var, 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(
"out, expected",
[

View File

@ -4,7 +4,7 @@ from typing import Any
import pytest
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.utils import format
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}}',
),
(
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"}}'),
(BaseVar(_var_name="var", _var_type="int"), "{var}"),
(