U
    (ĥcQ-                     @   sB   d dl Z d dlZd dlZd dlmZ d dlmZ G dd dZdS )    N)quote)requestc                   @   s   e Zd ZdZd%ddZeedddZdd	 Ze	d
d Z
dd Zdd Zdd Zd&eeejejedddZedd Zd'ddZd(ddZedd Zdd Zd)d!d"Zd*d#d$ZdS )+Driveru   
    Важно не спамить API запросами, т.к. есть ограничения.
    Кешируем всё что можно.
    Nc                 C   s&   ddl m} ||| _i | _d | _d S )Nr   )Github)githubr   api_repos_user)selftokenr    r   ./modules/git/github.py__init__   s    
zDriver.__init__sc                 C   s"   | o t j | ddt jjS )NZz+00:00)datetimeZfromisoformatreplaceZ
astimezonetimezoneZutcr   r   r   r   _parse_datetime   s    zDriver._parse_datetimec                 C   s  t tj}tjd }tjd }tjd }tjd }|d }td| d| d| d	| d
|d  
 d|d t|d |d |d dg g g d}|d}|r|d |d t|d |d |d d |d d d |d d |d d |d d d |d d |do|d d |do2|d d |d |d dkrJdn|d  rXd nd!|d" |d  |d# | 	|d$ |d%o|d% d |d%o|d% d |d |d& |d' |d( d) |d|d*|d+  }	}
}|	rD|
rD|rD|	
d,rD|	d,dd-}	|d. |	||d/k|d  d0t|	dd1 d2 |d(g }|D ]Z}|d( |d |d |d3 |d4 | 	|d5 |d6 d7 |d6 d8|d6 d9 d: qT|S );NzX-Github-EventzX-Github-Hook-Idz&X-Github-Hook-Installation-Target-Typez$X-Github-Hook-Installation-Target-Id
repositoryz%Github.process_webhook_request: hook=z	, target=(z	), event=z, repo_name=	full_name idhtml_urldefault_branchnameext_idurlr   )Zresponserepobranchescommitsmerge_requestspull_requestr$   titlenumberheadrefr!   shabaseuserloginbodystateopenmergedclosed	mergeablemerge_commit_sha	merged_at	merged_by	additions	deletionsr#   )r   r   r'   head_branch_name	head_repohead_shabase_branch_name	base_repobase_shaauthor_loginauthor_ext_idtextstatusr3   r1   	merge_shar5   merged_by_loginmerged_by_ext_idr    r7   r8   r#   beforeafterzrefs/heads/   r"   Z(0000000000000000000000000000000000000000/tree/Zsafe)r   r*   Zdeletedr    r    messageZ	timestampauthorr   Zusernameemail)r   r*   r    rA   dateauthor_namer?   author_email)jsonloadsr   dataZheadersprintstrgetappendr   
startswithr   r   )r
   Z	hook_dataZeventZhook_idZtarget_typeZ	target_idZ	repo_dataresultZpr_datar)   rF   rG   r#   Zcommit_datar   r   r   process_webhook_request   s    



$ 
 






"""     

zDriver.process_webhook_requestc                 C   s   | j s| j | _ | j S N)r	   r   Zget_userr
   r   r   r   r,   e   s    zDriver.userc                 C   s.   t |}|| jkr$| j|| j|< | j| S r[   )intr   r   get_repor
   r   r   r   r   r^   k   s    
zDriver.get_repoc                 C   sD   g }| j  D ]0}|| j|j< ||jt|j|j|jd q|S )Nr   )	r,   Z	get_reposr   r   rW   r   rU   r   r   )r
   rY   r!   r   r   r   available_reposq   s      
zDriver.available_reposc                    s    |  |  fdd  D S )Nc              
      s4   g | ],}|j |jj j d t|j dd dqS )rI   r   rJ   )r   r*   r    )r   commitr*   r   r   ).0branchr!   r   r   
<listcomp>}   s
    z'Driver.get_branches.<locals>.<listcomp>)r^   get_branchesr_   r   rd   r   rf   {   s    

zDriver.get_branchesr*   pathsinceuntilrL   c           	      #   s   t    fdddD }| |jf |D ]}|j|j|j|jj|jjj|jrV|jj	p^|jjj	|joj|jj
|jrx|jjp|jjj|jot|jjdd |jD |jj|jj|jjdV  q*d S )Nc                    s   i | ]} | r| | qS r   r   rb   pZlocals_r   r   
<dictcomp>   s    z'Driver.iter_commits.<locals>.<dictcomp>rg   c                 S   s   g | ]
}|j qS r   )r*   rk   r   r   r   re      s     z'Driver.iter_commits.<locals>.<listcomp>)r   r*   r    rA   rN   rO   r?   rP   r@   parentsr7   r8   total)localsr^   Zget_commitsr*   r   ra   rK   rL   rN   r   r-   rM   rU   r   ro   Zstatsr7   r8   rp   )	r
   r   r*   rh   ri   rj   rL   Zget_commits_kwargsra   r   rm   r   iter_commits   s&    
     zDriver.iter_commitsc                 C   s   | j t| j| j| jj| jjj| jj| j	j| j	jj| j	j| j
oD| j
j| j
oP| j
j| j
o\| j
j| j
oh| j
j| j| jdkrzdn| jrdnd| j| j| j| j| jo| jj| jo| jj| jo| jj| jo| jj| j| j| j| jdS )Nr0   r1   r2   )r   r   r'   r9   r:   r;   r<   r=   r>   rO   r?   rP   r@   rA   rB   r3   r1   rC   r5   Zmerged_by_namerD   Zmerged_by_emailrE   r    r7   r8   r#   )r&   rU   r   r'   r(   r)   r!   r   r*   r+   r,   r   r-   rM   r.   r/   r1   r3   r4   r5   r6   r   r7   r8   r#   )mrr   r   r   _mr2dict   s8    zDriver._mr2dictc                 C   sF   ddl m} | |}z||}W n |k
r:   Y d S X | |S )Nr   )UnknownObjectException)r   ru   r^   Zget_pullrt   )r
   r   r'   ru   r!   rs   r   r   r   get_merge_request   s    
zDriver.get_merge_requestTc                    s0     |}|rdnd} fdd|j|dD S )Nr0   allc                    s   g | ]}  |qS r   )rt   )rb   rs   r\   r   r   re      s     z-Driver.get_merge_requests.<locals>.<listcomp>)r/   )r^   Z	get_pulls)r
   r   Z	only_openr!   r/   r   r\   r   get_merge_requests   s    
zDriver.get_merge_requestsc                 C   s   dt j|  S )Nz&git_webhook_name=)urllibparser   )webhook_namer   r   r   _webhook_name_url_tag   s    zDriver._webhook_name_url_tagc                 C   s<   |  |}| |}| D ]}||jd kr|  S qd S )Nr    )r|   r^   Z	get_hooksconfig)r
   r   r{   tagr!   hookr   r   r   _get_webhook_by_name   s
    

zDriver._get_webhook_by_nameFc              	   K   s   |  |}| ||}	dddddg}
|| |7 }t|d|r@dndd	}|	r|	j|ksht|	jt|
krtd
|	j d|	j d| d|
  |	jd||
d n"td| d|
  |	d||
}	t
|	jS )Npushr%   Zcreatedeleter   rQ   10)r    Zcontent_typeinsecure_sslz-github driver: webhook config differ github: , z	 != eva: Zweb)eventszgithub: create webhook )r^   r   r|   dictr}   setr   rT   ZeditZcreate_hookrU   r   )r
   r   Zwebhook_urlr{   r   Zsecretwebhook_ext_id_kwargsr!   r   Zwebhook_eventsZwebhook_configr   r   r   setup_webhook   s    
zDriver.setup_webhookc                 K   s<   |  ||}|r8td|j d|j d|j  |  d S )Nzgithub: delete webhook(z) r   )r   rT   r   r}   r   r   )r
   r   r{   r   r   r   r   r   r   cleanup_webhook   s     zDriver.cleanup_webhook)N)NNNNN)N)T)FNN)NN)__name__
__module____qualname____doc__r   staticmethodrU   r   rZ   propertyr,   r^   r`   rf   r   rr   rt   rv   rx   r|   r   r   r   r   r   r   r   r   	   sD   
L

	           
 



     
#r   )r   rQ   ry   Zurllib.parser   Zflaskr   r   r   r   r   r   <module>   s
   