o
    
i;                 	   @   s  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	Z	d dl
mZm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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Zzd dlZd dl m!Z" W n e#e$fy   dZdZ"Y nw zd dl%Z%W n e#y   dZ%Y nw d dl&m'Z' d dl(m)Z) d dl&m*Z* d dl&m+Z+ d dl&m,Z, d dl-m.Z. d d	l-m/Z/m0Z0 d d
l-m1Z1m2Z2 d dl-m3Z3 ddl4m5Z5 ddl4m6Z6 ddl4m7Z7 ddl4m8Z8 da9dZ:G dd dZ;e'j<fddZ=dd Z>dd Z?dd Z@G dd dejAZBG dd  d eBZCd!d" ZDd#d$ ZEd%d& ZFd'd( ZGd)d* ZHd+d, ZIeJd-krHeK  dS dS ).    N)
itemgetter
attrgetterwrapspickle)register_pickle_by_value)unregister_pickle_by_value)list_registry_pickle_by_value)_should_pickle_by_reference)_make_empty_cellcell_set)_extract_class_dict_whichmodule)_lookup_module_and_qualname   )subprocess_pickle_echo)subprocess_pickle_string)assert_run_python_script)subprocess_workerdefault_valueanother_valuec                   @   s   e Zd Zdd Zdd ZdS )RaiserOnPicklec                 C   
   || _ d S Nexc)selfr    r   \/home/ubuntu/.local/lib/python3.10/site-packages/srsly/tests/cloudpickle/cloudpickle_test.py__init__D      
zRaiserOnPickle.__init__c                 C   s   | j r   r   r   r   r   r   
__reduce__G   s   zRaiserOnPickle.__reduce__N)__name__
__module____qualname__r    r#   r   r   r   r   r   B   s    r   c                 C   s   t tj| |dS )zeHelper function to test whether object pickled with cloudpickle can be
    depickled with pickle
    protocol)r   loadscloudpickledumps)objr(   r   r   r   pickle_depickleK   s   r-   c                 C   s   |  ddS )N\z\\\\)replace)raw_filepathr   r   r   _escapeR      r1   c                 C   s&   z|  | W | S  ty   Y | S w r   )remove
ValueError)list_itemr   r   r   _maybe_removeW   s   r7   c                  C   s   G dd dt } G dd d}G dd d| |}t|}t| g dks(J |d d	ks0J |d
 d u s8J |d | |  ksFJ d S )Nc                   @      e Zd ZdZdd ZdS )z"test_extract_class_dict.<locals>.AzA docstringc                 S      dS )Nar   r"   r   r   r   methodb      z)test_extract_class_dict.<locals>.A.methodN)r$   r%   r&   __doc__r;   r   r   r   r   A`   s    r>   c                   @   s   e Zd ZdZdZdd ZdS )z"test_extract_class_dict.<locals>.BzB docstring*   c                 S   r9   )Nbr   r"   r   r   r   r;   i   r<   z)test_extract_class_dict.<locals>.B.methodN)r$   r%   r&   r=   
B_CONSTANTr;   r   r   r   r   Be   s    rB   c                   @   r8   )z"test_extract_class_dict.<locals>.C+   c                 S   r9   )Ncr   r"   r   r   r   method_co   r<   z+test_extract_class_dict.<locals>.C.method_cN)r$   r%   r&   
C_CONSTANTrE   r   r   r   r   Cl       rG   )rF   r=   rE   rF   rC   r=   rE   )intr   sortedkeysrE   )r>   rB   rG   clsdictr   r   r   test_extract_class_dict_   s    rM   c                   @   s  e Zd ZejZdd Zdd Zej	j
e dkp!ejdko!ejdk dd	d
d Zdd Zdd Zej	jdd	dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&d9d: Z'd;d< Z(ej	j
e d=kd>d	d?d@ Z)dAdB Z*dCdD Z+dEdF Z,dGdH Z-dIdJ Z.dKdL Z/dMdN Z0dOdP Z1dQdR Z2dSdT Z3dUdV Z4dWdX Z5dYdZ Z6d[d\ Z7d]d^ Z8d_d` Z9dadb Z:dcdd Z;dedf Z<dgdh Z=didj Z>dkdl Z?ej	j
e@ dmkrejdndo dpkp+e d=kp+ejdndo dpko!ejdqkp+ejdndo drkdsd	dtdu ZAdvdw ZBej	j
e d=kdxd	dydz ZCej	j
eDdnu d{d	d|d} ZEej	j
d~ej  kocdk n  dd	dd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUej	jdd	dd ZVdd ZWdd ZXdd ZYdd ZZej	j
e d=kdd	dd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zaej	jdd	dd Zbdd Zcdd Zdej	j
ejdkdd	ddń ZeddǄ ZfddɄ Zgdd˄ Zhdd̈́ Ziddτ ZjeklemendЃ dѡddӄ ZoddՄ Zpddׄ Zqddل Zrddۄ Zsdd݄ Ztdd߄ Zuej	j
emenjvd dd	dd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d Zdd Zdd Zdd Zej	jdd	dd	 Zd
d Zdd Zej	j
ejdk dd	dd ZdnS (  CloudPickleTestc                 C   s   t jdd| _d S )Ntmp_cloudpickle_test_)prefix)tempfilemkdtemptmpdirr"   r   r   r   setUp}   s   zCloudPickleTest.setUpc                 C   s   t | j d S r   )shutilrmtreerS   r"   r   r   r   tearDown   s   zCloudPickleTest.tearDownCPython)      r   )rY   rZ      z3Underlying bug fixed upstream starting Python 3.8.2)reasonc                 C   s@   G dd d}| }t |}t| ~| d u sJ dd S )Nc                   @      e Zd ZdS )zFCloudPickleTest.test_reducer_override_reference_cycle.<locals>.MyClassNr$   r%   r&   r   r   r   r   MyClass       r_   z)'del'-ed my_object has not been collected)weakrefrefr*   r+   )r   r_   	my_objectwrr   r   r   %test_reducer_override_reference_cycle   s   

z5CloudPickleTest.test_reducer_override_reference_cyclec                 C   sb   t d}td}t|| jd}| |||| tdd}t|| jd}| |||| d S )N
   r   r'   r   rY   )ranger   r-   r(   assertEqual)r   dgettergetter2r   r   r   test_itemgetter   s   
zCloudPickleTest.test_itemgetterc                 C   s   G dd d}| }t d}t|| jd}| |||| t dd}t|| jd}| |||| | |_t d}t|| jd}| |||| t dd}t|| jd}| |||| d S )Nc                   @      e Zd Zdd ZdS )z*CloudPickleTest.test_attrgetter.<locals>.Cc                 S      |S r   r   )r   r6   r   r   r   __getattr__   r<   z6CloudPickleTest.test_attrgetter.<locals>.C.__getattr__Nr$   r%   r&   ro   r   r   r   r   rG          rG   r:   r'   r@   ze.aze.b)r   r-   r(   rh   e)r   rG   ri   rj   rk   r   r   r   test_attrgetter   s   

zCloudPickleTest.test_attrgetterzRequires pytest -s to passc                 C   s,   t j}ttj|| jd}| || d S Nr'   )sysstderrr   r)   r*   r+   r(   rh   )r   out1out2r   r   r   test_pickling_file_handles   s   z*CloudPickleTest.test_pickling_file_handlesc                    sP   G dd d}| a  t fdd dd } d|jjv  t| d S )Nc                   @   rm   )z6CloudPickleTest.test_func_globals.<locals>.Unpicklablec                 S      t d)Nznot picklable	Exceptionr"   r   r   r   r#         zACloudPickleTest.test_func_globals.<locals>.Unpicklable.__reduce__Nr$   r%   r&   r#   r   r   r   r   Unpicklable   rq   r   c                      s   t jt jdS rt   )r*   r+   exitr(   r   r"   r   r   <lambda>   s    z3CloudPickleTest.test_func_globals.<locals>.<lambda>c                   S   s   t d d S )Nr   )ru   r   r   r   r   r   foo      z.CloudPickleTest.test_func_globals.<locals>.foor   )r   assertRaisesr|   
assertTrue__code__co_namesr*   r+   )r   r   r   r   r"   r   test_func_globals   s   z!CloudPickleTest.test_func_globalsc                 C   sl   z+t d}t|| jd}| |t| t ddd}t|| jd}| |t| W d S  ty5   Y d S w )NHellor'   r[   rY   )bufferr-   r(   rh   str	NameError)r   
buffer_objbuffer_cloner   r   r   test_buffer   s   zCloudPickleTest.test_bufferc                 C   s&   t d}| t|| jd|  d S )Ns   Hellor'   
memoryviewrh   r-   r(   tobytesr   r   r   r   r   test_memoryview   s   zCloudPickleTest.test_memoryviewc                 C   6   ddd  }t|}| || t|tjsJ d S Nr   r[   r:   r@   )rK   r-   rh   
isinstance_collections_abc	dict_keysr   rK   resultsr   r   r   test_dict_keys      zCloudPickleTest.test_dict_keysc                 C   s>   ddd  }t|}| t|t| t|tjsJ d S r   )valuesr-   rh   rJ   r   r   dict_valuesr   r   r   r   r   r   test_dict_values   s   z CloudPickleTest.test_dict_valuesc                 C   r   r   )itemsr-   rh   r   r   
dict_itemsr   r   r   r   r   r   test_dict_items   r   zCloudPickleTest.test_dict_itemsc                 C   >   t ddg }t|}| || t|t|ksJ d S N)r:   r   )r@   r[   )collectionsOrderedDictrK   r-   rh   typer   r   r   r   test_odict_keys      zCloudPickleTest.test_odict_keysc                 C   sF   t ddg }t|}| t|t| t|t|ks!J d S r   )r   r   r   r-   rh   listr   r   r   r   r   test_odict_values   s   z!CloudPickleTest.test_odict_valuesc                 C   r   r   )r   r   r   r-   rh   r   r   r   r   r   test_odict_items   r   z CloudPickleTest.test_odict_itemsc                 C   s0   t dddd }| t|| jd|  d S )Ns   Hello!Hello!Hello!r[      r'   r   r   r   r   r   )test_sliced_and_non_contiguous_memoryview  s   z9CloudPickleTest.test_sliced_and_non_contiguous_memoryviewc                 C   s.   t dtd }| t|| jd|  d S )Ns   Hello!g    cAr'   )r   rI   rh   r-   r(   r   r   r   r   r   test_large_memoryview	  s   z%CloudPickleTest.test_large_memoryviewc                 C   s    |  tdd | jd d d S )Nc                   S   r9   Nr   r   r   r   r   r   r         z-CloudPickleTest.test_lambda.<locals>.<lambda>r'   r   rh   r-   r(   r"   r   r   r   test_lambda  s   zCloudPickleTest.test_lambdac                    s@   d\  fddfdd}|  t|| jddd d S )N)r   r[   c                    s   |   S r   r   xr:   r   r   r         z5CloudPickleTest.test_nested_lambdas.<locals>.<lambda>c                    s   |   S r   r   r   )r@   f1r   r   r         r'   r   r   )r   f2r   )r:   r@   r   r   test_nested_lambdas  s   z#CloudPickleTest.test_nested_lambdasc                 C   sT   dd }dd }t | | jd}| | | t |d| jd}| |dd d S )	Nc                      s    fdd  S )Nc                          S r   r   r   gr   r   r     r<   z=CloudPickleTest.test_recursive_closure.<locals>.f1.<locals>.gr   r   r   r   r   r     s   z2CloudPickleTest.test_recursive_closure.<locals>.f1c                    s    fddS )Nc                    s   | dkr S | | d  S r   r   )nbaser   r   r   r     s   z=CloudPickleTest.test_recursive_closure.<locals>.f2.<locals>.gr   )r   r   r   r   r     s   z2CloudPickleTest.test_recursive_closure.<locals>.f2r'   r[         r-   r(   rh   )r   r   r   g1g2r   r   r   test_recursive_closure  s   z&CloudPickleTest.test_recursive_closurec                 C   sB   dd }| j |jd u dd t|| jd}| j |jd u dd d S )Nc                   S   r9   )z-a function with no closure cells
            Nr   r   r   r   r   f*  r   z9CloudPickleTest.test_closure_none_is_preserved.<locals>.fzf actually has closure cells!msgr'   z.g now has closure cells even though f does not)r   __closure__r-   r(   r   r   r   r   r   r   test_closure_none_is_preserved)  s   
z.CloudPickleTest.test_closure_none_is_preservedc                 C   s   dd }| }t t |  W d    n1 sw   Y  t|| jd}t t |  W d    d S 1 s:w   Y  d S )Nc                     s   	  fdd} | S )NFc                      s     d S r   r   r   cellr   r   r   ?  r}   z?CloudPickleTest.test_empty_cell_preserved.<locals>.f.<locals>.gr   r   r   r   r   r   ;  s   z4CloudPickleTest.test_empty_cell_preserved.<locals>.fr'   )pytestraisesr   r-   r(   )r   r   r   r   r   r   r   test_empty_cell_preserved:  s   	"z)CloudPickleTest.test_empty_cell_preservedc                 C   s*   dd }t | | jd}| | d d S )Nc                     s   ddh  fdd} | S )Nr   r[   c                      s   t  S r   )lenr   sr   r   r   P  r}   z=CloudPickleTest.test_unhashable_closure.<locals>.f.<locals>.gr   r   r   r   r   r   M  s   z2CloudPickleTest.test_unhashable_closure.<locals>.fr'   r[   r   r   r   r   r   test_unhashable_closureL  s   z'CloudPickleTest.test_unhashable_closurec                 C   s   G dd d}G dd d|}|  |  d t|| jd}|  |  d |  |jd | }t|| jd}|  | d d S )Nc                   @   rm   )zNCloudPickleTest.test_dynamically_generated_class_that_uses_super.<locals>.Basec                 S   r9   r   r   r"   r   r   r   r;   [  r<   zUCloudPickleTest.test_dynamically_generated_class_that_uses_super.<locals>.Base.methodNr$   r%   r&   r;   r   r   r   r   BaseZ  rq   r   c                       s    e Zd ZdZ fddZ  ZS )zQCloudPickleTest.test_dynamically_generated_class_that_uses_super.<locals>.DerivedDerived Docstringc                    s   t   d S r   )superr;   r"   	__class__r   r   r;   `  r   zXCloudPickleTest.test_dynamically_generated_class_that_uses_super.<locals>.Derived.method)r$   r%   r&   r=   r;   __classcell__r   r   r   r   Derived^  s    r   r[   r'   r   )rh   r;   r-   r(   r=   )r   r   r   UnpickledDerivedorig_dri   r   r   r   0test_dynamically_generated_class_that_uses_superX  s   z@CloudPickleTest.test_dynamically_generated_class_that_uses_superc                 C   s   G dd d}||_ | |_t|| jd}t| }| |  d | |   d | |j d | | d d S )Nc                   @   rm   )z:CloudPickleTest.test_cycle_in_classdict_globals.<locals>.Cc                 S   r9   )Nwoohoo!r   r"   r   r   r   it_worksv  r<   zCCloudPickleTest.test_cycle_in_classdict_globals.<locals>.C.it_worksN)r$   r%   r&   r   r   r   r   r   rG   t  s    rG   r'   r   )C_againinstance_of_Cr-   r(   rh   r   )r   rG   depickled_Cdepickled_instancer   r   r   test_cycle_in_classdict_globalsr  s   
z/CloudPickleTest.test_cycle_in_classdict_globalsc                    sv  d  fdd|  t| jdddd |  t| jdddd	  fd
dG  fddd}t|| jd}|  |d d |  |ddd t|| jd}|  |ddd |  t|d d |  t|ddd t|d| jd}|  |dd |  t|dj d |  t|djdd t|dj| jd}|  |dd d S )Nr?   c                    s   t td | |   S )Nrf   )sumrg   r   yLOCAL_CONSTANTr   r   some_function  s   zNCloudPickleTest.test_locally_defined_function_and_class.<locals>.some_functionr'   )   r   Q   rY   r[   c                      r   r   r   r   r   r   r   r     r   zICloudPickleTest.test_locally_defined_function_and_class.<locals>.<lambda>c                       s2   e Zd ZdZdd Z fddZfddZdS )	zJCloudPickleTest.test_locally_defined_function_and_class.<locals>.SomeClassz:Overly complicated class with nested references to symbolsc                 S   r   r   )valuer   r   r   r   r   r      r!   zSCloudPickleTest.test_locally_defined_function_and_class.<locals>.SomeClass.__init__c                    s
      S r   r   r"   )r   hidden_constantr   r   one  r!   zNCloudPickleTest.test_locally_defined_function_and_class.<locals>.SomeClass.onec                    s   |    |d | j S r   )r   r   r   r   )r   r   r   some_method  s   zVCloudPickleTest.test_locally_defined_function_and_class.<locals>.SomeClass.some_methodN)r$   r%   r&   r=   r    r   r   r   r   r   r   r   r   	SomeClass  s
    r   r      )rh   r-   r(   r   r   r   )r   r   clone_classnew_instance
new_methodr   r   r   'test_locally_defined_function_and_class  s.   
z7CloudPickleTest.test_locally_defined_function_and_classc                 C   s.   t td}t|| jd}| |dd d S )Nr   r'      )	functoolspartialminr-   r(   rh   )r   partial_objpartial_cloner   r   r   test_partial  s   zCloudPickleTest.test_partialPyPyz"Skip numpy and scipy tests on PyPyc                 C   sJ   t r| tt j| jdt j n	 tr"| ttj| jdtj d S 	 d S rt   )nprh   r-   addr(   sppivr"   r   r   r   
test_ufunc  s   zCloudPickleTest.test_ufuncc                 C   s*   d}t t j|| jd}| || d S )Nr   r[   rY   r  r'   )r*   r)   r+   r(   rh   )r   r,   returned_objr   r   r   test_loads_namespace  s
   z$CloudPickleTest.test_loads_namespacec                 C   s<   d}t  }t|| |d t|}| || d S )Nr  r   )ioBytesIOr*   dumpseekloadrh   )r   r,   bior  r   r   r   test_load_namespace  s   

z#CloudPickleTest.test_load_namespacec                 C   sR   dd }t || jd}t|dt|dksJ t|dttdks'J d S )Nc                 s   s    t | D ]}|V  qd S r   )rg   )cntir   r   r   some_generator  s   z6CloudPickleTest.test_generator.<locals>.some_generatorr'   rY   )r-   r(   r   r   rg   )r   r  gen2r   r   r   test_generator  s    zCloudPickleTest.test_generatorc                 C   sf   G dd d}|j d }|j d }t|| jd|_t|| jd|_| | d | | d d S )Nc                   @   s$   e Zd Zedd Zedd ZdS )z+CloudPickleTest.test_classmethod.<locals>.Ac                   S   r9   )Nsmr   r   r   r   r   test_sm     z3CloudPickleTest.test_classmethod.<locals>.A.test_smc                 S   r9   Ncmr   clsr   r   r   test_cm  r   z3CloudPickleTest.test_classmethod.<locals>.A.test_cmN)r$   r%   r&   staticmethodr  classmethodr%  r   r   r   r   r>     s
    
r>   r  r%  r'   r  r"  )__dict__r-   r(   r  r%  rh   )r   r>   r  r"  r   r   r   test_classmethod  s   

z CloudPickleTest.test_classmethodc                 C   s4   G dd d}t |j| jd|_| | d d S )Nc                   @      e Zd Zedd ZdS )z1CloudPickleTest.test_bound_classmethod.<locals>.Ac                 S   r9   r!  r   r#  r   r   r   r%    r   z9CloudPickleTest.test_bound_classmethod.<locals>.A.test_cmN)r$   r%   r&   r'  r%  r   r   r   r   r>         r>   r'   r"  )r-   r%  r(   rh   )r   r>   r   r   r   test_bound_classmethod  s   z&CloudPickleTest.test_bound_classmethodc                 C   s   t tj}| |dd d S )NabcABC)r-   r   upperrh   )r   r   r   r   r   test_method_descriptors   s   
z'CloudPickleTest.test_method_descriptorsc                 C   s4   G dd d}t |j| jd}| |j|jj d S )Nc                   @   rm   )z<CloudPickleTest.test_instancemethods_without_self.<locals>.Fc                 S   s   |d S r   r   r   r   r   r   r     r}   z>CloudPickleTest.test_instancemethods_without_self.<locals>.F.fN)r$   r%   r&   r   r   r   r   r   F  rq   r1  r'   )r-   r   r(   rh   r$   )r   r1  r   r   r   r   !test_instancemethods_without_self  s   z1CloudPickleTest.test_instancemethods_without_selfc                 C      t t| jd}| t| d S rt   )r-   r   r(   rh   )r   pickle_cloner   r   r   test_module     zCloudPickleTest.test_modulec              
   C   sR  t d}d}tt||j t|| jd}| |j	|j	 | |
d|
d | | d| d t dkrlt|| jd}| |j	|j	 | |
d|
d | | d| d t||g\}}| t|t| z"|tjd< t|j
| jd}| |
d|d W tjdd  d S tjdd  w )Nmodz
        x = 1
        def f(y):
            return x + y

        class Foo:
            def method(self, x):
                return f(x)
        r'   r   r	  )types
ModuleTypeexectextwrapdedentr(  r-   r(   rh   r   r   Foor;   platformpython_implementationr   idru   modulespop)r   r7  codemod2mod3mod1depickled_fr   r   r   test_dynamic_module  s&   
	  
"z#CloudPickleTest.test_dynamic_modulec              	   C   s   t j| jd}d}|jt|d}z6ddlm} | }t|d}t	j
||| jd W d    n1 s5w   Y  tt| W t | d S t | w )Nzlocal_func_g.pklz
        from srsly.cloudpickle.compat import pickle
        import gc
        with open("{pickled_func_path}", 'rb') as f:
            func = pickle.load(f)

        assert func(range(10)) == 45
        )pickled_func_pathr   )make_local_functionwbr'   )ospathjoinrS   formatr1   !srsly.tests.cloudpickle.testutilsrJ  openr*   r  r(   r   r;  r<  unlink)r   rI  child_process_scriptrJ  r   r   r   r   r   test_module_locals_behavior6  s   	z+CloudPickleTest.test_module_locals_behaviorc                 C   sB  G dd d}t d}td|j |ddksJ d|jv s"J | }tt t	| W d    n1 s:w   Y  t
|jd trO||jd d< nt
|jd t jr^||jd _t|| jd	}d|jv slJ t
|jd tr|d
|jv s{J nt
|jd t jrt|jd
sJ |ddksJ |ddksJ d S )Nc                   @   rm   )zXCloudPickleTest.test_dynamic_module_with_unpicklable_builtin.<locals>.UnpickleableObjectc                 S   rz   )NzUnpicklable object)r4   r"   r   r   r   r#   ]  r}   zcCloudPickleTest.test_dynamic_module_with_unpicklable_builtin.<locals>.UnpickleableObject.__reduce__Nr~   r   r   r   r   UnpickleableObject\  rq   rU  r7  zf = lambda x: abs(x)r   __builtins__unpickleable_objr'   abs)r8  r9  r:  r(  r   r   r   r4   r*   r+   r   dictrX  r-   r(   rW  hasattr)r   rU  r7  unpicklable_objdepickled_modr   r   r   ,test_dynamic_module_with_unpicklable_builtinV  s.   
z<CloudPickleTest.test_dynamic_module_with_unpicklable_builtinc              	   C   s&  t d}d}tt||j tj| j	d}tj| j	d}d}d}|j
|d}|j
t|t|t|| jd}z@t|d	}tj||| jd
 W d    n1 sTw   Y  tt| W tj|rlt| tj|ryt| d S d S tj|rt| tj|rt| w w )Nr7  z
        x = 1
        z&dynamic_module_from_parent_process.pklz%dynamic_module_from_child_process.pklau  
            from srsly.cloudpickle.compat import pickle
            import textwrap

            import srsly.cloudpickle as cloudpickle
            from srsly.tests.cloudpickle.testutils import assert_run_python_script


            child_of_child_process_script = {child_of_child_process_script}

            with open('{parent_process_module_file}', 'rb') as f:
                mod = pickle.load(f)

            with open('{child_process_module_file}', 'wb') as f:
                cloudpickle.dump(mod, f, protocol={protocol})

            assert_run_python_script(textwrap.dedent(child_of_child_process_script))
            z '''
                from srsly.cloudpickle.compat import pickle
                with open('{child_process_module_file}','rb') as fid:
                    mod = pickle.load(fid)
                ''' )child_process_module_file)parent_process_module_filer_  child_of_child_process_scriptr(   rK  r'   )r8  r9  r:  r;  r<  r(  rL  rM  rN  rS   rO  r1   r(   rQ  r*   r  r   existsrR  )r   r7  rC  r`  r_  rS  ra  fidr   r   r   .test_load_dynamic_module_in_grandchild_process  sF   
	

z>CloudPickleTest.test_load_dynamic_module_in_grandchild_processc                    s`   dd  dd } fdd}t j|| jd}d|v sJ d	|v s"J d
|vs(J d|vs.J d S )Nc                 S   s   | d S r   r   r   r   r   r   nested_function  r}   zDCloudPickleTest.test_correct_globals_import.<locals>.nested_functionc                 S   s
   t | S r   )mathexpr   r   r   r   unwanted_function  r!   zFCloudPickleTest.test_correct_globals_import.<locals>.unwanted_functionc                    s    | | S r   r   r   re  r   r   my_small_function  s   zFCloudPickleTest.test_correct_globals_import.<locals>.my_small_functionr'   s   my_small_functions   nested_functions   unwanted_functions   math)r*   r+   r(   )r   rh  rj  r@   r   ri  r   test_correct_globals_import  s   z+CloudPickleTest.test_correct_globals_importc                 C   s   t d ddlm} dd l}dd l}dd l}t|sJ t|js$J t|s*J t|j	s1J t
d}t|r<J t dkrLdd l}t|sLJ dd lm  m} t|s[J t|| jd|u sfJ ddlm} t|srJ t|| jd|u s}J t t dd l}W d    n1 sw   Y  ddlm}	 t|	rJ t|	d	rJ t|	| jd}
|
|	usJ |	d
|
d
ksJ dd lm  m  m} t|sJ t|| jd|u sJ d}t jt|d tt  W d    d S 1 sw   Y  d S )N_cloudpickle_testpkgr   r   dynamic_moduler	  r'   )dynamic_submodule_two)submodule_threer%   r   z.cannot check importability of object instancesmatch) r   importorskipsrsly.cloudpickle.compatr   os.pathr   collections.abcr   rM  r-  r8  r9  r>  r?  _codecs*_cloudpickle_testpkg.mod.dynamic_submoduler7  dynamic_submoduler-   r(   _cloudpickle_testpkg.modrn  r   ImportError(_cloudpickle_testpkg.mod.submodule_threero  r[  r   ?_cloudpickle_testpkg.mod.dynamic_submodule.dynamic_subsubmoduledynamic_subsubmodule	TypeErrorobject)r   r   rL  r   rm  rv  mm2rl  m3depickled_m3r  expectedr   r   r   test_module_importability  sH   


"z)CloudPickleTest.test_module_importabilityc                 C   s   |  ttt| jd d S rt   )rh   Ellipsisr-   r(   r"   r   r   r   test_Ellipsis  s   zCloudPickleTest.test_Ellipsisc                 C   r3  rt   )r-   NotImplementedr(   rh   )r   ExcCloner   r   r   test_NotImplemented!  r6  z#CloudPickleTest.test_NotImplementedc                 C   s&   t td | jd}| td | d S rt   )r-   r   r(   rh   r   resr   r   r   test_NoneType%     zCloudPickleTest.test_NoneTypec                 C   &   t tt| jd}| tt| d S rt   )r-   r   r  r(   rh   r  r   r   r   test_EllipsisType)  r  z!CloudPickleTest.test_EllipsisTypec                 C   r  rt   )r-   r   r  r(   rh   r  r   r   r   test_NotImplementedType-  r  z'CloudPickleTest.test_NotImplementedTypec                 C   s<   t t| jdtu sJ ddlm} t || jd|u sJ d S )Nr'   r   )mkdir)r-   zipr(   rL  r  )r   r  r   r   r   test_builtin_function1  s   z%CloudPickleTest.test_builtin_functionc                 C   s<   t tttttfD ]}t|j| jd}t	|||sJ qd S rt   )
r   tupleset	frozensetrZ  r  r-   __new__r(   r   )r   t
cloned_newr   r   r   test_builtin_type_constructor<  s   z-CloudPickleTest.test_builtin_type_constructorc                 C   s   d}|j }t|j }t|jd }||u sJ t|| jd}t|| jd}t|| jd}| | ks4J ||u s:J ||u s@J d S )N      ?hexr'   )r  r   r(  r-   r(   )r   r,   bound_classicmethodunbound_classicmethodclsdict_classicmethoddepickled_bound_methdepickled_unbound_methdepickled_clsdict_methr   r   r   test_builtin_classicmethodQ  s"   
z*CloudPickleTest.test_builtin_classicmethodaarch64Nr[   )rY   rf   )rY   rf   rZ   )rY      zFails on aarch64 + python 3.10+ in cibuildwheel, currently unable to replicate failure elsewhere; fails sometimes for pypy on conda-forge; fails for python 3.10.8+ and 3.11+c           	      C   s   d}|j }t|j }t|jd }t|| jd}t|| jd}t|| jd}d}||||ks2J ||||ks<J t dkrM|||t|ksMJ t dkrkt|t|ks]J |t||t|ksmJ d S d S )Nr  fromhexr'   0x1rX   r	  )	r  r   r(  r-   r(   r>  r?  float__func__)	r   r,   bound_clsmethodunbound_clsmethodclsdict_clsmethodr  r  r  argr   r   r   test_builtin_classmethodh  s>   

z(CloudPickleTest.test_builtin_classmethodc                 C   sx   d}|j }t|j }t|jd }t|| jd}t|| jd}t|| jd}| | ks.J ||u s4J ||u s:J d S )Nr  __repr__r'   )r  r   r(  r-   r(   )r   r,   bound_slotmethodunbound_slotmethodclsdict_slotmethodr  r  r  r   r   r   test_builtin_slotmethod  s    
z'CloudPickleTest.test_builtin_slotmethodz0No known staticmethod example in the pypy stdlibc                 C   s   d}|j }t|j }t|jd }||u sJ t|| jd}t|| jd}t|| jd}||u s2J ||u s8J |j|ju s@J t|t|u  d S )Nr   	maketransr'   )r  r   r(  r-   r(   r  )r   r,   bound_staticmethodunbound_staticmethodclsdict_staticmethodr  r  r  r   r   r   test_builtin_staticmethod  s$   
z)CloudPickleTest.test_builtin_staticmethodztest needs Tornado installedc                    s   ddl mm} jfdd j fdd}tj||g| jd}d   }t|\}}| 	||u  |j
 }|t|d}| |d	 d S )
Nr   )genioloopc                 3   s      | V   |d r   )sleepReturnr   )r  r   r   r        z1CloudPickleTest.test_tornado_coroutine.<locals>.fc                 3   s     d| V } |d )Ng{Gz?r   )r  )r   r  r   r  r   r   r     r  z1CloudPickleTest.test_tornado_coroutine.<locals>.gr'   r   r   )tornador  r  	coroutiner*   r+   r(   r   r)   r   IOLoopcurrentrun_syncr  r  rh   )r   r  r   datar   g3loopr  r   r  r   test_tornado_coroutine  s   
z&CloudPickleTest.test_tornado_coroutine)rY   r  r   beta)rY   r  r   r  r  z.https://github.com/python/cpython/issues/92932c           
         s   d}dd t d|D }td  fdd|D }djd	|d
}tt||| |d }| }tj	||g| j
d}d  }}t|\}}	| ||	u  | | | d S )Ni c                 S   s   g | ]}d | qS )zg%dr   ).0r  r   r   r   
<listcomp>  s    z5CloudPickleTest.test_extended_arg.<locals>.<listcomp>r   r?   c                    s   i | ]}|  d qS )d   )	randrange)r  namerr   r   
<dictcomp>  s    z5CloudPickleTest.test_extended_arg.<locals>.<dictcomp>zx
        import zlib

        def f():
            x = {tup}
            return zlib.crc32(bytes(bytearray(x)))
        z, )tupr   r'   )rg   randomRandomrO  rN  r:  r;  r<  r*   r+   r(   r   r)   r   rh   )
r   nvarsnamesri   rC  r   r  r  r   f3r   r  r   test_extended_arg  s   

z!CloudPickleTest.test_extended_argc                 C   s`   dd l add }tj|| jd}bttjD ]}|dd dkr%tj|= qt	
|}|  d S )Nr   c                  S      t jjj} d S r   xmletreeElementTreeCommentr   r   r   r   example  r   z/CloudPickleTest.test_submodule.<locals>.exampler'   .r  )xml.etree.ElementTreer  r*   r+   r(   r   ru   rA  splitr   r)   )r   r  r   r6   r   r   r   r   test_submodule  s   

zCloudPickleTest.test_submodulec                 C   s\   dd }| }t j|| jd}ttjD ]}|dd dkr#tj|= qt |}|  d S )Nc                     s   dd l   fdd} | S )Nr   c                     s    j jj} d S r   )r  r  r  r   r  r   r   r    r   zFCloudPickleTest.test_submodule_closure.<locals>.scope.<locals>.example)r  r  r   r  r   scope  s   z5CloudPickleTest.test_submodule_closure.<locals>.scoper'   r  r   r  )r*   r+   r(   r   ru   rA  r  r)   )r   r  r  r   r6   r   r   r   r   test_submodule_closure  s   

z&CloudPickleTest.test_submodule_closurec                 C   sX   dd }dd l a| }tj|| jd}dt|d d }t	t
jd|gr*J d S )	Nc                  S      dd } | S )Nc                  S   r  r   r  r   r   r   r   r  (  r   zACloudPickleTest.test_multiprocess.<locals>.scope.<locals>.exampler   r  r   r   r   r  '  s   z0CloudPickleTest.test_multiprocess.<locals>.scoper   r'   [import base64; from srsly.cloudpickle.compat import pickle; pickle.loads(base64.b32decode('ascii'))()-c)r  r  r*   r+   r(   base64	b32encodedecode
subprocesscallru   
executabler   r  r  r   commandr   r   r   test_multiprocess%  s   z!CloudPickleTest.test_multiprocessc                 C   sb   dd }| }dd l m  ma tj|| jd}dt|d d }t	
tjd|gr/J d S )	Nc                     s   dd l m   fdd} | S )Nr   c                     s   t j}  j} d S r   )r  r  r  r   foobarr   r   r  @  s   
z;CloudPickleTest.test_import.<locals>.scope.<locals>.example)	xml.etreer  r  r   r  r   r  >  s   z*CloudPickleTest.test_import.<locals>.scoper   r'   r  r  r  r  )r  r  r  r*   r+   r(   r  r  r  r  r  ru   r  r  r   r   r   test_import:  s   zCloudPickleTest.test_importc                 C   sF   t  }tjtdd t| W d    d S 1 sw   Y  d S )Nz4only be shared between processes through inheritancerp  )multiprocessingLockr   r   RuntimeErrorr*   r+   )r   lockr   r   r    test_multiprocessing_lock_raisesP  s   "z0CloudPickleTest.test_multiprocessing_lock_raisesc                 C   s^   t  }tt |j W d    n1 sw   Y  t }t|| | j|j|u dd d S )Nzcell contents not set correctlyr   )r   r   r   r4   cell_contentsr  r   r   )r   r   obr   r   r   test_cell_manipulationU  s   

z&CloudPickleTest.test_cell_manipulationc           	      C   s   t |}t|| jd}| ||u ||f t|}dt	|
d}tjtjdd|gtjtjd}| \}}| | d | | 
 d|j d	 d S )
Nr'   zif 1:
            import base64, srsly.cloudpickle as cloudpickle, logging

            logging.basicConfig(level=logging.INFO)
            logger = cloudpickle.loads(base64.b32decode(b'{}'))
            logger.info('hello')
            r  z	-W ignorer  )stdoutrv   r   zINFO:z:hello)logging	getLoggerr-   r(   r   r*   r+   rO  r  r  r  r  Popenru   r  PIPESTDOUTcommunicaterh   waitstripr  )	r   r  loggerpickleddumpedrC  procout_r   r   r   check_loggerb  s    

zCloudPickleTest.check_loggerc                 C   s   |  d  |  d d S )Nzcloudpickle.dummy_test_logger)r  r"   r   r   r   test_loggerx  s   
zCloudPickleTest.test_loggerc                 C   s.   t tjtjs	J ttj}| |tj d S r   )r   r  realr8  GetSetDescriptorTyper-   assertIs)r   depickled_descriptorr   r   r   test_getset_descriptor~  s   
z&CloudPickleTest.test_getset_descriptorc                 C   s   t ddi }G dd d}G dd d}|| t||r!J t||s(J t|}d|vs3J d|v s9J t|}t||rEJ t||sLJ d S )	Nr_   r   c                   @   r]   )zDCloudPickleTest.test_abc_cache_not_pickled.<locals>.MyUnrelatedClassNr^   r   r   r   r   MyUnrelatedClass  r`   r  c                   @   r]   )zBCloudPickleTest.test_abc_cache_not_pickled.<locals>.MyRelatedClassNr^   r   r   r   r   MyRelatedClass  r`   r  s   MyUnrelatedClasss   MyRelatedClass)r-  ABCMetaregister
issubclassr*   r+   r)   )r   r_   r  r  r   depickled_classr   r   r   test_abc_cache_not_pickled  s   


z*CloudPickleTest.test_abc_cache_not_pickledc                    J  G dd dt j}G  fddd| |t   }t|| jd}t | jd}t|}tt|s4J tt|s;J | |  d | | d | |	 d | |	 d | | 
 d | |
 d | | jd | |jd | t| G fddd||   d	 G d
d d|}| t| d S )Nc                   @   sP   e Zd Zejdd Zeejdd Zeejdd Z	e
ejdd Zd	S )
z/CloudPickleTest.test_abc.<locals>.AbstractClassc                 S   r9   zA methodNr   r"   r   r   r   r     r   z;CloudPickleTest.test_abc.<locals>.AbstractClass.some_methodc                 S   r9   zA classmethodNr   r#  r   r   r   some_classmethod  r   z@CloudPickleTest.test_abc.<locals>.AbstractClass.some_classmethodc                   S   r9   zA staticmethodNr   r   r   r   r   some_staticmethod  r   zACloudPickleTest.test_abc.<locals>.AbstractClass.some_staticmethodc                   S   r9   z
A propertyNr   r   r   r   r   some_property  r   z=CloudPickleTest.test_abc.<locals>.AbstractClass.some_propertyN)r$   r%   r&   r-  abstractmethodr   r'  r"  r&  r$  propertyr&  r   r   r   r   AbstractClass  s    
r)  c                       <   e Zd Zdd Ze fddZedd Zedd Z	d	S )
z/CloudPickleTest.test_abc.<locals>.ConcreteClassc                 S   r9   N	it works!r   r"   r   r   r   r     r<   z;CloudPickleTest.test_abc.<locals>.ConcreteClass.some_methodc                       |  ksJ dS r+  r   r#  ConcreteClassr   r   r"       z@CloudPickleTest.test_abc.<locals>.ConcreteClass.some_classmethodc                   S   r9   r+  r   r   r   r   r   r$    r   zACloudPickleTest.test_abc.<locals>.ConcreteClass.some_staticmethodc                 S   r9   r+  r   r"   r   r   r   r&    r   z=CloudPickleTest.test_abc.<locals>.ConcreteClass.some_propertyN
r$   r%   r&   r   r'  r"  r&  r$  r(  r&  r   r.  r   r   r/        
r/  r'   r,  c                       r*  )
z7CloudPickleTest.test_abc.<locals>.DepickledBaseSubclassc                 S   r9   Nit works for realz!r   r"   r   r   r   r     r<   zCCloudPickleTest.test_abc.<locals>.DepickledBaseSubclass.some_methodc                    r-  r3  r   r#  DepickledBaseSubclassr   r   r"    r0  zHCloudPickleTest.test_abc.<locals>.DepickledBaseSubclass.some_classmethodc                   S   r9   r3  r   r   r   r   r   r$    r   zICloudPickleTest.test_abc.<locals>.DepickledBaseSubclass.some_staticmethodc                   S   r9   r3  r   r   r   r   r   r&    r   zECloudPickleTest.test_abc.<locals>.DepickledBaseSubclass.some_propertyNr1  r   r5  r   r   r6    r2  r6  r4  c                   @   rm   )z8CloudPickleTest.test_abc.<locals>.IncompleteBaseSubclassc                 S   r9   Nz&this class lacks some concrete methodsr   r"   r   r   r   r     r<   zDCloudPickleTest.test_abc.<locals>.IncompleteBaseSubclass.some_methodNr$   r%   r&   r   r   r   r   r   IncompleteBaseSubclass  rq   r9  r-  r.  r  r  r-   r(   r  rh   r   r"  r$  r&  r   r~  r   r)  concrete_instancedepickled_baser  r   r9  r   r/  r6  r   test_abc  s4   
zCloudPickleTest.test_abcc                    r  )Nc                   @   sD   e Zd Zejdd Zejdd Zejdd Z	ej
dd Zd	S )
z5CloudPickleTest.test_abstracts.<locals>.AbstractClassc                 S   r9   r   r   r"   r   r   r   r     r   zACloudPickleTest.test_abstracts.<locals>.AbstractClass.some_methodc                 S   r9   r!  r   r#  r   r   r   r"    r   zFCloudPickleTest.test_abstracts.<locals>.AbstractClass.some_classmethodc                   S   r9   r#  r   r   r   r   r   r$    r   zGCloudPickleTest.test_abstracts.<locals>.AbstractClass.some_staticmethodc                 S   r9   r%  r   r"   r   r   r   r&  	  r   zCCloudPickleTest.test_abstracts.<locals>.AbstractClass.some_propertyN)r$   r%   r&   r-  r'  r   abstractclassmethodr"  abstractstaticmethodr$  abstractpropertyr&  r   r   r   r   r)    s    


r)  c                       r*  )
z5CloudPickleTest.test_abstracts.<locals>.ConcreteClassc                 S   r9   r+  r   r"   r   r   r   r     r<   zACloudPickleTest.test_abstracts.<locals>.ConcreteClass.some_methodc                    r-  r+  r   r#  r.  r   r   r"    r0  zFCloudPickleTest.test_abstracts.<locals>.ConcreteClass.some_classmethodc                   S   r9   r+  r   r   r   r   r   r$    r   zGCloudPickleTest.test_abstracts.<locals>.ConcreteClass.some_staticmethodc                 S   r9   r+  r   r"   r   r   r   r&    r   zCCloudPickleTest.test_abstracts.<locals>.ConcreteClass.some_propertyNr1  r   r.  r   r   r/    r2  r/  r'   r,  c                       r*  )
z=CloudPickleTest.test_abstracts.<locals>.DepickledBaseSubclassc                 S   r9   r3  r   r"   r   r   r   r   9  r<   zICloudPickleTest.test_abstracts.<locals>.DepickledBaseSubclass.some_methodc                    r-  r3  r   r#  r5  r   r   r"  <  r0  zNCloudPickleTest.test_abstracts.<locals>.DepickledBaseSubclass.some_classmethodc                   S   r9   r3  r   r   r   r   r   r$  A  r   zOCloudPickleTest.test_abstracts.<locals>.DepickledBaseSubclass.some_staticmethodc                 S   r9   r3  r   r"   r   r   r   r&  E  r   zKCloudPickleTest.test_abstracts.<locals>.DepickledBaseSubclass.some_propertyNr1  r   r5  r   r   r6  8  r2  r6  r4  c                   @   rm   )z>CloudPickleTest.test_abstracts.<locals>.IncompleteBaseSubclassc                 S   r9   r7  r   r"   r   r   r   r   M  r<   zJCloudPickleTest.test_abstracts.<locals>.IncompleteBaseSubclass.some_methodNr8  r   r   r   r   r9  L  rq   r9  r:  r;  r   r>  r   test_abstracts  s4   
zCloudPickleTest.test_abstractsc                 C   s   G dd d}|d|d|d}}}t ||g|||g}t|| jd}|\}}}	}
| |jd | |	jd | |
jd | t|d | t|||	h d S )Nc                   @   rm   )zECloudPickleTest.test_weakset_identity_preservation.<locals>.SomeClassc                 S   r   r   r   r   r   r   r   r    X  r!   zNCloudPickleTest.test_weakset_identity_preservation.<locals>.SomeClass.__init__Nr$   r%   r&   r    r   r   r   r   r   W  rq   r   r   r[   rY   r'   )ra   WeakSetr-   r(   rh   r   r   r  )r   r   obj1obj2obj3thingsresultweakset
depickled1
depickled2
depickled3r   r   r   "test_weakset_identity_preservationR  s   z2CloudPickleTest.test_weakset_identity_preservationc              	      s   dd  d  _ G  fddd}| } ddksJ  |ju s"J tt |j}W d    n1 s5w   Y  z.|tjd< t d }|dksKJ |d u sQJ t	 | j
d}|ddks`J W tjd d S tjd w )Nc                 S   s   | d S )Nr[   r   r   r   r   r   funcp  r}   zMCloudPickleTest.test_non_module_object_passing_whichmodule_test.<locals>.funcc                       s    e Zd Zdd Z fddZdS )zXCloudPickleTest.test_non_module_object_passing_whichmodule_test.<locals>.NonModuleObjectc                 S   s
   d | _ d S r   )	some_attrr"   r   r   r   __ini__x  r!   z`CloudPickleTest.test_non_module_object_passing_whichmodule_test.<locals>.NonModuleObject.__ini__c                    s   |dkr S t )NrP  )AttributeErrorr   r  rP  r   r   ro   {  s   zdCloudPickleTest.test_non_module_object_passing_whichmodule_test.<locals>.NonModuleObject.__getattr__N)r$   r%   r&   rR  ro   r   rU  r   r   NonModuleObjectw  s    rV  r[   r  r'   )r%   rP  r   r   rS  rQ  ru   rA  r   r-   r(   rB  )r   rV  non_module_objectr  func_module_namedepickled_funcr   rU  r   /test_non_module_object_passing_whichmodule_testi  s"   

z?CloudPickleTest.test_non_module_object_passing_whichmodule_testc                    s   t tjfD ][}dD ]V G dd d|}G  fddd}dd } |_|tju r-|d}n| }|tjd< z"| t|  d	 t|| j	d
}| | d	 W tj
dd  q	tj
dd  w qd S )N)_missing_moduleNc                   @   rm   )zBCloudPickleTest.test_unrelated_faulty_module.<locals>.FaultyModulec                 S   s   t  r   r{   rT  r   r   r   ro        zNCloudPickleTest.test_unrelated_faulty_module.<locals>.FaultyModule.__getattr__Nrp   r   r   r   r   FaultyModule  rq   r]  c                       s   e Zd Z Zdd ZdS )z9CloudPickleTest.test_unrelated_faulty_module.<locals>.Fooc                 S   r9   r+  r   r"   r   r   r   r     r<   z=CloudPickleTest.test_unrelated_faulty_module.<locals>.Foo.fooN)r$   r%   r&   r   r   module_namer   r   r=    rH   r=  c                   S   r9   r+  r   r   r   r   r   r     r<   z9CloudPickleTest.test_unrelated_faulty_module.<locals>.foo_faulty_moduler,  r'   )r  r8  r9  r%   ru   rA  rh   r-   r   r(   rB  )r   
base_classr]  r=  r   faulty_moduleclonedr   r^  r   test_unrelated_faulty_module  s"   


 z,CloudPickleTest.test_unrelated_faulty_modulezfails for pytest v7.2.0c                    sj   dd l   fdd}ddlm} ddlm} |j|jt j< t	tj
|| jd}| }| d| d S )Nr   c                     s    j dg} |  S r   )builtinr  rB  r   pyr   r   r     s   z5CloudPickleTest.test_dynamic_pytest_module.<locals>.f)CloudPickler)cloudpickle_fastr'   r   )rg  srsly.cloudpicklerh  ri  _module_reducedispatch_tabler   re  r*   r)   r+   r(   rh   )r   r   rh  cp_fastr   rJ  r   rf  r   test_dynamic_pytest_module  s   z*CloudPickleTest.test_dynamic_pytest_modulec                 C   s*   dd }t || jd}| |j|j d S )Nc                 S      | S r   r   r   r   r   r   r     r   z;CloudPickleTest.test_function_module_name.<locals>.<lambda>r'   )r-   r(   rh   r%   r   rP  rc  r   r   r   test_function_module_name  s   z)CloudPickleTest.test_function_module_namec                 C   sX   dd }t |drt|| jd}| |j|j d|_t|| jd}| |j|j d S )Nc                 S   ro  r   r   r   r   r   r   rP    r<   z4CloudPickleTest.test_function_qualname.<locals>.funcr&   r'   z<modifiedlambda>)r[  r-   r(   rh   r&   rp  r   r   r   test_function_qualname  s   
z&CloudPickleTest.test_function_qualnamec                 C   s   G dd d}| }|j dksJ |j jdksJ tt d|_ W d    n1 s,w   Y  d|_t|}|j dks?J |jdksFJ tt d|_ W d    n1 sYw   Y  d|_|jdkshJ t|j jdk d S )Nc                   @   s:   e Zd ZdZdZedd Zedd Zejdd ZdS )z/CloudPickleTest.test_property.<locals>.MyObjectr   c                 S      | j S )A read-only attribute)_read_only_valuer"   r   r   r   read_only_value  r\  z?CloudPickleTest.test_property.<locals>.MyObject.read_only_valuec                 S   rs  r   _read_write_valuer"   r   r   r   read_write_value  s   z@CloudPickleTest.test_property.<locals>.MyObject.read_write_valuec                 S   r   r   rw  r   r   r   r   ry       
N)	r$   r%   r&   ru  rx  r(  rv  ry  setterr   r   r   r   MyObject  s    

r|  r   rt  r[   rY   )rv  r=   r   r   rS  ry  r-   r   )r   r|  rc   depickled_objr   r   r   test_property  s"   zCloudPickleTest.test_propertyc                 C   s   t dg d}|ddd}|ddd}t|||g| jd\}}}t||s(J ||ks.J ||u s4J t||s;J ||ksAJ d S )NMyTuple)r:   r@   rD   r   r[   rY   r'   )r   
namedtupler-   r(   r   )r   r  t1t2depickled_t1depickled_MyTupledepickled_t2r   r   r   test_namedtuple  s   zCloudPickleTest.test_namedtuplez'fails sometimes for pypy on conda-forgec                 C       dj | jd}tt| d S )NaO          from srsly.tests.cloudpickle.testutils import subprocess_pickle_echo

        CONSTANT = 42

        class Foo(object):

            def method(self, x):
                return x

        foo = Foo()

        def f0(x):
            return x ** 2

        def f1():
            return Foo

        def f2(x):
            return Foo().method(x)

        def f3():
            return Foo().method(CONSTANT)

        def f4(x):
            return foo.method(x)

        def f5(x):
            # Recursive call to a dynamically defined function.
            if x <= 0:
                return f4(x)
            return f5(x - 1) + 1

        cloned = subprocess_pickle_echo(lambda x: x**2, protocol={protocol})
        assert cloned(3) == 9

        cloned = subprocess_pickle_echo(f0, protocol={protocol})
        assert cloned(3) == 9

        cloned = subprocess_pickle_echo(Foo, protocol={protocol})
        assert cloned().method(2) == Foo().method(2)

        cloned = subprocess_pickle_echo(Foo(), protocol={protocol})
        assert cloned.method(2) == Foo().method(2)

        cloned = subprocess_pickle_echo(f1, protocol={protocol})
        assert cloned()().method('a') == f1()().method('a')

        cloned = subprocess_pickle_echo(f2, protocol={protocol})
        assert cloned(2) == f2(2)

        cloned = subprocess_pickle_echo(f3, protocol={protocol})
        assert cloned() == f3()

        cloned = subprocess_pickle_echo(f4, protocol={protocol})
        assert cloned(2) == f4(2)

        cloned = subprocess_pickle_echo(f5, protocol={protocol})
        assert cloned(7) == f5(7) == 7
        r'   rO  r(   r   r;  r<  r   rC  r   r   r   #test_interactively_defined_function'  s   ;<z3CloudPickleTest.test_interactively_defined_functionc                 C   s0   d}dD ]}|j | j|d}tt| qd S )Na;          from srsly.tests.cloudpickle.testutils import subprocess_pickle_echo
        from srsly.cloudpickle import dumps, loads

        def local_clone(obj, protocol=None):
            return loads(dumps(obj, protocol=protocol))

        VARIABLE = "default_value"

        def f0():
            global VARIABLE
            VARIABLE = "changed_by_f0"

        def f1():
            return VARIABLE

        assert f0.__globals__ is f1.__globals__

        # pickle f0 and f1 inside the same pickle_string
        cloned_f0, cloned_f1 = {clone_func}([f0, f1], protocol={protocol})

        # cloned_f0 and cloned_f1 now share a global namespace that is isolated
        # from any previously existing namespace
        assert cloned_f0.__globals__ is cloned_f1.__globals__
        assert cloned_f0.__globals__ is not f0.__globals__

        # pickle f1 another time, but in a new pickle string
        pickled_f1 = dumps(f1, protocol={protocol})

        # Change the value of the global variable in f0's new global namespace
        cloned_f0()

        # thanks to cloudpickle isolation, depickling and calling f0 and f1
        # should not affect the globals of already existing modules
        assert VARIABLE == "default_value", VARIABLE

        # Ensure that cloned_f1 and cloned_f0 share the same globals, as f1 and
        # f0 shared the same globals at pickling time, and cloned_f1 was
        # depickled from the same pickle string as cloned_f0
        shared_global_var = cloned_f1()
        assert shared_global_var == "changed_by_f0", shared_global_var

        # f1 is unpickled another time, but because it comes from another
        # pickle string than pickled_f1 and pickled_f0, it will not share the
        # same globals as the latter two.
        new_cloned_f1 = loads(pickled_f1)
        assert new_cloned_f1.__globals__ is not cloned_f1.__globals__
        assert new_cloned_f1.__globals__ is not f1.__globals__

        # get the value of new_cloned_f1's VARIABLE
        new_global_var = new_cloned_f1()
        assert new_global_var == "default_value", new_global_var
        )local_cloner   )r(   
clone_funcr  )r   code_templater  rC  r   r   r   *test_interactively_defined_global_variablej  s   5z:CloudPickleTest.test_interactively_defined_global_variablec           
      C   s   t dksJ t }zddd }dd }t||g| jd\}}|j|ju s$J |j|jus,J tj|| jd}|  t dks=J | }|dksHJ |t|}|j|jusUJ |j|jus]J | }	|	dkshJ |	W |a d S |a w )Nr   c                   S   s   da d S )Nchanged_by_f0_TEST_GLOBAL_VARIABLEr   r   r   r   f0  s   zKCloudPickleTest.test_closure_interacting_with_a_global_variable.<locals>.f0c                   S      t S r   r  r   r   r   r   r     r<   zKCloudPickleTest.test_closure_interacting_with_a_global_variable.<locals>.f1r'   r  )r  r-   r(   __globals__r*   r+   r   r)   )
r   
orig_valuer  r   	cloned_f0	cloned_f1
pickled_f1shared_global_varnew_cloned_f1new_global_varr   r   r   /test_closure_interacting_with_a_global_variable  s*   

z?CloudPickleTest.test_closure_interacting_with_a_global_variablec                 C      dj | jd}t| d S )Na  if __name__ == "__main__":
        from srsly.tests.cloudpickle.testutils import subprocess_worker

        def interactive_function(x):
            return x + 1

        with subprocess_worker(protocol={protocol}) as w:

            assert w.run(interactive_function, 41) == 42

            # Define a new function that will call an updated version of
            # the previously called function:

            def wrapper_func(x):
                return interactive_function(x)

            def interactive_function(x):
                return x - 1

            # The change in the definition of interactive_function in the main
            # module of the main process should be reflected transparently
            # in the worker process: the worker process does not recall the
            # previous definition of `interactive_function`:

            assert w.run(wrapper_func, 41) == 40
        r'   rO  r(   r   r  r   r   r   &test_interactive_remote_function_calls  s   z6CloudPickleTest.test_interactive_remote_function_callsc                 C   r  )NaS  if __name__ == "__main__":
        from srsly.tests.cloudpickle.testutils import subprocess_worker
        import sys

        with subprocess_worker(protocol={protocol}) as w:

            GLOBAL_VARIABLE = 0

            class CustomClass(object):

                def mutate_globals(self):
                    global GLOBAL_VARIABLE
                    GLOBAL_VARIABLE += 1
                    return GLOBAL_VARIABLE

            custom_object = CustomClass()
            assert w.run(custom_object.mutate_globals) == 1

            # The caller global variable is unchanged in the main process.

            assert GLOBAL_VARIABLE == 0

            # Calling the same function again starts again from zero. The
            # worker process is stateless: it has no memory of the past call:

            assert w.run(custom_object.mutate_globals) == 1

            # The symbols defined in the main process __main__ module are
            # not set in the worker process main module to leave the worker
            # as stateless as possible:

            def is_in_main(name):
                return hasattr(sys.modules["__main__"], name)

            assert is_in_main("CustomClass")
            assert not w.run(is_in_main, "CustomClass")

            assert is_in_main("GLOBAL_VARIABLE")
            assert not w.run(is_in_main, "GLOBAL_VARIABLE")

        r'   r  r  r   r   r   5test_interactive_remote_function_calls_no_side_effect  s   ()zECloudPickleTest.test_interactive_remote_function_calls_no_side_effectc                 C   r  )Na  if __name__ == "__main__":
        from srsly.tests.cloudpickle.testutils import subprocess_worker

        with subprocess_worker(protocol={protocol}) as w:

            class CustomCounter:
                def __init__(self):
                    self.count = 0
                def increment(self):
                    self.count += 1
                    return self

            counter = CustomCounter().increment()
            assert counter.count == 1

            returned_counter = w.run(counter.increment)
            assert returned_counter.count == 2, returned_counter.count

            # Check that the class definition of the returned instance was
            # matched back to the original class definition living in __main__.

            assert isinstance(returned_counter, CustomCounter)

            # Check that memoization does not break provenance tracking:

            def echo(*args):
                return args

            C1, C2, c1, c2 = w.run(echo, CustomCounter, CustomCounter,
                                   CustomCounter(), returned_counter)
            assert C1 is CustomCounter
            assert C2 is CustomCounter
            assert isinstance(c1, CustomCounter)
            assert isinstance(c2, CustomCounter)

        r'   r  r  r   r   r   2test_interactive_dynamic_type_and_remote_instances"  s   #$zBCloudPickleTest.test_interactive_dynamic_type_and_remote_instancesc                 C   s   dj | jd}t| dS )zSimulate objects stored on workers to check isinstance semantics

        Such instances stored in the memory of running worker processes are
        similar to dask-distributed futures for instance.
        a
  if __name__ == "__main__":
        import srsly.cloudpickle as cloudpickle, uuid
        from srsly.tests.cloudpickle.testutils import subprocess_worker

        with subprocess_worker(protocol={protocol}) as w:

            class A:
                '''Original class definition'''
                pass

            def store(x):
                storage = getattr(cloudpickle, "_test_storage", None)
                if storage is None:
                    storage = cloudpickle._test_storage = dict()
                obj_id = uuid.uuid4().hex
                storage[obj_id] = x
                return obj_id

            def lookup(obj_id):
                return cloudpickle._test_storage[obj_id]

            id1 = w.run(store, A())

            # The stored object on the worker is matched to a singleton class
            # definition thanks to provenance tracking:
            assert w.run(lambda obj_id: isinstance(lookup(obj_id), A), id1)

            # Retrieving the object from the worker yields a local copy that
            # is matched back the local class definition this instance
            # originally stems from.
            assert isinstance(w.run(lookup, id1), A)

            # Changing the local class definition should be taken into account
            # in all subsequent calls. In particular the old instances on the
            # worker do not map back to the new class definition, neither on
            # the worker itself, nor locally on the main program when the old
            # instance is retrieved:

            class A:
                '''Updated class definition'''
                pass

            assert not w.run(lambda obj_id: isinstance(lookup(obj_id), A), id1)
            retrieved1 = w.run(lookup, id1)
            assert not isinstance(retrieved1, A)
            assert retrieved1.__class__ is not A
            assert retrieved1.__class__.__doc__ == "Original class definition"

            # New instances on the other hand are proper instances of the new
            # class definition everywhere:

            a = A()
            id2 = w.run(store, a)
            assert w.run(lambda obj_id: isinstance(lookup(obj_id), A), id2)
            assert isinstance(w.run(lookup, id2), A)

            # Monkeypatch the class defintion in the main process to a new
            # class method:
            A.echo = lambda cls, x: x

            # Calling this method on an instance will automatically update
            # the remote class definition on the worker to propagate the monkey
            # patch dynamically.
            assert w.run(a.echo, 42) == 42

            # The stored instance can therefore also access the new class
            # method:
            assert w.run(lambda obj_id: lookup(obj_id).echo(43), id2) == 43

        r'   Nr  r  r   r   r   9test_interactive_dynamic_type_and_stored_remote_instancesI  s   EFzICloudPickleTest.test_interactive_dynamic_type_and_stored_remote_instancesz1Seems to have issues outside of linux and CPythonc                 C   r  )Na  if __name__ == "__main__":
        from srsly.tests.cloudpickle.testutils import subprocess_worker
        import struct

        with subprocess_worker(protocol={protocol}) as w:

            reference_size = w.memsize()
            assert reference_size > 0


            def make_big_closure(i):
                # Generate a byte string of size 1MB
                itemsize = len(struct.pack("l", 1))
                data = struct.pack("l", i) * (int(1e6) // itemsize)
                def process_data():
                    return len(data)
                return process_data

            for i in range(100):
                func = make_big_closure(i)
                result = w.run(func)
                assert result == int(1e6), result

            import gc
            w.run(gc.collect)

            # By this time the worker process has processed 100MB worth of data
            # passed in the closures. The worker memory size should not have
            # grown by more than a few MB as closures are garbage collected at
            # the end of each remote function call.
            growth = w.memsize() - reference_size

            # For some reason, the memory growth after processing 100MB of
            # data is ~10MB on MacOS, and ~1MB on Linux, so the upper bound on
            # memory growth we use is only tight for MacOS. However,
            # - 10MB is still 10x lower than the expected memory growth in case
            # of a leak (which would be the total size of the processed data,
            # 100MB)
            # - the memory usage growth does not increase if using 10000
            # iterations instead of 100 as used now (100x more data)
            assert growth < 1.5e7, growth

        r'   r  r  r   r   r   5test_interactive_remote_function_calls_no_memory_leak  s   *+zECloudPickleTest.test_interactive_remote_function_calls_no_memory_leakc              	   C   sb   t tttfD ](}t|d}t|tjf t	j
|| jd W d    n1 s)w   Y  qd S )Nr   r'   )r|   r4   r~  r  r   r   r   r   PicklingErrorr*   r+   r(   )r   exc_typer,   r   r   r   test_pickle_reraise  s   z#CloudPickleTest.test_pickle_reraisec                 C   s<   ddi}t |j| jd}| |dd | |dd  d S )Nr:   r   r'   r@   )r-   getr(   rh   )r   ri   depickled_methodr   r   r   test_unhashable_function  s   z(CloudPickleTest.test_unhashable_function)rY      zJDeprecation warning in python 3.12 about future deprecation in python 3.14c                 C   s`   t jddd}t| t| t|| jd}| ||u tdD ]}| t|t| q!d S )Nr   r[   )stepr'   rf   )	itertoolscountnextr-   r(   r   rg   rh   )r   counternew_counterr  r   r   r   test_itertools_count  s   z$CloudPickleTest.test_itertools_countc                    J   ddl m} dd  |  fdd}t|| jd}| |j j d S )Nr   r   c                   S      d S r   r   r   r   r   r   r     r<   z=CloudPickleTest.test_wraps_preserves_function_name.<locals>.fc                      
      d S r   r   r   r   r   r   r     rz  z=CloudPickleTest.test_wraps_preserves_function_name.<locals>.gr'   )r  r   r-   r(   rh   r$   r   r   r   r   r   r  r   "test_wraps_preserves_function_name  s   z2CloudPickleTest.test_wraps_preserves_function_namec                    r  )Nr   r   c                   S   r9   )42Nr   r   r   r   r   r     r   z<CloudPickleTest.test_wraps_preserves_function_doc.<locals>.fc                      r  r   r   r   r  r   r   r     rz  z<CloudPickleTest.test_wraps_preserves_function_doc.<locals>.gr'   )r  r   r-   r(   rh   r=   r  r   r  r   !test_wraps_preserves_function_doc  s   z1CloudPickleTest.test_wraps_preserves_function_docc                    sJ   dd  dt d _t  fdd}t|| jd}| |j j d S )Nc                 S   r  r   r   r   r   r   r   r     r<   zDCloudPickleTest.test_wraps_preserves_function_annotations.<locals>.fr   )r   returnc                    s    |  d S r   r   r   r  r   r   r     r2   zDCloudPickleTest.test_wraps_preserves_function_annotations.<locals>.gr'   )r  __annotations__r   r-   r(   rh   )r   r   r   r   r  r   )test_wraps_preserves_function_annotations  s   z9CloudPickleTest.test_wraps_preserves_function_annotationsc                 C   s"   t jttf }t||ksJ d S r   )typingUnionr   rI   r-   )r   r  r   r   r   test_type_hint  s   zCloudPickleTest.test_type_hintc              
      s   dgdfD ][ G  fddd}| }t || jd}||fD ]!}| |jd tt d|_W d    n1 s:w   Y  qG dd d|}| }tj	|| jd}~t
|}|jdks`J qd S )	Nregistered_attributec                       s   e Zd Z Zdd ZdS )z@CloudPickleTest.test_instance_with_slots.<locals>.ClassWithSlotsc                 S   
   d| _ d S )Nr?   )r  r"   r   r   r   r      r!   zICloudPickleTest.test_instance_with_slots.<locals>.ClassWithSlots.__init__N)r$   r%   r&   	__slots__r    r   slotsr   r   ClassWithSlots  rH   r  r'   r?   r   c                   @   rm   )zCCloudPickleTest.test_instance_with_slots.<locals>.SubclassWithSlotsc                 S   r  r   )unregistered_attributer"   r   r   r   r    "  r!   zLCloudPickleTest.test_instance_with_slots.<locals>.SubclassWithSlots.__init__NrD  r   r   r   r   SubclassWithSlots!  rq   r  )r-   r(   rh   r  r   r   rS  non_registered_attributer*   r+   r)   r  )r   r  initial_objr}  r,   r  r   r   r  r   test_instance_with_slots  s&   
z(CloudPickleTest.test_instance_with_slotsMappingProxyTypez-Old versions of Python do not have this type.c                 C   s(   t ddi}|t|| jdksJ d S )Nsome_keyz
some valuer'   )r8  r  r-   r(   )r   mpr   r   r   test_mappingproxy,  s   z!CloudPickleTest.test_mappingproxyc                 C   sb   t d}|ddtfg}|dd}t|| jd |jt|| jdj  kr,dks/J  J d S )Ndataclasses	DataClassr   r?   r   r'   )r   rr  make_dataclassrI   r-   r(   r   )r   r  r  r  r   r   r   test_dataclass2  s
   

.zCloudPickleTest.test_dataclassc                    s   G dd dt tj}G  fddd| t j j g| jd\}}}||u s)J ||ju s0J ||jus7J t|t s>J | sDJ | ju sKJ | u sQJ t j| jd}| ju s`J d S )Nc                   @      e Zd ZdZdS )z=CloudPickleTest.test_locally_defined_enum.<locals>.StringEnumz4Enum when all members are also (and must be) stringsN)r$   r%   r&   r=   r   r   r   r   
StringEnum<  s    r  c                       s(   e Zd ZdZdZdZdZ fddZdS )z8CloudPickleTest.test_locally_defined_enum.<locals>.Colorz3-element color space123c                    s
   |  j u S r   )GREENr"   Colorr   r   is_greenE  r!   zACloudPickleTest.test_locally_defined_enum.<locals>.Color.is_greenN)r$   r%   r&   r=   REDr  BLUEr  r   r  r   r   r  ?  s    r  r'   )	r   enumEnumr-   r  r(   r  r   r  )r   r  green1green2ClonedColorgreen3r   r  r   test_locally_defined_enum;  s   	z)CloudPickleTest.test_locally_defined_enumc                 C   sj   t ddddd}t|j|j|g| jd\}}}||u sJ ||ju s&J ||jus-J ||u s3J d S )Nr  r   r[   rY   )r  r  r  r'   )r  IntEnumr-   r  r(   r  )r   DynamicColorr  r  ClonedDynamicColorr   r   r   test_locally_defined_intenumX  s   z,CloudPickleTest.test_locally_defined_intenumc                 C   r  )Na  if __name__ == "__main__":
        from enum import Enum
        from srsly.tests.cloudpickle.testutils import subprocess_worker

        with subprocess_worker(protocol={protocol}) as w:

            class Color(Enum):
                RED = 1
                GREEN = 2

            def check_positive(x):
                return Color.GREEN if x >= 0 else Color.RED

            result = w.run(check_positive, 1)

            # Check that the returned enum instance is reconciled with the
            # locally defined Color enum type definition:

            assert result is Color.GREEN

            # Check that changing the definition of the Enum class is taken
            # into account on the worker for subsequent calls:

            class Color(Enum):
                RED = 1
                BLUE = 2

            def check_positive(x):
                return Color.BLUE if x >= 0 else Color.RED

            result = w.run(check_positive, 1)
            assert result is Color.BLUE
        r'   r  r  r   r   r   test_interactively_defined_enume  s    !z/CloudPickleTest.test_interactively_defined_enumc                 C   sz   t d ddlm} | \}}t||gddgD ]!\}}| d| dks(J t|| jd}| d| dks:J qd S )	Nrl  r   )relative_imports_factorymodulepackagezhello from a !r'   )r   rr  rl  r  r  r-   r(   )r   r  r   r   rP  sourcecloned_funcr   r   r   $test_relative_import_inside_function  s   

z4CloudPickleTest.test_relative_import_inside_functionc                 C   sP   dddd}t || jd}||fD ]}|ddksJ |jddiks%J qd S )	Nr   )r@   c                S   s   | | S r   r   r   r   r   r   r     r}   zUCloudPickleTest.test_interactively_defined_func_with_keyword_only_argument.<locals>.fr'   r[   rY   r@   )r-   r(   __kwdefaults__)r   r   rG  rP  r   r   r   :test_interactively_defined_func_with_keyword_only_argument  s   zJCloudPickleTest.test_interactively_defined_func_with_keyword_only_argumentco_posonlyargcountz(Requires positional-only argument syntaxc                 C   r  )Na  
        import pytest
        from srsly.cloudpickle import loads, dumps

        def f(a, /, b=1):
            return a + b

        depickled_f = loads(dumps(f, protocol={protocol}))

        for func in (f, depickled_f):
            assert func(2) == 3
            assert func.__code__.co_posonlyargcount == 1
            with pytest.raises(TypeError):
                func(a=2)

        r'   r  r  r   r   r   =test_interactively_defined_func_with_positional_only_argument  s   zMCloudPickleTest.test_interactively_defined_func_with_positional_only_argumentc                 C   sD   t d ddlm} | dksJ t|| jd}||u s J d S )Nrl  r   )some_singletonr  r'   )r   rr  rl  r  r#   r-   r(   )r   r  depickled_singletonr   r   r   test___reduce___returns_string  s   
z.CloudPickleTest.test___reduce___returns_stringc                 C   sR   dd }t tj|j }|dhksJ t|| jd}| }| tks'J d S )Nc                  S   r  )Nc                   S   r  r   r  r   r   r   r   inner_function  r   ziCloudPickleTest.test_cloudpickle_extract_nested_globals.<locals>.function_factory.<locals>.inner_functionr   )r  r   r   r   function_factory  s   zQCloudPickleTest.test_cloudpickle_extract_nested_globals.<locals>.function_factoryr  r'   )r  r*   _extract_code_globalsr   rK   r-   r(   r  )r   r  globals_depickled_factory
inner_funcr   r   r   'test_cloudpickle_extract_nested_globals  s   z7CloudPickleTest.test_cloudpickle_extract_nested_globalsc                 C   sT   G dd d}| }t jtjdd t| W d    d S 1 s#w   Y  d S )Nc                   @   rm   )z9CloudPickleTest.test_recursion_during_pickling.<locals>.Ac                 S   s
   t | |S r   )getattrrT  r   r   r   __getattribute__  r!   zJCloudPickleTest.test_recursion_during_pickling.<locals>.A.__getattribute__N)r$   r%   r&   r   r   r   r   r   r>     rq   r>   	recursionrp  )r   r   r   r  r*   r+   )r   r>   r:   r   r   r   test_recursion_during_pickling  s
   "z.CloudPickleTest.test_recursion_during_picklingc                    s   | j dk r
td td G  fddd}| }g }tj|| j |jd}t|dks/J tj	||d} j
|j|j d S )	Nr   zNeed Pickle Protocol 5 or laternumpyc                       s   e Zd Z dZdS )zECloudPickleTest.test_out_of_band_buffers.<locals>.LocallyDefinedClassrf   N)r$   r%   r&   zerosr  r   r
  r   r   LocallyDefinedClass  s    r  )r(   buffer_callbackr   )buffers)r(   r   skiprr  r*   r+   appendr   r   r)   testingassert_allcloser  )r   r  data_instancer  pickle_bytesreconstructedr   r  r   test_out_of_band_buffers  s   



z(CloudPickleTest.test_out_of_band_buffersc                 C   sF   t d}t|| jd}g d}|D ]}t||t||ks J qd S )NTr'   )r$   	__bound____constraints____covariant____contravariant__)r  TypeVarr-   r(   r  )r   r  depickled_T	attr_listattrr   r   r   test_pickle_dynamic_typevar  s   
z+CloudPickleTest.test_pickle_dynamic_typevarc                 C   s(   t d}t|| jd}||u sJ d S Nr  r'   )r  r  r   r(   )r   r  T2r   r   r   $test_pickle_dynamic_typevar_tracking     
z4CloudPickleTest.test_pickle_dynamic_typevar_trackingc                 C   s0   t d}t||f| jd\}}||u sJ d S r  )r  r  r-   r(   )r   r  depickled_T1depickled_T2r   r   r   'test_pickle_dynamic_typevar_memoization  s
   

z7CloudPickleTest.test_pickle_dynamic_typevar_memoizationc                 C   sV   t d ddlm} t|| jd}||u sJ ddlm} |t|| jdu s)J d S )Nrl  r   )r  r'   )AnyStr)r   rr  rl  r  r-   r(   r  r"  )r   r  T1r"  r   r   r   test_pickle_importable_typevar	  s   
z.CloudPickleTest.test_pickle_importable_typevarc                 C   s   t d}G dd dt j| }t|| jd|u sJ t|t | jd|t ks*J t| jd3}dd }t|t dddk}||t |t|d	ksLJ |||t |t|d	ks[J W d    d S 1 sfw   Y  d S )
Nr  c                   @   r]   )z,CloudPickleTest.test_generic_type.<locals>.CNr^   r   r   r   r   rG   	  r`   rG   r'   c                 S   s   | j |u sJ t|jdksJ |jd }|j tju sJ |r2t| jdks(J | jd |u s1J nt| jdks;J | jd |u sDJ t|jdksMJ dS )Nr   r   ok)
__origin__r   __orig_bases__r  Generic__args____parameters__)genericorigin
type_valueuse_argsr   r   r   r   check_generic	  s   
z8CloudPickleTest.test_generic_type.<locals>.check_genericr)  r   r%  )	r  r  r(  r-   r(   rI   r   r  run)r   r  rG   workerr/  r.  r   r   r   test_generic_type	  s   
 "z!CloudPickleTest.test_generic_typec                 C   s.  t d}G dd dt j| }G dd d|}G dd d|}G dd	 d	|t }G d
d d|}G dd d|| }G dd d|| }|||||||g}	|	D ]}
t|
| jd|
u s^J qQt| jd(}dd }|	D ]}
|
 }||
|syJ |||
|dksJ qlW d    d S 1 sw   Y  d S )Nr  c                   @   r]   )z3CloudPickleTest.test_generic_subclass.<locals>.BaseNr^   r   r   r   r   r   7	  r`   r   c                   @   r]   )z9CloudPickleTest.test_generic_subclass.<locals>.DerivedAnyNr^   r   r   r   r   
DerivedAny:	  r`   r3  c                   @   r]   )z6CloudPickleTest.test_generic_subclass.<locals>.LeafAnyNr^   r   r   r   r   LeafAny=	  r`   r4  c                   @   r]   )z9CloudPickleTest.test_generic_subclass.<locals>.DerivedIntNr^   r   r   r   r   
DerivedInt@	  r`   r5  c                   @   r]   )z6CloudPickleTest.test_generic_subclass.<locals>.LeafIntNr^   r   r   r   r   LeafIntC	  r`   r6  c                   @   r]   )z7CloudPickleTest.test_generic_subclass.<locals>.DerivedTNr^   r   r   r   r   DerivedTF	  r`   r7  c                   @   r]   )z4CloudPickleTest.test_generic_subclass.<locals>.LeafTNr^   r   r   r   r   LeafTI	  r`   r8  r'   c                 S   s   |   |ksJ dS )Nr%  )mro)klassexpected_mror   r   r   	check_mroT	  s   z8CloudPickleTest.test_generic_subclass.<locals>.check_mror%  )	r  r  r(  rI   r-   r(   r   r9  r0  )r   r  r   r3  r4  r5  r6  r7  r8  klassesr:  r1  r<  r9  r   r   r   test_generic_subclass4	  s(   
"z%CloudPickleTest.test_generic_subclassc                    s   t | jd:}t D ]- G  fddd}d i|_dd }| }|| ddks+J ||| ddks7J q
W d    d S 1 sCw   Y  d S )	Nr'   c                       s   e Zd Zd d fddZdS )zKCloudPickleTest.test_locally_defined_class_with_type_hints.<locals>.MyClassr  r  c                 S   rn   r   r   )r   r  r   r   r   r;   a	  r<   zRCloudPickleTest.test_locally_defined_class_with_type_hints.<locals>.MyClass.methodNr   r   type_r   r   r_   `	  s    r_   	attributec                 S   s>   | j d |ks	J | jj d |ksJ | jj d |ksJ dS )NrA  r  r  r%  )r  r;   )r,   expected_typeexpected_type_strr   r   r   check_annotationse	  s   
zUCloudPickleTest.test_locally_defined_class_with_type_hints.<locals>.check_annotationsr@  r%  )r   r(   _all_types_to_testr  r0  )r   r1  r_   rD  r,   r   r?  r   *test_locally_defined_class_with_type_hints]	  s   

"z:CloudPickleTest.test_locally_defined_class_with_type_hintsc                 C   s>   t d}|j|jd fD ]}t|| jd}||ksJ qd S )Ntyping_extensionsr:   r'   )r   rr  Literalr-   r(   r   rG  r,   r}  r   r   r   test_generic_extensions_literalv	  
   
z/CloudPickleTest.test_generic_extensions_literalc                 C   s>   t d}|j|jt fD ]}t|| jd}||ksJ qd S )NrG  r'   )r   rr  FinalrI   r-   r(   rI  r   r   r   test_generic_extensions_final|	  rK  z-CloudPickleTest.test_generic_extensions_finalc                 C   s:   G dd d}dt i|_t|| jd}|j|jksJ d S )Nc                   @   r]   )z1CloudPickleTest.test_class_annotations.<locals>.CNr^   r   r   r   r   rG   	  r`   rG   r:   r'   )rI   r  r-   r(   )r   rG   C1r   r   r   test_class_annotations	  s   
z&CloudPickleTest.test_class_annotationsc                 C   s4   dt dtfdd}t|| jd}|j|jksJ d S )Nr:   r  c                 S   r  r   r   r   r   r   r   r   	  r<   z4CloudPickleTest.test_function_annotations.<locals>.fr'   )rI   r   r-   r(   r  )r   r   r   r   r   r   test_function_annotations	  s   z)CloudPickleTest.test_function_annotationsc              	      sp   dd l }z,G dd d  fdd}||j <   }t|| jd}t|ds(J W |j  d S |j  w )Nr   c                   @   r]   )zCCloudPickleTest.test_always_use_up_to_date_copyreg.<locals>.MyClassNr^   r   r   r   r   r_   	  r`   r_   c                    s    dddifS )Nr   custom_reduceTr   r   r_   r   r   reduce_myclass	  r   zJCloudPickleTest.test_always_use_up_to_date_copyreg.<locals>.reduce_myclassr'   rQ  )copyregrl  r-   r(   r[  rB  )r   rT  rS  my_objdepickled_myobjr   rR  r   "test_always_use_up_to_date_copyreg	  s   
z2CloudPickleTest.test_always_use_up_to_date_copyregc                 C   &   G dd d}| }t || jd d S )Nc                   @   r*  )z:CloudPickleTest.test_literal_misdetection.<locals>.MyClassc                 S   r9   )Nr   r   r"   r   r   r   
__values__	  r   zECloudPickleTest.test_literal_misdetection.<locals>.MyClass.__values__N)r$   r%   r&   r(  rY  r   r   r   r   r_   	  r+  r_   r'   r-   r(   r   r_   or   r   r   test_literal_misdetection	     z)CloudPickleTest.test_literal_misdetectionc                 C   rX  )Nc                   @   r*  )zDCloudPickleTest.test_final_or_classvar_misdetection.<locals>.MyClassc                 S   r  r   )rI   r"   r   r   r   __type__	  r   zMCloudPickleTest.test_final_or_classvar_misdetection.<locals>.MyClass.__type__N)r$   r%   r&   r(  r_  r   r   r   r   r_   	  r+  r_   r'   rZ  r[  r   r   r   #test_final_or_classvar_misdetection	  r^  z3CloudPickleTest.test_final_or_classvar_misdetectionc           	         s0  t j }ztjt}tt jd tt j| t jd| t| j	d}|
dd | dd lm ddlmmm  tt |
dd  W d    n1 sWw   Y  tt |
dd  W d    n1 ssw   Y   fD ] tt |
fd	d W d    n1 sw   Y  q~t |
fd
d ksJ |
fddjksJ |
 fdd   ksJ |
fdd ksJ ddlm}m}m ||tt |
dd  W d    n	1 sw   Y  tt |
fdd W d    n	1 s&w   Y  t tt |
fdd W d    n	1 sIw   Y  tt |
dd  W d    n	1 sfw   Y  dd l}t| |
fdd ksJ |
fdd ksJ t| tt |
fdd W d    n	1 sw   Y  tt |
fdd W d    n	1 sw   Y  dd l}t|jj |
fdd ksJ |
fddjksJ |
fdd  ksJ tt |
fdd W d    n	1 s&w   Y  tt |
dd  W d    n	1 sCw   Y  t|jj tt |
fdd W d    n	1 shw   Y  dd l}t|j |
fdd ksJ |
fddjksJ |
fdd  ksJ t|j W d    n	1 sw   Y  W d }|t _|| d!| d"| d#fD ]}t j |d rjt! v rt qd S d }|t _|| d!| d"| d#fD ]}t j |d rjt! v rt qw )$N r   r'   c                 S   s   t j| S r   )ru   rM  r3   )pr   r   r   r   	  r   zeCloudPickleTest.test_pickle_constructs_from_module_registered_for_pickling_by_value.<locals>.<lambda>)local_functionLocalT
LocalClassc                   S      t dS Nzmock_local_folder.mod
__import__r   r   r   r   r   	  r   c                   S   rf  Nzmock_local_folder.subfolder.modrh  r   r   r   r   r   	  r   c                      r   r   r   r   )r\  r   r   r   	  r   c                           S r   r   r   rc  r   r   r   	      c                          j S r   r$   r   )rd  r   r   r   	  rm  c                      
       S r   r;   r   )re  r   r   r   	     
 c                      s      S r   rl  r   )r7  r   r   r   	  r   )LocalSubmodClassLocalSubmodTlocal_submod_functionc                   S   rf  rj  rh  r   r   r   r   r   

  r   c                      r   r   r   r   ru  r   r   r   
  r   c                      r   r   r   r   rl  r   r   r   
  r   c                   S   rf  rg  rh  r   r   r   r   r   
  r   c                      rk  r   r   r   rl  r   r   r   
  rm  c                      rk  r   r   r   _funcr   r   r   
  rm  c                      r   r   r   r   rl  r   r   r   
  r   c                      r   r   r   r   rv  r   r   r   !
  r   c                      rk  r   r   r   rw  r   r   r   '
  rm  c                      rn  r   ro  r   _tr   r   r   (
  rm  c                      rp  r   rq  r   _classr   r   r   )
  rr  c                      r   r   r   r   rl  r   r   r   /
  r   c                   S   rf  rg  rh  r   r   r   r   r   1
  r   c                      r   r   r   r   rv  r   r   r   7
  r   c                      rk  r   r   r   rw  r   r   r   <
  rm  c                      rn  r   ro  r   ry  r   r   r   =
  rm  c                      rp  r   rq  r   r{  r   r   r   >
  rr  mock_local_folderz.modz
.subfolderz.subfolder.submod)"ru   rM  copyrL  dirname__file__r7   insertr   r(   r0  mock_local_folder.modr7  rc  rd  re  r   r   rz  r   r$   r;   "mock_local_folder.subfolder.submodrs  rt  ru  r	   r}  	subfoldersubmodmock_local_folder.subfolderrA  rB  r
   )	r   _prev_sys_path_mock_interactive_session_cwdwrs  rt  r}  _fnamer  r   )	re  rd  r|  rx  rz  rc  ru  r7  r\  r   Ctest_pickle_constructs_from_module_registered_for_pickling_by_value	  s   
		
"
"uzSCloudPickleTest.test_pickle_constructs_from_module_registered_for_pickling_by_valuec              	      s0  t d dD ]}|dkrdd l}|j |j}n|dkr(dd lm} |j |j}z^t| j	dA}|
 fdd|ks=J t| |
 fd	d|ksNJ d
|_|j|ksXJ |
 fddd
kseJ t| W d    n1 ssw   Y  W ||_|jt v rt| q||_|jt v rt| w w d S )Nrl  )r  r  r  r   r  r'   c                      rk  r   r   r   r  r   r   r   Y
  rm  zqCloudPickleTest.test_pickle_constructs_from_installed_packages_registered_for_pickling_by_value.<locals>.<lambda>c                      rk  r   r   r   r  r   r   r   _
  rm  modified globalc                      rk  r   r   r   r  r   r   r   b
  rm  )r   rr  rl  package_function_with_globalglobal_variablery  r7  module_function_with_globalr   r(   r0  r   r	   r$   r
   )r   package_or_moduler  _original_globalr  r   r  r   Otest_pickle_constructs_from_installed_packages_registered_for_pickling_by_valueJ
  s<   


z_CloudPickleTest.test_pickle_constructs_from_installed_packages_registered_for_pickling_by_valuec                 C   s  t d dd l}ddlm} |j}dd }dd }dd	 }zUt| jd
6}|| |||d t| d|_|||d ||d|ksJJ ||ddksTJ W d    n1 s^w   Y  W ||_dt	 v rrt
| d S d S ||_dt	 v rt
| w w )Nrl  r   )r  c                  S   s   t djd } i | _d S Nru   __main__ri  rA  _cloudpickle_registry)_mainr   r   r   _create_registryu
  s   
zzCloudPickleTest.test_pickle_various_versions_of_the_same_function_with_different_pickling_method.<locals>._create_registryc                 S   s   t djd }| |j|< d S r  r  )vkr  r   r   r   _add_to_registryz
  s   zzCloudPickleTest.test_pickle_various_versions_of_the_same_function_with_different_pickling_method.<locals>._add_to_registryc                 S   s   t djd }|j|   S r  r  )r  r  r   r   r   _call_from_registry~
  s   z}CloudPickleTest.test_pickle_various_versions_of_the_same_function_with_different_pickling_method.<locals>._call_from_registryr'   f_by_refr  f_by_val)r   rr  rl  r  r  r   r(   r0  r   r
   r	   )r   rl  r   r  r  r  r  r  r   r   r   Ptest_pickle_various_versions_of_the_same_function_with_different_pickling_methodi
  s4   




z`CloudPickleTest.test_pickle_various_versions_of_the_same_function_with_different_pickling_method)rY   r   z2Determinism can only be guaranteed for Python 3.7+c              	   C   st   t  }dd }tdD ]}|t|| jdt|id qt|dkr8|D ]}t| q%t	
dt|  d S d S )Nc                   S   s   t t S r   )r  _TEST_GLOBAL_VARIABLE2r   r   r   r   func_with_globals
  r}   zWCloudPickleTest.test_deterministic_pickle_bytes_for_function.<locals>.func_with_globalsr   PYTHONHASHSEED)r(   add_envr   z1Expected a single deterministic payload, got %d/5)r  rg   r  r   r(   r   r   pickletoolsdisr   fail)r   valsr  r  valr   r   r   ,test_deterministic_pickle_bytes_for_function
  s    

z<CloudPickleTest.test_deterministic_pickle_bytes_for_function)r$   r%   r&   r*   DEFAULT_PROTOCOLr(   rT   rW   r   markskipifr>  r?  ru   version_infore   rl   rs   r	  ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r)  r,  r0  r2  r5  rH  rT  r^  rd  rk  r  r  r  r  r  r  r  r  r  machiner  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r?  rC  rO  rZ  rd  rn  rq  rr  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  unittestskipIfr[  r8  r  r  r  r  r  r  r  CodeTyper  r  r  r  r  r  r  r!  r$  r2  r>  rF  rJ  rM  rO  rP  rW  r]  r`  r  r  r  r  r   r   r   r   rN   y   sT   

.
		% .G:"

&



[Z4(
.
A=2,'N
.

	$

	

%)

 .
rN   c                   @   r  )Protocol2CloudPickleTestr[   N)r$   r%   r&   r(   r   r   r   r   r  
  s    r  c                  C   s(   t d} t| | jd}|d u sJ d S )Nr  r  )r  r  r   r$   )r  module_and_namer   r   r   /test_lookup_module_and_qualname_dynamic_typevar
  r  r  c                  C   sV   t d dd l} | j}t||jd}|d usJ |\}}|| u s#J |dks)J d S )Nrl  r   r  r  )r   rr  rl  r  r   r$   )rl  r  r  r  r  r   r   r   2test_lookup_module_and_qualname_importable_typevar
  s   
r  c                  C   sB   t tjtjjd} | d usJ | \}}|tu sJ |dksJ d S )Nr  r"  )r   r  r"  r$   )r  r  r  r   r   r   .test_lookup_module_and_qualname_stdlib_typevar
  s   r  c                  C   s  t d dd l} dd lm} t t ksJ t|  t | jhks$J t| t | j|jhks3J t	| t | jhks@J d| j d}t j
t|d t	| j W d    n1 s^w   Y  t	|  t t ksoJ |  d}t j
tt|d t	|  W d    n1 sw   Y  d| j d}t j
t|d t| j W d    n1 sw   Y  td}| d}t j
tt|d t| W d    d S 1 sw   Y  d S )	Nrl  r   z%Input should be a module object, got z insteadrp  z& is not registered for pickle by valuedynamic_modzN was not imported correctly, have you used an `import` statement to access it?)r   rr  rl  ry  r7  r
   r  r   r$   r	   r   r4   reescaper8  r9  )pkgr7  r   r  r   r   r   test_register_pickle_by_value
  s<   




"r  c                  C   s   t d} G dd dt j|  }||t | t jt jt jt jt jt t j|  t jtgt jf t jdt jf t jg t jf t jtdf t jt|t f t j	t t j
ttf t jt j|t  t jg}|S )Nr  c                   @   r]   )z_all_types_to_test.<locals>.CNr^   r   r   r   r   rG   
  r`   rG   .)r  r  r(  rI   AnyOptionalr  CallableTupleListDictr   ClassVarNoReturn)r  rG   types_to_testr   r   r   rE  
  s&   

rE  c                   C   s"   t tdsJ tjtju sJ d S )NPickler)r[  r*   r  rh  r   r   r   r   test_module_level_pickler  s   r  r  )Lr   r-  r   r  r  r  r  r  rf  r  operatorr   r   r  r>  r  r  rU   r  ru   rQ   r;  r8  r  ra   rL  r  r  r   r   r  r
  scipy.specialspecialr  rz  r  r  rj  r*   rs  r   r   r	   r
   srsly.cloudpickle.cloudpickler   r   r   r   r   r   	testutilsr   r   r   r   r  r  r   r  r-   r1   r7   rM   TestCaserN   r  r  r  r  r  rE  r  r$   mainr   r   r   r   <module>   s    	                    M	(
