
    ^hE                     <   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SK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  S SKJrJr  S SKJrJrJrJrJr  S SK J!r!  S S	K"J#r#  S S
K$J%r%  S SK&J'r'J(r(  S SK)J*r*J+r+  S SK,J-r-  S SK.J/r/  \	(       a  S SK0J1r1  Sr2SRg                  5       r4\5r6S r7SCS jr8S\9S\\9   4S jr:S\9S\\9   4S jr;S\9S\\9   4S jr<S\9S\\9   4S jr=S\9SS4S jr>S\9S\9SS4S jr?\/" S 5      r@\@R                  S!S"\BSS#9  \@R                  S$S%S&S'9  \@R                  S(S&S'9  \@R                  S)S"\9SS#9  \@R                  S*S&S'9  S\9S\\9   4S+ jrC\/" S,S-S.9rD\DR                  S/\9S09  \DR                  S1S&S'9  \DR                  S2\BSS39  S\9SS4S4 jrE\/" S5S6S.9rF\FR                  S2\BSS39  S\9SS4S7 jrGS\9SS4S8 jrHS\9SS4S9 jrIS\9SS4S: jrJS\9SS4S; jrKS<\9S\\\R                        4S= jrMS> rNS? rOS\9SS4S@ jrPS\9SS4SA jrQS\9SS4SB jrRg)D    N)TYPE_CHECKINGIterableOptionalSequenceTypecast)get_ipython)register_line_magic)	SymbolRef)register_annotations_directoryregister_annotations_file)ExecutionModeExecutionScheduleFlowDirection
HighlightsReactivityMode)cells)Symbol)create_dag_metadata)flowshell)SliceableMixinformat_slice)resolve_rval_symbols)MagicParser)NotebookFlowr   a$  Options:
[enable|disable]
    - Toggle dataflow capture. On by default.

[deps|show_deps|show_dependencies] <symbol>: 
    - This will print out the dependencies for given symbol.

[code|get_code] <symbol>: 
    - This will print the backward slice for the given symbol.

[waiting|show_waiting]: 
    - This will print out all the global variables that are waiting for newer dependencies. 

slice <cell_num>:
    - This will print the code necessary to reconstruct <cell_num> using a dynamic
      program slicing algorithm.
      
tag <tag>:
    - This will tag the executing cell with the given tag.
      
show_tags:
    - This will display the current tags of the executing cell.
    
register_annotations <directory_or_file>:
    - This will register the annotations in the given directory or file.
c                  :    [        U S[        R                  0UD6  g )Nfile)print_sysstderr)argskwargss     M/home/james-whalen/.local/lib/python3.13/site-packages/ipyflow/line_magics.pywarnr%   J   s    
D,szz,V,    c                 .  ^ ^^ [        5       R                  5        VVs/ s H$  u  p[        R                  " U5      (       d  M"  UPM&     snnmU U4S jmS[        4U4S jjnS[        SS 4S jn[        U5        [        Ul        [        U5      $ s  snnf )Nc                 >  > U R                  SS5      n U S;   a  [        U 5      $ U S;   a  [        U5      $ U S;   a  [        U5      $ U S;   a  [	        U5      $ U S:X  a  [        U5      $ U S;   a  [        X5      $ U S	;   a  [        R                  " [        5       S
S9$ U S;   a  [        U5      $ U S:X  a  [        U5      $ U S:X  a  [        U5      $ U S;   a  [        U5      $ U S;   a  [        U5      $ U S;   a  [        U5      $ U S:X  a  [!        U5      $ U S;   a  [#        U5      $ U S;   a  [%        U5      $ U S:X  a  TR'                  5       Tl        g U R+                  S5      (       a&  U R-                  S5      (       + TR.                  l        g U R+                  S5      (       a&  U R-                  S5      (       + TR.                  l        g U S:X  aB  UR+                  S5      nUR+                  S5      nU(       d  U(       a  UTR.                  l        g U S:X  a  STR.                  l        g U R-                  S5      (       a  [9        U5      $ U S:X  a  TR;                  5         g U S :X  a  TR=                  5         g U T;   a  [?        S!U  S"35        g [?        [@        5        g )#N-_)enabledisableonoff)deps	show_depsshow_dependencyshow_dependencies)codeget_code)waitingshow_waitingtrace_messages)hlsnohls	highlight
highlights)dagmake_dagcell_dagmake_cell_dag   )indentslice
make_slicegather_slicetag	show_tags)mode	exec_mode)scheduleexec_scheduleexecution_schedule)	directionflow_directionorder
flow_order	semanticsflow_semantics
reactivity)registerregister_tracer)
deregisterderegister_tracerclearwarn_ooonolint_ooosyntax_transforms)enabledr-   )disabledr.   syntax_transforms_onlyTregister_annotationtoggle_reactivity bump_min_forced_reactive_counterzWe have a magic for z , but have not yet registered it)!replacetoggle_dataflowr0   r4   r6   r7   set_highlightsjsondumpsr   rD   rF   rG   set_exec_modeset_exec_scheduleset_flow_directionset_reactivityrU   rW   cell_countermin_timestampendswith
startswithmut_settingswarn_out_of_order_usageslint_out_of_order_usagessyntax_transforms_enabledr_   register_annotationsra   rb   r%   _USAGE)cmdlineis_onis_offflow_line_magic_namess       r$   _handle make_line_magic.<locals>._handleS   s   kk#s#44"3''QQT?"((D>!//%%$$!$''??!#,,DD::13A>>;;d##E\t9KT?")) &&GG$T** 
 
 &d++L !$''33"4((77$T**G^"'"4"4"6E\\*%%>AnnT>R:RE7\\*%%>AnnT>R:RE7''MM"34E]]#67F?D""<,,8<E5^^122'--''##%66224$$&se+KL Lr&   rw   c                   >  U R                  SS5      u  pUS;   a  [        R                  " SSU 5      n  U R                  SS5      u  pU R	                  5       n Ub  UR	                  5       nT" X5      nUc  g Uc  [        U5        g [        US5       nUR                  U5        S S S 5        g ! [         a    U Sp Nf = f! [         a    U S p  Nf = f! , (       d  f       g = f)	N    rB   z--tag +<class '(\w+)'>z	--tag $\1 >w)splitresub
ValueErrorstripr   openwrite)rw   rv   fnameoutstrfr|   s        r$   _flow_magic$make_line_magic.<locals>._flow_magic   s    	!

3*IC==vv7tL	%**S!,KD zz|KKME#>=6NeS!Q "!#  	!b	!  	%%	% "!s.   2B/ C C/B?>B?CC
C#returnc                 >    [        5       R                  SSU  35        g )Nr   zslice --noheader )r	   run_line_magic)rw   s    r$   	histslice"make_line_magic.<locals>.histslice   s    $$V/@-GHr&   )globalsitemsinspect
isfunctionstrr
   _FLOW_LINE_MAGIC__name__)rz   namevalr   r   r|   r{   s   `    @@r$   make_line_magicr   N   s    %ioo//73E3Ec3J/JX #  6I I I 	" ,K{++es   !BBrw   r   c                     SnU R                  5       n [        5       nU S;   a#  SUR                  l        SUR                  l        gU S;   a  SUR                  l        g[        U5        g )NzUsage: %flow [enable|disable])r+   r-   TFzdataflow capture enabled)r,   r.   zdataflow capture disabled)r   r   rp   dataflow_enabledr_   r%   )rw   usagerz   s      r$   rd   rd      se    +E::<DFE.2+491)	#	#.3+*Ur&   
symbol_strc                 $   Sn[        U 5      S:X  a  [        U5        g  [        [        R                  [        R
                  " U 5      R                  S   5      R                  n[        U[        R                  [        R                  [        R                  [        R                  45      (       a  [        U5        g [        R                   " U 5      nUc  [        SU R                  5        35        g UR"                   Vs1 s H  oDR$                  (       d  M  UiM     nnUR&                   Vs1 s H  ofR$                  (       d  M  UiM     nnSUR(                   SUR*                  R,                   3nUR.                  R0                  (       a  USUR.                  R,                   3-  nSR3                  UR4                  UU=(       d    S	U=(       d    S	5      $ ! [         a    [        SU R                  5        35         g f = fs  snf s  snf )
Nz.Usage: %flow show_[deps|dependencies] <symbol>r   $Could not parse symbols from string z#Could not find symbol metadata for zdefined cell: z; last updated cell: z; required: z7Symbol {} ({}) is dependent on {} and is a parent of {}nothing)lenr%   r   astExprparsebodyvalueSyntaxErrorr   
isinstanceDictListSetTupler   resolveparentsis_user_accessiblechildrendefined_cell_num	timestampcell_numrequired_timestampis_initializedformatfull_namespace_path)	r   r   nodesymparr   childr   sym_extra_infos	            r$   r0   r0      s   <E
:!UCHHcii
388;<BB $388SWWcii@AAU


J
'C
{1*2B2B2D1EF	
 !kkDks-C-CskGD#&<<L<%3K3K<HL%c&:&:%;;PQTQ^Q^QgQgPhiN
,,L)?)?)H)H(IJJDKK9I	 #  3J4D4D4F3GHI ELs*   AG HH/HH&HHc                 p   Sn[        U 5      S:X  a  [        U5        g  [        [        R                  [        R
                  " U 5      R                  S   5      R                  n[        U[        R                  [        R                  [        R                  [        R                  45      (       a  [        U5        g [        R                   " U 5      nUc  [        SU R                  5        35        g [#        UR%                  5       5      $ ! [         a    [        SU R                  5        35         g f = f)Nz Usage: %flow [get_]code <symbol>r   r   z*Could not find unique symbol metadata for )r   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   )r   r   r   r   s       r$   r4   r4      s    .E
:!UCHHcii
388;<BB $388SWWcii@AAU


J
'C
{89I9I9K8LM	
 sxxz?  3J4D4D4F3GHIs   AD &D54D5line_c                    SnU R                  5       n[        U5      S:X  d	  US   S:X  a$  [        5       R                  R	                  5       /nO8US   S:X  a#  [        5       R
                  R                  5       nO[        U5        g [        5       nU HC  nU H:  nUR                  (       d  M  UR                  (       a  M)  UR                  U5        M<     ME     U(       d  gSU-  $ )Nz&Usage: %flow show_waiting [global|all]r   globalallz*No symbol waiting on dependencies for now!z%Symbol(s) waiting on dependencies: %s)r   r   r   global_scopeall_symbols_this_indentationaliasesvaluesr%   set
is_waitingis_anonymousadd)r   r   rw   sym_sets
waiter_setsym_setr   s          r$   r6   r6   
  s    4E;;=D
4yA~aH,F<<>0
 
aE	6>>((*UJC~~~c&6&6&6s#   ;6CCr&   c                 J   U R                  5       nSn[        U5      S:w  a  [        U5        g US   R                  5       nUS:X  d  UR	                  S5      (       a  S[        5       l        g US:X  d  UR	                  S5      (       a  S	[        5       l        g [        U5        g )
Nz,Usage: %flow trace_messages [enable|disable]r   r   r-   r+   Tr.   r,   F)r   r   r%   lowerro   r   trace_messages_enabled)r   rw   r   settings       r$   r7   r7   !  s    ;;=D:E
4yA~U1gmmoG$',,X66(,%	E	W//	::(-%Ur&   rv   restc                    SnUR                  5       R                  5       nU S:X  d  U S:w  a  US:X  d  US:X  d  UR                  S5      (       a(  [        R                  [        5       R                  l        g US:X  d  UR                  S5      (       a(  [        R                  [        5       R                  l        g U[         Vs1 s H  o3R                  iM     sn;   a#  [        U5      [        5       R                  l        g [        U5        g U S:X  a(  [        R                  [        5       R                  l        g g s  snf )	Nz#Usage: %flow [hls [strategy]|nohls]r8   r9   r   r-   r+   r.   r,   )r   r   ro   r   EXECUTEDr   rp   r;   NONEr   r%   )rv   r   r   members       r$   re   re   0  s    1E::<D
e|sg~2:)B)B-7-@-@DF*U]dooi88-7__DF*<vll<<-7-=DF*K	)3& 
	 =s   D=rC   r   ?)nargstypedefaultz--stmtz--stmts
store_true)actionz	--blackenz--tagz
--noheaderc           	         [         R                  [        R                  " U 5      5      nUR                  (       a  g UR
                  nS nUR                  nUc  Uc  [        5       R                  5       S-
  nUb  [        5       R                  U5      1nOhUR
                  b[  UR                  S5      (       a,  USS  n[        5       R                  5       R                  U5        [        5       R                  U5      nUc  [        S5        g [        U5      S:X  a  Ub  [        SU 35        g UR                   (       a  [        5       R#                  U5      nO[        5       R%                  U5      n['        [)        [        5       R+                  U5      UR                   =(       d    UR,                  [&        UR.                  (       + S95      $ )Nr   $zCell(s) have not yet been runr   zNo cell(s) for tag: )blackenformat_typeinclude_cell_headers)_SLICE_PARSER
parse_argsshlexr   helprF   r   r   exec_counterat_timestampro   current_cellmark_as_reactive_for_tagfrom_tagr%   r   stmtcompute_multi_slice_stmtsmake_multi_slicer   r   make_cell_dict_from_closurer   noheader)rw   r"   rF   slice_cellsr   closures         r$   rD   rD   H  sv   ##EKK$56Dyy
((CK}}H;w++-1Hw++H56		>>#ab'CG  ";;C@g&&s+,-$ # 
[	Q	3?#C5)*   99050Q0Q1G g..{;G33G<		1T\\)-%6	
 	
r&   rF   z8Usage: %flow tag <tag_name> [--remove] [--cell cell_num])r   tag_name)r   z--removez--cell)r   r   c                 
   [         R                  [        R                  " U 5      5      nUR                  (       a  g UR
                  nUR                  c  [        5       R                  5       nO#[        5       R                  UR                  5      n[        UR                  5      nUR                  (       a  [        XB1-
  5      Ul        g [        XB1-  5      Ul        [        5       R                  U   R                  U5        g N)_TAG_PARSERr   r   r   r   r   cellr   r   
at_counterr   tagsremovetuple_cells_by_tagr   )rw   r"   rF   r   	cell_tagss        r$   rF   rF   w  s    !!%++d"34Dyy
--Cyyw##%w!!$)),DIII{{)e+,	  )e+,	c"&&t,r&   rG   z(Usage: %flow show_tags [--cell cell_num]c                 8   [         R                  [        R                  " U 5      5      nUR                  (       a  g UR
                  c  [        5       R                  5       nO#[        5       R                  UR
                  5      n[        SUR                  5        g )NzCell has tags:)_SHOW_TAGS_PARSERr   r   r   r   r   r   r   r   r   r   )rw   r"   r   s      r$   rG   rG     sg    ''D(9:Dyyyyw##%w!!$)),
TYY'r&   c                    S[         R                   S[         R                   S3n [        U R                  5       5      n[        5       nX#R                  l        U[         R                  :X  a0  [        5       R                  5        H  nUR                  S5        M     UR                  5       S-   Ul        UR                  R                  nUb   UR!                  SUR"                  SS.5        g g ! [         a    [        U5         g f = f)	NzUsage: %flow mode [|]Fr   rh   T)r   rI   success)r   NORMALREACTIVEr   r   r%   r   rp   rI   r   current_cells_for_each_id	set_readyrl   _min_new_ready_cell_countercomm_manager_commsendr   )r   r   rI   rz   r   comms         r$   rh   rh     s    !-"6"6!7q9O9O8PPQRE!%++-0	 FE#, M***G557DNN5! 8(-(:(:(<q(@E%##D		$9??tT	
   Us   C0 0DDc                 x   SSR                  S [         5       5       S3nU R                  S5      (       a  [        R                  nOZU R                  S5      (       a  [        R                  nO3U R                  S5      (       a  [        R
                  nO[        U5        g U[        5       R                  l	        g )NzUsage: %flow schedule [r  c              3   8   #    U  H  oR                   v   M     g 7fr   )r   ).0rJ   s     r$   	<genexpr>$set_exec_schedule.<locals>.<genexpr>  s     .`N_(~~N_s   r  livenessr<   hybrid)
joinr   ro   LIVENESS_BASED	DAG_BASEDHYBRID_DAG_LIVENESS_BASEDr%   r   rp   rK   )r   r   rJ   s      r$   ri   ri     s    %chh.`N_.`&`%aabcE
##$33			%	 	 $..			(	#	#$>>U(0DF%r&   c                    U R                  5       R                  5       n S[        R                   S[        R                   S3nU R                  S5      (       d  U S;   a  [        R                  nO9U R                  S5      (       d  U S;   a  [        R                  nO[        U5        g U[        5       R                  l	        g )NzUsage: %flow direction [r  r  any)	unorderedbothin)orderedlinear)
r   r   r   	ANY_ORDERIN_ORDERro   r%   r   rp   rP   )r   r   rP   s      r$   rj   rj     s    KKM!E
"=#:#:";1]=S=S<TTUV 
 %+@"@",,
			$		5,A#A"++
U%/DF"r&   c                     U R                  5       R                  5       n S[        R                   S[        R                   S3nU S;   a  [        U 5      nO[        U5        g U[        5       R                  l        g )NzUsage: %flow reactivity [r  r  )batchincremental)	r   r   r   BATCHINCREMENTALr%   r   rp   reactivity_mode)r   r   rS   s      r$   rk   rk     sk    KKM!E
#N$8$8#9>;U;U:VVWX 
 ((#E*
U*4DF'r&   r   c                 $   SU ;   a   [         R                  " U 5      $ [        5       R                  S   R                  U S 5      nUb  U$ [        U SS9n[        U5      S:X  a  [        [        U5      5      R                  $ g ! [         a     g f = f)N.user_globalF)should_update_usage_infor   )pycresolve_tracerImportErrorr	   ns_tablegetr   r   nextiterobj)r   
tracer_clssymss      r$   _resolve_tracer_classr8    s    
d{	%%d++ !]++M:>>tTJ
!#D5It9>T
#'''  		s   B 
BBc                     S[        5       l        U  H7  nUR                  5          [        5       R                  R	                  U5        M9     g ! [
         a     MI  f = f)NT)r   tracer_cleanup_pendingclear_instanceregistered_tracersr   r   )tracerstracers     r$   _deregister_tracersr?    sQ    %)EG"	G&&--f5   		s   #A
AAc                     [        U /[        5       R                   Vs/ s H!  nUR                  U R                  :X  d  M  UPM#     sn-   5        g s  snf r   )r?  r   r<  r   )r6  r>  s     r$   _deregister_tracers_forrA    sP    	  '44
4*"5"55 4
	

s   A
 A
c                     U R                  5       n Sn[        U 5      nUc  [        U5        g [        U5        UR	                  5         [        5       R                  R                  SU5        g )Nz:Usage: %flow register_tracer <module.path.to.tracer_class>r   )r   r8  r%   rA  instancer   r<  insertr   r   r6  s      r$   rU   rU     sX    KKMEHE&u-JUJ'	G%%a4r&   c                     U R                  5       n SnU R                  5       S:X  a'  [        [        [	        5       R
                  5      5        g [        U 5      nUc  [        U5        g [        U5        g )NzBUsage: %flow deregister_tracer [<module.path.to.tracer_class>|all]r   )	r   r   r?  listr   r<  r8  r%   rA  rE  s      r$   rW   rW     sW    KKMEPE{{}D!;!;<=*51
K
+r&   c                    U R                  5       n Sn[        R                  R                  U 5      (       a  [	        U 5      nO<[        R                  R                  U 5      (       a  [        U 5      nO[        U5        g [        SU5        g )Nz5Usage: %flow register_annotations <directory_or_file>z#Registered annotations for modules:)	r   ospathisdirr   isfiler   r%   r   )r   r   moduless      r$   rt   rt     sa    KKMECE	ww}}U07			+E2U
0':r&   )rz   r   )Sr   r   rf   os.pathrI  r   r   r    typingr   r   r   r   r   r   pyccolor.  IPythonr	   IPython.core.magicr
   ipyflow.analysis.symbol_refr   ipyflow.annotations.compilerr   r   ipyflow.configr   r   r   r   r   ipyflow.data_model.cellr   ipyflow.data_model.symbolr   ipyflow.experimental.dagr   ipyflow.singletonsr   r   ipyflow.slicing.mixinr   r   ipyflow.tracing.symbol_resolverr   ipyflow.utils.magic_parserr   ipyflow.flowr   r   r   ru   printr   r%   r   r   rd   r0   r4   r6   r7   re   r   add_argumentintrD   r   rF   r  rG   rh   ri   rj   rk   
BaseTracerr8  r?  rA  rU   rW   rt    r&   r$   <module>rc     s   
    	  
 J J   2 1  * , 8 * > @ 2)  
2 
EG3 8 
-s,l# (3-  # (3- @ # ,D D D.# $ 9 93 94 9  G$   :SsD  I   8Y|  D   ;|  <   7#C  F   <  =$S $Xc] $N 	K   #  .   L  9   T  :c d $  A    xc4  @	C 	D 	
 
 
(1S 1T 10c 0d 0
5# 
5$ 
5 cnn1E(F "	53 	54 	5
,S 
,T 
,
; 
; 
;r&   