* do not reload if using local app
* Update reflex/testing.py
Co-authored-by: Masen Furer <m_github@0x26.net>
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* half of the way there
* implement __getitem__ for array
* add some tests
* add fixes to pyright
* fix default factory
* implement array operations
* format code
* fix pyright issue
* give up
* add object operations
* add test for merge
* pyright 🥺
* use str isntead of _var_name
Co-authored-by: Masen Furer <m_github@0x26.net>
* wrong var_type
* make to much nicer
* add subclass checking
* enhance types
* use builtin list type
* improve typing even more
* i'm awaiting october
* use even better typing
* add hash, json, and guess type method
* fix pyright issues
* add a test and fix lots of errors
* fix pyright once again
* add type inference to list
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
When using rx.vars.get_uuid_string_var, wrap the prop Var in `useMemo` so that
the value remains consistent across re-renders of the component.
Fix#3707
* implement var operation decorator
* use older syntax
* use cast and older syntax
* use something even simpler
* add some tests
* use old union tactics
* that's not how you do things
* implement arithmetic operations while we're at it
* add test
* even more operations
* can't use __bool__
* thanos snap
* forgot ruff
* use default factory
* dang it darglint
* i know i should have done that but
* convert values into literalvars
* make test pass
* use older union tactics
* add test to string var
* pright why do you hate me 🥺
* [REF-3184] Raise exception when encountering nested `async with self` blocks
Avoid deadlock when the background task already holds the mutation lock for a
given state.
* [REF-3339] get_state from background task links to StateProxy
When calling `get_state` from a background task, the resulting state instance
is wrapped in a StateProxy that is bound to the original StateProxy and shares
the same async context, lock, and mutability flag.
* If StateProxy has a _self_parent_state_proxy, retrieve the correct substate
* test_state fixup
* implement more literal vars
* fix super issue
* pyright has a bug i think
* oh we changed that
* fix docs
* literalize vars recursively
* do what masen told me :D
* use dynamic keys
* forgot .create
* adjust _var_value
* dang it darglint
* add test for serializing literal vars into js exprs
* fix silly mistake
* add handling for var and none
* use create safe
* is none bruh
* implement function vars and do various modification
* fix None issue
* clear a lot of creates that did nothing
* add tests to function vars
* added simple fix smh
* use fconcat to make an even more complicated test
* reflex.build polling: catch exceptions and retry
Extend interval to 2 seconds to reduce server load.
* Add function to check if a string looks like a generation hash
* reflex init: allow --template to be a generation hash if --ai is specified
* implement LiteralStringVar and format/retrieval mechanism
* use create safe
* add cached properties to ConcatVarOperation
* fix caches
* also include self
* fix inconsistencies in typings
* use default factory not default
* add missing docstring
* experiment with immutable var data
* solve pydantic issues
* add sorted function
* missing docs
* forgot ellipses
* give up on frozen
* dang it darglint
* fix string serialization bugs and remove unused code
* add returns statement
* whitespace moment
* add simple test for string concat
* export ConcatVarOperation
* define new JS-type var classes
* add docstring
* get rid of dataclass definitions and export all new vars
* order imports in the correct way
* only hash once
* implement format for immutable vars
* add some basic test
* make reference only after formatting
* win over pyright
* hopefully now pyright doesn't hate me
* forgot some _var_data
* i don't know how imports work
* use f_string var and remove assignments from pyi file
* override post_init to not break immutability
* add create_safe and test for it
* add module prefix to state names
* fix state names in test_app
* update state names in test_state
* fix state names in test_var
* fix state name in test_component
* fix state names in test_format
* fix state names in test_foreach
* fix state names in test_cond
* fix state names in test_datatable
* fix state names in test_colors
* fix state names in test_script
* fix state names in test_match
* fix state name in event1 fixture
* fix pyright and darglint
* fix state names in state_tree
* fix state names in redis only test
* fix state names in test_client_storage
* fix state name in js template
* add `get_state_name` and `get_full_state_name` helpers for `AppHarness`
* fix state names in test_dynamic_routes
* use new state name helpers in test_client_storage
* fix state names in test_event_actions
* fix state names in test_event_chain
* fix state names in test_upload
* fix state name in test_login_flow
* fix state names in test_input
* fix state names in test_form_submit
* ruff
* validate state module names
* wtf is going on here?
* remove comments leftover from refactoring
* adjust new test_add_style_embedded_vars
* fix state name in state.js
* fix integration/test_client_state.py
new SessionStorage feature was added with more full state names that need to be formatted in
* fix pre-commit issues in test_client_storage.py
* adjust test_computed_vars
* adjust safe-guards
* fix redis tests with new exception state
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
If pydantic v1 is already installed, there is no reason to restore the original
pydantic modules, which seems to introduce subtle incompatibilities with some
pydantic versions.
Perform the pydantic version check early on and exit for v1 before doing
anything with the sys.modules.
Fix#3642
* fix axis orientation prop
* add margin prop explanation
* active bar and on animation start
* remove data key from y-axis
* precommit and pyi generator
---------
Co-authored-by: Tom Gotsman <tomgotsman@Toms-MacBook-Pro.local>
Co-authored-by: Tom Gotsman <tomgotsman@toms-mbp.lan>
* fix: unexpected kwargs raise type error, on _replace
* add: docstring for _replace, test for invalid kwargs replace
* add: parametrize var for replace test
* fix: computed_var _replace with invalid kwargs
* - added possibility to pass front- and backend exception handlers to rx.App
- wrapped the app with ErrorBoundary component to catch rendering errors
* added missing exception handler to reflex.app._process
* regenerated pyi
* fix unit tests for exception handler validation
* fix typing error in ErrorBoudary
* - fix error_bounday pyi
- minor refactoring of error boundary
- removed error boundary from 404 page
* added missing inspect module import after merging main
* fix typing error
* Clean up ErrorBoundary component
* Remove custom _render function
* Remove special imports in Component base class
* Simplify hooks for better composability
* test_exception_handlers: also test in prod mode
* fixed color prop
* fixed error boundary bug and removed hardcoding of the frontend event exception state
* formatted the code after conflict resolution
* fixed type of the error_boundary
* ruff format
---------
Co-authored-by: Maxim Vlah <m.vlah@senbax.de>
Co-authored-by: Masen Furer <m_github@0x26.net>
* feat: Adding an event to go back just as the user would.
* fix: Simplification suggested by masenf.
* fix: And now apply the fix to the right function.
* [REF-3067] Do not purge .web/pages in dev mode
Avoid race condition in hot reload that occurs when pages are removed before
they are recreated.
Fix#3416
* use constants instead of hardcoded string
* add immutable var class
* add missing docs
* override _replace
* fix type imports
* override create as well
* remove deprecated properties and arguments
* remove unused code in ImmutableVar
* fix namespace issue
* no Self in 3.8
Ensure that reflex.utils.compat is loaded whenever `reflex` itself is imported
to try and avoid the sqlmodel metaclass conflict error that arises when
sqlmodel is imported first with pydantic v2, but reflex Model inherits from
rx.Base which is based on pydantic v1.
Fix#3515
The formatting of the upload ID had extra single quotes that were not needed.
Now that `_var_name_unwrapped` is used, any `str`-like Vars will automatically
be formatted with backticks
* split lifespan and middleware logic in separate mixin files
* fix for 3.8
* fix for unit tests
* add missing sys import
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* pyi_generator: avoid fully qualified names for reflex. types
The previous method added quite a large line diff to the pyi files, so for now,
lets just add the `Breakpoints` import to the default set along with Var,
EventHandler, Style and others.
* pyi_generator: fix generated files using ruff
also generate updated pyi files in reflex/experimental namespace
* remove black from dev dependencies
* poetry.lock: relock deps
* Update all pyi files with new formatting
* pre-commit fixes
* pyi_generator: fix __init__.pyi files again
* implement basic behavior to handle both radix and css
* add all components in theme, AND change pyi to include path of reflex types
* order type annotations in pyi_generator (#3585)
* order type annotations in pyi_generator
* run pyi_generator
* classvars should not be backend vars (#3578)
* classvars should not be backend vars
* cleanup RESERVED_BACKEND_VAR_NAMES
* order type annotations in pyi_generator (#3585)
* order type annotations in pyi_generator
* run pyi_generator
* do not validate non-cached var deps (#3576)
* do not validate non-cached var deps
* further improve Exceptions for misconfigured var deps
* order type annotations in pyi_generator (#3585)
* order type annotations in pyi_generator
* run pyi_generator
* fix git merge remains
* define function globally
* use more modern annotations
* only trigger when direct value and not state
* simplify unions
* accidentally removed avatar oop
---------
Co-authored-by: benedikt-bartscher <31854409+benedikt-bartscher@users.noreply.github.com>
* add computed backend vars
* finish computed backend vars, add tests
* fix token for AppHarness with redis state manager
* fix timing issues
* add unit tests for computed backend vars
* automagically mark cvs with _ prefix as backend var
* fully migrate backend computed vars
* rename is_backend_variable to is_backend_base_variable
* add integration test for implicit backend cv, adjust comments
* replace expensive backend var check at runtime
* keep stuff together
* simplify backend var check method, consistent naming, improve test typing
* fix: do not convert properties to cvs
* add test for property
* fix cached_properties with _ prefix in state cls
* Clear color mode local storage
* use the last compiled time logic to determine when to clear local storage
* precommit fix
* app harness fix
* run prettier on reflex/.templates/web/utils/helpers/color_mode.js
* make sure last_compiled_time is updated for stateless apps as well.
* set the chkara-ui-color-mode cookie instead of clearing it, so it is integrated in the app's useEffect cycle
* fix CI
* fix import formatting
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Automatic authentication for backend on Github Codespaces
When running reflex on Github codespaces, the port forwarding mechanism
requires authentication, which happens automatically when first accessing the
port via HTTPS; however since the backend connects over the WSS protocol
instead, it gets an access error with no way to redirect to Github's
authentication servers to get the port open.
This PR adds an automatic redirection mechanism to a backend route when there
is a connection error accessing the frontend. After the backend route loads, it
redirects back to the frontend, but now it can connect to the backend via
websocket because the port forward is authenticated.
* manually update .pyi file 🫨
* Dont escape backticks in JS string interpolation
* add unit tests
* Fix darglint
* add a note to re-visit after new Var API is implemented
* tests should have a good meaning
* add bare sqlalchemy session, Closes#3512
* expose sqla_session at module level, add tests, improve typing
* fix table name
* add model_registry fixture, improve typing
* did not meant to push this
* add docstring to model_registry
* do not expose sqla_session in reflex namespace
All major browser use a "bfcache" to freeze pages when navigating away from the
domain, then they restore the page when going back.
However if the page uses websockets, these get kind of stuck unless you
disconnect them before freezing (and have a mechanism for reconnecting, which
we already do).
Ref: https://web.dev/articles/bfcacheFix#3478
* StatefulComponent event handler useCallback dependency array
Ensure the useCallback dependency array for event handlers also handled
destructuring objects and the `...` rest parameter.
Avoid hooks that are not variable declarations.
* Abstract color_mode related Var creation
* Allow `set_color_mode` to take a parameter at compile time
* Update type hinting of `Var._replace` to indicate that it returns BaseVar
* color_mode_button with allow_system=True uses new set_color_mode API
`set_color_mode` is now a CallableVar and uses very similar logic internally,
so this bit of code can be replaced.
* Fix for pydantic v1.10.17
* Ignore type checking for generic aliases in _var_name_unwrapped
* Allow ClientStateVar.set_value to be used with text inputs
* client_state: If var_name is not provided, create a random name
* client_state: partition the arg value to get `_e0` from `_e0.target.value`
* upgrade to latest ruff
* try to fix dep review
* try to fix dep review (2)
* upgrade black
* upgrade black (2)
* update allowed dependencies
* update allowed dependencies (2)
* update allowed dependencies (3)
* wait between interim and final in yield test
* remove previous commit, increase delay between yield
* forgot to save on the time.sleep(1) removal
* fix integration (maybe?)
* fix pyi?
* what even is going on
* what is realityi?
* test another fix for app harness
* try to wait even longer?
* force uvloop to be optional
* downpin fastapi < 0.111, remove changes to test
* add allow_system prop to colormode iconbutton, and clean up logic
* remove segmentedcontrol change from this PR
* make it work for chakraColorProvider too
* add comment to explain resolved_color_mode
* test_background_task: dispatch multiple async tasks
Use asyncio.gather to dispatch multiple tasks from a single background task
that all compete over the `async with self` lock. Even though the state itself
has a lock, each StateProxy instance should only allow a single `async with
self` context to run at a time.
* Protect StateProxy with an asyncio.Lock
Allow multiple tasks to reference the same StateProxy without stomping on each
other when entering an `async with self` context to acquire the state lock and
ultimately modify the state.
* remove stroke and fill from label as they are unsupported by recharts
* refacted legend
* added props to reference line
* updated type for stroke_width, added stroke, updated type for x y
* added x y to reference dot
* updated reference area
* regenerated pyi
* new pyis
* regenerated pyi
---------
Co-authored-by: Hongyu Yao <hongyuyao@Hongyus-MacBook-Pro-3.local>
Co-authored-by: Hongyu Yao <hongyuyao@hongyus-mbp-3.lan>
* `rx.color_mode.icon`, `rx.color_mode.button` and `rx.color_mode.switch` should not require a backend`
* remove print statement
* unit tests and precommit fix
* add unit tests
* change logic to check if event handlers actually contain state. Also delay websocket object check in state.js so server side events can get executed for stateless apps
* make sure events are not queued for server side events particularly ones that call queueEvents(clear_local_storage, clear_cookies, remove_local_storage, remove_cookies) when the app is stateless(no ws)
* fix unit tests
* fix broken unit tests in test_app
* modify socket check in processEvent to only return if socket exists and theres any event in the queue that requires state
* Apply suggestions from code review
make queueEvent call async
Co-authored-by: Masen Furer <m_github@0x26.net>
* await queueEventIfSocketExists
* Revert "await queueEventIfSocketExists"
This reverts commit 9ef8070b87.
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
1. Updated recharts version to the newest - recharts.py
2. Added `legend_type` back for cartesian class, it was currently commented out - cartesian.py
3. Added `vertical_points` and `horizontal_points` to CartesianGrid class - cartesian.py
4. Added `ticks` `tick` `tick_count` `tick_line` `tick_size` `min_tick_gap`props to Axis class - cartesian.py
5. Refactored `on_click` `on_mouse_down` `on_mouse_up` `on_mouse_move` `on_mouse_out` `on_mouse_enter` `on_mouse_leave` event triggers of `Axis` class using Masen's new method - cartesian.py
6. Added `on_animation_begin` and `on_animation_end` event trigger to `Bar(Cartesian)` class - cartesian.py
7. Added `id` `is_animation_active` `animation_begin` `animation_duration` `animation_easing` `unit` `min_point_size` `name` prop to `Bar(Cartesian)` class - cartesian.py.
8. Added `unit` `name` props to `Area(Cartesian)` class - cartesian.py
9. Added `unit` `name` props to `Line(Cartesian)` class - cartesian.py
10. Added `id` `is_animation_active` `animation_begin` `animation_duration` `animation_easing` props to `Scatter(Recharts)` class - cartesian.py
11. Refactored eventtriggers for `Scatter(Recharts)` class using Masen's new method - cartesian.py
12. Change the var type of stack_id in `Area(Cartesian)` class to be string and int, it used to be only a string. - cartesian.py
13. Added `name_key` prop and `on_animation_start` and `on_animation_end` prop to `Funnul(Recharts)` class cartesian.py
14. Added `on_mouse_down` `on_mouse_up` `on_mouse_over` `on_mouse_out` event triggers to `PieChart(ChartBase)` and also refactored using Masen's new method - Charts.py
15. Refaactored event triggers for referenceDot(Reference) class using Masen's new method. - Cartesian.py
16. Refactored event triggers for ChartBase(RechartsCharts) class using Masen's new method. - Cartesian.py
17. Refactored event triggers for Piechart(ChartBase) class using Masen's new method, Added `on_mouse_down` `on_mouse_up` `on_mouse_over` `on_mouse_out` event triggers - Cartesian.py
Co-authored-by: Hongyu Yao <hongyuyao@hongyus-mbp-3.lan>
In pydantic 1.10.16 (hopefully the last version), they added the `pydantic.v1`
namespace to make transitioning to the v2 package easier without changing code.
However, Reflex was depending on pydantic v1 NOT having `pydantic.v1` to skip
patching names from `v1` into the top level `pydantic` (normally we do this to
force sqlmodel to use v1, even when the v2 package is installed).
Unbreak CI
* Override _var_is_string when handling str literals
Maintain the pre 0.5.4 behavior when dealing with string literal
props, without displaying the deprecation warning.
Wait, isn't it weird to pass `_var_is_string=False` when the type is actually a str??
Yes, yes it is. However this is currently needed to avoid raising the
DeprecationWarning internally. These str-type vars with
_var_is_string set to false are handled by
`reflex.utils.format.format_prop`, but setting them to be
_var_is_string=True causes them to get quoted twice, which is not
what we want.
Var operations refactor will take care of cleaning this up, but for
now, we will go with the hack.
* Ignore type checks
Since I'm using an `isinstance` check now, the type checker thinks that `value`
could possibly be a string (instead of Any), which raises typing errors that
have to be ignored (they were ignored before implicitly due to being Any-typed)
* Make client_state work without global refs (local only)
* client_state: if the default is str, mark _var_is_string=True
Ensure that a string default is not rendered literally
* add `to_int` as a Var operation
* Allow an event handler lambda to return a Var in some cases
If an lambda is passed to an event trigger and it returns a single Var, then
treat it like the Var was directly passed for the event trigger.
This allows ClientState.set_var to be used within a lambda.
* test_connection_banner: Improve assertions
* Actually assert on the presence or absense of the connection banner
* Update XPATH selector to find the connection toast
* Add event handling while backend down to verify queue functionality
* Bring backend down while an event is running to ensure queue does not get
blocked (#3404)
* state.js: set event_processing = false when websocket connects
In case an event was pending when the websocket went down, allow further events
to be processed when it comes back up.
Fix#3404
* test_connection_banner: wait for token indicating backend is connected
* test_connection_banner: increase delay time
make the time window longer in which the backend can go down and get stuck in
event_processing=true for better test reliability
* Ensure the redis connection is reset in new backend thread
Redis has an event loop affinity and needs to be attached to the event loop
that the thread is running.
* Reset event_processing on disconnect
* if the socket never comes back up, it still allows client-side events to be
processed
* on_mount events may start running before the socket is up, so resetting the
flag on connect may break event determinism (test_event_chain.py)
* wip type transforming serializers
* old python sucks
* typing fixups
* Expose the `to` parameter on `rx.serializer` for type conversion
Serializers can also return a tuple of `(serialized_value, type)`, if both ways
are specified, then the returned value MUST match the `to` parameter.
When initializing a new rx.Var, if `_var_is_string` is not specified and the serializer returns a `str` type, then mark `_var_is_string=True` to indicate that the Var should be treated like a string literal.
Include datetime, color, types, and paths as "serializing to str" type.
Avoid other changes at this point to reduce fallout from this change:
Notably, the `serialize_str` function does NOT cast to `str`, which
would cause existing code to treat all Var initialized with a str as a
str literal even though this was NOT the default before.
Update test cases to accomodate these changes.
* Raise deprecation warning for rx.Var.create with string literal
In the future, we will treat strings as string literals in the JS code. To get
a Var that is not treated like a string, pass _var_is_string=False.
This will allow our serializers to automatically identify cast string literals
with less special cases (and the special cases need to be explicitly
identified).
* Add test case for mismatched serialized types
* fix old python
* Remove serializer returning a tuple feature
Simplify the logic; instead of making a wrapper function that returns
a tuple, just save the type conversions in a separate global.
* Reset the LRU cache when adding new serializers
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Addresses an issue with pydantic v2 models as Vars
It looks like there's an issue with state vars
which are pydantic v2 models... Here's a
reproducible test case:
```python
import reflex as rx
from pydantic import BaseModel
from reflex.utils.serializers import serializer
class User(BaseModel):
has_image: bool = False
@serializer
def serialize_user(user: User) -> dict:
return user.dict()
class State(rx.State):
user: User = None
def index() -> rx.Component:
return rx.container(
rx.cond(State.user,
rx.text(State.user.has_image),
rx.text("No user"))
)
app = rx.App()
app.add_page(index)
```
This app works only with pydantic <2 installed:
```bash
reflex-test $ reflex run
...
AttributeError: 'FieldInfo' object has no attribute 'outer_type_'
reflex-test $ pip install pydantic==1.10.15
─────────────────────────────────── Starting Reflex App ───────────────────────────────────
Compiling: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 13/13 0:00:00
─────────────────────────────────────── App Running ───────────────────────────────────────
App running at: http://localhost:3000
```
Looks like this is caused by `outer_type_` no
[longer existing][1] in pydantic v2. I'm guessing
this was introduced back in [v0.4.6][2].
1: https://github.com/pydantic/pydantic/discussions/7217
2: 86526cba51
This change explicitly ignores pydantic v2 models in
`get_attribute_access_type`, rather than trying to treat
them as v1 models.
* ruff formatting
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* [REF-2977] [REF-2982] Merge layout prop and automatic darkmode
* Expose `template` prop in rx.plotly
* Set default `template` to a color_mode_cond that responds to dark mode
* Merge user-provided `layout` and `template` props into the serialized
plot data
* pyi_generator: avoid affecting the HTML Template component
* Raise warning when importing rx.plotly without plotly installed
* Remove PlotlyLib component and consolidate imports [fixup]
* test_tailwind: include custom stylesheet
* [REF-3004] Use relative path to stylesheet for postcss-import compat
postcss-import balls all of the CSS up into a single file, which happens at
compile time. So, replace the `@/` with `../public` so the import paths can be
resolved relative to the `styles` directory.
* test_compiler: fix compile_stylesheets expectations
* Use constants.Dirs.PUBLIC instead of "public"
* include resize and radius props to the text area component
* run scripts/make_pyi.py for text_area
* pre-commit fixup
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* pyi_generator: do not generate kwargs for event trigger props
event triggers are handled separately
* Implement event handlers for Plotly
* py38 compat: from __future__ import annotations
* init fix
* Update reflex/components/plotly/plotly.py
Co-authored-by: Masen Furer <m_github@0x26.net>
* plotly: treat `data` as a `dict`-type Var in _render
this allows the data to be passed directly as a figure or from a state var
* removed width height prop as they are no longer needed
* updated
* reverted some of the changes
* fixed unit tests
* regen pyi
---------
Co-authored-by: Hongyu Yao <hongyuyao@hongyus-mbp-3.lan>
Co-authored-by: Masen Furer <m_github@0x26.net>
Co-authored-by: Hongyu Yao <hongyuyao@Hongyus-MacBook-Pro-3.local>
* Improve import times
* add lazy loading to rx.el
* add lazy loading to reflex core components
* minor refactor
* Get imports working with reflex web
* get imports to work with all reflex examples
* refactor to define imports only in the root.
* lint
* deadcode remove
* update poetry deps
* unit tests fix
* app_harness fix
* app_harness fix
* pyi file generate
* pyi file generate
* sort pyi order
* fix pyi
* fix docker ci
* rework pyi-generator
* generate pyi for __init__ files
* test pyright
* test pyright ci
* partial pyright fix
* more pyright fix
* pyright fix
* fix pyi_generator
* add rx.serializer and others
* add future annotation import which fixes container CI, then also load recharts lazily
* add new pyi files
* pyright fix
* minor fixes for reflex-web and flexdown
* forward references for py38
* ruff fix
* pyi fix
* unit tests fix
* reduce coverage to 68%
* reduce coverage to 67%
* reduce coverage to 66%as a workaround to coverage's rounding issue
* reduce coverage to 66%as a workaround to coverage's rounding issue
* exclude lazy_loader dependency review checks.
* its lazy-loader
* Add docstrings and regenerate pyi files
* add link
* address Pr comments
* CI fix
* partially address PR comments.
* edit docstrings and fix integration tests
* fix typo in docstring
* pyi fix
* feat: Optionally comparing fields, e.g. on rx.Base based types.
* feat: Minimally invasive change.
Leave the current implementation as is. Added test.
* fix: Supporting old-school python versions.
* fix: Adding masenf's suggestions to use var instead of string.
When setting the font_family prop for a component, also set the radix token
`--default-font-family` so that child radix components will inherit the font.
Always treat ComponentState subclasses as mixin, and explicitly pass
`mixin=False` in `.create` classmethod when intentionally creating a substate.
This allows a "base" ComponentState to have subclasses that also work as
ComponentState themselves.
Fix#3368
* add support for lifespan tasks
* allow passing args to lifespan task
* add message to the cancel call
* allow asynccontextmanager as lifespan tasks
* Fix integration.utils.SessionStorage
Previously the SessionStorage util was just looking in localStorage, but the
tests didn't catch it because they were asserting the token was not None,
rather than asserting it was truthy.
Fixed here, because I'm using this structure in the new lifespan test.
* If the lifespan task or context takes "app" parameter, pass the FastAPI instance.
* test_lifespan: end to end test for register_lifespan_task
* In py3.8, Task.cancel takes no args
* test_lifespan: use polling to make the test more robust
Fix CI failure
* Do not allow task_args for better composability
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* wip connection toaster
* never duplicate toast for websocket-error
* wip update banner
* clean up PR
* fix for 3.8
* update pyi
* ConnectionToaster tweaks
* Use `has_too_many_connection_errors` to avoid showing the banner immediately
* Increase toast duration to avoid frequent, distracting flashing of the toast
* Automatically dismiss the toast when the connection comes back up
* Include `close_button` for user to dismiss the toast
* If the user dismisses the toast, do not show it again until the connection comes back and drops again
* Use `connection_error` var instead of a custom util_hook to get the message
* ConnectionPulser: hide behind toast
* Hide the connection pulser behind the toast (33x33)
* Add a title (tooltip) that shows the connection error
* Re-add connection pulser to default overlay_component
If the user dismisses the toast, we still want to indicate that the backend is
actually down.
* Fix pre-commit issue from main
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Support replacing route on redirect
Support next/router `.replace` interface to change page without creating a
history entry.
* test_event: include test cases for new "replace" kwarg
New experimental feature to create client-side react state vars, save them in
the global `refs` object and access them in frontend rendering/event triggers
as well on the backend via call_script.
* [REF-2787] add_hooks supports Var-wrapped hooks
* Fix VarData definition in .pyi file to allow removal of type ignore comments
* Var.create and Var.create_safe accept _var_data parameter
* Replace instances where a set of imports was being passed to VarData
* Update code throughout reduce use of `._replace` to add VarData
* Fixup: user hooks _var_data.imports will never be iterable, just a single ImportDict
* typed mixins
* implicit mixin=True kwarg for ComponentState subclasses
* fix: always init other subclasses
* adjust tests: all mixins support base vars now
* Get `action` and `cancel` working for rx.toast
Respect defaults set in ToastProvider toast_options when firing a toast with
it's own ToastProps set.
* Update reflex/components/sonner/toast.py
Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com>
* Move queueEvent formatting into rx.utils.format module
Implement on_auto_close and on_dismiss callbacks inside ToastProps
* Update rx.call_script to use new format.format_queue_events
Replace duplicate logic in rx.call_script for handling the callback function.
* Move PropsBase to reflex.components.props
This base class will be exposed via rx._x.PropsBase and can be shared by other
wrapped components that need to pass a JS object full of extra props.
---------
Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com>
* Throw Warning for Projects Created in OneDrive on Windows
* precommit
* remove dead code
* REFLEX_USE_NPM escape hatch to opt out of bun
In some unsupported environments, we need to just not use bun. Further
investigation needed.
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
The demo template includes a drop down menu item named Contact
has an email address to the founders. However, the email address
includes an extraneous = character in the domain part making it
invalid.
Signed-off-by: Eric Brown <eric_wade_brown@yahoo.com>
* Allow `Component.add_style` to return a regular dict
It's more convenient to allow returning a regular dict without having to import
and wrap the value in `rx.style.Style`.
If the dict contains any Var or encoded VarData f-strings, these will be picked
up when the plain dicts are passed to Style.update().
Because Style.update already merges VarData, there is no reason to explicitly
merge it again in this function; this change keeps the merging logic inside the
Style class.
* Test for Style.update with existing Style with _var_data and kwargs
Should retain the _var_data from the original Style instance
* style: Avoid losing VarData in Style.update
If a Style class with _var_data is passed to `Style.update` along with kwargs,
then the _var_data was lost in the double-splat dictionary expansion.
Instead, only apply the kwargs to an existing or new Style instance to retain
_var_data and properly convert values.
* add_style return annotation is Dict[str, Any]
* nit: use lowercase dict in annotation
* rx.accordion customizability overhaul
* fix low contrast font in "classic" variant
* relative font sizing, so setting font_size on the root works now
* use CSS vars wherever possible to make downstream styling easier
* optional dividers between accordion items
* support `radius`
* support `duration` and `easing` for controlling the animation
* fix animation jank while keeping padding_y
* lookup `data-variant` via CSS instead of passing props in python
* fix "surface" variant to use `--accent-surface` as radix intended
* Restore default variant: "classic"
* Fix accordion primitive radius
* Unit tests for add_style and component styles with foreach
The styles should be correctly applied for components that are rendered as part
of a foreach.
* [REF-2802] Foreach should respect modifications to children
Components are mutable, and there is logic that depends on walking through the
component tree and making modifications to components along the way. These
modifications _must_ be respected by foreach for consistency.
Modifications necessary to fix the bug:
* Change the hash function in `_render` to get a hash over the render_fn's
`__code__` object. This way we get a stable hash without having to call the
render function with bogus values.
* Call the render function once during `create` and save the result as a child
of the Foreach component (tree walks will modify this instance).
* Directly render the original (and possibly modified) child component instead
of calling the render_fn again and creating a new component instance at
render time.
Additional changes because they're nice:
* Deprecate passing `**props` to `rx.foreach`. No one should have been
doing this anyway, because it just does not work in any reasonable way.
* Raise `ForeachVarError` when the iterable type is Any
* Raise `ForeachRenderError` when the render function does not take 1 or 2 args.
* Link to the foreach component docs when either of those errors are hit.
* Change the `iterable` arg in `create` to accept `Var[Iterable] | Iterable`
for better typing support (and remove some type: ignore comments)
* Simplify `_render` and `render` methods -- remove unused and potentially
confusing code.
* Fixup: `to_bytes` requires `byteorder` arg before py3.11
* [REF-2789] Graceful deprecation of rx.input.root and rx.input.input
Handle previously valid code where rx.input.root wrapped
rx.input/rx.input.input and rx.input.slot.
Raise deprecation warnings with hints about how to refactor code.
Copy props from rx.input.root to children inputs and apply any rx.input.slot
components to children inputs in an attempt to keep existing code working as
best as possible.
Fix DebounceInput:
* pass children through (for rx.input.slots)
* pass _rename_props through (for color_scheme)
* Fix for case where `rx.input.root` had event triggers
Fix for case where `rx.input.root` had no input children
* radix themes progress: expose `max` prop
It doesn't work yet, but PR filed for radix-ui/themes:
https://github.com/radix-ui/themes/pull/492
* Move `progress` and `toast` to `_x`
[REF-2779] Expose skeleton and data_list in top level namespace.
* update blank template
* update CONTRIBUTING.md
* adjust min_height of main stack
* simplify stuff
* fix import order for blank template and tell ruff to ignore it
* upgrade to latest pip for in_docker_test_script.sh
* Bump gunicorn to 22.0.0 (security)
Changelog: https://docs.gunicorn.org/en/stable/news.html#id1
use utime to notify workers liveness
migrate setup to pyproject.toml
fix numerous security vulnerabilities in HTTP parser (closing some request smuggling vectors)
parsing additional requests is no longer attempted past unsupported request framing
on HTTP versions < 1.1 support for chunked transfer is refused (only used in exploits)
requests conflicting configured or passed SCRIPT_NAME now produce a verbose error
Trailer fields are no longer inspected for headers indicating secure scheme
support Python 3.12
** Breaking changes **
minimum version is Python 3.7
the limitations on valid characters in the HTTP method have been bounded to Internet Standards
requests specifying unsupported transfer coding (order) are refused by default (rare)
HTTP methods are no longer casefolded by default (IANA method registry contains none affected)
HTTP methods containing the number sign (#) are no longer accepted by default (rare)
HTTP versions < 1.0 or >= 2.0 are no longer accepted by default (rare, only HTTP/1.1 is supported)
HTTP versions consisting of multiple digits or containing a prefix/suffix are no longer accepted
HTTP header field names Gunicorn cannot safely map to variables are silently dropped, as in other software
HTTP headers with empty field name are refused by default (no legitimate use cases, used in exploits)
requests with both Transfer-Encoding and Content-Length are refused by default (such a message might indicate an attempt to perform request smuggling)
empty transfer codings are no longer permitted (reportedly seen with really old & broken proxies)
** SECURITY **
fix CVE-2024-1135
* Remove TYPE_CHECKING guard for pydantic v1 imports
Retain TYPE_CHECKING guard in v1 fallback to force pyright into pydantic.v1 namespace
* Run unit tests with pydantic v1 now that v2 is installed via poetry
* Allow EventHandler args to be partially applied
When an EventHandler is called with an incomplete set of args it creates a
partial EventSpec. This change allows Component._create_event_chain to apply
remaining args from an args_spec to an existing EventSpec to make it
functional.
Instead of requiring the use of `lambda` functions to pass arguments to an
EventHandler, they can now be passed directly and any remaining args defined in
the event trigger will be applied after those.
* [REF-2273] Implement `.setvar` special EventHandler
All State subclasses will now have a special `setvar` EventHandler which
appears in the autocomplete drop down, passes static analysis, and canbe used
to set State Vars in response to event triggers.
Before:
rx.input(value=State.a, on_change=State.set_a)
After:
rx.input(value=State.a, on_change=State.setvar("a"))
This reduces the "magic" because `setvar` is statically defined on all State
subclasses.
* Catch invalid Var names and types at compile time
* Add test cases for State.setvar
* Use a proper redis-compatible token
* test_foreach: assert on arg _var_type
* [REF-2682] Foreach over dict uses Tuple arg value
When iterating over a Var with _var_type dict, the resulting arg value
_var_type should be Tuple[key, value] so it can be correctly used with other
var operations.
Fix#3157
* Correct _var_type for iteration over Tuple of multiple types
The arg value when iterating over a tuple could be any of the possible values
mentioned in the annotation.
When only one type is used, the Union collapses to the base type, at least in py3.11
* Add comments
* pyi_generator: ignore `app.py` and single files
When running pyi_generator in pre-commit, it passes individual changed files on
the command line as targets, and these were not being properly excluded
according to the EXCLUDED_FILES list.
Add app.py to the EXCLUDED_FILES list so it does not get regenerated
automatically.
* [REF-2587] Ignore top-level theme appearance
From the Radix docs, it is not recommended to actually set `appearance`, but
instead use next-themes to set and switch the appearance dynamically.
Because Reflex already compiles the top-level theme into the next-themes
ThemeProvider, we can blank out the appearance prop after compiling contexts.js
to avoid a mismatch between the selected app appearance and the appearance in
the rx.theme when displaying overlay components.
Fix#2992
* Simplify `run_process_with_fallback` logic
Include log streaming for initial command and fallback command. This is
necessary because if the command produces significant output that is not
consumed, it can fill the OS pipe and block the process from running.
* Avoid overwriting next.config.js when content has not changed
Windows cannot seem to detect when the file changes but the
content is the same and triggers a much longer hot-reload
cycle to deal with the "updated next.config.js"
* Handle case where `next.config.js` doesn't exist yet
* add more tests
* add tests to raise coverage
* more tests, bump coverage to 73
* fix up icon_button test
* fix darglint for app.py
* fix utcnow usage warning
* set threshold to 72
* fix timestamp
* fix unit tests for linux-redis
* removed commented code and put a TODO
* adjust share command prompt
* use lower case "y" for console.ask, keep order consistent as "y" then "n"
* share command update: do not suggest demo URL is mandatory, also move to the last question; when checking if user has permission to upsert package, do POST to record this package (if first time sharing)
* clean up prompt for preview image
* build pyi files when building/publishing 3rd party
* fix typo in workflow
* add future annotation
* add tests to pass coverage check
* add more unit tests
* omit pyi_generator from test coverage
* change black from dev deps to direct deps
* remake all pyi
* format pyi if black is present, return as if otherwise
* fix requested changes
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Add test_get_state_from_sibling_not_cached
A better unit test to catch issues with refetching parent states
and calculating the wrong parent state names to fetch.
* _determine_missing_parent_states: correctly generate state names
Prepend only the previous state name to the current relative_parent_state_name
instead of joining all of the previous state names together.
* [REF-2219] Avoid refetching states that are already cached
The already cached states may have unsaved changes which can be wiped out if
they are refetched from redis in the middle of handling an event.
If the root state already knows about one of the potentially missing states,
then use the instance that is already cached.
Fix#2851
* Connection pulser only depends on has_connection_errors
Avoid showing the WiFi error icon when the state is hydrating / navigating
because not being hydrated is not indicative of a connection error in itself.
* Set is_hydrated=False at route onChangeStart
When navigation event starts, set is_hydrated=False on the client side before
any on_load event is dispatched. This avoids a flickering problem where the
client browser navigates and briefly shows content on the page before
processing on_load events associated with the page.
Fix#2885
* Update pyi
* Remove upper bounds of most dependencies.
Also adds a import try except block for pydantic.v1 and relocks.
Keep black and ruff to not mess to much with current formatting
Make pyright see the right import as long as constraint still lock pydantiv v1
Down pin pytest-asyncio again due to known issue
Fix upload handler with latest versions of fastapi
Change comment
* Add changed lockfile
* Set max versions for deps
* Revert app.pyi
---------
Co-authored-by: Malte Klemm <malte.klemm@blueyonder.com>
Co-authored-by: Nikhil Rao <nikhil@reflex.dev>
* [REF-2265] ComponentState: scaffold for copying State per Component instance
Define a base ComponentState which can be used to easily create copies of the
given State definition (Vars and EventHandlers) that are tied to a particular
instance of a Component (returned by get_component)
* Define `State` field on `Component` for typing compatibility.
This is an Optional field of Type[State] and is populated by ComponentState.
* Add integration/test_component_state.py
Create two independent counters and increment them separately
* Add unit test for ComponentState
* textarea: expose auto_height and enter_key_submit props
These two props improve the workflow for chat apps and other situations where
we want multiline input.
auto_height: resize the textarea based on its contents
enter_key_submit: pressing enter submits the enclosing form (shift+enter
inserts new lines)
Fix#1231
* Update pyi
* add command to share custom component info for gallery
* cleanup
* tested
* Update custom_components.py
Co-authored-by: Masen Furer <m_github@0x26.net>
* reorder the questions
* ask user to verify info before publishing
* remove questions already captured in pyproject.toml
* no need to cache form inputs since not many questions
* tested
* cleanup
* delete test
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* parse_args_spec: resolve annotations with typing.get_type_hints
Ensure that event trigger specs in modules with future annotations are resolved
correctly.
Fix#2848
* Fix arg spec for on_upload_progress event
Make py3.8 compatible with `get_type_hints`
In exec.py, run_process_and_launch_url already passes `shell=True` on windows,
but the AppHarness has never really been used on Windows, so we were missing
this detail.
Fix#2941
* When a Var points to a model, prefer access to model fields.
When a Var points to a model, and fields of the model share the same name as
Var operations, access to the model fields is now preferred to avoid having Var
operation names shadow model fields. Since most Var operations do not actually
work against Models, this does not really block any functionality.
* Special case for ComputedVar needing to internally access fget
Since fget is a "slot" on property, normal __getattribute__ access cannot find it.
* Workaround https://github.com/python/cpython/issues/88459
In python 3.9 and 3.10, the `isinstance(list[...], type)` returns True, but
it's not a valid class for use in issubclass
* Use dill instead of cloudpickle for serialization
* smaller size pickles
* support dynamically defined states
* avoid issues with unpickleable globals
* pyproject: add dill, remove cloudpickle
* poetry.lock: relock dependencies
* Dynamically convert EventHandler to functools.partial
Instead of converting the functions up front and assigning them to the
instance, unbox the function from the EventHandler when it is requested via
__getattribute__. This reduces the size of the per-instance pickle, because
event handler bodies do not need to be included.
* Improve checking for cython_function_or_method
Because pydantic can be installed without cython, only use the workaround in
the case where the BaseModel.validate function is NOT a FunctionType,
indicating it's a cython function.
* Serialize all State subclasses by reference
* When __REFLEX_SKIP_COMPILE == "yes" allow telemetry to fail
Allow running `--backend-only` without a .web directory
* When re-initializing a pre-project_hash project, do not blow up on KeyError
* Revert "Remove width prop from rx.select (#2835)"
This reverts commit d14292dc9b.
* HighLevelSelect: pass flex_shrink prop to SelectTrigger
This allows the high level select to have width="100%" and also shrink-to-fit inside a parent container.
Fix#2824, kind of
* Revert "Revert "Revert "Revert "use process pool to compile faster (#2377)" (#2434)" (#2497)" (#2595)"
This reverts commit 6b6eea4d7d.
* Adjust number of operations for more correct progress bar
* app: recognize REFLEX_COMPILE_PROCESSES and REFLEX_COMPILE_THREADS
Control whether multiprocessing is used and the number of processes or threads
that should be used.
This will allow users to opt-in to the new, potentially hazardous,
multiprocessing mode, which results in much faster compiles, but has already
been reverted 4 times. Lets leave the code in this time, but use the thread
pool executor by default.
Limiting the number of threads or processes to 1 can also aid in debugging
issues that arise during compile time.
* Allow REFLEX_COMPILE_PROCESSES=0 to trigger multiprocessing with auto workers
* Separate `get_hooks` and `get_hooks_internal` for stable output
When downstream component wrappers depend on State when writing hooks, they
need to be assured that all internal hooks (events, var hooks, memoized
handlers, etc) will be rendered prior to user-defined hooks.
This also makes it less likely for downstream components to feel the need to
overwrite `get_hooks` (no underscore) directly and break internal functioning
of Reflex components.
* Include internal hooks in AppWrap and Page
* Apply get_hooks_internal in a few more places
Display a warning message, recommending python 3.11 with the current release of
reflex.
We need this until running with a uvicorn version that has better support for
py3.12 on windows.
* CustomComponent ignores the annotation type in favor of the passed value
Do not require rx.memo wrapped functions to have 100% correct annotations.
* test_custom_component_get_imports: test imports from wrapped custom components
* Account for imports of custom components for frontend installation
Create new ImportVar that only install the package to avoid rendering the
imports in the page that contains the custom component itself.
* Handle Imports that should never be installed
* Fix up double negative logic
* Perf Optimization: use the imports we already calculate during compile
Instead of augmenting _get_imports with a weird, slow, recursive crawl and
dictionary reconstruction, just use the imports that we compile into the
components.js file to install frontend packages needed by the custom
components.
Same effect, but adds essentially zero overhead to the compilation.
* Get `client_ip` from `asgi.scope`
It seems like REMOTE_ADDR is always 127.0.0.1, which is not super useful when
trying to figure out where the websocket connection is originating from.
Of course this isn't a silver bullet because most-likely the WS will be passed
through a reverse proxy anyway... in that case, the client IP is likely in the
headers under `x_forwarded_for`
* client_ip: fallback to REMOTE_ADDR
* Make @rx.memo work with state vars passed as props
Seems like this was a regression from the StatefulComponent refactor, because
trying to pass a state Var to a CustomComponent gave undefined, likely due to
`_get_vars` not accounting for `self.props` in CustomComponents.
With this change, it works.
Integration test added to `test_var_operations.py`
* Allow CustomComponent props to be Component
Avoid calling `.json()` on all Base types because the Var serializer already
does that, but this way, more specific types (like Component) can be serialized
differently.
When the type is Component, attach a VarData with the imports and hooks to when
the Var is rendered, it also carries the correct imports/hooks and does not
throw frontend errors.
* [REF-2158] Enable state when `on_load` or event_triggers are set.
Basically all events in a reflex app require the backend to be up, even the
built-in server side events round trip to the backend and require "state" even
if no user-defined state classes are declared.
test_app_state_determination: checking that state is enabled at the right time
* Clear out DECORATED_PAGES when initializing a new app
* rebase
* pass include_children kwarg in radix FormRoot
* respect include_children
* ruff fixes
* readd statemanager init, run pyi gen
* minor performance imporovements, fix for state changes
* fix pyi and pyright
* pass include_children for chakra
* remove old state detection
* add test for unused states in stateless app
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* [REF-1368] Move common form functionality to rx.el.forms
Allow plain HTML Form element to have magic on_submit event handler.
* Chakra and Radix forms inherit `on_submit` functionality from rx.el.form
Consolidate logic in the basic HTML form and use it in both Radix and Chakra
form wrappers.
* from __future__ import annotations for py38
* [REF-2098] Allow overlay Close components to have on_click handlers
The child of the Radix *Close components are passed `asChild`, meaning they are
treated as the direct child of the Close itself. This causes the `on_click`
handler attached to such an element to override the default `on_click` behavior
of the Close, which is to close the overlay, thus breaking the desired behavior
of the Close component.
When creating a Close component, if the child has an `on_click` handler, then
internally wrap it in a `Flex` so that the `Flex` gets the `asChild` treatment,
and both the default on_click and the child's on_click are both fired.
Bonus fix: pass `asChild` when constructing the `DrawerClose` to avoid a
<button> in <button> warning in the browser console, because the Drawer does
NOT pass `asChild` to the Close by default.
* Move Trigger logic to RadixThemesTriggerComponent base class
Apply trigger logic to Trigger, Close, Cancel, and Accept components; including
hover_card and dropdown_menu.
The ThemePanel fights with the ThemeProvider when the user color preference key differs from the `appearance` prop specified in the theme. To avoid issues when using the ThemePanel (in development), clear out the user color preference before loading the page and before unloading the page (to ensure it does not freeze on reload).
Clearing the user preference isn't ideal production behavior, but typically the
ThemePanel is only used during development for trying out different styles, and
having it not freeze the app is better dev behavior.
Fix#2650
* types: remove runtime imports from `is_generic_alias`
Reduce try/except contexts for better performance.
* _decode_var optimizations:
* compile the regex once at module scope
* fast path string scan for REFLEX_VAR_OPENING_TAG before doing more complex logic
* Avoid repeated `hasattr` check in `is_union`
`is_union` gets called a lot, and the hasattr check can be resolved at import
time for better performance.
* Expose `on_drop` event trigger for rx.upload component.
If `on_drop` is provided, it should be an EventSpec accepting the special
rx.upload_files() arg.
When `on_drop` is provided, it will be called immediately when files are
selected. The default functionality of saving a file list to be uploaded later
will not be available.
* update pyi file
* Undeprecate explicit EventChain
* [REF-2087] Better rx.progress styling integration with radix themes
Support the `radius` prop on `ProgressRoot`, via data-radius and CSS tokens
Support the `color_scheme` on `ProgressIndicator`, via data-accent-color and CSS token
Move high-level `Progress` to a real `Component` subclass to get better pyi hinting
Allow overriding the background color of the `ProgressIndicator` via low-level api
Remove `value` and `max` props from `ProgressRoot` (these only apply to `ProgressIndicator`)
* Progress: do not pass `value` or `max` to ProgressRoot
* progress: use background_color instead of background-color
* Expose reflex.utils.exec.is_prod_mode
Formalize runtime checking of the app's `--env` parameter.
* app_module_for_backend: wait for _compile in prod mode
Prod mode uses separate worker processes that fork from the main process.
If the app is not fully compiled when the fork occurs, any further changes to
the app (like mounting the _upload endpoint) will not be reflected in the
workers. This is not a performance hit because compile is skipped anyway
for backend processes and hot reload is not in the picture for prod mode.
* remove _is_dev_mode and replace it with calls to is_prod_mode()
_is_dev_mode was a private function in the compiler, but now that utils.exec
exposes is_prod_mode, we should use that throughout for consistency
* test_potentially_dirty_substates: when a state named State should be computed
Catch a regression introduced in 0.4.3a1
* _potentially_dirty_substates: qualify substate name
When looking up substate classes, ensure the qualified name is used to avoid
issues with same-named substates.
* pass lang and custom_attrs from app to html root
* fix some pre-commit errors and try adding lang
* fix tests
* really fix test
* cleanup with @benedikt-bartscher
* fix props and tests
* use str instead of var
* change typing of html_custom_attrs to not allow Vars
* initial attempt at writing test for urls
* turn it into a pytest test
* fix precommit and add wrong url to make sure test work
* fix darglint error and fix url set error
* black error
* add to test .md files in reflex as well
* update to fix masen comment
* black formatting
* Fix trailing slash in reflex/state.py
---------
Co-authored-by: Tom Gotsman <tomgotsman@Toms-MacBook-Pro.local>
Co-authored-by: Tom Gotsman <tomgotsman@toms-mbp.lan>
Co-authored-by: Masen Furer <m_github@0x26.net>
* added code for computed backend vars
* fixed formatting issues
* fix small bug
* fixes ruff issue
* fixed black issue
* augment test for backend computed var
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* add pulser for connection + adjust condition for connnection_modal
* update style for connection pulser
* rename connectError to connectErrors
* resolve update bug of connectErrors
* fix pulse definition
* rollback pulse definition
* Define WifiOffPulse icon as its own component
Attach the pulse keyframes and imports to the icon itself so that the code gets
properly included in stateful_components.js when it is used.
* limit number of errors in memory
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* WiP get_state
* Refactor get_state fast path
Rudimentary protection for state instance access from a background task
(StateProxy)
* retain dirty substate marking per `_mark_dirty` call to avoid test changes
* Find common ancestor by part instead of by character
Fix StateProxy for substates and parent_state attributes (have to handle in
__getattr__, not property)
Fix type annotation for `get_state`
* test_state: workflow test for `get_state` functionality
* Do not reset _always_dirty_substates when adding vars
Reset the substate tracking only when the class is instantiated.
* test_state_tree: test substate access in a larger state tree
Ensure that `get_state` returns the proper "branch" of the state tree depending
on what substate is requested.
* test_format: fixup broken tests from adding substates of TestState
* Fix flaky integration tests with more polling
* AppHarness: reset _always_dirty_substates on rx.State
* RuntimeError unless State is instantiated with _reflex_internal_init=True
Avoid user errors trying to directly instantiate State classes
* Helper functions for _substate_key and _split_substate_key
Unify the implementation of generating and decoding the token + state name
format used for redis state sharding.
* StateManagerRedis: use create_task in get_state and set_state
read and write substates concurrently (allow redis to shine)
* test_state_inheritance: use polling cuz life too short for flaky tests
kthnxbai ❤️
* Move _is_testing_env to reflex.utils.exec.is_testing_env
Reuse the code in app.py
* Break up `BaseState.get_state` and friends into separate methods
* Add test case for pre-fetching cached var dependency
* Move on_load_internal and update_vars_internal to substates
Avoid loading the entire state tree to process these common internal events. If
the state tree is very large, this allow page navigation to occur more quickly.
Pre-fetch substates that contain cached vars, as they may need to be recomputed
if certain vars change.
* Do not copy ROUTER_DATA into all substates.
This is a waste of time and memory, and can be handled via a special case in
__getattribute__
* Track whether State instance _was_touched
Avoid wasting time serializing states that have no modifications
* Do not persist states in `StateManagerRedis.get_state`
Wait until the state is actually modified, and then persist it as part of `set_state`.
Factor out common logic into helper methods for readability and to reduce
duplication of common logic.
To avoid having to recursively call `get_state`, which would require persisting
the instance and then getting it again, some of the initialization logic
regarding parent_state and substates is duplicated when creating a new
instance. This is for performance reasons.
* Remove stray print()
* context.js.jinja2: fix check for empty local storage / cookie vars
* Add comments for onLoadInternalEvent and initialEvents
* nit: typo
* split _get_was_touched into _update_was_touched
Improve clarity in cases where _get_was_touched was being called for its side
effects only.
* Remove extraneous information from incorrect State instantiation error
* Update missing redis exception message
* fix inherited backend var deps
* fixing the real issue with @masenf
* Revert "fix inherited backend var deps"
This reverts commit 894e3e14ac.
* python 3.8
* initial values for computed vars draft
* add tests, add computed_var overloads
* fix darglint
* pass initial to substates when calling dict
* add tests for for child states
* format black
* allow None as initial value
* rename runtime_only to raises_at_runtime
* cleanup unused arguments of ComputedVars
* refactor cached_var to be partial of computed_var
* test_state: augment modify_state test for writing MutableProxy
If the object contains a MutableProxy inside of it, then we get a pickling
error.
* Implement __reduce_ex__ for MutableProxy
Pass through `__reduce_ex__` onto the wrapped instance to strip it off when
cloudpickling to redis.
* base: get_value actually works with a str key
Unless the key isn't a field on the model, then it falls back to the previous
behavior of just returning the given key as is... why does it do this? I don't
know.
* fix image serializing
* If get_format_mimetype does not work, look up format in Image.MIME
Throw a warning if the image format does not have an associated MIME type and
ultimately fallback to image/png and let the browser figure it out.
* test_media: end to end serialization of PIL images
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Move sharding internal to StateManager
Avoid leaking sharding implementation details all over the State class and
breaking the API
* WiP StateManager based sharding
* Copy the state __dict__ when serializing to avoid breaking the instance
* State tests need to pass the correct substate token for redis
* state: when getting parent_state, set top_level=False
ensure that we don't end up with a broken tree
* test_app: get tests passing with redis by passing the correct token
refactor upload tests to suck less
* test_client_storage: look up substate key
* state.py: pass static checks
* test_dynamic_routes: working with redis state shard
* Update the remaining AppHarness tests to pass {token}_{state.get_full_name()}
* test_app: pass all tokens with state suffix
* StateManagerRedis: clean up commentary
* feat: Synchronizing localStorage between tabs using browser events
* test_client_storage: Test sync'd local storage vars
* update_vars_internal: generic handler to apply var changes to state tree
Apply fully qualified var names to each substate they are associated with. This
allows consistent updates to arbitrary state vars without having to know their
"setter" arguments, in case the user has overwritted the `set_x` name.
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Accordion Items unique Value
use crypto.randomUUID to generate accordion item value at runtime instead of compile time
* use generateUUID in state.js instead of crypto.randomUUID()
* Accordion Root Exclude `color_scheme` and `variant` props in tag
* colorScheme -> color for radix primitives
* remove _rename_props based on pr comments
* lint
* pyi fix
* pop instead of del
* link: respect `is_external` prop and other attributes on A tag
Instead of passing all props to NextLink by default, only pass props that
NextLink understands, placing the remaining props on the Radix link
Add a test case to avoid regression of `is_external` behavior.
* Link is a MemoizationLeaf
Because Link is often rendered with NextLink as_child, and NextLink breaks if
the href is stateful outside of a Link, ensure that any stateful child of Link
gets memoized together.
* rx.el.img accepts Any type for src prop
This retains compatibility with the previous chakra image src prop.
* Re-add `moment` back to top-level namespace
* Component: translate underscore suffix for props supported by chakra
type_ becomes type
min_ becomes min
max_ becomes max
id_ becomes id
The deprecation warning is only displayed when the underscore suffix prop is
passed and the non-underscore suffix prop is defined on the given component.
* Rename type_ to type in accordion and scroll_area
All of the new radix components avoid the underscore suffix names where
possible.
* Update deprecation warning wording
* Refactor for readability
* Do not raise deprecation warning for `id_`
id is kind of a special prop because it exists on all components
* Add test case for deprecating underscore suffix props
* Show rx.chakra upgrade message _before_ overwriting the version
Ensure that the conditions for showing the rx.chakra upgrade message
are checked before overwriting the version saved in .web/reflex.json.
Check for the absense of a config file to suppress the upgrade message
when init'ing a brand new project.
Check for the existance of `reflex.json` before opening it, since it
might not exist at the point it's checked.
* Update more information link in chakra upgrade message
* Fix long line
* initial attempt that works for dataframe and text downloads
* changes for masens comments
* Instead of using blob, just send a data: URL from the backend
* Enable rx.download directly with Var
If the Var is string-like and starts with `data:`, then no special processing
occurs. Otherwise, the value is passed to JSON.stringify and downloaded as
text/plain.
* event: update docstring and comments on rx.download
Raise ValueError when URL and data are both provided, or the data provided is
not one of the expected types.
---------
Co-authored-by: Tom Gotsman <tomgotsman@toms-mbp.lan>
Co-authored-by: Masen Furer <m_github@0x26.net>
* style: shorthand replacements need camelCase
Avoid warning on terminal and in browser console from using kebab-case CSS
props with emotion.
* _rename_props only replace prop name once
In case the value also contains the prop name, we don't want to replace it
multiple times.
* pyi_generator: ignore _rename_props in create signature
* Avoid shadowing CSS prop `display` and `gap`
Replace usages of `gap` with `spacing` to retain Radix sizing number system,
while allowing users to specify a responsive `gap` using CSS units.
Remove `display` props from radix components, allowing `display` to accept
responsive lists.
* checkbox: apply `gap` to `flex` if provided
* Remove _rename_props from .create signatures
* Fix spacing prop in blank template
* Fixup tests after changing style shorthand to return camelCase
* banner.py: fix import specification for getBackendURL
Use the constant Dirs.STATE_PATH
* state.js: only `getBackendURL` dynamically when running client side
During server side rendering, `getBackendURL` cannot access the current
location from the `window`, because there is no `window`.
* Better client-side context checking
Thanks jackie
* Convert templates to use `rx.chakra` where needed
* reflex_init_in_docker_test: run test on PR into reflex-0.4.0
This is why we didn't catch the template issues earlier
* upload with StaticFiles
* always create uploaded files folder
* just use /_upload to serve uploaded files
* Upload: update pyi file
* app.py: only mount Upload StaticFiles if the upload component is used
* wip event handlers for state mixins
* fix computed vars, prepare event handler tests
* fix computed vars and event handlers inherited by mixins
* Base is not a mixin
* improve state inheritance tests
* wait for alerts to appear
* poll_for_content to fix flaky ci tests
* pyi_generator: always ignore files starting with `tests`
* Move CodeBlock out of chakra namespace
* Expose additional names in the top-level namespace
* code pyi fixup
* expose input and quote at the top-level
* add text_field to top-level namespace (maybe)
* fixup chakra code.pyi
* Remove `text_field` from top level namespace
* Remove top-level big C Cond
* fixup top level pyi
* Reserve top-level __call__ for a future high level API
Instead of aliasing the top-level `__call__` to `.root`, require users
to explicitly call `.root` to avoid breakage when a future high level
API gets implemented and takes over the top-level `__call__`
Fix REF-1839
* alertdialog: forgot this one
* update to ensure every radix component only inherits events from EventTriggers class
* update the naming of event handlers to swap name on_value_change and on_checked_change to on_change
* update to call _replace_prop_names in component.py
* small darglint error fix
* update to ensure every radix component only inherits events from EventTriggers class
* update the naming of event handlers to swap name on_value_change and on_checked_change to on_change
* update to call _replace_prop_names in component.py
* small darglint error fix
* updates to pass pytest tests
* small fix
* duplicate removal
---------
Co-authored-by: Tom Gotsman <tomgotsman@toms-mbp.lan>
* adding cancel and action sub components for alert dialog
* updates to pass integration tests
* add components
---------
Co-authored-by: Tom Gotsman <tomgotsman@Toms-MacBook-Pro.local>
Co-authored-by: Tom Gotsman <tomgotsman@toms-mbp.lan>