o
    tBh!                     @   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 ddl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 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   j/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/jsonpickle/handlers.py__init__   s   
zRegistry.__init__Nc                 C   sT   | j |}|du r"t|r"| j D ]\}}t||r!|  S q|du r(|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   cls_or_namedefaulthandlerclsbase_handlerr   r   r   r      s   

zRegistry.getFc                    sd   |du r fdd}|S t std| jt < j<  r0|j< dS 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)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   /   s   
zRegistry.registerc                 C   s4   | j |d  | j t|d  | j|d  d S r	   )r
   popr   r!   r   r   r   r   r   r   
unregisterP   s   zRegistry.unregisterr	   )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dd Ze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
   || _ | S )zThis permits registering either Handler instances or classes

        :Parameters:
          - `context`: reference to pickler/unpickler
        r)   r+   r   r   r   __call__g   s   zBaseHandler.__call__c                 C      t d| j )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 %sNotImplementedError	__class__r   objdatar   r   r   flattenp   s   	zBaseHandler.flattenc                 C   r-   )z}
        Restore an object of the registered type from the json-friendly
        representation `obj` and return it.
        z"You must implement restore() in %sr.   )r   r2   r   r   r   restore{   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   handles   s   zBaseHandler.handlesN)	r%   r&   r'   r   r,   r4   r5   classmethodr7   r   r   r   r   r(   \   s    
	r(   c                   @       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*   r4   tolistr1   r   r   r   r4      s   
zArrayHandler.flattenc                 C   s>   |d }| j j|d dd}|dkrdd |D }t||S )Nr;   r>   Fr<   cc                 S   s   g | ]}t |qS r   )bytes).0xr   r   r   
<listcomp>   s    z(ArrayHandler.restore.<locals>.<listcomp>)r*   r5   array)r   r3   r;   r>   r   r   r   r5      s
   zArrayHandler.restoreNr%   r&   r'   __doc__r4   r5   r   r   r   r   r:      s    r:   c                   @   r9   )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| }|S t|}|S | \}}|j t	|d }|g fdd|dd  D  } |dd|f|d< |S )	N	isoformatr   c                       g | ]} |d dqS Fr<   r   rB   ir4   r   r   rD          z+DatetimeHandler.flatten.<locals>.<listcomp>r   Fr<   
__reduce__)
r*   unpicklablehasattrrI   r   ustrrP   r4   r   	b64encode)r   r2   r3   picklerresultr   argspayloadr   rN   r   r4      s   

 zDatetimeHandler.flattenc                    sh   |d \}}| j }|j  |dd}t|d }|ft fdd|dd  D  }|j|g|R  S )NrP   Fr<   r   c                    rJ   rK   r   rL   r5   r   r   rD      rO   z+DatetimeHandler.restore.<locals>.<listcomp>r   )r*   r5   r   	b64decodetuple__new__)r   r3   r   rW   	unpicklervalueparamsr   rY   r   r5      s   $zDatetimeHandler.restoreNrF   r   r   r   r   rH      s    rH   c                   @   r9   )RegexHandlerz1Flatten _sre.SRE_Pattern (compiled regex) objectsc                 C      |j |d< |S Npattern)rc   r1   r   r   r   r4         
zRegexHandler.flattenc                 C      t |d S rb   )recompiler   r3   r   r   r   r5         zRegexHandler.restoreNrF   r   r   r   r   r`          r`    c                   @   r9   )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 r	   r   r1   r   r   r   r4         zQueueHandler.flattenc                 C   s
   t j S r	   )r   queueQueuerh   r   r   r   r5         
zQueueHandler.restoreNrF   r   r   r   r   rl      s    rl   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 r	   exemplar)r   rs   r   r   r   r      rp   zCloneFactory.__init__c                 C   s
   || j S )z>Create new instances by making copies of the provided exemplarrr   )r   cloner   r   r   r,      s   
zCloneFactory.__call__c                 C   s   d t| | jS )Nz$<CloneFactory object at 0x{:x} ({})>)r    idrs   r   r   r   r   __repr__   s   zCloneFactory.__repr__N)r%   r&   r'   rG   r   copyr,   rv   r   r   r   r   rq      s
    rq   c                   @   r9   )UUIDHandlerzSerialize uuid.UUID objectsc                 C   ra   Nhex)rz   r1   r   r   r   r4      rd   zUUIDHandler.flattenc                 C   re   ry   )uuidUUIDrh   r   r   r   r5     ri   zUUIDHandler.restoreNrF   r   r   r   r   rx      rj   rx   c                   @   r9   )LockHandlerz Serialize threading.Lock objectsc                 C   s   |  |d< |S )Nlocked)r~   r1   r   r   r   r4     s   zLockHandler.flattenc                 C   s    t  }|ddr|  |S )Nr~   F)	threadingLockr   acquire)r   r3   lockr   r   r   r5     s   zLockHandler.restoreNrF   r   r   r   r   r}     rj   r}   c                   @   r9   )TextIOHandlerz>Serialize file descriptors as None because we cannot roundtripc                 C   s   d S r	   r   r1   r   r   r   r4     rm   zTextIOHandler.flattenc                 C   s   t d)z>Restore should never get called because flatten() returns Nonez+Restoring IO.TextIOHandler is not supported)AssertionErrorrh   r   r   r   r5      s   zTextIOHandler.restoreNrF   r   r   r   r   r     s    r   )      ),rG   
__future__r   r   r   rE   rw   datetimeiorf   sysr   r{   rk   r   r   objectr   r6   r   r$   r   r(   r:   r7   rH   datetimer`   typerg   rl   rn   ro   rq   rx   r|   r}   r   _lockr0   r   version_infoTextIOWrapperr   r   r   r   <module>   sL    	>5#
