o
    ;Di%                     @   sj  d dl mZmZmZ d dlZd dlmZmZ d dlm	Z	 d dl
mZmZmZ dd Zee_G dd	 d	eZd
d Zdd Zee_G dd deZdd Zdd Zee_G dd deZdd Zdd Zee_G dd deZdd Zdd Zee_G d d! d!eZd"d# Zd$d% Zee_G d&d' d'eZd(d) Zee_G d*d+ d+eZ d1d-d.Z!e!e_!G d/d0 d0eZ"dS )2    )absolute_importprint_functiondivisionN)next	text_type)FieldSelectionError)Table	asindices	rowgetterc                 O   s   t | g|R i |S )aM  
    Replace one or more values in the table's header row. E.g.::

        >>> import petl as etl
        >>> table1 = [['sex', 'age'],
        ...           ['m', 12],
        ...           ['f', 34],
        ...           ['-', 56]]
        >>> # rename a single field
        ... table2 = etl.rename(table1, 'sex', 'gender')
        >>> table2
        +--------+-----+
        | gender | age |
        +========+=====+
        | 'm'    |  12 |
        +--------+-----+
        | 'f'    |  34 |
        +--------+-----+
        | '-'    |  56 |
        +--------+-----+

        >>> # rename multiple fields by passing dictionary as second argument
        ... table3 = etl.rename(table1, {'sex': 'gender', 'age': 'age_years'})
        >>> table3
        +--------+-----------+
        | gender | age_years |
        +========+===========+
        | 'm'    |        12 |
        +--------+-----------+
        | 'f'    |        34 |
        +--------+-----------+
        | '-'    |        56 |
        +--------+-----------+

    The field to rename can be specified as an index (i.e., integer representing
    field position).

    If any nonexistent fields are specified, the default behaviour is to raise
    a `FieldSelectionError`. However, if `strict` keyword argument is `False`, any
    nonexistent fields specified will be silently ignored.
    )
RenameView)tableargskwargs r   O/var/www/Datamplify/venv/lib/python3.10/site-packages/petl/transform/headers.pyrename   s   +r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 O   sd   || _ t|dkrt | _nt|dkr|d | _nt|dkr)|d |d i| _|dd| _d S )Nr         strictT)sourcelendictspecgetr   )selfr   r   r   r   r   r   __init__?   s   
zRenameView.__init__c                 C   s   t | j| j| jS N)
iterrenamer   r   r   r   r   r   r   __iter__I   s   zRenameView.__iter__c                 C   s   || j |< d S r   r   )r   keyvaluer   r   r   __setitem__L      zRenameView.__setitem__N)__name__
__module____qualname__r   r   r#   r   r   r   r   r   =   s    
r   c           	      #   s    t | }zt|}W n ty   g }Y nw ttt|}|rA D ]}t|tr8|dk s3|t|kr7t	|q"||vr@t	|q" fddt
|D }t|V  |D ]}t|V  qSd S )Nr   c                    s4   g | ]\}}| v r | n	| v r | n|qS r   r   ).0ifr    r   r   
<listcomp>^   s    ziterrename.<locals>.<listcomp>)iterr   StopIterationlistmapr   
isinstanceintr   r   	enumeratetuple)	r   r   r   ithdrfldsxouthdrrowr   r    r   r   P   s0   


r   c                 C   
   t | |S )a@  
    Replace header row in the given table. E.g.::

        >>> import petl as etl
        >>> table1 = [['foo', 'bar'],
        ...           ['a', 1],
        ...           ['b', 2]]
        >>> table2 = etl.setheader(table1, ['foofoo', 'barbar'])
        >>> table2
        +--------+--------+
        | foofoo | barbar |
        +========+========+
        | 'a'    |      1 |
        +--------+--------+
        | 'b'    |      2 |
        +--------+--------+

    See also :func:`petl.transform.headers.extendheader`,
    :func:`petl.transform.headers.pushheader`.

    )SetHeaderView)r   headerr   r   r   	setheaderg      
r=   c                   @      e Zd Zdd Zdd ZdS )r;   c                 C      || _ || _d S r   )r   r<   )r   r   r<   r   r   r   r         
zSetHeaderView.__init__c                 C      t | j| jS r   )itersetheaderr   r<   r   r   r   r   r      r$   zSetHeaderView.__iter__Nr%   r&   r'   r   r   r   r   r   r   r;          r;   c                 c   sL    t | }zt| W n	 ty   Y nw t|V  |D ]}t|V  qd S r   )r,   r   r-   r3   r   r<   r4   r9   r   r   r   rC      s   
rC   c                 C   r:   )aM  
    Extend header row in the given table. E.g.::

        >>> import petl as etl
        >>> table1 = [['foo'],
        ...           ['a', 1, True],
        ...           ['b', 2, False]]
        >>> table2 = etl.extendheader(table1, ['bar', 'baz'])
        >>> table2
        +-----+-----+-------+
        | foo | bar | baz   |
        +=====+=====+=======+
        | 'a' |   1 | True  |
        +-----+-----+-------+
        | 'b' |   2 | False |
        +-----+-----+-------+

    See also :func:`petl.transform.headers.setheader`,
    :func:`petl.transform.headers.pushheader`.

    )ExtendHeaderView)r   fieldsr   r   r   extendheader   r>   rI   c                   @   r?   )rG   c                 C   r@   r   )r   rH   )r   r   rH   r   r   r   r      rA   zExtendHeaderView.__init__c                 C   rB   r   )iterextendheaderr   rH   r   r   r   r   r      r$   zExtendHeaderView.__iter__NrD   r   r   r   r   rG      rE   rG   c                 c   sb    t | }zt|}W n ty   g }Y nw t|}|| t|V  |D ]}t|V  q'd S r   )r,   r   r-   r.   extendr3   )r   rH   r4   r5   r8   r9   r   r   r   rJ      s   

rJ   c                 G   s   t | |g|R  S )a  
    Push rows down and prepend a header row. E.g.::

        >>> import petl as etl
        >>> table1 = [['a', 1],
        ...           ['b', 2]]
        >>> table2 = etl.pushheader(table1, ['foo', 'bar'])
        >>> table2
        +-----+-----+
        | foo | bar |
        +=====+=====+
        | 'a' |   1 |
        +-----+-----+
        | 'b' |   2 |
        +-----+-----+

    The header row can either be a list or positional arguments.

    )PushHeaderView)r   r<   r   r   r   r   
pushheader   s   rM   c                   @   r?   )rL   c                 G   sZ   || _ || _t|ttfr|| _d S t|dkr)g | _| j| | j| d S J d)Nr   Fzbad parameters)	r   r   r0   r.   r3   r<   r   appendrK   )r   r   r<   r   r   r   r   r      s   
zPushHeaderView.__init__c                 C   rB   r   )iterpushheaderr   r<   r   r   r   r   r      r$   zPushHeaderView.__iter__NrD   r   r   r   r   rL      s    rL   c                 c   s,    t | }t|V  |D ]}t|V  qd S r   )r,   r3   rF   r   r   r   rO      s   
rO   c                 C   r:   )a  
    Skip `n` rows, including the header row. E.g.::

        >>> import petl as etl
        >>> table1 = [['#aaa', 'bbb', 'ccc'],
        ...           ['#mmm'],
        ...           ['foo', 'bar'],
        ...           ['a', 1],
        ...           ['b', 2]]
        >>> table2 = etl.skip(table1, 2)
        >>> table2
        +-----+-----+
        | foo | bar |
        +=====+=====+
        | 'a' |   1 |
        +-----+-----+
        | 'b' |   2 |
        +-----+-----+

    See also :func:`petl.transform.basics.skipcomments`.

    )SkipView)r   nr   r   r   skip  s   
rR   c                   @   r?   )rP   c                 C   r@   r   r   rQ   )r   r   rQ   r   r   r   r   #  rA   zSkipView.__init__c                 C   rB   r   )iterskipr   rQ   r   r   r   r   r   '  r$   zSkipView.__iter__NrD   r   r   r   r   rP   !  rE   rP   c                 C   s   t | |d S r   )	itertoolsislicerS   r   r   r   rT   +  r$   rT   c                 C   r:   )z&Prefix all fields in the table header.)PrefixHeaderViewr   prefixr   r   r   prefixheader/     
rZ   c                   @   r?   )rW   c                 C   r@   r   rX   )r   r   rY   r   r   r   r   :  rA   zPrefixHeaderView.__init__c                 #   ^    t  j}zt|}W n
 ty   Y d S w t fdd|D }|V  |D ]}|V  q'd S )Nc                 3   s"    | ]}t  jt | V  qd S r   )r   rY   r(   r*   r   r   r   	<genexpr>D       z,PrefixHeaderView.__iter__.<locals>.<genexpr>r,   r   r   r-   r3   r   r4   r5   r8   r9   r   r   r   r   >     
zPrefixHeaderView.__iter__NrD   r   r   r   r   rW   8  rE   rW   c                 C   r:   )z&Suffix all fields in the table header.)SuffixHeaderViewr   suffixr   r   r   suffixheaderJ  r[   rf   c                   @   r?   )rc   c                 C   r@   r   rd   )r   r   re   r   r   r   r   U  rA   zSuffixHeaderView.__init__c                 #   r\   )Nc                 3   s"    | ]}t |t  j V  qd S r   )r   re   r]   r   r   r   r^   _  r_   z,SuffixHeaderView.__iter__.<locals>.<genexpr>r`   ra   r   r   r   r   Y  rb   zSuffixHeaderView.__iter__NrD   r   r   r   r   rc   S  rE   rc   Fc                 C   s   t | ||S )zLRe-order columns so the header is sorted.

    .. versionadded:: 1.1.0

    )SortHeaderViewr   reversemissingr   r   r   
sortheadere  s   rk   c                   @   r?   )rg   c                 C   s   || _ || _|| _d S r   rh   )r   r   ri   rj   r   r   r   r   t  s   
zSortHeaderView.__init__c              	   #   s    t | j}zt|}W n
 ty   Y d S w t|}t||}t| }t|V  | j |D ]z|V  W q. t	yM   t fdd|D V  Y q.w d S )Nc                 3   s(    | ]}|t k r| n V  qd S r   )r   )r(   r)   rj   r9   r   r   r^     s     z*SortHeaderView.__iter__.<locals>.<genexpr>)
r,   r   r   r-   sortedr	   r
   r3   rj   
IndexError)r   r4   r5   shdrindices	transformr   rl   r   r   y  s*   


zSortHeaderView.__iter__NrD   r   r   r   r   rg   r  s    rg   )FN)#
__future__r   r   r   rU   petl.compatr   r   petl.errorsr   petl.util.baser   r	   r
   r   r   r   r=   r;   rC   rI   rG   rJ   rM   rL   rO   rR   rP   rT   rZ   rW   rf   rc   rk   rg   r   r   r   r   <module>   sD    .




