
    Mh'                         d dl Z d dl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 d dlmZ d dlmZ d d	lmZ d d
lmZ dZdefdZd Zd Z eg           d             Zd Zd ZdefdZdefdZd Zd ZdS )    N)Path)all_suffixes)inference_state_method_cache)ContextualizedNode)	is_stringget_str_or_none)get_cached_code_lines)FileIO)settings)debug
   str_pathc                     t          |          }|                                r|S |                                 }|d S |j        }|                    |                                          S N)r   is_absolute
py__file__parentjoinpathabsolute)module_contextr   pathmodule_pathbase_dirs        W/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jedi/inference/sys_path.py	_abs_pathr      sl    >>D  ++--K t!HT""++---    c              #     K   t          |j        ddd         |j        ddd                   D ]8\  }}	 |dv sJ |j        dv rt          |j                  dk    sJ |j        }|d         j        dk    r|d         j        dk    sJ |d         }|j        d         d	k    r|j        d         j        d
k    sJ n# t
          $ r Y w xY wt          |                     |          |          }|                                	                    |          D ]P}|                                D ]9}t          |          r(t          | |                                          }	|	|	V  :Q:dS )a  
    Extracts the assigned strings from an assignment that looks as follows::

        sys.path[0:0] = ['module/path', 'another/module/path']

    This function is in general pretty tolerant (and therefore 'buggy').
    However, it's not a big issue usually to add more paths to Jedi's sys_path,
    because it will only affect Jedi in very random situations and by adding
    more paths than necessary, it usually benefits the general user.
    N      )=z+=power	atom_exprr   namesys.r   )zipchildrentypelenvalueAssertionErrorr   create_contextinferiterater   r   get_safe_value)
r   	expr_stmtassigneeoperatorctrailercn
lazy_valuer+   abs_paths
             r   _paths_from_assignmentr9       s      ")"4SSqS"99;MadQRd;STT ' '(	{****=$:::H%&&****!AQ49&&1Q4:+>+>+>+>dG#A&#--'2B12E2Kv2U2U2U2U
  	 	 	H	   = =i H H)TT((**,,R00 	' 	'J#))++ ' 'U## '(9M9M9O9OPPH+&	'	'1' 's   BB<<
C	C	c              #     K   |j         dk    rE|j        d         dk    r4|j         dk    r)|j        d         dk    rt          |j                  dk    sdS |j        d         j        }|dvrdS |j        d         }|d	k    r#t          |j                  d
v r|j        d         }|                     |                              |          D ]*}t          |          }|t          | |          }||V  +dS )zE extract the path from either "sys.path.append" or "sys.path.insert" r5   r   r&   (   Nr   )insertappendr=   )r<      r   )r)   r(   r*   r+   r-   
infer_noder   r   )r   trailer1trailer2r$   argr+   pr8   s           r   _paths_from_list_modificationsrE   K   s"      MY&&8+<Q+?3+F+F**x/@/Cs/J/JH%&&!++Q%D'''

A
CxC--77l1o..s33>>sCC  E""9^Q//NNN r   )defaultc           	         d }| j         g S g }	 | j                                         d         } ||          D ]\  }}|j        }t          |j                  dk    r.|                    t          | g|j        dd         R             R|.|j        dk    r#|                    t          | |                     n# t          $ r Y nw xY w|S )z6
    Detect sys.path modifications within module.
    c              3     K   | D ]}|j         j         }|r|j        dv ri|j        }|d         j        dk    rQ|d         j        dk    r@|d         j        dk    r/|d         j        d         }|j        dk    r|j        dk    r||fV  d S )Nr!   r   r$   r%   r   r5   r   )r   r)   r(   r+   )namesr$   r"   r4   ns        r   get_sys_path_powersz9check_sys_path_modifications.<locals>.get_sys_path_powersi   s       	* 	*DK&E UZ3I%I%INQ49&&1Q4:+>+>aDI22!a(Av''AGv,=,="Ek)))	* 	*r   Nr   r?   r   r1   )
	tree_nodeget_used_namesr   r*   r(   extendrE   r)   r9   KeyError)r   rK   addedpossible_namesr$   r"   r1   s          r   check_sys_path_modificationsrR   d   s'   
	* 	* 	* '	EP'1@@BB6J /.~>> 		P 		PKD%I5>""a''2&).!)<     
 &9>[+H+H3NINNOOO		P     Ls   B> >
C
Cc                     t                      }t          |          D ]D}t          | |          D ]1}|                    |           t	          |          t
          k    r n2E|S r   )set_get_buildout_script_paths_get_paths_from_buildout_scriptaddr*   _BUILDOUT_PATH_INSERTION_LIMIT)inference_statescript_pathbuildout_script_pathsbuildout_script_pathr   s        r   discover_buildout_pathsr]      s{    EE :; G G  3OEYZZ 	 	D!%%d+++())-KKK L ! r   c           
   #   v  K   t          t          |                    }	 |                     |dt          j                  }n&# t
          $ r t          j        d|           Y d S w xY wddlm	}  || ||d t          | j        |                                                    }t          |          E d {V  d S )NT)file_iocache
cache_pathz(Error trying to read buildout_script: %sr   )ModuleValue)r_   string_names
code_lines)r
   strparser   cache_directoryIOErrorr   warningjedi.inference.valuerb   r	   grammar
as_contextrR   )rY   r\   r_   module_noderb   r   s         r   rV   rV      s      S-..//G%++/ , 
 

    @BVWWW 100000 [()@BVWW	  
 jll  ,N;;;;;;;;;;;s   "A A&%A&r   c                     | j         D ]>}	 |                    |                                          r|c S /# t          $ r Y ;w xY wd S r   )parentsr   is_fileOSError)r   filenamer   s      r   _get_parent_dir_with_filers      sk    ,  	x((0022  	 	 	H	4s   (7
AAsearch_pathc              #     K   t          | d          }|sdS |                    d          }|                                sdS t          j        |          D ]}	 |                    |          }t          |d          5 }|                                }|                    d          rd|v r|V  ddd           n# 1 swxY w Y   r# t          t          f$ r+}t          j        t          |                     Y d}~d}~ww xY wdS )z
    if there is a 'buildout.cfg' file in one of the parent directories of the
    given module it will return a list of all files in the buildout bin
    directory that look like python files.

    :param search_path: absolute path to the module.
    zbuildout.cfgNbinrz#!python)rs   r   existsoslistdiropenreadline
startswithUnicodeDecodeErrorrh   r   ri   re   )rt   project_rootbin_pathrr   filepathf	firstlinees           r   rU   rU      sk      -[.IIL $$U++H?? Jx((  
	((22Hh$$ #JJLL	''-- #(i2G2G"NNN# # # # # # # # # # # # # # # #G, 	 	 	 M#a&&!!!HHHH		 s<   %C>2B<0C<C 	 CC 	CD!C??Dc                 ~    t                      dgz   D ])}| j        |k    r|                     | j                  }  n*| S )Nz.pyi)r   suffix	with_namestem)r   r   s     r   remove_python_path_suffixr      sM    ..F8+  ;&  >>$),,DE ! Kr   c                      t                    j                            d          rdS j        dk    }|rj         fd}t	           |                      }|sdS t          |d           d         |fS )aK  
    Returns the dotted path inside a sys.path as a list of names. e.g.

    >>> transform_path_to_dotted([str(Path("/foo").absolute())], Path('/foo/bar/baz.py').absolute())
    (('bar', 'baz'), False)

    Returns (None, False) if the path doesn't really resolve to anything.
    The second return part is if it is a package.
    r&   )NF__init__c               3     K   D ]} t                                        |           rt                    t          |           d          }|                    t          j        j                  s|                    d          r
|dd          }|rQ|                    t          j        j                  }t          |          s d S t          d |D                       V  d S )N/r   c              3   B   K   | ]}t          j        d d|          V  dS )z-stubs$ N)resub).0ss     r   	<genexpr>zMtransform_path_to_dotted.<locals>.iter_potential_solutions.<locals>.<genexpr>  s0      IIaz2q 9 9IIIIIIr   )	re   r~   r*   rz   r   sepsplitalltuple)rD   restr   r   sys_paths      r   iter_potential_solutionsz:transform_path_to_dotted.<locals>.iter_potential_solutions   s       	J 	JA;**1-- J;''A0??27;// $4??33G3G $8D 	J JJrw{33Eu::    II5IIIIIIII%	J 	Jr   c                      t          |           S r   )r*   )rD   s    r   <lambda>z*transform_path_to_dotted.<locals>.<lambda>  s    SVV r   )keyr   )r   r$   r~   r   r   sorted)r   r   
is_packager   potential_solutionss   ``   r   transform_path_to_dottedr      s     ,K88K""3'' { !Z/J )!(J J J J J J*   8 8 : :;; { %+;+;<<<Q?KKr   ) rz   r   pathlibr   importlib.machineryr   jedi.inference.cacher   jedi.inference.base_valuer   jedi.inference.helpersr   r   jedi.parser_utilsr	   jedi.file_ior
   jedir   r   rX   re   r   r9   rE   rR   r]   rV   rs   rU   r   r    r   r   <module>r      s   				 				       , , , , , , = = = = = = 8 8 8 8 8 8 = = = = = = = = 3 3 3 3 3 3                  !# . . . . .(' (' ('V  2 b)))" " *)"J	! 	! 	!< < <,D    D    :  5L 5L 5L 5L 5Lr   