o
    d                     @   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	g d
dd Zdededef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   L/app/.heroku/python/lib/python3.10/site-packages/pandas/tests/io/test_gcs.py<lambda>   s    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   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r-|j|dd t|dgdd}nH|dkrAd}|| t|dgdd}n4|dkrR|| t	|dgd}n#|dkret
d || t|}n|dkrut
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*   tabulateN)r   npnanr   to_csvr   Zto_excelr   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   	

	






rD   resultexpectedcompressionc              	   C   s  |dkrSt t| >}t t|}t| | D ]\}}|j|jks)J qW d   n1 s4w   Y  W d   dS W d   dS 1 sLw   Y  dS |dkrtjt| d]}tjt|d<}t| | D ]*\}	}
|	|	}|	|
}|du |du ksJ |dur|dur|
 |
 ksJ qrW d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS | |ksJ 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
    zipNtar)fileobj)zipfileZipFiler   rH   infolistCRCtarfiler   
getmembersextractfileread)rE   rF   rG   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   s4   P

PrU   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)rG   rV   modegs://test/test.csv)rG   rV   r   )r9   rG   rV   Zinfer.N)	rA   ZmakeDataFramer   r=   getvaluerU   r   rB   r	   )r   Zcompression_onlyrV   ZdfrG   bufferZpath_gcsrT   rF   Zread_dfZfile_extr   r   r   $test_to_csv_compression_encoding_gcsw   s0   	ra   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|v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)rc   )r   r   r   r   r   rh   r   r   r      s    r   zgcsfs.GCSFileSystemr]   Trb   N)r8   ZenginerG   )r!   r#   r   r;   r<   r   setattrr@   )r$   ri   r#   rC   r   r   rh   r   test_to_parquet_gcs_new_file   s   
	
rk   c                   C   s8   t t td W d    d S 1 sw   Y  d S )Nr]   )rA   Zexternal_error_raisedImportErrorr   r   r   r   r   test_gcs_not_present_exception   s   
"rm   )$ior   rf   rO   rK   numpyr;   r?   Zpandasr   r   r   r   r   r   Zpandas._testingZ_testingrA   Z pandas.tests.io.test_compressionr	   Zpandas.utilr
   tdZfixturer   Z
skip_if_nomarkZparametrizerD   bytesr6   rU   ra   rk   Zskip_if_installedrm   r   r   r   r   <module>   s0     
(*