U
    dRf%                     @   sh   d dl mZ d dlZd dlZd dlZd dlZe ZG dd deZ	G dd deZ
G dd de
ZdS )	    )absolute_importNc                   @   s8   e Zd ZdZdZdZdZeZdd Zdd Z	d	d
 Z
dS )VersionMixinz-Mixin class to handle version compatibilitiesr         c                 C   s   | j | _d| _d S )NF)DEFAULT_VERSIONcurrent_versionis_upgradedself r   F/tmp/pip-unpacked-wheel-jqs7l_7o/thriftpy2/contrib/tracking/tracker.pyinit_version_mixin   s    zVersionMixin.init_version_mixinc                 C   s
   | j |kS N)r   )r
   Zfeature_versionr   r   r   check_version   s    zVersionMixin.check_versionc                 C   s,   d| _ tj|  kr| jkr(n n|| _d S )NT)r   r   CURRENTr   )r
   Ztarget_versionr   r   r   upgrade_version   s    zVersionMixin.upgrade_versionN)__name__
__module____qualname____doc__r   ZVERSION_SUPPORT_REQUEST_HEADERZVERSION_SUPPORT_RESPONSE_HEADERr   r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zd!ddZdd Zdd Zdd	 Zd
d Zdd Ze	e
jd"ddZe	e
jdd Ze	e
jdd Ze	dd Zedd Zedd Zdd Zdd Zdd  ZdS )#TrackerBaseNc                 C   s   || _ || _d S r   )clientserver)r
   r   r   r   r   r   __init__#   s    zTrackerBase.__init__c                 C   s   |t _dt _d S )Nr   )ctxheadercounterr
   r   r   r   r   handle'   s    zTrackerBase.handlec                 C   s   d S r   r   r
   Zresponse_headerr   r   r   handle_response_header+   s    z"TrackerBase.handle_response_headerc                 C   s   |   |_ttdsdt_t jd7  _ttdrTdjtjjtjd|_tjj|_ni |_t	tj|_ttdr~|j
tj d S )Nr   r   r   r   z{prev_seq}.{cur_counter})Zprev_seqZcur_countermeta)get_request_id
request_idhasattrr   r   formatr   seqr!   strupdater   r   r   r   
gen_header.   s    


 
zTrackerBase.gen_headerc                 C   s   t tdrtj|_t`d S Nresponse_meta)r$   r   r+   r!   r   r   r   r   gen_response_headerA   s    
zTrackerBase.gen_response_headerc                 C   s   d S r   r   r
   r   	exceptionr   r   r   recordF   s    zTrackerBase.recordr   c                 c   s4   t tdsdt_tj}|t_z
dV  W 5 |t_X dS )zWContext for manually setting counter of seq number.

        :init: init value
        r   r   N)r$   r   r   )clsinitoldr   r   r   r   I   s    

zTrackerBase.counterc                 k   s   |t _zt jV  W 5 t `X d S r   )r   
annotation)r0   kwargsr   r   r   annotate[   s    zTrackerBase.annotatec                 k   sX   t tdr:ttj}tj| ztjV  W 5 |t_X n|t_ztjV  W 5 t`X d S )Nr!   )r$   r   copyr!   r(   )r0   kwdsZold_dictr   r   r   add_metad   s    

zTrackerBase.add_metac                 K   s$   t tdrtj| n|t_tjS r*   )r$   r   r+   r(   )r0   r7   r   r   r   add_response_metau   s    
zTrackerBase.add_response_metac                 C   s0   t tdrtjjni }t tdr,|tj |S )Nr   r!   )r$   r   r   r!   r(   )r
   r!   r   r   r   r!      s    
zTrackerBase.metac                 C   s   t tdrtjS i S )Nr3   )r$   r   r3   r	   r   r   r   r3      s    zTrackerBase.annotationc                 C   s   t tdrtjjS tt S )Nr   )r$   r   r   r#   r'   uuidZuuid4r	   r   r   r   r"      s    
zTrackerBase.get_request_idc                 C   s   d S r   r   r
   Zhandshake_objr   r   r   init_handshake_info   s    zTrackerBase.init_handshake_infoc                 C   s   d S r   r   r;   r   r   r   handle_handshake_info   s    z!TrackerBase.handle_handshake_info)NN)r   )r   r   r   r   r   r    r)   r,   r/   classmethod
contextlibcontextmanagerr   r5   r8   r9   propertyr!   r3   r"   r<   r=   r   r   r   r   r   "   s0   

	

r   c                   @   s   e Zd Zdd ZdS )ConsoleTrackerc                 C   s   t | d S r   )printr-   r   r   r   r/      s    zConsoleTracker.recordN)r   r   r   r/   r   r   r   r   rB      s   rB   )
__future__r   r6   r?   	threadingr:   localr   objectr   r   rB   r   r   r   r   <module>   s   t