a
    GGb                     @  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__ Elib/python3.9/site-packages/pandas/io/parsers/arrow_parser_wrapper.pyr      s    zArrowParserWrapper.__init__c                 C  sf   | j d}|du 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v r| j|dur| j|| j|< qdd | j  D | _d	d | j  D | _| jdu | jdu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   Z
escapecharZskip_blank_linesNc                 S  s&   i | ]\}}|d ur|dv r||qS )N)Z	delimiterZ
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 ur|dv 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u r jdu rZ jdurF fddt|D  _n jdu rZt| _t  j|krtt|t  j  j  _d} j|_ |j|\|_} jdur4t	 jD ]<\}}t
|r|j|  j|< q||jvrtd| dq|j jddd  jdu r4|s4dgt |jj |j_ jd	durz| jd	}W n. ty } zt|W Y d}~n
d}~0 0 |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>`       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_namedr-   itemer   r.   r   _finalize_outputM   s<    







z#ArrowParserWrapper._finalize_output)r+   c                 C  s`   t d}|   |j| j|jf i | j|jf i | j|jf i | 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)Z
__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   