
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    SWX-                     @   s   d Z ddlZddlZddlZddlZddlmZ zddlmZ W n  ek
r`   ddl	mZ Y nX ddl
T ddl
mZ ddl
mZ ddl
mZ ereZd	Znd
ZG dd deZdd ZG dd deZG dd deZdddZej e_ dddZdS )a  
Peewee helper for loading CSV data into a database.

Load the users CSV file into the database and return a Model for accessing
the data:

    from playhouse.csv_loader import load_csv
    db = SqliteDatabase(':memory:')
    User = load_csv(db, 'users.csv')

Provide explicit field types and/or field names:

    fields = [IntegerField(), IntegerField(), DateTimeField(), DecimalField()]
    field_names = ['from_acct', 'to_acct', 'timestamp', 'amount']
    Payments = load_csv(db, 'payments.csv', fields, field_names)
    N)contextmanager)StringIO)*)Database)Func)PY3FTc                   @   s   e Zd Zedd ZdS )
_CSVReaderc                 k   sj   d}t |trt|d}n,t |tr4|}|d n|}|d d}tj|f|}|V  |rf|  d S )NFrr   T)
isinstance
basestringopenr   seekcsvreaderclose)selffile_or_namereader_kwargsis_filefhr    r   F/opt/alt/python38/lib64/python3.8/site-packages/playhouse/csv_utils.py
get_reader'   s    


z_CSVReader.get_readerN)__name__
__module____qualname__r   r   r   r   r   r   r   &   s   r   c                    s    fdd}|S )Nc                    s    fdd| _ | S )Nc                      s
    f S Nr   r   field_classfield_kwargsr   r   <lambda>:       z2convert_field.<locals>.decorator.<locals>.<lambda>)field)fnr   r   r   	decorator9   s    z convert_field.<locals>.decoratorr   )r   r   r$   r   r   r   convert_field8   s    r%   c                   @   s   e Zd ZdZddgZddgZd!dd	Zd
d Zee	dddd Z
eedddd Zeedddd Zeedddd Zeedddd Zdd Zdd Zdd Zd S )"RowConvertera  
    Simple introspection utility to convert a CSV file into a list of headers
    and column types.

    :param database: a peewee Database object.
    :param bool has_header: whether the first row of CSV is a header row.
    :param int sample_size: number of rows to introspect
    z%Y-%m-%dz%m/%d/%Yz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fT
   c                 C   s   || _ || _|| _d S r   )database
has_headersample_size)r   r(   r)   r*   r   r   r   __init__O   s    zRowConverter.__init__c              	   C   s<   |D ]2}zt j || W n tk
r.   Y qX  dS qd S NT)datetimestrptime
ValueError)r   valueformatsfmtr   r   r   matches_dateT   s    zRowConverter.matches_dater   )defaultc                 C   s   |  S r   )isdigitr   r0   r   r   r   
is_integer]   s    zRowConverter.is_integerc              	   C   s.   zt | W n ttfk
r$   Y nX dS d S r,   )floatr/   	TypeErrorr6   r   r   r   is_floata   s
    zRowConverter.is_float)nullc                 C   s   |  || jS r   )r3   datetime_formatsr6   r   r   r   is_datetimej   s    zRowConverter.is_datetimec                 C   s   |  || jS r   )r3   date_formatsr6   r   r   r   is_daten   s    zRowConverter.is_date c                 C   s   dS r,   r   r6   r   r   r   r4   r   s    zRowConverter.defaultc           	   	   K   s   g }| j }| j|f|>}| jr(|d7 }t|D ] \}}|| || j kr0 qRq0W 5 Q R X | jrz|d |dd  }}ndd tt|d D }||fS )aq  
        Extract `self.sample_size` rows from the CSV file and analyze their
        data-types.

        :param str file_or_name: A string filename or a file handle.
        :param reader_kwargs: Arbitrary parameters to pass to the CSV reader.
        :returns: A 2-tuple containing a list of headers and list of rows
                  read from the CSV file.
           r   Nc                 S   s   g | ]}d | qS zfield_%dr   .0ir   r   r   
<listcomp>   s     z-RowConverter.extract_rows.<locals>.<listcomp>)r*   r   r)   	enumerateappendrangelen)	r   r   r   rowsZrows_to_readr   rE   rowheaderr   r   r   extract_rowsv   s    


zRowConverter.extract_rowsc                 C   s   | j | j| j| j| jgS )z6Return a list of functions to use when testing values.)r?   r=   r7   r:   r4   r   r   r   r   
get_checks   s    zRowConverter.get_checksc           	         sr   t | }|  }g }t|D ]P\}}dd |D }|D ]4 t fdd|D }t|r6|    qq6q|S )a  
        Analyze the given rows and try to determine the type of value stored.

        :param list rows: A list-of-lists containing one or more rows from a
                          csv file.
        :returns: A list of peewee Field objects for each column in the CSV.
        c                 S   s   g | ]}|d kr|qS )r@   r   rD   valr   r   r   rF      s      z(RowConverter.analyze.<locals>.<listcomp>c                 3   s   | ]} |V  qd S r   r   rQ   checkr   r   	<genexpr>   s     z'RowConverter.analyze.<locals>.<genexpr>)ziprP   rG   setallrH   r"   )	r   rK   Z
transposedZchecksZcolumn_typesrE   columnZcol_valsresultsr   rS   r   analyze   s    zRowConverter.analyzeN)Tr'   )r   r   r   __doc__r>   r<   r+   r3   r%   IntegerFieldr7   
FloatFieldr:   DateTimeFieldr=   	DateFieldr?   	BareFieldr4   rN   rP   r[   r   r   r   r   r&   >   s,   	
	









	r&   c                   @   sB   e Zd ZdZdddZdd	 Zd
d Zdd Zdd Zdd Z	dS )Loaderat  
    Load the contents of a CSV file into a database and return a model class
    suitable for working with the CSV data.

    :param db_or_model: a peewee Database instance or a Model class.
    :param file_or_name: the filename of the CSV file *or* a file handle.
    :param list fields: A list of peewee Field() instances appropriate to
        the values in the CSV file.
    :param list field_names: A list of names to use for the fields.
    :param bool has_header: Whether the first row of the CSV file is a header.
    :param int sample_size: Number of rows to introspect if fields are not
        defined.
    :param converter: A RowConverter instance to use.
    :param str db_table: Name of table to store data in (if not specified, the
        table name will be derived from the CSV filename).
    :param reader_kwargs: Arbitrary arguments to pass to the CSV reader.
    NTr'   Fc
                 K   s   || _ || _|| _|| _|| _|| _|
| _t|tr<|| _	nt|t
rNd| _	n|j| _	t|tr|| _d | _|ptjtj| j	d | _nd|| _| jjj| _| jjj| _| jjj| _| jjj| _| jjjr|	s| jdd  | _| jdd  | _d S )Nzdata.csvr   rA   )r   fieldsfield_namesr)   r*   	converterr   r
   r   filenamer   namer   r(   modelospathsplitextbasenamedb_table_metasorted_fieldssorted_field_namesauto_increment)r   db_or_modelr   rc   rd   r)   r*   re   rm   	pk_in_csvr   r   r   r   r+      s4    


zLoader.__init__c                 C   s   t dd| S )Nz
[^a-z0-9]+_)resublower)r   sr   r   r   clean_field_name   s    zLoader.clean_field_namec                 C   s   | j pt| j| j| jdS )N)r)   r*   )re   r&   r(   r)   r*   rO   r   r   r   get_converter   s
    zLoader.get_converterc                    sb       jjfj\}}|r0 |_n fdd|D _js^fdd|D _d S )Nc                    s   g | ]} j  qS r   )r4   r"   )rD   rt   )re   r   r   rF      s     z&Loader.analyze_csv.<locals>.<listcomp>c                    s   g | ]}  |qS r   ry   rD   colrO   r   r   rF      s     )rz   rN   r   r   r[   rc   rd   )r   rM   rK   r   )re   r   r   analyze_csv   s    zLoader.analyze_csvc                 C   sr   | j r| j S tt||}d|kr.t |d< nt|d trFt |d< t| j t	f|}| j
|j_
| j|j_|S )NidZ_auto_pk)rh   dictrV   PrimaryKeyFieldr
   r]   typerm   titleModelr(   rn   )r   rd   rc   attrsklassr   r   r   get_model_class   s    


zLoader.get_model_classc              
      s   j s    js4 js4dd tt j D  _ j jf j}|} jspt	|} fdd|D  _n jr~t	|  
 j j } j b |d |D ]L}i }t j|D ]"\}}|rtr|d}|||< q|r|jf |  qW 5 Q R X W 5 Q R X |S )Nc                 S   s   g | ]}d | qS rB   r   rC   r   r   r   rF     s    zLoader.load.<locals>.<listcomp>c                    s   g | ]}  |qS r   r{   r|   rO   r   r   rF     s     Tzutf-8)rc   r~   rd   r)   rI   rJ   r   r   r   nextr   r(   transactioncreate_tablerV   decode_valuedecodeinsertexecute)r   Z
reader_objr   rL   Z
ModelClassr   
field_namer0   r   rO   r   load  s4    


&zLoader.load)NNTr'   NNF)
r   r   r   r\   r+   ry   rz   r~   r   r   r   r   r   r   rb      s              
%rb   r'   c	                 K   s*   t f | ||||||||d	|	}
|
 S )N)	rr   r   rc   rd   r)   r*   re   rm   rs   )rb   r   )rr   r   rc   rd   r)   r*   re   rm   rs   r   loaderr   r   r   load_csv'  s    
r   c                 C   s   t |trt||rdpd}n|}|r2|dd |pHtj|ddtjd}|rg }t| jD ]F\}	}
|
j	rx|
|
j	 q\t |
ttfr|
|
j q\|
d|	  q\|| |   D ]}|| q|r|  |S )	z'
    Create a CSV dump of a query.
    awr      ,")	delimiterZ	quotecharZquotingzcol_%s)r
   r   r   r   r   writerZQUOTE_MINIMALrG   _select_aliasrH   Fieldr   rg   Zwriterowtuplesiteratorr   )queryr   Zinclude_headerZ
close_filerH   Z
csv_writerr   r   rM   idxnoderL   r   r   r   dump_csv9  s2    

r   )NNTr'   NNF)TTTN)r\   r   r-   ri   ru   
contextlibr   r   ImportErroriopeeweer   r   r   strr   r   objectr   r%   r&   rb   r   r   r   r   r   r   <module>   sB   qx         
    