
    daf                         d Z ddlmZ ddlZddlmZ ddlZddlZ G d d      Z ej                  eej                        \  ZZ G d d	eej                        Zed
k(  r ej                           yy)z1Test that sys.modules is used properly by import.    )utilN)
MethodTypec                       e Zd ZdZd Zd Zy)UseCachea  When it comes to sys.modules, import prefers it over anything else.

    Once a name has been resolved, sys.modules is checked to see if it contains
    the module desired. If so, then it is returned [use cache]. If it is not
    found, then the proper steps are taken to perform the import, but
    sys.modules is still used to return the imported module (e.g., not what a
    loader returns) [from cache on return]. This also applies to imports of
    things contained within a package and thus get assigned as an attribute
    [from cache to attribute] or pulled in thanks to a fromlist import
    [from cache for fromlist]. But if sys.modules contains None then
    ImportError is raised [None in cache].

    c                     d}t        j                  d      5  |t        j                  d<   | j	                  d      }| j                  t        |      t        |             d d d        y # 1 sw Y   y xY w)Nzsome module found!some_module)r   uncachesysmodules
__import__assertEqualid)selfmodule_to_usemodules      C/root/Python-3.12.4/Lib/test/test_importlib/import_/test_caching.pytest_using_cachezUseCache.test_using_cache   s]    ,\\-( 	<)6CKK&__]3FR.6
;	< 	< 	<s   A	A**A3c                 D   d}t        j                  |      5  d t        j                  |<   | j	                  t
              5 }| j                  |       d d d        | j                  j                  j                  |       d d d        y # 1 sw Y   8xY w# 1 sw Y   y xY w)N
using_None)
r   r	   r
   r   assertRaisesImportErrorr   r   	exceptionname)r   r   cms      r   test_None_in_cachezUseCache.test_None_in_cache!   s    \\$ 	6 $CKK"";/ &2%&R\\..5		6 	6& &	6 	6s#   )BB
.B
B	BBN)__name__
__module____qualname____doc__r   r        r   r   r   	   s    <6r!   r   )r   c                   H    e Zd Zej                  d   ZdddZd Zd Zd Zy)ImportlibUseCacheSourceN)return_c                r    t        j                  | }|j                  dfd	}t        ||      |_        |S )Nc                      |      S Nr    )r   fullnamepathtargetoriginal_specs       r   	find_specz0ImportlibUseCache.create_mock.<locals>.find_spec9   s     **r!   r(   )r   	mock_specr-   r   )r   r%   namesmockr-   r,   s        @r   create_mockzImportlibUseCache.create_mock6   s2    ~~u%	+#It4r!   c           
         t        j                         5  t        j                  dt               | j	                  d      5 }t        j                  |g      5  | j                  d      }| j                  t        |      t        t        j                  d                d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nignorer   	meta_path)warningscatch_warningssimplefilterImportWarningr1   r   import_stater   r   r   r
   r   )r   r0   r   s      r   test_using_cache_after_loaderz/ImportlibUseCache.test_using_cache_after_loader@   s    $$& 	L!!(M:!!(+ Lt&&$8 L!__X6F$$RZCKK4I1JKLL	L 	LL LL L	L 	Ls<   ,CCAB9 C(C9C>CC	
CCc           
         t        j                         5  t        j                  dt               | j	                  dd      5 }t        j                  |g      5  | j                  d      }| j                  t        |d             | j                  t        |j                        t        t        j                  d                d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr3   pkg.__init__
pkg.moduler4   r   )r6   r7   r8   r9   r1   r   r:   r   
assertTruehasattrr   r   r   r
   r   r   importerr   s      r   +test_using_cache_for_assigning_to_attributez=ImportlibUseCache.test_using_cache_for_assigning_to_attributeJ   s    $$& 	C!!(M:!!.,? C8&&(< C!__\:FOOGFH$=>$$R%6$&s{{<'@$ACCC	C 	CC CC C	C 	Cs<   -C7C+A,CC+C7C($C++C4	0C77D c           	         | j                  dd      5 }t        j                  |g      5  | j                  ddg      }| j	                  t        |d             | j                  t        |j                        t        t        j                  d                d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr=   r>   r4   pkgr   )fromlist)r1   r   r:   r   r?   r@   r   r   r   r
   r   rA   s      r   test_using_cache_for_fromlistz/ImportlibUseCache.test_using_cache_for_fromlistV   s    nl; 	@x""hZ8 @(D 9:  FMM!2!#CKK$=!>@@	@ 	@@ @	@ 	@s#   B7A/B+B7+B4	0B77C )	r   r   r   r   r   r1   r;   rC   rG   r    r!   r   r#   r#   0   s,     *J*. L	C@r!   r#   __main__)r   test.test_importlibr   r
   typesr   unittestr6   r   	test_bothr   Frozen_UseCacheSource_UseCacheTestCaser#   r   mainr    r!   r   <module>rQ      ss    7 $ 
   6 6H T^^H9-@("3"3 -@` zHMMO r!   