
    e<                        d 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Zddl	m
Z
 dZddlmZ  ej                  d      Z G d de      Zej$                  Zej&                  Z G d	 d
e      Z G d de      Z G d de      Z G d de      Ze G d de      ZndZ G d de      Z G d de      Z G d de      Z G d de      Zd Zd Zd Z e       Z 	 d"dZ!d"dZ"d"d Z#d"d!Z$y)#a  
MessagePack related utilities.

This module provides a few things:

#. A handy registry for getting an object down to something that can be
   msgpack serialized.  See :class:`.HandlerRegistry`.
#. Wrappers around :func:`.loads` and :func:`.dumps`. The :func:`.dumps`
   wrapper will automatically use
   the :py:attr:`~oslo_serialization.msgpackutils.default_registry` for
   you if needed.

.. versionadded:: 1.3
    N)client)timezone)importutilsnetaddrc                   B    e Zd ZdZd Zed        Zed        Zd Zd Z	y)IntervalzSmall and/or simple immutable integer/float interval class.

    Interval checking is **inclusive** of the min/max boundaries.
    c                 L    ||kD  rt        d|d|      || _        || _        y )NzMinimum value z- must be less than or equal to maximum value )
ValueError
_min_value
_max_value)self	min_value	max_values      A/usr/lib/python3/dist-packages/oslo_serialization/msgpackutils.py__init__zInterval.__init__5   s5    y @I@IK L L $#    c                     | j                   S N)r   r   s    r   r   zInterval.min_value=       r   c                     | j                   S r   )r   r   s    r   r   zInterval.max_valueA   r   r   c                 B    || j                   k\  xr || j                  k  S r   )r   r   )r   values     r   __contains__zInterval.__contains__E   s    &B5DNN+BBr   c                 <    d| j                   d| j                  dS )Nz	Interval(z, ))r   r   r   s    r   __repr__zInterval.__repr__H   s    %)__dooFFr   N)
__name__
__module____qualname____doc__r   propertyr   r   r   r    r   r   r   r   /   s@    
$    CGr   r   c                   x    e Zd ZdZ edd      Z	  edd      Z	 dZ	 dZ	 d Z	d Z
ddZd	 Zd
 ZddZd Zd Zy)HandlerRegistrya  Registry of *type* specific msgpack handlers extensions.

    See: https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext

    Do note that due to the current limitations in the msgpack python
    library we can not *currently* dump/load a tuple without converting
    it to a list.

    This may be fixed in: https://github.com/msgpack/msgpack-python/pull/100

    .. versionadded:: 1.5
    r       !      c                 .    i | _         d| _        d| _        y )Nr   F)	_handlers_num_handlersfrozenr   s    r   r   zHandlerRegistry.__init__|   s    r   c              #   `   K   | j                   j                         D ]  }|D ]  }|   yw)z*Iterates over **all** registered handlers.N)r*   values)r   handlershs      r   __iter__zHandlerRegistry.__iter__   s6     --/ 	H 	s   ,.c                 \   | j                   rt        d      |r| j                  }n| j                  }|j                  }||j
                  k  rt        d|d|j
                        ||j                  kD  rt        d|d|j                        || j                  v r9|r7| j                  |   }|j                  d|       | xj                  dz  c_	        y	|| j                  v r |st        d|d| j                  |         |g| j                  |<   | xj                  dz  c_	        y	)
z;Register a extension handler to handle its associated type.z)Frozen handler registry can't be modifiedz	Handler 'z'' identity must be greater or equal to z)' identity must be less than or equal to r      z,Already registered handler(s) with identity z: N)
r,   r
   reserved_extension_rangenon_reserved_extension_rangeidentityr   r   r*   insertr+   )r   handlerreservedoverrideok_intervalidentexisting_handlerss          r   registerzHandlerRegistry.register   s0   ;;HII77K;;K  ;(((292=2G2GI J J ;(((292=2G2GI J J DNN"x $u 5 $$Q0!#dnn$X3837>>%3HJ K K &-IDNN5!!#r   c                     | j                   S )z2Return how many extension handlers are registered.)r+   r   s    r   __len__zHandlerRegistry.__len__   s    !!!r   c                     || j                   v S )z=Return if any handler exists for the given identity (number).)r*   )r   r6   s     r   r   zHandlerRegistry.__contains__   s    4>>))r   c                 \    t        |              }| j                  j                         D ]i  \  }}g }|D ]0  }t        |d      r|j	                  |      }|j                  |       2 ||j                  |<   |xj                  t        |      z  c_        k |s| j                  rd|_        |S )z0Deep copy the given registry (and its handlers).copyT)	typer*   itemshasattrrC   appendr+   lenr,   )r   unfreezecr<   r/   cloned_handlersr0   s          r   rC   zHandlerRegistry.copy   s    DJL#~~335 	4OE8 O *1f%q	A&&q)* "1AKKOOs?33O	4 DKKAHr   c                 H    | j                   j                  |      }|r|d   S y)z9Get the handler for the given numeric identity (or none).r   N)r*   get)r   r6   maybe_handlerss      r   rM   zHandlerRegistry.get   s)    ++H5 "!$$r   c                     | j                   j                         D ]%  }|D ]  }t        ||j                        s|c c S  ' y)z<Match the registries handlers to the given object (or none).N)r*   r.   
isinstancehandles)r   objpossible_handlersr0   s       r   matchzHandlerRegistry.match   sF    !%!6!6!8 	& c199-H	 r   N)FF)F)r   r   r    r!   r   r4   r5   r   r   r   r1   r>   r@   r   rC   rM   rT   r#   r   r   r%   r%   R   sn      (2 $,B#4  I I
$>"*r   r%   c                   J    e Zd ZdZej
                  fZed        Zed        Z	y)UUIDHandlerr   c                 J    t        | j                        j                  d      S )Nascii)strhexencoderR   s    r   	serializezUUIDHandler.serialize   s    377|""7++r   c                 D    t        j                  t        | d            S )NrX   )encoding)rZ   )uuidUUIDrY   datas    r   deserializezUUIDHandler.deserialize   s    yyS899r   N)
r   r   r    r6   r`   ra   rQ   staticmethodr]   rd   r#   r   r   rV   rV      s8    HyylG, , : :r   rV   c                   B    e Zd ZdZej                  fZd Zd Zd Zd Z	y)DateTimeHandlerr3   c                     || _         y r   	_registryr   registrys     r   r   zDateTimeHandler.__init__   	    !r   c                 $     t        |       |      S r   rD   rk   s     r   rC   zDateTimeHandler.copy       tDz(##r   c                 `   |j                   |j                  |j                  |j                  |j                  |j
                  |j                  d}|j                  r<t        rt        |j                        }n|j                  j                  d       }||d<   t        || j                        S )Ndaymonthyearhourminutesecondmicrosecondtzrl   )rs   rt   ru   rv   rw   rx   ry   tzinfozoneinforY   tznamedumpsrj   )r   dtdctrz   s       r   r]   zDateTimeHandler.serialize   s    66XXGGGGiiii>>
 99^YY%%d+CIS4>>22r   c           
         t        || j                        }d|v r;t        d |j                         D              }d|v r|d   j	                  d      |d<   t        j
                  |d   |d   |d   |d	   |d
   |d   |d         }d|v rV|d   rQt        r,t        j                  |d         }|j                  |      }|S t        |d         }|j                  |      }|S )Nr{      dayc              3   H   K   | ]  \  }}|j                  d       |f  ywrX   Ndecode.0kvs      r   	<genexpr>z.DateTimeHandler.deserialize.<locals>.<genexpr>  "     F$!Q)1-F    "rz   rX   rs   rt   ru   rv   rw   rx   ry   rr   )r|   )loadsrj   dictrE   r   datetimer}   ZoneInforeplacer   localize)r   blobr   r   r|   s        r   rd   zDateTimeHandler.deserialize   s    D4>>2S= F#))+FFCs{I,,W5D	3u:%(\$'K$'K&)(m&)(m+.}+=? 3;3t9!**3t95ZZvZ. 	 "#d),__R(	r   N)
r   r   r    r6   r   rQ   r   rC   r]   rd   r#   r   r   rg   rg      s)    H  "G"$3$r   rg   c                   J    e Zd ZdZej
                  fZed        Zed        Z	y)CountHandler   c                 .   t        |       } | j                  d      dz   }| j                  d      }| || j                  d      }t	        |      dk(  rt        |d         }d}nt        |d         }t        |d         }t        j                  ||g      S )N(r3   r   ,r   )rY   findrfindsplitrH   intmsgpackpackb)rR   startendpiecessteps        r   r]   zCountHandler.serialize  s     #h!iinU3%%c*v;!q	NEDq	NEvay>D}}eT]++r   c                 b    t        j                  |       }|\  }}t        j                  ||      S r   )r   unpackb	itertoolscount)rc   r   r   r   s       r   rd   zCountHandler.deserialize.  s*    %tud++r   N)
r   r   r    r6   r   r   rQ   re   r]   rd   r#   r   r   r   r     s9    H G, , , ,r   r   c                   J    e Zd ZdZej
                  fZed        Zed        Z	y)NetAddrIPHandler   c                 @    t        j                  | j                        S r   )r   r   r   r\   s    r   r]   zNetAddrIPHandler.serialize:  s    ==++r   c                 R    t         j                  t        j                  |             S r   )r   	IPAddressr   r   rb   s    r   rd   zNetAddrIPHandler.deserialize>  s    $$W__T%:;;r   N)
r   r   r    r6   r   r   rQ   re   r]   rd   r#   r   r   r   r   6  s;    $$&		, 
	, 
	< 
	<r   r   c                   .    e Zd ZdZefZd Zd Zd Zd Z	y)
SetHandler   c                     || _         y r   ri   rk   s     r   r   zSetHandler.__init__I  rm   r   c                 $     t        |       |      S r   ro   rk   s     r   rC   zSetHandler.copyL  rp   r   c                 B    t        t        |      | j                        S )Nr{   )r   listrj   )r   rR   s     r   r]   zSetHandler.serializeO  s    T#Y88r   c                 V     | j                   d   t        || j                              S )Nr   r{   )rQ   r   rj   )r   rc   s     r   rd   zSetHandler.deserializeR  s"    t||AuTDNNCDDr   N)
r   r   r    r6   setrQ   r   rC   r]   rd   r#   r   r   r   r   E  s#    HfG"$9Er   r   c                       e Zd ZdZefZy)FrozenSetHandler   N)r   r   r    r6   	frozensetrQ   r#   r   r   r   r   V  s    HlGr   r   c                   B    e Zd Zej                  fZdZd Zd Zd Z	d Z
y)XMLRPCDateTimeHandler   c                 $    t        |      | _        y r   )rg   _handlerrk   s     r   r   zXMLRPCDateTimeHandler.__init___  s    '1r   c                 $     t        |       |      S r   ro   rk   s     r   rC   zXMLRPCDateTimeHandler.copyb  rp   r   c                     t        j                   t        |j                               d d  }| j                  j	                  |      S )Nr   )r   tuple	timetupler   r]   )r   rR   r   s      r   r]   zXMLRPCDateTimeHandler.serializee  s9    cmmo 6r :;}}&&r**r   c                 ~    | j                   j                  |      }t        j                  |j	                               S r   )r   rd   	xmlrpclibDateTimer   )r   r   r   s      r   rd   z!XMLRPCDateTimeHandler.deserializei  s-    ]]&&t,!!",,.11r   N)r   r   r    r   r   rQ   r6   r   rC   r]   rd   r#   r   r   r   r   [  s)    !!#GH2$+2r   r   c                   B    e Zd ZdZej
                  fZd Zd Zd Z	d Z
y)DateHandler   c                     || _         y r   ri   rk   s     r   r   zDateHandler.__init__r  rm   r   c                 $     t        |       |      S r   ro   rk   s     r   rC   zDateHandler.copyu  rp   r   c                 x    |j                   |j                  |j                  d}t        || j                        S )Nru   rt   rs   r{   )ru   rt   rs   r   rj   )r   dr   s      r   r]   zDateHandler.serializex  s1    FFWW55

 S4>>22r   c                     t        || j                        }d|v r t        d |j                         D              }t	        j
                  |d   |d   |d         S )Nr{   r   c              3   H   K   | ]  \  }}|j                  d       |f  ywr   r   r   s      r   r   z*DateHandler.deserialize.<locals>.<genexpr>  r   r   ru   rt   rs   r   )r   rj   r   rE   r   date)r   r   r   s      r   rd   zDateHandler.deserialize  sT    D4>>2S=F#))+FFC}}#f+#&w<!$U- 	-r   N)r   r   r    r6   r   r   rQ   r   rC   r]   rd   r#   r   r   r   r   n  s'    H}}G"$3-r   r   c                     | j                  |      }|!t        dt        |      j                  z        t	        j
                  |j                  |j                  |            S )Nz1No serialization handler registered for type '%s')rT   r
   rD   r   r   ExtTyper6   r]   )rl   rR   r8   s      r   _serializerr     s^    nnS!G *-1#Y-?-?A B 	B??7++W->->s-CDDr   c                 v    | j                  |      }|st        j                  ||      S |j                  |      S r   )rM   r   r   rd   )rl   coderc   r8   s       r   _unserializerr     s5    ll4 GtT**""4((r   c                     t               } | j                  t        |       d       | j                  t        |       d       | j                  t	               d       | j                  t               d       | j                  t        |       d       | j                  t        |       d       t        | j                  t               d       | j                  t        |       d       d| _        | S )NT)r9   )r%   r>   rg   r   rV   r   r   r   r   r   r   r,   r{   s    r   _create_default_registryr     s     Hoh/$?k(+d;kmd3lnt4j*T:&x04@*,t<+H5EHOOr   c                     |t         }t        j                  t        |      }t	        j
                  | |d      j                         S )zmDeserialize ``fp`` into a Python object.

    .. versionchanged:: 1.5
       Added *registry* parameter.
    Fext_hookraw)default_registry	functoolspartialr   r   Unpackerunpack)fprl   r   s      r   loadr     sA     #   9HBu=DDFFr   c                 t    |t         }t        j                  | |t        j                  t
        |      d      S )zSerialize ``obj`` as a messagepack formatted stream to ``fp``.

    .. versionchanged:: 1.5
       Added *registry* parameter.
    Tdefaultuse_bin_type)r   r   packr   r   r   )rR   r   rl   s      r   dumpr     s7     #<<R ) 1 1+x H%)+ +r   c                 r    |t         }t        j                  | t        j                  t
        |      d      S )zzSerialize ``obj`` to a messagepack formatted ``str``.

    .. versionchanged:: 1.5
       Added *registry* parameter.
    Tr   )r   r   r   r   r   r   )rR   rl   s     r   r   r     s5     #==!*!2!2;!I&*, ,r   c                 v    |t         }t        j                  t        |      }t	        j
                  | |d      S )zDeserialize ``s`` messagepack ``str`` into a Python object.

    .. versionchanged:: 1.5
       Added *registry* parameter.
    Fr   )r   r   r   r   r   r   )srl   r   s      r   r   r     s4     #  9H??1xU;;r   r   )%r!   r   r   r   r`   xmlrpcr   r   r   pytzr   r}   
oslo_utilsr   
try_importr   objectr   PackExceptionUnpackExceptionr%   rV   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r   r   <module>r      s        &   "
 +
 
 
+Gv G> %%)){f {|
:& 
::f :z,6 ,6 
<6 
< E E"z 
2F 2&-& -:E) ,- "G
+
,	<r   