U
    ýÇ-eyX  ã                   @   s  d Z ddlZddlZddlZddlZ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m  mZ ddlmZ ddlmZ ddlmZmZ ddlmZ e ¡ d	krÄejd
dd dd„ ZG dd„ dƒZG dd„ deƒZdd„ Z G dd„ deƒZ!dS )z Tests for autoreload extension.
é    N)ÚStringIO)Ú	dataclass)ÚTestCase)ÚAutoreloadMagics)ÚEventManagerÚpre_run_cell)Úskipif_not_numpyÚPyPyz;Current autoreload implementation is extremely slow on PyPyT)Zallow_module_levelc                  O   s   d S ©N© )ÚaÚkwr   r   úi/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/IPython/extensions/tests/test_autoreload.pyÚ<lambda>-   ó    r   c                   @   s>   e Zd Zdd„ Ze ZZdd„ Zdd„ Zdd„ Z	dd
d„Z
d	S )Ú	FakeShellc                 C   sF   i | _ | j | _i | _t| dthƒ| _t| d| _| j d| jj¡ d S )Nr   )Úshell)	ÚnsÚuser_nsZuser_ns_hiddenr   r   Úeventsr   Úauto_magicsÚregister©Úselfr   r   r   Ú__init__1   s    zFakeShell.__init__c                 C   s&   | j  d¡ t|| jƒ | j ¡  d S )Nr   )r   ÚtriggerÚexecr   r   Úpost_execute_hook)r   Úcoder   r   r   Úrun_code;   s    zFakeShell.run_codec                 C   s   | j  |¡ d S r
   )r   Úupdate)r   Úitemsr   r   r   Úpush@   s    zFakeShell.pushc                 C   s   | j  |¡ d S r
   )r   Ú
autoreload)r   Ú	parameterr   r   r   Úmagic_autoreloadC   s    zFakeShell.magic_autoreloadNc                 C   s   | j j||d | j  ¡  d S )N©Ústream)r   Zaimportr   )r   r$   r'   r   r   r   Úmagic_aimportF   s    zFakeShell.magic_aimport)N)Ú__name__Ú
__module__Ú__qualname__r   ÚnoopZregister_magicsZset_hookr   r"   r%   r(   r   r   r   r   r   0   s   r   c                   @   sD   e Zd ZdZdZdZdZdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ ZdS )ÚFixturez&Fixture for creating test module filesNZ#abcdefghijklmopqrstuvwxyz0123456789c                 C   s2   t  ¡ | _ttjƒ| _tj d| j¡ tƒ | _	d S )Nr   )
ÚtempfileÚmkdtempÚtest_dirÚlistÚsysÚpathÚold_sys_pathÚinsertr   r   r   r   r   r   ÚsetUpR   s    
zFixture.setUpc                 C   s*   t  | j¡ | jt_d | _d | _d | _d S r
   )ÚshutilÚrmtreer0   r4   r2   r3   r   r   r   r   r   ÚtearDownX   s
    zFixture.tearDownc                 C   sF   dd  t | jd¡¡ }|tjkr*tj|= tj  | j|d ¡}||fS )NZtmpmod_Ú é   z.py)	ÚjoinÚrandomÚsampleÚfilename_charsr2   ÚmodulesÚosr3   r0   )r   Úmodule_nameÚ	file_namer   r   r   Ú
get_module`   s
    
zFixture.get_modulec              	   C   s<   t  |¡}t d¡ t|ddd}| |¡ W 5 Q R X dS )a+  
        Write a file, and force a timestamp difference of at least one second

        Notes
        -----
        Python's .pyc files record the timestamp of their compilation
        with a time resolution of one second.

        Therefore, we need to force a timestamp difference between .py
        and .pyc, without having the .py file be timestamped in the
        future, and without changing the timestamp of the .pyc file
        (because that is stored in the file).  The only reliable way
        to achieve this seems to be to sleep.
        gÍÌÌÌÌÌð?Úwúutf-8©ÚencodingN)ÚtextwrapÚdedentÚtimeÚsleepÚopenÚwrite)r   ÚfilenameÚcontentÚfr   r   r   Ú
write_fileg   s    

zFixture.write_filec              	   C   sB   t  |¡}|  ¡ \}}t|ddd}| |¡ W 5 Q R X ||fS )NrE   rF   rG   )rI   rJ   rD   rM   rN   )r   r   Úmod_nameÚmod_fnrQ   r   r   r   Ú
new_module~   s
    
zFixture.new_module)r)   r*   r+   Ú__doc__r0   r4   r?   r6   r9   rD   rR   rU   r   r   r   r   r-   K   s   r-   c                 C   s<   | j j}t| ddƒ}tj| }| d¡D ]}t||ƒ}q(|S )z;
    Original issue comes from pickle; hence the name.
    r*   NÚ.)Ú	__class__r)   Úgetattrr2   r@   Úsplit)ÚobjÚnamerB   Úobj2Úsubpathr   r   r   Úpickle_get_current_class‹   s    
r_   c                   @   sj   e Zd Zdd„ Zdd„ Zdd„ Zedd„ ƒZd	d
„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Zdd„ ZdS )ÚTestAutoreloadc              	   C   sl   |   t d¡¡\}}| j d¡ | j |¡ |  |t d¡¡ tjd| dd | j 	d¡ W 5 Q R X d S )Nzß
                                from enum import Enum
                                class MyEnum(Enum):
                                    A = 'A'
                                    B = 'B'
                            Ú2a  
                                from enum import Enum
                                class MyEnum(Enum):
                                    A = 'A'
                                    B = 'B'
                                    C = 'C'
                            ú[autoreload of %s failed:Ústderr©ZchannelÚpass)
rU   rI   rJ   r   r%   r(   rR   ÚttÚAssertNotPrintsr   ©r   rS   rT   r   r   r   Útest_reload_enums˜   s$    ÿÿ
ÿþ ÿz TestAutoreload.test_reload_enumsc                 C   s¬   | j  d¡ |  d¡\}}d| j jks*t‚d| j jks:t‚| j  d| ¡ | j  d¡ |  |d¡ | j jd }| j  d¡ t|ƒ}t||ƒst‚| j  d	¡ | j  d
¡ d S )Nra   zd
            class Test():
                def meth(self):
                    return "old"
        ÚtestÚresultzfrom %s import Testztest = Test()zd
            class Test():
                def meth(self):
                    return "new"
        re   zimport picklezp = pickle.dumps(test))	r   r%   rU   r   ÚAssertionErrorr   rR   r_   Ú
isinstance)r   rS   rT   Ztest_objectZ
test_classr   r   r   Útest_reload_class_type¶   s$    ÿþ	z%TestAutoreload.test_reload_class_typec              
   C   s”  | j  d¡ |  t d¡¡\}}| j  d| ¡ | j  d¡ | j  d¡ |  t¡ | j  d¡ W 5 Q R X |  t¡ | j  d¡ W 5 Q R X | j  d¡ |  t¡ | j  d	¡ W 5 Q R X |  |t d
¡¡ | j  d¡ dD ]²}| j  |› d¡ |  t¡ | j  |› d¡ W 5 Q R X |  t¡ | j  |› d¡ W 5 Q R X | j  |› d¡ | j  |› d¡ |  t¡ | j  |› d¡ W 5 Q R X qÜd S )Nra   aà  
                                class MyClass:

                                    def __init__(self, a=10):
                                        self.a = a
                                        self.b = 22 
                                        # self.toto = 33

                                    def square(self):
                                        print('compute square')
                                        return self.a*self.a
                            úfrom %s import MyClasszfirst = MyClass(5)zfirst.square()zfirst.cube()zfirst.power(5)zfirst.bz
first.totoa  
                            class MyClass:

                                def __init__(self, a=10):
                                    self.a = a
                                    self.b = 11

                                def power(self, p):
                                    print('compute power '+str(p))
                                    return self.a**p
                            zsecond = MyClass(5)>   ÚsecondÚfirstz	.power(5)z.cube()z	.square()z.bz.az.toto)	r   r%   rU   rI   rJ   r   ÚassertRaisesÚAttributeErrorrR   )r   rS   rT   Zobject_namer   r   r   Útest_reload_class_attributesÚ   sB    ÿÿÿþz+TestAutoreload.test_reload_class_attributesc              	   C   s|   | j  d¡ |  t d¡¡\}}| j  d| ¡ | j  d¡ |  |t d¡¡ tjd| dd | j  d	¡ W 5 Q R X d S )
Nra   zù
                                import numpy as np
                                class MyClass:
                                    a = (np.array((.1, .2)),
                                         np.array((.2, .3)))
                            ro   zfirst = MyClass()zù
                                import numpy as np
                                class MyClass:
                                    a = (np.array((.3, .4)),
                                         np.array((.5, .6)))
                            rb   rc   rd   re   )	r   r%   rU   rI   rJ   r   rR   rf   rg   rh   r   r   r   Útest_comparing_numpy_structures  s&    ÿÿ
ÿþ ÿz.TestAutoreload.test_comparing_numpy_structuresc           	   	   C   sÌ  | j  d¡ d}|  t |¡¡\}}| j  d|› d¡ | j  d¡ |  t¡ | j  d¡ W 5 Q R X |  t¡ | j  d¡ W 5 Q R X |  t¡ | j  d¡ W 5 Q R X d	}|  |t |¡¡ | j  d¡ | j  d
|› d¡ | j  d¡ | j  d¡ | j  d¡ d}|  |t |¡¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ t	j
dk rb| j  d¡ d}|  t |¡¡\}}d|› d}|  |t |¡¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ d S )NÚ3ú#
        def func1(): pass
        zfrom z	 import *zfunc1()zfunc2()z
t = Test()Únumberz¹
        def func1(): pass
        def func2(): pass
        class Test: pass
        number = 0
        from enum import Enum
        class TestEnum(Enum):
            A = 'a'
        zimport sys; sys.modules['z
'].func2()z
TestEnum.Aa%  
        def func1(): return 'changed'
        def func2(): return 'changed'
        class Test:
            def new_func(self):
                return 'changed'
        number = 1
        from enum import Enum
        class TestEnum(Enum):
            A = 'a'
            B = 'added'
        zassert func1() == 'changed'zassert func2() == 'changed'z,t = Test(); assert t.new_func() == 'changed'zassert number == 1)é   é   z"assert TestEnum.B.value == 'added'zë
        from enum import Enum
        class Ext(Enum):
            A = 'ext'
        def ext_func():
            return 'ext'
        class ExtTest:
            def meth(self):
                return 'ext'
        ext_int = 2
        z
        from z import *
        zassert Ext.A.value == 'ext'zassert ext_func() == 'ext'z't = ExtTest(); assert t.meth() == 'ext'zassert ext_int == 2)r   r%   rU   rI   rJ   r   rr   Ú	NameErrorrR   r2   Úversion_info)	r   Úmod_coderS   rT   Znew_codeZnew_mod_codeZnew_mod_nameZ
new_mod_fnZcurrent_mod_coder   r   r   Ú!test_autoload_newly_added_objects9  sH    	ÿz0TestAutoreload.test_autoload_newly_added_objectsc              	      sª   t G dd„ dƒƒ‰ ‡ ‡fdd„}|dƒ|dƒks4t‚|dƒ|dƒksHt‚|dƒ|d	ƒks\t‚|d
ƒ|dƒkspt‚|dƒ|dƒks„t‚ˆ t¡ ˆj d¡ W 5 Q R X d S )Nc                   @   s&   e Zd ZU eed< eed< eed< dS )z=TestAutoreload.test_verbose_names.<locals>.AutoreloadSettingsÚ	check_allÚenabledÚautoload_objN)r)   r*   r+   ÚboolÚ__annotations__r   r   r   r   ÚAutoreloadSettings  s   
r„   c                    s(   ˆj  | ¡ ˆj jj}ˆ |j|j|jƒS r
   )r   r%   r   Ú	_reloaderr   r€   r   )ÚmodeÚmodule_reloader©r„   r   r   r   Úgather_settings–  s    
ýz:TestAutoreload.test_verbose_names.<locals>.gather_settingsÚ0ÚoffZOFFÚ1Úexplicitra   Úallrv   ÚcompleteÚ4)r   rl   rr   Ú
ValueErrorr   r%   )r   r‰   r   rˆ   r   Útest_verbose_namesŽ  s    	z!TestAutoreload.test_verbose_namesc                 C   sÂ   | j jj}| j  d¡ |jd dks(t‚d|j ¡ ks:t‚| j  d¡ |jd dksXt‚d|j ¡ ksjt‚| j  d¡ |jd dksˆt‚d|j ¡ ksšt‚|jd dks¬t‚d|j ¡ ks¾t‚d S )NrA   Tz-mathÚmathz	-os, math)r   r   r…   r(   r@   rl   Zskip_modulesÚkeys)r   r‡   r   r   r   Útest_aimport_parsing©  s    
ÿz#TestAutoreload.test_aimport_parsingc              	   C   sØ  | j  d¡ d}|  |¡\}}| j  d|› ¡ tjddd | j  d¡ W 5 Q R X | j  d¡ |  ||¡ tjd	|› d
dd | j  d¡ W 5 Q R X | j  d¡ |  ||¡ tjd	|› d
dd | j  d¡ W 5 Q R X | j  d¡ |  ||¡ tjd	|› d
dd | j  d¡ W 5 Q R X | j  d¡ |  ||¡ | jdd}| j  d¡ W 5 Q R X |jd|› d
gks~t	‚| j  d¡ |  ||¡ | jdd}| j  d¡ W 5 Q R X |jd|› d
gksÔt	‚d S )Nr   rw   zimport r:   Ústdoutrd   re   zcomplete --printzReloading 'z'.zcomplete -pzcomplete --print --logr#   )ÚloggerzINFO:autoreload:Reloading 'zcomplete -l)
r   r%   rU   r   rf   ÚAssertPrintsrR   Z
assertLogsÚoutputrl   )r   r}   rS   rT   Úlor   r   r   Útest_autoreload_output¼  sJ    
 ÿ
 ÿ
 ÿz%TestAutoreload.test_autoreload_outputTc              	      s€  ˆ  d¡\}}|rxˆj d¡ ˆj |¡ tƒ }ˆjjd|d ˆ d| | ¡ ¡ ˆ t¡ ˆj d¡ W 5 Q R X nDˆj d¡ ˆj 	d| ¡ tƒ }ˆjjd|d ˆ 
d	| ¡ k¡ ˆ |ˆjj¡ tj| ‰ ˆ j‰ˆ  d
¡‰ˆ  ¡ ‰‡ ‡‡‡‡fdd„}|ƒ  ˆ |d¡ tjd| dd ˆj 	d¡ W 5 Q R X tjd| dd ˆj 	d¡ W 5 Q R X |ƒ  ˆ |d¡ ‡ ‡‡‡‡fdd„}ˆj 	d¡ |ƒ  t |¡ ˆj 	d¡ |ƒ  |rˆj d| ¡ tƒ }ˆjjd|d ˆ 
d| | ¡ k¡ ˆj d¡ nˆj d¡ ˆ |d¡ ˆj 	d¡ ˆj 	d¡ |ƒ  |rVˆj |¡ nˆj d¡ ˆj 	d¡ ˆ ˆ jd¡ dS )zt
        Functional test for the automatic reloader using either
        '%autoreload 1' or '%autoreload 2'
        a¸  
x = 9

z = 123  # this item will be deleted

def foo(y):
    return y + 3

class Baz(object):
    def __init__(self, x):
        self.x = x
    def bar(self, y):
        return self.x + y
    @property
    def quux(self):
        return 42
    def zzz(self):
        '''This method will be deleted below'''
        return 99

class Bar:    # old-style class: weakref doesn't work for it on Python < 2.7
    def foo(self):
        return 1
rŒ   r:   r&   zModules to reload:
%sZtmpmod_as318989e89dsra   z	import %sz%Modules to reload:
all-except-skippedé	   c                     s¶   ˆ  ˆ jd¡ ˆ  ˆ jd¡ ˆ  ˆdƒd¡ ˆ  ˆ  d¡d¡ ˆ  d¡} ˆ  ˆ d¡d¡ ˆ  |  d¡d¡ ˆ  | jd¡ ˆ  |  ¡ d¡ ˆ  ¡ }ˆ  ˆ ¡ d¡ ˆ  | ¡ d¡ d S )	Nrœ   é{   r   ry   é   é
   é*   éc   )	ÚassertEqualÚxÚzÚfooÚBazÚbarÚquuxÚzzzÚBar©r[   r]   ©ÚmodZold_fooZold_objZold_obj2r   r   r   Úcheck_module_contents'  s    
z>TestAutoreload._check_smoketest.<locals>.check_module_contentsz
a syntax error
rb   rc   rd   re   a  
x = 10

def foo(y):
    return y + 4

class Baz(object):
    def __init__(self, x):
        self.x = x
    def bar(self, y):
        return self.x + y + 1
    @property
    def quux(self):
        return 43

class Bar:    # old-style class
    def foo(self):
        return 2
c                     sÖ   ˆ  ˆ jd¡ ˆ tˆ dƒ¡ ˆ  ˆdƒd¡ ˆ  ˆ  d¡d¡ ˆ  d¡} ˆ  ˆ d¡d¡ ˆ  |  d¡d¡ ˆ  ˆjd¡ ˆ  | jd¡ ˆ tˆd	ƒ¡ ˆ t| d	ƒ¡ ˆ  ¡ }ˆ  ˆ ¡ d
¡ ˆ  | ¡ d
¡ d S )NrŸ   r¤   r   é   rœ   rž   é   é+   r©   é   )	r¢   r£   ZassertFalseÚhasattrr¥   r¦   r§   r¨   rª   r«   r¬   r   r   r®   i  s    
ú-zModules to skip:
%sz-tmpmod_as318989e89dsrŠ   z	
x = -99
iÿÿÿN)rU   r   r%   r(   r   ZassertInÚgetvaluerr   ÚImportErrorr   Ú
assertTruer   r2   r@   r¥   r¦   rª   rR   rf   r˜   rg   rA   Úunlinkr¢   r£   )r   Úuse_aimportrS   rT   r'   r®   r   r¬   r   Ú_check_smoketestç  sŠ    ÿ
ÿ

þ ÿ ÿþ
þzTestAutoreload._check_smoketestc                 C   s   | j dd d S )NT©r¹   ©rº   r   r   r   r   Útest_smoketest_aimport­  s    z%TestAutoreload.test_smoketest_aimportc                 C   s   | j dd d S )NFr»   r¼   r   r   r   r   Útest_smoketest_autoreload°  s    z(TestAutoreload.test_smoketest_autoreloadN)T)r)   r*   r+   ri   rn   rt   r   ru   r~   r’   r•   r›   rº   r½   r¾   r   r   r   r   r`   —   s   $=
!U+
 Gr`   )"rV   rA   ÚplatformZpytestr2   r.   rI   r7   r=   rK   Úior   Údataclassesr   ZIPython.testing.toolsÚtestingZtoolsrf   Zunittestr   ZIPython.extensions.autoreloadr   ZIPython.core.eventsr   r   ZIPython.testing.decoratorsr   Úpython_implementationÚskipr,   r   r-   r_   r`   r   r   r   r   Ú<module>   s4   þ	@