U
    f/e*                     @   s  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m	  m
Z ddlZddlmZ G dd dejjZG dd deZG dd	 d	eZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dejjZejdeejdfeej dfeej!dfej"eej!dej#deej$dfeej%dfeejdfeej dfgdd Z&ejdeejdfeej dfeej!dfej"eej!dej#deej$dfeej%dfeejdfeej dfgdd Z'ejd eejfgd!d" Z(ejd#ddgd$d% Z)dS )&z9
Tests for the pandas custom headers in http(s) requests
    N)BytesIOc                   @   s(   e Zd ZdZdd Zdd Zd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                 C   s,   |  d | jd | _td| jgi}|S )z<
        shared logic at the start of a GET request
           
User-Agentheader)send_responseheadersZrequested_from_user_agentpd	DataFrame)selfresponse_df r   C/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/io/test_user_agent.pystart_processing_headers   s    
 z/BaseUserAgentResponder.start_processing_headersc                 C   s2   t  }tj|dd}|| |  | }|S )zQ
        some web servers will send back gzipped files to save bandwidth
        w)fileobjmode)r   gzipGzipFilewriteclosegetvalue)r   response_bytesbioZzipperr   r   r   
gzip_bytes&   s    
z!BaseUserAgentResponder.gzip_bytesc                 C   s   | j | dS )z:
        shared logic at the end of a GET request
        N)wfiler   )r   r   r   r   r   write_back_bytes1   s    z'BaseUserAgentResponder.write_back_bytesN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )CSVUserAgentResponderc                 C   s<   |   }| dd |   |jddd}| | d S )NContent-Typetext/csvFindexutf-8)r   send_headerend_headersto_csvencoder   r   r   r   r   r   r   do_GET9   s
    zCSVUserAgentResponder.do_GETNr   r   r   r,   r   r   r   r   r!   8   s   r!   c                   @   s   e Zd Zdd ZdS )GzippedCSVUserAgentResponderc                 C   sR   |   }| dd | dd |   |jddd}| |}| | d S )Nr"   r#   Content-Encodingr   Fr$   r&   )r   r'   r(   r)   r*   r   r   r+   r   r   r   r,   D   s    
z#GzippedCSVUserAgentResponder.do_GETNr-   r   r   r   r   r.   C   s   r.   c                   @   s   e Zd Zdd ZdS )JSONUserAgentResponderc                 C   s8   |   }| dd |   | d}| | d S )Nr"   application/jsonr&   )r   r'   r(   to_jsonr*   r   r+   r   r   r   r,   Q   s
    zJSONUserAgentResponder.do_GETNr-   r   r   r   r   r0   P   s   r0   c                   @   s   e Zd Zdd ZdS )GzippedJSONUserAgentResponderc                 C   sN   |   }| dd | dd |   | d}| |}| | d S )Nr"   r1   r/   r   r&   )r   r'   r(   r2   r*   r   r   r+   r   r   r   r,   \   s    
z$GzippedJSONUserAgentResponder.do_GETNr-   r   r   r   r   r3   [   s   r3   c                   @   s   e Zd Zdd ZdS ) ParquetPyArrowUserAgentResponderc                 C   s8   |   }| dd |   |jddd}| | d S )Nr"   application/octet-streamFpyarrow)r%   engine)r   r'   r(   
to_parquetr   r+   r   r   r   r,   i   s
    z'ParquetPyArrowUserAgentResponder.do_GETNr-   r   r   r   r   r4   h   s   r4   c                   @   s   e Zd Zdd ZdS )$ParquetFastParquetUserAgentResponderc              	   C   sd   |   }| dd |   dd l}|jdddd d |dd}| }W 5 Q R X | | d S )	Nr"   r5   r   z'memory://fastparquet_user_agent.parquetFfastparquet)r%   r7   compressionrb)r   r'   r(   fsspecr8   openreadr   )r   r   r=   fr   r   r   r   r,   t   s    z+ParquetFastParquetUserAgentResponder.do_GETNr-   r   r   r   r   r9   s   s   r9   c                   @   s   e Zd Zdd ZdS )PickleUserAgentResponderc                 C   sB   |   }| dd |   t }|| | }| | d S )Nr"   r5   )r   r'   r(   r   Z	to_pickler   r   r   r   r   r   r   r   r   r,      s    
zPickleUserAgentResponder.do_GETNr-   r   r   r   r   rA      s   rA   c                   @   s   e Zd Zdd ZdS )StataUserAgentResponderc                 C   sF   |   }| dd |   t }|j|dd | }| | d S )Nr"   r5   F)Zwrite_index)r   r'   r(   r   Zto_statar   r   rB   r   r   r   r,      s    zStataUserAgentResponder.do_GETNr-   r   r   r   r   rC      s   rC   c                   @   s   e Zd ZdZdd ZdS )AllHeaderCSVResponderz?
    Send all request headers back for checking round trip
    c                 C   sP   t | j }| d | dd |   |jddd}| j	
| d S )Nr   r"   r#   Fr$   r&   )r	   r
   r   itemsr   r'   r(   r)   r*   r   r   r+   r   r   r   r,      s    
zAllHeaderCSVResponder.do_GETN)r   r   r   r    r,   r   r   r   r   rD      s   rD   z&responder, read_method, parquet_enginer6   r:   )Zmarksc              	   C   s   |d k	r$t | |dkr$t d tjd| d}tj|jd}|  |j	}|d krh|d| }n|d| |d}|
  |  |  W 5 Q R X |jrtd S )Nr:   r=   	localhostr   targethttp://localhost:)r7   )pytestimportorskiphttpserver
HTTPServer	threadingThreadserve_foreverstartserver_portshutdownserver_closejoinemptyAssertionError)	responderread_methodparquet_enginerN   server_threadportdf_httpr   r   r   test_server_and_default_headers   s    

r`   c           	   	   C   s   |d k	r$t | |dkr$t d d}td|gi}tjd| r}tj|j	d}|
  |j}|d kr|d| d|id	}n|d| d|i|d
}|  |  |  W 5 Q R X t|| d S )Nr:   r=   Super Cool Oner   rF   rH   rJ   r   storage_optionsrc   r7   )rK   rL   r	   r
   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   tmassert_frame_equal)	rZ   r[   r\   custom_user_agentdf_truerN   r]   r^   r_   r   r   r   test_server_and_custom_headers   s0    

ri   zresponder, read_methodc           
   	      s   d}d}||d t jd| L}tj|jd}|  |j}|d|  d}|  |	  |
  W 5 Q R X ||d    }|dg }|dd	g }t  }t| fd
d|D d}	|	dg}	|	 jdgdd}	t|	| d S )Nra   zSuper Secret Oner   ZAuthrF   rH   rJ   rb   01c                    s   g | ]} | qS r   r   ).0krb   r   r   
<listcomp>4  s     z6test_server_and_all_custom_headers.<locals>.<listcomp>)rk   rl   r%      )Zaxis)rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   isinkeysZsort_valuesZreset_indexlistr	   r
   Zdropre   rf   )
rZ   r[   rg   Zcustom_auth_tokenrN   r]   r^   r_   rr   rh   r   rb   r   "test_server_and_all_custom_headers  s0    rt   r7   c              	   C   sV   ddd}t |  tddgi}d}t jt|d |jd|| d	 W 5 Q R X d S )
NZcustomZother_customrj   Zcolumn_nameZcolumn_valuezxstorage_options passed with file object or non-fsspec file path|storage_options passed with buffer, or non-supported URL)matchz/tmp/junk.parquetrd   )rK   rL   r	   r
   Zraises
ValueErrorr8   )r7   r   Ztrue_dfmsgr   r   r   ,test_to_parquet_to_disk_with_storage_options;  s    	
rx   )*r    r   Zhttp.serverrM   ior   rP   rK   Zpandas.util._test_decoratorsutilZ_test_decoratorstdZpandasr	   Zpandas._testingZ_testingre   rN   ZBaseHTTPRequestHandlerr   r!   r.   r0   r3   r4   r9   rA   rC   rD   markZparametrizeZread_csv	read_jsonZread_parquetparamZ&skip_array_manager_not_yet_implementedZread_pickleZ
read_statar`   ri   rt   rx   r   r   r   r   <module>   s   '















"
"