o
    j2                     @   s  d Z ddlZeeZddlZddlZddlZddlZddl	m	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZ ddlmZ ddlmZ ddlmZmZ ddlm Z  ddlm!Z! ddl"m#Z#m$Z$ G dd dZ%G dd dZ&G dd dZ'G dd dZ(G dd de Z)dd Z*de*e%e)j+e&e)j,e(e)j-iZ.ddd e%e)j/e&e)j0e(e)j1iZ2G dd  d e3Z4e5d!e3fi Z6e5d"e3fi Z7G d#d$ d$eZ8G d%d& d&eZ9G d'd( d(e Z:dS ))z@The ``spyne.model.binary`` package contains binary type markers.    N)mmapACCESS_READerror)	b64encode)	b64decode)urlsafe_b64encode)urlsafe_b64decode)hexlify)	unhexlify)abspathisdirisfilebasename)ValidationError)_bytes_join)ComplexModelUnicode)SimpleModel)six)BytesIOStringIOc                   @      e Zd ZdS )BINARY_ENCODING_HEXN__name__
__module____qualname__ r   r   R/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/model/binary.pyr   -       r   c                   @   r   )BINARY_ENCODING_BASE64Nr   r   r   r   r   r    .   r   r    c                   @   r   )BINARY_ENCODING_USE_DEFAULTNr   r   r   r   r   r!   /   r   r!   c                   @   r   )BINARY_ENCODING_URLSAFE_BASE64Nr   r   r   r   r   r"   0   r   r"   c                   @   s   e Zd ZdZdZdZG dd dejZdd Ze	dd	 Z
ed
d Zedd Zedd Zedd Zedd Zedd ZdS )	ByteArrayaK  Canonical container for arbitrary data. Every protocol has a different
    way of encapsulating this type. E.g. xml-based protocols encode this as
    base64, while HttpRpc just hands it over.

    Its native python format is a sequence of ``str`` objects for Python 2.x
    and a sequence of ``bytes`` objects for Python 3.x.
    base64Binary http://www.w3.org/2001/XMLSchemac                   @   s   e Zd ZeZdS )zByteArray.AttributesN)r   r   r   r!   encodingr   r   r   r   
Attributes?   s    r'   c                 K   s   d }d|v rI|d }|d u rt |d< n6|ddtfv r!d}t|d< n(|dtfv r.d}t|d< n|ddtfv r<d}t|d< ntdttjj	 f | j
d	i |}|d urX||_|S )
Nr&   base64r$   urlsafe_base64stringhex	hexBinaryz'encoding' must be one of: %rr   )r!   r    r"   r   
ValueErrortupler#   	_encodinghandlersvalues	customize__type_name__)clskwargstnvretvalr   r   r   __new__G   s*   



zByteArray.__new__c                 C   s   dS )NTr   )r4   r   r   r   
is_defaulth   s   zByteArray.is_defaultc                 C   sP   t |ttfrt |d trt|d S t |tjttfr!t|S td|S Nr       )	
isinstancelistr.   r   r   r   binary_type
memoryviewjoinr4   valuer   r   r   	to_base64l   s
   zByteArray.to_base64c                 C   s4   t | }z	t||fW S  ty   t|w N)typer   rA   	TypeErrorr   )r4   rC   joinerr   r   r   from_base64w   s   
zByteArray.from_base64c                 C   s"   t |ttfrtt|S t|S rE   )r=   r>   r.   r   r   rB   r   r   r   to_urlsafe_base64   s   zByteArray.to_urlsafe_base64c              
   C   s   t |tjr|d}zt |ttfrtt|fW S t|fW S  tyE } zt	
| t|dk r7t|t|d d d d }~ww )Nutf8d   s   (...))r=   r   	text_typeencoder>   r.   r   r   rG   logger	exceptionlenr   )r4   rC   er   r   r   from_urlsafe_base64   s   

zByteArray.from_urlsafe_base64c                 C   s   t t|S rE   )r	   r   rB   r   r   r   to_hex      zByteArray.to_hexc                 C   s   t t|fS rE   )r
   r   rB   r   r   r   from_hex   s   zByteArray.from_hexN)r   r   r   __doc__r3   __namespace__r   r'   r9   staticmethodr:   classmethodrD   rI   rJ   rS   rT   rV   r   r   r   r   r#   3   s(    !






r#   c                 C   s^   t | tjtfr
| S t | tr t| dkr t | d tr | d S t | tjr*t| d	| S r;   )
r=   r   r?   r@   r.   rQ   r   rM   r-   rA   )br   r   r   _default_binary_encoding   s   $
r\   c                 C   s   | fS rE   r   )xr   r   r   <lambda>   s    r^   c                   @   s   e Zd ZdddZdS )HybridFileStorejsonNc                 C   s>   t || _|| _|| _t| jst| j t| jsJ dS )a  Marker to be passed to File's store_as to denote a hybrid
        Sql/Filesystem storage scheme.

        :param store_path: The path where the file contents are stored. This is
            converted to an absolute path if it's not already one.
        :param db_format: The format (and the relevant column type) used to
            store file metadata. Currently only 'json' is implemented.
        N)r   store	db_formatrF   r   osmakedirs)self
store_pathrb   rF   r   r   r   __init__   s   


zHybridFileStore.__init__)r`   N)r   r   r   rg   r   r   r   r   r_      s    r_   FileTypeBinaryFileTypeTextc                       s   e Zd Z fddZ  ZS )SanitizationErrorc                    s   t t| |d d S )Nz%r was not sanitized before use)superrj   rg   )re   obj	__class__r   r   rg      s   
zSanitizationError.__init__)r   r   r   rg   __classcell__r   r   rm   r   rj      s    rj   c                   @   sL   e Zd ZdZdZdeddfdefdedd	fgZ		dddZdd Z	d
S )
_FileValuezThe class for values marked as ``File``.

    :param name: Original name of the file
    :param type: The mime type of the file's contents.
    :param data: Optional sequence of ``str`` or ``bytes`` instances
        that contain the file's data.
    	FileValuenamerK   )r&   rF   datarQ   )loggedNapplication/octet-streamFTc                 C   s   || _ 	 | j d ur|rtj| j | j kst| j d|| _|| _	 || _	 || _	 || _	 || _		 d | _
	 | jd urCt
| j| _
d S d S )Nz9File name %r should not contain any directory information)rr   rc   pathr   r   	sanitizedrF   rs   handlemover   )re   rr   rv   rF   rs   rx   ry   	_sanitizer   r   r   rg      s.   
z_FileValue.__init__c              
   C   s~  | j st| | jdur:| jdu r%t | _| jj | _| _t	| j| _nt
| jd| _| jD ]}| j| q/dS | jdurz t| jttfrP| j f| _nt| j df| _W dS W dS  ty } z|jtjkrzt| j dtdf| _n W Y d}~dS d}~ww | jdurt| jstd|  t
| jd| _t| j dtdf| _t| j| _t	| j | _| _dS td)zThis method normalizes the file object by making ``path``,
        ``name`` and ``handle`` properties consistent. It writes
        incoming data to the file object and points the ``data`` iterable
        to the contents of this file.
        Nwbr   )accesszFile path in %r not foundrbzHInvalid file object passed in. All of .data, .handle and .path are None.)rw   rj   rs   rv   tempfileNamedTemporaryFilerx   rr   r   r   openwriter=   r   r   getvaluer   fileno	MmapErrorerrnoEACCESr   r   rO   r   r-   )re   drR   r   r   r   rollover  sB   






z_FileValue.rollover)NNru   NNFT)
r   r   r   rW   r3   r   r#   
_type_inforg   r   r   r   r   r   rp      s    	
'rp   c                   @   sb   e Zd ZdZdZdZeZeZ	e
ZG dd dejZedd Zedd	 Zd
d Zedd ZdS )FilezA compact way of dealing with incoming files for protocols with a
    standard way of encoding file metadata along with binary data. (E.g. Http)
    r$   r%   c                   @   s   e Zd ZeZ	 eZ	 eZdS )zFile.AttributesN)	r   r   r   r!   r&   rp   rF   _BINARYmoder   r   r   r   r'   X  s    r'   c                 c   sl    |d u rd S |j sJ dt|j d}|d}t|dkr0t|V  |d}t|dks|  d S )NzOYou need to write data to persistent storage first if you want to read it back.r}   i@  r   )rv   r   readrQ   r(   r   close)r4   rC   frs   r   r   r   rD   l  s   

zFile.to_base64c                 C   s    |d u rd S t jt|gdS )N)rs   )r   Valuer(   r   rB   r   r   r   rI   }  s   zFile.from_base64c                 C   s   d| j | j| j| jf S )Nz(File(name=%r, path=%r, type=%r, data=%r))rr   rv   rF   rs   )re   r   r   r   __repr__  s   zFile.__repr__c                 C   s   | j |dS )N)store_as)r2   )r4   whatr   r   r   r     rU   zFile.store_asN)r   r   r   rW   r3   rX   r   BINARY_TEXTTEXTrp   r   r   r'   rZ   rD   rI   r   r   r   r   r   r   r   L  s    

r   );rW   logging	getLoggerr   rO   rc   r(   r~   r   r   r   r   r   r   r   r   r   binasciir	   r
   os.pathr   r   r   r   spyne.errorr   
spyne.utilr   spyne.modelr   r   r   r   spyne.util.sixr   r   r   r    r!   r"   r#   r\   rT   rD   rJ   binary_encoding_handlersrV   rI   rS   binary_decoding_handlersobjectr_   rF   r   r   rj   rp   r   r   r   r   r   <module>   sV   
oo