o
    QDi.                     @  st   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 ddlmZmZ ddlmZ G dd	 d	eeef Zd
S )    )annotations)cached_property)zip_longest)AnyDictListOptional   )errorshelpers)platformc                      sR  e Zd ZdZdSdd	ZdT fddZ fddZ fddZdU fddZdVddZ	dd Z
dd ZdWddZd d! Zd"d# Zd$d% Zd&d' ZdXdYd+d,Zed-d. Zed/d0 ZedZd3d4Zed5d6 Zed[d7d8Zed9d: Zed;d< Zed=d> Zed?d@ Zd\dBdCZdDd(dEd]dJdKZdDdDd(dLd^dNdOZdXd_ fdQdRZ  Z S )`Rowa  Row representation

    > Constructor of this object is not Public API

    This object is returned by `extract`, `resource.read_rows`, and other functions.

    ```python
    rows = extract("data/table.csv")
    for row in rows:
        # work with the Row
    ```

    Parameters:
        cells (any[]): array of cells
        field_info (dict): special field info structure
        row_number (int): row number from 1
    cells	List[Any]
field_infoDict[str, Any]
row_numberintc                C  s.   || _ || _|| _d| _i | _i | _g | _d S )NF)_Row__cells_Row__field_info_Row__row_number_Row__processed_Row__blank_cells_Row__error_cells_Row__errors)selfr   r   r    r   O/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/table/row.py__init__#   s   
zRow.__init__otherobjectc                   s   |    t |S N)_Row__processsuper__eq__)r   r   	__class__r   r   r$   2   s   z
Row.__eq__c                      |    t  S r!   )r"   r#   __str__r   r%   r   r   r(   6      
zRow.__str__c                   r'   r!   )r"   r#   __repr__r)   r%   r   r   r+   :   r*   zRow.__repr__keystrvaluer   c                   s   z| j d | \}}}}W n ty   td| w t| j|k r1| jd g|t| j   || j|d < t || d S )NmappingRow does not have a field    )r   KeyErrorlenr   extendr#   __setitem__)r   r,   r.   _field_numberr%   r   r   r5   >   s   zRow.__setitem__c                 C  s
   |  |S r!   )r"   r   r,   r   r   r   __missing__H   s   
zRow.__missing__c                 C     t | jd S Nnamesiterr   r)   r   r   r   __iter__K      zRow.__iter__c                 C  r:   r;   )r3   r   r)   r   r   r   __len__N   r@   zRow.__len__c                 C  s   || j d v S )Nr/   r   r8   r   r   r   __contains__Q   r@   zRow.__contains__c                 C  r:   r;   )reversedr   r)   r   r   r   __reversed__T   r@   zRow.__reversed__c                 C  r:   r;   r=   r)   r   r   r   keysW   r@   zRow.keysc                 c  s     | j d D ]}| | V  qd S r;   rB   r   namer   r   r   valuesZ   s   z
Row.valuesc                 c  s$    | j d D ]	}|| | fV  qd S r;   rB   rG   r   r   r   items^   s   z	Row.itemsNdefaultOptional[Any]c                 C  s   || j d vr	|S | | S r;   rB   )r   r,   rK   r   r   r   getb   s   zRow.getc                 C     | j S )C
        Returns:
            Field[]: table schema fields
        )r   r)   r   r   r   r   g      z	Row.cellsc                 C  
   | j d S )rO   objectsrB   r)   r   r   r   fieldso      
z
Row.fieldsreturn	List[str]c                 C  rQ   )z9
        Returns:
            str[]: field names
        r<   rB   r)   r   r   r   field_namesw   rT   zRow.field_namesc                 C  s   t tdt| jd d S )z;
        Returns:
            str[]: field numbers
        r1   r<   )listranger3   r   r)   r   r   r   field_numbers   s   zRow.field_numbersc                 C  rN   )z=
        Returns:
            int: row number from 1
        )r   r)   r   r   r   r      rP   zRow.row_numberc                 C     |    | jS )z~A mapping indexed by a field name with blank cells before parsing

        Returns:
            dict: row blank cells
        )r"   r   r)   r   r   r   blank_cells      zRow.blank_cellsc                 C  r[   )z~A mapping indexed by a field name with error cells before parsing

        Returns:
            dict: row error cells
        )r"   r   r)   r   r   r   error_cells   r]   zRow.error_cellsc                 C  r[   )z:
        Returns:
            Error[]: row errors
        r"   r   r)   r   r   r   r
      s   z
Row.errorsc                 C  s   |    | j S )z9
        Returns:
            bool: if row valid
        r_   r)   r   r   r   valid   s   z	Row.validoptionsc                 K  s(   t jjj}| j|d}tj|fi |S )zA
        Returns:
            str: a row as a CSV string
        )types)r   frictionless_formats	CsvParsersupported_typesto_listr   stringify_csv_string)r   ra   rb   r   r   r   r   to_str   s   
z
Row.to_strF)jsonrb   ri   boolrb   Optional[List[str]]c          
        s        fdd jd D }|du r|rtjjj}|durVt jd  D ]-\}}|\}}}}|j|v r8q(|du rE|jdkrE|j	rEq(|| }	||	dd\}	}|	||< q(|S )	z
        Parameters:
            json (bool): make data types compatible with JSON format
            types (str[]): list of supported types

        Returns:
            dict: a row as a list
        c                   s   g | ]} | qS r   r   .0rH   r)   r   r   
<listcomp>       zRow.to_list.<locals>.<listcomp>r<   Nr/   Tnumberignore_missing)
r"   r   r   rc   
JsonParserre   	enumeraterI   typefloat_number)
r   ri   rb   resultindexfield_mappingfieldr6   cell_writercellr   r)   r   rf      s   


zRow.to_list)csvri   rb   r}   c          
        s        fdd jd D }|du r|rtjjj}|du r&|r&tjjj}|durQ jd  D ]}|\}}}}|j|vrP||j	 }	||	dd\}	}|	||j	< q1|S )z
        Parameters:
            json (bool): make data types compatible with JSON format

        Returns:
            dict: a row as a dictionary
        c                   s   i | ]}| | qS r   r   rl   r)   r   r   
<dictcomp>   s    zRow.to_dict.<locals>.<dictcomp>r<   Nr/   Trq   )
r"   r   r   rc   rs   re   rd   rI   ru   rH   )
r   r}   ri   rb   rw   ry   rz   r6   r{   r|   r   r)   r   to_dict   s   




zRow.to_dictOptional[str]c                   s  | j rd S | j}dd }| jd }| jd }t| |}tt   }|r\z| jd | \}}	}
}W n tyB   td| w t	||	krO||	d  nd }t
||	|
|fg|g}|D ]\}}|d u rh n||\}}	}
}|sxt |jrxq^|
|\}}|r|dd nd }|d u r|s|| j|j< |r|| j|j< | jtj|tt||| jt||j|	d |r| D ]}| jtj|tt||| jt||j|	d qt |j| |r|  S q^t	|t	|k rt	|d }|t	|d  }t||d	D ]\}	}| jtjd
tt||| jt|d
|	d qt	|t	|kr\t	|d }|t	|d  }t||d	D ] \}	}|d urZ| jtjd
tt||| jd
|j|	d q;t	|t	| jkrvtjd
tt||| jdg| _d| _ d S )Nc                 S  s   | d urt | S dS )N )r-   )vr   r   r   <lambda>  ro   zRow.__process.<locals>.<lambda>rR   r/   r0   r1   ru   )noter   r   r|   
field_namer7   )startr   )r   r   r   T)r   r   r   r   rI   rj   r#   rA   r2   r3   ziprC   rH   popr   r   r   appendr
   	TypeErrorrX   mapr   r-   ConstraintErrorr5   rt   ExtraCellErrorMissingCellErrorBlankRowError)r   r,   r   rh   rS   ry   iteratoris_emptyrz   r7   cell_readerr{   r|   sourcer6   targetnotes	type_noter   r   r%   r   r   	__process  s   



	zRow.__process)r   r   r   r   r   r   )r   r    )r,   r-   r.   r   )r,   r-   )r,   r    r!   )r,   r-   rK   rL   )rU   rV   )rU   r   )ra   r   )ri   rj   rb   rk   )r}   rj   ri   rj   rb   rk   rU   r   )r,   r   )!__name__
__module____qualname____doc__r   r$   r(   r+   r5   r9   r?   rA   rC   rE   rF   rI   rJ   rM   r   r   rS   rW   rZ   r   r\   r^   r
   r`   rh   rf   r   r"   __classcell__r   r   r%   r   r      sN    







	
	



	""r   N)
__future__r   	functoolsr   	itertoolsr   typingr   r   r   r   r   r
   r   r   r-   r   r   r   r   r   <module>   s    