U
    4Mea.                     @   sV   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	T G dd dZ
dS )    N)quote)request)BadCredentialsException)*c                   @   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statusr5   r3   	merge_shar7   merged_by_loginmerged_by_ext_idr"   r9   r:   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"   rC   dateauthor_namerA   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+   rH   rI   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.   g   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`   m   s    
zDriver.get_repoc              
   C   sv   g }z@| j  D ]0}|| j|j< ||jt|j|j|jd qW n, t	k
rp } zt
d|W 5 d }~X Y nX |S )Nr   uS   Ошибка аутентификации на стороне сервера github)r.   Z	get_reposr
   r   rY   r   rW   r   r   r   ZCmfAuthError)r   r[   r#   er   r   r   available_reposs   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 )rK   r   rL   )r    r,   r"   )r    commitr,   r   r   ).0branchr#   r   r   
<listcomp>   s
    z'Driver.get_branches.<locals>.<listcomp>)r`   get_branchesra   r   rg   r   ri      s    

zDriver.get_branchesr,   pathsinceuntilrN   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   re   pZlocals_r   r   
<dictcomp>   s    z'Driver.iter_commits.<locals>.<dictcomp>rj   c                 S   s   g | ]
}|j qS r   )r,   rn   r   r   r   rh      s     z'Driver.iter_commits.<locals>.<listcomp>)r    r,   r"   rC   rP   rQ   rA   rR   rB   parentsr9   r:   total)localsr`   Zget_commitsr,   r   rd   rM   rN   rP   r    r/   rO   rW   r   rr   Zstatsr9   r:   rs   )	r   r!   r,   rk   rl   rm   rN   Zget_commits_kwargsrd   r   rp   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 )Nr2   r3   r4   )r    r!   r)   r;   r<   r=   r>   r?   r@   rQ   rA   rR   rB   rC   rD   r5   r3   rE   r7   Zmerged_by_namerF   Zmerged_by_emailrG   r"   r9   r:   r%   )r(   rW   r   r)   r*   r+   r#   r   r,   r-   r.   r    r/   rO   r0   r1   r3   r5   r6   r7   r8   r   r9   r:   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   rx   r`   Zget_pullrw   )r   r!   r)   rx   r#   rv   r   r   r   get_merge_request   s    
zDriver.get_merge_requestTc                    s0     |}|rdnd} fdd|j|dD S )Nr2   allc                    s   g | ]}  |qS r   )rw   )re   rv   r^   r   r   rh      s     z-Driver.get_merge_requests.<locals>.<listcomp>)r1   )r`   Z	get_pulls)r   r!   Z	only_openr#   r1   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   rS   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   rV   ZeditZcreate_hookrW   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   rV   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   staticmethodrW   r   r\   propertyr.   r`   rc   ri   r   ru   rw   ry   r{   r   r   r   r   r   r   r   r   r      sD   
L
	           
 



     
#r   )r   rS   r|   Zurllib.parser   Zflaskr   r   r   Zcmf.includer   r   r   r   r   <module>   s   