
    Æee&                     j    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	y)
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y)PyObjectToTextualzFor transforming `PyObject` to textual form

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

    c                     || _         y Nproject)selfr	   s     8/usr/lib/python3/dist-packages/rope/base/oi/transform.py__init__zPyObjectToTextual.__init__   	        c                     |yt        |      }	 t        | |j                  dz         } ||      S # t        $ r Y yw xY w)z&Transform a `PyObject` to textual form)none_to_textualunknown)typegetattr__name__AttributeError)r
   pyobjectobject_typemethods       r   	transformzPyObjectToTextual.transform   sM    8n	 T;#7#7-#GHF(## 	 	 s    1 	==c                 $    | j                  |      S r   r   r
   r   s     r   __call__zPyObjectToTextual.__call__   s    ~~h''r   c                     t        |j                         t        j                  j                  j
                        r-| j                  |j                               }|d   dk(  rd|fS |S y)Nr   definedinstancer   )
isinstanceget_typeropebase	pyobjectsAbstractClassr   )r
   r   results      r   PyObject_to_textualz%PyObjectToTextual.PyObject_to_textual"   s[    h'')499+>+>+L+LM^^H$5$5$78FayI%"F++Mr   c                 $    | j                  |      S r   _defined_to_textualr   s     r   PyFunction_to_textualz'PyObjectToTextual.PyFunction_to_textual*       ''11r   c                 $    | j                  |      S r   r,   r   s     r   PyClass_to_textualz$PyObjectToTextual.PyClass_to_textual-   r/   r   c                     g }|j                   9|j                  d|j                                |j                   }|j                   9d| j                  |j	                               dj                  |      fS )Nr   r!   .)parentinsertget_name_get_pymodule_path
get_modulejoin)r
   r   addresss      r   r-   z%PyObjectToTextual._defined_to_textual0   so    oo)NN1h//12H oo) ##H$7$7$9:HHW
 	
r   c                 (    d| j                  |      fS Nr!   r7   r   s     r   PyModule_to_textualz%PyObjectToTextual.PyModule_to_textual;       4228<==r   c                 (    d| j                  |      fS r<   r=   r   s     r   PyPackage_to_textualz&PyObjectToTextual.PyPackage_to_textual>   r?   r   c                 >    dd| j                  |j                        fS )Nbuiltinlistr   holdingr   s     r   List_to_textualz!PyObjectToTextual.List_to_textualA       64>>(2B2B#CDDr   c                 r    dd| j                  |j                        | j                  |j                        fS )NrC   dict)r   keysvaluesr   s     r   Dict_to_textualz!PyObjectToTextual.Dict_to_textualD   s2    NN8==)NN8??+	
 	
r   c                     |j                         D cg c]  }| j                  |       }}t        ddg|z         S c c}w )NrC   tuple)get_holding_objectsr   rO   )r
   r   rF   objectss       r   Tuple_to_textualz"PyObjectToTextual.Tuple_to_textualL   sJ    3;3O3O3Q
(/DNN7#
 
 i)G344
s   =c                 >    dd| j                  |j                        fS )NrC   setrE   r   s     r   Set_to_textualz PyObjectToTextual.Set_to_textualR   s    5$..1A1A"BCCr   c                 >    dd| j                  |j                        fS )NrC   iterrE   r   s     r   Iterator_to_textualz%PyObjectToTextual.Iterator_to_textualU   rH   r   c                 >    dd| j                  |j                        fS )NrC   	generatorrE   r   s     r   Generator_to_textualz&PyObjectToTextual.Generator_to_textualX   s    ;x7G7G(HIIr   c                      y)N)rC   str r   s     r   Str_to_textualz PyObjectToTextual.Str_to_textual[   s    !r   c                      y)N)rC   filer^   r   s     r   File_to_textualz!PyObjectToTextual.File_to_textual^   s    "r   c                 (    dd|j                         fS )NrC   function)r6   r   s     r   BuiltinFunction_to_textualz,PyObjectToTextual.BuiltinFunction_to_textuala   s    :x'8'8':;;r   c                 @    | j                  |j                               S r   )resource_to_pathget_resource)r
   pymodules     r   r7   z$PyObjectToTextual._get_pymodule_pathd   s    $$X%:%:%<==r   c                 d    |j                   | j                   k(  r|j                  S |j                  S r   )r	   path	real_path)r
   resources     r   rg   z"PyObjectToTextual.resource_to_pathg   s*    t||+== %%%r   N)r   
__module____qualname____doc__r   r   r   r*   r.   r1   r-   r>   rA   rG   rM   rR   rU   rX   r[   r_   rb   re   r7   rg   r^   r   r   r   r   	   so    	 (22	
>>E
5DE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y)TextualToPyObjectz+For transforming textual form to `PyObject`c                     || _         y r   r   )r
   r	   allow_in_project_absolutess      r   r   zTextualToPyObject.__init__q   r   r   c                 $    | j                  |      S r   r   r
   textuals     r   r   zTextualToPyObject.__call__t   s    ~~g&&r   c                 `    |y|d   }	 t        | |dz         } ||      S # t        $ r Y yw xY w)z3Transform an object from textual form to `PyObject`Nr   _to_pyobject)r   r   )r
   rw   r   r   s       r   r   zTextualToPyObject.transformw   sE    ?qz	T4.#89F'?" 		s   ! 	--c                 >    t        | d|d   z  d       }| ||      S y )Nzbuiltin_%s_to_pyobject   )r   )r
   rw   r   s      r   builtin_to_pyobjectz%TextualToPyObject.builtin_to_pyobject   s/    7'!*DdK'?" r   c                 R    t         j                  j                  j                         S r   )r%   r&   builtinsget_strrv   s     r   builtin_str_to_pyobjectz)TextualToPyObject.builtin_str_to_pyobject   s    yy!!))++r   c                 |    | j                  |d         }t        j                  j                  j	                  |      S N   )r   r%   r&   r~   get_listr
   rw   rF   s      r   builtin_list_to_pyobjectz*TextualToPyObject.builtin_list_to_pyobject   s/    ..,yy!!**733r   c                     | j                  |d         }| j                  |d         }t        j                  j                  j	                  ||      S )Nr      )r   r%   r&   r~   get_dict)r
   rw   rK   rL   s       r   builtin_dict_to_pyobjectz*TextualToPyObject.builtin_dict_to_pyobject   sC    ~~gaj)
+yy!!**488r   c                     |dd  D cg c]  }| j                  |       }}t        j                  j                  j                  | S c c}w r   )r   r%   r&   r~   	get_tuple)r
   rw   rF   rQ   s       r   builtin_tuple_to_pyobjectz+TextualToPyObject.builtin_tuple_to_pyobject   sE    :A!"+Fw4>>'*FFyy!!++W55 Gs   Ac                 |    | j                  |d         }t        j                  j                  j	                  |      S r   )r   r%   r&   r~   get_setr   s      r   builtin_set_to_pyobjectz)TextualToPyObject.builtin_set_to_pyobject   s/    ..,yy!!))'22r   c                 |    | j                  |d         }t        j                  j                  j	                  |      S r   )r   r%   r&   r~   get_iteratorr   s      r   builtin_iter_to_pyobjectz*TextualToPyObject.builtin_iter_to_pyobject   s/    ..,yy!!..w77r   c                 |    | j                  |d         }t        j                  j                  j	                  |      S r   )r   r%   r&   r~   get_generatorr   s      r   builtin_generator_to_pyobjectz/TextualToPyObject.builtin_generator_to_pyobject   s/    ..,yy!!//88r   c                 R    t         j                  j                  j                         S r   )r%   r&   r~   get_filerv   s     r   builtin_file_to_pyobjectz*TextualToPyObject.builtin_file_to_pyobject   s    yy!!**,,r   c                     |d   t         j                  j                  j                  v r8t         j                  j                  j                  |d      j                         S y r   )r%   r&   r~   
get_objectrv   s     r   builtin_function_to_pyobjectz.TextualToPyObject.builtin_function_to_pyobject   sK    1:++44499%%..wqz:EEGG 5r   c                      y r   r^   rv   s     r   unknown_to_pyobjectz%TextualToPyObject.unknown_to_pyobject       r   c                      y r   r^   rv   s     r   none_to_pyobjectz"TextualToPyObject.none_to_pyobject   r   r   c                 .    |d   }| j                  |      S Nr{   )_get_pymodule)r
   rw   rk   s      r   _module_to_pyobjectz%TextualToPyObject._module_to_pyobject   s    qz!!$''r   c                 L   |d   }|d   j                  d      }| j                  |      }|}|D ]X  }| y t        |t        j                  j
                  j                        r#	 |j                         |   j                         }X y  |S # t        j                  $ r Y  y w xY w)Nr{   r   r3   )splitr   r#   r%   r&   r'   PyDefinedObject	get_scoper   r   NameNotFoundError)r
   rw   rk   namesri   r   names          r   !_hierarchical_defined_to_pyobjectz3TextualToPyObject._hierarchical_defined_to_pyobject   s    qz
  %%%d+ 		D(DII$7$7$G$GH '113D9DDFH 		 	 "33   s   %!BB#"B#c                 r    t        |      dk(  s|d   dk(  r| j                  |      S | j                  |      S )Nr    )lenr   r   rv   s     r   defined_to_pyobjectz%TextualToPyObject.defined_to_pyobject   s;    w<1
b 0++G4499'BBr   c                     | j                  |d         }|)t        j                  j                  j	                  |      S y r   )r   r%   r&   r'   PyObject)r
   rw   r   s      r   instance_to_pyobjectz&TextualToPyObject.instance_to_pyobject   s:    ~~gaj)99&&//55 r   c                 `    | j                  |      }|| j                  j                  |      S y r   )path_to_resourcer	   get_pymodule)r
   rk   rm   s      r   r   zTextualToPyObject._get_pymodule   s2    ((.<<,,X66  r   c                    	 | j                   j                  }t        j                  j	                  |      s| j                   j                  |      S ||k(  s"|j                  |t        j                  z         ry dd l}|j                  j                   j                         j                  |      S # t        j                  $ r Y y w xY wNr   )r	   r:   osrk   isabsrh   
startswithseprope.base.projectr&   get_no_projectr   ResourceNotFoundError)r
   rk   rootr%   s       r   r   z"TextualToPyObject.path_to_resource   s    	<<''D77==&||0066t|ttbff}=$99$$335BB4HH// 		s   AB1 'B1 :6B1 1CCN)F)r   rn   ro   rp   r   r   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r^   r   r   rr   rr   n   sp    5'	#
,49
6389-H("C6
7
r   rr   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         }| j                  |      }|-|j                         }|j                  |      }|j                  S y )Nr{   r   )intr   r   get_inner_scope_for_liner   )r
   rw   rk   linenori   scopeinner_scopes          r   _function_to_pyobjectz*DOITextualToPyObject._function_to_pyobject   s]    qzWQZ%%d+&&(E88@K'''  r   c                    |dd  \  }}| j                  |      }|y |j                         }d }||j                         v r||   j                         }|0t	        |t
        j                  j                  j                        r|S | j                  ||j                         j                               }||j                  |      }|j                  S y r   )r   r   	get_namesr   r#   r%   r&   r'   PyClass_find_occurrencerh   readr   r   )	r
   rw   rk   r   ri   module_scope	suspectedr   r   s	            r   _class_to_pyobjectz'DOITextualToPyObject._class_to_pyobject   s    QR[
d%%d+))+	<))++$T*557I Z	499;N;N;V;V%W**41F1F1H1M1M1OPF!*CCFK"+++ "r   c                    t        |      dk(  r| j                  |      S |d   j                         r| j                  |      }n| j	                  |      }t        |t        j                  j                  j                        s|S y r   )
r   r   isdigitr   r   r#   r%   r&   r'   PyModule)r
   rw   r)   s      r   r   z(DOITextualToPyObject.defined_to_pyobject
  st    w<1++G44qz!!#33G<009fdii&9&9&B&BC Dr   c                     t        j                  d|z   dz         }|j                  d      }t        t	        |            D ]  }|j                  ||         s|dz   c S  y )Nz^\s*class\s*z\b
r{   )recompiler   ranger   match)r
   r   sourcepatternlinesis         r   r   z%DOITextualToPyObject._find_occurrence  sY    **_t3e;<T"s5z" 	A}}U1X&1u	r   c                     dd l }|j                  j                  j                  | j                  |      }||}t
        |   |      S r   )rope.base.libutilsr&   libutilspath_relative_to_project_rootr	   superr   )r
   rk   r%   relpath	__class__s       r   r   z%DOITextualToPyObject.path_to_resource  sB    !))$$BB4<<QUVDw'--r   )
r   rn   ro   rp   r   r   r   r   r   __classcell__)r   s   @r   r   r      s&    	(,"	. .r   r   )
rp   r   r   rope.base.builtinsr%   	rope.baser   r   rr   r   r^   r   r   <module>r      s;    0 	 	   b& b&Js sl>., >.r   