reflex 0.7.14a2__py3-none-any.whl → 0.7.14a4__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/utils/console.py CHANGED
@@ -15,6 +15,8 @@ from rich.progress import MofNCompleteColumn, Progress, TimeElapsedColumn
15
15
  from rich.prompt import Prompt
16
16
 
17
17
  from reflex.constants import LogLevel
18
+ from reflex.constants.base import Reflex
19
+ from reflex.utils.decorator import once
18
20
 
19
21
  # Console for pretty printing.
20
22
  _console = Console()
@@ -92,6 +94,51 @@ def print(msg: str, dedupe: bool = False, **kwargs):
92
94
  _console.print(msg, **kwargs)
93
95
 
94
96
 
97
+ @once
98
+ def log_file_console():
99
+ """Create a console that logs to a file.
100
+
101
+ Returns:
102
+ A Console object that logs to a file.
103
+ """
104
+ from reflex.environment import environment
105
+
106
+ if not (env_log_file := environment.REFLEX_LOG_FILE.get()):
107
+ subseconds = int((time.time() % 1) * 1000)
108
+ timestamp = time.strftime("%Y-%m-%d_%H-%M-%S") + f"_{subseconds:03d}"
109
+ log_file = Reflex.DIR / "logs" / (timestamp + ".log")
110
+ log_file.parent.mkdir(parents=True, exist_ok=True)
111
+ else:
112
+ log_file = env_log_file
113
+ if log_file.exists():
114
+ log_file.unlink()
115
+ log_file.touch()
116
+ return Console(file=log_file.open("a", encoding="utf-8"))
117
+
118
+
119
+ @once
120
+ def should_use_log_file_console() -> bool:
121
+ """Check if the log file console should be used.
122
+
123
+ Returns:
124
+ True if the log file console should be used, False otherwise.
125
+ """
126
+ from reflex.environment import environment
127
+
128
+ return environment.REFLEX_ENABLE_FULL_LOGGING.get()
129
+
130
+
131
+ def print_to_log_file(msg: str, dedupe: bool = False, **kwargs):
132
+ """Print a message to the log file.
133
+
134
+ Args:
135
+ msg: The message to print.
136
+ dedupe: If True, suppress multiple console logs of print message.
137
+ kwargs: Keyword arguments to pass to the print function.
138
+ """
139
+ log_file_console().print(msg, **kwargs)
140
+
141
+
95
142
  def debug(msg: str, dedupe: bool = False, **kwargs):
96
143
  """Print a debug message.
97
144
 
@@ -110,6 +157,8 @@ def debug(msg: str, dedupe: bool = False, **kwargs):
110
157
  progress.console.print(msg_, **kwargs)
111
158
  else:
112
159
  print(msg_, **kwargs)
160
+ if should_use_log_file_console() and kwargs.pop("progress", None) is None:
161
+ print_to_log_file(f"[purple]Debug: {msg}[/purple]", **kwargs)
113
162
 
114
163
 
115
164
  def info(msg: str, dedupe: bool = False, **kwargs):
@@ -126,6 +175,8 @@ def info(msg: str, dedupe: bool = False, **kwargs):
126
175
  return
127
176
  _EMITTED_INFO.add(msg)
128
177
  print(f"[cyan]Info: {msg}[/cyan]", **kwargs)
178
+ if should_use_log_file_console():
179
+ print_to_log_file(f"[cyan]Info: {msg}[/cyan]", **kwargs)
129
180
 
130
181
 
131
182
  def success(msg: str, dedupe: bool = False, **kwargs):
@@ -142,6 +193,8 @@ def success(msg: str, dedupe: bool = False, **kwargs):
142
193
  return
143
194
  _EMITTED_SUCCESS.add(msg)
144
195
  print(f"[green]Success: {msg}[/green]", **kwargs)
196
+ if should_use_log_file_console():
197
+ print_to_log_file(f"[green]Success: {msg}[/green]", **kwargs)
145
198
 
146
199
 
147
200
  def log(msg: str, dedupe: bool = False, **kwargs):
@@ -158,6 +211,8 @@ def log(msg: str, dedupe: bool = False, **kwargs):
158
211
  return
159
212
  _EMITTED_LOGS.add(msg)
160
213
  _console.log(msg, **kwargs)
214
+ if should_use_log_file_console():
215
+ print_to_log_file(msg, **kwargs)
161
216
 
162
217
 
163
218
  def rule(title: str, **kwargs):
@@ -184,6 +239,8 @@ def warn(msg: str, dedupe: bool = False, **kwargs):
184
239
  return
185
240
  _EMIITED_WARNINGS.add(msg)
186
241
  print(f"[orange1]Warning: {msg}[/orange1]", **kwargs)
242
+ if should_use_log_file_console():
243
+ print_to_log_file(f"[orange1]Warning: {msg}[/orange1]", **kwargs)
187
244
 
188
245
 
189
246
  def _get_first_non_framework_frame() -> FrameType | None:
@@ -248,6 +305,8 @@ def deprecate(
248
305
  )
249
306
  if _LOG_LEVEL <= LogLevel.WARNING:
250
307
  print(f"[yellow]DeprecationWarning: {msg}[/yellow]", **kwargs)
308
+ if should_use_log_file_console():
309
+ print_to_log_file(f"[yellow]DeprecationWarning: {msg}[/yellow]", **kwargs)
251
310
  if dedupe:
252
311
  _EMITTED_DEPRECATION_WARNINGS.add(dedupe_key)
253
312
 
@@ -266,6 +325,8 @@ def error(msg: str, dedupe: bool = False, **kwargs):
266
325
  return
267
326
  _EMITTED_ERRORS.add(msg)
268
327
  print(f"[red]{msg}[/red]", **kwargs)
328
+ if should_use_log_file_console():
329
+ print_to_log_file(f"[red]{msg}[/red]", **kwargs)
269
330
 
270
331
 
271
332
  def ask(
reflex/utils/exec.py CHANGED
@@ -12,13 +12,15 @@ import subprocess
12
12
  import sys
13
13
  from collections.abc import Sequence
14
14
  from pathlib import Path
15
+ from typing import NamedTuple, TypedDict
15
16
  from urllib.parse import urljoin
16
17
 
17
18
  import psutil
18
19
 
19
20
  from reflex import constants
20
- from reflex.config import environment, get_config
21
+ from reflex.config import get_config
21
22
  from reflex.constants.base import LogLevel
23
+ from reflex.environment import environment
22
24
  from reflex.utils import console, path_ops
23
25
  from reflex.utils.decorator import once
24
26
  from reflex.utils.prerequisites import get_web_dir
@@ -27,26 +29,102 @@ from reflex.utils.prerequisites import get_web_dir
27
29
  frontend_process = None
28
30
 
29
31
 
30
- def detect_package_change(json_file_path: Path) -> str:
31
- """Calculates the SHA-256 hash of a JSON file and returns it as a hexadecimal string.
32
+ def get_package_json_and_hash(package_json_path: Path) -> tuple[PackageJson, str]:
33
+ """Get the content of package.json and its hash.
32
34
 
33
35
  Args:
34
- json_file_path: The path to the JSON file to be hashed.
36
+ package_json_path: The path to the package.json file.
35
37
 
36
38
  Returns:
37
- str: The SHA-256 hash of the JSON file as a hexadecimal string.
38
-
39
- Example:
40
- >>> detect_package_change("package.json")
41
- 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2'
39
+ A tuple containing the content of package.json as a dictionary and its SHA-256 hash.
42
40
  """
43
- with json_file_path.open("r") as file:
41
+ with package_json_path.open("r") as file:
44
42
  json_data = json.load(file)
45
43
 
46
44
  # Calculate the hash
47
45
  json_string = json.dumps(json_data, sort_keys=True)
48
46
  hash_object = hashlib.sha256(json_string.encode())
49
- return hash_object.hexdigest()
47
+ return (json_data, hash_object.hexdigest())
48
+
49
+
50
+ class PackageJson(TypedDict):
51
+ """package.json content."""
52
+
53
+ dependencies: dict[str, str]
54
+ devDependencies: dict[str, str]
55
+
56
+
57
+ class Change(NamedTuple):
58
+ """A named tuple to represent a change in package dependencies."""
59
+
60
+ added: set[str]
61
+ removed: set[str]
62
+
63
+
64
+ def format_change(name: str, change: Change) -> str:
65
+ """Format the change for display.
66
+
67
+ Args:
68
+ name: The name of the change (e.g., "dependencies" or "devDependencies").
69
+ change: The Change named tuple containing added and removed packages.
70
+
71
+ Returns:
72
+ A formatted string representing the changes.
73
+ """
74
+ if not change.added and not change.removed:
75
+ return ""
76
+ added_str = ", ".join(sorted(change.added))
77
+ removed_str = ", ".join(sorted(change.removed))
78
+ change_str = f"{name}:\n"
79
+ if change.added:
80
+ change_str += f" Added: {added_str}\n"
81
+ if change.removed:
82
+ change_str += f" Removed: {removed_str}\n"
83
+ return change_str.strip()
84
+
85
+
86
+ def get_different_packages(
87
+ old_package_json_content: PackageJson,
88
+ new_package_json_content: PackageJson,
89
+ ) -> tuple[Change, Change]:
90
+ """Get the packages that are different between two package JSON contents.
91
+
92
+ Args:
93
+ old_package_json_content: The content of the old package JSON.
94
+ new_package_json_content: The content of the new package JSON.
95
+
96
+ Returns:
97
+ A tuple containing two `Change` named tuples:
98
+ - The first `Change` contains the changes in the `dependencies` section.
99
+ - The second `Change` contains the changes in the `devDependencies` section.
100
+ """
101
+
102
+ def get_changes(old: dict[str, str], new: dict[str, str]) -> Change:
103
+ """Get the changes between two dictionaries.
104
+
105
+ Args:
106
+ old: The old dictionary of packages.
107
+ new: The new dictionary of packages.
108
+
109
+ Returns:
110
+ A `Change` named tuple containing the added and removed packages.
111
+ """
112
+ old_keys = set(old.keys())
113
+ new_keys = set(new.keys())
114
+ added = new_keys - old_keys
115
+ removed = old_keys - new_keys
116
+ return Change(added=added, removed=removed)
117
+
118
+ dependencies_change = get_changes(
119
+ old_package_json_content.get("dependencies", {}),
120
+ new_package_json_content.get("dependencies", {}),
121
+ )
122
+ dev_dependencies_change = get_changes(
123
+ old_package_json_content.get("devDependencies", {}),
124
+ new_package_json_content.get("devDependencies", {}),
125
+ )
126
+
127
+ return dependencies_change, dev_dependencies_change
50
128
 
51
129
 
52
130
  def kill(proc_pid: int):
@@ -86,7 +164,7 @@ def run_process_and_launch_url(
86
164
  from reflex.utils import processes
87
165
 
88
166
  json_file_path = get_web_dir() / constants.PackageJson.PATH
89
- last_hash = detect_package_change(json_file_path)
167
+ last_content, last_hash = get_package_json_and_hash(json_file_path)
90
168
  process = None
91
169
  first_run = True
92
170
 
@@ -105,6 +183,18 @@ def run_process_and_launch_url(
105
183
  frontend_process = process
106
184
  if process.stdout:
107
185
  for line in processes.stream_logs("Starting frontend", process):
186
+ new_content, new_hash = get_package_json_and_hash(json_file_path)
187
+ if new_hash != last_hash:
188
+ dependencies_change, dev_dependencies_change = (
189
+ get_different_packages(last_content, new_content)
190
+ )
191
+ last_content, last_hash = new_content, new_hash
192
+ console.info(
193
+ "Detected changes in package.json.\n"
194
+ + format_change("Dependencies", dependencies_change)
195
+ + format_change("Dev Dependencies", dev_dependencies_change)
196
+ )
197
+
108
198
  match = re.search(constants.Next.FRONTEND_LISTENING_REGEX, line)
109
199
  if match:
110
200
  if first_run:
@@ -119,22 +209,8 @@ def run_process_and_launch_url(
119
209
  notify_backend()
120
210
  first_run = False
121
211
  else:
122
- console.print("New packages detected: Updating app...")
123
- else:
124
- if any(
125
- x in line for x in ("bin executable does not exist on disk",)
126
- ):
127
- console.error(
128
- "Try setting `REFLEX_USE_NPM=1` and re-running `reflex init` and `reflex run` to use npm instead of bun:\n"
129
- "`REFLEX_USE_NPM=1 reflex init`\n"
130
- "`REFLEX_USE_NPM=1 reflex run`"
131
- )
132
- new_hash = detect_package_change(json_file_path)
133
- if new_hash != last_hash:
134
- last_hash = new_hash
135
- kill(process.pid)
136
- process = None
137
- break # for line in process.stdout
212
+ console.print("Frontend is restarting...")
213
+
138
214
  if process is not None:
139
215
  break # while True
140
216
 
reflex/utils/export.py CHANGED
@@ -3,7 +3,8 @@
3
3
  from pathlib import Path
4
4
 
5
5
  from reflex import constants
6
- from reflex.config import environment, get_config
6
+ from reflex.config import get_config
7
+ from reflex.environment import environment
7
8
  from reflex.utils import build, console, exec, prerequisites, telemetry
8
9
 
9
10
 
reflex/utils/net.py CHANGED
@@ -19,7 +19,7 @@ def _httpx_verify_kwarg() -> bool:
19
19
  Returns:
20
20
  True if SSL verification is enabled, False otherwise
21
21
  """
22
- from reflex.config import environment
22
+ from reflex.environment import environment
23
23
 
24
24
  return not environment.SSL_NO_VERIFY.get()
25
25
 
@@ -131,7 +131,7 @@ def _httpx_local_address_kwarg() -> str:
131
131
  Returns:
132
132
  The local address to bind to
133
133
  """
134
- from reflex.config import environment
134
+ from reflex.environment import environment
135
135
 
136
136
  return environment.REFLEX_HTTP_CLIENT_BIND_ADDRESS.get() or (
137
137
  "::" if _should_use_ipv6() else "0.0.0.0"
reflex/utils/path_ops.py CHANGED
@@ -9,7 +9,8 @@ import shutil
9
9
  import stat
10
10
  from pathlib import Path
11
11
 
12
- from reflex.config import environment, get_config
12
+ from reflex.config import get_config
13
+ from reflex.environment import environment
13
14
 
14
15
  # Shorthand for join.
15
16
  join = os.linesep.join
@@ -36,7 +36,8 @@ from redis.exceptions import RedisError
36
36
 
37
37
  from reflex import constants, model
38
38
  from reflex.compiler import templates
39
- from reflex.config import Config, environment, get_config
39
+ from reflex.config import Config, get_config
40
+ from reflex.environment import environment
40
41
  from reflex.utils import console, net, path_ops, processes, redir
41
42
  from reflex.utils.decorator import once
42
43
  from reflex.utils.exceptions import SystemPackageMissingError
reflex/utils/processes.py CHANGED
@@ -19,7 +19,7 @@ from redis.exceptions import RedisError
19
19
  from rich.progress import Progress
20
20
 
21
21
  from reflex import constants
22
- from reflex.config import environment
22
+ from reflex.environment import environment
23
23
  from reflex.utils import console, path_ops, prerequisites
24
24
  from reflex.utils.registry import get_npm_registry
25
25
 
reflex/utils/registry.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  import httpx
4
4
 
5
- from reflex.config import environment
5
+ from reflex.environment import environment
6
6
  from reflex.utils import console, net
7
7
  from reflex.utils.decorator import once
8
8
 
reflex/utils/telemetry.py CHANGED
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import dataclasses
7
+ import importlib.metadata
7
8
  import multiprocessing
8
9
  import platform
9
10
  import warnings
@@ -15,7 +16,7 @@ import httpx
15
16
  import psutil
16
17
 
17
18
  from reflex import constants
18
- from reflex.config import environment
19
+ from reflex.environment import environment
19
20
  from reflex.utils import console
20
21
  from reflex.utils.decorator import once_unless_none
21
22
  from reflex.utils.exceptions import ReflexError
@@ -76,6 +77,18 @@ def get_cpu_count() -> int:
76
77
  return multiprocessing.cpu_count()
77
78
 
78
79
 
80
+ def get_reflex_enterprise_version() -> str | None:
81
+ """Get the version of reflex-enterprise if installed.
82
+
83
+ Returns:
84
+ The version string if installed, None if not installed.
85
+ """
86
+ try:
87
+ return importlib.metadata.version("reflex-enterprise")
88
+ except importlib.metadata.PackageNotFoundError:
89
+ return None
90
+
91
+
79
92
  def get_memory() -> int:
80
93
  """Get the total memory in MB.
81
94
 
@@ -113,6 +126,7 @@ class _Properties(TypedDict):
113
126
  python_version: str
114
127
  node_version: str | None
115
128
  bun_version: str | None
129
+ reflex_enterprise_version: str | None
116
130
  cpu_count: int
117
131
  memory: int
118
132
  cpu_info: dict
@@ -166,6 +180,7 @@ def _get_event_defaults() -> _DefaultEvent | None:
166
180
  "bun_version": (
167
181
  str(bun_version) if (bun_version := get_bun_version()) else None
168
182
  ),
183
+ "reflex_enterprise_version": get_reflex_enterprise_version(),
169
184
  "cpu_count": get_cpu_count(),
170
185
  "memory": get_memory(),
171
186
  "cpu_info": dataclasses.asdict(cpuinfo) if cpuinfo else {},
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.7.14a2
3
+ Version: 0.7.14a4
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
@@ -2,19 +2,20 @@ reflex/__init__.py,sha256=wMrUAcxHI0Th4EwHIVm9G5zT-zNgO1JX6yWejx0IvvQ,10380
2
2
  reflex/__init__.pyi,sha256=SDnppfexuPej7E5zD2fHKq1gppvvZHBUqqS0tX2Wj-g,11391
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=Mx6veYacVvql7qMYfsEbucfs3CuIWDtI5w8HSbTbteU,77041
6
- reflex/assets.py,sha256=LdojI9E_PrJr2IlqpZMOOCOPg5cmccS0pBwYHZcqaig,3426
5
+ reflex/app.py,sha256=s6B2kru4D1k4wIOjTL0bBGXIlc6NzcilcOuL-JalJR8,77071
6
+ reflex/assets.py,sha256=l5O_mlrTprC0lF7Rc_McOe3a0OtSLnRdNl_PqCpDCBA,3431
7
7
  reflex/base.py,sha256=GYu-PvZ28BVRfnivcAh7s0QiqzxhlDkcugTI4dPMShc,3901
8
- reflex/config.py,sha256=GtMlDTVjnRufQVrrwpUd3qbAdukeQEaUFOCRhhVz2E4,38324
8
+ reflex/config.py,sha256=S0gEO0vT2GPm2Gof79BT7Qv04dvzq9E-qM1_68lUkVA,19555
9
+ reflex/environment.py,sha256=WmxzlXx9MqogJ5ro3jqLcpPhhCF6rjC0hSdrJ_qYcL0,19748
9
10
  reflex/event.py,sha256=D-sdpUoz3cGI5FtzM5RGYZSPHhwkql4S1_F4Or4SYDM,67009
10
- reflex/model.py,sha256=W46HaCi0xJjdBcwiOAAu5XX9uzwrF82P8LN0hxwffH8,17616
11
+ reflex/model.py,sha256=xED7blemoiKxPFaOkCMrSayjjon7AJp8t5g459p7dGs,17646
11
12
  reflex/page.py,sha256=mqioadLDsABvfNqdLbxvUKqi1gulSKddMihZe3pjtdc,2678
12
13
  reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- reflex/reflex.py,sha256=HuQMvn8kNj0m6lUBtyiyB7DYqTeVLrccq8ZNdH5XcD4,21521
14
+ reflex/reflex.py,sha256=-soFv5fHxwXDeDgCr_wifU0sznu8F31gWm2I8E31zvU,21551
14
15
  reflex/route.py,sha256=iO7VQQ9mTWG8LiVYNqZXtbtrD463aWNTS0wn1YolGbw,4192
15
- reflex/state.py,sha256=SAfvpVyxvzh2yjsZefEFp1Ay2KRs-96R77iOqPbGRjs,90871
16
+ reflex/state.py,sha256=7JrD1sh0zhryIfGWpRWswY-yD0emd6QFkOxf5yL_Jkw,90876
16
17
  reflex/style.py,sha256=JxbXXA4MTnXrk0XHEoMBoNC7J-M2oL5Hl3W_QmXvmBg,13222
17
- reflex/testing.py,sha256=kYC_cWLFglv9F3HcH8UOoZNKZKaK87EdKtR7C0aRLJE,36721
18
+ reflex/testing.py,sha256=HfcXe7bZyT0cM832PL5AXKy2GhpO7DHNqHN3KTbZCig,36777
18
19
  reflex/.templates/apps/blank/assets/favicon.ico,sha256=baxxgDAQ2V4-G5Q4S2yK5uUJTUGkv-AOWBQ0xd6myUo,4286
19
20
  reflex/.templates/apps/blank/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
21
  reflex/.templates/apps/blank/code/blank.py,sha256=UmGz7aDxGULYINwLgotQoj-9qqpy7EOfAEpLmOT7C_k,917
@@ -56,12 +57,12 @@ reflex/app_mixins/lifespan.py,sha256=9rrdVUY0nHyk3gj31WJm7mw6I7KHBNtvSs9tZdwUm4I
56
57
  reflex/app_mixins/middleware.py,sha256=BKhe0jUFO1_TylEC48LUZyaeYyPmAYW-NV4H5Rw221k,2848
57
58
  reflex/app_mixins/mixin.py,sha256=R1YncalqDrbdPZvpKVbm72ZKmQZxYAWfuFq9JknzTqQ,305
58
59
  reflex/compiler/__init__.py,sha256=r8jqmDSFf09iV2lHlNhfc9XrTLjNxfDNwPYlxS4cmHE,27
59
- reflex/compiler/compiler.py,sha256=-jVldCHDCbZlRMQDuiRQNj-oqlKTdoxQwEMf4Mb8XSk,28209
60
+ reflex/compiler/compiler.py,sha256=Y2fBmLn7DOzV8yN44z1T8rh4t399N8bhLqANl7FoEcQ,28239
60
61
  reflex/compiler/templates.py,sha256=SKFIJtL_ozEvEHhiMj34tBwBN1CWSYy_-VzlojZMG44,6015
61
62
  reflex/compiler/utils.py,sha256=NYvNedrkqoh8i86QL8tOjFZ60JabOM1wBXNkY1ORtiQ,16549
62
63
  reflex/components/__init__.py,sha256=zbIXThv1WPI0FdIGf9G9RAmGoCRoGy7nHcSZ8K5D5bA,624
63
64
  reflex/components/__init__.pyi,sha256=qoj1zIWaitcZOGcJ6k7wuGJk_GAJCE9Xtx8CeRVrvoE,861
64
- reflex/components/component.py,sha256=nvo6i2_ya1kjCZLd8ym9QmZ_JXfCGnpb9jHF0Lo3yDw,98735
65
+ reflex/components/component.py,sha256=5bnI90s6EINL8ls_HlcMLaj-t26ABn01P7QEX_sGaIU,99015
65
66
  reflex/components/dynamic.py,sha256=rDPSyoeAWAe7pxA9ZpuamKfBispOrxR-Y2DP8KfwRq8,7404
66
67
  reflex/components/literals.py,sha256=hogLnwTJxFJODIvqihg-GD9kFZVsEBDoYzaRit56Nuk,501
67
68
  reflex/components/props.py,sha256=pte-hBXbwsvB2fS7vYtiyxbHWlWYcDNg8baCfDaOvBE,2699
@@ -69,7 +70,7 @@ reflex/components/base/__init__.py,sha256=QIOxOPT87WrSE4TSHAsZ-358VzvUXAe1w8vWog
69
70
  reflex/components/base/__init__.pyi,sha256=c-8lUF9MAgAo9OHMjKIrV2ScM5S0fg8gTXp3iYFwVKU,1055
70
71
  reflex/components/base/app_wrap.py,sha256=5K_myvYvHPeAJbm3BdEX17tKvdNEj6SV9RYahbIQBAQ,514
71
72
  reflex/components/base/app_wrap.pyi,sha256=-qdsW5SDxROhV11q4TIgnm_1CHx8_AZHHhsnmkdiv18,1915
72
- reflex/components/base/bare.py,sha256=IPLNlyLKHH30kJ5icXswB8Kjzj0cF71lfsy4oH7GU3M,7310
73
+ reflex/components/base/bare.py,sha256=f9e9cW48mjyf7fh6BgsIUV71vSdbK-Xs-SAjngAufg4,7315
73
74
  reflex/components/base/body.py,sha256=KLPOhxVsKyjPwrY9AziCOOG_c9ckOqIhI4n2i3_Q3NU,129
74
75
  reflex/components/base/body.pyi,sha256=4gWLicS47-WND25iWoj_oOg7i_0oqb36f26vID7NZH8,8665
75
76
  reflex/components/base/document.py,sha256=L5kRdI1bvPQ9dTpHkeG6kqyDvzqZ4uZG4QSj3GMLBuM,551
@@ -92,7 +93,7 @@ reflex/components/core/__init__.py,sha256=1Z5MUA5wRPi4w7TXzRFyCfxbG8lUMqs29buWHI
92
93
  reflex/components/core/__init__.pyi,sha256=HDZSx-RIBpryukJo8ECdxSnZwpThP0IR2LV66h1XyJ4,2046
93
94
  reflex/components/core/auto_scroll.py,sha256=3jtFUqMUM1R_YyxWjbNVLiLktw6HHp50EzIFTkFtgto,3616
94
95
  reflex/components/core/auto_scroll.pyi,sha256=fuJKqsjcau2vk2y543U5Gcjs-FBl7h-kDurIV4MOkeg,8899
95
- reflex/components/core/banner.py,sha256=Vk19jeVyLxyGuVCWoSDLzuHaNmRtyHKrRqoa0RmNMPM,18563
96
+ reflex/components/core/banner.py,sha256=DIjy4-qydJuLYVDKJYtrIeO4HFLdbgpXDVF4o2sRkDs,18568
96
97
  reflex/components/core/banner.pyi,sha256=DENYyCF9R46YC-mFgSFhUog225lMbZHFAt1pEFfCCfE,25414
97
98
  reflex/components/core/breakpoints.py,sha256=7nNG9Ewjvbk1hB0VoFiQxlDR333Mq2y977CNWjslAWA,2692
98
99
  reflex/components/core/client_side_routing.py,sha256=CgW29H4Kiy5V4AKdJlFT9gSWaFUfki3f3Prf9twbbqA,1881
@@ -110,7 +111,7 @@ reflex/components/core/match.py,sha256=FkqrfHYjcGnO61r52FFJORJ3y3JzZeyY1kNIivRYI
110
111
  reflex/components/core/responsive.py,sha256=ACZdtJ4a4F8B3dm1k8h6J2_UJx0Z5LDB7XHQ2ty4wAc,1911
111
112
  reflex/components/core/sticky.py,sha256=2B3TxrwG2Rtp_lv1VkMOIF2bqSiT7qYGbqbiZiMKxKY,3856
112
113
  reflex/components/core/sticky.pyi,sha256=M9_X-1vri4fo8vQjeT7y4OKNYGV-GqWAPox6oOMUKX0,32420
113
- reflex/components/core/upload.py,sha256=7gOnBpF3dtpRIOt9qiQ0QBQZvhW88na-p6-fnix_zok,13356
114
+ reflex/components/core/upload.py,sha256=ZWrwRnGoIm0geCvI9AfSampj37qHCuPCu48RcvxB--c,13361
114
115
  reflex/components/core/upload.pyi,sha256=1tbf7VYWNf5-6RmDW7N14-uU6Eh78MAjHxBWAN1AXdk,15787
115
116
  reflex/components/core/layout/__init__.py,sha256=znldZaj_NGt8qCZDG70GMwjMTskcvCf_2N_EjCAHwdc,30
116
117
  reflex/components/datadisplay/__init__.py,sha256=L8pWWKNHWdUD2fbZRoEKjd_8c_hpDdGYO463hwkoIi4,438
@@ -337,13 +338,13 @@ reflex/components/tags/match_tag.py,sha256=3lba1H5pCcKkqxEHzM6DZb5s9s0yJLN4Se3vd
337
338
  reflex/components/tags/tag.py,sha256=BRPODHi1R5g4VwkYLztIUJBMyDgrGPZRqB-QP_u67jk,3665
338
339
  reflex/components/tags/tagless.py,sha256=qO7Gm4V0ITDyymHkyltfz53155ZBt-W_WIPDYy93ca0,587
339
340
  reflex/constants/__init__.py,sha256=QAtyTYtH10D7680kp5EsKkTz1FeL9u6pvvXn-6hPFU8,2176
340
- reflex/constants/base.py,sha256=FQIrJ87DuPWmv-ST9rZuntKXvcDqeJXO68clSHHO7iM,8581
341
+ reflex/constants/base.py,sha256=Zj8Di8mzu_qOlGjIwGtBTheGNF3Z3Cjp2WLKoIoujPA,8596
341
342
  reflex/constants/colors.py,sha256=n-FN7stNrvk5rCN0TAvE28dqwUeQZHue-b5q1CO0EyQ,2048
342
343
  reflex/constants/compiler.py,sha256=Kp-b2uOHCxIcuNlYySzrmP83XSbzve7HoRlj0fX1Q8s,5750
343
344
  reflex/constants/config.py,sha256=8OIjiBdZZJrRVHsNBheMwopE9AwBFFzau0SXqXKcrPg,1715
344
345
  reflex/constants/custom_components.py,sha256=joJt4CEt1yKy7wsBH6vYo7_QRW0O_fWXrrTf0VY2q14,1317
345
346
  reflex/constants/event.py,sha256=8PWobGXnUIbkRS73dRiroj5BJw4C3sbo5AHAhJTZFyM,2849
346
- reflex/constants/installer.py,sha256=DAoCrvf0xg9MKKThJAObhJdLQxCm8mokZ4uaXnFnE0Q,3822
347
+ reflex/constants/installer.py,sha256=lU6fC9rJ7K5J1BYMDldiR_cOkxayfjxyks-Qmhb5SsE,3827
347
348
  reflex/constants/route.py,sha256=YnLgsp0iYc1lFjQ-cEqTlSE5SEeaNkaWORBoUM0-taI,2079
348
349
  reflex/constants/state.py,sha256=6Mfr7xVcAZOj5aSy7kp0W6r8oTs7K30URgGDAAFLfPQ,294
349
350
  reflex/constants/utils.py,sha256=e1ChEvbHfmE_V2UJvCSUhD_qTVAIhEGPpRJSqdSd6PA,780
@@ -357,7 +358,7 @@ reflex/experimental/layout.pyi,sha256=3v3xo3THcNwKv3IximCSDnItfywzuKNxjrauO2g2Ez
357
358
  reflex/istate/__init__.py,sha256=LDu_3-31ZI1Jn9NWp4mM0--fDiXI0x8x3gR4-kdrziY,57
358
359
  reflex/istate/data.py,sha256=igpPEXs_ZJvK7J3JJ1mLiKnLmS5iFJiMLesCaQZpgqs,5798
359
360
  reflex/istate/dynamic.py,sha256=xOQ9upZVPf6ngqcLQZ9HdAAYmoWwJ8kRFPH34Q5HTiM,91
360
- reflex/istate/manager.py,sha256=Al7pNNceeImp5QzNbkJ3pjLPO5fXOki-PVh9rY_YGV4,30331
361
+ reflex/istate/manager.py,sha256=r8CQuycOLBP1VBnXYaI9zXJbCVHAYcyRV-krILPhjyQ,30361
361
362
  reflex/istate/proxy.py,sha256=IgsjRfMejhA-RDeWxkMx0A1NcduQF9HZvf4lQd2JUu8,25836
362
363
  reflex/istate/storage.py,sha256=gCPoiZxuG-Rw0y-Pz3OC7rv4o08dQ_jK1fE2u8Jhxqg,4339
363
364
  reflex/istate/wrappers.py,sha256=p8uuioXRbR5hperwbOJHUcWdu7hukLikQdoR7qrnKsI,909
@@ -372,24 +373,24 @@ reflex/utils/__init__.py,sha256=y-AHKiRQAhk2oAkvn7W8cRVTZVK625ff8tTwvZtO7S4,24
372
373
  reflex/utils/build.py,sha256=HvIRNdIx6TJ1qml0SjOMxv0pNLWhlViQSXsxg7bOsBo,9189
373
374
  reflex/utils/codespaces.py,sha256=kEQ-j-jclTukFpXDlYgNp95kYMGDrQmP3VNEoYGZ1u4,3052
374
375
  reflex/utils/compat.py,sha256=aSJH_M6iomgHPQ4onQ153xh1MWqPi3HSYDzE68N6gZM,2635
375
- reflex/utils/console.py,sha256=AFml4-lMgw9QA8AYKF5M0kX5JvPMfiXK0UqNeAuW6Cw,9316
376
+ reflex/utils/console.py,sha256=OFyXqnyhpAgXCDM7m5lokoUMjvXMohc2ftgrmcf62nc,11500
376
377
  reflex/utils/decorator.py,sha256=DVrlVGljV5OchMs-5_y1CbbqnCWlH6lv-dFko8yHxVY,1738
377
378
  reflex/utils/exceptions.py,sha256=Wwu7Ji2xgq521bJKtU2NgjwhmFfnG8erirEVN2h8S-g,8884
378
- reflex/utils/exec.py,sha256=CvXUcX6mpUQycmgQxctxXFA9Dlmvr1Uh5KPn1zkbrX4,20820
379
- reflex/utils/export.py,sha256=eRAVmXyOfCjaL0g4YwWy9f48YT21tfKtd8Evt37_sRY,2567
379
+ reflex/utils/exec.py,sha256=SQ6zUurvkdlMQuLB0dpYYU1-llnTFsjQGHxGn4G_sTM,23173
380
+ reflex/utils/export.py,sha256=e4RM4NcB_dha6ke-ezFej5QaUxc8Ttr62iVaJ81Jfyw,2597
380
381
  reflex/utils/format.py,sha256=TGPrbqByYMkUjXgFatk_UvMy4tMP8ByzVYvOB7Z6-Xo,21302
381
382
  reflex/utils/imports.py,sha256=VpaIEq-_y8RzX4mzqPy4w5QfW7I3daPFFgI6n3tnAEI,4073
382
383
  reflex/utils/lazy_loader.py,sha256=UREKeql_aSusSFMn6qldyol4n8qD3Sm9Wg7LLICjJgQ,4136
383
384
  reflex/utils/misc.py,sha256=2JkJG7jQVMgRUBylck4A-a_lf2rScFsyKMZOjQw7oAw,749
384
- reflex/utils/net.py,sha256=pCX2e_3NSooFxzC61DI2Q9GyW_UtXQ4fsMyj33CimRY,4083
385
- reflex/utils/path_ops.py,sha256=CVmO_iyVtFbTa1y3g3Z_joT7L-vxmNGQhd5Yj3Er2r0,8124
386
- reflex/utils/prerequisites.py,sha256=-qCDVhqUDxk9tzjxI2z0yLvAytcXiOsPjdqKqizv66U,65759
387
- reflex/utils/processes.py,sha256=OnaeI-sfvJrmMOi2FMIuM-ko3i8tLsyAblvx0essSxQ,16647
385
+ reflex/utils/net.py,sha256=HEHA8L5g7L9s0fFG4dTiZzB9PFO_0WRrlbMgpZr_GAQ,4093
386
+ reflex/utils/path_ops.py,sha256=_RS17IQDNr5vcoLLGZx2-z1E5WP-JgDHvaRAOgqrZiU,8154
387
+ reflex/utils/prerequisites.py,sha256=V3Yaf4Smlvt34ivk60CQCGOf-uTItgXihbPSG34OTAU,65789
388
+ reflex/utils/processes.py,sha256=Jly2gNZY--GOGaYg4mB11roMqtx83ZPiyYKQ45CTsdM,16652
388
389
  reflex/utils/pyi_generator.py,sha256=XA5V-Qdey45mjOt4FgrHrbxkUPTD3OsfBjLJHCmatRU,45784
389
390
  reflex/utils/redir.py,sha256=3JG0cRdfIZnFIBHHN32ynD5cfbUZa7gLRxzrxRGGl5I,1751
390
- reflex/utils/registry.py,sha256=ymBScatt5YiQz9tPYHCzSPs-X7z29hGuu2tlZG28YDQ,1877
391
+ reflex/utils/registry.py,sha256=DEF7csYQ5VnrZhy6ULVfMlceh7XVH0pks96lIyyThuc,1882
391
392
  reflex/utils/serializers.py,sha256=HPxHb-5ytO25vq4tAa600OiVDhx_c6p_oHku2L3x6jc,13637
392
- reflex/utils/telemetry.py,sha256=lchCL8kSbWpKSBITsu2gH6kxyjtV2GMWNP71smxeNIk,7272
393
+ reflex/utils/telemetry.py,sha256=78trO4PU71IPZhx_lmvhYGsH5MEjl15j6heAKena4vE,7760
393
394
  reflex/utils/types.py,sha256=TiZokWTgNgmpH2zY0vVj7-hoJzDi0UtBNoL-VBLjNPQ,34604
394
395
  reflex/vars/__init__.py,sha256=2Kv6Oh9g3ISZFESjL1al8KiO7QBZUXmLKGMCBsP-DoY,1243
395
396
  reflex/vars/base.py,sha256=ZcGGnA7xJtPJhy60R0qZGE1Df_l7vOp51EMbLZdiHXg,104529
@@ -400,8 +401,8 @@ reflex/vars/number.py,sha256=tO7pnvFaBsedq1HWT4skytnSqHWMluGEhUbjAUMx8XQ,28190
400
401
  reflex/vars/object.py,sha256=BDmeiwG8v97s_BnR1Egq3NxOKVjv9TfnREB3cz0zZtk,17322
401
402
  reflex/vars/sequence.py,sha256=1kBrqihspyjyQ1XDqFPC8OpVGtZs_EVkOdIKBro5ilA,55249
402
403
  scripts/hatch_build.py,sha256=-4pxcLSFmirmujGpQX9UUxjhIC03tQ_fIQwVbHu9kc0,1861
403
- reflex-0.7.14a2.dist-info/METADATA,sha256=9WfN8yZtjsi7aDtI4RGSKGwiC91xkC5t3u_TeADl6rA,11837
404
- reflex-0.7.14a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
405
- reflex-0.7.14a2.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
406
- reflex-0.7.14a2.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
407
- reflex-0.7.14a2.dist-info/RECORD,,
404
+ reflex-0.7.14a4.dist-info/METADATA,sha256=M0L66VwQh_yM3B_9wIjk2D5S5nMBbq7WEKrzzIf5U7Y,11837
405
+ reflex-0.7.14a4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
406
+ reflex-0.7.14a4.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
407
+ reflex-0.7.14a4.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
408
+ reflex-0.7.14a4.dist-info/RECORD,,