a
    g}                     @  s  U d Z ddlm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 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 eeddZ e !ej"dddddddZ#e Z$d e%d!< e Z&d"e%d#< d$d%ddd&d'd(d)Z'd$d%ddd&d'd*d+Z(e !ej)dd,dddd-d.Z*d$d%d/dd0d1d&d2d3d4Z+d%d%d5d6d0d7d8Z,d0d1d9d:d;d<Z-dS )=zk
Update URL definitions:
https://docs.djangoproject.com/en/2.0/releases/2.0/#simplified-url-routing-syntax
    )annotationsN)Iterable)MutableMapping)partial)WeakKeyDictionary)Offset)Token)ast_start_offset)is_rewritable_import_from)Fixer)State)	TokenFunc)STRING)extract_indent)find)find_last_token)insert)replace)str_repr_matching)update_import_names)   r   )min_versionr   zast.ImportFromztuple[ast.AST, ...]z"Iterable[tuple[Offset, TokenFunc]])statenodeparentsreturnc                 c  s   |j dkr@t|r@tdd |jD r@t|tt|| dfV  n>|j dkr~t|r~tdd |jD r~t|tt|| dfV  d S )Ndjango.conf.urlsc                 s  s   | ]}|j d v V  qdS )includeurlNname.0alias r%   `/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/django_upgrade/fixers/django_urls.py	<genexpr>/       z#visit_ImportFrom.<locals>.<genexpr>)r   r   django.urlsc                 s  s   | ]}|j d kV  qdS )re_pathNr    r"   r%   r%   r&   r'   9   r(   )moduler
   anynamesr	   r   update_django_conf_importupdate_django_urls_import)r   r   r   r%   r%   r&   visit_ImportFrom&   s,    r0   zMutableMapping[State, bool]state_re_path_usedzMutableMapping[State, set[str]]state_added_nameszlist[Token]intNone)tokensir   r   r   c                C  s   d|j d v }t|t }t }|jD ].}|jd ur8q(|jdv r(|sJ|r(||j q(|rt| |\}}	t	| ||t
|dd |sdt|}
t| ||	 d|
 dd	 n|t|< d S )
Nr*   r)   r    r   Zname_map, from django.urls import 
Znew_src)from_importsr2   popsetr-   asnamer!   addr   r   dictfromkeysjoinsortedr   )r5   r6   r   r   Zre_path_importedadded_namesZremovalsr$   jindentjoined_namesr%   r%   r&   r.   I   s0    


r.   c          
      C  s   t |d}t|t }||jd  }|rR|sRd|jd v rRt| ||ddid |rt| |\}}dt	|}	t
| || d|	 dd	 d S )
NFr)   r*   r7   r8   r9   r:   r;   r<   )r1   getr2   r>   r?   r=   r   r   rD   rE   r   )
r5   r6   r   r   Zre_path_usedrF   Zmissing_namesrG   rH   rI   r%   r%   r&   r/   i   s.    r/   zast.Callc                 c  s&  t |jtjr"|jj }dkr.d| jd v sL|jj }dkrd| jd v rt|jdkrd }t |jd tjrt |jd j	t
r|jd }t|jdkot |jd tjot |jd jtjo|jd jjdk}t|tt|| ||d	fV  n2|jjdkr"d| jd v r"t| t d d S )
Nr   r   r*   r)      r   r   r   )
regex_pathr   	node_nameinclude_called)
isinstancefuncastNameidr=   lenargsConstantvaluestrCallr	   r   fix_url_callr2   
setdefaultr?   rA   )r   r   r   rM   rL   rN   r%   r%   r&   
visit_Call   sF    
	
r\   zast.Constant | NonerX   bool)r5   r6   rL   r   rM   rN   r   c          
      C  s   d}|d urjt |j|}|d urjt| |td}t| ||d}	t|| | jd}tt|g| ||	d < d}||krt	|t
 | t| ||d nt	|d d S )	Nr*   r    )r   )Zmatch_quotesrK   path)srcT)convert_path_syntaxrW   r   r   r   r   r_   r   r2   r[   r?   rA   r   r1   )
r5   r6   rL   r   rM   rN   new_namer^   Zstring_start_idxZstring_end_idxr%   r%   r&   rZ      s    	rZ   r^   Zsluguuid)z[0-9]+z\d+z.+z[-a-zA-Z0-9_]+z[^/]+z<[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}z
str | None)rL   rN   r   c                 C  s   |  ds|sd S | d}|d}d}d|v r|dd\}}|dd\}}|dd\}}zt| }	W n ty   Y d S 0 ||7 }|d|	 d	| d7 }q*||7 }|d
d}
t|
|
krd S |S )N$^r7   z(?P<rK   )><:-)	endswithremoveprefixremovesuffixsplitREGEX_TO_CONVERTERKeyErrorr   reescape)rL   rN   	remainingr^   prefixrestgroupZ
group_nameZgroup_regex	converterZdashless_pathr%   r%   r&   r`      s(    

r`   ).__doc__
__future__r   rQ   rp   collections.abcr   r   	functoolsr   weakrefr   Ztokenize_rtr   r   Zdjango_upgrade.astr	   r
   Zdjango_upgrade.datar   r   r   Zdjango_upgrade.tokensr   r   r   r   r   r   r   r   __name__Zfixerregister
ImportFromr0   r1   __annotations__r2   r.   r/   rY   r\   rZ   rn   r`   r%   r%   r%   r&   <module>   sV   
 
/
