B t1` !@sdZddlmZmZmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZGdddeZeZejZejZejZGd d d eZGd d d eZeejGd ddeZeejeejeejGdddeZeee dGdddeZeej j!GdddeZ"GdddeZ#e#e j$GdddeZ%e &Z'e%e'j(GdddeZ)e j*dkre)ej+dS)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_importdivisionunicode_literalsN)compat)utilc@s0eZdZddZd ddZd ddZd d ZdS) RegistrycCsi|_i|_dS)N) _handlers_base_handlers)selfr 7/tmp/pip-unpacked-wheel-wy5q9vwy/jsonpickle/handlers.py__init__szRegistry.__init__NcCsT|j|}|dkrDt|rDx$|jD]\}}t||r*|Sq*W|dkrP|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 getris_typer items issubclass)r Z cls_or_namedefaulthandlerclsZ base_handlerr r r rs  z Registry.getFcs`|dkrfdd}|Sts4td|jt<j<r\|j<dS)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 Ncsj|d|S)N)rbase)register)Z handler_cls)rrr r r _registerBsz$Registry.register.._registerz{!r} is not a class/type)rr TypeErrorformatr importable_namer )r rrrrr )rrr r r/s zRegistry.registercCs4|j|d|jt|d|j|ddS)N)r poprrr )r rr r r unregisterPszRegistry.unregister)N)NF)__name__ __module__ __qualname__rrrrr r r r rs  !rc@s8eZdZddZddZddZddZed d Zd S) BaseHandlercCs ||_dS)z Initialize a new handler to handle a registered type. :Parameters: - `context`: reference to pickler/unpickler N)context)r r"r r r r]szBaseHandler.__init__cCs ||_|S)zThis permits registering either Handler instances or classes :Parameters: - `context`: reference to pickler/unpickler )r")r r"r r r __call__gszBaseHandler.__call__cCstd|jdS)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 objdatar r r flattenps zBaseHandler.flattencCstd|jdS)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 restore{szBaseHandler.restorecCst|||S)z Register this handler for the given class. Suitable as a decorator, e.g.:: @MyCustomHandler.handles class MyCustomClass: def __reduce__(self): ... )registryr)r rr r r handless zBaseHandler.handlesN) rrr rr#r(r) classmethodr+r r r r r!\s    r!c@s eZdZdZddZddZdS) ArrayHandlerz'Flatten and restore array.array objectscCs&|j|d<|jj|dd|d<|S)NtypecodeF)resetvalues)r.r"r(tolist)r r&r'r r r r(s zArrayHandler.flattencCs>|d}|jj|ddd}|dkr2dd|D}t||S)Nr.r0F)r/ccSsg|] }t|qSr )bytes).0xr r r sz(ArrayHandler.restore..)r"r)array)r r'r.r0r r r r)s zArrayHandler.restoreN)rrr __doc__r(r)r r r r r-sr-c@s eZdZdZddZddZdS)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. cs|j}|js.t|dr |}n t|}|S|\}}|jt |d}|gfdd|ddD}|dd|f|d<|S) N isoformatrcsg|]}|ddqS)F)r/r )r4i)r(r r r6sz+DatetimeHandler.flatten..rF)r/ __reduce__) r"Z unpicklablehasattrr:rZustrr<r(r b64encode)r r&r'Zpicklerresultrargspayloadr )r(r r(s     zDatetimeHandler.flattencsf|d\}}|j}|j|dd}t|d}|ftfdd|ddD}|j|f|S)Nr<F)r/rcsg|]}|ddqS)F)r/r )r4r;)r)r r r6sz+DatetimeHandler.restore..r)r"r)r b64decodetuple__new__)r r'rr@Z unpicklervalueparamsr )r)r r)s  $zDatetimeHandler.restoreN)rrr r8r(r)r r r r r9sr9c@s eZdZdZddZddZdS) RegexHandlerz1Flatten _sre.SRE_Pattern (compiled regex) objectscCs|j|d<|S)Npattern)rH)r r&r'r r r r(s zRegexHandler.flattencCst|dS)NrH)recompile)r r'r r r r)szRegexHandler.restoreN)rrr r8r(r)r r r r rGsrGc@s eZdZdZddZddZdS) QueueHandlerzOpaquely serializes Queue objects Queues contains mutex and condition variables which cannot be serialized. Construct a new Queue instance when restoring. cCs|S)Nr )r r&r'r r r r(szQueueHandler.flattencCs tjS)N)rqueueQueue)r r'r r r r)szQueueHandler.restoreN)rrr r8r(r)r r r r rLsrLc@s.eZdZdZddZejfddZddZdS) CloneFactoryzASerialization proxy for collections.defaultdict's default_factorycCs ||_dS)N)exemplar)r rPr r r rszCloneFactory.__init__cCs ||jS)z>Create new instances by making copies of the provided exemplar)rP)r cloner r r r#szCloneFactory.__call__cCsdt||jS)Nz$)ridrP)r r r r __repr__szCloneFactory.__repr__N)rrr r8rcopyr#rSr r r r rOsrOc@s eZdZdZddZddZdS) UUIDHandlerzSerialize uuid.UUID objectscCs|j|d<|S)Nhex)rV)r r&r'r r r r(s zUUIDHandler.flattencCst|dS)NrV)uuidUUID)r r'r r r r)szUUIDHandler.restoreN)rrr r8r(r)r r r r rUsrUc@s eZdZdZddZddZdS) LockHandlerz Serialize threading.Lock objectscCs||d<|S)Nlocked)rZ)r r&r'r r r r( s zLockHandler.flattencCs t}|ddr||S)NrZF) threadingLockracquire)r r'lockr r r r)s zLockHandler.restoreN)rrr r8r(r)r r r r rYsrYc@s eZdZdZddZddZdS) TextIOHandlerz>Serialize file descriptors as None because we cannot roundtripcCsdS)Nr )r r&r'r r r r(szTextIOHandler.flattencCs tddS)z>Restore should never get called because flatten() returns Nonez+Restoring IO.TextIOHandler is not supportedN)AssertionError)r r'r r r r) szTextIOHandler.restoreN)rrr r8r(r)r r r r r_sr_)),r8 __future__rrrr7rTdatetimeiorIsysr[rWrKrrobjectrr*rrrr!r-r+r9datetimerGtyperJrLrMrNrOrUrXrYr\_lockr%r_ version_info TextIOWrapperr r r r  sH  >5 #