
    h*                        S SK r S SKrS SKJr  S SKrS SKJrJrJ	r	J
r
Jr  S SKJr  S SKJr  S SKJr  S SKrS SKJr  S SKJr  \R,                  rSrS	rS
 rS rS\S4S jrS\S4S jrSS jrSS jrS r " S S5      r \SS j5       r!\4S jr"\#S:X  a8  \$" \ RJ                  \ RJ                  RM                  S5      S-      5      r'\" \'S9  gg)    N)Popencheck_outputPIPESTDOUTCalledProcessError)pickle)contextmanager)ProcessPoolExecutor)dumps)TimeoutExpired<   a test valuec                      S n U $ )Nc                 B    [         S:X  d   e[        [        S5      5      $ )Nr   
   )TEST_GLOBALSsumrange)xs    [/home/james-whalen/.local/lib/python3.13/site-packages/srsly/tests/cloudpickle/testutils.pygmake_local_function.<locals>.g   s      ~---59~     )r   s    r   make_local_functionr      s     Hr   c                  ,   [         R                  " [         R                  " [         R                  " [        5      S5      5      n [
        R                  R                  5       nSR                  U [
        R                  [
        R                  S9nX!S'   X4$ )z5Helper to prepare environment for the child processesz..z{src}{sep}tests{pathsep}{src})srcseppathsep
PYTHONPATH)opnormpathjoindirname__file__osenvironcopyformatr   r   )cloudpickle_repo_folderenv
pythonpaths      r   _make_cwd_envr-      sn     kk


8$d+-
**//
C077# 8 EJ""''r   c           
         [         R                  S[        S[        U5      /n[	        5       u  pVU(       a  UR                  U5        [        U[        [        [        XVSS9n[        XS9n 0 n	X)S'   UR                  " U40 U	D6u  pUR                  S:w  d  [        U5      (       a-  SUR                  -  nXR                  S	5      -  n[        U5      eU
$ ! [         ad  nUR                  5         UR                  5       u  pS
R!                  U
R                  S	5      UR                  S	5      /5      n[        U5      UeSnAff = f)ur  Retrieve pickle string of an object generated by a child Python process

Pickle the input data into a buffer, send it to a subprocess via
stdin, expect the subprocess to unpickle, re-pickle that data back
and send it back to the parent process via stdout for final unpickling.

>>> testutils.subprocess_pickle_string([1, 'a', None], protocol=2)
b']q (KX   aqNe.'

	-W ignore
--protocol   )stdinstdoutstderrcwdr+   bufsizeprotocoltimeoutr   zSubprocess returned %d: utf-8
N)sys
executabler%   strr-   updater   r   r   communicate
returncodelendecodeRuntimeErrorr   killr#   )
input_datar8   r9   add_envcmdr5   r+   procpickle_stringcomm_kwargsouterrmessagees                 r   subprocess_pickle_stringrP   (   s   " >>;,H
NCHC

7DdD*8M+!(I##MA[A??a3s8804??BGzz'**Gw''
 +		##%))SZZ0#**W2EFG7#*	+s   +A)C 
EAD>>Ec                 0    [        U UUUS9n[        U5      $ )a0  Echo function with a child Python process
Pickle the input data into a buffer, send it to a subprocess via
stdin, expect the subprocess to unpickle, re-pickle that data back
and send it back to the parent process via stdout for final unpickling.
>>> subprocess_pickle_echo([1, 'a', None])
[1, 'a', None]
)r8   r9   rG   )rP   loads)rF   r8   r9   rG   rL   s        r   subprocess_pickle_echorS   P   s%     #:,4+2+24C :r   c                 Z    Sn U R                  U5      nX#-  n[        U5      U:  a   U$ M)  )Nr   )readrB   )	stream_in
chunk_sizeall_datadatas       r   _read_all_bytesrZ   `   s9    H
~~j)t9z!O r   c                 d   U c  [         R                  n Uc  [         R                  n[        U S5      (       a  U R                  n [        US5      (       a  UR                  n[        U 5      nU R                  5         [        U5      n[        XBS9nUR                  U5        UR                  5         g)z5Read a pickle from stdin and pickle it back to stdoutNbufferr7   )
r<   r2   r3   hasattrr\   rZ   closerR   r   write)rV   
stream_outr8   input_bytesobjrepickled_bytess         r   pickle_echord   j   s    II	ZZ
 y(##$$	z8$$&&
!),KOO

CC3O_%r   c                 t    [        U 5      u  p#n U" U0 UD6n[        XQS9$ ! [         a  nUn SnANSnAff = f)zARemote function call that uses cloudpickle to transport everthingNr7   )rR   BaseExceptionr   )payloadr8   funcargskwargsresultrO   s          r   	call_funcrl      sH    wDt&v& ++  s   ! 
727c                   0    \ rS rSrSS jrS rS rS rSrg)	_Worker   Nc                     Xl         [        SS9U l        U R                  R                  [        S5      R                  5         g )N   )max_workers*   )r8   r
   poolsubmitidrk   )selfr8   s     r   __init___Worker.__init__   s0     'A6			R '')r   c                     [        XU4U R                  S9nU R                  R                  [        X@R                  5      R                  5       n[        U5      n[        U[        5      (       a  UeU$ )z Synchronous remote function callr7   )	r   r8   rt   ru   rl   rk   rR   
isinstancerf   )rw   rh   ri   rj   input_payloadresult_payloadrk   s          r   run_Worker.run   sa     t62T]]K))}mm55;VX 	~&fm,,Lr   c                 R   [        U R                  R                  5       Vs/ s H"  n[        US5      (       a  UR                  OUPM$     nn[        U5      nUS:X  a  gUS:  a  [        SU-  5      e[        R                  " US   5      R                  5       R                  $ s  snf )Npidr   rq   z Unexpected number of workers: %d)listrt   
_processesr]   r   rB   rD   psutilProcessmemory_inforss)rw   pworkers_pidsnum_workerss       r   memsize_Worker.memsize   s    !%dii&:&:!;=!;A ")E!2!29!; 	 =,'!1_A!, - . .~~l1o.::<@@@=s   )B$c                 6    U R                   R                  SS9  g )NT)wait)rt   shutdown)rw   s    r   r^   _Worker.close   s    		%r   )rt   r8   N)	__name__
__module____qualname____firstlineno__rx   r~   r   r^   __static_attributes__r   r   r   rn   rn      s    *

	A&r   rn   c              #   F   #    [        U S9nUv   UR                  5         g 7f)Nr7   )rn   r^   )r8   workers     r   subprocess_workerr      s     h'F
L
LLNs   !c                 F   [         R                  " SS9u  p#[        R                  " U5         [	        US5       nUR                  U R                  S5      5        SSS5        [        R                  SU/n[        5       u  pgU[        US.n[        R                  R                  S5      n	U	(       a  XS	   S'   XS
'     [        U40 UD6n
U
S:w  a  [%        U
R#                  S5      5      e [        R(                  " U5        g! , (       d  f       N= f! [         a-  n[        SUR                   R#                  S5      -  5      UeSnAff = f! [&         a-  n[        SUR                   R#                  S5      -  5      UeSnAff = f! [        R(                  " U5        f = f)zUtility to help check pickleability of objects defined in __main__

The script provided in the source code should return 0 and not print
anything on stderr or stdout.
z_src_test_cloudpickle.py)suffixwbr:   Nr/   )r5   r4   r+   COVERAGE_PROCESS_STARTr+   r9   zscript errored with output:
%sr   z!script timeout, output so far:
%s)tempfilemkstempr&   r^   openr_   encoder<   r=   r-   r   r'   getr   r   rD   outputrC   AssertionErrorr   unlink)source_coder9   fdsource_filefrH   r5   r+   rj   coverage_rcrL   rO   s               r   assert_run_python_scriptr      s    &&.HIOBHHRL+t$GGK&&w/0 %~~{K8 ?
 jjnn%=>6A5M23#y
	BF"31&1 cz$SZZ%899  			+5 %$" & F"#D%&XX__W%=$> ?DEFF
  	BC!"!9 : ;@AB	B 			+s_   F !DA"F ?D  E 
DF 
E(EEE 
F(F  FF F __main__r0   rq   r7   )r1   )NNNr   )(r<   r&   os.pathpathr!   r   
subprocessr   r   r   r   r   srsly.cloudpickle.compatr   
contextlibr	   concurrent.futuresr
   r   srsly.cloudpickler   r   rR   TIMEOUTr   r   r-   rP   rS   rZ   rd   rl   rn   r   r   r   intargvindexr8   r   r   r   <module>r      s    
 	   L L + % 2  # %
( 37%)%+P 15g#' *,& &B   3: #L z388CHHNN<81<=>H" r   