
    7|h/"                         d dl Z d dlmZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZ d dlZd dlmZ d dlmZ d dlmZmZmZ d dlmZ  G d	 d
eee      Z G d de      Z G d dee      Zy)    N)ABC)datetime)AnyCallableDictIteratorListLiteralOptionalUnionDocumentget_from_dict_or_env)	BaseModelfield_validatormodel_validator)
BaseLoaderc                       e Zd ZU dZeed<   	 eed<   	 dZeed<   	  ed      ede	d	e
fd
              Zed	e	eef   fd       Zy)BaseGitHubLoaderz Load `GitHub` repository Issues.repoaccess_tokenzhttps://api.github.comgithub_api_urlbefore)modevaluesreturnc                 &    t        |dd      |d<   |S )z1Validate that access token exists in environment.r   GITHUB_PERSONAL_ACCESS_TOKENr   )clsr   s     j/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/document_loaders/github.pyvalidate_environmentz%BaseGitHubLoader.validate_environment   s"     "6N$B"
~     c                 &    dd| j                    dS )Nzapplication/vnd.github+jsonzBearer )AcceptAuthorization)r   selfs    r!   headerszBaseGitHubLoader.headers!   s"     4&t'8'8&9:
 	
r#   N)__name__
__module____qualname____doc__str__annotations__r   r   classmethodr   r   r"   propertyr)    r#   r!   r   r      ss    *
IR2NC2(#$ 3   $ 
c3h 
 
r#   r   c                      e Zd ZU dZdZeed<   	 dZee	e
d   df   ed<   	 dZee
d      ed<   	 dZee   ed	<   	 dZee   ed
<   	 dZee   ed<   	 dZeee      ed<   	 dZee
d      ed<   	 dZee
d      ed<   	 dZee   ed<   	 dZee	   ed<   	 dZee	   ed<   	  ed      edee   dee   fd              Zdee   fdZdedefdZe defd       Z!e defd       Z"y)GitHubIssuesLoaderz#Load issues of a GitHub repository.Tinclude_prsN)*none	milestone)openclosedallstateassigneecreator	mentionedlabels)createdupdatedcommentssort)ascdesc	directionsincepageper_pagevr   c                 r    |r	 t        j                  |d       |S |S # t        $ r t        d|       w xY w)Nz%Y-%m-%dT%H:%M:%SZz\Invalid value for 'since'. Expected a date string in YYYY-MM-DDTHH:MM:SSZ format. Received: )r   strptime
ValueError)r    rK   s     r!   validate_sincez!GitHubIssuesLoader.validate_sinceL   sV     !!!%9: q   >>?SB s    6c              #     K   | j                   }|rt        j                  || j                        }|j	                          |j                         }|D ]3  }| j                  |      }| j                  s|j                  d   r0| 5 |j                  rF|j                  j                  d      r+| j                  s| j                  s|j                  d   d   }nd}|ryyw)a  
        Get issues of a GitHub repository.

        Returns:
            A list of Documents with attributes:
                - page_content
                - metadata
                    - url
                    - title
                    - creator
                    - created_at
                    - last_update_time
                    - closed_time
                    - number of comments
                    - state
                    - labels
                    - assignee
                    - assignees
                    - milestone
                    - locked
                    - number
                    - is_pull_request
        r)   is_pull_requestnexturlN)rT   requestsgetr)   raise_for_statusjsonparse_issuer5   metadatalinksrI   rJ   )r(   rT   responseissuesissuedocs         r!   	lazy_loadzGitHubIssuesLoader.lazy_loadY   s     0 "XX||C>H%%']]_F &&u-''CLL9J,K		 NN&&v.4==nnV,U3! s   CC#!C#r^   c                     |d   |d   |d   d   |d   |d   |d   |d   D cg c]  }|d	   	 c}|d
   r|d
   d   nd|d   r|d   d   nd|d   |d   d|v d}|d   |d   nd}t        ||      S c c}w )z5Create Document objects from a list of GitHub issues.html_urltitleuserlogin
created_atrC   r<   r@   namer=   Nr8   lockednumberpull_request)rT   rc   r>   rf   rC   r<   r@   r=   r8   rh   ri   rR   body page_contentrZ   r   )r(   r^   labelrZ   contents        r!   rY   zGitHubIssuesLoader.parse_issue   s     $7^V}W--j)7^27/BuV}B6;J6Gj)'2T8=k8J{+G4PTHoHo-6
 $)=#<%-"Wx@@ Cs   A4c                    | j                   rdj                  | j                         n| j                   }| j                  | j                  | j                  | j
                  | j                  || j                  | j                  | j                  | j                  | j                  d}|j                         D cg c]  \  }}|	| d|  }}}dj                  |      }|S c c}}w )z'Create query parameters for GitHub API.,)r8   r<   r=   r>   r?   r@   rD   rG   rH   rI   rJ   =&)r@   joinr8   r<   r=   r>   r?   rD   rG   rH   rI   rJ   items)r(   r@   query_params_dictkrK   query_params_listquery_paramss          r!   rz   zGitHubIssuesLoader.query_params   s     +/++$++&4;;ZZ||IIZZII
 $5#:#:#<
1aqc1#J
 
 xx 12	
s   9
C#	C#c                 R    | j                    d| j                   d| j                   S )zCreate URL for GitHub API./repos/z/issues?)r   r   rz   r'   s    r!   rT   zGitHubIssuesLoader.url   s-     %%&gdii[ARAR@STTr#   )#r*   r+   r,   r-   r5   boolr/   r8   r   intr
   r<   r   r=   r.   r>   r?   r@   r	   rD   rG   rH   rI   rJ   r   r0   rO   r   r   r`   dictrY   r1   rz   rT   r2   r#   r!   r4   r4   )   s   -KJ8<IuS'+.45< 9=E8G345<H"Hhsm"P!GXc]!4#Ix}#9"&FHT#Y&;@DD(7;<
=D!26Ix./6ME8C=ID(3-,"Hhsm"- W	x} 	# 	  	)8H- )VA A( A& c  , US U Ur#   r4   c                   p    e Zd ZU dZdZeed<   eeege	f      ed<   de
e   fdZdedefdZdee   fd	Zy
)GithubFileLoaderzLoad GitHub Filemainbranchfile_filterr   c                 H   | j                    d| j                   d| j                   d}t        j                  || j
                        }|j                          |j                         d   }	 |D cg c]$  }| j                  r| j                  |d         r|& c}S c c}w )Nr|   z/git/trees/z?recursive=1rQ   treepath)	r   r   r   rU   rV   r)   rW   rX   r   )r(   base_urlr\   	all_filesfs        r!   get_file_pathszGithubFileLoader.get_file_paths   s    ""#7499+[{{m<) 	 <<$,,?!!#MMOF+		 
$$T-=-=ai-H 
 	
 
s   3)Br   c                    | j                   rd| j                    nd}| j                   d| j                   d| | }t        j                  || j
                        }|j                          t        |j                         t              r7|j                         d   }t        j                  |      j                  d      S y)Nz?ref=rl   r|   z
/contents/rQ   rp   zutf-8)r   r   r   rU   rV   r)   rW   
isinstancerX   r   base64	b64decodedecode)r(   r   queryparamsr   r\   content_encodeds         r!   get_file_content_by_pathz)GithubFileLoader.get_file_content_by_path   s    /3{{dkk]+""#7499+Zvk]S 	 <<$,,?!!#hmmot,&mmoi8O##O4;;GDDr#   c              #     K   | j                         }|D ]i  }| j                  |d         }|dk(  r|d   |d   | j                   d| j                   d|d    d| j                   d|d    	d}t        ||       k y w)Nr   rl   sha/type)r   r   sourcerm   )r   r   r   r   r   r   )r(   filesfilerp   rZ   s        r!   r`   zGithubFileLoader.lazy_load   s     ##% 	DD33DLAG"} VE{!001499+QtF|nA;;-qf0H (CC	Ds   B BN)r*   r+   r,   r-   r   r.   r/   r   r   r}   r	   r   r   r   r   r   r`   r2   r#   r!   r   r      s[    FC(C5$;/00
T
 
.S S D8H- Dr#   r   )r   abcr   r   typingr   r   r   r   r	   r
   r   r   rU   langchain_core.documentsr   langchain_core.utilsr   pydanticr   r   r   )langchain_community.document_loaders.baser   r   r4   r   r2   r#   r!   <module>r      s\       P P P  - 5 @ @ @
z9c 
6HU) HUV9D' 9Dr#   