Ë
    ¥©	j  ã                   óz   — U d Z ddlZddlmZ ddlmZ ddlmZ  ee«      Z	 G d„ d«      Z
dae
dz  ed<   d	e
fd
„Zy)zs
Fixture loader for offline PR testing.
Loads pre-created PR fixtures (pr1, pr2, pr3) for demo without GitHub API.
é    N)ÚPath)ÚAny)Ú
get_loggerc                   óJ   — e Zd ZdZd	defd„Zdedeeef   fd„Zde	e   fd„Z
y)
ÚFixtureLoaderz/Loads PR fixtures from the fixtures/ directory.Úfixtures_dirc                 ó  — t        |«      | _        | j                  j                  «       s%t        d«      |z  }|j                  «       r|| _        t        j	                  dt        | j                  j                  «       «      ¬«       y )Nz..Úfixture_loader_initialized)r   )r   r   ÚexistsÚloggerÚinfoÚstrÚresolve)Úselfr   Úparent_fixturess      ú</var/www/html/prparty/backend/app/services/fixture_loader.pyÚ__init__zFixtureLoader.__init__   sj   € Ü  Ó.ˆÔð × Ñ ×'Ñ'Ô)Ü" 4›j¨<Ñ7ˆOØ×%Ñ%Ô'Ø$3�Ô!ä�‰Ð0¼sÀ4×CTÑCT×C\ÑC\ÓC^Ó?_ˆÕ`ó    Úfixture_nameÚreturnc           
      óä  — ddddœ}||vr.t        d|› ddj                  |j                  «       «      › �«      ‚| j                  ||   z  }|j	                  «       st        d|› �«      ‚t
        j                  d	|t        |«      ¬
«       |dz  }d}d}d}|j	                  «       r×|j                  d¬«      }|j                  d«      D ]±  }	d|	v rN|	j                  d«      d   j                  «       }
|
j                  d«      j                  «       }
	 t        |
«      }ŒUd|	v r2|	j                  d«      d   j                  «       j                  d«      }Œ‹d|	v sŒ�|	j                  d«      d   j                  «       }Œ³ |dz  }|j                  d¬«      }|dz  }|j                  d¬«      }|dz  }i }|j	                  «       rF|j                  d«      D ]2  }|j                  «       sŒ|j                  d¬«      ||j                  <   Œ4 d}d}|dz  }|j	                  «       r,t!        |dd¬«      5 }t#        j$                  |«      }ddd«       |dz  }|j	                  «       r,t!        |dd¬«      5 }t#        j$                  |«      }ddd«       t
        j                  d ||t'        |«      t'        |«      |du|du¬!«       ||||||||d"œS # t         $ r Y �Œw xY w# 1 sw Y   Œ—xY w# 1 sw Y   ŒbxY w)#aG  
        Load a PR fixture by name.
        
        Args:
            fixture_name: Fixture identifier (pr1, pr2, pr3)
        
        Returns:
            Dict containing:
            - pr_number: int
            - pr_title: str
            - pr_author: str
            - diff: str
            - package_json: str
            - context_files: dict[str, str]
            - expected_findings_raw: list (optional, for validation)
            - expected_findings_validated: list (optional, for validation)
        
        Raises:
            ValueError: If fixture not found
        Úpr1_security_criticalÚpr2_mixed_issuesÚpr3_clean_code©Úpr1Úpr2Úpr3zUnknown fixture: z. Available: z, zFixture directory not found: Úloading_fixture)r   Úpathz	README.mdr   ÚUnknownÚunknownzutf-8)Úencodingú
z**PR Number:**éÿÿÿÿú#z
**Title:**ú"z**Author:**z
diff.patchzpackage.jsonÚcontextÚ*Nzexpected_findings_raw.jsonÚrz expected_findings_validated.jsonÚfixture_loaded)r   Ú	pr_numberÚdiff_lengthÚcontext_files_countÚhas_expected_rawÚhas_expected_validated)r,   Úpr_titleÚ	pr_authorÚdiffÚpackage_jsonÚcontext_filesÚexpected_findings_rawÚexpected_findings_validated)Ú
ValueErrorÚjoinÚkeysr   r   r   r   r   Ú	read_textÚsplitÚstripÚlstripÚintÚglobÚis_fileÚnameÚopenÚjsonÚloadÚlen)r   r   Úfixture_mapÚfixture_dirÚreadme_pathr,   r1   r2   Úreadme_contentÚlineÚpr_textÚ	diff_pathr3   Úpackage_json_pathr4   Úcontext_dirr5   Úcontext_fileÚexpected_rawÚexpected_validatedÚraw_pathÚfÚvalidated_paths                          r   Úload_fixturezFixtureLoader.load_fixture   sJ  € ð. +Ø%Ø#ñ
ˆð ˜{Ñ*ÜØ# L >ð 2Ø"Ÿi™i¨×(8Ñ(8Ó(:Ó;Ð<ð>óð ð
 ×'Ñ'¨+°lÑ*CÑCˆà×!Ñ!Ô#ÜÐ<¸[¸MÐJÓKÐKä�‰Ð%°LÄsÈ;ÓGWˆÔXð " KÑ/ˆØˆ	ØˆØˆ	à×ÑÔØ(×2Ñ2¸GÐ2ÓDˆNà&×,Ñ,¨TÓ2ò F�Ø# tÑ+à"Ÿj™jÐ)9Ó:¸2Ñ>×DÑDÓF�Gà%Ÿn™n¨SÓ1×7Ñ7Ó9�GðÜ$'¨£L™	ð " TÑ)à#Ÿz™z¨,Ó7¸Ñ;×AÑAÓC×IÑIÈ#ÓN‘HØ" dÒ*Ø $§
¡
¨=Ó 9¸"Ñ =× CÑ CÓ E‘IðFð"   ,Ñ.ˆ	Ø×"Ñ"¨GÐ"Ó4ˆð (¨.Ñ8ÐØ(×2Ñ2¸GÐ2ÓDˆð " IÑ-ˆØ(*ˆà×ÑÔØ +× 0Ñ 0°Ó 5ò `�Ø×'Ñ'Õ)Ø7C×7MÑ7MÐW^Ð7MÓ7_�M ,×"3Ñ"3Ò4ð`ð
 ˆØ!ÐàÐ!=Ñ=ˆØ�?‰?ÔÜ�h ¨gÔ6ð ,¸!Ü#Ÿy™y¨›|�÷,ð %Ð'IÑIˆØ× Ñ Ô"Ü�n c°GÔ<ð 2ÀÜ%)§Y¡Y¨q£\Ð"÷2ô 	�‰ØØ%ØÜ˜D›	Ü # MÓ 2Ø)°Ð5Ø#5¸TÐ#Að 	ô 	
ð #Ø Ø"ØØ(Ø*Ø%1Ø+=ñ	
ð 		
øôc &ò Úðú÷>,ð ,ú÷
2ð 2ús*   ÄK
È.KÉ/K&Ë
	KËKËK#Ë&K/c                 ó
   — g d¢S )zList available fixture names.r   © )r   s    r   Úlist_fixtureszFixtureLoader.list_fixtures’   s   € â$Ð$r   N)Úfixtures)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Údictr   rV   ÚlistrY   rX   r   r   r   r      sB   „ Ù9ñ	a Só 	aðt
¨ð t
°°c¸3°h±ó t
ðl%˜t C™yô %r   r   Ú_fixture_loaderr   c                  ó.   — t         €
t        «       a t         S )z-Get or create global fixture loader instance.)ra   r   rX   r   r   Úget_fixture_loaderrc   ›   s   € ô ÐÜ'›/ˆÜÐr   )r^   rD   Úpathlibr   Útypingr   Úapp.logging_configr   r[   r   r   ra   Ú__annotations__rc   rX   r   r   ú<module>rh      sL   ðòó Ý Ý å )á	�HÓ	€÷F%ñ F%ðT )-€� Ñ%Ó ,ð˜Mô r   