
    ]jm                        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mZ  ej                  d      ZddZ	 	 	 	 	 	 dd	Zdd
ZddZ G d de	      Z G d de	      Ze G d d             Ze G d d             Z G d d      Zy)    )annotationsN)deepcopy)	dataclass)Enum)CallableIterabledjango_migration_linterc                .    t        fd| D        d       S )Nc              3  B   K   | ]  }|j                   k(  s|  y wN)code).0cr   s     S/root/env/lib/python3.12/site-packages/django_migration_linter/sql_analyser/base.py	<genexpr>z'find_check_from_code.<locals>.<genexpr>   s     5qaffn5s   )next)checksr   s    `r   find_check_from_coder      s    5F5t<<    c           
         t        |       }|D ]j  }t        ||j                        }||j                  st        |      }|j                  |       |j                  D ]  }t        ||t        ||              l |S r   )r   r   r   append__dataclass_fields__setattrgetattr)base_checksspecific_checks
new_checksoverride_checkmigration_checkfields         r   update_migration_checksr!      s     +&J) L.z>;N;NO".*=*=&~6Oo.#88 	LEOUGNE,JK	LL r   c                   d}d}| D ]r  }t        j                  d|      r5|j                  d      s$|j                  d      s|j                  d      sd}t        j                  d|      rd}d|v rd}d	|v sqd}t |xr | S )
NFz(?<!DROP )(?<!IS )NOT NULLzCREATE TABLEzCREATE INDEXzCREATE UNIQUE INDEXTzDEFAULT.*NOT NULLzSET DEFAULTzDROP DEFAULT)research
startswith)sql_statementskwargsnot_null_columnhas_default_valuesqls        r   has_not_null_columnr+   !   s    O &99137NN>*~~n-~~34"O99(#. $C $S  %& 4#444r   c                    d }| D ]4  }t        j                  d|      xs t        j                  d|      }|s4 n |sy|j                  d      t        fd| D              }| S )Nz)ALTER TABLE (.*) ADD CONSTRAINT .* UNIQUEz!CREATE UNIQUE INDEX .* ON (".*?")F   c              3  F   K   | ]  }|j                  d          yw)zCREATE TABLE Nr%   )r   r*   concerned_tables     r   r   z!has_add_unique.<locals>.<genexpr>C   s'      (>A&789(s   !)r#   r$   groupany)r&   r'   regex_resultr*   table_is_added_in_transactionr0   s        @r   has_add_uniquer5   7   s    L yy7
 AYY:C@ 	  "((+O$' (ES( %! -,,r   c                      e Zd ZdZdZdZy)	CheckModezT
    Defines whether the Check.fn gets a str or a list[str] as first parameter.
    r-      N)__name__
__module____qualname____doc__	ONE_LINERTRANSACTION r   r   r7   r7   I   s     IKr   r7   c                      e Zd ZdZdZy)	CheckTyper-   r8   N)r9   r:   r;   ERRORWARNINGr?   r   r   rA   rA   R   s    EGr   rA   c                  D    e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   y)CheckzH
    Represents a check that will be done against SQL statement(s).
    strr   r   fnmessager7   moderA   typeN)r9   r:   r;   r<   __annotations__r?   r   r   rE   rE   W   s"     ILL
O
Or   rE   c                  >    e Zd ZU ded<   ded<   dZded<   dZded<   y)IssuerF   r   rH   N
str | Nonetablecolumn)r9   r:   r;   rK   rO   rP   r?   r   r   rM   rM   d   s     
ILE:FJr   rM   c                  h   e Zd ZU  edd dej
                  ej                         ededej                  ej                         edd d	ej
                  ej                         ed
d dej
                  ej                         edd dej
                  ej                         edd dej
                  ej                         ede
dej                  ej                        gZded<   g Zded<   d!dZd"dZed#d       Zed#d       Zd$dZ	 	 	 	 	 	 d%dZed&d       Zed&d       Zy )'BaseAnalyserRENAME_TABLEc                ^    t        j                  d|       xs t        j                  d|       S )NzRENAME TABLEzALTER TABLE .* RENAME TOr#   r$   r*   kws     r   <lambda>zBaseAnalyser.<lambda>p   s(    >3!? ":yy3S9 r   zRENAMING tables)r   rG   rH   rI   rJ   NOT_NULLzNOT NULL constraint on columnsDROP_COLUMNc                .    t        j                  d|       S )NzDROP COLUMNrU   rV   s     r   rX   zBaseAnalyser.<lambda>   s    =#!> r   zDROPPING columns
DROP_TABLEc                $    | j                  d      S )Nz
DROP TABLEr/   rV   s     r   rX   zBaseAnalyser.<lambda>   s    != r   zDROPPING tableRENAME_COLUMNc                ^    t        j                  d|       xs t        j                  d|       S )NzALTER TABLE .* CHANGEzALTER TABLE .* RENAME COLUMNrU   rV   s     r   rX   zBaseAnalyser.<lambda>   s)    +BC!H ">yy7= r   zRENAMING columnsALTER_COLUMNc                .    t        j                  d|       S )Nz#ALTER TABLE .* ALTER COLUMN .* TYPErU   rV   s     r   rX   zBaseAnalyser.<lambda>   s    +PRU!V r   zOALTERING columns (Could be backward compatible. You may ignore this migration.)
ADD_UNIQUEzADDING unique constraintlist[Check]base_migration_checksmigration_checksc                    |xs g | _         g | _        g | _        g | _        t	        | j
                  | j                        | _        y r   )exclude_migration_testserrorswarningsignoredr!   rd   re   )selfrg   s     r   __init__zBaseAnalyser.__init__   sC    6M6SQS$#%%'$& 7&&(=(=!
r   c                    |D ]&  }| j                   D ]  }| j                  ||        ( | j                  D ]  }| j                  ||        y )N)r*   )one_line_migration_checks
_check_sqltransaction_migration_checks)rk   r&   	statementtests       r   analysezBaseAnalyser.analyse   s]    ' 	5I66 5)45	5 55 	6DOODnO5	6r   c                (    d | j                   D        S )Nc              3  \   K   | ]$  }|j                   t        j                  k(  s!| & y wr   )rI   r7   r=   r   r   s     r   r   z9BaseAnalyser.one_line_migration_checks.<locals>.<genexpr>   s!     RaAFFi>Q>Q4QR   ",,re   rk   s    r   rn   z&BaseAnalyser.one_line_migration_checks   s    R400RRr   c                (    d | j                   D        S )Nc              3  \   K   | ]$  }|j                   t        j                  k(  s!| & y wr   )rI   r7   r>   rv   s     r   r   z<BaseAnalyser.transaction_migration_checks.<locals>.<genexpr>   s!     TaAFFi>S>S4STrw   rx   ry   s    r   rp   z)BaseAnalyser.transaction_migration_checks   s    T400TTr   c                   |j                  || j                        r|j                  | j                  v rd}| j                  }n:|j
                  t        j                  k(  rd}| j                  }nd}| j                  }t        j                  d||       | j                  ||      }|j                  |       y t        j                  d|       y )N)rh   IGNOREDrC   rB   zTesting %s -- %s)r   sql_statementzTesting %s -- PASSED)rG   rh   r   rg   rj   rJ   rA   rC   ri   loggerdebugbuild_issuer   )rk   checkr*   actionlist_to_addissues         r   ro   zBaseAnalyser._check_sql   s    88C8,zzT999""lly000""mm "kkLL+S&9$$U#$NEu%LL/5r   c                    | j                  |      }| j                  |      }t        |j                  |j                  ||      S )N)r   rH   rO   rP   )detect_tabledetect_columnrM   r   rH   )rk   r   r~   rO   cols        r   r   zBaseAnalyser.build_issue   sI     !!-0  / %%#++	
 	
r   c                    t        | t              r8t        j                  d| t        j                        }|r|j                  d      S y )NzTABLE [`"'](.*?)[`"']r-   
isinstancerF   r#   r$   
IGNORECASEr1   r*   r3   s     r   r   zBaseAnalyser.detect_table   s:    c399%>R]]SL#))!,,r   c                    t        | t              r8t        j                  d| t        j                        }|r|j                  d      S y )NzCOLUMN [`"'](.*?)[`"']r-   r   r   s     r   r   zBaseAnalyser.detect_column   s:    c399%?bmmTL#))!,,r   N)rg   zIterable[str] | None)r&   	list[str]returnNone)r   zIterable[Check])r   rE   r*   list[str] | strr   r   )r   rE   r~   r   r   rM   )r*   r   r   rN   )r9   r:   r;   rE   r7   r=   rA   rB   r+   r>   r5   rd   rK   re   rl   rs   propertyrn   rp   ro   r   staticmethodr   r   r?   r   r   rR   rR   l   s   :%$$	
 	"4&&	
 	>&$$	
 	=$$$	
 	 >&$$	
 	V2 $$		
 	.&&	
a7*; 7r %'k&
6 S S U U6"

$

5D

	

    r   rR   )r   rc   r   rF   r   zCheck | None)r   rc   r   rc   r   rc   )r&   r   r   bool)
__future__r   loggingr#   copyr   dataclassesr   enumr   typingr   r   	getLoggerr   r   r!   r+   r5   r7   rA   rE   rM   rR   r?   r   r   <module>r      s    "  	  !  %			4	5=/: 5,-$  
 	 	 	   @ @r   