
    3jS                         d 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
  G d d      Z e       Zej                  Zej                  Zej                  Z G d d      Z G d	 d
e      Zej%                  ej                          G d de      Zej%                  ej                         ej%                  ej(                         ej%                  ej*                          G d de      Zej%                   e ej0                  d                    G d de      Zej%                  ej4                          G d d      Z G d de      Zej%                  ej:                          G d de      Z ej>                         Z ej%                  e jB                          G d de      Z"e"j%                  ejF                         y)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`.

    N   )utilc                   (    e Zd Zd ZddZddZd Zy)Registryc                      i | _         i | _        y N)	_handlers_base_handlersselfs    @/DATA/.local/lib/python3.12/site-packages/jsonpickle/handlers.py__init__zRegistry.__init__   s         Nc                     | j                   j                  |      }|Gt        j                  |      r2| j                  j                         D ]  \  }}t        ||      s|c S  ||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.
        )r	   getr   is_typer
   items
issubclass)r   cls_or_namedefaulthandlerclsbase_handlers         r   r   zRegistry.get   sh     ..$$[1?t||K8%)%8%8%>%>%@!\k3/'' &A "/w6w6r   c                      |	 fd}|S t        j                        st        d      |x j                  t        j                        <    j                  <   r| j
                  <   yy)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                 0    j                  |        | S )N)r   base)register)handler_clsr   r   r   s    r   	_registerz$Registry.register.<locals>._registerA   s    c;TB""r   z is not a class/type)r   r   	TypeErrorr	   importable_namer
   )r   r   r   r   r   s   `` ` r   r   zRegistry.register.   sy    " ?# ||C sg%9:;; KRQt++C01DNN34G'.D$ r   c                     | j                   j                  |d        | j                   j                  t        j                  |      d        | j                  j                  |d        y r   )r	   popr   r!   r
   r   r   s     r   
unregisterzRegistry.unregisterO   sK    3%4//4d;T*r   r   )NF)__name__
__module____qualname__r   r   r   r%    r   r   r   r      s    !7$/B+r   r   c                   4    e Zd Zd Zd Zd Zed        Zd Zy)BaseHandlerc                     || _         y)z
        Initialize a new handler to handle a registered type.

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

        Ncontextr   r.   s     r   r   zBaseHandler.__init__\   s     r   c                 2    t        d| j                  z        )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datas      r   flattenzBaseHandler.flattenf   s     ""F"WXXr   c                 2    t        d| j                  z        )z}
        Restore an object of the registered type from the json-friendly
        representation `obj` and return it.
        z"You must implement restore() in %sr1   )r   r5   s     r   restorezBaseHandler.restoreq   s    
 ""F"WXXr   c                 2    t         j                  ||        |S )z
        Register this handler for the given class. Suitable as a decorator,
        e.g.::

            @MyCustomHandler.handles
            class MyCustomClass:
                def __reduce__(self):
                    ...
        )registryr   r$   s     r   handleszBaseHandler.handlesx   s     	#t$
r   c                     || _         | S )zThis permits registering either Handler instances or classes

        :Parameters:
          - `context`: reference to pickler/unpickler
        r-   r/   s     r   __call__zBaseHandler.__call__   s     r   N)	r&   r'   r(   r   r7   r9   classmethodr<   r>   r)   r   r   r+   r+   [   s,    	YY  r   r+   c                       e Zd ZdZd Zd Zy)ArrayHandlerz'Flatten and restore array.array objectsc                     |j                   |d<   | j                  j                  |j                         d      |d<   |S )NtypecodeFresetvalues)rC   r.   r7   tolistr4   s      r   r7   zArrayHandler.flatten   s8    <<Z--cjjl%-HXr   c                     |d   }| j                   j                  |d   d      }|dk(  r|D cg c]  }t        |       }}t        j                  ||      S c c}w )NrC   rF   FrD   c)r.   r9   bytesarray)r   r6   rC   rF   xs        r   r9   zArrayHandler.restore   s^    
#%%d8nE%Bs?(./1eAhF/{{8V,, 0s   ANr&   r'   r(   __doc__r7   r9   r)   r   r   rA   rA      s    1
-r   rA   c                       e Zd ZdZd Zd Zy)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                 `   | j                   }|j                  s+t        |d      r|j                         }|S t	        |      }|S |j                         \  }}|j                  }t        j                  |d         }|g|dd  D 	cg c]  }	 ||	d       c}	z   } ||d      |f|d<   |S c c}	w )N	isoformatr   r   FrD   
__reduce__)	r.   unpicklablehasattrrR   strrS   r7   r   	b64encode)
r   r5   r6   picklerresultr   argsr7   payloadis
             r   r7   zDatetimeHandler.flatten   s    ,,""sK( M SMNN$	T//..a)yT!"XFXGAU3XFF%c7>\ Gs   B+c           
         |d   \  }}| j                   }|j                  } ||d      }t        j                  |d         }|ft	        |dd  D cg c]  } ||d       c}      z   } |j
                  |g| S c c}w )NrS   FrD   r   r   )r.   r9   r   	b64decodetuple__new__)	r   r6   r   rZ   	unpicklerr9   valuer\   paramss	            r   r9   zDatetimeHandler.restore   s    &	TLL	##c'tAw'EDH"MHq71E#:H"MNNs{{3((( #Ns   A>
NrM   r)   r   r   rP   rP      s    )r   rP   c                       e Zd ZdZd Zd Zy)RegexHandlerz1Flatten _sre.SRE_Pattern (compiled regex) objectsc                 $    |j                   |d<   |S Npattern)rh   r4   s      r   r7   zRegexHandler.flatten   s    ++Yr   c                 2    t        j                  |d         S rg   )recompiler   r6   s     r   r9   zRegexHandler.restore   s    zz$y/**r   NrM   r)   r   r   re   re      s    ;+r   re    c                       e Zd ZdZd Zd Zy)QueueHandlerzOpaquely serializes Queue objects

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

    c                     |S r   r)   r4   s      r   r7   zQueueHandler.flatten   s    r   c                 *    t        j                         S r   )queueQueuerl   s     r   r9   zQueueHandler.restore   s    {{}r   NrM   r)   r   r   ro   ro      s    r   ro   c                   :    e Zd ZdZd Zej
                  fdZd Zy)CloneFactoryzASerialization proxy for collections.defaultdict's default_factoryc                     || _         y r   exemplar)r   rx   s     r   r   zCloneFactory.__init__   s	     r   c                 &     || j                         S )z>Create new instances by making copies of the provided exemplarrw   )r   clones     r   r>   zCloneFactory.__call__   s    T]]##r   c                 <    dt        |       dd| j                   dS )Nz<CloneFactory object at 0xrL   z (z)>)idrx   r   s    r   __repr__zCloneFactory.__repr__   s!    +BtHQ<r$--KKr   N)r&   r'   r(   rN   r   copyr>   r}   r)   r   r   ru   ru      s    K! "YY $Lr   ru   c                       e Zd ZdZd Zd Zy)UUIDHandlerzSerialize uuid.UUID objectsc                 $    |j                   |d<   |S Nhex)r   r4   s      r   r7   zUUIDHandler.flatten   s    ggUr   c                 2    t        j                  |d         S r   )uuidUUIDrl   s     r   r9   zUUIDHandler.restore   s    yye%%r   NrM   r)   r   r   r   r      s    %&r   r   c                       e Zd ZdZd Zd Zy)LockHandlerz Serialize threading.Lock objectsc                 ,    |j                         |d<   |S )Nlocked)r   r4   s      r   r7   zLockHandler.flatten	  s    Xr   c                 r    t        j                         }|j                  dd      r|j                          |S )Nr   F)	threadingLockr   acquire)r   r6   locks      r   r9   zLockHandler.restore  s*    ~~88He$LLNr   NrM   r)   r   r   r   r     s    *r   r   c                       e Zd ZdZd Zd Zy)TextIOHandlerz>Serialize file descriptors as None because we cannot roundtripc                      y r   r)   r4   s      r   r7   zTextIOHandler.flatten  s    r   c                     t        d      )z>Restore should never get called because flatten() returns Nonez+Restoring IO.TextIOHandler is not supported)AssertionErrorrl   s     r   r9   zTextIOHandler.restore  s    JKKr   NrM   r)   r   r   r   r     s    HLr   r   )$rN   rK   r~   datetimeiorr   rj   r   r   rm   r   r   r;   r   r%   r   r+   rA   r<   rP   datetimere   typerk   ro   rs   ru   r   r   r   r   _lockr3   r   TextIOWrapperr)   r   r   <module>r      s      	  	   ;+ ;+| :  
ll2 2j-; -    U[[ !)k )D   )) *    &    &+; +   T*"**R.) *;    U[[ !L L&+ &   DII +  		   EOO $LK L   b&& 'r   