o
    b.i                  	   @   s   d Z ddlmZ ddlmZ ddlZddlmZmZm	Z	m
Z
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mZ dd
lmZ ddlmZ ddlmZ dZdd Zdd Zeeeddeeddd dd Zdd Zdd Zdd ZdYddZeeej ej!ej"ej#ej$ej%ej&fe'd Z(eeej!ej ej"ej#ej$ej%ej&fe)d Z*eeej"ej!ej ej#ej%fe+d Z,eeej#ej!ej ej"ej#ej%fe-d Z.d!d" Z/dZd#d$Z0dZd%d&Z1d'd( Z2dZd)d*Z3dZd+d,Z4dZd-d.Z5dZd/d0Z6dZd1d2Z7dZd3d4Z8dZd5d6Z9d7d8 Z:dZd9d:Z;dZd;d<Z<dZd=d>Z=dZd?d@Z>dZdAdBZ?dZdCdDZ@dZdEdFZAee6dG ee1dH ee5dI ee3dJ ee4dK ee(dL ee,dM ee*dN ee0dO ee.dP ee7dQ ee8dR ee<dS ee;dT ee>dU ee?dV ee@dW eeAdX eBejCee9e: dS )[z#Astroid hooks for various builtins.    )partial)dedentN)	MANAGERInstanceUseInferenceDefaultAttributeInferenceErrorinference_tipInferenceErrorNameInferenceErrorAstroidTypeErrorMroError)	arguments)AstroidBuilder)helpers)nodes)objects)scoped_nodes)utilzobject.__new__c                 C   st   t d}|j|d}tt|d }| D ] }| |_d|_d|_d|j	v r-| g|j	d< |g| j	|j
< | |_qdS )z,function to extend builtin str/unicode classa$  
    class whatever(object):
        def join(self, iterable):
            return {rvalue}
        def replace(self, old, new, count=None):
            return {rvalue}
        def format(self, *args, **kwargs):
            return {rvalue}
        def encode(self, encoding='ascii', errors=None):
            return ''
        def decode(self, encoding='ascii', errors=None):
            return u''
        def capitalize(self):
            return {rvalue}
        def title(self):
            return {rvalue}
        def lower(self):
            return {rvalue}
        def upper(self):
            return {rvalue}
        def swapcase(self):
            return {rvalue}
        def index(self, sub, start=None, end=None):
            return 0
        def find(self, sub, start=None, end=None):
            return 0
        def count(self, sub, start=None, end=None):
            return 0
        def strip(self, chars=None):
            return {rvalue}
        def lstrip(self, chars=None):
            return {rvalue}
        def rstrip(self, chars=None):
            return {rvalue}
        def rjust(self, width, fillchar=None):
            return {rvalue}
        def center(self, width, fillchar=None):
            return {rvalue}
        def ljust(self, width, fillchar=None):
            return {rvalue}
    rvalueZwhateverN	__class__)r   formatr   r   Zstring_buildZ	mymethodsparentlineno
col_offsetlocalsname)Z
class_noder   codeZfakemethod r   d/var/www/secure340b-portal/env/lib/python3.10/site-packages/astroid/brain/brain_builtin_inference.py_extend_str'   s   +
r!   c                 C   s(   t j}|  D ]
\}}|||  qd S N)r   Zbuiltins_moduleitems)Zclass_transformsZbuiltin_ast
class_name	transformr   r   r    _extend_builtins`   s   r&   zb''r   z'')bytesstrc                 C   sZ   t | jtjr| jj|krdS t | jtjr+| jjdko*t | jjtjo*| jjjdkS dS )NTfromkeysdictF)
isinstancefuncr   Namer   	Attributeattrnameexpr)nodebuiltin_namer   r   r    _builtin_filter_predicaten   s   r3   c                    s.   d fdd	}t tjt|tt|d dS )zRegister a new transform function for the given *builtin_name*.

    The transform function must accept two parameters, a node and
    an optional context.
    Nc                    sJ    | |d}|r |j s| |_ |jd u r| j|_|jd u r | j|_t|gS )Ncontext)r   r   r   iter)r1   r5   resultr%   r   r    _transform_wrapper   s   


z6register_builtin_transform.<locals>._transform_wrapper)r2   r"   )r   register_transformr   Callr   r   r3   )r%   r2   r9   r   r8   r    register_builtin_transformz   s   
r<   c              	   C   s   | j }|s| S t| j dkrt |\}||}|s>z
t|j|d}W n ttfy1   t w |tju r:t ||}|rE|tju rHt |S )N   r4   )	argslenr   nextinferr	   StopIterationr   Uninferable)r1   r5   Z	node_typer%   r>   argZtransformedinferredr   r   r    _generic_inference   s&   
rF   c                 C   s   t | |r| S t | |r"tdd | jD st dd | jD }n2t | tjr>tdd | jD s5t dd | jD }nt | tjrRt | jt	j
t	jfrR| j}nd S |j||dS )Nc                 s   s    | ]	}t |tjV  qd S r"   r+   r   Const.0eltr   r   r    	<genexpr>   s    z%_generic_transform.<locals>.<genexpr>c                 S   s   g | ]}|j qS r   valuerI   r   r   r    
<listcomp>   s    z&_generic_transform.<locals>.<listcomp>c                 s   s     | ]}t |d  tjV  qdS )r   NrG   rI   r   r   r    rL      s    c                 S   s   g | ]}|d  j qS )r   rM   )rJ   itemr   r   r    rO          )elts)r+   allrR   r   r   Dictr#   rH   rN   sixstring_typesbinary_typeZfrom_constants)rD   klass	iterables
build_eltsrR   r   r   r    _generic_transform   s    

r[   c                 C   s   t t|||d}t| |||S )NrX   rY   rZ   )r   r[   rF   )r1   r5   rX   rY   rZ   Ztransform_funcr   r   r    _infer_builtin   s   r]   r\   c              	   C   s   dd }z	t | |}W n ttfy   t w t|tjr%|j}|S ||r]g }|j	D ],}||s7t t
|j	dkrAt t|j	d tjtjtjfsRt |t|j	 q.|S t )Nc                 S   s   t | tjtjtjfS r"   )r+   r   ListTupleSet)nr   r   r    <lambda>   rQ   z_get_elts.<locals>.<lambda>   r   )r@   rA   r	   r
   r   r+   r   rT   r#   rR   r?   r_   rH   r-   appendtuple)rD   r5   is_iterablerE   r#   rK   r   r   r    	_get_elts   s*   
rg   c           	      C   s   t j| }| s| rt|j}t|j	 }|s"|s"t
 S |r.|s.dd |D }n,t|dkrI|rIt|d |}dd |D }|| }nt|dkrWt|d |}nt t
j| j| j| jd}|| |S )aC  Try to infer a dict call to a Dict node.

    The function treats the following cases:

        * dict()
        * dict(mapping)
        * dict(iterable)
        * dict(iterable, **kwargs)
        * dict(mapping, **kwargs)
        * dict(**kwargs)

    If a case can't be inferred, we'll fallback to default inference.
    c                 S      g | ]\}}t ||fqS r   r   rH   rJ   keyrN   r   r   r    rO   *      zinfer_dict.<locals>.<listcomp>r=   r   c                 S   rh   r   ri   rj   r   r   r    rO   .  rl   r   r   r   )r   CallSite	from_callZhas_invalid_argumentsZhas_invalid_keywordsr   positional_argumentslistkeyword_argumentsr#   r   rT   r?   rg   r   r   r   postinit)	r1   r5   callr>   kwargsr#   rR   keysrN   r   r   r    
infer_dict  s*   

rw   c                 C   s   t | jdkr	t|  }t|tjst|jdvrtt	|}t | js5|}|jdkr0|}n3|
 }n.zt| jd j|d}W n	 tyK   tw zt| jd j|d}W n	 tyb   tw |tju sm|tju rottj||||d}| |_|S )a  Understand super calls.

    There are some restrictions for what can be understood:

        * unbounded super (one argument form) is not understood.

        * if the super call is not inside a function (classmethod or method),
          then the default inference will be used.

        * if the super arguments can't be inferred, the default inference
          will be used.
    r=   )classmethodr   rx   r   r4   )mro_pointermro_typeZ
self_classscope)r?   r>   r   r{   r+   r   FunctionDeftyper   Zget_wrapping_classinstantiate_classr@   rA   r	   r   rC   r   ZSuperr   )r1   r5   r{   clsry   rz   Z	super_objr   r   r    infer_super<  s<   




r   c                 C   s   t | jdvr	tzt| jd j|d}t| jd j|d}W n	 ty*   tw |tju s5|tju r;tjtjfS t|t	j
oGt|jtj}|sLt||jfS )N)rc      r   r4   r=   )r?   r>   r   r@   rA   r	   r   rC   r+   r   rH   rN   rU   rV   )r1   r5   objattr	is_stringr   r   r    _infer_getattr_argss  s    
r   c                 C   s   t | |\}}|tju s|tju st|dstjS z
t|j||dW S  tttfyO   t	| j
dkrLzt| j
d j|dW  Y S  tyK   tw Y tw )zUnderstand getattr calls

    If one of the arguments is an Uninferable object, then the
    result will be an Uninferable object. Otherwise, the normal attribute
    lookup will be done.
    igetattrr4   r   rc   )r   r   rC   hasattrr@   r   rB   r	   r   r?   r>   rA   r   r1   r5   r   r   r   r   r    infer_getattr  s(   r   c                 C   s   z#t | |\}}|tju s|tju st|dstjW S |j||d W n ty/   tj Y S  ty<   td Y S w tdS )aL  Understand hasattr calls

    This always guarantees three possible outcomes for calling
    hasattr: Const(False) when we are sure that the object
    doesn't have the intended attribute, Const(True) when
    we know that the object has the attribute and Uninferable
    when we are unsure of the outcome of the function call.
    getattrr4   FT)	r   r   rC   r   r   r   r   r   rH   r   r   r   r    infer_hasattr  s    	

r   c                 C   sh   t | jdkr	t| jd }z
t|j|d}W n ty$   tj Y S w |tju r-tjS t	|
 S )zUnderstand callable calls

    This follows Python's semantics, where an object
    is callable if it provides an attribute __call__,
    even though that attribute is something which can't be
    called.
    r=   r   r4   )r?   r>   r   r@   rA   r	   r   rC   r   rH   callable)r1   r5   argumentrE   r   r   r    infer_callable  s   


r   c                 C   s   t | jdkr	t| jstdS | jd }z
t|j|d}W n ty,   tj	 Y S w |tj	u r5tj	S |
 }|tj	u rAtj	S t|S )zUnderstand bool calls.r=   Fr   r4   )r?   r>   r   r   rH   r@   rA   r	   r   rC   
bool_value)r1   r5   r   rE   r   r   r   r    
infer_bool  s    





r   c                 C   s$   t | jdkr	tt| jd |S )z+Understand the one-argument form of *type*.r=   r   )r?   r>   r   r   Zobject_typer1   r5   r   r   r    
infer_type  s   r   c                    s   | j }dt|  k rdkst tttj|d  fdd|D }|D ]}|r.|tju r0tt|t	j
s8tt|jtdtfsDtq%t|dk rW|dgdt|   t	j| j| j| jd}|j|  |S )zUnderstand `slice` calls.r   r   r4   c                    s   g | ]} |qS r   r   )rJ   rD   Z
infer_funcr   r    rO          zinfer_slice.<locals>.<listcomp>N)r   r   r   )r>   r?   r   r   r   Z
safe_inferr   rC   r+   r   rH   rN   r}   intextendSlicer   r   r   rs   )r1   r5   r>   rD   Z
slice_noder   r   r    infer_slice  s,   
r   c                 C   s   t |  fS r"   )r6   r~   r   r   r   r    _infer_object__new__decorator  s   r   c                 C   s:   | j sdS | j jD ]}t|tjr| tkr dS q	dS )zePredicate before inference_tip

    Check if the given ClassDef has an @object.__new__ decorator
    FT)Z
decoratorsr   r+   r.   	as_stringOBJECT_DUNDER_NEW)r1   	decoratorr   r   r    #_infer_object__new__decorator_check  s   r   c           	   
   C   s$  t j| }|jrtdt|jdkrtdjt|jd|j\}}z
t|j	|d}W n t
y= } zt|d}~ww t|tjsHtdzt||d}W n t
y_ } zt|d}~ww z	t|||}W n# ty~ } z	tdt| |d}~w ty } zt|d}~ww t|S )	a  Infer issubclass() calls

    :param nodes.Call callnode: an `issubclass` call
    :param InferenceContext: the context for the inference
    :rtype nodes.Const: Boolean Const value of the `issubclass` call
    :raises UseInferenceDefault: If the node cannot be inferred
    z2TypeError: issubclass() takes no keyword argumentsrc   #Expected two arguments, got {count}countr4   NzTypeError: arg 1 must be classTypeError: )r   rn   ro   rr   r   r?   rp   r   r@   rA   r	   r+   r   ClassDef_class_or_tuple_to_containerr   Zobject_issubclassr   r(   r   rH   )	callnoder5   rt   obj_nodeclass_or_tuple_nodeobj_typeexcclass_containerZissubclass_boolr   r   r    infer_issubclass)  sH   


r   c              
   C   s   t j| }|jrtdt|jdkrtdjt|jd|j\}}zt||d}W n	 t	y5   tw z	t
|||}W n" tyS } ztdt| d}~w tya } zt|d}~ww |tju ritt|S )a@  Infer isinstance calls

    :param nodes.Call callnode: an isinstance call
    :param InferenceContext: context for call
        (currently unused but is a common interface for inference)
    :rtype nodes.Const: Boolean Const value of isinstance call

    :raises UseInferenceDefault: If the node cannot be inferred
    z2TypeError: isinstance() takes no keyword argumentsrc   r   r   r4   r   N)r   rn   ro   rr   r   r?   rp   r   r   r	   r   Zobject_isinstancer   r(   r   r   rC   r   rH   )r   r5   rt   r   r   r   Zisinstance_boolr   r   r   r    infer_isinstanceV  s:   




r   c                    sL   t | j d}t|tjr! fdd|jD }dd |D }|S |g}|S )Nr4   c                    s   g | ]
}t |j d qS )r4   )r@   rA   )rJ   r1   r4   r   r    rO     s    z0_class_or_tuple_to_container.<locals>.<listcomp>c                 S   s   g | ]}|d ur|qS r"   r   )rJ   Z
klass_noder   r   r    rO     s
    )r@   rA   r+   r   r_   rR   )r1   r5   Z
node_inferr   r   r4   r    r     s   
r   c              
   C   s   t j| }|jrtdt|jdkrtdjt|jd|j\}z	t	t
|W S  ttfyA } ztt||d}~ww )zInfer length calls

    :param nodes.Call node: len call to infer
    :param context.InferenceContext: node context
    :rtype nodes.Const: a Const node with the inferred length, if possible
    z/TypeError: len() must take no keyword argumentsr=   z=TypeError: len() must take exactly one argument ({len}) given)r?   N)r   rn   ro   rr   r   r?   rp   r   r   rH   r   Z
object_lenr   r	   r(   )r1   r5   rt   Zargument_noder   r   r   r    	infer_len  s    
r   c              
   C   sR   t j| }|jrtdztdW S  ttfy( } ztt	||d}~ww )zInfer str() calls

    :param nodes.Call node: str() call to infer
    :param context.InferenceContext: node context
    :rtype nodes.Const: a Const containing an empty string
    z/TypeError: str() must take no keyword arguments N)
r   rn   ro   rr   r   r   rH   r   r	   r(   )r1   r5   rt   r   r   r   r    	infer_str  s   r   c              
   C   s   t j| }|jrtd|jrazt|jd j|d}W n ty0 } ztt	||d}~ww |t
ju r8tt|tjrat|jtt	frazt|j}W n ty[   td Y S w t|S tdS )zInfer int() calls

    :param nodes.Call node: int() call to infer
    :param context.InferenceContext: node context
    :rtype nodes.Const: a Const containing the integer value of the int() call
    /TypeError: int() must take no keyword argumentsr   r4   N)r   rn   ro   rr   r   rp   r@   rA   r	   r(   r   rC   r+   r   rH   rN   r   
ValueError)r1   r5   rt   Zfirst_valuer   Zactual_valuer   r   r    	infer_int  s,   



r   c                    s~  fdd}t j}|jrtdt|jdvrtdtd |jd }z
t	|j
|d}W n ty?   |g  Y S w |tju rI|g S tjf}t|tjtjtjfrx|j}|D ]}t||sj|g   S q] fd	d
|D }	||	S t|tjrt|jttfr fdd
|jD }||S t|tjr| }
|
D ]}t||s|g   S q fdd
|
D }	||	S |g S )aR  Infer dict.fromkeys

    :param nodes.Call node: dict.fromkeys() call to infer
    :param context.InferenceContext: node context
    :rtype nodes.Dict:
        a Dictionary containing the values that astroid was able to infer.
        In case the inference failed for any reason, an empty dictionary
        will be inferred instead.
    c                    s$   t j j j jd}||  |S )Nrm   )r   rT   r   r   r   rs   )elementsnew_node)r1   r   r    _build_dict_with_elements  s
   
z6infer_dict_fromkeys.<locals>._build_dict_with_elementsr   >   r=   rc   z5TypeError: Needs between 1 and 2 positional argumentsNr   r4   c                       g | ]}| fqS r   r   rJ   elementdefaultr   r    rO     r   z'infer_dict_fromkeys.<locals>.<listcomp>c                    s   g | ]	}t | fqS r   ri   r   r   r   r    rO   
  s    c                    r   r   r   r   r   r   r    rO     r   )r   rn   ro   rr   r   r?   rp   r   rH   r@   rA   r	   r   rC   r+   r^   r`   r_   rR   rN   r(   r'   rT   Zitered)r1   r5   r   rt   valuesZinferred_valuesZaccepted_iterable_elementsr   r   Zelements_with_valuerv   rk   r   )r   r1   r    infer_dict_fromkeys  sT   






r   boolsuperr   r   r   re   setrq   r*   	frozensetr}   slicer+   
issubclassr?   r(   r   zdict.fromkeys)NNNr"   )D__doc__	functoolsr   textwrapr   rU   Zastroidr   r   r   r   r   r	   r
   r   r   r   Zastroid.builderr   r   r   r   r   r   r   r!   r&   r3   r<   rF   r[   r]   r_   r^   r`   	FrozenSetZ	DictItemsZDictKeysZ
DictValuesre   Zinfer_tuplerq   Z
infer_listr   Z	infer_setr   Zinfer_frozensetrg   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r   r   r   r   r    <module>   s   	,9


	

,7








-
)



 
E
















