o
    i                     @   s  d Z ddlmZ ddlZeeZddlZddl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 dd
lmZ ddlmZmZmZ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%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1m2Z2 ddlm3Z3m4Z4m5Z5m6Z6m7Z7 dd Z8G dd de.Z9G dd de:Z;G dd deZ<G dd de<Z=G dd  d e<Z>G d!d" d"e>Z?G d#d$ d$e:Z@d%d& ZAd'd( ZBd)d* ZCd+d, ZDG d-d. d.eEZFd/d0 ZGd1d2 ZHd3d4 ZId5d6 ZJeEd7d8ZKd9d: ZLd;d< ZMd=d> ZNd?d@ ZOdAdB ZPG dCdD dDe1e,eQeZRdEdF ZSG dGdH dHeZTe0eRG dIdJ dJeTZUe0eRG dKdL dLeTZVG dMdN dNeVZWdOdP ZXdUdQdRZYdSdT ZZdS )VzThe ``spyne.model.complex`` module contains
:class:`spyne.model.complex.ComplexBase` class and its helper objects and
subclasses. These are mainly container classes for other simple or
complex objects -- they don't carry any data by themselves.
    )print_functionN)copy)WeakKeyDictionary)dequeOrderedDict)isclass)chain)const)PREFMAP)PointUnicodePushBase	ModelBase)PSSM_VALUES
apply_pssm)
NATIVE_MAP)AnyXml)sixmemoize
memoize_idsanitize_argsmemoize_ignore_none)YEL)Prepareableodict)add_metaclasswith_metaclassstring_types)jsonjsonbxmlmsgpacktablec                 C   sf   t |tsJ t| dd }|d urt|| || j |j| j |jdd | j	 D  |S )N__extends__c                 S   s    i | ]\}}t |tr||qS  )
issubclassXmlAttribute).0kvr%   r%   S/var/www/html/LicenciasMIG/venv/lib/python3.10/site-packages/spyne/model/complex.py
<dictcomp>C   s    z'_get_flat_type_info.<locals>.<dictcomp>)

isinstanceTypeInfogetattr_get_flat_type_infoupdate
_type_infoalt_type_info_altattrsitems)clsretvalparentr%   r%   r+   r0   <   s   
r0   c                       s(   e Zd Z fddZ fddZ  ZS )r.   c                    s0   t t| j|i | i | _t | _t | _d S N)superr.   __init__
attributesr   r3   r5   selfargskwargs	__class__r%   r+   r<   I   s   zTypeInfo.__init__c                    s$   t |tsJ tt| || d S r:   )r-   r   r;   r.   __setitem__)r?   keyvalrB   r%   r+   rD   P   s   zTypeInfo.__setitem__)__name__
__module____qualname__r<   rD   __classcell__r%   r%   rB   r+   r.   H   s    r.   c                   @   s$   e Zd Zg dZdd Zdd ZdS )_SimpleTypeInfoElementpathr9   typeis_arraycan_be_emptyc                 C   s"   || _ || _|| _|| _|| _d S r:   rL   )r?   rM   r9   type_rO   rP   r%   r%   r+   r<   X   s
   
z_SimpleTypeInfoElement.__init__c                 C   s   d| j | j| j| jf S )Nz?SimpleTypeInfoElement(path=%r, parent=%r, type=%r, is_array=%r))rM   r9   rN   rO   r?   r%   r%   r+   __repr___   s   z_SimpleTypeInfoElement.__repr__N)rG   rH   rI   	__slots__r<   rS   r%   r%   r%   r+   rK   U   s    rK   c                   @   s0   e Zd ZdddZedddZedd ZdS )	XmlModifierNc                 C   s4   |   }||_|j|_||_|jtju rtj|_|S r:   )	customizerN   
Attributes_ns__type_name__r   Empty)r7   rN   nsr8   r%   r%   r+   __new__e   s   zXmlModifier.__new__c                 C   sH   | j | j || | j| _| jd u r| j  | _| jtv r"|| _d S d S r:   )rN   resolve_namespacerX   __namespace__get_namespacer
   )r7   
default_nstagsr%   r%   r+   r]   n   s   


zXmlModifier.resolve_namespacec                 C   s   || _ d||tjf }| j}||_t||i| _dtj|tjf | _|j	}|d urJ|
 | ju rN||||tj  |j	}|d urL|
 | ju s0d S d S d S d S Nz%s_%s%s%s%s%s)r^   r	   TYPE_SUFFIXrN   rY   r.   r2   ARRAY_PREFIXARRAY_SUFFIXr$   get_type_namerZ   _fill_empty_type_namePARENT_SUFFIXr7   	parent_ns	parent_tnr)   tnchild_vextendsr%   r%   r+   rh   z   s   &z!XmlModifier._fill_empty_type_namer:   )rG   rH   rI   r\   staticmethodr]   classmethodrh   r%   r%   r%   r+   rU   d   s    
	rU   c                   @   sX   e Zd Z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 )XmlDataz9Items which are marshalled as data of the parent element.c                 C   s^   |d ur-t | jtr|| d S t|dkr!|| j||_d S || j||d _d S d S )Nr   )r&   rN   r   appendlento_bytestexttail)r7   protnamevalue
parent_eltr%   r%   r+   marshall   s   zXmlData.marshallc                 C   
   | j  S r:   )rN   rg   r7   r%   r%   r+   rg         
zXmlData.get_type_namec                 C      | j |S r:   )rN   get_type_name_nsr7   	interfacer%   r%   r+   r         zXmlData.get_type_name_nsc                 C   r~   r:   )rN   r_   r   r%   r%   r+   r_      r   zXmlData.get_namespacec                 C   r~   r:   )rN   get_element_namer   r%   r%   r+   r      r   zXmlData.get_element_namec                 C   r   r:   )rN   get_element_name_nsr   r%   r%   r+   r      r   zXmlData.get_element_name_nsN)rG   rH   rI   __doc__rq   r}   rg   r   r_   r   r   r%   r%   r%   r+   rr      s    





rr   c                       s"   e Zd ZdZd fdd	Z  ZS )r'   z?Items which are marshalled as attributes of the parent element.Nc                    s<   t t| | ||}||_|jjjdkr|jd u rd|_|S )Nr   required)r;   r'   r\   _userN   rW   
min_occurs)r7   rQ   user[   r8   rB   r%   r+   r\      s
   zXmlAttribute.__new__NN)rG   rH   rI   r   r\   rJ   r%   r%   rB   r+   r'      s    r'   c                   @   s"   e Zd ZdZdddZdd ZdS )XmlAttributeRefzReference to an Xml attribute.Nc                 C   s   || _ || _d S r:   )_refr   )r?   refr   r%   r%   r+   r<      s   
zXmlAttributeRef.__init__c                 C   s*   | d| j | jr| d| j d S d S )Nr   r   )setr   r   )r?   rz   elementappr%   r%   r+   describe   s   zXmlAttributeRef.describer:   )rG   rH   rI   r   r<   r   r%   r%   r%   r+   r      s    
r   c                   @   s0   e Zd ZdZg Zi ZdZdd Zedd Z	dS )SelfReferencezUse this as a placeholder type in classes that contain themselves. See
    :func:`spyne.test.model.test_complex.TestComplexModel.test_self_reference`.
    Nc                 C      t  r:   NotImplementedErrorrR   r%   r%   r+   r<      s   zSelfReference.__init__c                 O   sL   t t|| j}tt| | j }| jd u r| | _td| f||dS )Nr   )customize_argscustomize_kwargs)listr   r   dictr6   r   __orig__rN   )r7   r@   rA   r%   r%   r+   rV      s   
zSelfReference.customize)
rG   rH   rI   r   r   r   r   r<   rq   rV   r%   r%   r%   r+   r      s    r   c                 C   s   zt ||}W n
 ty   Y d S w zt|tpt|t}W n   d}Y |rMt|tr<t|jdkr<t	d| |f t|t
rK|jjd u rKt	d|S d S )NF   "Invalid Array definition in %s.%s.z'Please specify the number of dimensions)r   get	TypeErrorr&   r   r   Arrayru   r2   	Exceptionr   rW   dim)cls_namer)   r*   subcr%   r%   r+   _get_spyne_type   s    r   c                 C   sN   | d u r|S |d u r| S t | \}}t |\}}t|}|| || |fS r:   )r   r   r1   )xyxaxkyaykr%   r%   r+   
_join_args   s   
r   c                 C   sX   | dd }|d u r*| D ]}t|dr%G dd d|j}| }|d<  |S qtd|S )NrW   c                   @   s   e Zd ZdS )z_gen_attrs.<locals>.AttributesN)rG   rH   rI   r%   r%   r%   r+   rW     s    z$No ModelBase subclass in bases? Huh?)r   hasattrrW   r   )	cls_basescls_dictr5   brW   r%   r%   r+   
_gen_attrs  s   
r   c                 C   s0  t  }t  }|dd }|d u r|dd }|d u r t| dd }|d ur/|j}	td||	 n	|}	td||	 |	D ]^}
t|
dd }|d u rGq:t|
dddkrgtd	|
| ||
|
 d|vrfd|d< q:|d |
fvrqtd
t	|dkrt
|
tr|
 }|d< |jd u sJ d|
jj  td|
| q:d|vrt   |d< }|| g }| D ]:\}}|drqt|trt	|dkrt|||d d urttd|| t|||}|d u rq|||f q|| n|d }t|t st | }|d< t| D ]\}}|d||f q|S )Nr$   r   zGot bases for %s from orig: %rzGot bases for %s from meta: %rr2   	__mixin__FTz#Adding fields from mixin %r to '%s'zpSpyne objects do not support multiple inheritance. Use mixins if you need to reuse fields from multiple classes.r   z{You can't inherit from a customized class. You should first get your class hierarchy right, then start customizing classes.zRegistering %r as base of '%s'_r   z<There seems to be a stray comma in thedefinition of '%s.%s'.)r.   r   r/   	__bases__loggerdebugr1   get_flat_type_infor   ru   r&   r   r   get_subclassesmemoclearr6   
startswithr-   tupler   warningr   rt   reversedinsert)r7   r   r   r   r5   base_type_infomixinro   origbasesr   
base_typesr2   class_fieldsr)   r*   r%   r%   r+   _get_type_info  sj   

r   c                       s   e Zd Z fddZ  ZS )_MethodsDictc                    s    t t| j|i | d| _d S )NF)r;   r   r<   
_processedr>   rB   r%   r+   r<   h  s   
z_MethodsDict.__init__)rG   rH   rI   r<   rJ   r%   r%   rB   r+   r   g  s    r   c                 C   s   t  }| D ]8\}}|ds?t|dr?td||  | d us"J ||| d}t| ||j | jj	d ur;| j	|}|||< q|S )Nr   _is_rpcz&Registering %s as member method for %r)_default_function_name_self_ref_replacement)
r   r6   r   r   r   r   setattrfunctionrW   method_config_do)r7   r   methodsr)   r*   
descriptorr%   r%   r+   _gen_methodsn  s   r   c                 C   sd   t |ts|S d}|jd ur|j|vrd}t||j| f |jp#tj}|d u s,|dkr0t|}|S )N)randomdeclaredz5The declare_order attribute value %r is invalid in %sr   )r-   r   declare_orderr   r	   DEFAULT_DECLARE_ORDERr   )r   r   r5   SUPPORTED_ORDERSmsgr   r%   r%   r+   _get_ordered_attributes  s   


r   c                 C   s   |  dd }|jd u r||_|  dd }|jd u r||_|  dd }|jd u r*||_|  dd }t|j||_|  dd }t|j||_d S )N__tablename__	__table____metadata____mapper_args____table_args__)r   
table_name
sqla_tablesqla_metadatar   sqla_mapper_argssqla_table_args)r   r5   r   
_cls_tablemetadatamargstargsr%   r%   r+   _sanitize_sqlalchemy_parameters  s   


r   c                 C   s  |  D ]\}}t|tjstd|t|st|t|tr!qt|ts<t	| ||}|du r7t| ||f|||< nt|t
rPt|jdkrPtd| |f |jj}|jj}|du ra|du raq|dur|durd||f }||v r}td||| f ||f||< q|du r|}||v rtd||| f ||f||< q|du rd||f }||v rtd||| f ||f||< qdS )z&Make sure _type_info contents are sanezInvalid class keyNr   r   z{%s}%sz%r is already defined: %r)r6   r-   r   r   
ValueErrorr   r&   r   r   r   r   ru   r2   r   rW   sub_nssub_name)r   r2   r4   r)   r*   r   r   rE   r%   r%   r+   _sanitize_type_info  sV   






r   T)excc           
      C   s4  t |dd }|dd }t |dd }|d urx|d u r!t}nd|v r1|d tkr1td|  |t | D ]\}}d|v rKtd|  | d|d< q:|d u rW|}n!|d u r^t }| D ]\}}||v rstd|  | |||< qb|d ur|j	}t
d	|  | D ]\}}t
d
|| || jdi |||< q|jd ur|jj|d|_||j_|d ur|j	}t
d|  t| D ]\}}||v rt
d|| || jdi |||< ||= qi }	|jd ur|jj|d|_|j|j}	| D ]\}}||	vrt
d|| ||jj|< qd S d S )Nchild_attrschild_attrs_allchild_attrs_noexcr   z0Overriding child_attrs_all['exc'] to True for %rz<Overriding 'exc' for %s.%s from child_attrs_noexc with FalseFz7Overriding child_attrs for %s.%s from child_attrs_noexcz!processing child_attrs_all for %rz  child_attrs_all set %r=%r)r   zprocessing child_attrs for %rz  child_attr set %r=%r)r   z  child_attr delayed %r=%rr%   )r   r   D_EXCr   r   r1   r6   rg   r   r2   r   rV   r$   rW   _delayed_child_attrs_allr   r   _delayed_child_attrs)
r7   r8   rA   r   r   r   r)   r*   tibase_ftir%   r%   r+   _process_child_attrs  sx   






r   c                 C   sT   t | jdkst | jdkr"td|| j| j |j| ji | jS td| |S )Nr   z0Replace self reference with %r with *%r and **%rzReplace self reference with %r)ru   r   r   r   r   rV   )selfrefr7   r%   r%   r+   recust_selfref.  s   

r   c                 C   st   |j }|j}|d u r|d u rdS |d ur*tjrt|dr|j}| }t| || dS |d ur6t| || dS J d)NFim_funcTzInvalid application state)defaultdefault_factoryr   PY2r   r   r   )instrE   r7   attrdef_valdef_facdvalr%   r%   r+   _set_member_default8  s   r  c                 C   sL   t | tot|  d}t | to|jd u}|jdkot| d}|p%|p%|S )N_sa_class_managerr   )r&   r   r   get_inner_typestore_as
max_occurs)r7   r   ret1ret2ret3r%   r%   r+   _is_sqla_arrayT  s   
r  c                 C   s   t | j|d }t|tr|jd u rd S t| |||rd S t||r9|jr,t| |d  d S |j	d u r7t| |d  d S t
| jdr\|jrJt| |d  d S t|trZ|j	d u rZt| |d  d S t| |d  d S )Nr  )r/   rC   r-   propertyfsetr  r  exc_dbr   r  r   r&   ComplexModelBase)r   rE   r7   r   cls_getattr_retr%   r%   r+   _init_memberb  s(   

r  c                       s8   e Zd ZdZ fddZ fddZedd Z  ZS )ComplexModelMetazThis metaclass sets ``_type_info``, ``__type_name__`` and ``__extends__``
    which are going to be used for (de)serialization and schema generation.
    c           	         s   t ||}t|tjsJ d| t|||}|dd}|du r%||d< t| ||||}t  }|d< |D ]}t|drC|	|j
 q6t||| t|| tt| | |||S )z=This function initializes the class and registers attributes.z1%r must be a ComplexModelBase.Attributes subclassrY   Nr4   )r   r&   r  rW   r   r   r   r.   r   r1   r4   r   r   r;   r  r\   )	r7   r   r   r   r5   	type_namer2   r4   r   rB   r%   r+   r\     s&   


zComplexModelMeta.__new__c                    s  | j }| j}|d ur+| jd u r+|j}|jd u rg |_|j|  | jj|ju r+d | j_| D ]Z\ ttrB| 	 t
|  q/ttr_| jjd u rU fg| j_q/| jj f q/ttrj  \}t|tr|||j  \}t|tsot|trt
||  q/g }| j  D ]\ jjd kr|  q| j  D ]\ jjd ur|jj  qt| j t|ksJ || j  d d < | j  D ]\ jjsq҇ fdd}	 fdd}
t|  t|	|
 qt| |}t|dkr|| j_| jj}| jj}| jj}|d u r(|d ur'|j| j_ddlm} ||  n"|d urJ|d us7|d urJt| j dkrJddlm} || | t t!| "||| d S )Nc                    s
   | j   S r:   )__dict__rR   )r)   r%   r+   	_get_prop     
z,ComplexModelMeta.__init__.<locals>._get_propc                    s4   |d u st |jstd|jf || j < d S )Nz-Invalid value %r, should be an instance of %r)r-   Valuer   r  )r?   rF   r)   r*   r%   r+   	_set_prop  s
   z,ComplexModelMeta.__init__.<locals>._set_propr   )gen_spyne_info)gen_sqla_info)#r2   r$   r   rW   _subclassesrt   r6   r&   r   _replace_fieldr   rr   _xml_tag_body_asr   values_set_serializerorderr   ru   keysvalidate_on_assignmentr   r  r   r   r   r   r   r   spyne.store.relationalr  r  r;   r  r<   )r?   r   r   r   	type_inforo   eattrv2new_type_infor  r  r   rm   metatr  r  rB   r  r+   r<     sv   












zComplexModelMeta.__init__c                 K   s   t  S r:   r   )mcsrz   r   kwdsr%   r%   r+   __prepare__	     zComplexModelMeta.__prepare__)	rG   rH   rI   r   r\   r<   rq   r-  rJ   r%   r%   rB   r+   r    s    er  c                 C   s   t | tp
| jjdkS )Nr   )r&   r   rW   r  )r*   r%   r%   r+   <lambda>  s    r/  c                   @   s  e Zd ZdZdZG dd dejZdd Zdd Zd	d
 Z	dd Z
dd Zedd Zedd Zdd Zedd Zedd Zeedd Zeedd Zedd ZedGd d!ZeedHd#d$ZedId%d&Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 Z ed1d2 Z!ed3d4 Z"ed5d6 Z#ed7d8 Z$ed9d: Z%ed;d< Z&ed=d> Z'ed?d@ Z(edAdB Z)edCdD Z*edJdEdFZ+d"S )Kr  zWIf you want to make a better class type, this is what you should inherit
    from.
    Fc                   @   s   e Zd ZdZdZdef  dZ	 dZ	 dZ	 dZ		 dZ
	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZdZdZdZdZdS )zComplexModelBase.Attributesz ComplexModel-specific attributesNzMethod for serializing to persistent storage. One of %r. It makes
        sense to specify this only when this object is a child of another
        ComplexModel subclass.T)rG   rH   rI   r   r  r   r   r   r   r   sqla_mappervalidate_freqr   r   r   parent_variantr   r   not_wrappedwrapped	_variantsr  r   r   r  r%   r%   r%   r+   rW     sN    rW   c                 O   s  | j }|j}||}|jd ur td|t| tt	  |j
d urZt||j
D ].\}\}}|d urOt|dkrO|j}	t| |||	 | ||||j q+t|dkrYtdq+| D ]!\}
}|j}	|
| jvrqt| |
||	 |
|v r| |
||
 ||	 q^d S )Nze%r(0x%X) seems to be a customized class. It is not supposed to be instantiated. You have been warned.r   r   zsPositional argument is only for ComplexModels with XmlData field. You must use keyword arguments in any other case.)rC   rW   r   r   r   r   idr   	tracebackformat_stackr  zipru   r  	_safe_setr   r6   r  )r?   r@   rA   r7   cls_attrftiargxtba_key	xtba_typer   r)   r*   r%   r%   r+   r<   t  s<   





zComplexModelBase.__init__c                 C   s
   t | jS r:   )ru   r2   rR   r%   r%   r+   __len__  r  zComplexModelBase.__len__c                 C   sR   t |trg }| j | D ]}|t| |d  q|S t| | j | d }|S r:   )r-   slicer2   r"  rt   r/   )r?   ir8   rE   r%   r%   r+   __getitem__  s   
zComplexModelBase.__getitem__c                    s.   d   d fdd j jD f S )Nz%s(%s)z, c                    s2   g | ]} j |d d urd| j |f qS )Nz%s=%r)r  r   r(   r)   rR   r%   r+   
<listcomp>  s
    z-ComplexModelBase.__repr__.<locals>.<listcomp>)rg   joinrC   r   rR   r%   rR   r+   rS     s
   
zComplexModelBase.__repr__c              
   C   sT   |j rdS z	t| || W dS  ty) } zt| td| j||f d }~ww )NFzcan't set %r attribute %s to %rT)	read_onlyr   AttributeErrorr   	exceptionrC   )r?   rE   r{   r*  r5   er%   r%   r+   r:    s   

zComplexModelBase._safe_setc                 c   s6    |  |  D ]\}}t|jdd r||fV  qd S )Nprimary_key)r   r6   r/   rW   )r7   r)   r*   r%   r%   r+   get_identifiers  s   
z ComplexModelBase.get_identifiersc                 C   s   |   S r:   )rL  r   r%   r%   r+   get_primary_keys  s   z!ComplexModelBase.get_primary_keysc                    s   t  fdd  jD S )zRepresent object as dict.

        Null values are omitted from dict representation to support optional
        not nullable attributes.
        c                 3   s,    | ]}t  |d ur|t  |fV  qd S r:   )r/   rD  rR   r%   r+   	<genexpr>  s    z+ComplexModelBase.as_dict.<locals>.<genexpr>)r   r   rC   rR   r%   rR   r+   as_dict  s   
zComplexModelBase.as_dictc              
   C   s  t |ts
t |tr^| |  }t|t|ks%td| || td| }| j	dur/| j	}z| }W n t
yH } ztd||  d}~ww tt|D ]}t||| ||  qO|S t |tr| }| j	durm| j	}| }| | D ]}t||||d qu|S |}|S )a  Returns the native object corresponding to the serialized form passed
        in the ``value`` argument.

        :param value: This argument can be:
            * A list or tuple of native types aligned with cls._type_info.
            * A dict of native types.
            * The native type itself.

            If the value type is not a ``list``, ``tuple`` or ``dict``, the
            value is returned untouched.
        z
	cls: %r
	value: %r
	keys: %rz*Impossible sequence to instance conversionNzError instantiating %r: %r)r-   r   r   r   r"  ru   r   errorr   r   r   ranger   r   r   )r7   r{   r"  cls_origr   rJ  rB  r)   r%   r%   r+   get_serialization_instance  s<   



z+ComplexModelBase.get_serialization_instancec                 C   s   | j du r|  S |   S )zcGet an empty native type so that the deserialization logic can set
        its attributes.
        Nr   r7   ctxr%   r%   r+   get_deserialization_instance  s   
z-ComplexModelBase.get_deserialization_instancec                 C   s:   g }| j j}|d ur|| |D ]	}||  q|S r:   )rW   r  extendr   )r7   r8   subcar   r%   r%   r+   r     s   
zComplexModelBase.get_subclassesc                 C   s   t | t S )zReturns a _type_info dict that includes members from all base
        classes.

        It's called a "flat" dict because it flattens all members from the
        inheritance hierarchy into one dict.
        )r0   r.   r   r%   r%   r+   r     s   	z#ComplexModelBase.get_flat_type_infoc                 C   s
   | j p| S r:   rT  r   r%   r%   r+   get_orig#  r   zComplexModelBase.get_orig.c                 C   s   t j| |dS )a-  Returns a _type_info dict that includes members from all base classes
        and whose types are only primitives. It will prefix field names in
        non-top-level complex objects with field name of its parent.

        For example, given hier_delim='.'; the following hierarchy: ::

            {'some_object': [{'some_string': ['abc']}]}

        would be transformed to: ::

            {'some_object.some_string': ['abc']}

        :param hier_delim: String that will be used as delimiter between field
            names. Default is ``'.'``.
        )
hier_delim)r  get_simple_type_info_with_prot)r7   r\  r%   r%   r+   get_simple_type_info'  s   z%ComplexModelBase.get_simple_type_infoNc              	   C   s>  |  | }t }t }t }|du r-| D ]\}}|}	||f||	ft|f| f qn&| D ]!\}}||}
|
j}	|	du rC|}	||f||	ft|f| f q1|	|  t
|dkr| \}}}}}|d }t|tr}|jjdkr}|j \}||}t|trt|||t|dd||< ||vr|	| |du r| | D ]\}}|}	|||f |||	f |t|f |f qnR| | D ]'\}}||}
|
j}	|	du r|}	|||f |||	f |t|f |f qn"||d}|dur
td| ||jf t|||t|dd||< t
|dks_|S )	z/See :func:ComplexModelBase.get_simple_type_infoNr   rs   r   T)rM   r9   rQ   rO   rP   z%r.%s conflicts with %rF)r   r.   r   r   r6   rt   	_is_arrayget_cls_attrsr   addru   popleftr&   r   rW   r  r2   r  rF  r  rK   r   r   r   rM   )r7   ry   r\  r<  r8   ra   queuer)   r*   r   	cls_attrsr"  prefixrO   r9   rE   k2r'  r{   r%   r%   r+   r]  ;  s   







	


;z/ComplexModelBase.get_simple_type_info_with_protc                 C   s   |d u rt  }n| |v rdS t| ||sdS | j D ]!\}}|d u r%q|jtju r6||  | 	 | |||| q| j
d urW| j
D ]}|  |_t||  | qF| jtjus_J | jtjusgJ dS )NFT)r   r   r]   r2   r6   rY   rZ   rh   r_   rg   _force_own_namespacer^   ComplexModel)r7   r`   ra   r)   r*   cr%   r%   r+   r]     s*   



z"ComplexModelBase.resolve_namespacec                 C   s   t |tft| |t|dS )z)Lets you create a class programmatically.)r^   rY   r2   )r  rh  r   r.   )	namespacer  membersr%   r%   r+   produce  s
   

zComplexModelBase.producec           
      K   s*  t |dd}|dur||d< | jdi |\}}}| j|d< d|vr)| j|d< t|||}t| j|_| j|_| j	|_	| |j
_|j
j}|j
jdu rPi |j
_nt| |j
_|dd}|dure||_|dd}	|	durr|	|_	| tur{| | t| || tjj  tjj  tjj  |S )aT  Duplicates cls and overwrites the values in ``cls.Attributes`` with
        ``**kwargs`` and returns the new class.

        Because each class is registered as a variant of the original (__orig__)
        class, using this function to generate classes dynamically on-the-fly
        could cause memory leaks. You have been warned.
        r  NrH   r$   r  rj  r%   )r   r   _s_customizerH   r$   rN   r.   r2   rY   r^   rW   r2  r   r   r6   rh  _process_variantsr   r  r   r   r   r   r]  )
r7   rA   r  r   r   r   r8   dcarm   r[   r%   r%   r+   rV     s:   




zComplexModelBase.customizec                 C   sF   t |dd }|d ur!|jjd u rt |j_d|jj|< d |j_d S d S )Nr   T)r/   rW   r5  r   )r7   r8   r   r%   r%   r+   rn    s   
z"ComplexModelBase._process_variantsc                 C   s   t |tsJ | jj}|d ur|jdi |}| jj}|d ur1||d }|d ur1|jdi |}|| j|< tj	j
  tjj
  d S Nr%   )r-   r   rW   r   rV   r   r   r2   r  r   r   r   r]  )r7   
field_name
field_typedcaaro  d_custr%   r%   r+   _append_field_impl  s   
z#ComplexModelBase._append_field_implc                 C   .   | j jd ur| j jD ]
}||| q
d S d S r:   )rW   r5  append_fieldr7   rq  rr  ri  r%   r%   r+   _append_to_variants  
   z$ComplexModelBase._append_to_variantsc                 C      |  || | || d S r:   )ru  ry  r7   rq  rr  r%   r%   r+   rw       zComplexModelBase.append_fieldc                 C   s0   | j jd ur| j jD ]}|||| q
d S d S r:   )rW   r5  insert_field)r7   indexrq  rr  ri  r%   r%   r+   _insert_to_variants#  s
   z$ComplexModelBase._insert_to_variantsc                 C   s   t |tsJ t |tsJ | jj}|d ur|jdi |}| jj}|d ur7||v r7||}|jdi |}| j	|||f t
jj  t
jj  d S rp  )r-   intr   rW   r   rV   r   popr2   r   r  r   r   r   r]  )r7   r  rq  rr  rs  ro  rt  r%   r%   r+   _insert_field_impl)  s   
z#ComplexModelBase._insert_field_implc                 C   s    |  ||| | ||| d S r:   )r  r  r7   r  rq  rr  r%   r%   r+   r~  =  s   zComplexModelBase.insert_fieldc                 C   rv  r:   )rW   r5  r  rx  r%   r%   r+   _replace_in_variantsB  rz  z%ComplexModelBase._replace_in_variantsc                 C   s4   t |tsJ || j|< tjj  tjj  d S r:   )r-   r   r2   r  r   r   r   r]  r|  r%   r%   r+   _replace_field_implH  s   
z$ComplexModelBase._replace_field_implc                 C   r{  r:   )r  r  r|  r%   r%   r+   r  Q  r}  zComplexModelBase._replace_fieldc                 C   s   | j |dS )N)r  rV   )r7   whatr%   r%   r+   r  V  r   zComplexModelBase.store_asc                 C   s   | j ddS )NF)r1  r  r   r%   r%   r+   novalidate_freqZ  r   z ComplexModelBase.novalidate_freqc                 K   s   | j d u r| n| j  }| |  D ]@\}}z#||v r'|||| ||j nt||r8||t||||j W q tyR } zt	d|| W Y d }~qd }~ww |S )NzError setting %s: %r)
r   r   r6   r:  rW   r   r/   rH  r   r   )r7   otherrA   r8   r)   r*   rJ  r%   r%   r+   	init_from^  s   
zComplexModelBase.init_fromc                 C   sP   |d ur|j d urt|j dkrtt|j }|d ur|S |jjr&| |S d S )Nr   )	in_objectru   nextiterr   default_on_nullrW  )r7   rV  filtersr8   r%   r%   r+   __respawn__o  s   
zComplexModelBase.__respawn__)r[  )Nr[  r:   r   ),rG   rH   rI   r   r   r   rW   r<   r@  rC  rS   r:  rq   rL  rM  rO  rS  rW  r   r   rp   r   r   rZ  r^  r   r]  r]   rl  rV   rn  ru  ry  rw  r  r  r~  r  r  r  r  r  r  r  r%   r%   r%   r+   r    s    \"


6
		
b
	
3
	











r  c                   @      e Zd ZdZdS )rh  aQ  The general complexType factory. The __call__ method of this class will
    return instances, contrary to primivites where the same call will result in
    customized duplicates of the original class definition.
    Those who'd like to customize the class should use the customize method.
    (see :class:``spyne.model.ModelBase``).
    NrG   rH   rI   r   r%   r%   r%   r+   rh  {  s    rh  c                       s   e Zd ZdZG dd dejZdddZedd	 Ze fd
dZ	edddZ
edddZedd Zedd Zedd Z  ZS )r   zThis class generates a ComplexModel child that has one attribute that has
    the same name as the serialized class. It's contained in a Python list.
    c                   @   r  )zArray.AttributesTN)rG   rH   rI   _wrapperr%   r%   r%   r+   rW         rW   NTc                 K   s   |s|j jdkrd|d< |jdi |S | jdi |}t| jd|}|d u r-td| t|tr8d|i|_n|	|| |
dd }|d urK||_|S )	Nr   	unboundedr  __serializer__z'serializer=%r is not a valid spyne type_bogusr  r%   )rW   r  rV   r   rG   r   r&   r   r2   r   r   rY   )r7   
serializermember_namer4  rA   r8   _serializerrm   r%   r%   r+   r\     s   
zArray.__new__c                 C   s   || _ d||tjf }| j \}||_t||i| _dtj|tjf | _|j	}|d urM|
 | ju rQ||||tj  |j	}|d urO|
 | ju s3d S d S d S d S rb   )r^   r	   rd   r2   r  rY   r.   re   rf   r$   rg   rZ   rh   ri   rj   r%   r%   r+   rh     s   &zArray._fill_empty_type_namec                    sh   | dd }|d u rtt| jdi |S |d= td| | j \}| |jdi |jdi |S )Nserializer_attrszPass serializer attrs %rr%   )r   r;   r   rV   r   r   r2   r  )r7   rA   r  r  rB   r%   r+   rV     s    zArray.customizec                 C   s   |  tju rd}tj| _n|d u r|  }dtj|  tjf | _|jjdkr1|j	t
dd}t|ts:J |t||i| _d S )NOhNoesrc   r   inf)r  )rg   r   rZ   rY   r	   re   rf   rW   r  rV   decimalDecimalr-   r   r.   r2   )r7   r  r  r%   r%   r+   r     s   
zArray._set_serializerc                 C   sL   | j  \}|||| | jd u r| | _| jtv r|| _t| ||S r:   )r2   r  r]   r^   r_   r
   rh  )r7   r`   ra   r  r%   r%   r+   r]     s   


zArray.resolve_namespacec                 C   s&   t t}| j \}t||| |S r:   )rh  r\   r   r2   r"  r   )r7   r{   r   r  r%   r%   r+   rS    s   
z Array.get_serialization_instancec                 C   s   g S r:   r%   rU  r%   r%   r+   rW    s   z"Array.get_deserialization_instancec                 C   s   t t| j S r:   )r  r  r2   r  r   r%   r%   r+   r    s   zArray.get_inner_type)NTr:   )rG   rH   rI   r   r  rW   r\   rq   rh   rV   r   rp   r]   rS  rW  r  rJ   r%   r%   rB   r+   r     s$    



r   c                   @   s2   e Zd ZdZG dd dejZG dd deZdS )Iterablea  This class generates a ``ComplexModel`` child that has one attribute that
    has the same name as the serialized class. It's contained in a Python
    iterable. The distinction with the ``Array`` is made in the protocol
    implementation, this is just a marker.

    Whenever you return a generator instead of a list, you should use this type
    as this suggests the intermediate machinery to NEVER actually try to iterate
    over the value. An ``Array`` could be iterated over for e.g. logging
    purposes.
    c                   @   r  )zIterable.AttributesFN)rG   rH   rI   loggedr%   r%   r%   r+   rW     r  rW   c                   @   r  )zIterable.Pusha  The push interface to the `Iterable`.

        Anything append()'ed to a `Push` instance is serialized and written to
        outgoing stream immediately.

        When using Twisted, Push callbacks are called from the reactor thread if
        the instantiation is done in a reactor thread. Otherwise, callbacks are
        called by `deferToThread`. Make sure to avoid relying on thread-local
        stuff as `deferToThread` is not guaranteed to restore original thread
        context.
        Nr  r%   r%   r%   r+   Push  s    r  N)rG   rH   rI   r   r   rW   r   r  r%   r%   r%   r+   r     s    r  c                     s$   ddl m  G  fdddt} | S )Nr   
add_columnc                       s8   e Zd Ze fddZedd Ze fddZdS )z'TTableModelBase.<locals>.TableModelBasec                    s8   |  || | jd ur | || j|  | || d S r:   )ru  r   r2   ry  r|  r  r%   r+   rw  "  s   
z4TTableModelBase.<locals>.TableModelBase.append_fieldc                 S   r   r:   r   r|  r%   r%   r+   replace_field+  r.  z5TTableModelBase.<locals>.TableModelBase.replace_fieldc                    s<   |  ||| | jd ur | || j|  | ||| d S r:   )r  r   r2   r  r  r  r%   r+   r~  /  s   
z4TTableModelBase.<locals>.TableModelBase.insert_fieldN)rG   rH   rI   rq   rw  r  r~  r%   r  r%   r+   TableModelBase!  s    
r  )r$  r  r  )r  r%   r  r+   TTableModelBase  s   r  c                    sH   ddl m  |du rt }|du rt}t|G  fddd|}|S )zA TableModel template that generates a new TableModel class for each
    call. If metadata is not supplied, a new one is instantiated.
    r   )MetaDataNc                       s$   e Zd ZG  fdddejZdS )zTTableModel.<locals>.TableModelc                       s"   e Zd ZdurZdS   ZdS )z*TTableModel.<locals>.TableModel.AttributesN)rG   rH   rI   r   r%   r  r   r%   r+   rW   J  s    rW   N)rG   rH   rI   r  rW   r%   r  r%   r+   
TableModelH  s    r  )
sqlalchemyr  r  r  r   )r   base	metaclassr  r%   r  r+   TTableModel<  s   r  c                 K   s   t ddd}|  | jurdtj|  tjf |d< || t| tr-|t dd nt| t	rG| j
 \\}}|jjdkrGt|| j
|< | jd	i |S )
zCustomizes the given type to be a mandatory one. Has special cases for
    :class:`spyne.model.primitive.Unicode` and
    :class:`spyne.model.complex.Array`\.
    r   F)r   nillablerc   r  )min_lenr   Nr%   )r   rg   rZ   r	   MANDATORY_PREFIXMANDATORY_SUFFIXr1   r&   r   r   r2   r6   rW   r   	MandatoryrV   )r7   _kwargsrA   r)   r*   r%   r%   r+   r  P  s   




r  )NNN)[r   
__future__r   logging	getLoggerrG   r   r  r7  r   weakrefr   collectionsr   r   inspectr   	itertoolsr   spyner	   spyne.const.xmlr
   spyne.modelr   r   r   r   spyne.model._baser   r   spyne.model.primitiver   spyne.model.primitive._baser   
spyne.utilr   r   r   r   r   spyne.util.colorr   spyne.util.metar   spyne.util.odictr   spyne.util.sixr   r   r   r   r    r!   r"   r#   r0   r.   objectrK   rU   rr   r'   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rN   r  r_  r  rh  r   r  r  r  r  r%   r%   r%   r+   <module>   s|   
)#V
2M
"     n	z
