reflex 0.7.4a2__py3-none-any.whl → 0.7.4.post1__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/app.py CHANGED
@@ -1108,8 +1108,6 @@ class App(MiddlewareMixin, LifespanMixin):
1108
1108
  if config.react_strict_mode:
1109
1109
  app_wrappers[(200, "StrictMode")] = StrictMode.create()
1110
1110
 
1111
- should_compile = self._should_compile()
1112
-
1113
1111
  if not should_compile:
1114
1112
  with console.timing("Evaluate Pages (Backend)"):
1115
1113
  for route in self._unevaluated_pages:
reflex/config.py CHANGED
@@ -720,6 +720,9 @@ class EnvironmentVariables:
720
720
  # Used by flexgen to enumerate the pages.
721
721
  REFLEX_ADD_ALL_ROUTES_ENDPOINT: EnvVar[bool] = env_var(False)
722
722
 
723
+ # The address to bind the HTTP client to. You can set this to "::" to enable IPv6.
724
+ REFLEX_HTTP_CLIENT_BIND_ADDRESS: EnvVar[str | None] = env_var(None)
725
+
723
726
 
724
727
  environment = EnvironmentVariables()
725
728
 
reflex/state.py CHANGED
@@ -907,7 +907,7 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
907
907
  raise ValueError(f"Only one parent state is allowed {parent_states}.")
908
908
  # The first non-mixin state in the mro is our parent.
909
909
  for base in cls.mro()[1:]:
910
- if base._mixin or not issubclass(base, BaseState):
910
+ if not issubclass(base, BaseState) or base._mixin:
911
911
  continue
912
912
  if base is BaseState:
913
913
  break
@@ -1403,6 +1403,29 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
1403
1403
  for substate in self.substates.values():
1404
1404
  substate.reset()
1405
1405
 
1406
+ @classmethod
1407
+ @functools.lru_cache
1408
+ def _is_client_storage(cls, prop_name_or_field: str | ModelField) -> bool:
1409
+ """Check if the var is a client storage var.
1410
+
1411
+ Args:
1412
+ prop_name_or_field: The name of the var or the field itself.
1413
+
1414
+ Returns:
1415
+ Whether the var is a client storage var.
1416
+ """
1417
+ if isinstance(prop_name_or_field, str):
1418
+ field = cls.get_fields().get(prop_name_or_field)
1419
+ else:
1420
+ field = prop_name_or_field
1421
+ return field is not None and (
1422
+ isinstance(field.default, ClientStorageBase)
1423
+ or (
1424
+ isinstance(field.type_, type)
1425
+ and issubclass(field.type_, ClientStorageBase)
1426
+ )
1427
+ )
1428
+
1406
1429
  def _reset_client_storage(self):
1407
1430
  """Reset client storage base vars to their default values."""
1408
1431
  # Client-side storage is reset during hydrate so that clearing cookies
@@ -1410,10 +1433,7 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
1410
1433
  fields = self.get_fields()
1411
1434
  for prop_name in self.base_vars:
1412
1435
  field = fields[prop_name]
1413
- if isinstance(field.default, ClientStorageBase) or (
1414
- isinstance(field.type_, type)
1415
- and issubclass(field.type_, ClientStorageBase)
1416
- ):
1436
+ if self._is_client_storage(field):
1417
1437
  setattr(self, prop_name, copy.deepcopy(field.default))
1418
1438
 
1419
1439
  # Recursively reset the substate client storage.
@@ -2350,8 +2370,9 @@ class UpdateVarsInternalState(State):
2350
2370
  for var, value in vars.items():
2351
2371
  state_name, _, var_name = var.rpartition(".")
2352
2372
  var_state_cls = State.get_class_substate(state_name)
2353
- var_state = await self.get_state(var_state_cls)
2354
- setattr(var_state, var_name, value)
2373
+ if var_state_cls._is_client_storage(var_name):
2374
+ var_state = await self.get_state(var_state_cls)
2375
+ setattr(var_state, var_name, value)
2355
2376
 
2356
2377
 
2357
2378
  class OnLoadInternalState(State):
reflex/utils/net.py CHANGED
@@ -1,8 +1,13 @@
1
1
  """Helpers for downloading files from the network."""
2
2
 
3
+ import functools
4
+ import time
5
+ from typing import Callable, ParamSpec, TypeVar
6
+
3
7
  import httpx
4
8
 
5
- from ..config import environment
9
+ from reflex.utils.decorator import once
10
+
6
11
  from . import console
7
12
 
8
13
 
@@ -12,30 +17,114 @@ def _httpx_verify_kwarg() -> bool:
12
17
  Returns:
13
18
  True if SSL verification is enabled, False otherwise
14
19
  """
20
+ from ..config import environment
21
+
15
22
  return not environment.SSL_NO_VERIFY.get()
16
23
 
17
24
 
18
- def get(url: str, **kwargs) -> httpx.Response:
19
- """Make an HTTP GET request.
25
+ _P = ParamSpec("_P")
26
+ _T = TypeVar("_T")
27
+
28
+
29
+ def _wrap_https_func(
30
+ func: Callable[_P, _T],
31
+ ) -> Callable[_P, _T]:
32
+ """Wrap an HTTPS function with logging.
20
33
 
21
34
  Args:
22
- url: The URL to request.
23
- **kwargs: Additional keyword arguments to pass to httpx.get.
35
+ func: The function to wrap.
24
36
 
25
37
  Returns:
26
- The response object.
38
+ The wrapped function.
39
+ """
40
+
41
+ @functools.wraps(func)
42
+ def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _T:
43
+ url = args[0]
44
+ console.debug(f"Sending HTTPS request to {args[0]}")
45
+ initial_time = time.time()
46
+ try:
47
+ response = func(*args, **kwargs)
48
+ except httpx.ConnectError as err:
49
+ if "CERTIFICATE_VERIFY_FAILED" in str(err):
50
+ # If the error is a certificate verification error, recommend mitigating steps.
51
+ console.error(
52
+ f"Certificate verification failed for {url}. Set environment variable SSL_CERT_FILE to the "
53
+ "path of the certificate file or SSL_NO_VERIFY=1 to disable verification."
54
+ )
55
+ raise
56
+ else:
57
+ console.debug(
58
+ f"Received response from {url} in {time.time() - initial_time:.3f} seconds"
59
+ )
60
+ return response
61
+
62
+ return wrapper
63
+
27
64
 
28
- Raises:
29
- httpx.ConnectError: If the connection cannot be established.
65
+ def _is_ipv4_supported() -> bool:
66
+ """Determine if the system supports IPv4.
67
+
68
+ Returns:
69
+ True if the system supports IPv4, False otherwise.
30
70
  """
31
- kwargs.setdefault("verify", _httpx_verify_kwarg())
32
71
  try:
33
- return httpx.get(url, **kwargs)
34
- except httpx.ConnectError as err:
35
- if "CERTIFICATE_VERIFY_FAILED" in str(err):
36
- # If the error is a certificate verification error, recommend mitigating steps.
37
- console.error(
38
- f"Certificate verification failed for {url}. Set environment variable SSL_CERT_FILE to the "
39
- "path of the certificate file or SSL_NO_VERIFY=1 to disable verification."
40
- )
41
- raise
72
+ httpx.head("http://1.1.1.1", timeout=3)
73
+ except httpx.RequestError:
74
+ return False
75
+ else:
76
+ return True
77
+
78
+
79
+ def _is_ipv6_supported() -> bool:
80
+ """Determine if the system supports IPv6.
81
+
82
+ Returns:
83
+ True if the system supports IPv6, False otherwise.
84
+ """
85
+ try:
86
+ httpx.head("http://[2606:4700:4700::1111]", timeout=3)
87
+ except httpx.RequestError:
88
+ return False
89
+ else:
90
+ return True
91
+
92
+
93
+ def _should_use_ipv6() -> bool:
94
+ """Determine if the system supports IPv6.
95
+
96
+ Returns:
97
+ True if the system supports IPv6, False otherwise.
98
+ """
99
+ return not _is_ipv4_supported() and _is_ipv6_supported()
100
+
101
+
102
+ def _httpx_local_address_kwarg() -> str:
103
+ """Get the value of the HTTPX local_address keyword argument.
104
+
105
+ Returns:
106
+ The local address to bind to
107
+ """
108
+ from ..config import environment
109
+
110
+ return environment.REFLEX_HTTP_CLIENT_BIND_ADDRESS.get() or (
111
+ "::" if _should_use_ipv6() else "0.0.0.0"
112
+ )
113
+
114
+
115
+ @once
116
+ def _httpx_client() -> httpx.Client:
117
+ """Get an HTTPX client.
118
+
119
+ Returns:
120
+ An HTTPX client.
121
+ """
122
+ return httpx.Client(
123
+ transport=httpx.HTTPTransport(
124
+ local_address=_httpx_local_address_kwarg(),
125
+ verify=_httpx_verify_kwarg(),
126
+ )
127
+ )
128
+
129
+
130
+ get = _wrap_https_func(_httpx_client().get)
@@ -115,11 +115,13 @@ def check_latest_package_version(package_name: str):
115
115
  if environment.REFLEX_CHECK_LATEST_VERSION.get() is False:
116
116
  return
117
117
  try:
118
+ console.debug(f"Checking for the latest version of {package_name}...")
118
119
  # Get the latest version from PyPI
119
120
  current_version = importlib.metadata.version(package_name)
120
121
  url = f"https://pypi.org/pypi/{package_name}/json"
121
122
  response = net.get(url)
122
123
  latest_version = response.json()["info"]["version"]
124
+ console.debug(f"Latest version of {package_name}: {latest_version}")
123
125
  if get_or_set_last_reflex_version_check_datetime():
124
126
  # Versions were already checked and saved in reflex.json, no need to warn again
125
127
  return
@@ -129,6 +131,7 @@ def check_latest_package_version(package_name: str):
129
131
  f"Your version ({current_version}) of {package_name} is out of date. Upgrade to {latest_version} with 'pip install {package_name} --upgrade'"
130
132
  )
131
133
  except Exception:
134
+ console.debug(f"Failed to check for the latest version of {package_name}.")
132
135
  pass
133
136
 
134
137
 
@@ -902,11 +905,12 @@ def initialize_app_directory(
902
905
 
903
906
  console.debug(f"Using {template_name=} {template_dir=} {template_code_dir_name=}.")
904
907
 
905
- # Remove all pyc and __pycache__ dirs in template directory.
906
- for pyc_file in template_dir.glob("**/*.pyc"):
907
- pyc_file.unlink()
908
- for pycache_dir in template_dir.glob("**/__pycache__"):
909
- pycache_dir.rmdir()
908
+ # Remove __pycache__ dirs in template directory and current directory.
909
+ for pycache_dir in [
910
+ *template_dir.glob("**/__pycache__"),
911
+ *Path.cwd().glob("**/__pycache__"),
912
+ ]:
913
+ shutil.rmtree(pycache_dir, ignore_errors=True)
910
914
 
911
915
  for file in template_dir.iterdir():
912
916
  # Copy the file to current directory but keep the name the same.
@@ -950,16 +954,22 @@ def initialize_web_directory():
950
954
  # Reuse the hash if one is already created, so we don't over-write it when running reflex init
951
955
  project_hash = get_project_hash()
952
956
 
957
+ console.debug(f"Copying {constants.Templates.Dirs.WEB_TEMPLATE} to {get_web_dir()}")
953
958
  path_ops.cp(constants.Templates.Dirs.WEB_TEMPLATE, str(get_web_dir()))
954
959
 
960
+ console.debug("Initializing the web directory.")
955
961
  initialize_package_json()
956
962
 
963
+ console.debug("Initializing the bun config file.")
957
964
  initialize_bun_config()
958
965
 
966
+ console.debug("Initializing the public directory.")
959
967
  path_ops.mkdir(get_web_dir() / constants.Dirs.PUBLIC)
960
968
 
969
+ console.debug("Initializing the next.config.js file.")
961
970
  update_next_config()
962
971
 
972
+ console.debug("Initializing the reflex.json file.")
963
973
  # Initialize the reflex json file.
964
974
  init_reflex_json(project_hash=project_hash)
965
975
 
@@ -1392,6 +1402,7 @@ def ensure_reflex_installation_id() -> int | None:
1392
1402
  Distinct id.
1393
1403
  """
1394
1404
  try:
1405
+ console.debug("Ensuring reflex installation id.")
1395
1406
  initialize_reflex_user_directory()
1396
1407
  installation_id_file = environment.REFLEX_DIR.get() / "installation_id"
1397
1408
 
@@ -1418,6 +1429,7 @@ def ensure_reflex_installation_id() -> int | None:
1418
1429
 
1419
1430
  def initialize_reflex_user_directory():
1420
1431
  """Initialize the reflex user directory."""
1432
+ console.debug(f"Creating {environment.REFLEX_DIR.get()}")
1421
1433
  # Create the reflex directory.
1422
1434
  path_ops.mkdir(environment.REFLEX_DIR.get())
1423
1435
 
@@ -1425,9 +1437,11 @@ def initialize_reflex_user_directory():
1425
1437
  def initialize_frontend_dependencies():
1426
1438
  """Initialize all the frontend dependencies."""
1427
1439
  # validate dependencies before install
1440
+ console.debug("Validating frontend dependencies.")
1428
1441
  validate_frontend_dependencies()
1429
1442
  # Install the frontend dependencies.
1430
- processes.run_concurrently(install_bun)
1443
+ console.debug("Installing or validating bun.")
1444
+ install_bun()
1431
1445
  # Set up the web directory.
1432
1446
  initialize_web_directory()
1433
1447
 
reflex/utils/redir.py CHANGED
@@ -5,6 +5,8 @@ import webbrowser
5
5
 
6
6
  import httpx
7
7
 
8
+ from reflex.utils import net
9
+
8
10
  from .. import constants
9
11
  from . import console
10
12
 
@@ -38,7 +40,7 @@ def open_browser_and_wait(
38
40
  console.info("[b]Complete the workflow in the browser to continue.[/b]")
39
41
  while True:
40
42
  try:
41
- response = httpx.get(poll_url, follow_redirects=True)
43
+ response = net.get(poll_url, follow_redirects=True)
42
44
  if response.is_success:
43
45
  break
44
46
  except httpx.RequestError as err:
reflex/utils/registry.py CHANGED
@@ -16,10 +16,13 @@ def latency(registry: str) -> int:
16
16
  int: The latency of the registry in microseconds.
17
17
  """
18
18
  try:
19
- return net.get(registry).elapsed.microseconds
19
+ time_to_respond = net.get(registry, timeout=2).elapsed.microseconds
20
20
  except httpx.HTTPError:
21
21
  console.info(f"Failed to connect to {registry}.")
22
22
  return 10_000_000
23
+ else:
24
+ console.debug(f"Latency of {registry}: {time_to_respond}")
25
+ return time_to_respond
23
26
 
24
27
 
25
28
  def average_latency(registry: str, attempts: int = 3) -> int:
@@ -32,7 +35,9 @@ def average_latency(registry: str, attempts: int = 3) -> int:
32
35
  Returns:
33
36
  The average latency of the registry in microseconds.
34
37
  """
35
- return sum(latency(registry) for _ in range(attempts)) // attempts
38
+ registry_latency = sum(latency(registry) for _ in range(attempts)) // attempts
39
+ console.debug(f"Average latency of {registry}: {registry_latency}")
40
+ return registry_latency
36
41
 
37
42
 
38
43
  def _get_best_registry() -> str:
@@ -41,12 +46,15 @@ def _get_best_registry() -> str:
41
46
  Returns:
42
47
  The best registry.
43
48
  """
49
+ console.debug("Getting best registry...")
44
50
  registries = [
45
51
  "https://registry.npmjs.org",
46
52
  "https://r.cnpmjs.org",
47
53
  ]
48
54
 
49
- return min(registries, key=average_latency)
55
+ best_registry = min(registries, key=average_latency)
56
+ console.debug(f"Best registry: {best_registry}")
57
+ return best_registry
50
58
 
51
59
 
52
60
  def get_npm_registry() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.7.4a2
3
+ Version: 0.7.4.post1
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,17 +2,17 @@ reflex/__init__.py,sha256=64HB9b6MKesl3Yv6aZMsozdMKKpgnxirKk-aeN45UYY,10341
2
2
  reflex/__init__.pyi,sha256=j4ZkO-mKKw5dFBhJVbaOg7AlncO-JCckV2cHENPiLG0,11303
3
3
  reflex/__main__.py,sha256=6cVrGEyT3j3tEvlEVUatpaYfbB5EF3UVY-6vc_Z7-hw,108
4
4
  reflex/admin.py,sha256=wu_vYqB0rU2njYBJSI0XZgVEkAFVZNQNUkUUXrlFbZc,343
5
- reflex/app.py,sha256=fQuNKU1zwHBxkO-9OuVA0a3dhnvUxOeT7sghUhiN1R8,69438
5
+ reflex/app.py,sha256=SUaN7G_CHdfKTQU2NQPx1lelg2YPyI-hBH23JhQdAu0,69389
6
6
  reflex/assets.py,sha256=PLTKAMYPKMZq8eWXKX8uco6NZ9IiPGWal0bOPLUmU7k,3364
7
7
  reflex/base.py,sha256=UuWQkOgZYvJNSIkYuNpb4wp9WtIBXlfmxXARAnOXiZ4,3889
8
- reflex/config.py,sha256=jVs6nGRQaQR2NPWaixLjbBGxLf1c8Ma6bP5B_GytUpY,35058
8
+ reflex/config.py,sha256=f3SNQnaqvvxNcTWm6Jo1eOf7LUB9jxmAXeLmGnf_4Yg,35218
9
9
  reflex/event.py,sha256=EX-9X-c8gIudZjRDG8qSrVAbegcaGkYXxLLRWg-7IOA,60758
10
10
  reflex/model.py,sha256=k6qCweATPW1YRB_qcHwa5X35btJmtIlB4zEQ63FaW3w,17527
11
11
  reflex/page.py,sha256=qEt8n5EtawSywCzdsiaNQJWhC8ie-vg8ig0JGuVavPI,2386
12
12
  reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  reflex/reflex.py,sha256=ka_BOQTeC3jKwZflM3ka6aijvhFV0hNMzwUmBjH-iSU,21034
14
14
  reflex/route.py,sha256=nn_hJwtQdjiqH_dHXfqMGWKllnyPQZTSR-KWdHDhoOs,4210
15
- reflex/state.py,sha256=XBryDsRkXVLxYYiU_TL2B_riU7FySJsg3aU0ywUSWJs,141886
15
+ reflex/state.py,sha256=e2DgHlvSMnPD5QRXGdWhV6KAFBsvfq3yjHp7MnsBOtc,142565
16
16
  reflex/style.py,sha256=dilXPn8de80NzsXT53GPJrmjELC5nPYIlCgongyq1zM,13145
17
17
  reflex/testing.py,sha256=IpjUHBNOJDAQtu6HnazfWIacEO5cIJvyHlCr6dYpr38,35585
18
18
  reflex/.templates/apps/blank/assets/favicon.ico,sha256=baxxgDAQ2V4-G5Q4S2yK5uUJTUGkv-AOWBQ0xd6myUo,4286
@@ -379,13 +379,13 @@ reflex/utils/export.py,sha256=bcJA0L8lBbjij-5PU93ka2c1d_yJqrIurp5u4mN5f68,2537
379
379
  reflex/utils/format.py,sha256=a8em_yzqp9pLTrPXRsdzFWSO1qL2x25BpJXOf9DV1t8,20638
380
380
  reflex/utils/imports.py,sha256=-EkUt9y5U3qmImjfpsXwYh7JI9qJHd_L6X9y12EPJew,3921
381
381
  reflex/utils/lazy_loader.py,sha256=-3DcwIqHNft2fb1ikgDYAMiEwNfbiWfrTBAf1gEVX2o,1367
382
- reflex/utils/net.py,sha256=0Yd9OLK8R_px2sqnqrDkTky6hYHtG2pEDvvilOjDfjc,1219
382
+ reflex/utils/net.py,sha256=8ceAC_diguAxVOOJpzax2vb1RA2h4BxS8SJvpgWqGYI,3175
383
383
  reflex/utils/path_ops.py,sha256=idGxUSJRKwYLLi7ppXkq3eV6rvAytJoO-n-FuLkwl3o,7604
384
- reflex/utils/prerequisites.py,sha256=OrG1aL-Bvbopkk2Qad4uJMryCG9lDY94C-xlPgQXmd0,63216
384
+ reflex/utils/prerequisites.py,sha256=KaEoAsqv_m1_BtQGGh1ewuBIo6AZfTzzDFLAmR5XuHU,64046
385
385
  reflex/utils/processes.py,sha256=2_qjTHToBNIn4VCBcivVxjmTvDaiWgDnF7frEmoBjBw,14749
386
386
  reflex/utils/pyi_generator.py,sha256=cKdssbtAtGj2deOSDos9OF96w10qte8JM-TlfbzSdtw,41602
387
- reflex/utils/redir.py,sha256=kTqY2WSouF5_ftOe5bnvPEyU3SLpg3pcysTcxFH1UxI,1505
388
- reflex/utils/registry.py,sha256=6DPfYc64GodbhwdAZ113_zBsvMNdbFTIJ94qDH1N6wc,1410
387
+ reflex/utils/redir.py,sha256=23OcUTsbThak5VYMQPOkSzyNsMB3VkgtF1bodSnHwbE,1533
388
+ reflex/utils/registry.py,sha256=3ft4jlq7WT8--jLNRAjhJVX0rb3z7jV1qP7kKEZBZhE,1785
389
389
  reflex/utils/serializers.py,sha256=K8-erpNIjJNIKif0cDFExa9f5DEVuQUq0j5v5VH6aBI,13408
390
390
  reflex/utils/telemetry.py,sha256=qwJBwjdtAV-OGKgO4h-NWhgTvfC3gbduBdn1UB8Ikes,5608
391
391
  reflex/utils/types.py,sha256=nGX44Q_Jp33wIaxf2vxANwBWe1743V2B8RRS8H9yV4c,33449
@@ -397,8 +397,8 @@ reflex/vars/function.py,sha256=2sVnhgetPSwtor8VFtAiYJdzZ9IRNzAKdsUJG6dXQcE,14461
397
397
  reflex/vars/number.py,sha256=f0AeipAAbBJiHILym4bkJdOGqHnMpwNgQDeV6Lc_7ms,26781
398
398
  reflex/vars/object.py,sha256=-fGqHThozjxAAuQL-wTwEItPiFI-ps53P2bKoSlW_As,17081
399
399
  reflex/vars/sequence.py,sha256=S0WvU4gVP7_3WNLttEoaFgUqJRjCQhXT9Auzub04ZmM,55216
400
- reflex-0.7.4a2.dist-info/METADATA,sha256=_JDqm8r8rcwlxgEEQ1tChLEYJ_jVCKkwwbSpnC5cfRA,12224
401
- reflex-0.7.4a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
402
- reflex-0.7.4a2.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
403
- reflex-0.7.4a2.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
404
- reflex-0.7.4a2.dist-info/RECORD,,
400
+ reflex-0.7.4.post1.dist-info/METADATA,sha256=FVxj3Uf6jbc7x_RrSI5GOIw0dz7dU6OMQNvjmicgmTI,12228
401
+ reflex-0.7.4.post1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
402
+ reflex-0.7.4.post1.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
403
+ reflex-0.7.4.post1.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
404
+ reflex-0.7.4.post1.dist-info/RECORD,,