
    ce&                     ~    d Z ddlZddlZddlZddlmZ  G d d          Z G d d          Z G d d	e          Z	dS )
z*Provides classes for persisting `PyObject`    N)
exceptionsc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )PyObjectToTextualzFor transforming `PyObject` to textual form

    This can be used for storing `PyObjects` in files.  Use
    `TextualToPyObject` for converting back.

    c                     || _         d S Nproject)selfr	   s     6lib/python3.11/site-packages/rope/base/oi/transform.py__init__zPyObjectToTextual.__init__           c                     |dS t          |          }	 t          | |j        dz             } ||          S # t          $ r Y dS w xY w)z&Transform a `PyObject` to textual formN)none_to_textualunknown)typegetattr__name__AttributeError)r
   pyobjectobject_typemethods       r   	transformzPyObjectToTextual.transform   sh     	98nn	 T;#7-#GHHF6(### 	  	  	 <<	 s   "8 
AAc                 ,    |                      |          S r   r   r
   r   s     r   __call__zPyObjectToTextual.__call__   s    ~~h'''r   c                     t          |                                t          j        j        j                  r9|                     |                                          }|d         dk    rd|fS |S dS )Nr   definedinstancer   )
isinstanceget_typeropebase	pyobjectsAbstractClassr   )r
   r   results      r   PyObject_to_textualz%PyObjectToTextual.PyObject_to_textual"   sk    h''))49+>+LMM 	^^H$5$5$7$788FayI% ,"F++M|r   c                 ,    |                      |          S r   _defined_to_textualr   s     r   PyFunction_to_textualz'PyObjectToTextual.PyFunction_to_textual*       ''111r   c                 ,    |                      |          S r   r,   r   s     r   PyClass_to_textualz$PyObjectToTextual.PyClass_to_textual-   r/   r   c                     g }|j         6|                    d|                                           |j         }|j         6d|                     |                                          d                    |          fS )Nr   r!   .)parentinsertget_name_get_pymodule_path
get_modulejoin)r
   r   addresss      r   r-   z%PyObjectToTextual._defined_to_textual0   s    o 	'NN1h//11222H o 	' ##H$7$7$9$9::HHW
 	
r   c                 0    d|                      |          fS Nr!   r7   r   s     r   PyModule_to_textualz%PyObjectToTextual.PyModule_to_textual;       4228<<==r   c                 0    d|                      |          fS r<   r=   r   s     r   PyPackage_to_textualz&PyObjectToTextual.PyPackage_to_textual>   r?   r   c                 <    dd|                      |j                  fS )Nbuiltinlistr   holdingr   s     r   List_to_textualz!PyObjectToTextual.List_to_textualA       64>>(2B#C#CDDr   c                 n    dd|                      |j                  |                      |j                  fS )NrC   dict)r   keysvaluesr   s     r   Dict_to_textualz!PyObjectToTextual.Dict_to_textualD   s4    NN8=))NN8?++	
 	
r   c                 l      fd|                                 D             }t          ddg|z             S )Nc                 :    g | ]}                     |          S  r   .0rF   r
   s     r   
<listcomp>z6PyObjectToTextual.Tuple_to_textual.<locals>.<listcomp>M   s2     
 
 
(/DNN7##
 
 
r   rC   tuple)get_holding_objectsrT   )r
   r   objectss   `  r   Tuple_to_textualz"PyObjectToTextual.Tuple_to_textualL   sQ    
 
 
 
3;3O3O3Q3Q
 
 
 i)G3444r   c                 <    dd|                      |j                  fS )NrC   setrE   r   s     r   Set_to_textualz PyObjectToTextual.Set_to_textualR   s    5$..1A"B"BCCr   c                 <    dd|                      |j                  fS )NrC   iterrE   r   s     r   Iterator_to_textualz%PyObjectToTextual.Iterator_to_textualU   rH   r   c                 <    dd|                      |j                  fS )NrC   	generatorrE   r   s     r   Generator_to_textualz&PyObjectToTextual.Generator_to_textualX   s    ;x7G(H(HIIr   c                     dS )N)rC   strrP   r   s     r   Str_to_textualz PyObjectToTextual.Str_to_textual[   s    !!r   c                     dS )N)rC   filerP   r   s     r   File_to_textualz!PyObjectToTextual.File_to_textual^   s    ""r   c                 0    dd|                                 fS )NrC   function)r6   r   s     r   BuiltinFunction_to_textualz,PyObjectToTextual.BuiltinFunction_to_textuala   s    :x'8'8':':;;r   c                 P    |                      |                                          S r   )resource_to_pathget_resource)r
   pymodules     r   r7   z$PyObjectToTextual._get_pymodule_pathd   s"    $$X%:%:%<%<===r   c                 >    |j         | j         k    r|j        S |j        S r   )r	   path	real_path)r
   resources     r   rk   z"PyObjectToTextual.resource_to_pathg   s%    t|+ 	&= %%r   N)r   
__module____qualname____doc__r   r   r   r*   r.   r1   r-   r>   rA   rG   rM   rW   rZ   r]   r`   rc   rf   ri   r7   rk   rP   r   r   r   r   	   sV          	  	  	 ( ( (  2 2 22 2 2	
 	
 	
> > >> > >E E E
 
 
5 5 5D D DE E EJ J J" " "# # #< < <> > >& & & & &r   r   c                       e Zd ZdZ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d Zd Zd Zd Zd Zd Zd Zd Zd ZdS )TextualToPyObjectz+For transforming textual form to `PyObject`Fc                     || _         d S r   r   )r
   r	   allow_in_project_absolutess      r   r   zTextualToPyObject.__init__q   r   r   c                 ,    |                      |          S r   r   r
   textuals     r   r   zTextualToPyObject.__call__t   s    ~~g&&&r   c                 z    |dS |d         }	 t          | |dz             } ||          S # t          $ r Y dS w xY w)z3Transform an object from textual form to `PyObject`Nr   _to_pyobject)r   r   )r
   r{   r   r   s       r   r   zTextualToPyObject.transformw   sa     	4qz	T4.#899F6'??" 	 	 	44	s   , 
::c                 T    t          | d|d         z  d           }| ||          S d S )Nzbuiltin_%s_to_pyobject   )r   )r
   r{   r   s      r   builtin_to_pyobjectz%TextualToPyObject.builtin_to_pyobject   s=    7'!*DdKK 	#6'??"	# 	#r   c                 H    t           j        j                                        S r   )r%   r&   builtinsget_strrz   s     r   builtin_str_to_pyobjectz)TextualToPyObject.builtin_str_to_pyobject   s    y!))+++r   c                     |                      |d                   }t          j        j                            |          S N   )r   r%   r&   r   get_listr
   r{   rF   s      r   builtin_list_to_pyobjectz*TextualToPyObject.builtin_list_to_pyobject   s0    ..,,y!**7333r   c                     |                      |d                   }|                      |d                   }t          j        j                            ||          S )Nr      )r   r%   r&   r   get_dict)r
   r{   rK   rL   s       r   builtin_dict_to_pyobjectz*TextualToPyObject.builtin_dict_to_pyobject   sG    ~~gaj))
++y!**4888r   c                 `      fd|dd          D             }t          j        j        j        | S )Nc                 :    g | ]}                     |          S rP   r   rQ   s     r   rS   z?TextualToPyObject.builtin_tuple_to_pyobject.<locals>.<listcomp>   s%    FFFw4>>'**FFFr   r   )r%   r&   r   	get_tuple)r
   r{   rV   s   `  r   builtin_tuple_to_pyobjectz+TextualToPyObject.builtin_tuple_to_pyobject   s7    FFFF'!""+FFFy!+W55r   c                     |                      |d                   }t          j        j                            |          S r   )r   r%   r&   r   get_setr   s      r   builtin_set_to_pyobjectz)TextualToPyObject.builtin_set_to_pyobject   s0    ..,,y!))'222r   c                     |                      |d                   }t          j        j                            |          S r   )r   r%   r&   r   get_iteratorr   s      r   builtin_iter_to_pyobjectz*TextualToPyObject.builtin_iter_to_pyobject   s0    ..,,y!..w777r   c                     |                      |d                   }t          j        j                            |          S r   )r   r%   r&   r   get_generatorr   s      r   builtin_generator_to_pyobjectz/TextualToPyObject.builtin_generator_to_pyobject   s0    ..,,y!//888r   c                 H    t           j        j                                        S r   )r%   r&   r   get_filerz   s     r   builtin_file_to_pyobjectz*TextualToPyObject.builtin_file_to_pyobject   s    y!**,,,r   c                     |d         t           j        j        j        v r4t           j        j        j        |d                                                  S d S r   )r%   r&   r   
get_objectrz   s     r   builtin_function_to_pyobjectz.TextualToPyObject.builtin_function_to_pyobject   sK    1:+44 	H9%.wqz:EEGGG	H 	Hr   c                     d S r   rP   rz   s     r   unknown_to_pyobjectz%TextualToPyObject.unknown_to_pyobject       tr   c                     d S r   rP   rz   s     r   none_to_pyobjectz"TextualToPyObject.none_to_pyobject   r   r   c                 <    |d         }|                      |          S Nr   )_get_pymodule)r
   r{   ro   s      r   _module_to_pyobjectz%TextualToPyObject._module_to_pyobject   s    qz!!$'''r   c                 d   |d         }|d                              d          }|                     |          }|}|D ]r}| d S t          |t          j        j        j                  rE	 |                                |                                         }Y# t          j
        $ r Y  d S w xY w d S |S )Nr   r   r3   )splitr   r#   r%   r&   r'   PyDefinedObject	get_scoper   r   NameNotFoundError)r
   r{   ro   namesrm   r   names          r   !_hierarchical_defined_to_pyobjectz3TextualToPyObject._hierarchical_defined_to_pyobject   s    qz
  %%%%d++ 		 		D tt(DI$7$GHH  '1133D9DDFFHH!3      444  tts   ),BB*)B*c                     t          |          dk    s|d         dk    r|                     |          S |                     |          S )Nr    )lenr   r   rz   s     r   defined_to_pyobjectz%TextualToPyObject.defined_to_pyobject   sO    w<<1 	C
b 0 	C++G44499'BBBr   c                     |                      |d                   }|$t          j        j                            |          S d S r   )r   r%   r&   r'   PyObject)r
   r{   r   s      r   instance_to_pyobjectz&TextualToPyObject.instance_to_pyobject   sB    ~~gaj)) 	69&//555	6 	6r   c                 h    |                      |          }|| j                            |          S d S r   )path_to_resourcer	   get_pymodule)r
   ro   rq   s      r   r   zTextualToPyObject._get_pymodule   s=    ((.. 	7<,,X666	7 	7r   c                 x   	 | j         j        }t          j                            |          s| j                             |          S ||k    s"|                    |t          j        z             rd S dd l}|j	        j         
                                                    |          S # t          j        $ r Y d S w xY wNr   )r	   r:   osro   isabsrl   
startswithseprope.base.projectr&   get_no_projectr   ResourceNotFoundError)r
   ro   rootr%   s       r   r   z"TextualToPyObject.path_to_resource   s    	<'D7==&& 7|00666t| ttbf}== t$$$$9$3355BB4HHH/ 	 	 	44	s   AB& (B& 14B& &B98B9N)F)r   rr   rs   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rP   r   r   rv   rv   n   s`       55   ' ' '	 	 	# # #
, , ,4 4 49 9 9
6 6 63 3 38 8 89 9 9- - -H H H    ( ( (  "C C C6 6 6
7 7 7
    r   rv   c                   :     e Zd ZdZd Zd Zd Zd Z fdZ xZ	S )DOITextualToPyObjecta  For transforming textual form to `PyObject`

    The textual form DOI uses is different from rope's standard
    textual form.  The reason is that we cannot find the needed
    information by analyzing live objects.  This class can be
    used to transform DOI textual form to `PyObject` and later
    we can convert it to standard textual form using
    `TextualToPyObject` class.

    c                     |d         }t          |d                   }|                     |          }|0|                                }|                    |          }|j        S d S )Nr   r   )intr   r   get_inner_scope_for_liner   )r
   r{   ro   linenorm   scopeinner_scopes          r   _function_to_pyobjectz*DOITextualToPyObject._function_to_pyobject   sl    qzWQZ%%d++ 	(&&((E88@@K''	( 	(r   c                    |dd          \  }}|                      |          }|d S |                                }d }||                                v r||                                         }|&t	          |t
          j        j        j                  r|S | 	                    ||
                                                                          }||                    |          }|j        S d S r   )r   r   	get_namesr   r#   r%   r&   r'   PyClass_find_occurrencerl   readr   r   )	r
   r{   ro   r   rm   module_scope	suspectedr   r   s	            r   _class_to_pyobjectz'DOITextualToPyObject._class_to_pyobject   s    QRR[
d%%d++ 	4))++	<))+++ 	8$T*5577I 	,Z	49;N;V%W%W 	,**41F1F1H1H1M1M1O1OPPF ,*CCFKK"++, ,r   c                 ,   t          |          dk    r|                     |          S |d                                         r|                     |          }n|                     |          }t          |t          j        j        j	                  s|S d S r   )
r   r   isdigitr   r   r#   r%   r&   r'   PyModule)r
   r{   r)   s      r   r   z(DOITextualToPyObject.defined_to_pyobject
  s    w<<1 	++G444qz!!## :33G<<0099fdi&9&BCC  r   c                     t          j        d|z   dz             }|                    d          }t          t	          |                    D ]$}|                    ||                   r|dz   c S %d S )Nz^\s*class\s*z\b
r   )recompiler   ranger   match)r
   r   sourcepatternlinesis         r   r   z%DOITextualToPyObject._find_occurrence  s}    *_t3e;<<T""s5zz"" 	 	A}}U1X&& 1u	 	r   c                     dd l }|j        j                            | j        |          }||}t                                          |          S r   )rope.base.libutilsr&   libutilspath_relative_to_project_rootr	   superr   )r
   ro   r%   relpath	__class__s       r   r   z%DOITextualToPyObject.path_to_resource  sQ    !!!!)$BB4<QUVV 	Dww''---r   )
r   rr   rs   rt   r   r   r   r   r   __classcell__)r   s   @r   r   r      s~        	 	( ( (, , ,"	 	 	  . . . . . . . . .r   r   )
rt   r   r   rope.base.builtinsr%   	rope.baser   r   rv   r   rP   r   r   <module>r      s    0 0 				 				                b& b& b& b& b& b& b& b&Js s s s s s s sl>. >. >. >. >., >. >. >. >. >.r   