
    c:                     n   d dl Z d dlZd dlZd dlZd dlZd dl mZ d dlmZ d dlZ	d dl
mc 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mZ d dlmZmZmZ 	 d dlZn# e$ r d dlZY nw xY w G d d	          Z G d
 de          Z  G d de          Z!d Z" G d d          Z# G d d          Z$d Z%d Z&dS )    N)	ExitStack)Optional)
exceptionshistorypycore
taskhandleutils)ModuleNotFoundError)Prefs
get_config)FileFolder_ResourceMatcherc                      e Zd ZU eed<   d Zd ZddZd Zd Z	d Z
d	 Zd
 Zej        fdZddZd Zd Zd Zd Zd Zddee         fdZd Zd Zd Zeej        d                         Zeej        d                         Z d Z!dZ"dS )_Projectprefsc                 ~    g | _         || _        t                      | _        t	          |           | _        g | _        d S N)	observers
fscommandsr   r   
_DataFiles
data_files_custom_source_folders)selfr   s     1lib/python3.11/site-packages/rope/base/project.py__init__z_Project.__init__   s8    $WW
$T**&(###    c                    |                      |          }t          j                            |          st	          j        d|z            t          j                            |          rt          | |          S t          j                            |          rt          | |          S t	          j        d|z             )a  Get a resource in a project.

        `resource_name` is the path of a resource in a project.  It is
        the path of a resource relative to project root.  Project root
        folder address is an empty string.  If the resource does not
        exist a `exceptions.ResourceNotFound` exception would be
        raised.  Use `get_file()` and `get_folder()` when you need to
        get nonexistent `Resource`.

        zResource <%s> does not existzUnknown resource )
_get_resource_pathospathexistsr   ResourceNotFoundErrorisfiler   isdirr   )r   resource_namer!   s      r   get_resourcez_Project.get_resource    s     &&}55w~~d## 		X2.>   W^^D!! 	Xm,,,W]]4   	X$...23F3VWWWr   Nc                     | j                             |          }||S |                     ||          }|t          d|z            | j                             |          S )z-Returns a `PyObject` if the module was found.NModule %s not found)r   builtin_modulefind_moduler
   resource_to_pyobject)r   namefolderpymodmodules        r   
get_modulez_Project.get_module7   sn     **400 	L!!$// 	D%&;d&BCCC{//777r   c                 8   g }| j                             dg           t          j        z   D ]n}t	          j        t          j                  5  t                      	                    |          }|
                    |           d d d            n# 1 swxY w Y   o|S )Npython_path)r   getsysr!   
contextlibsuppressr   r#   get_no_projectr'   append)r   resultsrc
src_folders       r   get_python_path_foldersz _Project.get_python_path_foldersB   s    :>>-44sx? 	* 	*C$Z%EFF * *+--::3??
j)))* * * * * * * * * * * * * * * s   7BB	B	c                     | j         g S t          | j                  }|                    | j                            | j                              |S )zReturns project source folders)rootlistr   extendr   _find_source_folders)r   r:   s     r   get_source_foldersz_Project.get_source_foldersO   sJ    9 	Id122dk66tyAABBBr   c                 ^    t          | j                  D ]}|                    |           dS )zValidate files and folders contained in this folder

        It validates all of the files and folders contained in this
        folder if some observers are interested in them.

        N)r@   r   validate)r   r.   observers      r   rE   z_Project.validateW   s>     T^,, 	& 	&Hf%%%%	& 	&r   c                 :    | j                             |           dS )zORegister a `ResourceObserver`

        See `FilteredResourceObserver`.
        N)r   r9   r   rF   s     r   add_observerz_Project.add_observera   s     
 	h'''''r   c                 P    || j         v r| j                             |           dS dS )z&Remove a registered `ResourceObserver`N)r   removerH   s     r   remove_observerz_Project.remove_observerh   s7    t~% 	,N!!(+++++	, 	,r   c                 >    | j                             ||           dS )zApply the changes in a `ChangeSet`

        Most of the time you call this function for committing the
        changes for a refactoring.
        )task_handleN)r   do)r   changesrN   s      r   rO   z_Project.dom   s"     	[99999r   Fc                 8    | j                             ||          S r   )r   r,   )r   resourceforce_errorss      r   get_pymodulez_Project.get_pymoduleu   s    {//,GGGr   c                     | j         S r   r   r   s    r   
get_pycorez_Project.get_pycorex   s
    {r   c                 "    t          | |          S )z+Get the file with `path` (it may not exist))r   r   r!   s     r   get_filez_Project.get_file{   s    D$r   c                 "    t          | |          S )z-Get the folder with `path` (it may not exist))r   rZ   s     r   
get_folderz_Project.get_folder   s    dD!!!r   c                     | j         S r   )r   rW   s    r   	get_prefsz_Project.get_prefs   s
    zr   c                     |                      |||          }|t          d|z            | j                            |          S )Nr)   )find_relative_moduler
   r   r,   )r   r-   r.   levelr0   s        r   get_relative_modulez_Project.get_relative_module   sL    **4?? 	D%&;d&BCCC{//777r   returnc                     |                                  D ]}t          ||          }||c S |                                 D ]}t          ||          }||c S |t          ||          }||S dS )zjReturns a resource corresponding to the given module

        returns None if it can not be found
        N)rC   _find_module_in_folderr=   )r   modnamer.   r;   r0   s        r   r+   z_Project.find_module   s    
 **,, 	 	C+C99F //11 	 	C+C99F  	+FG<<F tr   c                 j    t          |dz
            D ]	}|j        }
|dk    r|S t          ||          S )N    )rangeparentrf   )r   rg   r.   rb   is        r   ra   z_Project.find_relative_module   sG    uqy!! 	# 	#A]FFb= 	;M)&':::r   c                     dS )NF r   rR   s     r   
is_ignoredz_Project.is_ignored   s    ur   c                     d S r   ro   r   r-   s     r   r   z_Project._get_resource_path   s    r   c                 *    t          j        |           S r   )r   HistoryrW   s    r   r   z_Project.history   s     t$$$r   c                 *    t          j        |           S r   )r   PyCorerW   s    r   r   z_Project.pycore   s     }T"""r   c                 >    t          j        dt          d           d S )NzCannot close a NoProject   )
stacklevel)warningswarnDeprecationWarningrW   s    r   closez_Project.close   s"    02DQRSSSSSSr   r   )F)#__name__
__module____qualname__r   __annotations__r   r'   r1   r=   rC   rE   rI   rL   r   DEFAULT_TASK_HANDLErO   rT   rX   r[   r]   r_   rc   r   r   r+   ra   rq   r   propertyr	   saveitr   r   r~   
ropefolderro   r   r   r   r      s        LLL) ) )X X X.	8 	8 	8 	8    & & &( ( (, , ,
 '1&D : : : :H H H H       " " "  8 8 8 8D>    &; ; ;     
\% % \ X% 
\# # \ X#T T T JJJr   r   c                        e Zd ZdZ	 d fd	Zd Z ej        d          d             Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zed             Zd fd	Z ed           Z ed           Z xZS )Projectz&A Project containing files and foldersN.ropeprojectc                     |dk    r"t          |                              d          }t          |t                    sJ || _        || _        t          j                            | j                  st          j	        | j                   n8t          j        
                    | j                  st          j        d          |)t          j        j                            | j                  }t#                                          |           t'                      | _        t+          |           | _        |                     |           || j                            d|           |                                  dS )a&  A rope project

        :parameters:
            - `projectroot`: The address of the root folder of the project
            - `fscommands`: Implements the file system operations used
              by rope; have a look at `rope.base.fscommands`
            - `ropefolder`: The name of the folder in which rope stores
              project configurations and data.  Pass `None` for not using
              such a folder at all.
            - `prefs`: Specify project preferences.  These values
              overwrite config file preferences.

        /z/\z*Project root exists and is not a directoryNignored_resources)	_realpathrstrip
isinstancestr_address_ropefolder_namer    r!   r"   mkdirr%   r   	RopeErrorropebaser   create_fscommandssuperr   r   ignored_FileListCacher	file_list_init_prefsr   add_init_source_folders)r   projectrootr   r   r   	__class__s        r   r   zProject.__init__   sM     # 	?#K0077>>K+s+++++# *w~~dm,, 	XHT]####t}-- 	X&'VWWW 	O-??NNJ$$$'))(.. 	<JNN.
;;;!!#####r   c                 b    d                     | j        j        | j        j        | j                  S )Nz<{}.{} "{}">)formatr   r   r   addressrW   s    r   __repr__zProject.__repr__   s/    $$N%N#L
 
 	
r   z)Delete once deprecated functions are gonec                     | j                             dg           D ]1}|                     |          }| j                            |           2d S )Nsource_folders)r   r4   r'   r   r9   )r   r!   r.   s      r   r   zProject._init_source_folders   sY    JNN#3R88 	7 	7D&&t,,F'..v6666	7 	7r   c                 4    | j                                         S r   )r   	get_filesrW   s    r   r   zProject.get_files   s    ~'')))r   c                 D      fd                                  D             S )z1Returns all python files available in the projectc                 H    g | ]}j                             |          |S ro   )r   is_python_file).0rR   r   s     r   
<listcomp>z,Project.get_python_files.<locals>.<listcomp>   s?     
 
 
{))(33

 
 
r   )r   rW   s   `r   get_python_fileszProject.get_python_files   s8    
 
 
 
 NN,,
 
 
 	
r   c                 `    t          j        j        | j        g|                    d          R  S Nr   )r    r!   joinr   splitrs   s     r   r   zProject._get_resource_path   s(    w|DM<DJJsOO<<<<r   c                     | j         5| j                                         s|                     | j                    d S d S d S r   )r   r"   _create_recursivelyrW   s    r   _init_ropefolderzProject._init_ropefolder   sQ    ? 	6t/E/E/G/G 	6$$T_55555	6 	6 	6 	6r   c                     |j         | j        k    r3|j                                         s|                     |j                    |                                 d S r   )rl   r?   r"   r   create)r   r.   s     r   r   zProject._create_recursively  sO    =DI% 	4fm.B.B.D.D 	4$$V]333r   c                    t          | j        | j                                                  }|| _        | j                            d| j        j                   | j                            | j        j                   |	                                D ] \  }}| j        
                    ||           !|                                  |                                  |j        r|                    |            d S d S )Nr   )r   r?   r   parser   add_callbackr   set_patternsr   itemsset_init_other_partsr   project_opened)r   r   configkeyvalues        r   r   zProject._init_prefs  s    DIt77==??

 3T\5NOOO!!$*">???++-- 	' 	'JCJNN3&&&&     	(!!$'''''	( 	(r   c                     | j          d S r   rV   rW   s    r   r   zProject._init_other_parts  s    r   c                 6    | j                             |          S r   )r   
does_matchrp   s     r   rq   zProject.is_ignored  s    |&&x000r   c                 .    |                                   dS zCloses project open resourcesN)r~   rW   s    r   synczProject.sync  s    

r   c                 8    | j                                          dS r   )r   writerW   s    r   r~   zProject.close  s    r   c                 <    | j                             ||           dS )z#Set the `key` preference to `value`N)r   r   )r   r   r   s      r   r   zProject.set"  s    
sE"""""r   c                 H    | j         |                     | j                   S d S r   )r   r]   rW   s    r   r   zProject.ropefolder&  s,      	:??4#8999	: 	:r   c                 \    || j         }t                                          |           d S r   )r?   r   rE   )r   r.   r   s     r   rE   zProject.validate+  s0     	YF     r   c                 ,    |                      d          S )Nrj   )r'   rW   s    r   <lambda>zProject.<lambda>0  s    !2!22!6!6 r   c                     | j         S r   )r   rW   s    r   r   zProject.<lambda>1  s    DM r   )Nr   r   )r   r   r   __doc__r   r   r	   
deprecatedr   r   r   r   r   r   r   r   rq   r   r~   r   r   r   rE   r?   r   __classcell__r   s   @r   r   r      s~       00 8F!$ !$ !$ !$ !$ !$F
 
 
 UABB7 7 CB7
* * *
 
 
= = =6 6 6  

( 
( 
(  1 1 1       # # # : : X:! ! ! ! ! !
 86677Dh1122GGGGGr   r   c                   B     e Zd ZdZ fdZd Z fdZd Zd ZdZ	 xZ
S )	NoProjectzvA null object for holding out of project files.

    This class is singleton use `get_no_project` global function
    c                     t           j        j                                        }t	                                          |           d S r   )r   r   r   FileSystemCommandsr   r   )r   r   r   s     r   r   zNoProject.__init__:  s7    Y)<<>>
$$$$$r   c                 j    |                     dt          j        j                  }t	          |          S r   )replacer    r!   sepr   )r   r-   	real_names      r   r   zNoProject._get_resource_path>  s'    LLbgk22	###r   c                     t          |                              t          j        j        d          }t                                          |          S r   )r   r   r    r!   r   r   r'   )r   r-   universal_namer   s      r   r'   zNoProject.get_resourceB  s:    "400cBBww##N333r   c                     g S r   ro   rW   s    r   r   zNoProject.get_filesF      	r   c                     g S r   ro   rW   s    r   r   zNoProject.get_python_filesI  r   r   N)r   r   r   r   r   r   r'   r   r   _no_projectr   r   s   @r   r   r   4  s         
% % % % %$ $ $4 4 4 4 4     KKKKKr   r   c                  b    t           j        t                      t           _        t           j        S r   )r   r   ro   r   r   r8   r8   O  s"     , )	  r   c                   .    e Zd Zd Zd Zd Zd ZddZdS )r   c                     || _         d | _        t          j        | j        | j        | j        | j        | j                  }| j                             |           d S r   )projectfilesresourceobserverResourceObserver_changed_invalidrI   )r   r   rawobservers      r   r   z_FileListCacher.__init__V  sU    
&7M4=$-
 
 	!!+.....r   c                     | j         2t                      | _         |                     | j        j                   | j         S r   )r   r   
_add_filesr   r?   rW   s    r   r   z_FileListCacher.get_files^  s6    : 	/DJOODL-...zr   c                     |                                 D ]`}|                                r|                     |           ,| j                            |          s| j                            |           ad S r   )get_children	is_folderr   r   rq   r   r   )r   r.   childs      r   r   z_FileListCacher._add_filesd  s{    ((** 	& 	&E   &&&&&\,,U33 &
u%%%		& 	&r   c                 @    |                                 r	d | _        d S d S r   )r   r   rp   s     r   r   z_FileListCacher._changedk  s+     	DJJJ	 	r   Nc                     d | _         d S r   )r   )r   rR   new_resources      r   r   z_FileListCacher._invalido  s    


r   r   )r   r   r   r   r   r   r   r   ro   r   r   r   r   U  sd        / / /  & & &       r   r   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )r   c                 "    || _         g | _        d S r   )r   hooks)r   r   s     r   r   z_DataFiles.__init__t  s    


r   c                    | j         j        d S |                     |          }|                                rt	          |j        d          5 }g }	 	 |                    t          j        |                     (# t          $ r Y nw xY wt          |          dk    r|d         cd d d            S t          |          dk    r|cd d d            S 	 d d d            d S # 1 swxY w Y   d S d S )NrbTri   r   )r   r   	_get_filer"   open	real_pathr9   pickleloadEOFErrorlen)r   r-   file
input_filer:   s        r   	read_dataz_DataFiles.read_datax  s   <" 	4~~d##;;== 	"dnd++ 
"z?fk*&=&=>>>?   Dv;;!# %!!9
" 
" 
" 
" 
" 
" 
" 
" v;;? "!
" 
" 
" 
" 
" 
" 
" 
""
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
"	" 	"s6   C )A::
BC BC 1C  C$'C$c                    | j         j        |                     |          }t                      5 }|                    t          |j        d                    }|                    t          |j        dz   d                    }t          j        ||d           t          j        ||d            d d d            d S # 1 swxY w Y   d S d S )Nwbz.jsonwry   c                 *    |                                  S r   )__getstate__)os    r   r   z'_DataFiles.write_data.<locals>.<lambda>  s    @P@P r   )default)
r   r   r   r   enter_contextr   r   r   dumpjson)r   r-   datar  cmoutput_fileoutput_file2s          r   
write_dataz_DataFiles.write_data  s   <" 	R>>$''D R ..tDND/I/IJJ!//T^g5Ms0S0STTD+q111	$6P6PQQQQ	R R R R R R R R R R R R R R R R R R	R 	Rs   BB??CCc                 :    | j                             |           d S r   )r   r9   r   hooks     r   add_write_hookz_DataFiles.add_write_hook  s    
$r   c                 .    | j         D ]} |             d S r   )r   r  s     r   r   z_DataFiles.write  s*    J 	 	DDFFFF	 	r   c                 d    | j         j        j        dz   |z   }| j                             |          S r   )r   r   r!   r[   )r   r-   r!   s      r   r   z_DataFiles._get_file  s/    |&+c1D8|$$T***r   N)	r   r   r   r   r  r  r  r   r   ro   r   r   r   r   s  sq          " " ""R R R       + + + + +r   r   c                    t           j        dk    rp| dd         dk    r| S | dd         dk    rd| d         z   | dd	         z   } t          j                            t          j                            |                     S t          j                            t          j                            t          j                            |                               S )
a^  Return the real path of `path`

    Is equivalent to ``realpath(abspath(expanduser(path)))``.

    Of the particular notice is the hack dealing with the unfortunate
    situation of running native-Windows python (os.name == 'nt') inside
    of Cygwin (abspath starts with '/'), which apparently normal
    os.path.realpath completely messes up.

    cygwinri      z:\z:/z
/cygdrive/r   ry   N)r5   platformr    r!   abspath
expanduserrealpath)r!   s    r   r   r     s     |x 9!9 	5K!A#Y$ 	5$q')DH4Dwrw11$778887BGOOBG,>,>t,D,DEEFFFr   c                    | }|                     d          }|d d         D ]C}|                                r+|                    |          r|                    |          }A d S |                                r|                    |d                   rH|                    |d                                                   r|                    |d                   S |                    |d         dz             rP|                    |d         dz                                             s"|                    |d         dz             S d S d S d S )N.z.py)r   r   	has_child	get_child)r.   rg   r0   packagespkgs        r   rf   rf     si   F}}S!!H}   	&"2"23"7"7 	%%c**FF44 
:Xb\**		:  "..88::		: ##HRL111Xb\E122	:$$Xb\E%9::DDFF	: ##HRL5$8999
: 
:	: 	: 	: 	:r   )'r6   r  r    r5   r{   r   typingr   rope.base.fscommandsr   rope.base.resourceobserverr   r   	rope.baser   r   r   r   r	   rope.base.exceptionsr
   rope.base.prefsr   r   rope.base.resourcesr   r   r   cPickler   ImportErrorr   r   r   r8   r   r   r   rf   ro   r   r   <module>r1     sG        				 



                        5 5 5 5 5 5 5 5 5 D D D D D D D D D D D D D D 4 4 4 4 4 4 - - - - - - - - > > > > > > > > > >   MMMMMd d d d d d d dNt3 t3 t3 t3 t3h t3 t3 t3n       6! ! !       <(+ (+ (+ (+ (+ (+ (+ (+VG G G*: : : : :s   A 	A&%A&