
    	D,j                         d Z ddlZddlZddlZddlmZ  G d d          Z G d d          Zd Ze	d	k    r e             dS dS )
z
Thread-based, killable spinner utility.

Use it like:

    from aider.waiting import WaitingSpinner

    spinner = WaitingSpinner("Waiting for LLM")
    spinner.start()
    ...  # long task
    spinner.stop()
    N)Consolec                   Z    e Zd ZdZdZddedefdZdefdZ	defd	Z
ddedd
fdZddZd
S )Spinnerz
    Minimal spinner that scans a single marker back and forth across a line.

    The animation is pre-rendered into a list of frames.  If the terminal
    cannot display unicode the frames are converted to plain ASCII.
    r      textwidthc                 p   || _         t          j                    | _        d| _        d| _        t
          j                                        | _        t                      | _
        g d}d| _        d| j        }}|                                 rJt                              ||          fd|D             }||                    d                   | _        n	|}d| _        || _        t$          j        | _        t+          |d                   d	z
  | _        t+          |d                   | _        d| _        d S )
N        F)z
#=        z
=#        z
 =#       z
  =#      z
   =#     z
    =#    z
     =#   z
      =#  z
       =# z
        =#z
        #=z
       #= z
      #=  z
     #=   z
    #=    z
   #=     z
  #=      z
 #=       u   ░█z=#c                 :    g | ]}|                               S  )	translate).0ftranslation_tables     \/home/rurouni/.local/share/uv/tools/aider-chat/lib/python3.11/site-packages/aider/waiting.py
<listcomp>z$Spinner.__init__.<locals>.<listcomp>F   s&    KKKakk"344KKK    #r      )r   time
start_timelast_updatevisiblesysstdoutisattyis_ttyr   consoleunicode_palette_supports_unicodestr	maketransfind	scan_charframesr   last_frame_idx	frame_idxlenr   animation_lenlast_display_len)selfr   r   ascii_frames
xlate_fromxlate_tor%   r   s          @r   __init__zSpinner.__init__!   s   	)++j''))yy
 
 
*  ( $d&:H
 !!## 	! #j( C CKKKKlKKKF%jooc&:&:;DNN!F DN  /^^a'
 ^^ !r   returnc                 x   | j         sdS 	 | j        }|dt          | j                  z  z  }|dt          | j                  z  z  }|dt          | j                  z  z  }t          j                            |           t          j                                         dS # t          $ r Y dS t          $ r Y dS w xY w)NF T)	r   r   r(   r   r   writeflushUnicodeEncodeError	Exception)r+   outs     r   r    zSpinner._supports_unicodeS   s    { 	5	&C4#d23333C3T12222C4#d23333CJS!!!J4! 	 	 	55 	 	 	55	s   BB 
B9,	B98B9c                     | j         | j                 }| j        dz   t          | j                   z  | _        | j        t          _        |S )N   )r%   r'   r(   r   r&   )r+   frames     r   _next_framezSpinner._next_framec   s<    DN+.1,DK0@0@@!%r   Nc                 P   ||| _         | j        sd S t          j                    }| j        s=|| j        z
  dk    r/d| _        d| _        | j        r| j                            d           | j        r|| j        z
  dk     rd S || _        |                                 }| j        j	        dz
  }|dk     rd}d| j          }| | }t          |          |k    r
|d |         }t          |          }dt          d| j        |z
            z  }t          j                            d	| |            || _        |                    | j                  }	|t          |          z   }
|
|	z
  }t          j                            d
|z             t          j                                         d S )Ng      ?Tr
   Fg?r   r   r3   r2   )r   r   r   r   r   r   r   show_cursorr<   r   r(   maxr*   r   r   r4   r#   r$   r5   )r+   r   now	frame_strmax_spinner_widthcurrent_text_payloadline_to_displaylen_line_to_displaypadding_to_clearscan_char_abs_postotal_chars_written_on_linenum_backspacess               r   stepzSpinner.stepi   s   DI{ 	Fikk| 	0do 5 < <DL"D{ 0((///| 	sT%55;;F$$&&	 !L.2q   !.49&>(<>> "333-.@/@.@AO!/22 Q(=@S(S!T!TT 	
AoA/?AABBB 3 &NN4>:: ':C@P<Q<Q&Q# 57HH
.///
r   c                     | j         rn| j        rg| j        }t          j                            dd|z  z   dz              t          j                                         | j                            d           d| _         d S )Nr>   r3   TF)	r   r   r*   r   r   r4   r5   r   r?   )r+   	clear_lens     r   endzSpinner.end   sv    < 	+DK 	+-IJTC)O3d:;;;JL$$T***r   )r   N)r0   N)__name__
__module____qualname____doc__r&   r!   intr/   boolr    r<   rK   rN   r   r   r   r   r      s          N0" 0"S 0" 0" 0" 0" 0"d4     S    7 7 7 7 7 7 7r     r   r   c                   B    e Zd ZdZddedefdZd Zd Zd	 Z	d
 Z
d ZdS )WaitingSpinnerz6Background spinner that can be started/stopped safely.Waiting for LLM333333?r   delayc                     t          |          | _        || _        t          j                    | _        t          j        | j        d          | _        d S )NT)targetdaemon)	r   spinnerrZ   	threadingEvent_stop_eventThread_spin_thread)r+   r   rZ   s      r   r/   zWaitingSpinner.__init__   sC    t}}
$?,, 'tz$GGGr   c                     | j                                         sK| j                                         t	          j        | j                   | j                                         K| j                                         d S rO   )ra   is_setr^   rK   r   sleeprZ   rN   r+   s    r   rc   zWaitingSpinner._spin   st    "))++ 	#LJtz""" "))++ 	# 	r   c                 n    | j                                         s| j                                          dS dS )z)Start the spinner in a background thread.N)rd   is_alivestartrh   s    r   rk   zWaitingSpinner.start   s<    |$$&& 	!L     	! 	!r   c                     | j                                          | j                                        r | j                            | j                   | j                                         dS )zDRequest the spinner to stop and wait briefly for the thread to exit.)timeoutN)ra   setrd   rj   joinrZ   r^   rN   rh   s    r   stopzWaitingSpinner.stop   sb    <  "" 	2Ldj111r   c                 .    |                                   | S rO   )rk   rh   s    r   	__enter__zWaitingSpinner.__enter__   s    

r   c                 .    |                                   d S rO   )rp   )r+   exc_typeexc_valexc_tbs       r   __exit__zWaitingSpinner.__exit__   s    		r   N)rX   rY   )rP   rQ   rR   rS   r!   floatr/   rc   rk   rp   rr   rw   r   r   r   rW   rW      s        @@H HS HU H H H H  ! ! !
        r   rW   c                  R   t          d          } 	 t          d          D ]*}t          j        d           |                                  +t          d           n# t          $ r t          d           Y nw xY w|                                  d S # |                                  w xY w)NzRunning spinner...d   rY   zSuccess!z
Interrupted by user.)r   ranger   rg   rK   printKeyboardInterruptrN   )r^   _s     r   mainr      s    *++Gs 	 	AJtLLNNNNj ( ( (&'''''( 	s*   A	A B A74B 6A77B B&__main__)
rS   r   r_   r   rich.consoler   r   rW   r   rP   r   r   r   <module>r      s     


                 Q Q Q Q Q Q Q Qh! ! ! ! ! ! ! !H
 
 
 zDFFFFF r   