
    ck5                        d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
mZ d dlmZ  G d d          Z G d de          Zd	 Z G d
 de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Zd Zd Z G d d          Zd Z G d d          Z G d d          ZdS )    N)Union)
exceptions
taskhandleutils)FileContentc                   ^    e Zd ZdZddZddZd Zd Zee	j
        d                         ZdS )	ChangezThe base class for changes

    Rope refactorings return `Change` objects.  They can be previewed,
    committed or undone.
    Nc                     dS )zaPerform the change

        .. note:: Do use this directly.  Use `Project.do()` instead.
        N selfjob_sets     0lib/python3.11/site-packages/rope/base/change.pydoz	Change.do             c                     dS )zcPerform the change

        .. note:: Do use this directly.  Use `History.undo()` instead.
        Nr   r   s     r   undozChange.undo   r   r   c                      t          |           S )zdReturn the description of this change

        This can be used for previewing the changes.
        )strr   s    r   get_descriptionzChange.get_description   s    
 4yyr   c                     g S )z1Return the list of resources that will be changedr   r   s    r   get_changed_resourceszChange.get_changed_resources&   s    	r   c                 4    t          | j        j                  S N)_ResourceOperationsresourceprojectr   s    r   _operationszChange._operations*   s     #4=#8999r   r   )__name__
__module____qualname____doc__r   r   r   r   propertyr   saveitr    r   r   r   r	   r	      s                    
\: : \ X: : :r   r	   c                   Z    e Zd ZdZd
dZej        fdZej        fdZd Z	d Z
d Zd	 ZdS )	ChangeSetzA collection of `Change` objects

    This class holds a collection of changes.  This class provides
    these fields:

    * `changes`: the list of changes
    * `description`: the goal of these changes
    Nc                 0    g | _         || _        || _        d S r   )changesdescriptiontime)r   r+   	timestamps      r   __init__zChangeSet.__init__:   s    &			r   c                     	 g }| j         D ],}|                    |           |                    |           -t          j                    | _        d S # t          $ r |D ]}|                                  w xY wr   )r*   r   appendr,   	Exceptionr   r   r   donechanges       r   r   zChangeSet.do?   s    		D, $ $		'"""F####	DIII 	 	 	  	s   AA %A7c                     	 g }t          | j                  D ],}|                    |           |                    |           -d S # t          $ r |D ]}|                                  w xY wr   )reversedr*   r   r0   r1   r   r2   s       r   r   zChangeSet.undoK   s    	D"4<00 $ $G$$$F####$ $  	 	 	  			s   AA %A,c                 :    | j                             |           d S r   )r*   r0   r   r4   s     r   
add_changezChangeSet.add_changeV   s    F#####r   c                     t          |           dz   g}| j        D ]>}|                    |                                           |                    d           ?d                    |          S )Nz:



 )r   r*   r0   r   joinr   resultr4   s      r   r   zChangeSet.get_descriptionY   si    d))i'(l 	  	 FMM&0022333MM$wwvr   c                 p   | j         (t          j                            | j                   }|                                t          j                                        k    rd}n|                                t          j                                        t          j        d          z
  k    rd}nW|j        t          j                                        j        k    r|                    d          }n|                    d          }|                    d          }| d| d}| j        dz   |z   S | j        S )	Ntoday   	yesterdayz%b %dz	%d %b, %Yz%H:%M:%S z - )	r,   datetimefromtimestampdaterA   	timedeltayearstrftimer+   )r   rG   string_datestring_times       r   __str__zChangeSet.__str__`   s   9 	:$2249==Dyy{{hm11333 9%!4!4!6!69KA9N9N!NO 9)hm113388 9"mmG44"mmK88--
33K(99;999K#e+k99r   c                     t                      }| j        D ])}|                    |                                           *|S r   )setr*   updater   r>   s      r   r   zChangeSet.get_changed_resourcesp   sB    l 	: 	:FMM&66889999r   r   )r!   r"   r#   r$   r.   r   DEFAULT_JOB_SETr   r   r9   r   rM   r   r   r   r   r(   r(   0   s            
 $3 
 
 
 
 &5 	 	 	 	$ $ $            r   r(   c                 *     t           j        f fd	}|S )zA decorator for handling `taskhandle.JobSet`

    A decorator for handling `taskhandle.JobSet` for `do` and `undo`
    methods of `Change`.
    c                     |                     t          |                       |            |                                 d S r   )started_jobr   finished_job)r   r   functions     r   callz_handle_job_set.<locals>.call~   sB    CII&&&r   )r   rQ   )rV   rW   s   ` r   _handle_job_setrX   w   s0     &5      
 Kr   c                   X    e Zd ZdZd	dZed             Zed             Zd Zd Z	d Z
dS )
ChangeContentszA class to change the contents of a file

    Fields:

    * `resource`: The `rope.base.resources.File` to change
    * `new_contents`: What to write in the file
    Nc                 0    || _         || _        || _        d S r   )r   new_contentsold_contents)r   r   r\   r]   s       r   r.   zChangeContents.__init__   s     ((r   c                     | j         | j                                        | _         | j                            | j        | j                   d S r   )r]   r   readr    
write_filer\   r   s    r   r   zChangeContents.do   sG     	5 $ 2 2 4 4D##DM43DEEEEEr   c                     | j         t          j        d          | j                            | j        | j                    d S )Nz+Undoing a change that is not performed yet!)r]   r   HistoryErrorr    r`   r   r   s    r   r   zChangeContents.undo   sD     	Y)*WXXX##DM43DEEEEEr   c                      d| j         j        z  S )NzChange <%s>r   pathr   s    r   rM   zChangeContents.__str__   s    t}111r   c                 ~   | j         }| j        }|5| j                                        r| j                                        }nd}t          j        |                    d          |                    d          d| j        j        z   d| j        j        z             }d	                    t          |                    S )Nr<   Tza/zb/)r\   r]   r   existsr_   difflibunified_diff
splitlinesre   r=   list)r   newoldr?   s       r   r   zChangeContents.get_description   s     	}##%% m((**%NN4  NN4  4=%%4=%%	
 
 wwtF||$$$r   c                     | j         gS r   r   r   s    r   r   z$ChangeContents.get_changed_resources       r   r   r!   r"   r#   r$   r.   rX   r   r   rM   r   r   r   r   r   rZ   rZ      s         ) ) ) ) F F _F
 F F _F
2 2 2% % %     r   rZ   c                   X    e Zd ZdZd
dZed             Zed             Zd Zd Z	d Z
d	S )MoveResourcezMove a resource to a new location

    Fields:

    * `resource`: The `rope.base.resources.Resource` to move
    * `new_resource`: The destination for move; It is the moved
      resource not the folder containing that resource.
    Fc                     |j         | _         || _        |st          ||          }|                                r!| j                             |          | _        d S | j                             |          | _        d S r   )r   r   _get_destination_for_move	is_folder
get_foldernew_resourceget_file)r   r   new_locationexacts       r   r.   zMoveResource.__init__   s|    '  	M4X|LLL 	D $ 7 7 E ED $ 5 5l C CDr   c                 P    | j                             | j        | j                   d S r   )r    mover   rx   r   s    r   r   zMoveResource.do   s&    dmT->?????r   c                 P    | j                             | j        | j                   d S r   )r    r}   rx   r   r   s    r   r   zMoveResource.undo   s&    d/?????r   c                      d| j         j        z  S )Nz	Move <%s>rd   r   s    r   rM   zMoveResource.__str__   s    T]///r   c                 V    d                     | j        j        | j        j                  S )Nzrename from {}
rename to {})formatr   re   rx   r   s    r   r   zMoveResource.get_description   s+    -44M"
 
 	
r   c                     | j         | j        gS r   )r   rx   r   s    r   r   z"MoveResource.get_changed_resources   s    t011r   N)Frq   r   r   r   rs   rs      s         D D D D @ @ _@ @ @ _@0 0 0
 
 
2 2 2 2 2r   rs   c                   \    e Zd ZdZd Zed             Zed             Zd Zd Z	d Z
d Zd	S )
CreateResourcezXA class to create a resource

    Fields:

    * `resource`: The resource to create
    c                     || _         d S r   ro   r   r   s     r   r.   zCreateResource.__init__        r   c                 D    | j                             | j                   d S r   )r    creater   r   s    r   r   zCreateResource.do   !    .....r   c                 D    | j                             | j                   d S r   r    remover   r   s    r   r   zCreateResource.undo   r   r   c                      d| j         j        z  S )NzCreate Resource <%s>rd   r   s    r   rM   zCreateResource.__str__   s    %);<<r   c                      d| j         j        z  S )Nznew file %srd   r   s    r   r   zCreateResource.get_description        233r   c                     | j         gS r   ro   r   s    r   r   z$CreateResource.get_changed_resources   rp   r   c                 6    |j         dk    r|S |j         dz   |z   S Nr<   /)re   )r   parentnames      r   _get_child_pathzCreateResource._get_child_path   s(    ;" 	,K;$t++r   N)r!   r"   r#   r$   r.   rX   r   r   rM   r   r   r   r   r   r   r   r      s         ! ! ! / / _/ / / _/= = =4 4 4  , , , , ,r   r   c                   "     e Zd ZdZ fdZ xZS )CreateFolderzCA class to create a folder

    See docs for `CreateResource`.
    c                     |j                             |                     ||                    }t                                          |           d S r   )r   rw   r   superr.   r   r   r   r   	__class__s       r   r.   zCreateFolder.__init__
  sF    >,,T-A-A&$-O-OPP"""""r   r!   r"   r#   r$   r.   __classcell__r   s   @r   r   r     B         
# # # # # # # # #r   r   c                   "     e Zd ZdZ fdZ xZS )
CreateFilezAA class to create a file

    See docs for `CreateResource`.
    c                     |j                             |                     ||                    }t                                          |           d S r   )r   ry   r   r   r.   r   s       r   r.   zCreateFile.__init__  sF    >**4+?+?+M+MNN"""""r   r   r   s   @r   r   r     r   r   r   c                   P    e Zd ZdZd Zed             Zed             Zd Zd Z	dS )RemoveResourcez\A class to remove a resource

    Fields:

    * `resource`: The resource to be removed
    c                     || _         d S r   ro   r   s     r   r.   zRemoveResource.__init__"  r   r   c                 D    | j                             | j                   d S r   r   r   s    r   r   zRemoveResource.do%  r   r   c                      t          d          )Nz0Undoing `RemoveResource` is not implemented yet.)NotImplementedErrorr   s    r   r   zRemoveResource.undo*  s    !"TUUUr   c                      d| j         j        z  S )NzRemove <%s>rd   r   s    r   rM   zRemoveResource.__str__.  r   r   c                     | j         gS r   ro   r   s    r   r   z$RemoveResource.get_changed_resources1  rp   r   N)
r!   r"   r#   r$   r.   rX   r   r   rM   r   r   r   r   r   r     s         ! ! ! / / _/ V V _V4 4 4    r   r   c                 p    t          | t                    r d}| j        D ]}|t          |          z  }|S dS )z7Counts the number of basic changes a `Change` will maker   rB   )
isinstancer(   r*   count_changes)r4   r?   childs      r   r   r   5  sH    &)$$ ^ 	+ 	+EmE***FF1r   c                 b    |                      t          |          t          |                    S r   )create_jobsetr   r   )task_handler4   s     r   create_job_setr   ?  s&    $$S[[-2G2GHHHr   c                   P    e Zd Zd Zd Zdeeef         fdZd Z	d Z
d Zdd	Zd
S )r   c                 |    || _         |j        | _        t          j        j                                        | _        d S r   )r   
fscommandsropebaseFileSystemCommandsdirect_commandsr   r   s     r   r.   z_ResourceOperations.__init__D  s2    !,#y3FFHHr   c                 R    | j                             |          r| j        S | j        S r   )r   
is_ignoredr   r   r   s     r   _get_fscommandsz#_ResourceOperations._get_fscommandsI  s+    <""8,, 	(''r   contentsc                 N   t          |t                    s,t          j        j                            ||j                  }n|}|                     |          }|                    |j	        |           t          | j        j                  D ]}|                    |           d S )N)newlines)r   bytesr   r   r   unicode_to_file_datar   r   write	real_pathrk   r   	observersresource_changed)r   r   r   datar   observers         r   r`   z_ResourceOperations.write_fileN  s    (E** 	9'<<!* =  DD
 D))(33
+T222T\344 	0 	0H%%h////	0 	0r   c                     |                      |          }|                    |j        |j                   t          | j        j                  D ]}|                    ||           d S r   )r   r}   r   rk   r   r   resource_moved)r   r   rx   r   r   s        r   r}   z_ResourceOperations.move\  sn    ))(33
*L,BCCCT\344 	< 	<H##Hl;;;;	< 	<r   c                     |                                 r|                     |j        d           n|                     |j                   t          | j        j                  D ]}|                    |           d S )Nfolder)kind)rv   _create_resourcere   rk   r   r   resource_created)r   r   r   s      r   r   z_ResourceOperations.createb  s     	1!!(-h!????!!(-000T\344 	0 	0H%%h////	0 	0r   c                     |                      |          }|                    |j                   t          | j        j                  D ]}|                    |           d S r   )r   r   r   rk   r   r   resource_removed)r   r   r   r   s       r   r   z_ResourceOperations.removej  si    ))(33
(,---T\344 	0 	0H%%h////	0 	0r   filec                     | j                             |          }t          j                            |          rt          j        d|z            | j                             |          }|j                                        st          j	        d|j        z            | 
                    |          }	 |dk    r|                    |           d S |                    |           d S # t          $ r}t          j        |          d }~ww xY w)NzResource <%s> already existsz$Parent folder of <%s> does not existr   )r   _get_resource_pathosre   rg   r   	RopeErrorry   r   ResourceNotFoundErrorr   create_filecreate_folderOSError)r   	file_namer   resource_pathr   r   es          r   r   z$_ResourceOperations._create_resourcep  s   77	BB7>>-(( 	W&'E'UVVV<((33%%'' 	26F   ))(33
	*v~ 8&&}55555((77777 	* 	* 	*&q)))	*s   6C* C* *
D4DDN)r   )r!   r"   r#   r.   r   r   r   r   r`   r}   r   r   r   r   r   r   r   r   C  s        I I I
  
0U33C-D 0 0 0 0< < <0 0 00 0 0* * * * * *r   r   c                     | j                             |          }t          j                            |          r|dk    r|dz   | j        z   S | j        S |S r   )r   r   r   re   isdirr   )r   destination	dest_paths      r   ru   ru     s[     33K@@I	w}}Y !" 	!$x}44= r   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )ChangeToDatac                 L     |j         } fd|j        D             }|||j        fS )Nc                 &    g | ]} |          S r   r   ).0r   r   s     r   
<listcomp>z1ChangeToData.convertChangeSet.<locals>.<listcomp>  s!    ;;;544;;;;;r   )r+   r*   r,   )r   r4   r+   r*   s   `   r   convertChangeSetzChangeToData.convertChangeSet  s5    (;;;;FN;;;Wfk22r   c                 4    |j         j        |j        |j        fS r   )r   re   r\   r]   r8   s     r   convertChangeContentsz"ChangeToData.convertChangeContents  s    $f&96;NOOr   c                 2    |j         j        |j        j        fS r   )r   re   rx   r8   s     r   convertMoveResourcez ChangeToData.convertMoveResource  s    $f&9&>??r   c                 L    |j         j        |j                                         fS r   r   re   rv   r8   s     r   convertCreateResourcez"ChangeToData.convertCreateResource       $fo&?&?&A&ABBr   c                 L    |j         j        |j                                         fS r   r   r8   s     r   convertRemoveResourcez"ChangeToData.convertRemoveResource  r   r   c                     t          |          }|t          t          fv rt          }t	          | d|j        z             }|j         ||          fS )Nconvert)typer   r   r   getattrr!   )r   r4   change_typemethods       r   __call__zChangeToData.__call__  sQ    6ll<44 	)(Ky;+??@@$ffVnn55r   N)	r!   r"   r#   r   r   r   r   r   r   r   r   r   r   r     sz        3 3 3
P P P@ @ @C C CC C C6 6 6 6 6r   r   c                   :    e Zd Zd Zd	dZd Zd Zd Zd Zd Z	dS )
DataToChangec                     || _         d S r   )r   r   s     r   r.   zDataToChange.__init__  s    r   Nc                 l    t          ||          }|D ] }|                     | |                     !|S r   )r(   r9   )r   r+   r*   r,   r?   r   s         r   makeChangeSetzDataToChange.makeChangeSet  sD    ;-- 	+ 	+Edd5kk****r   c                 X    | j                             |          }t          |||          S r   )r   ry   rZ   )r   re   r\   r]   r   s        r   makeChangeContentszDataToChange.makeChangeContents  s)    <((..hlCCCr   c                 Z    | j                             |          }t          ||d          S )NT)r{   )r   ry   rs   )r   old_pathnew_pathr   s       r   makeMoveResourcezDataToChange.makeMoveResource  s,    <((22Hhd;;;;r   c                     |r| j                             |          }n| j                             |          }t          |          S r   )r   rw   ry   r   r   re   rv   r   s       r   makeCreateResourcezDataToChange.makeCreateResource  D     	3|..t44HH|,,T22Hh'''r   c                     |r| j                             |          }n| j                             |          }t          |          S r   )r   rw   ry   r   r  s       r   makeRemoveResourcezDataToChange.makeRemoveResource  r
  r   c                 J    t          | d|d         z             } ||d          S )Nmaker   rB   )r   )r   r   r   s      r   r   zDataToChange.__call__  s+    vQ/00vtAwr   r   )
r!   r"   r#   r.   r   r  r  r	  r  r   r   r   r   r   r     s             D D D< < <( ( (( ( (         r   r   )rE   rh   r   r,   typingr   rope.base.fscommandsr   	rope.baser   r   r   r   r	   r(   rX   rZ   rs   r   r   r   r   r   r   r   ru   r   r   r   r   r   <module>r     s     				            3 3 3 3 3 3 3 3 3 3 , , , , , ,!: !: !: !: !: !: !: !:HD D D D D D D DN  / / / / /V / / /d&2 &2 &2 &2 &26 &2 &2 &2R ,  ,  ,  ,  ,V  ,  ,  ,F# # # # #> # # ## # # # # # # #    V   6  I I I=* =* =* =* =* =* =* =*@  6 6 6 6 6 6 6 64"  "  "  "  "  "  "  "  "  " r   