B
    /d*                 @   s  d 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
 ddl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 ddlmZ ddlmZ ddlmZ dddddddddddddddddddZdZe dd Zdd Z e	dd  Z!d!d" Z"G d#d$ d$eZ#dGd&d'Z$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)d2d3 Z*d4d5 Z+G d6d7 d7e
Z,G d8d9 d9eeZ-G d:d; d;e
Z.G d<d= d=eeZ/G d>d? d?eZ0G d@dA dAeZ1G dBdC dCe
Z2G dDdE dEe
Z3dFS )Hz.
Module is used to infer Django model fields.
    )	Parameter)debug)inference_state_function_cache)ValueSetiterator_to_value_setValueWrapper)
DictFilterAttributeOverwrite)NameWrapperBaseTreeParamName)EmptyCompiledName)TreeInstance)
ClassMixin)GenericClass)TupleGenericManager)AbstractSignature)Nint)Nstr)Nfloat)Nbytes)Nbool)decimalDecimal)datetimetime)r   	timedelta)r   date)r   r   )uuidUUID)ZIntegerFieldZBigIntegerFieldZPositiveIntegerFieldZSmallIntegerFieldZ	CharFieldZ	TextFieldZ
EmailFieldZGenericIPAddressFieldZURLFieldZ
FloatFieldZBinaryFieldZBooleanFieldZDecimalFieldZ	TimeFieldZDurationFieldZ	DateFieldZDateTimeFieldZ	UUIDField)createfilterexcludeupdategetZget_or_createZupdate_or_createc             C   s   |  dd S )N)djangodbmodelsquery_utilsDeferredAttribute)import_modulepy__getattribute__execute_annotation)inference_state r-   `/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/jedi/plugins/django.py_get_deferred_attributes,   s    r/   c             C   sp   yt |  \}}W n tk
r(   d S X |s6t| S |d krF| j}n| |f}x||D ]
}| S W d S )N)mapping
py__name__KeyErrorr/   Zbuiltins_moduler)   r*   execute_with_values)r,   
field_namefield_tree_instanceis_instancemodule_nameZattribute_namemodule	attributer-   r-   r.   _infer_scalar_field3   s    r:   c       	      c   s   t |tr|j }t|d\}}|d kr|d k	rx^| D ]R}| dkr| }|  }x0|	|D ]}|
 rh|V  qhW q<|
 r<|V  q<W d S )N)NNr   )
isinstancer   
_argumentsunpacknextinferr1   Zget_safe_valueget_root_contextr*   Zis_class)	clsr5   Zargument_iteratorkeyZlazy_valuesvalueZforeign_key_class_namer8   vr-   r-   r.   _get_foreign_key_valuesE   s    

rE   c       
      C   s   | j }| }x||D ]t}t||||}|d k	r2|S | }|dk}|dksN|r|sZt|S t| |}	|rttd dd |	D S |	 S qW t	
d|j|   |S )NZManyToManyField)Z
ForeignKeyZOneToOneFieldc             S   s   g | ]}t |d qS )ZRelatedManager)_create_manager_for).0rD   r-   r-   r.   
<listcomp>i   s    z _infer_field.<locals>.<listcomp>z1django plugin: fail to infer `%s` from class `%s`)r,   r?   r:   r1   r/   rE   r   r    r3   r   Zdbgstring_name)
rA   r4   r6   r,   resultr5   Zscalar_fieldnameZis_many_to_manyvaluesr-   r-   r.   _infer_fieldW   s(    

rM   c                   s$   e Zd Z fddZdd Z  ZS )DjangoModelNamec                s   t  | || _|| _d S )N)super__init___cls_is_instance)selfrA   rK   r6   )	__class__r-   r.   rP   t   s    zDjangoModelName.__init__c             C   s   t | j| j| jS )N)rM   rQ   Z_wrapped_namerR   )rS   r-   r-   r.   r?   y   s    zDjangoModelName.infer)__name__
__module____qualname__rP   r?   __classcell__r-   r-   )rT   r.   rN   s   s   rN   BaseManagerc             C   sV   | j d|}x>|D ]6}| rtt| gf}xt|| D ]}|S W qW d S )N)r$   r%   r&   manager)r,   r)   r*   Zis_class_mixinr   r   r   r+   )rA   Zmanager_clsZmanagersmZgenerics_managercr-   r-   r.   rF   }   s    

rF   c                sH   t  jddd} fddt|D }r@t jd|d< t|S )NF)r6   Zinclude_metaclassesZinclude_type_when_classc                s*   i | ]"}|  D ]}t ||jqqS r-   )rL   rN   rI   )rG   filter_rK   )rA   r6   r-   r.   
<dictcomp>   s   z$_new_dict_filter.<locals>.<dictcomp>objects)listZget_filtersreversedr   r,   r   )rA   r6   filtersdctr-   )rA   r6   r.   _new_dict_filter   s    
rd   c             C   s   |   dko|    dkS )NZ	ModelBasezdjango.db.models.base)r1   r@   )rC   r-   r-   r.   is_django_model_base   s    re   c                s    fdd}|S )Nc                s.   x |D ]}t |rt| |gS qW  | ||S )N)re   rd   )rA   metaclassesr6   	metaclass)funcr-   r.   wrapper   s    
z&get_metaclass_filters.<locals>.wrapperr-   )rh   ri   r-   )rh   r.   get_metaclass_filters   s    rj   c                s    fdd}|S )Nc                s   | ||}|j tkrx|D ]d   d|j fkr j r j dkr| }| }t|dkrt	 fdd|d D S qW n`|j dkr| r| dkrt	d	d |D S |j d
kr| r| dkrt	dd |D S |S )NZ_BaseQuerySetzdjango.db.models.query   c             3   s   | ]}t  |V  qd S )N)QuerySetMethodWrapper)rG   model)rD   r-   r.   	<genexpr>   s   z7tree_name_to_values.<locals>.wrapper.<locals>.<genexpr>r   rY   zdjango.db.models.managerc             s   s   | ]}t |V  qd S )N)ManagerWrapper)rG   rr-   r-   r.   rn      s    Fieldzdjango.db.models.fieldsc             s   s   | ]}t |V  qd S )N)FieldWrapper)rG   rp   r-   r-   r.   rn      s    )
rC   _FILTER_LIKE_METHODSget_qualified_namesparent_contextZ	is_moduler1   	get_valueZget_genericslenr   )r,   context	tree_namerJ   qsZgenerics)rh   )rD   r.   ri      s$    


z$tree_name_to_values.<locals>.wrapperr-   )rh   ri   r-   )rh   r.   tree_name_to_values   s    r{   c             c   sH   xBt | dd D ].}x(| D ]}|jjdddkr |V  q W qW d S )NF)r6   T)Zinclude_module_names)r$   r%   r&   r'   r(   )rd   rL   r?   rK   rt   )rA   rK   rC   r-   r-   r.   _find_fields   s
    r|   c             C   s   t | tt| dgS )N)field_names)DjangoModelSignaturer`   r|   )rA   r-   r-   r.   _get_signatures   s    r   c                s    fdd}|S )Nc                s(   x|D ]}t |rt| S qW  | |S )N)re   r   )rA   rf   rg   )rh   r-   r.   ri      s    
z)get_metaclass_signatures.<locals>.wrapperr-   )rh   ri   r-   )rh   r.   get_metaclass_signatures   s    r   c               @   s   e Zd Zdd ZdS )ro   c             C   s   t dd | j||D S )Nc             s   s   | ]}t |V  qd S )N)GenericManagerWrapper)rG   genericr-   r-   r.   rn      s   z/ManagerWrapper.py__getitem__.<locals>.<genexpr>)r   _wrapped_valuepy__getitem__)rS   index_value_setcontextualized_noder-   r-   r.   r      s    zManagerWrapper.py__getitem__N)rU   rV   rW   r   r-   r-   r-   r.   ro      s   ro   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   s   |j t|hf|jS )N)class_valuewith_genericsr   Z
py__call__r<   )rS   calling_instanceinstancer   r-   r-   r.   py__get__on_class   s    z'GenericManagerWrapper.py__get__on_classc             C   s   | j |S )N)r   r   )rS   Zgenerics_tupler-   r-   r.   r      s    z#GenericManagerWrapper.with_genericsN)rU   rV   rW   r   r   r-   r-   r-   r.   r      s   r   c               @   s   e Zd Zdd ZdS )rr   c             C   s   t dd | j||D S )Nc             s   s   | ]}t |V  qd S )N)GenericFieldWrapper)rG   r   r-   r-   r.   rn      s   z-FieldWrapper.py__getitem__.<locals>.<genexpr>)r   r   r   )rS   r   r   r-   r-   r.   r      s    zFieldWrapper.py__getitem__N)rU   rV   rW   r   r-   r-   r-   r.   rr      s   rr   c               @   s   e Zd Zdd ZdS )r   c             C   s
   t |hS )N)r   )rS   r   r   r   r-   r-   r.   r      s    z%GenericFieldWrapper.py__get__on_classN)rU   rV   rW   r   r-   r-   r-   r.   r      s   r   c                   s&   e Zd Z fddZdddZ  ZS )r~   c                s   t  | || _d S )N)rO   rP   _field_names)rS   rC   r}   )rT   r-   r.   rP     s    zDjangoModelSignature.__init__Fc             C   s   dd | j D S )Nc             S   s   g | ]}t |qS r-   )DjangoParamName)rG   rK   r-   r-   r.   rH   	  s    z8DjangoModelSignature.get_param_names.<locals>.<listcomp>)r   )rS   Zresolve_starsr-   r-   r.   get_param_names  s    z$DjangoModelSignature.get_param_names)F)rU   rV   rW   rP   r   rX   r-   r-   )rT   r.   r~     s   r~   c                   s,   e Zd Z fddZdd Zdd Z  ZS )r   c                s   t  |j|j || _d S )N)rO   rP   ru   ry   _field_name)rS   r4   )rT   r-   r.   rP     s    zDjangoParamName.__init__c             C   s   t jS )N)r   KEYWORD_ONLY)rS   r-   r-   r.   get_kind  s    zDjangoParamName.get_kindc             C   s
   | j  S )N)r   r?   )rS   r-   r-   r.   r?     s    zDjangoParamName.infer)rU   rV   rW   rP   r   r?   rX   r-   r-   )rT   r.   r     s   r   c                   s$   e Zd Z fddZdd Z  ZS )rl   c                s   t  | || _d S )N)rO   rP   
_model_cls)rS   method	model_cls)rT   r-   r.   rP     s    zQuerySetMethodWrapper.__init__c                s    t  fdd j||D S )Nc                s   h | ]}t | jqS r-   )QuerySetBoundMethodWrapperr   )rG   rD   )rS   r-   r.   	<setcomp>  s   z2QuerySetMethodWrapper.py__get__.<locals>.<setcomp>)r   r   	py__get__)rS   r   r   r-   )rS   r.   r     s    zQuerySetMethodWrapper.py__get__)rU   rV   rW   rP   r   rX   r-   r-   )rT   r.   rl     s   rl   c                   s$   e Zd Z fddZdd Z  ZS )r   c                s   t  | || _d S )N)rO   rP   r   )rS   r   r   )rT   r-   r.   rP   #  s    z#QuerySetBoundMethodWrapper.__init__c             C   s
   t | jS )N)r   r   )rS   r-   r-   r.   get_signatures'  s    z)QuerySetBoundMethodWrapper.get_signatures)rU   rV   rW   rP   r   rX   r-   r-   )rT   r.   r   "  s   r   N)rY   )4__doc__inspectr   Zjedir   Zjedi.inference.cacher   Zjedi.inference.base_valuer   r   r   Zjedi.inference.filtersr   r	   Zjedi.inference.namesr
   r   Zjedi.inference.compiled.valuer   Zjedi.inference.value.instancer   Zjedi.inference.value.klassr   Zjedi.inference.gradual.baser   Zjedi.inference.gradual.genericsr   Zjedi.inference.signaturer   r0   rs   r/   r:   rE   rM   rN   rF   rd   re   rj   r{   r|   r   r   ro   r   rr   r   r~   r   rl   r   r-   r-   r-   r.   <module>   sh   


		
		
