U
    b                     @  s\   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ G dd deZd	S )
    )annotations)
ReadBuffer)import_optional_dependency)
is_integer)	DataFrame)
ParserBasec                      sT   e Zd ZdZdd fddZdd Zdd	 Zd
d
dddZd
dddZ  Z	S )ArrowParserWrapperz7
    Wrapper for the pyarrow engine for read_csv()
    zReadBuffer[bytes])srcc                   s$   t  | || _|| _|   d S )N)super__init__kwdsr	   _parse_kwds)selfr	   r   	__class__ J/tmp/pip-unpacked-wheel-ck39h295/pandas/io/parsers/arrow_parser_wrapper.pyr      s    zArrowParserWrapper.__init__c                 C  sf   | j d}|dkrdn|| _| | j d \| _| _| j d }t|trRtdt	| j d | _
dS )z?
        Validates keywords before passing to pyarrow.
        encodingNzutf-8usecols	na_valuesz?The pyarrow engine doesn't support passing a dict for na_values)r   getr   Z_validate_usecols_argr   Zusecols_dtype
isinstancedict
ValueErrorlistr   )r   r   r   r   r   r   r      s    

zArrowParserWrapper._parse_kwdsc                 C  s   ddddd}|  D ]4\}}|| jkr| j|dk	r| j|| j|< qdd | j  D | _d	d | j  D | _| jdk| jdk	r| jn| jd
 d| _dS )z:
        Rename some arguments to pass to pyarrow
        include_columnsnull_valuesescape_charignore_empty_lines)r   r   
escapecharZskip_blank_linesNc                 S  s&   i | ]\}}|d k	r|dkr||qS )N)	delimiter
quote_charr   r   r   .0Zoption_nameZoption_valuer   r   r   
<dictcomp>8   s    z;ArrowParserWrapper._get_pyarrow_options.<locals>.<dictcomp>c                 S  s&   i | ]\}}|d k	r|dkr||qS )N)r   r   Ztrue_valuesZfalse_valuesr   r"   r   r   r   r$   ?   s    Zskiprows)Zautogenerate_column_namesZ	skip_rows)itemsr   r   popparse_optionsconvert_optionsheaderread_options)r   mappingZpandas_nameZpyarrow_namer   r   r   _get_pyarrow_options*   s&    z'ArrowParserWrapper._get_pyarrow_optionsr   )framereturnc              
     s  t |j}d} jdkr jdkrZ jdk	rF fddt|D  _n jdkrZt| _t  j|krtt|t  j  j  _d} j|_ |j|\|_} jdk	r4t	 jD ]<\}}t
|r|j|  j|< q||jkrtd| dq|j jddd  jdkr4|s4dgt |jj |j_ jd	dk	rz| jd	}W n, tk
r } zt|W 5 d}~X Y nX |S )
z
        Processes data read in based on kwargs.

        Parameters
        ----------
        frame: DataFrame
            The DataFrame to process.

        Returns
        -------
        DataFrame
            The processed DataFrame.
        TNc                   s   g | ]} j  | qS r   )prefix)r#   ir   r   r   
<listcomp>`   s     z7ArrowParserWrapper._finalize_output.<locals>.<listcomp>FzIndex z invalid)ZdropZinplaceZdtype)lencolumnsr)   namesr/   ranger   Z_do_date_conversionsZ	index_col	enumerater   r   Z	set_indexindexr   r   Zastype	TypeError)r   r-   Znum_colsZmulti_index_namedr0   itemer   r1   r   _finalize_outputM   s>    





 

z#ArrowParserWrapper._finalize_output)r.   c                 C  sT   t d}|   |j| j|jf | j|jf | j|jf | j	d}|
 }| |S )z
        Reads the contents of a CSV file into a DataFrame and
        processes it according to the kwargs passed in the
        constructor.

        Returns
        -------
        DataFrame
            The DataFrame created from the CSV file.
        zpyarrow.csv)r*   r'   r(   )r   r,   Zread_csvr	   ZReadOptionsr*   ZParseOptionsr'   ZConvertOptionsr(   Z	to_pandasr<   )r   Zpyarrow_csvtabler-   r   r   r   read   s    zArrowParserWrapper.read)
__name__
__module____qualname____doc__r   r   r,   r<   r>   __classcell__r   r   r   r   r      s   #:r   N)
__future__r   Zpandas._typingr   Zpandas.compat._optionalr   Zpandas.core.dtypes.inferencer   Zpandas.core.framer   Zpandas.io.parsers.base_parserr   r   r   r   r   r   <module>   s   