B
    |b !                 @   s  d Z ddlmZmZmZ ddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZmZ G dd deZe ZejZejZejZG dd	 d	eZG d
d deZeej G dd deZeej eej eej G dd deZeee	d G dd deZeej j! G dd deZ"G dd deZ#e#ej$ G dd deZ%e& Z'e%e'j( G dd deZ)e
j*dkre)ej+ dS )a  
Custom handlers may be created to handle other objects. Each custom handler
must derive from :class:`jsonpickle.handlers.BaseHandler` and
implement ``flatten`` and ``restore``.

A handler can be bound to other types by calling
:func:`jsonpickle.handlers.register`.

    )absolute_importdivisionunicode_literalsN   )compatutilc               @   s0   e Zd Zdd ZdddZdddZd	d
 ZdS )Registryc             C   s   i | _ i | _d S )N)	_handlers_base_handlers)self r   2lib/python3.7/site-packages/jsonpickle/handlers.py__init__   s    zRegistry.__init__Nc             C   sT   | j |}|dkrDt|rDx$| j D ]\}}t||r*|S q*W |dkrP|S |S )a\  
        :param cls_or_name: the type or its fully qualified name
        :param default: default value, if a matching handler is not found

        Looks up a handler by type reference or its fully
        qualified name. If a direct match
        is not found, the search is performed over all
        handlers registered with base=True.
        N)r	   getr   is_typer
   items
issubclass)r   Zcls_or_namedefaulthandlerclsZbase_handlerr   r   r   r      s    

zRegistry.getFc                s`   |dkr fdd}|S t s4td| jt < j<  r\|j< dS )a,  Register the a custom handler for a class

        :param cls: The custom object class to handle
        :param handler: The custom handler class (if
            None, a decorator wrapper is returned)
        :param base: Indicates whether the handler should
            be registered for all subclasses

        This function can be also used as a decorator
        by omitting the `handler` argument::

            @jsonpickle.handlers.register(Foo, base=True)
            class FooHandler(jsonpickle.handlers.BaseHandler):
                pass

        Nc                s   j |  d | S )N)r   base)register)Zhandler_cls)r   r   r   r   r   	_registerB   s    z$Registry.register.<locals>._registerz{!r} is not a class/type)r   r   	TypeErrorformatr	   importable_namer
   )r   r   r   r   r   r   )r   r   r   r   r   /   s    
zRegistry.registerc             C   s4   | j |d  | j t|d  | j|d  d S )N)r	   popr   r   r
   )r   r   r   r   r   
unregisterP   s    zRegistry.unregister)N)NF)__name__
__module____qualname__r   r   r   r   r   r   r   r   r      s   

!r   c               @   s8   e Zd Zdd Zdd Zdd Zedd Zd	d
 ZdS )BaseHandlerc             C   s
   || _ dS )z
        Initialize a new handler to handle a registered type.

        :Parameters:
          - `context`: reference to pickler/unpickler

        N)context)r   r"   r   r   r   r   ]   s    zBaseHandler.__init__c             C   s   t d| j dS )a:  
        Flatten `obj` into a json-friendly form and write result to `data`.

        :param object obj: The object to be serialized.
        :param dict data: A partially filled dictionary which will contain the
            json-friendly representation of `obj` once this method has
            finished.
        z"You must implement flatten() in %sN)NotImplementedError	__class__)r   objdatar   r   r   flatteng   s    	zBaseHandler.flattenc             C   s   t d| j dS )z}
        Restore an object of the registered type from the json-friendly
        representation `obj` and return it.
        z"You must implement restore() in %sN)r#   r$   )r   r%   r   r   r   restorer   s    zBaseHandler.restorec             C   s   t ||  |S )z
        Register this handler for the given class. Suitable as a decorator,
        e.g.::

            @MyCustomHandler.handles
            class MyCustomClass:
                def __reduce__(self):
                    ...
        )registryr   )r   r   r   r   r   handlesy   s    zBaseHandler.handlesc             C   s
   || _ | S )zThis permits registering either Handler instances or classes

        :Parameters:
          - `context`: reference to pickler/unpickler
        )r"   )r   r"   r   r   r   __call__   s    zBaseHandler.__call__N)	r   r   r    r   r'   r(   classmethodr*   r+   r   r   r   r   r!   \   s
   
r!   c               @   s    e Zd ZdZdd Zdd ZdS )ArrayHandlerz'Flatten and restore array.array objectsc             C   s&   |j |d< | jj| dd|d< |S )NtypecodeF)resetvalues)r.   r"   r'   tolist)r   r%   r&   r   r   r   r'      s    
zArrayHandler.flattenc             C   s>   |d }| j j|d dd}|dkr2dd |D }t||S )Nr.   r0   F)r/   cc             S   s   g | ]}t |qS r   )bytes).0xr   r   r   
<listcomp>   s    z(ArrayHandler.restore.<locals>.<listcomp>)r"   r(   array)r   r&   r.   r0   r   r   r   r(      s
    zArrayHandler.restoreN)r   r   r    __doc__r'   r(   r   r   r   r   r-      s   r-   c               @   s    e Zd ZdZdd Zdd ZdS )DatetimeHandlerzCustom handler for datetime objects

    Datetime objects use __reduce__, and they generate binary strings encoding
    the payload. This handler encodes that payload to reconstruct the
    object.

    c                s   | j }|js.t|dr | }n
t|}|S | \}}|j t	|d }|g fdd|dd  D  } |dd|f|d< |S )	N	isoformatr   c                s   g | ]} |d dqS )F)r/   r   )r4   i)r'   r   r   r6      s    z+DatetimeHandler.flatten.<locals>.<listcomp>r   F)r/   
__reduce__)
r"   Zunpicklablehasattrr:   r   Zustrr<   r'   r   Z	b64encode)r   r%   r&   Zpicklerresultr   argsZpayloadr   )r'   r   r'      s    


 zDatetimeHandler.flattenc                sf   |d \}}| j }|j  |dd}t|d }|ft fdd|dd  D  }|j|f| S )Nr<   F)r/   r   c                s   g | ]} |d dqS )F)r/   r   )r4   r;   )r(   r   r   r6      s    z+DatetimeHandler.restore.<locals>.<listcomp>r   )r"   r(   r   Z	b64decodetuple__new__)r   r&   r   r?   Z	unpicklervalueparamsr   )r(   r   r(      s    $zDatetimeHandler.restoreN)r   r   r    r8   r'   r(   r   r   r   r   r9      s   r9   c               @   s    e Zd ZdZdd Zdd ZdS )RegexHandlerz1Flatten _sre.SRE_Pattern (compiled regex) objectsc             C   s   |j |d< |S )Npattern)rE   )r   r%   r&   r   r   r   r'      s    
zRegexHandler.flattenc             C   s   t |d S )NrE   )recompile)r   r&   r   r   r   r(      s    zRegexHandler.restoreN)r   r   r    r8   r'   r(   r   r   r   r   rD      s   rD    c               @   s    e Zd ZdZdd Zdd ZdS )QueueHandlerzOpaquely serializes Queue objects

    Queues contains mutex and condition variables which cannot be serialized.
    Construct a new Queue instance when restoring.

    c             C   s   |S )Nr   )r   r%   r&   r   r   r   r'      s    zQueueHandler.flattenc             C   s
   t j S )N)r   queueQueue)r   r&   r   r   r   r(      s    zQueueHandler.restoreN)r   r   r    r8   r'   r(   r   r   r   r   rI      s   rI   c               @   s.   e Zd ZdZdd ZejfddZdd ZdS )	CloneFactoryzASerialization proxy for collections.defaultdict's default_factoryc             C   s
   || _ d S )N)exemplar)r   rM   r   r   r   r      s    zCloneFactory.__init__c             C   s
   || j S )z>Create new instances by making copies of the provided exemplar)rM   )r   Zcloner   r   r   r+      s    zCloneFactory.__call__c             C   s   d t| | jS )Nz$<CloneFactory object at 0x{:x} ({})>)r   idrM   )r   r   r   r   __repr__   s    zCloneFactory.__repr__N)r   r   r    r8   r   copyr+   rO   r   r   r   r   rL      s   rL   c               @   s    e Zd ZdZdd Zdd ZdS )UUIDHandlerzSerialize uuid.UUID objectsc             C   s   |j |d< |S )Nhex)rR   )r   r%   r&   r   r   r   r'      s    
zUUIDHandler.flattenc             C   s   t |d S )NrR   )uuidUUID)r   r&   r   r   r   r(     s    zUUIDHandler.restoreN)r   r   r    r8   r'   r(   r   r   r   r   rQ      s   rQ   c               @   s    e Zd ZdZdd Zdd ZdS )LockHandlerz Serialize threading.Lock objectsc             C   s   |  |d< |S )Nlocked)rV   )r   r%   r&   r   r   r   r'     s    zLockHandler.flattenc             C   s    t  }|ddr|  |S )NrV   F)	threadingLockr   acquire)r   r&   lockr   r   r   r(     s    zLockHandler.restoreN)r   r   r    r8   r'   r(   r   r   r   r   rU     s   rU   c               @   s    e Zd ZdZdd Zdd ZdS )TextIOHandlerz>Serialize file descriptors as None because we cannot roundtripc             C   s   d S )Nr   )r   r%   r&   r   r   r   r'     s    zTextIOHandler.flattenc             C   s   t ddS )z>Restore should never get called because flatten() returns Nonez+Restoring IO.TextIOHandler is not supportedN)AssertionError)r   r&   r   r   r   r(      s    zTextIOHandler.restoreN)r   r   r    r8   r'   r(   r   r   r   r   r[     s   r[   )      ),r8   Z
__future__r   r   r   r7   rP   ZdatetimeiorF   sysrW   rS   rH   r   r   objectr   r)   r   r   r   r!   r-   r*   r9   ZdateZtimerD   typerG   rI   rJ   rK   rL   rQ   rT   rU   rX   _lockr$   r[   version_infoTextIOWrapperr   r   r   r   <module>	   sF   >5#