reflex 0.6.2a1__py3-none-any.whl → 0.6.2a2__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/state.py CHANGED
@@ -461,10 +461,10 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
461
461
  for name, value in cls.__dict__.items()
462
462
  if types.is_backend_base_variable(name, cls)
463
463
  }
464
- # Add annotated backend vars that do not have a default value.
464
+ # Add annotated backend vars that may not have a default value.
465
465
  new_backend_vars.update(
466
466
  {
467
- name: Var("", _var_type=annotation_value).get_default_value()
467
+ name: cls._get_var_default(name, annotation_value)
468
468
  for name, annotation_value in get_type_hints(cls).items()
469
469
  if name not in new_backend_vars
470
470
  and types.is_backend_base_variable(name, cls)
@@ -990,6 +990,26 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
990
990
  # Ensure frontend uses null coalescing when accessing.
991
991
  object.__setattr__(prop, "_var_type", Optional[prop._var_type])
992
992
 
993
+ @classmethod
994
+ def _get_var_default(cls, name: str, annotation_value: Any) -> Any:
995
+ """Get the default value of a (backend) var.
996
+
997
+ Args:
998
+ name: The name of the var.
999
+ annotation_value: The annotation value of the var.
1000
+
1001
+ Returns:
1002
+ The default value of the var or None.
1003
+ """
1004
+ try:
1005
+ return getattr(cls, name)
1006
+ except AttributeError:
1007
+ try:
1008
+ return Var("", _var_type=annotation_value).get_default_value()
1009
+ except TypeError:
1010
+ pass
1011
+ return None
1012
+
993
1013
  @staticmethod
994
1014
  def _get_base_functions() -> dict[str, FunctionType]:
995
1015
  """Get all functions of the state class excluding dunder methods.
@@ -1938,7 +1958,14 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
1938
1958
  Returns:
1939
1959
  The serialized state.
1940
1960
  """
1941
- return pickle.dumps((state_to_schema(self), self))
1961
+ try:
1962
+ return pickle.dumps((state_to_schema(self), self))
1963
+ except pickle.PicklingError:
1964
+ console.warn(
1965
+ f"Failed to serialize state {self.get_full_name()} due to unpicklable object. "
1966
+ "This state will not be persisted."
1967
+ )
1968
+ return b""
1942
1969
 
1943
1970
  @classmethod
1944
1971
  def _deserialize(
@@ -2792,9 +2819,10 @@ class StateManagerDisk(StateManager):
2792
2819
  self.states[substate_token] = substate
2793
2820
 
2794
2821
  state_dilled = substate._serialize()
2795
- if not self.states_directory.exists():
2796
- self.states_directory.mkdir(parents=True, exist_ok=True)
2797
- self.token_path(substate_token).write_bytes(state_dilled)
2822
+ if state_dilled:
2823
+ if not self.states_directory.exists():
2824
+ self.states_directory.mkdir(parents=True, exist_ok=True)
2825
+ self.token_path(substate_token).write_bytes(state_dilled)
2798
2826
 
2799
2827
  for substate_substate in substate.substates.values():
2800
2828
  await self.set_state_for_substate(client_token, substate_substate)
@@ -3087,11 +3115,12 @@ class StateManagerRedis(StateManager):
3087
3115
  if state._get_was_touched():
3088
3116
  pickle_state = state._serialize()
3089
3117
  self._warn_if_too_large(state, len(pickle_state))
3090
- await self.redis.set(
3091
- _substate_key(client_token, state),
3092
- pickle_state,
3093
- ex=self.token_expiration,
3094
- )
3118
+ if pickle_state:
3119
+ await self.redis.set(
3120
+ _substate_key(client_token, state),
3121
+ pickle_state,
3122
+ ex=self.token_expiration,
3123
+ )
3095
3124
 
3096
3125
  # Wait for substates to be persisted.
3097
3126
  for t in tasks:
reflex/utils/compat.py CHANGED
@@ -19,10 +19,13 @@ async def windows_hot_reload_lifespan_hack():
19
19
  import asyncio
20
20
  import sys
21
21
 
22
- while True:
23
- sys.stderr.write("\0")
24
- sys.stderr.flush()
25
- await asyncio.sleep(0.5)
22
+ try:
23
+ while True:
24
+ sys.stderr.write("\0")
25
+ sys.stderr.flush()
26
+ await asyncio.sleep(0.5)
27
+ except asyncio.CancelledError:
28
+ pass
26
29
 
27
30
 
28
31
  @contextlib.contextmanager
reflex/vars/base.py CHANGED
@@ -547,6 +547,10 @@ class Var(Generic[VAR_TYPE]):
547
547
 
548
548
  return self
549
549
 
550
+ if fixed_type is Literal:
551
+ args = get_args(var_type)
552
+ fixed_type = unionize(*(type(arg) for arg in args))
553
+
550
554
  if not inspect.isclass(fixed_type):
551
555
  raise TypeError(f"Unsupported type {var_type} for guess_type.")
552
556
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: reflex
3
- Version: 0.6.2a1
3
+ Version: 0.6.2a2
4
4
  Summary: Web apps in pure Python.
5
5
  Home-page: https://reflex.dev
6
6
  License: Apache-2.0
@@ -347,13 +347,13 @@ reflex/model.py,sha256=I102SQwtUaidue0JZLJD3QJRoTPYvqKaT7U9yKUIH9s,14176
347
347
  reflex/page.py,sha256=25dKsOqVcY1Pz05T0gjUEk8zKHcfyd1c0nYIXW7jY5A,2332
348
348
  reflex/reflex.py,sha256=qlyEkg5ZqaYpKalNf2QIsAiPBIuQCxIyPjLCSedAUpU,18793
349
349
  reflex/route.py,sha256=WZS7stKgO94nekFFYHaOqNgN3zZGpJb3YpGF4ViTHmw,4198
350
- reflex/state.py,sha256=Y3DK2Z3AdkgJv-v83yXrIuKHqPK7axamIwOZ7Gp8ask,126653
350
+ reflex/state.py,sha256=LNjDJUs2KzwR2NxgV7zj81w-USQ-oBy727WeFbyFRVU,127583
351
351
  reflex/style.py,sha256=MxZyxvU0g6Vf_kWhsD5RFJRD6NjmJgfrlOclc53lSIw,12487
352
352
  reflex/testing.py,sha256=Iy_0AlpKXsLJINz02bb4u_I6TYAVs24a1TbhOGQ8PV8,34762
353
353
  reflex/utils/__init__.py,sha256=y-AHKiRQAhk2oAkvn7W8cRVTZVK625ff8tTwvZtO7S4,24
354
354
  reflex/utils/build.py,sha256=llkaIPC9o-SIY83ThUMEDIDpWaCDpaUNJdog0u_5tPM,8632
355
355
  reflex/utils/codespaces.py,sha256=tKmju4aGzDMPy76_eQSzJd3RYmVmiiNZy3Yc0e3zG_w,2856
356
- reflex/utils/compat.py,sha256=x6jZUcl-62AxUtO4HQMBI1xJzq_CJcJoObISbeTp4HU,2490
356
+ reflex/utils/compat.py,sha256=UXQxiPL4aJRcqZigr_syJEp_JaTs6VZHkl5ofst0tF4,2563
357
357
  reflex/utils/console.py,sha256=H6x6oUIT4T1ndfWaXRtr8jS1WcD71yo3m8JQbC-y-Qc,5481
358
358
  reflex/utils/exceptions.py,sha256=exOZJ8WLo-aXcXQQ_E3bohifO1axBMqp2DsF2Rolhpc,3995
359
359
  reflex/utils/exec.py,sha256=4n6UpvxDIWgO5qx6ZwIBh9g3lFerIA6ytsINMJG2bBM,14934
@@ -372,13 +372,13 @@ reflex/utils/serializers.py,sha256=v377C_EcuAyrt6RddAijVXDnTdO0k3pLlXzQ-NfhdBg,1
372
372
  reflex/utils/telemetry.py,sha256=zyy-bQjf18qQM-iTACIA9T7VBWRpm-DNES7iNJLrieo,5596
373
373
  reflex/utils/types.py,sha256=ByFCOk3WNvTuijj8foyGIdslRsMXb0oNHP3Tgw0RkPE,19043
374
374
  reflex/vars/__init__.py,sha256=OdCzmDFGMbCoy5VN4xQ3DaLpHck7npuLz7OUYvsN6Xw,1128
375
- reflex/vars/base.py,sha256=CTwfvccbJ7HBn7KrwafUUEma3Ry7_NSa9hn82Hx2KjU,85687
375
+ reflex/vars/base.py,sha256=ImF4jkQnD-qA_0-Md1yU5sFN5InIz_EuzKCd1DEO8Go,85824
376
376
  reflex/vars/function.py,sha256=GjTGRjDhMRACSPBIGNYgQzjKI2WgfhSluAWCm1mJQnU,5478
377
377
  reflex/vars/number.py,sha256=U9n61-zBIIPUDNy_exbvXuuJraCYmD489gjeU2OwAis,28091
378
378
  reflex/vars/object.py,sha256=wOq74_nDNAhqgT21HkHGfRukGdLjWoLprHjFNy1hjy8,14988
379
379
  reflex/vars/sequence.py,sha256=SCtuo4Nohsfg5y-r5RyyYYThNIk9znkPUC_bLg5XGd8,45881
380
- reflex-0.6.2a1.dist-info/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
381
- reflex-0.6.2a1.dist-info/METADATA,sha256=_Nn2vMhO0FNCXk8X8Q8SD2uM-qUedgl2oVdPRdroOLc,11980
382
- reflex-0.6.2a1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
383
- reflex-0.6.2a1.dist-info/entry_points.txt,sha256=H1Z5Yat_xJfy0dRT1Frk2PkO_p41Xy7fCKlj4FcdL9o,44
384
- reflex-0.6.2a1.dist-info/RECORD,,
380
+ reflex-0.6.2a2.dist-info/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
381
+ reflex-0.6.2a2.dist-info/METADATA,sha256=MzkYyYXaRAEPnpQuRDXd4QcgC2LOp0lOSyv51-PxpdI,11980
382
+ reflex-0.6.2a2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
383
+ reflex-0.6.2a2.dist-info/entry_points.txt,sha256=H1Z5Yat_xJfy0dRT1Frk2PkO_p41Xy7fCKlj4FcdL9o,44
384
+ reflex-0.6.2a2.dist-info/RECORD,,