reflex 0.7.9a2__py3-none-any.whl → 0.7.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

reflex/testing.py CHANGED
@@ -45,6 +45,7 @@ from reflex.state import (
45
45
  )
46
46
  from reflex.utils import console
47
47
  from reflex.utils.export import export
48
+ from reflex.utils.types import ASGIApp
48
49
 
49
50
  try:
50
51
  from selenium import webdriver
@@ -110,6 +111,7 @@ class AppHarness:
110
111
  app_module_path: Path
111
112
  app_module: types.ModuleType | None = None
112
113
  app_instance: reflex.App | None = None
114
+ app_asgi: ASGIApp | None = None
113
115
  frontend_process: subprocess.Popen | None = None
114
116
  frontend_url: str | None = None
115
117
  frontend_output_thread: threading.Thread | None = None
@@ -270,11 +272,14 @@ class AppHarness:
270
272
  # Ensure the AppHarness test does not skip State assignment due to running via pytest
271
273
  os.environ.pop(reflex.constants.PYTEST_CURRENT_TEST, None)
272
274
  os.environ[reflex.constants.APP_HARNESS_FLAG] = "true"
273
- self.app_module = reflex.utils.prerequisites.get_compiled_app(
274
- # Do not reload the module for pre-existing apps (only apps generated from source)
275
- reload=self.app_source is not None
275
+ # Ensure we actually compile the app during first initialization.
276
+ self.app_instance, self.app_module = (
277
+ reflex.utils.prerequisites.get_and_validate_app(
278
+ # Do not reload the module for pre-existing apps (only apps generated from source)
279
+ reload=self.app_source is not None
280
+ )
276
281
  )
277
- self.app_instance = self.app_module.app
282
+ self.app_asgi = self.app_instance()
278
283
  if self.app_instance and isinstance(
279
284
  self.app_instance._state_manager, StateManagerRedis
280
285
  ):
@@ -300,10 +305,10 @@ class AppHarness:
300
305
  async def _shutdown(*args, **kwargs) -> None:
301
306
  # ensure redis is closed before event loop
302
307
  if self.app_instance is not None and isinstance(
303
- self.app_instance.state_manager, StateManagerRedis
308
+ self.app_instance._state_manager, StateManagerRedis
304
309
  ):
305
310
  with contextlib.suppress(ValueError):
306
- await self.app_instance.state_manager.close()
311
+ await self.app_instance._state_manager.close()
307
312
 
308
313
  # socketio shutdown handler
309
314
  if self.app_instance is not None and self.app_instance.sio is not None:
@@ -323,11 +328,11 @@ class AppHarness:
323
328
  return _shutdown
324
329
 
325
330
  def _start_backend(self, port: int = 0):
326
- if self.app_instance is None or self.app_instance._api is None:
331
+ if self.app_asgi is None:
327
332
  raise RuntimeError("App was not initialized.")
328
333
  self.backend = uvicorn.Server(
329
334
  uvicorn.Config(
330
- app=self.app_instance._api,
335
+ app=self.app_asgi,
331
336
  host="127.0.0.1",
332
337
  port=port,
333
338
  )
@@ -349,13 +354,13 @@ class AppHarness:
349
354
  if (
350
355
  self.app_instance is not None
351
356
  and isinstance(
352
- self.app_instance.state_manager,
357
+ self.app_instance._state_manager,
353
358
  StateManagerRedis,
354
359
  )
355
360
  and self.app_instance._state is not None
356
361
  ):
357
362
  with contextlib.suppress(RuntimeError):
358
- await self.app_instance.state_manager.close()
363
+ await self.app_instance._state_manager.close()
359
364
  self.app_instance._state_manager = StateManagerRedis.create(
360
365
  state=self.app_instance._state,
361
366
  )
@@ -937,7 +942,9 @@ class AppHarnessProd(AppHarness):
937
942
 
938
943
  get_config().loglevel = reflex.constants.LogLevel.INFO
939
944
 
940
- if reflex.utils.prerequisites.needs_reinit(frontend=True):
945
+ reflex.utils.prerequisites.assert_in_reflex_dir()
946
+
947
+ if reflex.utils.prerequisites.needs_reinit():
941
948
  reflex.reflex._init(name=get_config().app_name)
942
949
 
943
950
  export(
@@ -957,12 +964,12 @@ class AppHarnessProd(AppHarness):
957
964
  raise RuntimeError("Frontend did not start")
958
965
 
959
966
  def _start_backend(self):
960
- if self.app_instance is None:
967
+ if self.app_asgi is None:
961
968
  raise RuntimeError("App was not initialized.")
962
969
  environment.REFLEX_SKIP_COMPILE.set(True)
963
970
  self.backend = uvicorn.Server(
964
971
  uvicorn.Config(
965
- app=self.app_instance,
972
+ app=self.app_asgi,
966
973
  host="127.0.0.1",
967
974
  port=0,
968
975
  workers=reflex.utils.processes.get_num_workers(),
@@ -38,7 +38,7 @@ from redis.exceptions import RedisError
38
38
  from reflex import constants, model
39
39
  from reflex.compiler import templates
40
40
  from reflex.config import Config, environment, get_config
41
- from reflex.utils import console, net, path_ops, processes
41
+ from reflex.utils import console, net, path_ops, processes, redir
42
42
  from reflex.utils.decorator import once
43
43
  from reflex.utils.exceptions import (
44
44
  GeneratedCodeHasNoFunctionDefsError,
@@ -65,7 +65,6 @@ class Template:
65
65
  name: str
66
66
  description: str
67
67
  code_url: str
68
- demo_url: str | None = None
69
68
 
70
69
 
71
70
  @dataclasses.dataclass(frozen=True)
@@ -840,18 +839,24 @@ def initialize_gitignore(
840
839
 
841
840
  def initialize_requirements_txt() -> bool:
842
841
  """Initialize the requirements.txt file.
843
- If absent, generate one for the user.
842
+ If absent and no pyproject.toml file exists, generate one for the user.
844
843
  If the requirements.txt does not have reflex as dependency,
845
844
  generate a requirement pinning current version and append to
846
845
  the requirements.txt file.
847
846
 
848
847
  Returns:
849
- True if the requirements.txt file was created or updated, False otherwise.
848
+ True if the user has to update the requirements.txt file.
850
849
 
851
850
  Raises:
852
851
  Exit: If the requirements.txt file cannot be read or written to.
853
852
  """
854
853
  requirements_file_path = Path(constants.RequirementsTxt.FILE)
854
+ if (
855
+ not requirements_file_path.exists()
856
+ and Path(constants.PyprojectToml.FILE).exists()
857
+ ):
858
+ return True
859
+
855
860
  requirements_file_path.touch(exist_ok=True)
856
861
 
857
862
  for encoding in [None, "utf-8"]:
@@ -864,12 +869,12 @@ def initialize_requirements_txt() -> bool:
864
869
  console.error(f"Failed to read {requirements_file_path}.")
865
870
  raise click.exceptions.Exit(1) from e
866
871
  else:
867
- return False
872
+ return True
868
873
 
869
874
  for line in content.splitlines():
870
875
  if re.match(r"^reflex[^a-zA-Z0-9]", line):
871
876
  console.debug(f"{requirements_file_path} already has reflex as dependency.")
872
- return True
877
+ return False
873
878
 
874
879
  console.debug(
875
880
  f"Appending {constants.RequirementsTxt.DEFAULTS_STUB} to {requirements_file_path}"
@@ -879,7 +884,7 @@ def initialize_requirements_txt() -> bool:
879
884
  "\n" + constants.RequirementsTxt.DEFAULTS_STUB + constants.Reflex.VERSION
880
885
  )
881
886
 
882
- return True
887
+ return False
883
888
 
884
889
 
885
890
  def initialize_app_directory(
@@ -1365,17 +1370,11 @@ def check_running_mode(frontend: bool, backend: bool) -> tuple[bool, bool]:
1365
1370
  return frontend, backend
1366
1371
 
1367
1372
 
1368
- def needs_reinit(frontend: bool = True) -> bool:
1369
- """Check if an app needs to be reinitialized.
1370
-
1371
- Args:
1372
- frontend: Whether to check if the frontend is initialized.
1373
-
1374
- Returns:
1375
- Whether the app needs to be reinitialized.
1373
+ def assert_in_reflex_dir():
1374
+ """Assert that the current working directory is the reflex directory.
1376
1375
 
1377
1376
  Raises:
1378
- Exit: If the app is not initialized.
1377
+ Exit: If the current working directory is not the reflex directory.
1379
1378
  """
1380
1379
  if not constants.Config.FILE.exists():
1381
1380
  console.error(
@@ -1383,10 +1382,13 @@ def needs_reinit(frontend: bool = True) -> bool:
1383
1382
  )
1384
1383
  raise click.exceptions.Exit(1)
1385
1384
 
1386
- # Don't need to reinit if not running in frontend mode.
1387
- if not frontend:
1388
- return False
1389
1385
 
1386
+ def needs_reinit() -> bool:
1387
+ """Check if an app needs to be reinitialized.
1388
+
1389
+ Returns:
1390
+ Whether the app needs to be reinitialized.
1391
+ """
1390
1392
  # Make sure the .reflex directory exists.
1391
1393
  if not environment.REFLEX_DIR.get().exists():
1392
1394
  return True
@@ -1600,22 +1602,13 @@ def prompt_for_template_options(templates: list[Template]) -> str:
1600
1602
  # Show the user the URLs of each template to preview.
1601
1603
  console.print("\nGet started with a template:")
1602
1604
 
1603
- def format_demo_url_str(url: str | None) -> str:
1604
- return f" ({url})" if url else ""
1605
-
1606
1605
  # Prompt the user to select a template.
1607
- id_to_name = {
1608
- str(
1609
- idx
1610
- ): f"{template.name.replace('_', ' ').replace('-', ' ')}{format_demo_url_str(template.demo_url)} - {template.description}"
1611
- for idx, template in enumerate(templates)
1612
- }
1613
- for id in range(len(id_to_name)):
1614
- console.print(f"({id}) {id_to_name[str(id)]}")
1606
+ for index, template in enumerate(templates):
1607
+ console.print(f"({index}) {template.description}")
1615
1608
 
1616
1609
  template = console.ask(
1617
1610
  "Which template would you like to use?",
1618
- choices=[str(i) for i in range(len(id_to_name))],
1611
+ choices=[str(i) for i in range(len(templates))],
1619
1612
  show_choices=False,
1620
1613
  default="0",
1621
1614
  )
@@ -1884,14 +1877,17 @@ def initialize_app(app_name: str, template: str | None = None) -> str | None:
1884
1877
 
1885
1878
  if template is None:
1886
1879
  template = prompt_for_template_options(get_init_cli_prompt_options())
1880
+
1887
1881
  if template == constants.Templates.CHOOSE_TEMPLATES:
1888
- console.print(
1889
- f"Go to the templates page ({constants.Templates.REFLEX_TEMPLATES_URL}) and copy the command to init with a template."
1890
- )
1882
+ redir.reflex_templates()
1891
1883
  raise click.exceptions.Exit(0)
1892
1884
 
1885
+ if template == constants.Templates.AI:
1886
+ redir.reflex_build_redirect()
1887
+ raise click.exceptions.Exit(0)
1888
+
1893
1889
  # If the blank template is selected, create a blank app.
1894
- if template in (constants.Templates.DEFAULT,):
1890
+ if template == constants.Templates.DEFAULT:
1895
1891
  # Default app creation behavior: a blank app.
1896
1892
  initialize_default_app(app_name)
1897
1893
  else:
@@ -1914,19 +1910,16 @@ def get_init_cli_prompt_options() -> list[Template]:
1914
1910
  Template(
1915
1911
  name=constants.Templates.DEFAULT,
1916
1912
  description="A blank Reflex app.",
1917
- demo_url=constants.Templates.DEFAULT_TEMPLATE_URL,
1918
1913
  code_url="",
1919
1914
  ),
1920
1915
  Template(
1921
1916
  name=constants.Templates.AI,
1922
- description="Generate a template using AI [Experimental]",
1923
- demo_url="",
1917
+ description="[bold]Try our free AI builder.",
1924
1918
  code_url="",
1925
1919
  ),
1926
1920
  Template(
1927
1921
  name=constants.Templates.CHOOSE_TEMPLATES,
1928
- description="Choose an existing template.",
1929
- demo_url="",
1922
+ description="Premade templates built by the Reflex team.",
1930
1923
  code_url="",
1931
1924
  ),
1932
1925
  ]
@@ -1264,7 +1264,7 @@ class PyiGenerator:
1264
1264
  dict(
1265
1265
  zip(
1266
1266
  [
1267
- str(f.relative_to(pyi_hashes_file.parent))
1267
+ f.relative_to(pyi_hashes_file.parent).as_posix()
1268
1268
  for f in file_paths
1269
1269
  ],
1270
1270
  hashes,
@@ -1291,9 +1291,10 @@ class PyiGenerator:
1291
1291
  for file_path, hashed_content in zip(
1292
1292
  file_paths, hashes, strict=False
1293
1293
  ):
1294
- pyi_hashes[str(file_path.relative_to(pyi_hashes_parent))] = (
1295
- hashed_content
1296
- )
1294
+ formatted_path = file_path.relative_to(
1295
+ pyi_hashes_parent
1296
+ ).as_posix()
1297
+ pyi_hashes[formatted_path] = hashed_content
1297
1298
 
1298
1299
  pyi_hashes_file.write_text(
1299
1300
  json.dumps(pyi_hashes, indent=2, sort_keys=True) + "\n"
reflex/utils/redir.py CHANGED
@@ -21,6 +21,8 @@ def open_browser(target_url: str) -> None:
21
21
  console.warn(
22
22
  f"Unable to automatically open the browser. Please navigate to {target_url} in your browser."
23
23
  )
24
+ else:
25
+ console.info(f"Opening browser to {target_url}.")
24
26
 
25
27
 
26
28
  def open_browser_and_wait(
@@ -52,3 +54,8 @@ def open_browser_and_wait(
52
54
  def reflex_build_redirect() -> None:
53
55
  """Open the browser window to reflex.build."""
54
56
  open_browser(constants.Templates.REFLEX_BUILD_FRONTEND)
57
+
58
+
59
+ def reflex_templates():
60
+ """Open the browser window to reflex.build/templates."""
61
+ open_browser(constants.Templates.REFLEX_TEMPLATES_URL)
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import contextlib
6
6
  import dataclasses
7
+ import decimal
7
8
  import functools
8
9
  import inspect
9
10
  import json
@@ -386,6 +387,19 @@ def serialize_uuid(uuid: UUID) -> str:
386
387
  return str(uuid)
387
388
 
388
389
 
390
+ @serializer(to=float)
391
+ def serialize_decimal(value: decimal.Decimal) -> float:
392
+ """Serialize a Decimal to a float.
393
+
394
+ Args:
395
+ value: The Decimal to serialize.
396
+
397
+ Returns:
398
+ The serialized Decimal as a float.
399
+ """
400
+ return float(value)
401
+
402
+
389
403
  @serializer(to=str)
390
404
  def serialize_color(color: Color) -> str:
391
405
  """Serialize a color.
reflex/vars/base.py CHANGED
@@ -15,6 +15,7 @@ import string
15
15
  import uuid
16
16
  import warnings
17
17
  from collections.abc import Callable, Coroutine, Iterable, Mapping, Sequence
18
+ from decimal import Decimal
18
19
  from types import CodeType, FunctionType
19
20
  from typing import ( # noqa: UP035
20
21
  TYPE_CHECKING,
@@ -630,6 +631,14 @@ class Var(Generic[VAR_TYPE]):
630
631
  _var_data: VarData | None = None,
631
632
  ) -> LiteralNumberVar[float]: ...
632
633
 
634
+ @overload
635
+ @classmethod
636
+ def create(
637
+ cls,
638
+ value: Decimal,
639
+ _var_data: VarData | None = None,
640
+ ) -> LiteralNumberVar[Decimal]: ...
641
+
633
642
  @overload
634
643
  @classmethod
635
644
  def create( # pyright: ignore [reportOverlappingOverload]
@@ -743,7 +752,10 @@ class Var(Generic[VAR_TYPE]):
743
752
  def to(self, output: type[int]) -> NumberVar[int]: ...
744
753
 
745
754
  @overload
746
- def to(self, output: type[int] | type[float]) -> NumberVar: ...
755
+ def to(self, output: type[float]) -> NumberVar[float]: ...
756
+
757
+ @overload
758
+ def to(self, output: type[Decimal]) -> NumberVar[Decimal]: ...
747
759
 
748
760
  @overload
749
761
  def to(
reflex/vars/number.py CHANGED
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import dataclasses
6
+ import decimal
6
7
  import json
7
8
  import math
8
9
  from collections.abc import Callable
@@ -30,7 +31,10 @@ from .base import (
30
31
  )
31
32
 
32
33
  NUMBER_T = TypeVarExt(
33
- "NUMBER_T", bound=(int | float), default=(int | float), covariant=True
34
+ "NUMBER_T",
35
+ bound=(int | float | decimal.Decimal),
36
+ default=(int | float | decimal.Decimal),
37
+ covariant=True,
34
38
  )
35
39
 
36
40
  if TYPE_CHECKING:
@@ -54,7 +58,7 @@ def raise_unsupported_operand_types(
54
58
  )
55
59
 
56
60
 
57
- class NumberVar(Var[NUMBER_T], python_types=(int, float)):
61
+ class NumberVar(Var[NUMBER_T], python_types=(int, float, decimal.Decimal)):
58
62
  """Base class for immutable number vars."""
59
63
 
60
64
  def __add__(self, other: number_types) -> NumberVar:
@@ -285,13 +289,13 @@ class NumberVar(Var[NUMBER_T], python_types=(int, float)):
285
289
 
286
290
  return number_exponent_operation(+other, self)
287
291
 
288
- def __neg__(self):
292
+ def __neg__(self) -> NumberVar:
289
293
  """Negate the number.
290
294
 
291
295
  Returns:
292
296
  The number negation operation.
293
297
  """
294
- return number_negate_operation(self)
298
+ return number_negate_operation(self) # pyright: ignore [reportReturnType]
295
299
 
296
300
  def __invert__(self):
297
301
  """Boolean NOT the number.
@@ -943,7 +947,7 @@ def boolean_not_operation(value: BooleanVar):
943
947
  class LiteralNumberVar(LiteralVar, NumberVar[NUMBER_T]):
944
948
  """Base class for immutable literal number vars."""
945
949
 
946
- _var_value: float | int = dataclasses.field(default=0)
950
+ _var_value: float | int | decimal.Decimal = dataclasses.field(default=0)
947
951
 
948
952
  def json(self) -> str:
949
953
  """Get the JSON representation of the var.
@@ -954,6 +958,8 @@ class LiteralNumberVar(LiteralVar, NumberVar[NUMBER_T]):
954
958
  Raises:
955
959
  PrimitiveUnserializableToJSONError: If the var is unserializable to JSON.
956
960
  """
961
+ if isinstance(self._var_value, decimal.Decimal):
962
+ return json.dumps(float(self._var_value))
957
963
  if math.isinf(self._var_value) or math.isnan(self._var_value):
958
964
  raise PrimitiveUnserializableToJSONError(
959
965
  f"No valid JSON representation for {self}"
@@ -969,7 +975,9 @@ class LiteralNumberVar(LiteralVar, NumberVar[NUMBER_T]):
969
975
  return hash((type(self).__name__, self._var_value))
970
976
 
971
977
  @classmethod
972
- def create(cls, value: float | int, _var_data: VarData | None = None):
978
+ def create(
979
+ cls, value: float | int | decimal.Decimal, _var_data: VarData | None = None
980
+ ):
973
981
  """Create the number var.
974
982
 
975
983
  Args:
@@ -1039,7 +1047,7 @@ class LiteralBooleanVar(LiteralVar, BooleanVar):
1039
1047
  )
1040
1048
 
1041
1049
 
1042
- number_types = NumberVar | int | float
1050
+ number_types = NumberVar | int | float | decimal.Decimal
1043
1051
  boolean_types = BooleanVar | bool
1044
1052
 
1045
1053
 
@@ -1112,4 +1120,4 @@ def ternary_operation(
1112
1120
  return value
1113
1121
 
1114
1122
 
1115
- NUMBER_TYPES = (int, float, NumberVar)
1123
+ NUMBER_TYPES = (int, float, decimal.Decimal, NumberVar)
reflex/vars/sequence.py CHANGED
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import collections.abc
6
6
  import dataclasses
7
+ import decimal
7
8
  import inspect
8
9
  import json
9
10
  import re
@@ -1558,7 +1559,7 @@ def is_tuple_type(t: GenericType) -> bool:
1558
1559
 
1559
1560
 
1560
1561
  def _determine_value_of_array_index(
1561
- var_type: GenericType, index: int | float | None = None
1562
+ var_type: GenericType, index: int | float | decimal.Decimal | None = None
1562
1563
  ):
1563
1564
  """Determine the value of an array index.
1564
1565
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.7.9a2
3
+ Version: 0.7.10
4
4
  Summary: Web apps in pure Python.
5
5
  Project-URL: homepage, https://reflex.dev
6
6
  Project-URL: repository, https://github.com/reflex-dev/reflex
@@ -31,7 +31,7 @@ Requires-Dist: pydantic<3.0,>=1.10.21
31
31
  Requires-Dist: python-multipart<1.0,>=0.0.20
32
32
  Requires-Dist: python-socketio<6.0,>=5.12.0
33
33
  Requires-Dist: redis<6.0,>=5.2.1
34
- Requires-Dist: reflex-hosting-cli>=0.1.43
34
+ Requires-Dist: reflex-hosting-cli>=0.1.47
35
35
  Requires-Dist: rich<15,>=13
36
36
  Requires-Dist: sqlmodel<0.1,>=0.0.24
37
37
  Requires-Dist: typing-extensions>=4.13.0
@@ -2,19 +2,19 @@ reflex/__init__.py,sha256=viEt38jc1skwOUBwwlwPL02hcGrm9xNQzKExVftZEx4,10365
2
2
  reflex/__init__.pyi,sha256=h9ltlhaz1dySsNYpUkN_VCjEzHGfb1h18ThYh15QjyU,11358
3
3
  reflex/__main__.py,sha256=6cVrGEyT3j3tEvlEVUatpaYfbB5EF3UVY-6vc_Z7-hw,108
4
4
  reflex/admin.py,sha256=Nbc38y-M8iaRBvh1W6DQu_D3kEhO8JFvxrog4q2cB_E,434
5
- reflex/app.py,sha256=46nFXGVDIvptbReSnCFZ6le4NCXkI9BFnKJ_bidxU4M,73552
5
+ reflex/app.py,sha256=7nR9UkLUQaEi2xSpeuDzKuNakcK2e3NYatVYX3To7pE,73786
6
6
  reflex/assets.py,sha256=PLTKAMYPKMZq8eWXKX8uco6NZ9IiPGWal0bOPLUmU7k,3364
7
7
  reflex/base.py,sha256=U7i_ijkbSLUDm1TlTYYZEm5P6ZiVO1aIT1MJKXO6V1o,3881
8
- reflex/config.py,sha256=g2t8W07Yq7OFBzEFp5lsy2V6p977hCO872gxPpSDZSU,35521
9
- reflex/event.py,sha256=_1ViwJFQ3wnQgf1_SP7SdUHeI7qoz62o18gaxPoIGyg,63403
8
+ reflex/config.py,sha256=IhsjpYtsR9-7YxkpIDpKnFVaZ_hHYYdldHYLuh_daHc,35491
9
+ reflex/event.py,sha256=Uin1bWR51BjKtj-otQM5KazJd4ABaEl1cSiJBVI20Yw,64440
10
10
  reflex/model.py,sha256=eOWc157txBIUmYMZqQeKKdn2dm4Tsf8h8CbqeLXvjeg,17577
11
11
  reflex/page.py,sha256=mqioadLDsABvfNqdLbxvUKqi1gulSKddMihZe3pjtdc,2678
12
12
  reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- reflex/reflex.py,sha256=-4xW2AnbJUKc6v9jsgmuhtObkZHmtUNtQW7sPU7Do44,20872
13
+ reflex/reflex.py,sha256=MnqTPqgq3lkd5McHvpo-NeGM3uHIaGkLUclOZ3RNlFU,21017
14
14
  reflex/route.py,sha256=nn_hJwtQdjiqH_dHXfqMGWKllnyPQZTSR-KWdHDhoOs,4210
15
- reflex/state.py,sha256=JfwlsoFUzHnfJM8GLAFXw5K_UwK5wJOsetljx6hU6gk,142341
15
+ reflex/state.py,sha256=ik3yezBR6vomaIdpFZClXy4w6CVdU3dR39IQDdahSTA,89423
16
16
  reflex/style.py,sha256=8ciwcReoKSrPSwoteXJwv7YTK514tf7jrJ5RfqztmvA,13186
17
- reflex/testing.py,sha256=QNas8LmceEOs3P5u9yxjBOJ1yT50otEB0UxvBegojDA,36078
17
+ reflex/testing.py,sha256=sCvxy7GjXB40dWZ_BbcXxrQvFXnRlS6VyWPVkU7j7JU,36297
18
18
  reflex/.templates/apps/blank/assets/favicon.ico,sha256=baxxgDAQ2V4-G5Q4S2yK5uUJTUGkv-AOWBQ0xd6myUo,4286
19
19
  reflex/.templates/apps/blank/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  reflex/.templates/apps/blank/code/blank.py,sha256=oKnsBBZM1-_RFAuwGKgfiCzgsrHlN_m_XP0-Fpnld7k,926
@@ -63,7 +63,7 @@ reflex/compiler/templates.py,sha256=NX3YUMVGGyDsy2JuDv-AmklMM0pKJHLPsIpdqamgqRQ,
63
63
  reflex/compiler/utils.py,sha256=nFkAyJK0anKVdknQMSsmB9z0FnsZIr4myl5s0qXvPHI,16067
64
64
  reflex/components/__init__.py,sha256=zbIXThv1WPI0FdIGf9G9RAmGoCRoGy7nHcSZ8K5D5bA,624
65
65
  reflex/components/__init__.pyi,sha256=qoj1zIWaitcZOGcJ6k7wuGJk_GAJCE9Xtx8CeRVrvoE,861
66
- reflex/components/component.py,sha256=dwF3a48OvlgcMwGWgAn592u8ZeStwV19AzKWQTtbGdM,89500
66
+ reflex/components/component.py,sha256=xo5pXzwUM9ZSEm8VJGU-TBENkzMzxa0WNjy2iF6_dTo,90863
67
67
  reflex/components/dynamic.py,sha256=HyETl1flxzPwgXVLRAGcIYqaV-SV4UCjL-VWdLGwtos,7293
68
68
  reflex/components/literals.py,sha256=hogLnwTJxFJODIvqihg-GD9kFZVsEBDoYzaRit56Nuk,501
69
69
  reflex/components/props.py,sha256=8F2ZNeF16BDiTh-E4F-U_vks41BMJgmkTM7xbjGvfOA,2593
@@ -112,8 +112,8 @@ reflex/components/core/match.py,sha256=qCLSQ70Pcsv3pSAEYfHAjahDazSGDSIBQ2CwkBshK
112
112
  reflex/components/core/responsive.py,sha256=ACZdtJ4a4F8B3dm1k8h6J2_UJx0Z5LDB7XHQ2ty4wAc,1911
113
113
  reflex/components/core/sticky.py,sha256=2B3TxrwG2Rtp_lv1VkMOIF2bqSiT7qYGbqbiZiMKxKY,3856
114
114
  reflex/components/core/sticky.pyi,sha256=kC2WokNamJUU3LKeMZNZsptBJ4ZOj_V-WAfw09EvBpo,32340
115
- reflex/components/core/upload.py,sha256=LqBNKU9LZ0PhaGGnJGEHtXZ39MIqzCghBgUXt43kGH8,12156
116
- reflex/components/core/upload.pyi,sha256=dmdkAnaYH6SftvycGLLnfhmyMNx8loO5NjR-SpWmIss,14974
115
+ reflex/components/core/upload.py,sha256=E3besM7F-upwemTaxrLW2X4VBOLCUxddvchPc9tXH74,13370
116
+ reflex/components/core/upload.pyi,sha256=whgAZA_wUk1PBpLkD16MnKIfLBvBmiEImz2V_UpYqAc,15377
117
117
  reflex/components/core/layout/__init__.py,sha256=znldZaj_NGt8qCZDG70GMwjMTskcvCf_2N_EjCAHwdc,30
118
118
  reflex/components/datadisplay/__init__.py,sha256=L8pWWKNHWdUD2fbZRoEKjd_8c_hpDdGYO463hwkoIi4,438
119
119
  reflex/components/datadisplay/__init__.pyi,sha256=rYMwO_X4NvUex6IL2MMTnhdFRp8Lz5zweMwXaW_l7nc,588
@@ -309,11 +309,11 @@ reflex/components/radix/themes/typography/text.py,sha256=g2YVFj32lIWYcGswUhAOsWM
309
309
  reflex/components/radix/themes/typography/text.pyi,sha256=HrTo4MxFluLZg8dpjS9qlvl8I65uZlLTQuxoOmUHSrs,71855
310
310
  reflex/components/react_player/__init__.py,sha256=1OTHeZkuefi-zIVXc_QZMTBg4_RsGrMaJHducUuZQCU,171
311
311
  reflex/components/react_player/audio.py,sha256=qw_H2_W0AyMsHehA_Q9jskN4_N5TYgkzeisOxhepkPs,186
312
- reflex/components/react_player/audio.pyi,sha256=Lv4EZt108bffnpIdT8Yt3QXASQWOlS2nZiVDaZYSzWI,5813
313
- reflex/components/react_player/react_player.py,sha256=hadeQezGV0C2FlGgK2kvx_3waO7JPNXLIQa950FSUKs,3536
314
- reflex/components/react_player/react_player.pyi,sha256=6QLryQX6Zm4jmJKmlOClPpv9BrMohJJGFJaf-VIeo3g,5879
312
+ reflex/components/react_player/audio.pyi,sha256=o5bUq3am1uFoHvmcQwlT9FjvQ3h6OiZbbMWIqp6pnjA,5606
313
+ reflex/components/react_player/react_player.py,sha256=_yiqTiT73p3Lig0-oVzDxzBxZ75AH7VevS1ENd_ZRBs,3980
314
+ reflex/components/react_player/react_player.pyi,sha256=rYjd0v0jpWUaRee5bYtYjpOCOB5Anod8hE5iLMiYpiU,5672
315
315
  reflex/components/react_player/video.py,sha256=2V6tiwCwrzu9WPI1Wmuepk8kQ6M6K8nnMdLLjEbrxrw,186
316
- reflex/components/react_player/video.pyi,sha256=R7gPIcKkDiuq8hkAyF9iHp5-tFasOp_0o7NV_wHcUBY,5813
316
+ reflex/components/react_player/video.pyi,sha256=ORO2IgGRn9o25ZLN6o9ag08QRMrjRxs7xlnzIgyTBFI,5606
317
317
  reflex/components/recharts/__init__.py,sha256=v_6K60Bi-tFUrGCOcAPXt7-sAREpcJRzlYPOjUYTxC8,2695
318
318
  reflex/components/recharts/__init__.pyi,sha256=2YiybRu2AIWwPQ6upgGnb8ZPx4z-cZHgKl1vDZnliW4,5184
319
319
  reflex/components/recharts/cartesian.py,sha256=5Q1nmmbF2r0lgksFtVNKERaGMSG1aib8MojVEPwyqjc,34551
@@ -338,14 +338,14 @@ reflex/components/tags/iter_tag.py,sha256=VfYy95D_rBk-0F58vUDgaWuqXWrdO2udDr06mc
338
338
  reflex/components/tags/match_tag.py,sha256=3lba1H5pCcKkqxEHzM6DZb5s9s0yJLN4Se3vdhzar24,580
339
339
  reflex/components/tags/tag.py,sha256=BRPODHi1R5g4VwkYLztIUJBMyDgrGPZRqB-QP_u67jk,3665
340
340
  reflex/components/tags/tagless.py,sha256=qO7Gm4V0ITDyymHkyltfz53155ZBt-W_WIPDYy93ca0,587
341
- reflex/constants/__init__.py,sha256=c5k9wh50zB_zDXkublXepPZsfAmnYx7ZeNSufIX5qKM,2180
342
- reflex/constants/base.py,sha256=_ah1Gt41XUNW87vDucfMYQtHmJmGvQMbHfl7Q1oQDVQ,8617
341
+ reflex/constants/__init__.py,sha256=I3NZFrnOpDaljU2VwkPIvp6V0odUZF6mia2tBxnPWbM,2220
342
+ reflex/constants/base.py,sha256=NtWZEJ1uEDpcwn1yNZ1ka6gDhbaJKWxlzvK55jIiAbE,8611
343
343
  reflex/constants/colors.py,sha256=cgLn8iEWtlpjQgbhhlCOGjbhfOULKnzqqzPph63SJoI,1613
344
344
  reflex/constants/compiler.py,sha256=S21T7t2nDBRf1NB0diNo1A3AJuH-w5xo8YoNR5ZAzcY,5692
345
- reflex/constants/config.py,sha256=4EljK_fD1Nf4-OfJ9HLYeHSW5xTfNPN6AGjzJ5ARZSY,1579
345
+ reflex/constants/config.py,sha256=8OIjiBdZZJrRVHsNBheMwopE9AwBFFzau0SXqXKcrPg,1715
346
346
  reflex/constants/custom_components.py,sha256=joJt4CEt1yKy7wsBH6vYo7_QRW0O_fWXrrTf0VY2q14,1317
347
347
  reflex/constants/event.py,sha256=8PWobGXnUIbkRS73dRiroj5BJw4C3sbo5AHAhJTZFyM,2849
348
- reflex/constants/installer.py,sha256=zjxVxhGLhwmgo-EpoATqM6yZx38IxjY-u7OqLRhz9NI,3064
348
+ reflex/constants/installer.py,sha256=_x6MYAvEwwLGP1xg65Ts6Xg08tSXhQHEUhtNvk8jDdA,3540
349
349
  reflex/constants/route.py,sha256=YnLgsp0iYc1lFjQ-cEqTlSE5SEeaNkaWORBoUM0-taI,2079
350
350
  reflex/constants/state.py,sha256=6Mfr7xVcAZOj5aSy7kp0W6r8oTs7K30URgGDAAFLfPQ,294
351
351
  reflex/constants/style.py,sha256=EPgRYHhAlcrPUBc2HkDTdTj-Q0uDAXHlq8Sp6D35Zf4,475
@@ -360,7 +360,8 @@ reflex/experimental/layout.pyi,sha256=c6k9mj_OJ2TuzNAlkzseAYQsMtvTE0HicJ_bgqZixc
360
360
  reflex/istate/__init__.py,sha256=LDu_3-31ZI1Jn9NWp4mM0--fDiXI0x8x3gR4-kdrziY,57
361
361
  reflex/istate/data.py,sha256=igpPEXs_ZJvK7J3JJ1mLiKnLmS5iFJiMLesCaQZpgqs,5798
362
362
  reflex/istate/dynamic.py,sha256=xOQ9upZVPf6ngqcLQZ9HdAAYmoWwJ8kRFPH34Q5HTiM,91
363
- reflex/istate/proxy.py,sha256=ttfcMFBNOYnRT48U2fzkyo55Gr-Z8hkoulzPr0tD5VU,1059
363
+ reflex/istate/manager.py,sha256=_HWPDursvVQKKlsPU0TAEbYQ_Snm2v6g5T_UpEjNdQI,30325
364
+ reflex/istate/proxy.py,sha256=GkYXNFgC5aSmZbnyusYRi0NTqyKI8thzqT4s_ssyrlM,25667
364
365
  reflex/istate/storage.py,sha256=gCPoiZxuG-Rw0y-Pz3OC7rv4o08dQ_jK1fE2u8Jhxqg,4339
365
366
  reflex/istate/wrappers.py,sha256=p8uuioXRbR5hperwbOJHUcWdu7hukLikQdoR7qrnKsI,909
366
367
  reflex/middleware/__init__.py,sha256=x7xTeDuc73Hjj43k1J63naC9x8vzFxl4sq7cCFBX7sk,111
@@ -381,24 +382,24 @@ reflex/utils/lazy_loader.py,sha256=pdirbNnGfB-r21zgjzHk0c6vODXqKLn9vbJiP5Yr5nQ,4
381
382
  reflex/utils/misc.py,sha256=pROvogdVRLrZx_5vD18PkMwRAkZnw09Nhb7_YdewUbw,731
382
383
  reflex/utils/net.py,sha256=OxYAYu1rZgdQ3TH_UofsUiMuvqFw_z0HE_CUU3hjhCI,3202
383
384
  reflex/utils/path_ops.py,sha256=idGxUSJRKwYLLi7ppXkq3eV6rvAytJoO-n-FuLkwl3o,7604
384
- reflex/utils/prerequisites.py,sha256=WEZQbLJmdwrONdkbitsG8tMQ3rj2gw2c24knokZRfKc,67162
385
+ reflex/utils/prerequisites.py,sha256=mIeiV3HfJThMoYJXMrtrLNEVaCOqCbAF03Oo8sJNogU,66784
385
386
  reflex/utils/processes.py,sha256=Xo9_lpYvS20XXZxjfRlhcVQSnYmMfePvTZ8gKA7XY04,16692
386
- reflex/utils/pyi_generator.py,sha256=t9LwSaadHDSecv2nAHQzKvbJEg3gAEVwLFEuOe61tAE,45049
387
- reflex/utils/redir.py,sha256=23OcUTsbThak5VYMQPOkSzyNsMB3VkgtF1bodSnHwbE,1533
387
+ reflex/utils/pyi_generator.py,sha256=-UopUfBlT2-DQgbgEOJepNzA4IpSDxDAHCQ1WcEcbWk,45115
388
+ reflex/utils/redir.py,sha256=T1UfnJGeDVn1fwGpx8SqpEd4D6mlyMGXqdgOxXutfhc,1747
388
389
  reflex/utils/registry.py,sha256=ymBScatt5YiQz9tPYHCzSPs-X7z29hGuu2tlZG28YDQ,1877
389
- reflex/utils/serializers.py,sha256=2sXT4YZs3SsAibH-Zb6EmqyDz4nm8hc4gfTp2Srj8MA,13350
390
+ reflex/utils/serializers.py,sha256=AJ6txcEeui8fKOpG6jegv-ZH1AcPV72L3vmzNghW-YQ,13625
390
391
  reflex/utils/telemetry.py,sha256=kZeI_RjY32MTpx12Y5hMXyd6bkli9xAQsmbbIKuf0fg,6779
391
392
  reflex/utils/types.py,sha256=c3tg89sEnZ6E3muUEbOibO3YltvaXhg5BjOC5hsqLWk,33691
392
393
  reflex/vars/__init__.py,sha256=2Kv6Oh9g3ISZFESjL1al8KiO7QBZUXmLKGMCBsP-DoY,1243
393
- reflex/vars/base.py,sha256=4HBnqivtraUOxpow8UPqoO0aFghfVjwYMrGz9eTVoaY,102820
394
+ reflex/vars/base.py,sha256=Nh5C0M3sQ7Vru0gh9JQy_-vDZ8aAdFMx1EyrJ1IbUdA,103092
394
395
  reflex/vars/datetime.py,sha256=fEc68T0A6XYlAJ3AGteCIb_vDqgoO1O8tpjMzqlp9sc,5104
395
396
  reflex/vars/dep_tracking.py,sha256=fW9xDWOk-VM2kwBVlSe46KLfP3Gqj5Ni_SJx_IdR6-k,13840
396
397
  reflex/vars/function.py,sha256=0i-VkxHkDJmZtfQUwUfaF0rlS6WM8azjwQ8k7rEOkyk,13944
397
- reflex/vars/number.py,sha256=N-ZeV_ebriaFpuRf8IL7TT3D4h2ti-MUYMOISEw4N8k,27846
398
+ reflex/vars/number.py,sha256=DlN9qx-kuGVq6Iiy3wxaKUxQ-HJ-CgdWpgoCpsKPefc,28174
398
399
  reflex/vars/object.py,sha256=P_BBOxP4Z53IiHPVx5-P279lFEwdEIYLWcqO_h1UyLo,17134
399
- reflex/vars/sequence.py,sha256=N0BwsYbFC4KkeC-N0Bc2NcKyfrbIxGh5FIWDy7Jl7Fs,55192
400
- reflex-0.7.9a2.dist-info/METADATA,sha256=5grGCG-mMsON7v8J_mqNwpge7chklwea1GBDe62AjWM,11728
401
- reflex-0.7.9a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
402
- reflex-0.7.9a2.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
403
- reflex-0.7.9a2.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
404
- reflex-0.7.9a2.dist-info/RECORD,,
400
+ reflex/vars/sequence.py,sha256=cuvW7aKrM43WV4S8rJvZUL-PlMvlC4G0ZLK4j7xhkTI,55225
401
+ reflex-0.7.10.dist-info/METADATA,sha256=NXuxTnFmhIz8nkt_agpe0ONO71sblo6WjGLpDiW5R0A,11727
402
+ reflex-0.7.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
403
+ reflex-0.7.10.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
404
+ reflex-0.7.10.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
405
+ reflex-0.7.10.dist-info/RECORD,,