a
    g                     @  sT  d Z ddlm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 eeddd dZeejddddddd Z d!d"d#d$d%d&d'd(d)Z!d!d"d#d%d&d*d+d,Z"dS )-z
Rewrite Model.Meta.index_together declarations into Model.Meta.Index
declarations.
https://docs.djangoproject.com/en/4.2/releases/4.2/#index-together-option-is-deprecated-in-favor-of-indexes
    )annotationsN)Iterable)partial)UNIMPORTANT_WS)Offset)Token)ast_start_offset)Fixer)State)	TokenFunc)DEDENT)INDENT)OP)PHYSICAL_NEWLINE)
erase_node)extract_indent)find_last_token)insert)str_repr_matching)      c                 C  s   | j S N)Zlooks_like_models_file)state r   c/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/django_upgrade/fixers/index_together.py<lambda>"       r   )min_version	conditionr
   zast.ClassDefztuple[ast.AST, ...]z"Iterable[tuple[Offset, TokenFunc]])r   nodeparentsreturnc                 c  sd  |j dks<tdd |dd  D dks<tdd |jD s@d S g }|jD ]}t|tjs^J t|jdkrJt|jd tj	rJ|jd j
dkrJt|jtjtjfrJtdd |jjD std	d |jjD rJ|| qJt|dkrd S |d }g }|jD ]d}t|tjsJ t|jdkrt|jd tj	r|jd j
d
krt|jtjtjfr|| qt|dkrtd S z|d }W n ty   d }Y n0 d| jd v sd| jd v rd}n*d| jd v sd| jd v rd}nd S g }	t|jtjtjfsJ t|jjd tjr6t|j|jjdg}
n|jj}
|
D ]}|}|d7 }t|tjrj|d7 }n|d7 }t|tjtjfsJ |jD ]D}t|tjsJ t|jtsJ |t|jdd7 }|d7 }q|d}t|tjr|d7 }n|d7 }|d7 }|	| qBd|	}t|tt||d u |dfV  |d ur`t|tt||dfV  d S )NZMetac                 s  s   | ]}t |tjV  qd S r   )
isinstanceastClassDef).0pr   r   r   	<genexpr>.   r   z!visit_ClassDef.<locals>.<genexpr>   c                 s  s   | ]}t |tjV  qd S r   )r"   r#   Assign)r%   subnoder   r   r   r'   /   r   r   index_togetherc                 s  s&   | ]}t |tjot |jtV  qd S r   r"   r#   Constantvaluestrr%   eltr   r   r   r'   =   s   c                 s  s4   | ],}t |tjtjfo*td d |jD V  qdS )c                 s  s&   | ]}t |tjot |jtV  qd S r   r,   )r%   Zsubeltr   r   r   r'   C   s   z+visit_ClassDef.<locals>.<genexpr>.<genexpr>N)r"   r#   ListTuplealleltsr0   r   r   r   r'   A   s
   	indexesmodelsz	django.dbzdjango.contrib.gis.dbzmodels.IndexIndexzdjango.db.modelszdjango.contrib.gis.db.models)r5   z(fields=([")Zmatch_quotes, )])r+   add_indexes	index_src)r6   r@   )namesumr4   bodyr"   r#   r)   lentargetsNameidr.   r2   r3   r5   append
IndexErrorZfrom_importsr-   typer/   r   removesuffixjoinr   r   +remove_index_together_and_maybe_add_indexesextend_indexes)r   r   r    Zindex_togethersr*   r+   Z	indexesesr6   Z	index_refZ
src_chunksZiterateZ	indexnoder@   constr   r   r   visit_ClassDef&   s    

	








rP   zlist[Token]intz
ast.Assignboolr/   None)tokensir+   r?   r@   r!   c                C  s>   t | |\}}t| ||d |r:t| || d| dd d S )Nr   zindexes = [z]
Znew_src)r   r   r   )rT   rU   r+   r?   r@   jindentr   r   r   rM      s    rM   )rT   rU   r6   r@   r!   c                C  s   t |jtjtjfsJ t| ||jd}t|jjdksR| |d  jt	t
ttfv rXd}n>t| ||jjd d}tdd | |d | D rd}nd	}t| || | d
 d S )NrV   r   r(    c                 s  s"   | ]}|j tko|jd kV  qdS ),N)rA   r   src)r%   tr   r   r   r'      s   z!extend_indexes.<locals>.<genexpr> r<   rW   )r"   r.   r#   r2   r3   r   rD   r5   rA   r   r   r   r   anyr   )rT   rU   r6   r@   Zclosing_punctuationprefixrX   r   r   r   rN      s     rN   )#__doc__
__future__r   r#   collections.abcr   	functoolsr   Ztokenize_rtr   r   r   Zdjango_upgrade.astr   Zdjango_upgrade.datar	   r
   r   Zdjango_upgrade.tokensr   r   r   r   r   r   r   r   r   __name__Zfixerregisterr$   rP   rM   rN   r   r   r   r   <module>   s<   
 