reflex 0.7.9a1__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/.templates/web/utils/state.js +3 -3
- reflex/app.py +33 -27
- reflex/components/component.py +38 -11
- reflex/components/core/upload.py +48 -16
- reflex/components/core/upload.pyi +7 -0
- reflex/components/react_player/audio.pyi +0 -4
- reflex/components/react_player/react_player.py +21 -7
- reflex/components/react_player/react_player.pyi +0 -4
- reflex/components/react_player/video.pyi +0 -4
- reflex/config.py +2 -2
- reflex/constants/__init__.py +2 -0
- reflex/constants/base.py +1 -1
- reflex/constants/config.py +7 -0
- reflex/constants/installer.py +19 -5
- reflex/event.py +24 -0
- reflex/istate/manager.py +858 -0
- reflex/istate/proxy.py +726 -2
- reflex/page.py +8 -0
- reflex/reflex.py +17 -10
- reflex/state.py +91 -1622
- reflex/testing.py +20 -13
- reflex/utils/prerequisites.py +33 -40
- reflex/utils/pyi_generator.py +5 -4
- reflex/utils/redir.py +7 -0
- reflex/utils/serializers.py +14 -0
- reflex/vars/base.py +13 -1
- reflex/vars/number.py +16 -8
- reflex/vars/sequence.py +2 -1
- {reflex-0.7.9a1.dist-info → reflex-0.7.10.dist-info}/METADATA +2 -2
- {reflex-0.7.9a1.dist-info → reflex-0.7.10.dist-info}/RECORD +33 -32
- {reflex-0.7.9a1.dist-info → reflex-0.7.10.dist-info}/WHEEL +0 -0
- {reflex-0.7.9a1.dist-info → reflex-0.7.10.dist-info}/entry_points.txt +0 -0
- {reflex-0.7.9a1.dist-info → reflex-0.7.10.dist-info}/licenses/LICENSE +0 -0
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
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
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.
|
|
308
|
+
self.app_instance._state_manager, StateManagerRedis
|
|
304
309
|
):
|
|
305
310
|
with contextlib.suppress(ValueError):
|
|
306
|
-
await self.app_instance.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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(),
|
reflex/utils/prerequisites.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1369
|
-
"""
|
|
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
|
|
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
|
-
|
|
1608
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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="
|
|
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="
|
|
1929
|
-
demo_url="",
|
|
1922
|
+
description="Premade templates built by the Reflex team.",
|
|
1930
1923
|
code_url="",
|
|
1931
1924
|
),
|
|
1932
1925
|
]
|
reflex/utils/pyi_generator.py
CHANGED
|
@@ -1264,7 +1264,7 @@ class PyiGenerator:
|
|
|
1264
1264
|
dict(
|
|
1265
1265
|
zip(
|
|
1266
1266
|
[
|
|
1267
|
-
|
|
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
|
-
|
|
1295
|
-
|
|
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)
|
reflex/utils/serializers.py
CHANGED
|
@@ -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[
|
|
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",
|
|
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(
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
9
|
-
reflex/event.py,sha256=
|
|
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
|
-
reflex/page.py,sha256=
|
|
11
|
+
reflex/page.py,sha256=mqioadLDsABvfNqdLbxvUKqi1gulSKddMihZe3pjtdc,2678
|
|
12
12
|
reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
reflex/reflex.py,sha256=
|
|
13
|
+
reflex/reflex.py,sha256=MnqTPqgq3lkd5McHvpo-NeGM3uHIaGkLUclOZ3RNlFU,21017
|
|
14
14
|
reflex/route.py,sha256=nn_hJwtQdjiqH_dHXfqMGWKllnyPQZTSR-KWdHDhoOs,4210
|
|
15
|
-
reflex/state.py,sha256=
|
|
15
|
+
reflex/state.py,sha256=ik3yezBR6vomaIdpFZClXy4w6CVdU3dR39IQDdahSTA,89423
|
|
16
16
|
reflex/style.py,sha256=8ciwcReoKSrPSwoteXJwv7YTK514tf7jrJ5RfqztmvA,13186
|
|
17
|
-
reflex/testing.py,sha256=
|
|
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
|
|
@@ -47,7 +47,7 @@ reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js,sha2
|
|
|
47
47
|
reflex/.templates/web/components/shiki/code.js,sha256=UO0hQnm2w1j2VMgj46cnplO6ZLK3p3qhcxp6irjZBxQ,1116
|
|
48
48
|
reflex/.templates/web/styles/tailwind.css,sha256=wGOoICTy1G0e5bWZ4LYOVgRa3ZT7M44tC4g6CKh6ZPo,112
|
|
49
49
|
reflex/.templates/web/utils/client_side_routing.js,sha256=cOu4wUHDQtGl1yo5goxljZ94SLZLyr9R3S9Rehcvjio,1475
|
|
50
|
-
reflex/.templates/web/utils/state.js,sha256=
|
|
50
|
+
reflex/.templates/web/utils/state.js,sha256=IOA9QGupgpViVCn1gVmLiNPEi_oXdQIT73qm_0y3xgo,31493
|
|
51
51
|
reflex/.templates/web/utils/helpers/dataeditor.js,sha256=pG6MgsHuStDR7-qPipzfiK32j9bKDBa-4hZ0JSUo4JM,1623
|
|
52
52
|
reflex/.templates/web/utils/helpers/debounce.js,sha256=xGhtTRtS_xIcaeqnYVvYJNseLgQVk-DW-eFiHJYO9As,528
|
|
53
53
|
reflex/.templates/web/utils/helpers/paste.js,sha256=ef30HsR83jRzzvZnl8yV79yqFP8TC_u8SlN99cCS_OM,1799
|
|
@@ -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=
|
|
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=
|
|
116
|
-
reflex/components/core/upload.pyi,sha256=
|
|
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=
|
|
313
|
-
reflex/components/react_player/react_player.py,sha256=
|
|
314
|
-
reflex/components/react_player/react_player.pyi,sha256=
|
|
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=
|
|
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=
|
|
342
|
-
reflex/constants/base.py,sha256=
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
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
|
|
387
|
-
reflex/utils/redir.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
400
|
-
reflex-0.7.
|
|
401
|
-
reflex-0.7.
|
|
402
|
-
reflex-0.7.
|
|
403
|
-
reflex-0.7.
|
|
404
|
-
reflex-0.7.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|