Ë
    Ì
âi›,  ã                   ó  — d Z ddlZddlmZ ddlmZmZ ddlmZ ddl	m
Z
mZmZmZmZmZ  G d„ d«      Zed	k(  rK ee«      j&                  j&                  j&                  ZddlmZ  e«       Z ee ee«      «      Z ed
«       yy)zL
Auto-Fix Utility - Automatically fixes safe issues detected during testing
é    N)ÚPath)ÚDictÚOptional)ÚLogger)ÚINDEX_DEFINITIONSÚTRIGGER_DEFINITIONSÚget_index_sqlÚget_index_downgrade_sqlÚget_trigger_sqlÚget_trigger_downgrade_sqlc                   óp   — e Zd ZdZdedefd„Zdededefd„Z	d	e
defd
„Zde
defd„Zdedefd„Zdefd„Zy)ÚAutoFixz7Automatically fixes safe issues detected during testingÚloggerÚproject_dirc                 ó2   — || _         t        |«      | _        y )N)r   r   r   )Úselfr   r   s      ú3/home/factor_ks/STREAMA2026/tests/utils/auto_fix.pyÚ__init__zAutoFix.__init__   s   € ØˆŒÜ Ó,ˆÕó    Úschema_differencesÚmodels_infoÚreturnc           
      ó  — 	 | j                   j                  dd«       ddlm} |j                  «       j	                  d«      }dddd	d
dddd|› �g	}t        j                  |ddt        | j                  «      d¬«      }|j                  dk7  r*| j                   j                  dd|j                  › �«       y| j                   j                  dd«       g d¢}t        j                  |ddt        | j                  «      d¬«      }|j                  dk7  r*| j                   j                  dd|j                  › �«       y| j                   j                  dd«       y# t        $ r)}| j                   j                  dd|› �«       Y d}~yd}~ww xY w)zAAuto-fix missing tables and columns by creating Alembic migrationúAUTO-FIXz0Creating migration for missing tables/columns...r   ©Údatetimeú%Y%m%d_%H%MÚdockerÚcomposeÚexecÚbackendÚalembicÚrevisionz--autogenerateú-mÚ	auto_fix_Té   ©Úcapture_outputÚtextÚcwdÚtimeoutúFailed to create migration: FzMigration created successfully©r   r   r    r!   r"   ÚupgradeÚheadúFailed to apply migration: úMigration applied successfullyúAuto-fix failed: N)r   Úinfor   ÚnowÚstrftimeÚ
subprocessÚrunÚstrr   Ú
returncodeÚerrorÚstderrÚsuccessÚ	Exception)	r   r   r   r   Ú	timestampÚ
cmd_createÚresultÚcmd_upgradeÚes	            r   Úfix_missing_tables_columnsz"AutoFix.fix_missing_tables_columns   sq  € ð!	Ø�K‰K×Ñ˜ZÐ)[Ô\õ *Ø Ÿ™›×/Ñ/°Ó>ˆIð # I¨v°yÀ)Ø#Ð%5°t¸yÈÈÐ=TðVˆJä—^‘^ J¸tÈ$Ü&)¨$×*:Ñ*:Ó&;ÀRôIˆFð × Ñ  AÒ%Ø—‘×!Ñ! *Ð0LÈVÏ]É]ÈOÐ.\Ô]Øà�K‰K×Ñ 
Ð,LÔMò aˆKÜ—^‘^ KÀÈ4Ü&)¨$×*:Ñ*:Ó&;ÀRôIˆFð × Ñ  AÒ%Ø—‘×!Ñ! *Ð0KÈFÏMÉMÈ?Ð.[Ô\Øà�K‰K×Ñ 
Ð,LÔMØøäò 	Ø�K‰K×Ñ˜jÐ,=¸a¸SÐ*AÔBÜûð	ús%   ‚B4E Â7BE Ä=E Å	FÅ#FÆFÚmissing_indexesc           	      ó   — 	 | j                   j                  ddt        |«      › d�«       ddlm} |j	                  «       j                  d«      }ddd	d
dddd|› �g}t        j                  |ddt        | j                  «      d¬«      }|j                  dk7  r*| j                   j                  dd|j                  › �«       y| j                  d
z  dz  dz  }t        |j                  d«      d¬«      }|s| j                   j                  dd«       y|d   }| j                   j                  dd|j                  › �«       t!        |d«      5 }	|	j#                  «       }
ddd«       d}|D ]  }|t%        |«      z  }Œ 
j'                  d«      }t        |«      dkD  rŸ|d   j'                  d«      }d|› d �}t        |«      dkD  r|d!z  }|D ]  }|t)        |«      z  }Œ n|d"z  }|d   |z   }t!        |d#«      5 }	|	j+                  |«       ddd«       | j                   j-                  dd$t        |«      › d%�«       g d&¢}t        j                  |ddt        | j                  «      d¬«      }|j                  dk7  r*| j                   j                  dd'|j                  › �«       y| j                   j-                  dd(«       y# 1 sw Y   �ŒfxY w# 1 sw Y   ŒÆxY w# t.        $ r)}| j                   j                  dd)|› �«       Y d}~yd}~ww xY w)*z.Auto-fix missing indexes by creating migrationr   úCreating migration for z missing indexes...r   r   r   r   r   r    r!   r"   r#   r$   Úadd_missing_indexes_Tr&   r'   r,   FÚversionsú*.py©ÚreverseúNo migration file foundúMigration file: ÚrNÚ údef upgrade():é   údef downgrade():údef upgrade():
Ú
údef downgrade():
ú
def downgrade():
    pass
ÚwúMigration updated with z index statementsr-   r0   r1   r2   )r   r3   Úlenr   r4   r5   r6   r7   r8   r   r9   r:   r;   ÚsortedÚglobÚnameÚopenÚreadr	   Úsplitr
   Úwriter<   r=   )r   rD   r   r>   r?   r@   Úversions_dirÚnew_migrationsÚlatest_migrationÚfÚmigration_contentÚindex_statementsÚ
index_nameÚupgrade_sectionÚafter_upgradeÚnew_upgradeÚnew_contentrA   rB   s                      r   Úfix_missing_indexeszAutoFix.fix_missing_indexes;   s1  € ðH	Ø�K‰K×Ñ˜ZÐ+BÄ3ÀÓCWÐBXÐXkÐ)lÔmå)Ø Ÿ™›×/Ñ/°Ó>ˆIð # I¨v°yÀ)Ø# TÐ-AÀ)ÀÐ+MðOˆJä—^‘^ J¸tÈ$Ü&)¨$×*:Ñ*:Ó&;ÀRôIˆFð × Ñ  AÒ%Ø—‘×!Ñ! *Ð0LÈVÏ]É]ÈOÐ.\Ô]Øð  ×+Ñ+¨iÑ7¸)ÑCÀjÑPˆLÜ# L×$5Ñ$5°fÓ$=ÀtÔLˆNá!Ø—‘×!Ñ! *Ð.GÔHØà-¨aÑ0ÐØ�K‰K×Ñ˜ZÐ+;Ð<L×<QÑ<QÐ;RÐ)SÔTô Ð&¨Ó,ð -°Ø$%§F¡F£HÐ!÷-ð  "ÐØ-ò >�
Ø ¤M°*Ó$=Ñ=Ñ ð>ð 0×5Ñ5Ð6FÓGˆOÜ�?Ó# aÒ'Ø /°Ñ 2× 8Ñ 8Ð9KÓ L�à 0Ð1AÐ0BÀ"ÐE�ä�}Ó%¨Ò)ØÐ%7Ñ8�KØ&5ò K˜
Ø#Ô'>¸zÓ'JÑJ™ñKð  Ð#CÑC�Kà-¨aÑ0°;Ñ>�ô Ð*¨CÓ0ð )°AØ—G‘G˜KÔ(÷)ð —‘×#Ñ# JÐ2IÌ#ÈoÓJ^ÐI_Ð_pÐ0qÔrò aˆKÜ—^‘^ KÀÈ4Ü&)¨$×*:Ñ*:Ó&;ÀRôIˆFð × Ñ  AÒ%Ø—‘×!Ñ! *Ð0KÈFÏMÉMÈ?Ð.[Ô\Øà�K‰K×Ñ 
Ð,LÔMØ÷Q-ñ -ú÷2)ð )ûô" ò 	Ø�K‰K×Ñ˜jÐ,=¸a¸SÐ*AÔBÜûð	ús]   ‚C K ÃAK Ä:K ÅKÅBK Ç8KÈ
BK Ê%K ËKËK ËKËK Ë	LË$LÌLÚmissing_triggersc           	      ó  — 	 | j                   j                  ddt        |«      › d�«       ddlm} |j	                  «       j                  d«      }ddd	d
dddd|› �g}t        j                  |ddt        | j                  «      d¬«      }|j                  dk7  r*| j                   j                  dd|j                  › �«       y| j                  d
z  dz  dz  }t        |j                  d«      d¬«      }|s| j                   j                  dd«       y|d   }| j                   j                  dd|j                  › �«       t!        |d«      5 }	|	j#                  «       }
ddd«       d}d}|D ]  }|t%        |«      z  }|t'        |«      z  }Œ  
j)                  d«      }t        |«      dkD  rŽ|d   j)                  d«      }d|› d �}t        |«      dkD  r
|d!|› d"�z  }n|d#z  }|d   |z   }t!        |d$«      5 }	|	j+                  |«       ddd«       | j                   j-                  dd%t        |«      › d&�«       g d'¢}t        j                  |ddt        | j                  «      d¬«      }|j                  dk7  r*| j                   j                  dd(|j                  › �«       y| j                   j-                  dd)«       y# 1 sw Y   �ŒexY w# 1 sw Y   ŒÆxY w# t.        $ r)}| j                   j                  dd*|› �«       Y d}~yd}~ww xY w)+z/Auto-fix missing triggers by creating migrationr   rF   z missing triggers...r   r   r   r   r   r    r!   r"   r#   r$   Úadd_missing_triggers_Tr&   r'   r,   FrH   rI   rJ   rL   rM   rN   NrO   rP   rQ   rR   rS   z

rU   rT   rV   rW   rX   z trigger statementsr-   r0   r1   r2   )r   r3   rY   r   r4   r5   r6   r7   r8   r   r9   r:   r;   rZ   r[   r\   r]   r^   r   r   r_   r`   r<   r=   )r   rm   r   r>   r?   r@   ra   rb   rc   rd   re   Útrigger_statementsÚdowngrade_statementsÚtriggerrh   ri   rj   rk   rA   rB   s                       r   Úfix_missing_triggerszAutoFix.fix_missing_triggers‡   s4  € ðH	Ø�K‰K×Ñ˜ZÐ+BÄ3ÐGWÓCXÐBYÐYmÐ)nÔoå)Ø Ÿ™›×/Ñ/°Ó>ˆIð # I¨v°yÀ)Ø# TÐ-BÀ9À+Ð+NðPˆJä—^‘^ J¸tÈ$Ü&)¨$×*:Ñ*:Ó&;ÀRôIˆFð × Ñ  AÒ%Ø—‘×!Ñ! *Ð0LÈVÏ]É]ÈOÐ.\Ô]Øð  ×+Ñ+¨iÑ7¸)ÑCÀjÑPˆLÜ# L×$5Ñ$5°fÓ$=ÀtÔLˆNá!Ø—‘×!Ñ! *Ð.GÔHØà-¨aÑ0ÐØ�K‰K×Ñ˜ZÐ+;Ð<L×<QÑ<QÐ;RÐ)SÔTô Ð&¨Ó,ð -°Ø$%§F¡F£HÐ!÷-ð "$ÐØ#%Ð Ø+ò K�Ø"¤o°gÓ&>Ñ>Ð"Ø$Ô(AÀ'Ó(JÑJÑ$ðKð
 0×5Ñ5Ð6FÓGˆOÜ�?Ó# aÒ'Ø /°Ñ 2× 8Ñ 8Ð9KÓ L�à 0Ð1CÐ0DÀDÐI�ä�}Ó%¨Ò)ØÐ%7Ð8LÐ7MÈRÐ#PÑP‘KàÐ#CÑC�Kà-¨aÑ0°;Ñ>�ô Ð*¨CÓ0ð )°AØ—G‘G˜KÔ(÷)ð —‘×#Ñ# JÐ2IÌ#ÐN^ÓJ_ÐI`Ð`sÐ0tÔuò aˆKÜ—^‘^ KÀÈ4Ü&)¨$×*:Ñ*:Ó&;ÀRôIˆFð × Ñ  AÒ%Ø—‘×!Ñ! *Ð0KÈFÏMÉMÈ?Ð.[Ô\Øà�K‰K×Ñ 
Ð,LÔMØ÷Q-ñ -ú÷2)ð )ûô" ò 	Ø�K‰K×Ñ˜jÐ,=¸a¸SÐ*AÔBÜûð	ús]   ‚C K ÃAK Ä:K ÅKÅBK Ç7KÈ	BK Ê$K ËKËK ËKËK Ë	LË#LÌLÚ	endpointsc                 ó~  — 	 ddl m}  |t        | j                  «      «      }| j                  j                  dd«       |j                  |«      r| j                  j                  dd«       y| j                  j                  dd«       y# t        $ r)}| j                  j                  dd	|› �«       Y d
}~yd
}~ww xY w)z*Update API baseline with current endpointsr   )ÚAPIAnalyzerr   z!Updating API endpoint baseline...z!API baseline updated successfullyTzFailed to update API baselineFzFailed to update baseline: N)
Útests.utils.api_analyzerrv   r8   r   r   r3   Úsave_baseliner<   r:   r=   )r   rt   rv   ÚanalyzerrB   s        r   Úupdate_api_baselinezAutoFix.update_api_baselineÓ   s¡   € ð	Ý<Ù"¤3 t×'7Ñ'7Ó#8Ó9ˆHà�K‰K×Ñ˜ZÐ)LÔMà×%Ñ% iÔ0Ø—‘×#Ñ# JÐ0SÔTØà—‘×!Ñ! *Ð.MÔNØøäò 	Ø�K‰K×Ñ˜jÐ,GÈÀsÐ*KÔLÜûð	ús   ‚A*B
 Á-B
 Â
	B<ÂB7Â7B<c                 ó´  — 	 | j                   j                  dd«       g d¢}t        j                  |ddt	        | j
                  «      d¬«      }|j                  dk(  r| j                   j                  dd«       y| j                   j                  dd	|j                  › �«       y
# t        $ r)}| j                   j                  dd|› �«       Y d}~y
d}~ww xY w)z Apply pending Alembic migrationsr   zApplying pending migrations...r-   Té<   r'   r   zMigrations applied successfullyzFailed to apply migrations: FzMigration upgrade failed: N)r   r3   r6   r7   r8   r   r9   r<   r:   r;   r=   )r   Úcmdr@   rB   s       r   Úapply_migration_upgradezAutoFix.apply_migration_upgradeæ   sÀ   € ð	Ø�K‰K×Ñ˜ZÐ)IÔJâXˆCÜ—^‘^ C¸À4Ü&)¨$×*:Ñ*:Ó&;ÀRôIˆFð × Ñ  AÒ%Ø—‘×#Ñ# JÐ0QÔRØà—‘×!Ñ! *Ð0LÈVÏ]É]ÈOÐ.\Ô]Øøäò 	Ø�K‰K×Ñ˜jÐ,FÀqÀcÐ*JÔKÜûð	ús   ‚A8B% Á;)B% Â%	CÂ.CÃCN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   r   r   ÚboolrC   Úlistrl   rs   rz   r~   © r   r   r   r      s‚   „ ÙAð-˜vð -°Có -ð#¸Tð #ÐPTð #ÐY]ó #ðJJ°4ð J¸Dó JðXJ°Tð J¸dó JðX¨Tð °dó ð&¨ô r   r   Ú__main__zAuto-Fix utility initialized)r‚   r6   Úpathlibr   Útypingr   r   Útests.utils.loggerr   Útests.utils.db_constantsr   r   r	   r
   r   r   r   r   Ú__file__Úparentr   r   r8   Úauto_fixÚprintr…   r   r   ú<module>r�      s}   ðñó Ý ß !Ý %÷÷ ÷iñ iðX ˆzÒá�x“.×'Ñ'×.Ñ.×5Ñ5€KÝ)Ù‹X€Fá�v™s ;Ó/Ó0€HÙ	Ð
(Õ)ð r   