
    o[wen0                     6   d Z ddlZddlZddl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mZ ddlmc mZ ddlZddlmZ ej        j        ej                             e            d          gZ G d dej        j                  Z G d	 d
e          Z G d de          Z G d de          Z  G d de          Z! G d de          Z" G d de          Z# G d de          Z$ G d de          Z% G d de          Z& G d dej        j                  Z'd Z(d Z)ej*        d             Z+ej        ,                    d eej-        dfe ej.        dfe"d! dfe#ej/        d"f ej0        e$ej/        d#ej1        g$          e%ej2        dfe&ej3        dfeej-        dfe!ej.        dfg	d%g&          d'             Z4ej        ,                    d eej-        dfe ej.        dfe"d( dfe#ej/        d"f ej0        e$ej/        d#ej1        g$          e%ej2        dfe&ej3        dfeej-        dfe!ej.        dfg	d%g&          d)             Z5ej        ,                    d*e'ej-        fgd%g&          d+             Z6ej        ,                    d,d"d#g          d-             Z7dS ).z9
Tests for the pandas custom headers in http(s) requests
    N)BytesIO)is_ci_environmentz9GH 45651: This test can hang in our CI min_versions build)reasonc                   $    e Zd ZdZd Zd Zd ZdS )BaseUserAgentResponderz
    Base class for setting up a server that can be set up to respond
    with a particular file format with accompanying content-type headers.
    The interfaces on the different io methods are different enough
    that this seemed logical to do.
    c                     |                      d           | j        d         | _        t          j        d| j        gi          }|S )z<
        shared logic at the start of a GET request
           
User-Agentheader)send_responseheadersrequested_from_user_agentpd	DataFrame)selfresponse_dfs     ?lib/python3.11/site-packages/pandas/tests/io/test_user_agent.pystart_processing_headersz/BaseUserAgentResponder.start_processing_headers%   sP     	3)-l)C&l49:
 

     c                     t                      5 }t          j        |d          5 }|                    |           ddd           n# 1 swxY w Y   |                                }ddd           n# 1 swxY w Y   |S )zQ
        some web servers will send back gzipped files to save bandwidth
        w)fileobjmodeN)r   gzipGzipFilewritegetvalue)r   response_bytesbiozippers       r   
gzip_bytesz!BaseUserAgentResponder.gzip_bytes2   s     YY 	,#s555 -^,,,- - - - - - - - - - - - - - - \\^^N	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, s3   A3AA3A	A3A	A33A7:A7c                 :    | j                             |           dS )z:
        shared logic at the end of a GET request
        N)wfiler   )r   r   s     r   write_back_bytesz'BaseUserAgentResponder.write_back_bytes<   s      	
(((((r   N)__name__
__module____qualname____doc__r   r!   r$    r   r   r   r      sK             ) ) ) ) )r   r   c                       e Zd Zd ZdS )CSVUserAgentResponderc                     |                                  }|                     dd           |                                  |                    d                              d          }|                     |           d S )NContent-Typetext/csvFindexutf-8)r   send_headerend_headersto_csvencoder$   r   r   r   s      r   do_GETzCSVUserAgentResponder.do_GETD   sy    3355444$++%+88??HHn-----r   Nr%   r&   r'   r7   r)   r   r   r+   r+   C   #        . . . . .r   r+   c                       e Zd Zd ZdS )GzippedCSVUserAgentResponderc                 T   |                                  }|                     dd           |                     dd           |                                  |                    d                              d          }|                     |          }|                     |           d S )Nr-   r.   Content-Encodingr   Fr/   r1   )r   r2   r3   r4   r5   r!   r$   r6   s      r   r7   z#GzippedCSVUserAgentResponder.do_GETO   s    3355444+V444$++%+88??HH88n-----r   Nr8   r)   r   r   r;   r;   N   #        	. 	. 	. 	. 	.r   r;   c                       e Zd Zd ZdS )JSONUserAgentResponderc                     |                                  }|                     dd           |                                  |                                                    d          }|                     |           d S )Nr-   application/jsonr1   )r   r2   r3   to_jsonr5   r$   r6   s      r   r7   zJSONUserAgentResponder.do_GET\   su    3355);<<<$,,..55g>>n-----r   Nr8   r)   r   r   r@   r@   [   r9   r   r@   c                       e Zd Zd ZdS )GzippedJSONUserAgentResponderc                 P   |                                  }|                     dd           |                     dd           |                                  |                                                    d          }|                     |          }|                     |           d S )Nr-   rB   r=   r   r1   )r   r2   r3   rC   r5   r!   r$   r6   s      r   r7   z$GzippedJSONUserAgentResponder.do_GETg   s    3355);<<<+V444$,,..55g>>88n-----r   Nr8   r)   r   r   rE   rE   f   r>   r   rE   c                       e Zd Zd ZdS )HTMLUserAgentResponderc                     |                                  }|                     dd           |                                  |                    d                              d          }|                     |           d S )Nr-   z	text/htmlFr/   r1   )r   r2   r3   to_htmlr5   r$   r6   s      r   r7   zHTMLUserAgentResponder.do_GETt   sy    3355555$,,5,99@@IIn-----r   Nr8   r)   r   r   rH   rH   s   r9   r   rH   c                       e Zd Zd ZdS ) ParquetPyArrowUserAgentResponderc                     |                                  }|                     dd           |                                  |                    dd          }|                     |           d S )Nr-   application/octet-streamFpyarrow)r0   engine)r   r2   r3   
to_parquetr$   r6   s      r   r7   z'ParquetPyArrowUserAgentResponder.do_GET   sn    3355)CDDD$//eI/NNn-----r   Nr8   r)   r   r   rL   rL   ~   r9   r   rL   c                       e Zd Zd ZdS )$ParquetFastParquetUserAgentResponderc                 j   |                                  }|                     dd           |                                  dd l}|                    dddd            |                    dd          5 }|                                }d d d            n# 1 swxY w Y   |                     |           d S )	Nr-   rN   r   z'memory://fastparquet_user_agent.parquetFfastparquet)r0   rP   compressionrb)r   r2   r3   fsspecrQ   openreadr$   )r   r   rX   fr   s        r   r7   z+ParquetFastParquetUserAgentResponder.do_GET   s   3355)CDDD 	5 	 	 	
 	
 	
 [[BDII 	&QVVXXN	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	n-----s   2BBBNr8   r)   r   r   rS   rS      s#        . . . . .r   rS   c                       e Zd Zd ZdS )PickleUserAgentResponderc                    |                                  }|                     dd           |                                  t                      }|                    |           |                                }|                     |           d S )Nr-   rN   )r   r2   r3   r   	to_pickler   r$   r   r   r   r   s       r   r7   zPickleUserAgentResponder.do_GET   s    3355)CDDDiic"""n-----r   Nr8   r)   r   r   r]   r]      r>   r   r]   c                       e Zd Zd ZdS )StataUserAgentResponderc                    |                                  }|                     dd           |                                  t                      }|                    |d           |                                }|                     |           d S )Nr-   rN   F)write_index)r   r2   r3   r   to_statar   r$   r`   s       r   r7   zStataUserAgentResponder.do_GET   s    3355)CDDDiiSe444n-----r   Nr8   r)   r   r   rb   rb      r>   r   rb   c                       e Zd ZdZd ZdS )AllHeaderCSVResponderz?
    Send all request headers back for checking round trip
    c                 `   t          j        | j                                                  }|                     d           |                     dd           |                                  |                    d                              d          }| j	        
                    |           d S )Nr	   r-   r.   Fr/   r1   )r   r   r   itemsr   r2   r3   r4   r5   r#   r   r6   s      r   r7   zAllHeaderCSVResponder.do_GET   s    l4<#5#5#7#7883444$++%+88??HH
(((((r   N)r%   r&   r'   r(   r7   r)   r   r   rg   rg      s-         ) ) ) ) )r   rg   c                       fd}|S )Nc                  v    	 	  | i |S # t           j        j        $ r t          j        d           Y nw xY w8)NT皙?)urlliberrorURLErrortimesleep)argskwargsfuncs     r   innerzwait_until_ready.<locals>.inner   sX    	  tT,V,,,<(      
3 	 s    (77r)   )rt   rr   rs   ru   s   `   r   wait_until_readyrv      s#              Lr   c                     t           j                            d|f|           5 }|                                 d d d            n# 1 swxY w Y   |                                 d S )N	localhost)httpserver
HTTPServerhandle_requestserver_close)	responderportrz   s      r   process_serverr      s    			d 3Y	?	?  6                             
s   AAAc              #   l  K   t          j                     5 }|                    d           |                                d         }ddd           n# 1 swxY w Y   t          j        t
          | j        |f          }|                                 |V  |                    d           |	                                 d}d}|
                                rH||k    r|                                 n-|dz  }t          j        d           |
                                H|                                 dS )	z
    Fixture that starts a local http server in a separate process on localhost
    and returns the port.

    Running in a separate process instead of a thread to allow termination/killing
    of http server upon cleanup.
    )rx   r      N)targetrr   
      r   rl   )socketbindgetsocknamemultiprocessingProcessr   paramstartjoin	terminateis_alivekillrp   rq   close)requestsockr   server_process	kill_time	wait_times         r   r~   r~      s|      
 %D		"###!!!$% % % % % % % % % % % % % % % %,W]D$9  N 
JJJII

!
!
#
# y  !!!S	
3 
!
!
#
#  s   0AAAz&responder, read_method, parquet_enginec                  0    t          j        | i |d         S Nr   r   	read_htmlrr   rs   s     r   <lambda>r         BL$$A&$A$A!$D r   rO   rU   )marksr~   )indirectc                     |.t          j        |           |dk    rt          j        d           t          |          }| |d|            }n |d|  |          }|j        rJ d S )NrU   rX   http://localhost:)rP   )pytestimportorskiprv   empty)r~   read_methodparquet_enginedf_https       r   test_server_and_default_headersr      s    8 !N+++]**)))";//K+=)==>>+=)==nUUU}r   c                  0    t          j        | i |d         S r   r   r   s     r   r   r   .  r   r   c                 0   |.t          j        |           |dk    rt          j        d           d}t          j        d|gi          }t	          |          }| |d|  d|i          }n |d|  d|i|          }t          j        ||           d S )	NrU   rX   Super Cool Oner   r   r
   storage_optionsr   rP   )r   r   r   r   rv   tmassert_frame_equal)r~   r   r   custom_user_agentdf_truer   s         r   test_server_and_custom_headersr   '  s    8 !N+++]**)))(lH'8&9:;;G";//K++	++)+<=
 
 

 ++	++)+<=!
 
 
 '7+++++r   zresponder, read_methodc                 T   d}d}||dt          |          } |d|            }||d                                                                                }|                    dg                                          }|ddg         }t                                                    }t          j        |fd|D             d	          }|                    dg          }|                                                    d
gd          }t          j
        ||           d S )Nr   zSuper Secret Oner
   Authr   r   01c                      g | ]
}|         S r)   r)   ).0kr   s     r   
<listcomp>z6test_server_and_all_custom_headers.<locals>.<listcomp>t  s    ,N,N,NA_Q-?,N,N,Nr   )r   r   r0   r   )axis)rv   isinkeyssort_valuesreset_indexlistr   r   dropr   r   )r~   r   r   custom_auth_tokenr   r   r   r   s          @r   "test_server_and_all_custom_headersr   [  sH    )*'! O #;//Kk'I'''  G
 gcl''(<(<(>(>??@G!!3%((4466GsCj!G$$&&''Dl,N,N,N,N,N,N,NOOPPG!!3%((G!!##(('(;;G'7+++++r   rP   c                    ddd}t          j        |            t          j        ddgi          }d}t          j        t
          |          5  |                    d|| 	           d d d            d S # 1 swxY w Y   d S )
Ncustomother_customr   column_namecolumn_valuezxstorage_options passed with file object or non-fsspec file path|storage_options passed with buffer, or non-supported URL)matchz/tmp/junk.parquetr   )r   r   r   r   raises
ValueErrorrQ   )rP   r   true_dfmsgs       r   ,test_to_parquet_to_disk_with_storage_optionsr   {  s      G
 lMN+;<==G	C  
z	-	-	- X X.PVWWWX X X X X X X X X X X X X X X X X Xs   A44A8;A8)8r(   r   http.serverry   ior   r   r   rp   urllib.errorrm   r   pandas.compatr   pandas.util._test_decoratorsutil_test_decoratorstdpandasr   pandas._testing_testingr   mark
single_cpuskipif
pytestmarkrz   BaseHTTPRequestHandlerr   r+   r;   r@   rE   rH   rL   rS   r]   rb   rg   rv   r   fixturer~   parametrizeread_csv	read_jsonread_parquetr   &skip_array_manager_not_yet_implementedread_pickle
read_statar   r   r   r   r)   r   r   <module>r      s^                          + + + + + + ) ) ) ) ) ) ) ) )           K
KJ   
#) #) #) #) #)T[? #) #) #)L. . . . .2 . . .
. 
. 
. 
. 
.#9 
. 
. 
.. . . . .3 . . .
. 
. 
. 
. 
.$: 
. 
. 
.. . . . .3 . . .. . . . .'= . . .. . . . .+A . . .4
. 
. 
. 
. 
.5 
. 
. 
.
. 
. 
. 
. 
.4 
. 
. 
.) ) ) ) )DK> ) ) )	 	 	     > ,	T2	t4"DD	

 
*2?IF0O 9	
 	
 	
 
"2>48	 "-6	%r{D9	&d;+. ]3   6 7 6 ,	T2	t4"DD	

 
*2?IF0O 9	
 	
 	
 
"2>48	 "-6	%r{D9	&d;+. ]3   6, ,7 6,2 	, ]   , , ,2  X X X X Xr   