Ë
    ¥©	jO  ã                   ó†   — U d Z ddlZddlZddlZddlmZ ddl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)
zc
GitHub API client for fetching PR data.
Supports both authenticated and unauthenticated requests.
é    N)ÚAny)Ú
get_loggerc            
       ó‚   — e Zd ZdZddedz  fd„Zdeeef   fd„Zedede	eee
f   fd„«       Zd	ed
ede
deeef   fd„Zy)ÚGitHubClientzÕ
    GitHub API client for fetching PR data.
    
    Fetches:
    - PR metadata (title, author, number)
    - Diff content
    - package.json (if exists)
    - Context files (files imported by changed files)
    NÚtokenc                 óØ   — ddl m} |xs# |j                  xs t        j                  d«      | _        d| _        d| _        t        j                  dt        | j
                  «      ¬«       y )Nr   )ÚsettingsÚGITHUB_TOKENzhttps://api.github.comg      >@Úgithub_client_initialized)Úauthenticated)Ú
app.configr	   Úgithub_tokenÚosÚgetenvr   Úbase_urlÚtimeoutÚloggerÚinfoÚbool)Úselfr   r	   s      ú:/var/www/html/prparty/backend/app/clients/github_client.pyÚ__init__zGitHubClient.__init__   sS   € Ý'ØÒP˜h×3Ñ3ÒP´r·y±yÀÓ7PˆŒ
Ø0ˆŒØˆŒä�‰Ø'Ü˜tŸz™zÓ*ð 	õ 	
ó    Úreturnc                 óL   — dddœ}| j                   rd| j                   › �|d<   |S )z$Get headers for GitHub API requests.zapplication/vnd.github.v3+jsonzPR-Party-Bot)ÚAcceptz
User-Agentztoken ÚAuthorization)r   )r   Úheaderss     r   Ú_get_headerszGitHubClient._get_headers'   s4   € ð 7Ø(ñ
ˆð �:Š:Ø)/°·
±
¨|Ð'<ˆG�OÑ$Øˆr   Úurlc                 ó¢  — | j                  «       j                  d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  d| «      }|r"|j                  «       \  }}}||t        |«      fS t        j                  d| «      }|r"|j                  «       \  }}}||t        |«      fS t        d| › d�«      ‚)	aŒ  
        Parse GitHub PR URL into owner, repo, and PR number.
        
        Supports formats:
        - https://github.com/owner/repo/pull/123
        - github.com/owner/repo/pull/123
        - owner/repo/pull/123
        - owner/repo#123
        
        Returns:
            Tuple of (owner, repo, pr_number)
        
        Raises:
            ValueError: If URL format is invalid
        ú/z
^https?://Ú z^github\.com/z^([^/]+)/([^/]+)/pull/(\d+)$z^([^/]+)/([^/#]+)#(\d+)$zInvalid GitHub PR URL format: z2. Expected: https://github.com/owner/repo/pull/123)ÚstripÚrstripÚreÚsubÚmatchÚgroupsÚintÚ
ValueError)r    r(   ÚownerÚrepoÚpr_nums        r   Úparse_pr_urlzGitHubClient.parse_pr_url1   sÏ   € ð$ �i‰i‹k× Ñ  Ó%ˆÜ�f‰f�] B¨Ó,ˆÜ�f‰fÐ% r¨3Ó/ˆô —‘Ð8¸#Ó>ˆÙØ"'§,¡,£.ÑˆE�4˜Ø˜$¤ F£Ð+Ð+ô —‘Ð4°cÓ:ˆÙØ"'§,¡,£.ÑˆE�4˜Ø˜$¤ F£Ð+Ð+äØ,¨S¨Eð 2?ð ?ó
ð 	
r   r,   r-   Ú	pr_numberc              ƒ   ób  K  — t         j                  d|||¬«       | j                  «       }t        j                  | j
                  ¬«      4 ƒd{  –—† }| j                  › d|› d|› d|› �}t         j                  d|¬	«       |j                  ||¬
«      ƒ d{  –—† }|j                  «        |j                  «       }|d   }	|d   d   }
t         j                  d|	|
¬«       |› d�}i |¥ddi¥}t         j                  d|¬	«       |j                  ||¬
«      ƒ d{  –—† }|j                  «        |j                  }|j                  «       j                  d«      s\t         j                  d|j                  j                  d«      |dd ¬«       t!        d|j                  j                  d«      ›d�«      ‚t         j                  dt#        |«      ¬«       d}	 | j                  › d|› d|› d�}t         j                  d|¬	«       |j                  ||¬
«      ƒ d{  –—† }|j$                  dk(  rM|j                  «       }t'        j(                  |d    «      j+                  d!«      }t         j                  d"«       nt         j                  d#«       i }||	|
|||d&œ}t         j                  d'|t#        |«      |dk7  ¬(«       |cddd«      ƒd{  –—†  S 7 �Œ‡7 �ŒA7 �ŒÀ7 ŒÁ# t,        $ r*}t         j/                  d$t1        |«      ¬%«       Y d}~Œ|d}~ww xY w7 ŒF# 1 ƒd{  –—†7  sw Y   yxY w­w))a0  
        Fetch PR data from GitHub API.
        
        Args:
            owner: Repository owner
            repo: Repository name
            pr_number: Pull request number
        
        Returns:
            Dict with:
            - pr_number: int
            - pr_title: str
            - pr_author: str
            - diff: str (git diff)
            - package_json: str (JSON string, "{}" if not found)
            - context_files: dict[str, str] (empty for now)
        
        Raises:
            httpx.HTTPStatusError: If API request fails
        Úfetching_pr_from_github)r,   r-   r0   )r   Nz/repos/r"   z/pulls/Úfetching_pr_metadata)r    )r   ÚtitleÚuserÚloginÚpr_metadata_fetched)r4   Úauthorz.diffr   zapplication/vnd.github.v3.diffÚfetching_diffz
diff --gitÚdiff_response_not_a_diffzcontent-typeéÈ   )Úcontent_typeÚbody_previewzCGitHub returned a non-diff payload for the .diff URL (content-type=z0). This usually means an Accept header override.Údiff_fetched)Ú
size_bytesz{}z/contents/package.jsonÚfetching_package_jsonÚcontentzutf-8Úpackage_json_fetchedÚpackage_json_not_foundÚpackage_json_fetch_failed)Úerror)r0   Úpr_titleÚ	pr_authorÚdiffÚpackage_jsonÚcontext_filesÚpr_fetch_complete)r0   Ú	diff_sizeÚhas_package_json)r   r   r   ÚhttpxÚAsyncClientr   r   ÚdebugÚgetÚraise_for_statusÚjsonÚtextÚlstripÚ
startswithrE   r   ÚRuntimeErrorÚlenÚstatus_codeÚbase64Ú	b64decodeÚdecodeÚ	ExceptionÚwarningÚstr)r   r,   r-   r0   r   ÚclientÚpr_urlÚpr_responseÚpr_datarF   rG   Údiff_urlÚdiff_headersÚdiff_responserH   rI   Úpkg_urlÚpkg_responseÚpkg_dataÚerJ   Úresults                         r   Úfetch_przGitHubClient.fetch_prX   s:  è ø€ ô4 	�‰Ø%ØØØð	 	ô 	
ð ×#Ñ#Ó%ˆä×$Ñ$¨T¯\©\Ô:÷ R	ð R	¸fàŸ™� g¨e¨W°A°d°V¸7À9À+ÐNˆFÜ�L‰LÐ/°VˆLÔ<à &§
¡
¨6¸7 
Ó C×CˆKØ×(Ñ(Ô*Ø!×&Ñ&Ó(ˆGà˜wÑ'ˆHØ ™¨Ñ0ˆIä�K‰KØ%ØØ ð ô ð !˜ Ð'ˆHØR˜gÐR xÐ1QÑRˆLÜ�L‰L˜¨hˆLÔ7à"(§*¡*¨X¸| *Ó"L×LˆMØ×*Ñ*Ô,Ø ×%Ñ%ˆDà—;‘;“=×+Ñ+¨LÔ9Ü—‘Ø.Ø!.×!6Ñ!6×!:Ñ!:¸>Ó!JØ!% d s ð ô ô
 #ð%Ø%2×%:Ñ%:×%>Ñ%>¸~Ó%NÐ$Qð RDðDóð ô �K‰K˜´3°t³9ˆKÔ=ð  ˆLðJØ!Ÿ]™]˜O¨7°5°'¸¸4¸&Ð@VÐW�Ü—‘Ð4¸'�ÔBà%+§Z¡Z°À ZÓ%I×I�Ø×+Ñ+¨sÒ2Ø+×0Ñ0Ó2�Hä#)×#3Ñ#3°H¸YÑ4GÓ#H×#OÑ#OÐPWÓ#X�LÜ—K‘KÐ 6Õ7ä—K‘KÐ 8Ô9ð -/ˆMð 'Ø$Ø&ØØ ,Ø!.ñˆFô �K‰KØ#Ø#Ü˜d›)Ø!-°Ñ!5ð	 ô ð ÷eR	÷ R	ò R	ùð
 Dùð, Mùð0  Jùô ò JÜ—‘Ð:Ä#ÀaÃ&�×IÑIûðJúðwR	ø÷ R	÷ R	ñ R	üs­   ‚AL/ÁKÁL/ÁALÂKÂBLÄKÄB=LÇAK"ÈK ÈA5K"Ê1LËL/ËLËL/ËLËLË K"Ë"	LË+ LÌLÌLÌLÌL/ÌL,Ì L#Ì!L,Ì(L/)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r_   r   Údictr   ÚstaticmethodÚtupler*   r/   r   rl   © r   r   r   r      s‘   „ ññ	
˜c D™jó 	
ð˜d 3¨ 8™nó ð ð$
˜#ð $
 %¨¨S°#¨Ñ"6ò $
ó ð$
ðLuàðuð ðuð ð	uð
 
ˆc�3ˆh‰ôur   r   Ú_github_clientr   c                  ó.   — t         €
t        «       a t         S )z,Get or create global GitHub client instance.)ru   r   rt   r   r   Úget_github_clientrw   Ô   s   € ô ÐÜ%›ˆÜÐr   )rp   rZ   r   r&   Útypingr   rN   Úapp.logging_configr   rm   r   r   ru   Ú__annotations__rw   rt   r   r   ú<module>r{      sR   ðòó Û 	Û 	Ý ã å )á	�HÓ	€÷|ñ |ð@ '+€�˜tÑ#Ó *ð˜<ô r   