
    O&i2                        d Z ddlZddlZddlZddlZddlZddlZddlmZ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mZ ddlmZmZ ddlmZ ddlZddlZej        dk    r,ej         dk    r!ddl!Z! e!j"         e!j#                                ej$        d          Z%dZ&d Z'ddZ( G d dej)                  Z* G d de          Z+ G d d          Z,dS )z
    livereload.server
    ~~~~~~~~~~~~~~~~~

    WSGI app server for livereload.

    :copyright: (c) 2013 - 2015 by Hsiaoming Yang
    :license: BSD, see LICENSE for more details.
    N)PopenPIPE)WSGIContainer)IOLoop)add_reload_hook)web)escape)httputil)LogFormatter   )LiveReloadHandlerLiveReloadJSHandler)ForceReloadHandlerStaticFileHandler)get_watcher_class)      win32
livereloads   </head>c                       fd}|S )z1Helper Function to Add HTTP headers to the serverc                 L     | g|R i | |                                 d S N)
set_header)selfargskwargsfnnamevalues      ^/home/geonatureadmin/si_en_reseau/tutos/venv/lib/python3.11/site-packages/livereload/server.pyset_default_headersz'set_header.<locals>.set_default_headers-   s=    
4!$!!!&!!!e$$$$$     )r   r   r   r!   s   ``` r    r   r   +   s0    % % % % % % % r"   wFc                 L    st           j        nTt           j                                      }|r3t           j                            |          st          j        |           t           t          t          f          sst          j
                     fd}|S )aA  Execute a shell command.

    You can add a shell command::

        server.watch(
            'style.less', shell('lessc style.less', output='style.css')
        )

    :param cmd: a shell command, string or list
    :param output: output stdout to the given file
    :param mode: only works with output, mode ``w`` means write,
                 mode ``a`` means append
    :param cwd: set working directory before command is executed.
    :param shell: if true, on Unix the executable argument specifies a
                  replacement shell for the default ``/bin/sh``.
    c                  \   	 t          t          t          t          	          } ni# t          $ r\}t                              |           |j        t
          j        k    r!t                              dd                    |cY d }~S d }~ww xY w|                                 \  }}|                                }|                                }|rt                              |           |S t                    5 }|
                    |           d d d            d S # 1 swxY w Y   d S )N)stdinstdoutstderrcwdshellzmaybe you haven't installed %sr   )r   r   OSErrorloggererrorerrnoENOENTcommunicatedecodeopenwrite)
per(   r)   fcmdr*   modeoutputr+   s
        r    	run_shellzshell.<locals>.run_shellN   s\   	cd4S!# # #AA 	 	 	LLOOOw%,&&=s1vFFFHHHHHH		
  	LL   M&$ 	1GGFOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s-   $( 
BAB	B	B>D!!D%(D%)osdevnullpathdirnameisdirmakedirs
isinstancelisttupleshlexsplit)r8   r:   r9   r*   r+   folderr;   s   `````  r    r+   r+   3   s    "   (( 	 "'--// 	 KcD%=)) % k#        & r"   c                   $     e Zd Z fdZd Z xZS )LiveScriptInjectorc                 J    t                                          |           d S r   )super__init__)r   request	__class__s     r    rL   zLiveScriptInjector.__init__e   s!    !!!!!r"   c                 $   d|                     dd          v }|rrt          |v ri|                    t          | j        t          z   d          }d|v r<t	          |d                   t          | j                  z   }t          |          |d<   |||fS )NhtmlContent-Type r   Content-Length)getHEAD_ENDreplacescriptintlenstr)r   status_codeheaderschunk	finishingis_htmllengths          r    transform_first_chunkz(LiveScriptInjector.transform_first_chunkh   s    GKK;;; 	8x5((MM(DK(,BAFFE7**W%5677#dk:J:JJ,/KK()GU**r"   )__name__
__module____qualname__rL   ra   __classcell__)rN   s   @r    rI   rI   d   sG        " " " " "+ + + + + + +r"   rI   c                       e Zd ZddZd ZdS )LiveScriptContainerrR   c                 "    || _         || _        d S r   )wsgi_apprW   )r   ri   rW   s      r    rL   zLiveScriptContainer.__init__s   s     r"   c                 "   i g dfd	}|                      t          | j                                       |          |          }	                     |           d                              }t          |d          r|                                 n*# t          |d          r|                                 w w xY wst          d          d                             dd          \  }}t          |          }d         }d	 |D             }t          j        |          }t          |v r(|                    t          | j        t          z             }|d
k    rNd|vr|                    d           d|vr1|                    dt!          t#          |                    f           d|vr|                    d           t%          j        d||          }	t%          j                    }
|D ]O\  }}|                                dk    rt!          t#          |                    }|
                    ||           P|j                            |	|
|           |j                                         |                     ||           d S )Nc                 &    | d<   |d<   j         S )Nstatusr\   )append)rl   response_headersexc_infodataresponses      r    start_responsez4LiveScriptContainer.__call__.<locals>.start_response{   s    #DN.DO?"r"   r"   closez$WSGI app did not call start_responserl    r   r\   c                 <    h | ]\  }}|                                 S r#   )lower).0kvs      r    	<setcomp>z/LiveScriptContainer.__call__.<locals>.<setcomp>   s$    666FQaggii666r"   i0  zcontent-type)rQ   z'application/octet-stream; charset=UTF-8zcontent-lengthrS   server)Server
LiveServerzHTTP/1.1)r]   r   )ri   r   environextendjoinhasattrrs   	ExceptionrF   rX   r	   utf8rU   rV   rW   rm   rZ   rY   r
   ResponseStartLineHTTPHeadersrv   add
connectionwrite_headersfinish_log)r   rM   rr   app_responsebodyr[   reasonr\   
header_set
start_line
header_objkeyr   rp   rq   s                @@r    __call__zLiveScriptContainer.__call__w   s   	# 	# 	# 	# 	# 	# 	#
 }}$-((0099>K K	%OOL)))88H%%D|W-- %""$$$ |W-- %""$$$$% 	DBCCC"8n223::V+&&y/66g666
{4  t<<$+*@AAD#Z//       z11 0#c$ii..ABBB:%%NN3444/V
 

 )++
! 	' 	'JCyy{{...CIINN3&&&&((Zt(LLL!!###		+w'''''s   
*B 'C N)rR   )rb   rc   rd   rL   r   r#   r"   r    rg   rg   r   s7           3( 3( 3( 3( 3(r"   rg   c                   N    e Zd ZdZddZd ZddZ	 	 ddZd Z	 	 	 ddZ	d Z
dS )r|   a  Livereload server interface.

    Initialize a server and watch file changes::

        server = Server(wsgi_app)
        server.serve()

    :param app: a WSGI application instance
    :param watcher: A Watcher instance, you don't have to initialize
                    it by yourself. Under Linux, you will want to install
                    pyinotify and use INotifyWatcher() to avoid wasted
                    CPU usage.
    Nc                 |    d | _         || _        |st                      } |            }|| _        t          | _        d S r   )rootappr   watcherr   SFH)r   r   r   watcher_clss       r    rL   zServer.__init__   s@    	 	$+--K!kmmG$r"   c                 h    t          t          j        ||          t          _        t          | _        dS )a  Add or override HTTP headers at the at the beginning of the 
           request.

        Once you have initialized a server, you can add one or more 
        headers before starting the server::

            server.setHeader('Access-Control-Allow-Origin', '*')
            server.setHeader('Access-Control-Allow-Methods', '*')
            server.serve()

        :param name: The name of the header field to be defined.
        :param value: The value of the header field to be defined.
        N)r   r   r!   r   )r   r   r   s      r    	setHeaderzServer.setHeader   s.     1;!5tU1D 1D-$r"   c                     t          |t                    r|}t          |          }d| |_        | j                            ||||           dS )a  Add the given filepath for watcher list.

        Once you have initialized a server, watch file changes before
        serve the server::

            server.watch('static/*.stylus', 'make static')
            def alert():
                print('foo')
            server.watch('foo.txt', alert)
            server.serve()

        :param filepath: files to be watched, it can be a filepath,
                         a directory, or a glob pattern
        :param func: the function to be called, it can be a string of
                     shell command, or any callable object without
                     parameters
        :param delay: Delay sending the reload message. Use 'forever' to
                      not send it. This is useful to compile sass files to
                      css, but reload on changed css files then only.
        :param ignore: A function return True to ignore a certain pattern of
                       filepath.
        zshell: )ignoreN)rB   rZ   r+   r   r   watch)r   filepathfuncdelayr   r8   s         r    r   zServer.watch   sX    . dC   	(C;;D'#DI8T5@@@@@r"   Tc                 n   | j         t          _         |t          _        |	| j        rd}dt          fdt          fdt
          fg}d|rt          j        |z            nt          j        dz            |                               } G fddt                    }|s6||z   }	t          j        |	||g	          }
|
                    ||
           d S t          j        |||g	          }
|
                    ||
           t          j        |d          }|                    ||
           d S )NTz/livereloadz/forcereloadz/livereload.jsz<script type="text/javascript">(function(){var s=document.createElement("script");var port=%s;s.src="//"+window.location.hostname+":"+port+ "/livereload.js?port=" + port;document.head.appendChild(s);})();</script>zJ(window.location.port || (window.location.protocol == 'https:' ? 443: 80))c                       e Zd Z ZdS )/Server.application.<locals>.ConfiguredTransformN)rb   rc   rd   rW   )live_scripts   r    ConfiguredTransformr     s         FFFr"   r   )handlersdebug
transforms)addressF)r   r   )r   r   live_cssr   r   r   r	   r   get_web_handlersrI   r   Applicationlisten)r   porthostliveportr   r   live_handlersweb_handlersr   r   r   liver   s               @r    applicationzServer.application   s   $(L!%-"=TX=E ./01 34
 	  	B +kH&<==KK +k  5A  'A  B  BK,,[99	! 	! 	! 	! 	! 	! 	!"4 	! 	! 	!  	0$|3H/!/0  C
 JJtTJ*****/%/0  C
 JJtTJ***?MGGGDKK$K/////r"   c                     | j         r't          | j         |          }dt          j        d|ifgS d| j        | j        pd| j        dfgS )Nz.*fallbackz/(.*).)r>   default_filename)r   rg   r   FallbackHandlerr   r   r   )r   rW   r   s      r    r   zServer.get_web_handlers*  sf    8 	J*48V<<HC/*h1GHIItx	(S$($9" " 
 	
r"   |  F   
index.htmlc                    pd||| _         |                                  t                              d d            |
| _        |                     |||	           |rt                              d           .fd}t          j        |          	                                 	 | j
        j                            d	|f           t          j                     t          d
            t!          j                    	                                 t!          j                                        d           dS # t(          $ r t                              d           Y dS w xY w)a  Start serve the server with the given port.

        :param port: serve on this port, default is 5500
        :param liveport: live reload on this port
        :param host: serve on this hostname, default is 127.0.0.1
        :param root: serve static on this root directory
        :param debug: set debug mode, which autoreloads the app on code changes
                      via Tornado (and causes polling). Defaults to True when
                      ``self.app`` is set, otherwise False.
        :param open_url_delay: open webbrowser after the delay seconds
        :param live_css: whether to use live css or force reload on css.
                         Defaults to True
        :param default_filename: launch this file from the selected root on startup
        z	127.0.0.1NzServing on http://:)r   r   r   z*Use `open_url_delay` instead of `open_url`c                  d    t          j                   t          j        d  d            d S )Nzhttp://r   )timesleep
webbrowserr3   )r   open_url_delayr   s   r    openerzServer.serve.<locals>.openerW  s:    
>*** 7$ 7 7 7 788888r"   )target__livereload__c                  L    t          j                                                    S r   )r   instancestopr#   r"   r    <lambda>zServer.serve.<locals>.<lambda>`  s    FO$5$5$:$:$<$< r"   T)all_fdszShutting down...)r   _setup_loggingr-   infor   r   r.   	threadingThreadstartr   _changesrm   r   start_tasksr   r   r   currentrs   KeyboardInterrupt)r   r   r   r   r   r   open_urlrestart_delayr   r   r   r   s    ` `    `   r    servezServer.serve5  s   " "{DI66666777 0$ 	 	K 	K 	K  	GLLEFFF%9 9 9 9 9 9 9 F+++11333
	,L!((*:M)JKKK)+++<<===O##%%%N""4"00000  	, 	, 	,KK*++++++	,s   3BE $E-,E-c                 8   t                               t          j                   t          j                    }|                    t                                 t                               |           t          j        d                              |           d S )Ntornado)	r-   setLevelloggingINFOStreamHandlersetFormatterr   
addHandler	getLogger)r   channels     r    r   zServer._setup_loggingh  sw    %%%'))\^^,,,'""" 	)$$//88888r"   )NN)NNN)NNT)
r   NNNNFr   NTr   )rb   rc   rd   __doc__rL   r   r   r   r   r   r   r#   r"   r    r|   r|      s         % % % %% % %$A A A A< <@!30 30 30 30j	
 	
 	
 KO>B.:1, 1, 1, 1,f9 9 9 9 9r"   r|   )Nr$   NF)-r   r<   r   rE   r   r   r   
subprocessr   r   tornado.wsgir   tornado.ioloopr   tornado.autoreloadr   r   r   r	   r
   tornado.logr   r   r   r   r   r   r   r   sysr/   version_infoplatformasyncioset_event_loop_policyWindowsSelectorEventLoopPolicyr   r-   rU   r   r+   OutputTransformrI   rg   r|   r#   r"   r    <module>r      sH    
			            " " " " " " " " & & & & & & ! ! ! ! ! ! . . . . . .                   $ $ $ $ $ $ < < < < < < < < ; ; ; ; ; ; ; ; & & & & & & 



 v#,'"9"9NNN!G!"H'"H"J"JKKK		<	(	(  . . . .b+ + + + +, + + +8( 8( 8( 8( 8(- 8( 8( 8(vC9 C9 C9 C9 C9 C9 C9 C9 C9 C9r"   