From 82a3498d021ff294bbc75edc3dc6d628b33ef9cd Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 13 Aug 2024 17:02:50 -0700 Subject: [PATCH] down to 20 errors --- reflex/components/tags/tag.py | 2 +- reflex/event.py | 4 +- reflex/ivars/object.py | 4 +- reflex/style.py | 3 +- reflex/utils/format.py | 11 --- reflex/vars.py | 9 ++- tests/components/base/test_bare.py | 10 ++- tests/components/base/test_script.py | 8 +-- tests/components/core/test_colors.py | 6 +- tests/components/test_component_state.py | 4 +- tests/components/test_tag.py | 11 +-- tests/test_event.py | 65 +++++++++--------- tests/test_state.py | 19 +++--- tests/test_style.py | 86 ++++++++++++++---------- 14 files changed, 127 insertions(+), 115 deletions(-) diff --git a/reflex/components/tags/tag.py b/reflex/components/tags/tag.py index 5a26a164f..52435e95e 100644 --- a/reflex/components/tags/tag.py +++ b/reflex/components/tags/tag.py @@ -42,7 +42,7 @@ class Tag(Base): # Convert any props to vars. if "props" in kwargs: kwargs["props"] = { - name: ImmutableVar.create(value) + name: LiteralVar.create(value) for name, value in kwargs["props"].items() } super().__init__(*args, **kwargs) diff --git a/reflex/event.py b/reflex/event.py index 5e6a76fb0..9c5354dbc 100644 --- a/reflex/event.py +++ b/reflex/event.py @@ -545,7 +545,7 @@ def set_focus(ref: str) -> EventSpec: return server_side( "_set_focus", get_fn_signature(set_focus), - ref=ImmutableVar.create_safe(format.format_ref(ref)), + ref=LiteralVar.create(format.format_ref(ref)), ) @@ -576,7 +576,7 @@ def set_value(ref: str, value: Any) -> EventSpec: return server_side( "_set_value", get_fn_signature(set_value), - ref=ImmutableVar.create_safe(format.format_ref(ref)), + ref=LiteralVar.create(format.format_ref(ref)), value=value, ) diff --git a/reflex/ivars/object.py b/reflex/ivars/object.py index 722d14378..8761eceb9 100644 --- a/reflex/ivars/object.py +++ b/reflex/ivars/object.py @@ -70,6 +70,8 @@ class ObjectVar(ImmutableVar[OBJECT_TYPE]): fixed_type = ( self._var_type if isclass(self._var_type) else get_origin(self._var_type) ) + if not isclass(fixed_type): + return Any args = get_args(self._var_type) if issubclass(fixed_type, dict) else () return args[1] if args else Any @@ -246,7 +248,7 @@ class ObjectVar(ImmutableVar[OBJECT_TYPE]): fixed_type = ( self._var_type if isclass(self._var_type) else get_origin(self._var_type) ) - if not issubclass(fixed_type, dict): + if isclass(fixed_type) and not issubclass(fixed_type, dict): attribute_type = get_attribute_access_type(self._var_type, name) if attribute_type is None: raise VarAttributeError( diff --git a/reflex/style.py b/reflex/style.py index 0e93082ea..0591ccebb 100644 --- a/reflex/style.py +++ b/reflex/style.py @@ -126,8 +126,7 @@ def convert_item( The formatted style item and any associated VarData. """ if isinstance(style_item, Var): - # If the value is a Var, extract the var_data and cast as str. - return str(style_item), style_item._get_all_var_data() + return style_item, style_item._get_all_var_data() # Otherwise, convert to Var to collapse VarData encoded in f-string. new_var = LiteralVar.create(style_item) diff --git a/reflex/utils/format.py b/reflex/utils/format.py index 6a016c5d6..5fa350e34 100644 --- a/reflex/utils/format.py +++ b/reflex/utils/format.py @@ -489,17 +489,6 @@ def format_props(*single_props, **key_value_props) -> list[str]: # Format all the props. from reflex.ivars.base import ImmutableVar, LiteralVar - # print( - # *[ - # f"{name}={{{format_prop(prop if isinstance(prop, Var) else LiteralVar.create(prop))}}}" - # for name, prop in sorted(key_value_props.items()) - # if prop is not None - # ], - # sep="\n", - # ) - - # if single_props: - # print("single_props", single_props) return [ ( diff --git a/reflex/vars.py b/reflex/vars.py index 35ff5de5c..3a5f08e38 100644 --- a/reflex/vars.py +++ b/reflex/vars.py @@ -411,7 +411,7 @@ def _decode_var_immutable(value: str) -> tuple[ImmutableVarData | None, str]: ): # This is a global immutable var. var = _global_vars[int(serialized_data)] - var_data = var._var_data + var_data = var._get_all_var_data() if var_data is not None: realstart = start + offset @@ -753,8 +753,11 @@ class Var: return self._var_name try: return json.loads(self._var_name) - except ValueError: - return self._var_name + except: + try: + return json.loads(self.json()) + except: + return self._var_name def equals(self, other: Var) -> bool: """Check if two vars are equal. diff --git a/tests/components/base/test_bare.py b/tests/components/base/test_bare.py index df3f862d4..706140241 100644 --- a/tests/components/base/test_bare.py +++ b/tests/components/base/test_bare.py @@ -1,16 +1,20 @@ import pytest from reflex.components.base.bare import Bare +from reflex.ivars.base import ImmutableVar +STATE_VAR = ImmutableVar.create_safe("default_state.name") @pytest.mark.parametrize( "contents,expected", [ ("hello", '{"hello"}'), ("{}", '{"{}"}'), - (None, ""), - ("${default_state.name}", "${default_state.name}"), - ("{state.name}", "{state.name}"), + (None, '{""}'), + (STATE_VAR, "{default_state.name}"), + # This behavior is now unsupported. + # ("${default_state.name}", "${default_state.name}"), + # ("{state.name}", "{state.name}"), ], ) def test_fstrings(contents, expected): diff --git a/tests/components/base/test_script.py b/tests/components/base/test_script.py index 62e6b0054..c6b67da11 100644 --- a/tests/components/base/test_script.py +++ b/tests/components/base/test_script.py @@ -23,7 +23,7 @@ def test_script_src(): assert render_dict["name"] == "Script" assert not render_dict["contents"] assert not render_dict["children"] - assert "src={`foo.js`}" in render_dict["props"] + assert 'src={"foo.js"}' in render_dict["props"] def test_script_neither(): @@ -58,14 +58,14 @@ def test_script_event_handler(): ) render_dict = component.render() assert ( - f'onReady={{(...args) => addEvents([Event("{EvState.get_full_name()}.on_ready", {{}})], args, {{}})}}' + f'onReady={{((...args) => ((addEvents([(Event("{EvState.get_full_name()}.on_ready", ({{ }})))], args, ({{ }})))))}}' in render_dict["props"] ) assert ( - f'onLoad={{(...args) => addEvents([Event("{EvState.get_full_name()}.on_load", {{}})], args, {{}})}}' + f'onLoad={{((...args) => ((addEvents([(Event("{EvState.get_full_name()}.on_load", ({{ }})))], args, ({{ }})))))}}' in render_dict["props"] ) assert ( - f'onError={{(...args) => addEvents([Event("{EvState.get_full_name()}.on_error", {{}})], args, {{}})}}' + f'onError={{((...args) => ((addEvents([(Event("{EvState.get_full_name()}.on_error", ({{ }})))], args, ({{ }})))))}}' in render_dict["props"] ) diff --git a/tests/components/core/test_colors.py b/tests/components/core/test_colors.py index 069113afb..d5d5dc995 100644 --- a/tests/components/core/test_colors.py +++ b/tests/components/core/test_colors.py @@ -108,9 +108,9 @@ def test_color_with_conditionals(cond_var, expected): (create_color_var(rx.color("red")), '"var(--red-7)"'), (create_color_var(rx.color("green", shade=1)), '"var(--green-1)"'), (create_color_var(rx.color("blue", alpha=True)), '"var(--blue-a7)"'), - ("red", "red"), - ("green", "green"), - ("blue", "blue"), + ("red", '"red"'), + ("green", '"green"'), + ("blue", '"blue"'), ], ) def test_radix_color(color, expected): diff --git a/tests/components/test_component_state.py b/tests/components/test_component_state.py index 0dc0956e2..574997ba5 100644 --- a/tests/components/test_component_state.py +++ b/tests/components/test_component_state.py @@ -35,8 +35,8 @@ def test_component_state(): assert cs1.State.increment != cs2.State.increment assert len(cs1.children) == 1 - assert cs1.children[0].render() == Bare.create("{`a`}").render() + assert cs1.children[0].render() == Bare.create("a").render() assert cs1.id == "a" assert len(cs2.children) == 1 - assert cs2.children[0].render() == Bare.create("{`b`}").render() + assert cs2.children[0].render() == Bare.create("b").render() assert cs2.id == "b" diff --git a/tests/components/test_tag.py b/tests/components/test_tag.py index 2fb2f4563..d43f73842 100644 --- a/tests/components/test_tag.py +++ b/tests/components/test_tag.py @@ -3,6 +3,7 @@ from typing import Dict, List import pytest from reflex.components.tags import CondTag, Tag, tagless +from reflex.ivars.base import LiteralVar from reflex.vars import BaseVar, Var @@ -12,8 +13,8 @@ from reflex.vars import BaseVar, Var ({}, []), ({"key-hypen": 1}, ["key-hypen={1}"]), ({"key": 1}, ["key={1}"]), - ({"key": "value"}, ["key={`value`}"]), - ({"key": True, "key2": "value2"}, ["key={true}", "key2={`value2`}"]), + ({"key": "value"}, ['key={"value"}']), + ({"key": True, "key2": "value2"}, ["key={true}", 'key2={"value2"}']), ], ) def test_format_props(props: Dict[str, Var], test_props: List): @@ -53,8 +54,8 @@ def test_is_valid_prop(prop: Var, valid: bool): def test_add_props(): """Test that the props are added.""" tag = Tag().add_props(key="value", key2=42, invalid=None, invalid2={}) - assert tag.props["key"].equals(Var.create("value")) - assert tag.props["key2"].equals(Var.create(42)) + assert tag.props["key"].equals(LiteralVar.create("value")) + assert tag.props["key2"].equals(LiteralVar.create(42)) assert "invalid" not in tag.props assert "invalid2" not in tag.props @@ -102,7 +103,7 @@ def test_format_tag(tag: Tag, expected: Dict): assert tag_dict["name"] == expected["name"] assert tag_dict["contents"] == expected["contents"] for prop, prop_value in tag_dict["props"].items(): - assert prop_value.equals(Var.create_safe(expected["props"][prop])) + assert prop_value.equals(LiteralVar.create(expected["props"][prop])) def test_format_cond_tag(): diff --git a/tests/test_event.py b/tests/test_event.py index 284542a43..13f316fe4 100644 --- a/tests/test_event.py +++ b/tests/test_event.py @@ -5,6 +5,7 @@ import pytest from reflex import event from reflex.event import Event, EventHandler, EventSpec, call_event_handler, fix_events +from reflex.ivars.base import ImmutableVar, LiteralVar from reflex.state import BaseState from reflex.utils import format from reflex.vars import Var @@ -70,7 +71,7 @@ def test_call_event_handler(): event_spec = handler("first", "second") # type: ignore assert ( format.format_event(event_spec) - == 'Event("test_fn_with_args", {arg1:`first`,arg2:`second`})' + == 'Event("test_fn_with_args", {arg1:"first",arg2:"second"})' ) first, second = 123, "456" @@ -78,14 +79,14 @@ def test_call_event_handler(): event_spec = handler(first, second) # type: ignore assert ( format.format_event(event_spec) - == 'Event("test_fn_with_args", {arg1:123,arg2:`456`})' + == 'Event("test_fn_with_args", {arg1:123,arg2:"456"})' ) assert event_spec.handler == handler assert event_spec.args[0][0].equals(Var.create_safe("arg1")) assert event_spec.args[0][1].equals(Var.create_safe(first)) assert event_spec.args[1][0].equals(Var.create_safe("arg2")) - assert event_spec.args[1][1].equals(Var.create_safe(second)) + assert event_spec.args[1][1].equals(LiteralVar.create(second)) handler = EventHandler(fn=test_fn_with_args) with pytest.raises(TypeError): @@ -160,15 +161,15 @@ def test_fix_events(arg1, arg2): [ ( ("/path", None, None), - 'Event("_redirect", {path:`/path`,external:false,replace:false})', + 'Event("_redirect", {path:"/path",external:false,replace:false})', ), ( ("/path", True, None), - 'Event("_redirect", {path:`/path`,external:true,replace:false})', + 'Event("_redirect", {path:"/path",external:true,replace:false})', ), ( ("/path", False, None), - 'Event("_redirect", {path:`/path`,external:false,replace:false})', + 'Event("_redirect", {path:"/path",external:false,replace:false})', ), ( (Var.create_safe("path"), None, None), @@ -176,11 +177,11 @@ def test_fix_events(arg1, arg2): ), ( ("/path", None, True), - 'Event("_redirect", {path:`/path`,external:false,replace:true})', + 'Event("_redirect", {path:"/path",external:false,replace:true})', ), ( ("/path", True, True), - 'Event("_redirect", {path:`/path`,external:true,replace:true})', + 'Event("_redirect", {path:"/path",external:true,replace:true})', ), ], ) @@ -213,10 +214,10 @@ def test_event_console_log(): spec = event.console_log("message") assert isinstance(spec, EventSpec) assert spec.handler.fn.__qualname__ == "_console" - assert spec.args[0][0].equals(Var.create_safe("message")) - assert spec.args[0][1].equals(Var.create_safe("message")) - assert format.format_event(spec) == 'Event("_console", {message:`message`})' - spec = event.console_log(Var.create_safe("message")) + assert spec.args[0][0].equals(ImmutableVar(_var_name="message", _var_type=str)) + assert spec.args[0][1].equals(LiteralVar.create("message")) + assert format.format_event(spec) == 'Event("_console", {message:"message"})' + spec = event.console_log(ImmutableVar.create("message")) assert format.format_event(spec) == 'Event("_console", {message:message})' @@ -225,10 +226,10 @@ def test_event_window_alert(): spec = event.window_alert("message") assert isinstance(spec, EventSpec) assert spec.handler.fn.__qualname__ == "_alert" - assert spec.args[0][0].equals(Var.create_safe("message")) - assert spec.args[0][1].equals(Var.create_safe("message")) - assert format.format_event(spec) == 'Event("_alert", {message:`message`})' - spec = event.window_alert(Var.create_safe("message")) + assert spec.args[0][0].equals(ImmutableVar(_var_name="message", _var_type=str)) + assert spec.args[0][1].equals(LiteralVar.create("message")) + assert format.format_event(spec) == 'Event("_alert", {message:"message"})' + spec = event.window_alert(ImmutableVar.create_safe("message")) assert format.format_event(spec) == 'Event("_alert", {message:message})' @@ -238,10 +239,10 @@ def test_set_focus(): assert isinstance(spec, EventSpec) assert spec.handler.fn.__qualname__ == "_set_focus" assert spec.args[0][0].equals(Var.create_safe("ref")) - assert spec.args[0][1].equals(Var.create_safe("ref_input1")) - assert format.format_event(spec) == 'Event("_set_focus", {ref:`ref_input1`})' + assert spec.args[0][1].equals(LiteralVar.create("ref_input1")) + assert format.format_event(spec) == 'Event("_set_focus", {ref:"ref_input1"})' spec = event.set_focus("input1") - assert format.format_event(spec) == 'Event("_set_focus", {ref:`ref_input1`})' + assert format.format_event(spec) == 'Event("_set_focus", {ref:"ref_input1"})' def test_set_value(): @@ -250,16 +251,16 @@ def test_set_value(): assert isinstance(spec, EventSpec) assert spec.handler.fn.__qualname__ == "_set_value" assert spec.args[0][0].equals(Var.create_safe("ref")) - assert spec.args[0][1].equals(Var.create_safe("ref_input1")) + assert spec.args[0][1].equals(LiteralVar.create("ref_input1")) assert spec.args[1][0].equals(Var.create_safe("value")) - assert spec.args[1][1].equals(Var.create_safe("")) + assert spec.args[1][1].equals(LiteralVar.create("")) assert ( - format.format_event(spec) == 'Event("_set_value", {ref:`ref_input1`,value:``})' + format.format_event(spec) == 'Event("_set_value", {ref:"ref_input1",value:""})' ) - spec = event.set_value("input1", Var.create_safe("message")) + spec = event.set_value("input1", ImmutableVar.create_safe("message")) assert ( format.format_event(spec) - == 'Event("_set_value", {ref:`ref_input1`,value:message})' + == 'Event("_set_value", {ref:"ref_input1",value:message})' ) @@ -269,12 +270,12 @@ def test_remove_cookie(): assert isinstance(spec, EventSpec) assert spec.handler.fn.__qualname__ == "_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[0][1].equals(LiteralVar.create("testkey")) assert spec.args[1][0].equals(Var.create_safe("options")) - assert spec.args[1][1].equals(Var.create_safe({"path": "/"})) + assert spec.args[1][1].equals(LiteralVar.create({"path": "/"})) assert ( format.format_event(spec) - == 'Event("_remove_cookie", {key:`testkey`,options:{"path": "/"}})' + == 'Event("_remove_cookie", {key:"testkey",options:({ ["path"] : "/" })})' ) @@ -290,12 +291,12 @@ def test_remove_cookie_with_options(): assert isinstance(spec, EventSpec) assert spec.handler.fn.__qualname__ == "_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[0][1].equals(LiteralVar.create("testkey")) assert spec.args[1][0].equals(Var.create_safe("options")) - assert spec.args[1][1].equals(Var.create_safe(options)) + assert spec.args[1][1].equals(LiteralVar.create(options)) assert ( format.format_event(spec) - == f'Event("_remove_cookie", {{key:`testkey`,options:{json.dumps(options)}}})' + == f'Event("_remove_cookie", {{key:"testkey",options:{str(LiteralVar.create(options))}}})' ) @@ -314,9 +315,9 @@ def test_remove_local_storage(): assert isinstance(spec, EventSpec) assert spec.handler.fn.__qualname__ == "_remove_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[0][1].equals(LiteralVar.create("testkey")) assert ( - format.format_event(spec) == 'Event("_remove_local_storage", {key:`testkey`})' + format.format_event(spec) == 'Event("_remove_local_storage", {key:"testkey"})' ) diff --git a/tests/test_state.py b/tests/test_state.py index aa5705b09..8a663dad9 100644 --- a/tests/test_state.py +++ b/tests/test_state.py @@ -40,7 +40,7 @@ from reflex.state import ( from reflex.testing import chdir from reflex.utils import format, prerequisites, types from reflex.utils.format import json_dumps -from reflex.vars import BaseVar, ComputedVar +from reflex.vars import BaseVar, ComputedVar, Var from tests.states.mutation import MutableSQLAModel, MutableTestState from .states import GenState @@ -266,8 +266,8 @@ def test_base_class_vars(test_state): if field in test_state.get_skip_vars(): continue prop = getattr(cls, field) - assert isinstance(prop, BaseVar) - assert prop._var_name == field + assert isinstance(prop, Var) + assert prop._var_name.split(".")[-1] == field assert cls.num1._var_type == int assert cls.num2._var_type == float @@ -395,30 +395,27 @@ def test_default_setters(test_state): def test_class_indexing_with_vars(): """Test that we can index into a state var with another var.""" prop = TestState.array[TestState.num1] - assert ( - str(prop) == f"{{{TestState.get_name()}.array.at({TestState.get_name()}.num1)}}" - ) + assert str(prop) == f"{TestState.get_name()}.array.at({TestState.get_name()}.num1)" prop = TestState.mapping["a"][TestState.num1] assert ( str(prop) - == f'{{{TestState.get_name()}.mapping["a"].at({TestState.get_name()}.num1)}}' + == f'{TestState.get_name()}.mapping["a"].at({TestState.get_name()}.num1)' ) prop = TestState.mapping[TestState.map_key] assert ( - str(prop) - == f"{{{TestState.get_name()}.mapping[{TestState.get_name()}.map_key]}}" + str(prop) == f"{TestState.get_name()}.mapping[{TestState.get_name()}.map_key]" ) def test_class_attributes(): """Test that we can get class attributes.""" prop = TestState.obj.prop1 - assert str(prop) == f"{{{TestState.get_name()}.obj.prop1}}" + assert str(prop) == f'{TestState.get_name()}.obj["prop1"]' prop = TestState.complex[1].prop1 - assert str(prop) == f"{{{TestState.get_name()}.complex[1].prop1}}" + assert str(prop) == f"{TestState.get_name()}.complex[1][\"prop1\"]" def test_get_parent_state(): diff --git a/tests/test_style.py b/tests/test_style.py index 825d72a9d..64c7fc9e7 100644 --- a/tests/test_style.py +++ b/tests/test_style.py @@ -1,18 +1,19 @@ from __future__ import annotations -from typing import Any +from typing import Any, Dict import pytest import reflex as rx from reflex import style from reflex.components.component import evaluate_style_namespaces +from reflex.ivars.base import ImmutableVar, LiteralVar from reflex.style import Style -from reflex.vars import Var, VarData +from reflex.vars import ImmutableVarData, Var, VarData test_style = [ ({"a": 1}, {"a": 1}), - ({"a": Var.create("abc")}, {"a": "abc"}), + ({"a": LiteralVar.create("abc")}, {"a": "abc"}), ({"test_case": 1}, {"testCase": 1}), ({"test_case": {"a": 1}}, {"testCase": {"a": 1}}), ({":test_case": {"a": 1}}, {":testCase": {"a": 1}}), @@ -21,8 +22,8 @@ test_style = [ {"::-webkit-scrollbar": {"display": "none"}}, {"::-webkit-scrollbar": {"display": "none"}}, ), - ({"margin_y": "2rem"}, {"marginBottom": "2rem", "marginTop": "2rem"}), - ({"marginY": "2rem"}, {"marginBottom": "2rem", "marginTop": "2rem"}), + ({"margin_y": "2rem"}, {"marginTop": "2rem", "marginBottom": "2rem"}), + ({"marginY": "2rem"}, {"marginTop": "2rem", "marginBottom": "2rem"}), ( {"::-webkit-scrollbar": {"bgColor": "red"}}, {"::-webkit-scrollbar": {"backgroundColor": "red"}}, @@ -49,7 +50,7 @@ def test_convert(style_dict, expected): expected: The expected formatted style. """ converted_dict, _var_data = style.convert(style_dict) - assert converted_dict == expected + assert LiteralVar.create(converted_dict).equals(LiteralVar.create(expected)) @pytest.mark.parametrize( @@ -63,7 +64,9 @@ def test_create_style(style_dict, expected): style_dict: The style to check. expected: The expected formatted style. """ - assert style.Style(style_dict) == expected + assert LiteralVar.create(style.Style(style_dict)).equals( + LiteralVar.create(expected) + ) def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): @@ -87,39 +90,47 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): @pytest.mark.parametrize( ("kwargs", "style_dict", "expected_get_style"), [ - ({}, {}, {"css": None}), - ({"color": "hotpink"}, {}, {"css": Var.create(Style({"color": "hotpink"}))}), - ({}, {"color": "red"}, {"css": Var.create(Style({"color": "red"}))}), + ({}, {}, {}), + ( + {"color": "hotpink"}, + {}, + {"css": LiteralVar.create(Style({"color": "hotpink"}))}, + ), + ({}, {"color": "red"}, {"css": LiteralVar.create(Style({"color": "red"}))}), ( {"color": "hotpink"}, {"color": "red"}, - {"css": Var.create(Style({"color": "hotpink"}))}, + {"css": LiteralVar.create(Style({"color": "hotpink"}))}, ), ( {"_hover": {"color": "hotpink"}}, {}, - {"css": Var.create(Style({"&:hover": {"color": "hotpink"}}))}, + {"css": LiteralVar.create(Style({"&:hover": {"color": "hotpink"}}))}, ), ( {}, {"_hover": {"color": "red"}}, - {"css": Var.create(Style({"&:hover": {"color": "red"}}))}, + {"css": LiteralVar.create(Style({"&:hover": {"color": "red"}}))}, ), ( {}, {":hover": {"color": "red"}}, - {"css": Var.create(Style({"&:hover": {"color": "red"}}))}, + {"css": LiteralVar.create(Style({"&:hover": {"color": "red"}}))}, ), ( {}, {"::-webkit-scrollbar": {"display": "none"}}, - {"css": Var.create(Style({"&::-webkit-scrollbar": {"display": "none"}}))}, + { + "css": LiteralVar.create( + Style({"&::-webkit-scrollbar": {"display": "none"}}) + ) + }, ), ( {}, {"::-moz-progress-bar": {"background_color": "red"}}, { - "css": Var.create( + "css": LiteralVar.create( Style({"&::-moz-progress-bar": {"backgroundColor": "red"}}) ) }, @@ -128,7 +139,7 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): {"color": ["#111", "#222", "#333", "#444", "#555"]}, {}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "@media screen and (min-width: 0)": {"color": "#111"}, @@ -148,7 +159,7 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): }, {}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "@media screen and (min-width: 0)": {"color": "#111"}, @@ -169,7 +180,7 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): }, {}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "@media screen and (min-width: 0)": { @@ -209,7 +220,7 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): }, {}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "&:hover": { @@ -236,7 +247,7 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): {"_hover": {"color": ["#111", "#222", "#333", "#444", "#555"]}}, {}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "&:hover": { @@ -268,7 +279,7 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): }, {}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "&:hover": { @@ -307,7 +318,7 @@ def compare_dict_of_var(d1: dict[str, Any], d2: dict[str, Any]): }, {}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "&:hover": { @@ -361,20 +372,20 @@ class StyleState(rx.State): [ ( {"color": StyleState.color}, - {"css": Var.create(Style({"color": StyleState.color}))}, + {"css": LiteralVar.create(Style({"color": StyleState.color}))}, ), ( {"color": f"dark{StyleState.color}"}, { - "css": Var.create_safe(f'{{"color": `dark{StyleState.color}`}}').to( - Style - ) + "css": ImmutableVar.create( + f'({{ ["color"] : ("dark"+{StyleState.color}) }})' + ).to(Dict[str, str]) }, ), ( {"color": StyleState.color, "_hover": {"color": StyleState.color2}}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "color": StyleState.color, @@ -387,7 +398,7 @@ class StyleState(rx.State): ( {"color": [StyleState.color, "gray", StyleState.color2, "yellow", "blue"]}, { - "css": Var.create( + "css": LiteralVar.create( Style( { "@media screen and (min-width: 0)": { @@ -415,7 +426,7 @@ class StyleState(rx.State): ] }, { - "css": Var.create( + "css": LiteralVar.create( Style( { "&:hover": { @@ -453,7 +464,7 @@ class StyleState(rx.State): } }, { - "css": Var.create( + "css": LiteralVar.create( Style( { "&:hover": { @@ -492,7 +503,10 @@ def test_style_via_component_with_state( """ comp = rx.el.div(**kwargs) - assert comp.style._var_data == expected_get_style["css"]._var_data + assert ( + ImmutableVarData.merge(comp.style._var_data) + == expected_get_style["css"]._get_all_var_data() + ) # Assert that style values are equal. compare_dict_of_var(comp._get_style(), expected_get_style) @@ -507,10 +521,10 @@ def test_evaluate_style_namespaces(): def test_style_update_with_var_data(): """Test that .update with a Style containing VarData works.""" - red_var = Var.create_safe("red")._replace( + red_var = LiteralVar.create("red")._replace( merge_var_data=VarData(hooks={"const red = true": None}), # type: ignore ) - blue_var = Var.create_safe("blue", _var_is_local=False)._replace( + blue_var = LiteralVar.create("blue")._replace( merge_var_data=VarData(hooks={"const blue = true": None}), # type: ignore ) @@ -521,7 +535,9 @@ def test_style_update_with_var_data(): ) s2 = Style() s2.update(s1, background_color=f"{blue_var}ish") - assert s2 == {"color": "red", "backgroundColor": "`${blue}ish`"} + assert str(LiteralVar.create(s2)) == str( + LiteralVar.create({"color": "red", "backgroundColor": "blueish"}) + ) assert s2._var_data is not None assert "const red = true" in s2._var_data.hooks assert "const blue = true" in s2._var_data.hooks