22
33from __future__ import annotations
44
5+ import sys
56from collections .abc import Iterable , Sequence
67from datetime import datetime
78from inspect import getmodule
@@ -682,12 +683,13 @@ def into_component(component: Component | ComponentCallable) -> Component:
682683 """
683684 if (converted := _into_component_once (component )) is not None :
684685 return converted
686+ if not callable (component ):
687+ raise TypeError (
688+ f"Expected a Component or callable, got { component !r} of type { type (component )} "
689+ )
690+
685691 try :
686- if (
687- callable (component )
688- and (converted := _into_component_once (component ())) is not None
689- ):
690- return converted
692+ component_called = component ()
691693 except KeyError as e :
692694 if isinstance (e , ReflexError ):
693695 raise
@@ -725,8 +727,12 @@ def into_component(component: Component | ComponentCallable) -> Component:
725727 ).with_traceback (e .__traceback__ ) from None
726728 raise
727729
728- msg = f"Expected a Component, got { type (component )} "
729- raise TypeError (msg )
730+ if (converted := _into_component_once (component_called )) is not None :
731+ return converted
732+
733+ raise TypeError (
734+ f"Expected a Component, got { component_called !r} of type { type (component_called )} "
735+ )
730736
731737
732738def compile_unevaluated_page (
@@ -747,52 +753,61 @@ def compile_unevaluated_page(
747753
748754 Returns:
749755 The compiled component and whether state should be enabled.
756+
757+ Raises:
758+ Exception: If an error occurs while evaluating the page.
750759 """
751- # Generate the component if it is a callable.
752- component = into_component (page .component )
760+ try :
761+ # Generate the component if it is a callable.
762+ component = into_component (page .component )
753763
754- component ._add_style_recursive (style or {}, theme )
764+ component ._add_style_recursive (style or {}, theme )
755765
756- enable_state = False
757- # Ensure state is enabled if this page uses state.
758- if state is None :
759- if page .on_load or component ._has_stateful_event_triggers ():
760- enable_state = True
761- else :
762- for var in component ._get_vars (include_children = True ):
763- var_data = var ._get_all_var_data ()
764- if not var_data :
765- continue
766- if not var_data .state :
767- continue
766+ enable_state = False
767+ # Ensure state is enabled if this page uses state.
768+ if state is None :
769+ if page .on_load or component ._has_stateful_event_triggers ():
768770 enable_state = True
769- break
770-
771- from reflex .app import OverlayFragment
772- from reflex .utils .format import make_default_page_title
773-
774- component = OverlayFragment .create (component )
775-
776- meta_args = {
777- "title" : (
778- page .title
779- if page .title is not None
780- else make_default_page_title (get_config ().app_name , route )
781- ),
782- "image" : page .image ,
783- "meta" : page .meta ,
784- }
785-
786- if page .description is not None :
787- meta_args ["description" ] = page .description
788-
789- # Add meta information to the component.
790- utils .add_meta (
791- component ,
792- ** meta_args ,
793- )
771+ else :
772+ for var in component ._get_vars (include_children = True ):
773+ var_data = var ._get_all_var_data ()
774+ if not var_data :
775+ continue
776+ if not var_data .state :
777+ continue
778+ enable_state = True
779+ break
780+
781+ from reflex .app import OverlayFragment
782+ from reflex .utils .format import make_default_page_title
783+
784+ component = OverlayFragment .create (component )
785+
786+ meta_args = {
787+ "title" : (
788+ page .title
789+ if page .title is not None
790+ else make_default_page_title (get_config ().app_name , route )
791+ ),
792+ "image" : page .image ,
793+ "meta" : page .meta ,
794+ }
795+
796+ if page .description is not None :
797+ meta_args ["description" ] = page .description
798+
799+ # Add meta information to the component.
800+ utils .add_meta (
801+ component ,
802+ ** meta_args ,
803+ )
794804
795- return component , enable_state
805+ except Exception as e :
806+ if sys .version_info >= (3 , 11 ):
807+ e .add_note (f"Happened while evaluating page { route !r} " )
808+ raise
809+ else :
810+ return component , enable_state
796811
797812
798813class ExecutorSafeFunctions :
0 commit comments