
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    S¤ðWX-  ã                   @   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rœe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 | _|pˆt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 ]"\}}|r¼trÖ| d¡}|||< q¼|r¨|jf |Ž ¡  q¨W 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�}|r®g }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         þ
    ÿ