U
    ê‘«ja  ã                   @  s�   d dl mZ d dlZd dlZd dlZd dlZd dlmZ zd dlZdZ	W n e
k
r`   dZ	Y nX G dd„ dƒZddd	„Zed
krŒeeƒ ƒ‚dS )é    )ÚannotationsN)ÚBytesIOTFc                   @  sp   e Zd ZdZdddedfdd„Zedd„ ƒZd	d
„ Zdd„ Z	dd„ Z
edd„ ƒZedd„ ƒZdd„ Zdd„ ZdS )Ú
Compressor)ZjpgZjpegZpngZgifZwebpÚzipÚgzÚtgzÚbz2ÚtbzÚxzÚbrZswfZflvZwoffZwoff2Z3gpZ3gppZasfZaviZm4vZmovZmp4ZmpegZmpgZwebmZwmvNTFc                 C  s8   |d kr| j }|  |¡| _|| _|o&t| _|s4|| _d S ©N)ÚSKIP_COMPRESS_EXTENSIONSÚget_extension_reÚextension_reÚuse_gzipÚbrotli_installedÚ
use_brotliÚlog)ÚselfÚ
extensionsr   r   r   Úquiet© r   ú7/tmp/pip-unpacked-wheel-0x3iekhh/whitenoise/compress.pyÚ__init__6   s    
zCompressor.__init__c              	   C  s4   | st  d¡S t  d d tt j| ƒ¡¡t j¡S d S )Nz^$z\.({})$ú|)ÚreÚcompileÚformatÚjoinÚmapÚescapeÚ
IGNORECASE)r   r   r   r   r   A   s    
 ÿzCompressor.get_extension_rec                 C  s   | j  |¡ S r   )r   Úsearch)r   Úfilenamer   r   r   Úshould_compressJ   s    zCompressor.should_compressc                 C  s   d S r   r   )r   Úmessager   r   r   r   M   s    zCompressor.logc              	   c  s¢   t |dƒ�}t | ¡ ¡}| ¡ }W 5 Q R X t|ƒ}| jrl|  |¡}|  d|||¡rh|  	||d|¡V  nd S | j
rž|  |¡}|  d|||¡rž|  	||d|¡V  d S )NÚrbZBrotliz.brZGzipz.gz)ÚopenÚosÚfstatÚfilenoÚreadÚlenr   Úcompress_brotliÚis_compressed_effectivelyÚ
write_datar   Úcompress_gzip)r   ÚpathÚfÚstat_resultÚdataÚsizeÚ
compressedr   r   r   ÚcompressP   s    

zCompressor.compressc              	   C  s8   t ƒ }tjdd|ddd��}| | ¡ W 5 Q R X | ¡ S )NÚ Úwbé	   r   )r#   ÚmodeÚfileobjÚcompresslevelÚmtime)r   ÚgzipÚGzipFileÚwriteÚgetvalue)r4   ÚoutputZgz_filer   r   r   r0   a   s        ÿzCompressor.compress_gzipc                 C  s
   t  | ¡S r   )Úbrotlir7   )r4   r   r   r   r-   l   s    zCompressor.compress_brotlic              	   C  sf   t |ƒ}|dkrd}n|| }|dk}|rJ|  d |||d |d ¡¡ n|  d|› d|› d�¡ |S )	Nr   Fgffffffî?z{} compressed {} ({}K -> {}K)i   z	Skipping z (z compression not effective))r,   r   r   )r   Zencoding_namer1   Z	orig_sizer4   Zcompressed_sizeZis_effectiveZratior   r   r   r.   p   s        ÿÿz$Compressor.is_compressed_effectivelyc              	   C  s@   || }t |dƒ�}| |¡ W 5 Q R X t ||j|jf¡ |S )Nr9   )r'   rA   r(   ÚutimeÚst_atimeÚst_mtime)r   r1   r4   Úsuffixr3   r#   r2   r   r   r   r/   �   s
    zCompressor.write_data)Ú__name__Ú
__module__Ú__qualname__r   Úprintr   Ústaticmethodr   r$   r   r7   r0   r-   r.   r/   r   r   r   r   r      s$   $    ÿ




r   c                 C  sì   t jdd�}|jddddd� |jdd	d
dd� |jddd
dd� |jddd� d tj¡}|jdddd|› d� tjd� | | ¡}t|j|j|j	|j
d�}t |j¡D ]<\}}}|D ],}| |¡r¸tj ||¡}	| |	¡D ]}
qÞq¸qªdS )Nz¨Search for all files inside <root> *not* matching <extensions> and produce compressed versions with '.gz' and '.br' suffixes (as long as this results in a smaller file))Údescriptionz-qz--quietzDon't produce log outputÚ
store_true)ÚhelpÚactionz	--no-gzipzDon't produce gzip '.gz' filesÚstore_falser   )rP   rQ   Údestz--no-brotliz Don't produce brotli '.br' filesr   Úrootz(Path root from which to search for files)rP   z, r   Ú*z,File extensions to exclude from compression z
(default: ú))ÚnargsrP   Údefault)r   r   r   r   r   )ÚargparseÚArgumentParserÚadd_argumentr   r   r   Ú
parse_argsr   r   r   r   r(   ÚwalkrT   r$   r1   r7   )ÚargvÚparserZdefault_excludeÚargsZ
compressorÚdirpathZ_dirsÚfilesr#   r1   Z_compressedr   r   r   Úmain‰   sZ    ÿ   ÿüü
ÿù	
ü
rc   Ú__main__)N)Ú
__future__r   rY   r?   r(   r   Úior   rD   r   ÚImportErrorr   rc   rI   Ú
SystemExitr   r   r   r   Ú<module>   s   
x
3