a
    g                     @  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 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 d dlmZ d dlmZ d dlmZ h dZd-dddddZdddddZG dd dejZdddddZ dd d!dd"d#d$Z!dd ddd%d&d'Z"d(d)d*d+d,Z#dS ).    )annotationsN)Sequence)metadata)Any)cast)UNIMPORTANT_WS)Token)reversed_enumerate)src_to_tokens)tokens_to_src)	ast_parse)FIXERS)Settings)visit)DEDENT>   )   r   )      )r      )   r   )r      )r   r   )   r   )r   r   )r   r   )r      )r   r   )r   
   r   r   )r   r   )r   r   )r   	   )r   r   zSequence[str] | Noneint)argvreturnc                 C  s   t jdd}|jddd |jdddgdd	 tD d
d |jdddd |jddtddd |jddtdd |jddtdd |jddtdd || }t	t
|j|jrt|jnd |jrt|jnd d}d}|jD ]}|t|||jdO }q|S ) Nzdjango-upgrade)prog	filenames+)nargsz--target-versionautoc                 S  s   g | ]\}}| d | qS ). ).0majorminorr%   r%   R/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/django_upgrade/main.py
<listcomp>5       zmain.<locals>.<listcomp>z The version of Django to target.)defaultchoiceshelpz--exit-zero-even-if-changed
store_truez8Exit with a zero return code even if files have changed.)actionr.   z	--versionversionz!Show the version number and exit.)r0   r1   r.   z--onlyappendzRun only the selected fixers.)r0   typer.   z--skipzSkip the selected fixers.z--list-fixersr   zList all fixer names.)r"   r0   r.   )target_versionZonly_fixersZskip_fixers)exit_zero_even_if_changed)argparseArgumentParseradd_argumentSUPPORTED_TARGET_VERSIONSr   r1   
fixer_typeListFixersAction
parse_argsr   get_target_versionr4   onlysetskipr    fix_filer5   )r   parserargssettingsretfilenamer%   r%   r)   main-   sf    	


rG   str)stringr   c                 C  s   | t vrtd| | S )NzUnknown fixer: )r   r6   ArgumentTypeError)rI   r%   r%   r)   r:   g   s    r:   c                   @  s$   e Zd Zd
dddddddd	ZdS )r;   Nzargparse.ArgumentParserzargparse.Namespacezstr | Sequence[Any] | Nonez
str | NoneNone)rB   	namespacevaluesoption_stringr   c                 C  s"   t tD ]}t| q|  d S N)sortedr   printexit)selfrB   rL   rM   rN   namer%   r%   r)   __call__n   s    
zListFixersAction.__call__)N)__name__
__module____qualname__rU   r%   r%   r%   r)   r;   m   s    r;   ztuple[int, int]c           
      C  s  d}| dkr4t tttf tdd | ddD S tjdk rB|S dd l}z8td	d
}||}W d    n1 sv0    Y  W n t	y   | Y S 0 |
di 
dg }|D ]`}td| tj}|rt|d }t|d }	||	ftv rtd| d|	  ||	f  S q|S )Nr   r#   c                 s  s   | ]}t |V  qd S rO   )r   )r&   xr%   r%   r)   	<genexpr>   r+   z%get_target_version.<locals>.<genexpr>r$   r   )r   r   r   zpyproject.tomlrbprojectZdependenciesa   
            django
            \s*
            (
                \[[^]]+\]
                \s*
            )?
            (?:==|~=|>=)
            \s*
            (
                (?P<major>[0-9]+)
                \.
                (?P<minor>[0-9]+)
                (
                    (?:a|b|rc)
                    [0-9]+
                |
                    \.
                    [0-9]+
                |
                )
            )
            (
                \s*,\s*
                (<|<=)
                \s*
                [0-9]+
                (
                    \.
                    [0-9]+
                    (
                        \.
                        [0-9]+
                    )?
                )?
            )?
            r'   r(   z-Detected Django version from pyproject.toml: )r   tupler   splitsysversion_infotomllibopenloadFileNotFoundErrorgetre	fullmatchlowerVERBOSEr9   rQ   )
rI   r,   ra   fpconfigdepsdepmatchr'   r(   r%   r%   r)   r=   z   s8    

,
%)r=   r   bool)rF   rD   r5   r   c                 C  s  | dkrt jj }n2t| d}| }W d    n1 s>0    Y  z|  }}W n" tyz   t|  d Y dS 0 t||| }| dkrt|dd nV||krtd|  t j	d t| d	d
dd}|
| W d    n1 s0    Y  | rdS ||kS )N-r[   z is non-utf-8 (not supported)r    )endz
Rewriting )filewzUTF-8)encodingnewliner   )r_   stdinbufferreadrb   decodeUnicodeDecodeErrorrQ   apply_fixersstderrwrite)rF   rD   r5   Zcontents_bytesZfbZcontents_text_origcontents_textfr%   r%   r)   rA      s&    &(rA   )r   rD   rF   r   c           	      C  s   zt | }W n ty"   |  Y S 0 t|||}|s8| S zt| }W n tjy\   |  Y S 0 t| t|D ].\}}|js~qn|	|j
dD ]}||| qqnt|S )Nr%   )r   SyntaxErrorr   r
   tokenize
TokenErrorfixup_dedent_tokensr	   srcre   offsetr   )	r   rD   rF   ast_obj	callbackstokensitokencallbackr%   r%   r)   r|      s$    

r|   zlist[Token]rK   )r   r   c                 C  sT   t | D ]F\}}|jtkr| |d  jtkr| |d  | |  | |< | |d < qdS )zFor whatever reason the DEDENT / UNIMPORTANT_WS tokens are misordered

    | if True:
    |     if True:
    |         pass
    |     else:
    |^    ^- DEDENT
    |+----UNIMPORTANT_WS
    r   N)	enumeraterT   r   r   )r   r   r   r%   r%   r)   r      s    
r   )N)$
__future__r   r6   rf   r_   r   collections.abcr   	importlibr   typingr   r   Ztokenize_rtr   r   r	   r
   r   Zdjango_upgrade.astr   Zdjango_upgrade.datar   r   r   Zdjango_upgrade.tokensr   r9   rG   r:   Actionr;   r=   rA   r|   r   r%   r%   r%   r)   <module>   s4   :H