U
    >vf                  	   @   s  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	m
Z
mZmZmZmZ d dlmZ d dlmZ d dlmZ ejdd Zedejd	d
ddddgdd ZeeedddZedejdddgdd Z ededdd Z!e"ddd Z#dS )    )BytesION)	DataFrame
date_rangeread_csv
read_excel	read_jsonread_parquet)_compression_to_extension)_test_decoratorsc                    sB   ddl }t  dd  _G  fddd|j}|jd|dd	  S )
z"Emulate GCS using a binary buffer.r   Nc                   S   s   dS )NT r   r   r   </tmp/pip-unpacked-wheel-vdrwu74i/pandas/tests/io/test_gcs.py<lambda>       zgcs_buffer.<locals>.<lambda>c                       s$   e Zd Ze fddZdd ZdS )z%gcs_buffer.<locals>.MockGCSFileSystemc                     s     d  S )Nr   )seek)argskwargs
gcs_bufferr   r   open   s    
z*gcs_buffer.<locals>.MockGCSFileSystem.openc                 [   s   |ddgS )Nfile)nametyper   )selfpathr   r   r   r   ls$   s    z(gcs_buffer.<locals>.MockGCSFileSystem.lsN)__name__
__module____qualname__staticmethodr   r   r   r   r   r   MockGCSFileSystem   s   r   ZgsT)clobber)fsspecr   closeAbstractFileSystemZregister_implementation)monkeypatchr!   r   r   r   r   r      s    
r   Zgcsfsformatcsvjsonparquetexcelmarkdownc                 C   s   t ddgdtjgddgtdddd	}d
| }|dkrZ|j|dd t|dgdd}n|dkrd}|| t|dgdd}nh|dkr|| t	|dgd}nF|dkrt
d || t|}n |dkrt
d || |}t|| dS )zE
    Test that many to/read functions support GCS.

    GH 33987
                 @ts
2018-06-18   Zperiodsintfloatstrdtzgs://test/test.r&   T)indexr7   r   )Zparse_dates	index_colr)   zgs://test/test.xlsxr'   )Zconvert_datesr(   Zpyarrowr*   ZtabulateN)r   npnanr   to_csvr   Zto_excelr   Zto_jsonr   pytestZimportorskip
to_parquetr   Zto_markdowntmassert_frame_equal)r   r%   df1r   Zdf2r   r   r   test_to_read_gcs.   s6    	
	







rB   )resultexpectedcompressionc              
   C   s(  |dkrjt t| L}t t|2}t| | D ]\}}|j|jks:tq:W 5 Q R X W 5 Q R X n|dkrtjt| d}tjt|dn}t|	 |	 D ]T\}	}
|
|	}|
|
}|dk|dkkst|dk	r|dk	r| | kstqW 5 Q R X W 5 Q R X n| |ks$tdS )a  
    For zip compression, only compare the CRC-32 checksum of the file contents
    to avoid checking the time-dependent last-modified timestamp which
    in some CI builds is off-by-one

    See https://en.wikipedia.org/wiki/ZIP_(file_format)#File_headers
    ziptar)fileobjN)zipfileZipFiler   rF   infolistCRCAssertionErrortarfiler   
getmembersextractfileread)rC   rD   rE   expresZres_infoZexp_infoZtar_expZtar_resZtar_res_infoZtar_exp_infoZactual_fileZexpected_filer   r   r   assert_equal_zip_safeX   s,    (
 

,rT   encodingzutf-8cp1251c                 C   s   t  }d|i}|dkr d|d< t }|j|||dd d}|j|||d |  }| }t||| t|d	||d
}	t ||	 t| }
d|d< |d|
 7 }|j|||d |  }| }t||| t|d	d|d
}	t ||	 dS )z
    Compression and encoding should with GCS.

    GH 35677 (to_csv, compression), GH 26124 (to_csv, encoding), and
    GH 32392 (read_csv, encoding)
    methodgzipr+   mtimewb)rE   rU   modegs://test/test.csv)rE   rU   r   )r9   rE   rU   Zinfer.N)	r?   ZmakeDataFramer   r<   getvaluerT   r   r@   r	   )r   Zcompression_onlyrU   ZdfrE   bufferZpath_gcsrS   rD   Zread_dfZfile_extr   r   r   $test_to_csv_compression_encoding_gcsw   s6    	   r`   fastparquetc                    sj   ddl m} tddgdtjgddgtdd	d
d}G  fddd|}| d| |jddddd dS )zCRegression test for writing to a not-yet-existent GCS Parquet file.r   )r#   r+   r,   r-   r.   r/   r0   r1   r2   r3   c                       s   e Zd Zd fdd	ZdS )z7test_to_parquet_gcs_new_file.<locals>.MockGCSFileSystemrc                    s    d|krt ttj d|S )Nwztest.parquet)FileNotFoundErrorr   osr   join)r   r   r[   r   tmpdirr   r   r      s    z<test_to_parquet_gcs_new_file.<locals>.MockGCSFileSystem.openN)rb   )r   r   r   r   r   rg   r   r   r      s   r   zgcsfs.GCSFileSystemr\   Tra   N)r8   ZenginerE   )r!   r#   r   r:   r;   r   setattrr>   )r$   rh   r#   rA   r   r   rg   r   test_to_parquet_gcs_new_file   s     
	   rj   c                	   C   s"   t t td W 5 Q R X d S )Nr\   )r?   Zexternal_error_raisedImportErrorr   r   r   r   r   test_gcs_not_present_exception   s    rl   )$ior   re   rN   rI   Znumpyr:   r=   Zpandasr   r   r   r   r   r   Zpandas._testingZ_testingr?   Z pandas.tests.io.test_compressionr	   Zpandas.utilr
   tdZfixturer   Z
skip_if_nomarkZparametrizerB   bytesr6   rT   r`   rj   Zskip_if_installedrl   r   r   r   r   <module>   s.    
(*