
    S`                        d dl Zd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dl	mZ d dlmZ d dlmZ d	d
lmZ d dlmZ d dlmZ  G d d      Zd dZd!dZ G d d      Zd Zd Zd Z G d d edd            Zd Zd Zd Z d Z!d Z"d Z#y)"    N)
namedtuple)cycle)
attrgetter)Empty)Queue)Thread)APIError   )colors)ShutdownException)split_bufferc                       e Zd ZddZd Zy)LogPresenterc                 .    || _         || _        || _        y N)prefix_width
color_funckeep_prefix)selfr   r   r   s       9/usr/lib/python3/dist-packages/compose/cli/log_printer.py__init__zLogPresenter.__init__   s    ($&    c                     dj                  |      }| j                  rL|j                  j                  | j                        }dj                  | j                  |dz               |z   }|S )Nz{line})linez	{prefix} z |)prefix)formatr   name_without_projectljustr   r   )r   	containerr   to_logr   s        r   presentzLogPresenter.present   sb    d+3399$:K:KLF ''tv}/M'NQWWFr   NT)__name__
__module____qualname__r   r!    r   r   r   r      s    '
r   r   c              #      K   t        |       }d }t        |r|gnt        j                               D ]  }t	        |||        yw)znReturn an iterable of functions.

    Each function can be used to format the logs output of a container.
    c                     | S r   r&   )texts    r   no_colorz&build_log_presenters.<locals>.no_color)   s    r   N)max_name_widthr   r   rainbowr   )service_names
monochromer   r   r*   r   s         r   build_log_presentersr/   "   sK     
 "-0L *XJ&..:JK B
<[AABs   AAc                 ,    t        d | D              |z   S )zCalculate the maximum width of container names so we can make the log
    prefixes line up like so:

    db_1  | Listening
    web_1 | Listening
    c              3   2   K   | ]  }t        |        y wr   )len).0names     r   	<genexpr>z!max_name_width.<locals>.<genexpr>7   s     3Ts4y3s   )max)r-   max_index_widths     r   r+   r+   0   s     3]33oEEr   c                   >    e Zd ZdZej
                  ddfdZd Zd Zy)
LogPrinterz:Print logs from many containers to a single output stream.FNc                 `    || _         || _        || _        || _        || _        |xs i | _        y r   )
containers
presentersevent_streamoutputcascade_stoplog_args)r   r;   r<   r=   r>   r?   r@   s          r   r   zLogPrinter.__init__=   s4     %$(( Br   c                    | j                   sy t               }|| j                  f}t        | j                   | j                  |      }t        || j                  | j                  |f       t        || j                        D ]l  }t        |       | j                  r;| j                   D cg c]  }|j                  |k(  s|j                    }}||v r|c S |s|s y \| j                  |       n y c c}w r   )r;   r   r@   build_thread_mapr<   start_producer_threadr=   consume_queuer?   remove_stopped_threadsr4   write)r   queuethread_args
thread_mapr   contmatching_containers          r   runzLogPrinter.runK   s    T]]*%dootT
OO	 	 "%):):; 	D":.  <@OO%aDtyy\`O`dii%a"%a--  K! JJt%	 &bs   (C0=C0c                     	 | j                   j                  |       | j                   j                          y # t        $ r< | j                   j                  |j                  dd      j	                                Y _w xY w)Nasciireplace)r>   rF   UnicodeEncodeErrorencodedecodeflush)r   r   s     r   rF   zLogPrinter.writel   sg    	HKKd# 	 " 	H
 KKdkk'9=DDFG	Hs   8 AA=<A=)	r#   r$   r%   __doc__sysstdoutr   rL   rF   r&   r   r   r9   r9   :   s$    D 

#'B	r   r9   c                     t        | j                               D ](  \  }}|j                         r| j                  |d        * y r   )listitemsis_alivepop)rI   container_idtailer_threads      r   rE   rE   x   s>    '+J,<,<,>'? /#m%%'NN<./r   c                 ^    t        t        | |||f      }d|_        |j                          |S N)targetargsT)r   tail_container_logsdaemonstart)r   	presenterrG   r@   tailers        r   build_threadrg   ~   s2    "E846F FM
LLNMr   c           
          t        | t        d            D ci c]#  }|j                  t        |t	        |      g| % c}S c c}w )Nr4   )key)sortedr   idrg   next)initial_containersr<   rH   r   s       r   rB   rB      sM       2
68JK
 	 	l9d:.>MMM  s   (Ac                   >    e Zd Zed        Zed        Zedd       Zy)	QueueItemc                      | |d d       S r   r&   clsitems     r   newzQueueItem.new       4t$$r   c                      | d d |      S r   r&   )rr   excs     r   	exceptionzQueueItem.exception   s    4s##r   Nc                      | |dd       S )NTr&   rq   s     r   stopzQueueItem.stop   ru   r   r   )r#   r$   r%   classmethodrt   rx   rz   r&   r   r   ro   ro      s<    % % $ $ % %r   ro   
_QueueItemzitem is_stop excc           	         	 t        | |      D ]6  }|j                  t        j                  |j	                  | |                   8 	 |j                  d      r<|j                  t        j                  |j                  t        |                          |j                  t        j                  | j                               y # t
        $ r.}|j                  t        j                  |             Y d }~y d }~ww xY w)Nfollow)build_log_generatorputro   rt   r!   	Exceptionrx   getr   wait_on_exitrz   r4   )r   re   rG   r@   rs   es         r   rb   rb      s    '	8< 	IDIIimmI$5$5i$FGH	I
 ||H		)--	 4 4\)5L MNO	IIinnY^^,-  		)%%a()s   AC 	C;$C66C;c                     | j                   ! | j                  ddddd|}t        |      S | j                   }t        |      S )NT)rV   stderrstreamr&   )
log_streamlogsr   )r   r@   r   s      r   r   r      sQ     #RtDRR  %%r   c                    	 | j                         }dj                  | j                  |      S # t        $ rS}dj                  | j                  |j                  j
                  |j                  j                  xs d      cY d }~S d }~ww xY w)Nz{} exited with code {}
z=Unexpected API error for {} (HTTP code {})
Response body:
{}
z[empty])waitr   r4   r	   responsestatus_coder)   )r   	exit_coder   s      r   r   r      sp    
NN$	)00KK 
QXXNNAJJ22JJOO(y
 	

s   +. 	B
AB?B
B
c                 T    t        t        |       }d|_        |j                          y r_   )r   watch_eventsrc   rd   )rH   producers     r   rC   rC      s    \<HHONNr   c                    t               }|D ]  }|d   dk(  r| j                  |d   d        |d   dk(  r)| j                  |d   d        |j                  |d          |d   dk7  rZ|d   | v r,| |d      j                         rx| j                  |d   d        |d   |v r6|d   }|j                  s	 |j                          |j                  |d          t        |d   t        |      g| | |d   <    y # t        $ r Y Aw xY w)Nactionrz   rk   dierd   r   )
setr[   addrZ   is_restartingattach_log_streamr	   removerg   rl   )rI   r=   r<   rH   crashed_containerseventr   s          r   r   r      s4     
?f$NN5;-?e#NN5;-""5;/?g%;*$%+&//1NN5;- ;,,k*I**//1 %%eDk2".+#
 #

5;9 
.   s   3C99	DDc              #      K   	 	 | j                  d      }|j
                  r|j
                  |j                  r|s;|j                   I# t        $ r d Y Yt        j                  $ r t	               w xY ww)z?Consume the queue by reading lines off of it and yielding them.g?)timeoutN)r   r   threaderrorr   rw   is_stoprs   )rG   r?   rs   s      r   rD   rD      sw     
	&99S9)D 88((N<<ii!   	J|| 	&#%%	&s'   A<A 6A<A9A<A99A<r"   )   )$_threadr   rU   collectionsr   	itertoolsr   operatorr   rG   r   r   	threadingr   docker.errorsr	    r   compose.cli.signalsr   compose.utilsr   r   r/   r+   r9   rE   rg   rB   ro   rb   r   r   rC   r   rD   r&   r   r   <module>r      s     
 "      "  1 & "BF; ;|/%
<);< %	. 
"
Jr   