reflex 0.8.14a2__py3-none-any.whl → 0.8.15a0__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/types.py CHANGED
@@ -8,6 +8,7 @@ import types
8
8
  from collections.abc import Callable, Iterable, Mapping, Sequence
9
9
  from enum import Enum
10
10
  from functools import cached_property, lru_cache
11
+ from importlib.util import find_spec
11
12
  from types import GenericAlias
12
13
  from typing import ( # noqa: UP035
13
14
  TYPE_CHECKING,
@@ -33,7 +34,6 @@ from typing import ( # noqa: UP035
33
34
  from typing import get_origin as get_origin_og
34
35
  from typing import get_type_hints as get_type_hints_og
35
36
 
36
- from pydantic.v1.fields import ModelField
37
37
  from typing_extensions import Self as Self
38
38
  from typing_extensions import override as override
39
39
 
@@ -346,33 +346,6 @@ def is_classvar(a_type: Any) -> bool:
346
346
  )
347
347
 
348
348
 
349
- def true_type_for_pydantic_field(f: ModelField):
350
- """Get the type for a pydantic field.
351
-
352
- Args:
353
- f: The field to get the type for.
354
-
355
- Returns:
356
- The type for the field.
357
- """
358
- if not isinstance(f.annotation, (str, ForwardRef)):
359
- return f.annotation
360
-
361
- type_ = f.outer_type_
362
-
363
- if (
364
- f.field_info.default is None
365
- or (isinstance(f.annotation, str) and f.annotation.startswith("Optional"))
366
- or (
367
- isinstance(f.annotation, ForwardRef)
368
- and f.annotation.__forward_arg__.startswith("Optional")
369
- )
370
- ) and not is_optional(type_):
371
- return type_ | None
372
-
373
- return type_
374
-
375
-
376
349
  def value_inside_optional(cls: GenericType) -> GenericType:
377
350
  """Get the value inside an Optional type or the original type.
378
351
 
@@ -412,6 +385,13 @@ def get_field_type(cls: GenericType, field_name: str) -> GenericType | None:
412
385
  return type_hints.get(field_name, None)
413
386
 
414
387
 
388
+ PROPERTY_CLASSES = (property,)
389
+ if find_spec("sqlalchemy") and find_spec("sqlalchemy.ext"):
390
+ from sqlalchemy.ext.hybrid import hybrid_property
391
+
392
+ PROPERTY_CLASSES += (hybrid_property,)
393
+
394
+
415
395
  def get_property_hint(attr: Any | None) -> GenericType | None:
416
396
  """Check if an attribute is a property and return its type hint.
417
397
 
@@ -421,9 +401,7 @@ def get_property_hint(attr: Any | None) -> GenericType | None:
421
401
  Returns:
422
402
  The type hint of the property, if it is a property, else None.
423
403
  """
424
- from sqlalchemy.ext.hybrid import hybrid_property
425
-
426
- if not isinstance(attr, (property, hybrid_property)):
404
+ if not isinstance(attr, PROPERTY_CLASSES):
427
405
  return None
428
406
  hints = get_type_hints(attr.fget)
429
407
  return hints.get("return", None)
@@ -441,12 +419,6 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
441
419
  Returns:
442
420
  The type of the attribute, if accessible, or None
443
421
  """
444
- import sqlalchemy
445
- from sqlalchemy.ext.associationproxy import AssociationProxyInstance
446
- from sqlalchemy.orm import DeclarativeBase, Mapped, QueryableAttribute, Relationship
447
-
448
- from reflex.model import Model
449
-
450
422
  try:
451
423
  attr = getattr(cls, name, None)
452
424
  except NotImplementedError:
@@ -458,67 +430,86 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
458
430
  if hasattr(cls, "__fields__") and name in cls.__fields__:
459
431
  # pydantic models
460
432
  return get_field_type(cls, name)
461
- if isinstance(cls, type) and issubclass(cls, DeclarativeBase):
462
- insp = sqlalchemy.inspect(cls)
463
- if name in insp.columns:
464
- # check for list types
465
- column = insp.columns[name]
466
- column_type = column.type
467
- try:
468
- type_ = insp.columns[name].type.python_type
469
- except NotImplementedError:
470
- type_ = None
471
- if type_ is not None:
472
- if hasattr(column_type, "item_type"):
473
- try:
474
- item_type = column_type.item_type.python_type # pyright: ignore [reportAttributeAccessIssue]
475
- except NotImplementedError:
476
- item_type = None
477
- if item_type is not None:
478
- if type_ in PrimitiveToAnnotation:
479
- type_ = PrimitiveToAnnotation[type_]
480
- type_ = type_[item_type] # pyright: ignore [reportIndexIssue]
481
- if hasattr(column, "nullable") and column.nullable:
482
- type_ = type_ | None
433
+ if find_spec("sqlalchemy") and find_spec("sqlalchemy.orm"):
434
+ import sqlalchemy
435
+ from sqlalchemy.ext.associationproxy import AssociationProxyInstance
436
+ from sqlalchemy.orm import (
437
+ DeclarativeBase,
438
+ Mapped,
439
+ QueryableAttribute,
440
+ Relationship,
441
+ )
442
+
443
+ from reflex.model import Model
444
+
445
+ if isinstance(cls, type) and issubclass(cls, DeclarativeBase):
446
+ insp = sqlalchemy.inspect(cls)
447
+ if name in insp.columns:
448
+ # check for list types
449
+ column = insp.columns[name]
450
+ column_type = column.type
451
+ try:
452
+ type_ = insp.columns[name].type.python_type
453
+ except NotImplementedError:
454
+ type_ = None
455
+ if type_ is not None:
456
+ if hasattr(column_type, "item_type"):
457
+ try:
458
+ item_type = column_type.item_type.python_type # pyright: ignore [reportAttributeAccessIssue]
459
+ except NotImplementedError:
460
+ item_type = None
461
+ if item_type is not None:
462
+ if type_ in PrimitiveToAnnotation:
463
+ type_ = PrimitiveToAnnotation[type_]
464
+ type_ = type_[item_type] # pyright: ignore [reportIndexIssue]
465
+ if hasattr(column, "nullable") and column.nullable:
466
+ type_ = type_ | None
467
+ return type_
468
+ if name in insp.all_orm_descriptors:
469
+ descriptor = insp.all_orm_descriptors[name]
470
+ if hint := get_property_hint(descriptor):
471
+ return hint
472
+ if isinstance(descriptor, QueryableAttribute):
473
+ prop = descriptor.property
474
+ if isinstance(prop, Relationship):
475
+ type_ = prop.mapper.class_
476
+ # TODO: check for nullable?
477
+ return list[type_] if prop.uselist else type_ | None
478
+ if isinstance(attr, AssociationProxyInstance):
479
+ return list[
480
+ get_attribute_access_type(
481
+ attr.target_class,
482
+ attr.remote_attr.key, # pyright: ignore [reportAttributeAccessIssue]
483
+ )
484
+ ]
485
+ elif (
486
+ isinstance(cls, type)
487
+ and not is_generic_alias(cls)
488
+ and issubclass(cls, Model)
489
+ ):
490
+ # Check in the annotations directly (for sqlmodel.Relationship)
491
+ hints = get_type_hints(cls) # pyright: ignore [reportArgumentType]
492
+ if name in hints:
493
+ type_ = hints[name]
494
+ type_origin = get_origin(type_)
495
+ if isinstance(type_origin, type) and issubclass(type_origin, Mapped):
496
+ return get_args(type_)[0] # SQLAlchemy v2
497
+ if find_spec("pydantic"):
498
+ from pydantic.v1.fields import ModelField
499
+
500
+ if isinstance(type_, ModelField):
501
+ return type_.type_ # SQLAlchemy v1.4
483
502
  return type_
484
- if name in insp.all_orm_descriptors:
485
- descriptor = insp.all_orm_descriptors[name]
486
- if hint := get_property_hint(descriptor):
487
- return hint
488
- if isinstance(descriptor, QueryableAttribute):
489
- prop = descriptor.property
490
- if isinstance(prop, Relationship):
491
- type_ = prop.mapper.class_
492
- # TODO: check for nullable?
493
- return list[type_] if prop.uselist else type_ | None
494
- if isinstance(attr, AssociationProxyInstance):
495
- return list[
496
- get_attribute_access_type(
497
- attr.target_class,
498
- attr.remote_attr.key, # pyright: ignore [reportAttributeAccessIssue]
499
- )
500
- ]
501
- elif isinstance(cls, type) and not is_generic_alias(cls) and issubclass(cls, Model):
502
- # Check in the annotations directly (for sqlmodel.Relationship)
503
- hints = get_type_hints(cls)
504
- if name in hints:
505
- type_ = hints[name]
506
- type_origin = get_origin(type_)
507
- if isinstance(type_origin, type) and issubclass(type_origin, Mapped):
508
- return get_args(type_)[0] # SQLAlchemy v2
509
- if isinstance(type_, ModelField):
510
- return type_.type_ # SQLAlchemy v1.4
511
- return type_
512
- elif is_union(cls):
503
+ if is_union(cls):
513
504
  # Check in each arg of the annotation.
514
505
  return unionize(
515
506
  *(get_attribute_access_type(arg, name) for arg in get_args(cls))
516
507
  )
517
- elif isinstance(cls, type):
508
+ if isinstance(cls, type):
518
509
  # Bare class
519
510
  exceptions = NameError
520
511
  try:
521
- hints = get_type_hints(cls)
512
+ hints = get_type_hints(cls) # pyright: ignore [reportArgumentType]
522
513
  if name in hints:
523
514
  return hints[name]
524
515
  except exceptions as e:
reflex/vars/base.py CHANGED
@@ -40,7 +40,6 @@ from rich.markup import escape
40
40
  from typing_extensions import dataclass_transform, override
41
41
 
42
42
  from reflex import constants
43
- from reflex.base import Base
44
43
  from reflex.constants.compiler import Hooks
45
44
  from reflex.constants.state import FIELD_MARKER
46
45
  from reflex.utils import console, exceptions, imports, serializers, types
@@ -1505,21 +1504,6 @@ class LiteralVar(Var):
1505
1504
  )
1506
1505
  return LiteralVar.create(serialized_value, _var_data=_var_data)
1507
1506
 
1508
- if isinstance(value, Base):
1509
- # get the fields of the pydantic class
1510
- fields = value.__fields__.keys()
1511
- one_level_dict = {field: getattr(value, field) for field in fields}
1512
-
1513
- return LiteralObjectVar.create(
1514
- {
1515
- field: value
1516
- for field, value in one_level_dict.items()
1517
- if not callable(value)
1518
- },
1519
- _var_type=type(value),
1520
- _var_data=_var_data,
1521
- )
1522
-
1523
1507
  if dataclasses.is_dataclass(value) and not isinstance(value, type):
1524
1508
  return LiteralObjectVar.create(
1525
1509
  {
@@ -3201,6 +3185,8 @@ if TYPE_CHECKING:
3201
3185
  from _typeshed import DataclassInstance
3202
3186
  from sqlalchemy.orm import DeclarativeBase
3203
3187
 
3188
+ from reflex.base import Base
3189
+
3204
3190
  SQLA_TYPE = TypeVar("SQLA_TYPE", bound=DeclarativeBase | None)
3205
3191
  BASE_TYPE = TypeVar("BASE_TYPE", bound=Base | None)
3206
3192
  DATACLASS_TYPE = TypeVar("DATACLASS_TYPE", bound=DataclassInstance | None)
reflex/vars/object.py CHANGED
@@ -6,6 +6,7 @@ import collections.abc
6
6
  import dataclasses
7
7
  import typing
8
8
  from collections.abc import Mapping
9
+ from importlib.util import find_spec
9
10
  from typing import (
10
11
  Any,
11
12
  NoReturn,
@@ -74,7 +75,15 @@ def _determine_value_type(var_type: GenericType):
74
75
  return Any
75
76
 
76
77
 
77
- class ObjectVar(Var[OBJECT_TYPE], python_types=Mapping):
78
+ PYTHON_TYPES = (Mapping,)
79
+ if find_spec("pydantic"):
80
+ import pydantic
81
+ import pydantic.v1
82
+
83
+ PYTHON_TYPES += (pydantic.BaseModel, pydantic.v1.BaseModel)
84
+
85
+
86
+ class ObjectVar(Var[OBJECT_TYPE], python_types=PYTHON_TYPES):
78
87
  """Base class for immutable object vars."""
79
88
 
80
89
  def _key_type(self) -> type:
@@ -460,7 +469,25 @@ class LiteralObjectVar(CachedVarOperation, ObjectVar[OBJECT_TYPE], LiteralVar):
460
469
 
461
470
  Returns:
462
471
  The literal object var.
472
+
473
+ Raises:
474
+ TypeError: If the value is not a mapping type or a dataclass.
463
475
  """
476
+ if not isinstance(_var_value, collections.abc.Mapping):
477
+ from reflex.utils.serializers import serialize
478
+
479
+ serialized = serialize(_var_value, get_type=False)
480
+ if not isinstance(serialized, collections.abc.Mapping):
481
+ msg = f"Expected a mapping type or a dataclass, got {_var_value!r} of type {type(_var_value).__name__}."
482
+ raise TypeError(msg)
483
+
484
+ return LiteralObjectVar(
485
+ _js_expr="",
486
+ _var_type=(type(_var_value) if _var_type is None else _var_type),
487
+ _var_data=_var_data,
488
+ _var_value=serialized,
489
+ )
490
+
464
491
  return LiteralObjectVar(
465
492
  _js_expr="",
466
493
  _var_type=(figure_out_type(_var_value) if _var_type is None else _var_type),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.14a2
3
+ Version: 0.8.15a0
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
@@ -36,6 +36,10 @@ Requires-Dist: sqlmodel<0.1,>=0.0.24
36
36
  Requires-Dist: starlette>=0.47.0
37
37
  Requires-Dist: typing-extensions>=4.13.0
38
38
  Requires-Dist: wrapt<2.0,>=1.17.0
39
+ Provides-Extra: db
40
+ Requires-Dist: alembic<2.0,>=1.15.2; extra == 'db'
41
+ Requires-Dist: pydantic<3.0,>=1.10.21; extra == 'db'
42
+ Requires-Dist: sqlmodel<0.1,>=0.0.24; extra == 'db'
39
43
  Provides-Extra: monitoring
40
44
  Requires-Dist: pyleak<1.0,>=0.1.14; extra == 'monitoring'
41
45
  Description-Content-Type: text/markdown
@@ -1,21 +1,21 @@
1
- reflex/__init__.py,sha256=_1PVYjDeA6_JyfXvL6OuKjjO6AX2oMiNcAq8AEHf6xw,10161
2
- reflex/__init__.pyi,sha256=0D46kHVUJPE_kgYL-BjraERu-MXNCPsQTZQShrijmeQ,10148
1
+ reflex/__init__.py,sha256=rDkhny17Glr6GIJZNaAZO9AKOhALpeRIJ4kRm38SSNM,10178
2
+ reflex/__init__.pyi,sha256=q7NlYS2YOhEmQzFUHknHOqBo6q-bwAz0UZy_k8qI52s,10184
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=a9wHB1q5p2uW5Ja7yIpitaS6GIPYNkir1KHrQNV8OPM,79192
5
+ reflex/app.py,sha256=qBwr17eLnpz64CXLrGD5pvWVqaC9m5XxFDkmA4lJOh4,79240
6
6
  reflex/assets.py,sha256=l5O_mlrTprC0lF7Rc_McOe3a0OtSLnRdNl_PqCpDCBA,3431
7
- reflex/base.py,sha256=Oh664QL3fZEHErhUasFqP7fE4olYf1y-9Oj6uZI2FCU,1173
7
+ reflex/base.py,sha256=LHWOQIZBoiuuw_b9-KbJV5SP5BHbpxGfULzC2KCf6lw,2315
8
8
  reflex/config.py,sha256=LsHAtdH4nkSn3q_Ie-KNdOGdflLXrFICUQov29oFjVk,21229
9
- reflex/environment.py,sha256=USXLwLP86KKeLFvs_di4j73GsLkZ9SdQEeh-374CZH4,23854
9
+ reflex/environment.py,sha256=siROr2_xfV4YdmjcoB2gI1JAfZjRnzYcmMcow__gMx0,24208
10
10
  reflex/event.py,sha256=KlNFqtJacwiPCtp7rkIlbskZqCME9RJsAHF-6pOEvwg,76255
11
- reflex/model.py,sha256=2QhU1TJlcDeRA23pv8usLjyDaA6FhbQRYdzsjOHzvUI,19665
11
+ reflex/model.py,sha256=qSmmlowwhDAC2YZQ2U_cP_a_jOs--VtXAgJBHKaS7qg,22214
12
12
  reflex/page.py,sha256=ssCbMVFuIy60vH-YhJUzN0OxzUwXFCCD3ej56dVjp3g,3525
13
13
  reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- reflex/reflex.py,sha256=J6p0e9u4VURBgKY-Rk2mxiW3Usmxf71aNPyXaesoGJA,25821
14
+ reflex/reflex.py,sha256=jjvoifhJ4dTADgIQB-mgzm4W6_geCeVstenB11sJqL0,25961
15
15
  reflex/route.py,sha256=TnS4m6Hm-b3LfGFpm37iAMEd-_JISAouPW5FqUxTAfU,7858
16
- reflex/state.py,sha256=JoFQoTPXHQHFzKwBFo8T4rvuAFNGbtcDmTotzrSRQP4,95402
16
+ reflex/state.py,sha256=zbmjm7grSTcikkzw4VTY1OSgdrY-K0VLxk6mr-w16wM,95426
17
17
  reflex/style.py,sha256=Jc7hZyH9CSFDbweoRCrkVtSu8tZq5aIggSoAYAh-w1M,13304
18
- reflex/testing.py,sha256=Wt1qdmqT3Yo9CKWZzHXiytizZJ5KjqxVzuoGPjI_Vfk,40458
18
+ reflex/testing.py,sha256=T7jqp1U25-nqR4MEBeRzXbXEygPZ3zEiPLD0o_1X9TM,40557
19
19
  reflex/.templates/apps/blank/assets/favicon.ico,sha256=baxxgDAQ2V4-G5Q4S2yK5uUJTUGkv-AOWBQ0xd6myUo,4286
20
20
  reflex/.templates/apps/blank/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  reflex/.templates/apps/blank/code/blank.py,sha256=wry9E3VjC7qtt_gzqNOyo4KZAAlzVyNp3uhFkcLZmM0,898
@@ -104,8 +104,8 @@ reflex/components/datadisplay/__init__.py,sha256=L8pWWKNHWdUD2fbZRoEKjd_8c_hpDdG
104
104
  reflex/components/datadisplay/__init__.pyi,sha256=H3LZkWdrw3RTv_csaIT8qoClgAJTonlGZ5ZMeGMV0Bs,551
105
105
  reflex/components/datadisplay/code.py,sha256=DQjferNi6QD2tNZdA28mMRu5KhqejAePxmD23vpcl9Y,12605
106
106
  reflex/components/datadisplay/code.pyi,sha256=QCWqxWCsbFqS4CcfgN5P1u12JU7sBcUEEjekZnWSDeU,41375
107
- reflex/components/datadisplay/dataeditor.py,sha256=cGwAKPYknoHMwVhBowHKFtG2Nxr5q-8hIptnf98U7x0,13574
108
- reflex/components/datadisplay/dataeditor.pyi,sha256=eDI6w6ZrJRXQsThXu3vS-dfI-aKPMntLN5RmGkJOYCQ,12511
107
+ reflex/components/datadisplay/dataeditor.py,sha256=PfT8DDyWZ7wvPnxg8vQx-p3U6i0vwfBYHbe7KZXrCNg,14003
108
+ reflex/components/datadisplay/dataeditor.pyi,sha256=ntSQRf1FrpFBkibDJc-aIZP2clKrMLeRgZA0MS0gn0E,12606
109
109
  reflex/components/datadisplay/logo.py,sha256=xvg5TRVRSi2IKn7Kg4oYzWcaFMHfXxUaCp0cQmuKSn0,1993
110
110
  reflex/components/datadisplay/shiki_code_block.py,sha256=qCp4jZO3Ek4mR_1Qs4oxLh-GCEo6VBlpb8B9MDDdw4Y,24503
111
111
  reflex/components/datadisplay/shiki_code_block.pyi,sha256=J6NyOY_RQ9VTu7Psi3Tuctv5EM6FnlPZ2EXEZwHBC9w,56933
@@ -139,8 +139,8 @@ reflex/components/gridjs/__init__.py,sha256=xJwDm1AZ70L5-t9LLqZwGUtDpijbf1KuMYDT
139
139
  reflex/components/gridjs/datatable.py,sha256=7JKrRw1zkpFB0_wwoaIhrVrldsm7-dyi3PASgqLq8Hc,4224
140
140
  reflex/components/gridjs/datatable.pyi,sha256=kFgv82vCgfdWZaUq4bZ73G8X3mkw6ecvSRkZ9G9-28E,5185
141
141
  reflex/components/lucide/__init__.py,sha256=EggTK2MuQKQeOBLKW-mF0VaDK9zdWBImu1HO2dvHZbE,73
142
- reflex/components/lucide/icon.py,sha256=oyTpIx5bJ-7D3VrXMrMpZ4aIKnv1GADBM97eSROnzZU,35358
143
- reflex/components/lucide/icon.pyi,sha256=BAVUCJYalfn0nBpwglPiJNO_EfRdzM2eWHtaBy2Fa-o,38152
142
+ reflex/components/lucide/icon.py,sha256=sb-_PcD5KGzSGJAC4AP4XjaciRHOowE6NVmr5PazS0E,35375
143
+ reflex/components/lucide/icon.pyi,sha256=Mb6fQNSoWM8d0OaTntAj-LGp4xf1oj5SH_JzE2sDIfs,38169
144
144
  reflex/components/markdown/__init__.py,sha256=Dfl1At5uYoY7H4ufZU_RY2KOGQDLtj75dsZ2BTqqAns,87
145
145
  reflex/components/markdown/markdown.py,sha256=kzvO2VnfCbxV7AcIMBJbxLtAlQ6U5T_QB_JTh8l-HJ4,15450
146
146
  reflex/components/markdown/markdown.pyi,sha256=oOlXZItHB0TPWsFz1Qjvr3KzG8sssthBp40UO_KkRIA,4322
@@ -304,8 +304,8 @@ reflex/components/recharts/polar.pyi,sha256=8ShEcGK9KJyu0FN6KPys1kgAYrzOZ6wtiRuy
304
304
  reflex/components/recharts/recharts.py,sha256=rAarxOawhHiWUDIHNrizmChitgoNV4zas1y5SuSsr7E,3221
305
305
  reflex/components/recharts/recharts.pyi,sha256=9j8cVSMqyBkkOBBrx9pzDpP1clnbM9kD0TTViTUGDYc,7084
306
306
  reflex/components/sonner/__init__.py,sha256=L_mdRIy7-ccRGSz5VK6J8O-c-e-D1p9xWw29_ErrvGg,68
307
- reflex/components/sonner/toast.py,sha256=sJ9E60VaMBwoev4aBrKr42ygN7e0jajNTooa5o5wYPQ,12505
308
- reflex/components/sonner/toast.pyi,sha256=cj0zlkcFVmJ3CrHe2XIsF0MeBw61Bn-hrGkzHTFz8Og,7782
307
+ reflex/components/sonner/toast.py,sha256=VBtoRnxBhKD029njAjhbLeYtiUSL3aNPOSmA9Lmsqvg,12512
308
+ reflex/components/sonner/toast.pyi,sha256=z48tJMXVfo3kGbNqDLWjZ_6UhGL8Payj1lsSCPxawh0,7789
309
309
  reflex/components/tags/__init__.py,sha256=Pc0JU-Tv_W7KCsydXgbKmu7w2VtHNkI6Cx2hTkNhW_Q,152
310
310
  reflex/components/tags/cond_tag.py,sha256=svlnSP2ZMwHqjsHa3fq7a7K2--3XTLo5FcbjOw7fVik,849
311
311
  reflex/components/tags/iter_tag.py,sha256=Q4rPOt0NSjYhAPDOnNtu7XPxn3MCYZInZjYU3xPJq2Q,3716
@@ -319,20 +319,20 @@ reflex/constants/compiler.py,sha256=1FXPYQNotaSrTwWcOspA1gCVmEdoiWkNMbbrz_qU0YU,
319
319
  reflex/constants/config.py,sha256=8OIjiBdZZJrRVHsNBheMwopE9AwBFFzau0SXqXKcrPg,1715
320
320
  reflex/constants/custom_components.py,sha256=joJt4CEt1yKy7wsBH6vYo7_QRW0O_fWXrrTf0VY2q14,1317
321
321
  reflex/constants/event.py,sha256=tgoynWQi2L0_Kqc3XhXo7XXL76A-OKhJGHRrNjm7gFw,2885
322
- reflex/constants/installer.py,sha256=XmXvA4uVJ8McAVO5hjXk9demdEyPxIWmWFJTqG6IezU,4193
322
+ reflex/constants/installer.py,sha256=QWVD6vFlRH7j3Dt37pH_dPRTskV2-PtW7lFmKDvXMmk,4193
323
323
  reflex/constants/route.py,sha256=UBjqaAOxiUxlDZCSY4O2JJChKvA4MZrhUU0E5rNvKbM,2682
324
324
  reflex/constants/state.py,sha256=VrEeYxXfE9ss8RmOHIXD4T6EGsV9PDqbtMCQMmZxW3I,383
325
325
  reflex/constants/utils.py,sha256=e1ChEvbHfmE_V2UJvCSUhD_qTVAIhEGPpRJSqdSd6PA,780
326
326
  reflex/custom_components/__init__.py,sha256=R4zsvOi4dfPmHc18KEphohXnQFBPnUCb50cMR5hSLDE,36
327
327
  reflex/custom_components/custom_components.py,sha256=z5eL7WqbU4Vx5zVRWqgYPQu05P29XFsJ48xL9OLiyRg,25355
328
328
  reflex/experimental/__init__.py,sha256=P8fe8S2e2gy2HCwHFGQzr3lPMmh7qN5Ii2e8ukoPHuQ,1664
329
- reflex/experimental/client_state.py,sha256=adITjFmvzO081yaVgne2PZpG0hc_SrJHyLLbE-zfet0,10024
329
+ reflex/experimental/client_state.py,sha256=BPVOewGjuntuRCQDJvh-Tj290iTool5IpqnYsi_czrc,10031
330
330
  reflex/experimental/hooks.py,sha256=CHYGrAE5t8riltrJmDFgJ4D2Vhmhw-y3B3MSGNlOQow,2366
331
331
  reflex/istate/__init__.py,sha256=afq_pCS5B_REC-Kl3Rbaa538uWi59xNz4INeuENcWnk,2039
332
332
  reflex/istate/data.py,sha256=8RydiarP7f5ET5a3dfGpuuXdYZ7KHEWS6aENVoxRxGc,7918
333
333
  reflex/istate/dynamic.py,sha256=xOQ9upZVPf6ngqcLQZ9HdAAYmoWwJ8kRFPH34Q5HTiM,91
334
334
  reflex/istate/manager.py,sha256=WyBBhDuq3cVuno3H-axeT8sqF0EqHR3MNZJw-B76cZs,30517
335
- reflex/istate/proxy.py,sha256=4SE3-W6OpHA51JlLdz5Kbslpusp5xOUQI91nmzpH8Xo,25825
335
+ reflex/istate/proxy.py,sha256=BwlJYWR5FMItqbHVulhgI_TH8jtP69HkXXpTtClXXcs,25993
336
336
  reflex/istate/storage.py,sha256=gCPoiZxuG-Rw0y-Pz3OC7rv4o08dQ_jK1fE2u8Jhxqg,4339
337
337
  reflex/istate/wrappers.py,sha256=p8uuioXRbR5hperwbOJHUcWdu7hukLikQdoR7qrnKsI,909
338
338
  reflex/middleware/__init__.py,sha256=x7xTeDuc73Hjj43k1J63naC9x8vzFxl4sq7cCFBX7sk,111
@@ -344,11 +344,11 @@ reflex/plugins/base.py,sha256=5BgzCM7boj9kJ6FGzVzVlgQk-crJuVmOLCl1PXvv4-E,3372
344
344
  reflex/plugins/shared_tailwind.py,sha256=kCyIaSFrzoPe7dlA09SjfSY30bfbh43dkQchres4A0w,7305
345
345
  reflex/plugins/sitemap.py,sha256=X_CtH5B1w3CZno-gdPj1rp63WjOuNjFnX4B3fx_-VFQ,6135
346
346
  reflex/plugins/tailwind_v3.py,sha256=jCEZ5UYdr706Mw48L-WSHOUB6O55o1C3uG6AMwXqZoI,4810
347
- reflex/plugins/tailwind_v4.py,sha256=fcNaFtikSIu1LhF94DcBs1xR2CjbQRB5o1_KYeThUF0,5230
347
+ reflex/plugins/tailwind_v4.py,sha256=8G7iXj6wYRRJlCWlce_vtCgs1YittFvLucyUP-sPXhc,5230
348
348
  reflex/utils/__init__.py,sha256=y-AHKiRQAhk2oAkvn7W8cRVTZVK625ff8tTwvZtO7S4,24
349
- reflex/utils/build.py,sha256=E9xcNfmQdpXL7_inA5gjuJ1AVAn3l9zaWP9TAS7IGfI,9468
349
+ reflex/utils/build.py,sha256=j-OY90O7gMP_bclVt_6J3Q2GFgOHQH_uFpTfdaWmuqU,9746
350
350
  reflex/utils/codespaces.py,sha256=kEQ-j-jclTukFpXDlYgNp95kYMGDrQmP3VNEoYGZ1u4,3052
351
- reflex/utils/compat.py,sha256=aSJH_M6iomgHPQ4onQ153xh1MWqPi3HSYDzE68N6gZM,2635
351
+ reflex/utils/compat.py,sha256=zuP7QHvhSSss0taa3t7-OA9VijGt2c3y3kEa6Kfjyhk,1322
352
352
  reflex/utils/console.py,sha256=W41Ogj1Jk8tEOhXXy9dy4KCLYp5rn0NZQwbBqXbkwSI,13668
353
353
  reflex/utils/decorator.py,sha256=QUZntENupeW5FA5mNRTx0I1GzGKFQXhMjVg24_IIM5o,3957
354
354
  reflex/utils/exceptions.py,sha256=Wwu7Ji2xgq521bJKtU2NgjwhmFfnG8erirEVN2h8S-g,8884
@@ -363,29 +363,29 @@ reflex/utils/misc.py,sha256=folEweZVCrhHNkkqut9KqQdTJ80HxwL_gI41m40FnNM,4592
363
363
  reflex/utils/monitoring.py,sha256=87fr9j6Y9Bvz2uF4tBxuX6CaU054h1UPx0ijcnyP_kw,5250
364
364
  reflex/utils/net.py,sha256=q3h5pNbAlFiqy8U15S9DTOvzy_OnenVVug5ROBTGRTA,4267
365
365
  reflex/utils/path_ops.py,sha256=_RS17IQDNr5vcoLLGZx2-z1E5WP-JgDHvaRAOgqrZiU,8154
366
- reflex/utils/prerequisites.py,sha256=1TYEeVfydNbdvRmUvw_YfWm7wpUexbqrFm0MyB1WFlM,20760
366
+ reflex/utils/prerequisites.py,sha256=4aFbsI2mM1ocgbykDCHWcNNWXN5b5Sb3_KEj5YYuEqQ,20769
367
367
  reflex/utils/processes.py,sha256=ralnYq3tL1v_20n2ew74AlU7PQ0E4T0HllSuK1Edq_M,18125
368
368
  reflex/utils/pyi_generator.py,sha256=IiNyiodH_xq8tRLD45phe2Le3sL6ZgloVMyg07xtT3o,46395
369
369
  reflex/utils/redir.py,sha256=E6lJ6UYGQs_uCyQAKHT_dDMplo5IRZ9JarWfvgGAgGo,1731
370
370
  reflex/utils/registry.py,sha256=omKh5rrsybDuuKmh4K88lwdwwcpGsu3Vc4pCko_djKY,2239
371
371
  reflex/utils/rename.py,sha256=8f3laR0Zr3uizKKDD_1woPz-FZvUPjzD-fDeNHf7wBk,5232
372
- reflex/utils/serializers.py,sha256=wc8iWlkX1AOlsfsuoNZkm3GXiZ1C_da0I9IjduTXz6s,13893
373
- reflex/utils/telemetry.py,sha256=KY54NmGWyJVSf9TMTcXw2V6gIbEqut1JkAXmmtIlRfw,10776
372
+ reflex/utils/serializers.py,sha256=18cnbx5rMftrh6T0bj0L2LqMKHPcFTSiKZ8bx_20Ris,14039
373
+ reflex/utils/telemetry.py,sha256=E_qV7hHKybnWu9MfMSTbJ7-RJebyA1Csh_x6GaCzI_4,10740
374
374
  reflex/utils/templates.py,sha256=FWtO6kZldDK3MPj39LitPlcyWV9_Z8Ys6G9anitv94A,14108
375
375
  reflex/utils/token_manager.py,sha256=ZtrYR0X8tTs8FpQHtMb09-H2V1xSoLWwVH8jW8OCrU8,7445
376
- reflex/utils/types.py,sha256=v2shXUDPqsgrxXDwrP9JYYgSTwZht0YjAo5c1mDDI8M,38543
376
+ reflex/utils/types.py,sha256=pxgu95iLIJih6T1Bz6oeexCc0QTjqUTtC6L4LOna9sM,38584
377
377
  reflex/vars/__init__.py,sha256=pUzFFkY-brpEoqYHQc41VefaOdPQG6xzjer1RJy9IKo,1264
378
- reflex/vars/base.py,sha256=gWOVTeRVH9fheQtqJkh_GPP8F8gcdFfgJAHcZcNFn18,110306
378
+ reflex/vars/base.py,sha256=_0YK7Wc8kWeBq_wktK0F54AnPPVzzQu9nrP_3MwJ2cM,109787
379
379
  reflex/vars/color.py,sha256=fpc3u9_H9R_DVawKMOf3tV1NDSnOs0aPHt4k1Lyu_KY,4085
380
380
  reflex/vars/datetime.py,sha256=F2Jv_bfydipFSkIQ1F6x5MnSgFEyES9Vq5RG_uGH81E,5118
381
381
  reflex/vars/dep_tracking.py,sha256=LfDGgAGlqfC0DeiVcitRBcA1uCe1C3fNRARRekLgCz4,13738
382
382
  reflex/vars/function.py,sha256=0i-VkxHkDJmZtfQUwUfaF0rlS6WM8azjwQ8k7rEOkyk,13944
383
383
  reflex/vars/number.py,sha256=FP5Jmd8qOwZgGHUG9DSmneBB4X6bj7G8oIDYsDw_j80,28242
384
- reflex/vars/object.py,sha256=AMvLFWyQBMSTUzmQT30M4CDUx9ec0C87cUDV8OjoDac,16457
384
+ reflex/vars/object.py,sha256=hlBw9cElr_9TnFdTbzSHy6EW6PHrvGFH7bpwRGgtXRM,17405
385
385
  reflex/vars/sequence.py,sha256=JAvHmLxnT6B2AQhLx6RTodGybdhcxhJrYxUlhCklYNY,51445
386
386
  scripts/hatch_build.py,sha256=-4pxcLSFmirmujGpQX9UUxjhIC03tQ_fIQwVbHu9kc0,1861
387
- reflex-0.8.14a2.dist-info/METADATA,sha256=za9uXA1WGbp-x50JwCi1sRpUHn63KXhNJI9EpQOtUPA,12336
388
- reflex-0.8.14a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
389
- reflex-0.8.14a2.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
390
- reflex-0.8.14a2.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
391
- reflex-0.8.14a2.dist-info/RECORD,,
387
+ reflex-0.8.15a0.dist-info/METADATA,sha256=0oOaIV9sRMyjfrob5qBYGTD5lUiiJ_hHk1NtXeSvGTw,12511
388
+ reflex-0.8.15a0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
389
+ reflex-0.8.15a0.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
390
+ reflex-0.8.15a0.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
391
+ reflex-0.8.15a0.dist-info/RECORD,,