
    CjF                       S r SSKJr  SSKJr  SSKJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJr  SSKrSSKJr  SSKJr  SS	KJrJrJrJrJr  \(       a  SS
KJr  \r \" S5      r!\" SSS9r" " S S5      r# " S S\$5      r% " S S\%5      r& " S S\\!   5      r'S"S jr(          S#S jr)\RT                  RV                   " S S\\!   5      5       r, " S S\,\!   5      r- " S S\,\!   5      r.SS .           S$S! jjr/g)%z_

This module contains the `Reactive` class which implements [reactivity](/guide/reactivity/).
    )annotations)partial)isawaitable)
TYPE_CHECKINGAny	AwaitableCallableClassVarGenericTypeTypeVarcastoverloadN)events)count_parameters)MessageTargetWatchCallbackBothValuesTypeWatchCallbackNewValueTypeWatchCallbackNoArgsTypeWatchCallbackType)DOMNodeReactiveTypeReactableTyper   )boundc                  "    \ rS rSrSrSS jrSrg)_Mutated,   z*A wrapper to indicate a value was mutated.c                    Xl         g Nvalue)selfr!   s     b/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/textual/reactive.py__init___Mutated.__init__/   s    
    r    N)r!   r   returnNone)__name__
__module____qualname____firstlineno____doc__r$   __static_attributes__ r&   r#   r   r   ,   s
    4r&   r   c                      \ rS rSrSrSrg)ReactiveError3   zBase class for reactive errors.r/   Nr)   r*   r+   r,   r-   r.   r/   r&   r#   r1   r1   3   s    )r&   r1   c                      \ rS rSrSrSrg)TooManyComputesError7   z@Raised when an attribute has public and private compute methods.r/   Nr3   r/   r&   r#   r5   r5   7   s    Jr&   r5   c                  ,    \ rS rSrSrSS jrSS jrSrg)	
Initialize;   ap  Initialize a reactive by calling a method parent object.

Example:
    ```python
        class InitializeApp(App):

            def get_names(self) -> list[str]:
                return ["foo", "bar", "baz"]

            # The `names` property will call `get_names` to get its default when first referenced.
            names = reactive(Initialize(get_names))
    ```

c                    Xl         g r   callback)r"   r<   s     r#   r$   Initialize.__init__K   s     r&   c                $    U R                  U5      $ r   r;   )r"   objs     r#   __call__Initialize.__call__N   s    }}S!!r&   r;   N)r<   z'Callable[[ReactableType], ReactiveType]r'   r(   )r?   r   r'   r   )r)   r*   r+   r,   r-   r$   r@   r.   r/   r&   r#   r8   r8   ;   s    !"r&   r8   c                   #    SnUI Sh  vN   U R                  [        R                  " [        [        R
                  U 5      S95        g N@7f)z7Coroutine to await an awaitable returned from a watcherTNr;   )post_messager   Callbackr   Reactive_compute)r?   	awaitable_rich_traceback_omits      r#   await_watcherrI   R   s;     
OOV__gh6G6G.MNO s   AAAAc                n   Sn[        U5      nU R                  5          US:X  a  [        [        U5      " X#5      nO2US:X  a  [        [        U5      " U5      nO[        [
        U5      " 5       n[        U5      (       a  U R                  [        [        X5      5        SSS5        g! , (       d  f       g= f)zInvoke a watch function.

Args:
    watcher_object: The object watching for the changes.
    watch_function: A watch function, which may be sync or async.
    old_value: The old value of the attribute.
    value: The new value of the attribute.
T      N)
r   _contextr   r   r   r   r   	call_nextr   rI   )watcher_objectwatch_function	old_valuer!   rH   param_countwatch_results          r#   invoke_watcherrT   Z   s      ">2K		 	 	"! ;^LL A 9>J5QL 7HJL|$$$$~D 
#	"	"s   A?B&&
B4c            	         \ rS rSr% Sr0 rS\S'   SSSSSSSSS.                   SS	 jjrSS
 jr\	SS j5       r
\SS j5       rSS jr\	SS j5       r\	SS j5       rSS jr\(       a$  \        S S j5       r\        S!S j5       r        S"S jrS#S$S jjrS%S jr\	S&S j5       r\	SS j5       rSrg)'rE   |   aL  Reactive descriptor.

Args:
    default: A default value or callable that returns a default.
    layout: Perform a layout on change.
    repaint: Perform a repaint on change.
    init: Call watchers on initialize (post mount).
    always_update: Call watchers even when the new value equals the old value.
    compute: Run compute methods when attribute is changed.
    recompose: Compose the widget again when the attribute changes.
    bindings: Refresh bindings when the reactive changes.
    toggle_class: An optional TCSS classname(s) to toggle based on the truthiness of the value.
zClassVar[dict[str, object]]
_reactivesFTN)layoutrepaintinitalways_updatecompute	recomposebindingstoggle_classc                   Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        S U l	        U   g r   )
_default_layout_repaint_init_always_update_run_compute
_recompose	_bindings_toggle_class_owner)
r"   defaultrX   rY   rZ   r[   r\   r]   r^   r_   s
             r#   r$   Reactive.__init__   s>      
+##!)26r&   c              #  >  #    S U R                   4v   SU R                  S4v   SU R                  S4v   SU R                  S4v   SU R                  S4v   SU R
                  S4v   SU R                  S4v   S	U R                  S4v   S
[        U S
S 5      S 4v   g 7f)NrX   FrY   TrZ   r[   r\   r]   r^   name)	ra   rb   rc   rd   re   rf   rg   rh   getattrr"   s    r#   __rich_repr__Reactive.__rich_repr__   s     DMM!!e++,,djj%''t22E99**D004??E11$..%//gdFD1477s   BBc                Z     [        US5      R                  5         g! [         a     gf = f)zIClear any watchers on a given object.

Args:
    obj: A reactive object.

__watchersN)ro   clearAttributeErrorclsr?   s     r#   _clear_watchersReactive._clear_watchers   s,    	C&,,. 		s    
**c                8    U R                   c   eU R                   $ )z2The owner (class) where the reactive was declared.)rj   rp   s    r#   ownerReactive.owner   s     {{&&&{{r&   c                   SnSU 3n[        X5      (       a  g[        XR                  S5      nUb  U R                  (       a  U" 5       nOBU R                  n[        U5      (       a$  [        U[        5      (       a  U" U5      OU" 5       OUn[        XU5        U R                  =nb*  UR                  " [        U5      /UR                  5       Q76   U R                  (       a  U R                  XU5        gg)zInitialized a reactive attribute on an object.

Args:
    obj: An object with reactive attributes.
    name: Name of attribute.
T
_reactive_N)hasattrro   compute_namerd   ra   callable
isinstancer8   setattrri   	set_classboolsplit_check_watchers)	r"   r?   rn   rH   internal_namecompute_methodrk   default_or_callabler_   s	            r#   _initialize_reactiveReactive._initialize_reactive   s      $$TF+3&& &7&7>%$**$&G"&-- /00 ""5zBB (,,. )  	G, ...L;MM$w-?,*<*<*>?::  G4 r&   c                p    SnUR                   R                  5        H  u  p4UR                  X5        M     g)zvSet defaults and call any watchers / computes for the first time.

Args:
    obj: An object with Reactive descriptors
TN)rW   itemsr   )rx   r?   rH   rn   reactives        r#   _initialize_objectReactive._initialize_object   s1      $!nn224ND))#4 5r&   c                p    [        US0 5      R                  5         [        US/ 5      R                  5         g)zdReset reactive structures on object (to avoid reference cycles).

Args:
    obj: A reactive object.
rt   
__computesN)ro   ru   rw   s     r#   _reset_objectReactive._reset_object   s.     	\2&,,.\2&,,.r&   c                J   Xl         SU 3nSU 3n[        X5      (       a  UOUn[        X5      (       a   [        US5      nUR                  U5        X l        SU 3U l        XPl        U R                  n[	        USU 3U5        g ! [         a    / n[	        USU5         N_f = f)Ncompute_	_compute_r   r   	_default_)
rj   r   ro   rv   r   appendrn   r   r   ra   )r"   r|   rn   public_computeprivate_computer   computesrk   s           r#   __set_name__Reactive.__set_name__   s    #D6*%dV,&u>>ON 	 5''7"5,7 OOD! 	)$0(--4&)73 " 7|X67s   B B"!B"c                    g r   r/   r"   r?   obj_types      r#   __get__Reactive.__get__  s    
 r&   c                    g r   r/   r   s      r#   r   r     s     &)r&   c                   SnUc  U $ [        US5      (       d#  [        SUR                  R                   S35      e[        XR                  =n5      (       d  U R                  XR                  5        [        XR                  5      (       aO  [        X5      n[        XR                  5      " 5       n[        XU5        U R                  XR                  U5        U$ [        X5      $ )NTidINode is missing data; Check you are calling super().__init__(...) in the z)() constructor, before getting reactives.)r   r1   	__class__r)   r   r   rn   r   ro   r   r   )r"   r?   r   rH   r   rQ   r!   s          r#   r   r   "  s    
  $;KsD!![\_\i\i\r\r[s  t]  ^  s-?-??M@@%%c9953))**3IC!2!235EC.  ii;L3..r&   c                r   Sn[        US5      (       d#  [        SUR                  R                   S35      e[	        U[
        5      (       a  UR                  nSnU R                  XR                  5        [        XR                  5      (       a  [        SU SU R                  < S35      eU R                  n[        X5      n[        USU 3S 5      n[        U5      (       a  U" U5      n[        US	U 3S 5      n[        U5      (       a  U" U5      nU R                  =n	b*  UR                  " [        U5      /U	R!                  5       Q76   U(       d  U R"                  (       d  Xb:w  a  [%        XR&                  U5        U R)                  XU5        U R*                  (       a  U R-                  U5        U R.                  (       a  UR1                  5         U R2                  (       d"  U R4                  (       d  U R6                  (       a0  UR9                  U R4                  U R2                  U R6                  S
9  g g g )NT_idr   z)() constructor, before setting reactives.z
Can't set .z9; reactive attributes with a compute method are read-only
_validate_	validate_)rY   rX   r]   )r   r1   r   r)   r   r   r!   r   rn   r   rv   ro   r   ri   r   r   r   re   r   r   r   rf   rF   rh   refresh_bindingsrb   rc   rg   refresh)
r"   r?   r!   alwaysrH   rn   current_valueprivate_validate_functionpublic_validate_functionr_   s
             r#   _setReactive._set<  s   #sE""[\_\i\i\r\r[s  t]  ^  eX&&KKEF!!#yy13))** SE499-/hi  yy*$+C:dV1Dd$K!-..-e4E#*3)D60BD#I ,--,U3E !...L;MM$u+=(:(:(<= T((M,BC++U3   M:  c"~~$$& ||t}} MM<<"oo   1@ -Cr&   c                *    SnU R                  X5        g )NT)r   )r"   r?   r!   rH   s       r#   __set__Reactive.__set__s  s    #		#r&   c                &   SnSU 3n[        X5      n[        USU 3S5      n[        U5      (       a  [        XX65        [        USU 3S5      n[        U5      (       a  [        XX65        [        US0 5      R                  U/ 5      n	U	(       ak  U	 V
Vs/ s H  u  pU
R                  (       a  M  X4PM     snn
U	SS& U	 H6  u  pU
R
                  " UR                  S   6    [        XX65        SSS5        M8     ggs  snn
f ! , (       d  f       MQ  = f)zCheck watchers, and call watch methods / computes

Args:
    obj: The reactable object.
    name: Attribute name.
    old_value: The old (previous) value of the attribute.
Tr   _watch_Nwatch_rt   )ro   r   rT   get_closingprevent_prevent_message_types_stack)rx   r?   rn   rQ   rH   r   r!   private_watch_functionpublic_watch_functionwatchers	reactabler<   s               r#   r   Reactive._check_watchersx  s     $$TF++!(v.>!E*++3	I 'vdV_d C)**3yH 3b155dB? ,4+3'I )) &%+3HQK
 (0#	&&(H(H(LM"9	I NM (0  NMs   C;/C; D
D	c           
        SnUR                   R                  5       UR                  -   Ha  n [        USU 35      n[        USU 3[        USU 3S5      5      nU" 5       n[        USU 3U5        Xe:w  d  MO  U R                  XU5        Mc     g! [         a%     [        USU 35      n No! [         a      M  f = ff = f)z7Invoke all computes.

Args:
    obj: Reactable object.
Tr   r   r   r   N)rW   keys	_computesro   rv   r   r   )rx   r?   _rich_traceback_guardr\   r   r   r!   s          r#   rF   Reactive._compute  s     !%~~**,s}}<G!(	.B!C $z'+WSIgY:OQU-VM #$EC:gY/7%##C-@ = " %,SIgY2G%HN% s)   B
B?B,,
B;6B?:B;;B?)re   rh   ra   rd   rb   rj   rg   rc   rf   ri   r   r   rn   )rk   DReactiveType | Callable[[], ReactiveType] | Initialize[ReactiveType]rX   r   rY   r   rZ   r   r[   r   r\   r   r]   r   r^   r   r_   
str | Noner'   r(   )r'   zrich.repr.Result)r?   	Reactabler'   r(   )r'   Type[MessageTarget])r?   r   rn   strr'   r(   )r?   objectr'   r(   )r|   r   rn   r   r'   r(   )r"   Reactive[ReactiveType]r?   r   r   type[ReactableType]r'   r   )r"   r   r?   r(   r   r   r'   r   )r"   r   r?   zReactable | Noner   r   r'   z%Reactive[ReactiveType] | ReactiveType)F)r?   r   r!   r   r   r   r'   r(   )r?   r   r!   r   r'   r(   )r?   r   rn   r   rQ   r   r'   r(   )r)   r*   r+   r,   r-   rW   __annotations__r$   rq   classmethodry   propertyr|   r   r   r   r   r   r   r   r   r   r   rF   r.   r/   r&   r#   rE   rE   |   s    /1J+0 ##'U 	
       ! 
2	8 	 	  
 5D 5 5 / /42 		(		 *	 		 
	 
	)(	)/3	)?R	)#	) 
	)/$// &/ 
/	/45n
 !J !JF A Ar&   rE   c                  f   ^  \ rS rSrSrSSSSSSSS.                 S	U 4S jjjrSrU =r$ )
r   i  a  Create a reactive attribute.

Args:
    default: A default value or callable that returns a default.
    layout: Perform a layout on change.
    repaint: Perform a repaint on change.
    init: Call watchers on initialize (post mount).
    always_update: Call watchers even when the new value equals the old value.
    recompose: Compose the widget again when the attribute changes.
    bindings: Refresh bindings when the reactive changes.
    toggle_class: An optional TCSS classname(s) to toggle based on the truthiness of the value.
FTNrX   rY   rZ   r[   r]   r^   r_   c               .   > [         T	U ]  UUUUUUUUS9  g )Nr   superr$   )
r"   rk   rX   rY   rZ   r[   r]   r^   r_   r   s
            r#   r$   reactive.__init__  s/     	'% 	 		
r&   r/   )rk   r   rX   r   rY   r   rZ   r   r[   r   r]   r   r^   r   r_   r   r'   r(   r)   r*   r+   r,   r-   r$   r.   __classcell__r   s   @r#   r   r     s    " ##'
U
 	

 
 
 
 
 
 !
 

 
r&   r   c                  R   ^  \ rS rSrSr    S           SU 4S jjjrSrU =r$ )vari  a  Create a reactive attribute (with no auto-refresh).

Args:
    default: A default value or callable that returns a default.
    init: Call watchers on initialize (post mount).
    always_update: Call watchers even when the new value equals the old value.
    bindings: Refresh bindings when the reactive changes.
    toggle_class: An optional TCSS classname(s) to toggle based on the truthiness of the value.
c           
     ,   > [         TU ]  USSUUUUS9  g )NF)rX   rY   rZ   r[   r^   r_   r   )r"   rk   rZ   r[   r^   r_   r   s         r#   r$   var.__init__  s,     	'% 	 	
r&   r/   )TFFN)rk   r   rZ   r   r[   r   r^   r   r_   r   r'   r(   r   r   s   @r#   r   r     sZ     ##'
U
 
 	

 
 !
 

 
r&   r   T)rZ   c                 ^ [        US5      (       d  [        US0 5        [        US5      nUR                  U/ 5      n[	        U4S jU 5       5      (       a  gU(       a  [        XS5      n[        UTXw5        UR                  U T45        g)a  Watch a reactive variable on an object.

Args:
    node: The node that created the watcher.
    obj: The parent object.
    attribute_name: The attribute to watch.
    callback: A callable to call when the attribute changes.
    init: True to call watcher initialization.
rt   c              3  2   >#    U  H  u  pTU:H  v   M     g 7fr   r/   ).0_callback_from_listr<   s      r#   	<genexpr>_watch.<locals>.<genexpr>  s     
T|.Ca8))|s   N)r   r   ro   
setdefaultanyrT   r   )noder?   attribute_namer<   rZ   r   watcher_listr   s      `    r#   _watchr     s~    " 3%%\2&sL)H&&~r:L

T|
TTTT:sHmCx()r&   )r?   r   rG   zAwaitable[object]r'   r(   )
rO   r   rP   r   rQ   r   r!   r   r'   r(   )r   r   r?   r   r   r   r<   r   rZ   r   r'   r(   )0r-   
__future__r   	functoolsr   inspectr   typingr   r   r   r	   r
   r   r   r   r   r   	rich.reprrichtextualr   textual._callbackr   textual._typesr   r   r   r   r   textual.domr   r   r   r   r   	Exceptionr1   r5   r8   rI   rT   reprautorE   r   r   r   r/   r&   r#   <module>r      s`  
 #       .  #I~&y9 *I *K= K"& ".P%  	
 
D uAw|$ uA uAp	#
x% #
L
(<
  
H *
*	* *  	* * 
*r&   