o
    5tiT                     @   s   d Z ddlZddlZddlmZ ddlZddlmZ ddlm	Z	 ddl
mZ ddlmZmZ G d	d
 d
ejdZG dd deZG dd deZdS )zA
.. codeauthor:: Tsuyoshi Hombashi <tsuyoshi.hombashi@gmail.com>
    N)Sequence)TypeHint   )	TableData)logger)InvalidHeaderNameErrorInvalidTableNameErrorc                   @   s4   e Zd ZdZejdddZejdefddZdS )	TableDataNormalizerInterfacezH
    Interface class to validate and normalize data of |TableData|.
    returnNc                 C      d S N selfr   r   H/home/ubuntu/.local/lib/python3.10/site-packages/tabledata/normalizer.pyvalidate      z%TableDataNormalizerInterface.validatec                 C   r   r   r   r   r   r   r   	normalize   r   z&TableDataNormalizerInterface.normalizer
   N)	__name__
__module____qualname____doc__abcabstractmethodr   r   r   r   r   r   r   r	      s    r	   )	metaclassc                   @   s$  e Zd Zedee fddZdeddfddZd&dd	Z	d
d Z
defddZejdefddZejdeddfddZejdedefddZejdededefddZejdeddfddZejdedefddZdee defddZd&d d!Zdefd"d#Zdee fd$d%ZdS )'AbstractTableDataNormalizerr
   c                 C   s
   | j jjS r   )
_tabledatadp_extractorcolumn_type_hintsr   r   r   r   _type_hints    s   
z'AbstractTableDataNormalizer._type_hints	tabledataNc                 C   s
   || _ d S r   )r   )r   r!   r   r   r   __init__$   s   
z$AbstractTableDataNormalizer.__init__c                 C   s*   | j jstd| | j j |   d S )Nztable_name must not be empty)r   
table_name
ValueError_validate_table_name_validate_headersr   r   r   r   r   '   s   z$AbstractTableDataNormalizer.validatec                 C   s   t dt |  S )Nzb'sanitize' method is deprecated and will be removed in the future. use 'normalize' method instead.)warningswarnDeprecationWarningr   r   r   r   r   sanitize.   s
   z$AbstractTableDataNormalizer.sanitizec                 C   sF   t dt| j  |  }t|  || || jj	| j
| jjdS )zT
        :return: Sanitized table data.
        :rtype: tabledata.TableData
        znormalize: )r   
type_hintsmax_workers)r   debugtyper   _normalize_headersr   2_AbstractTableDataNormalizer__normalize_table_name_normalize_rowsr   r   r    r,   r   normalize_headersr   r   r   r   7   s   z%AbstractTableDataNormalizer.normalizec                 C      dS )z}
        This method is always called before table name validation.
        You must return preprocessed table name.
        Nr   r   r   r   r   _preprocess_table_nameJ       z2AbstractTableDataNormalizer._preprocess_table_namer#   c                 C   r4   )a*  
        Must raise :py:class:`~.InvalidTableNameError`
        when you consider the table name invalid.

        :param str header: Table name to validate.
        :raises tabledata.InvalidTableNameError:
            If the table name is invalid.
            |raises_validate_table_name|
        Nr   r   r#   r   r   r   r%   Q   r6   z0AbstractTableDataNormalizer._validate_table_namec                 C   r4   )a  
        Must return a valid table name.
        The table name must be considered to be a valid name by
        :py:meth:`~._validate_table_name` method.

        This method called when :py:meth:`~._validate_table_name` method raise
        :py:class:`~.InvalidTableNameError`.

        :param str table_name: Table name to normalize.
        :return: Sanitized table name.
        :rtype: str
        Nr   r7   r   r   r   _normalize_table_name]   r6   z1AbstractTableDataNormalizer._normalize_table_namecol_idxheaderc                 C   r4   )zw
        This method is always called before a header validation.
        You must return preprocessed header.
        Nr   r   r9   r:   r   r   r   _preprocess_headerl   r6   z.AbstractTableDataNormalizer._preprocess_headerc                 C   r4   )a  
        No operation.

        This method called for each table header. Override this method
        in a subclass if you want to detect invalid table header elements.
        Raise :py:class:`~.InvalidHeaderNameError` if an invalid
        header element found.

        :param str header: Table header name.
        :raises tabledata.InvalidHeaderNameError:
            If the ``header`` is invalid.
        Nr   r   r:   r   r   r   _validate_headers   r6   z,AbstractTableDataNormalizer._validate_headerc                 C   r4   )a  
        Must return a valid header name.
        This method called when :py:meth:`~._validate_header` method raise
        :py:class:`~.InvalidHeaderNameError`.
        Override this method in subclass if you want to rename invalid
        table header element.

        :param str header: Header name to normalize.
        :return: Renamed header name.
        :rtype: str
        Nr   r=   r   r   r   _normalize_header   r6   z-AbstractTableDataNormalizer._normalize_headerr3   c                 C   s   t | jjS r   )listr   rowsr2   r   r   r   r1      s   z+AbstractTableDataNormalizer._normalize_rowsc                 C   s   | j jD ]}| | qd S r   )r   headersr>   r=   r   r   r   r&      s   z-AbstractTableDataNormalizer._validate_headersc                 C   sF   |   }z
| | |}W |S  ty"   | |}| | Y |S w r   )r5   r%   r   r8   )r   preprocessed_table_namenew_table_namer   r   r   __normalize_table_name   s   

z2AbstractTableDataNormalizer.__normalize_table_namec              	   C   sn   g }t | jjD ],\}}| ||}z	| | |}W n ty.   | |}| | Y nw || q|S r   )	enumerater   rB   r<   r>   r   r?   append)r   new_header_listr9   r:   
new_headerr   r   r   r/      s   

z.AbstractTableDataNormalizer._normalize_headersr   )r   r   r   propertyr@   r   r    r   r"   r   r*   r   r   r   strr5   r%   r8   intr<   r>   r?   r   r1   r&   r0   r/   r   r   r   r   r      s.    
	
r   c                   @   sx   e Zd ZdefddZdeddfddZdedefdd	Zd
ededefddZdeddfddZ	dedefddZ
dS )TableDataNormalizerr
   c                 C   s   | j jsdS | j jS )N )r   r#   r   r   r   r   r5      s   z*TableDataNormalizer._preprocess_table_namer#   Nc              
   C   6   z
t |  W d S  ty } zt|d }~ww r   )typepyStringr   	TypeErrorr   )r   r#   er   r   r   r%         z(TableDataNormalizer._validate_table_namec                 C      t t| S r   rK   rP   rQ   force_convertr7   r   r   r   r8         z)TableDataNormalizer._normalize_table_namer9   r:   c                 C   s   |S r   r   r;   r   r   r   r<      s   z&TableDataNormalizer._preprocess_headerc              
   C   rO   r   )rP   rQ   r   rR   r   )r   r:   rS   r   r   r   r>      rT   z$TableDataNormalizer._validate_headerc                 C   rU   r   rV   r=   r   r   r   r?      rX   z%TableDataNormalizer._normalize_header)r   r   r   rK   r5   r%   r8   rL   r<   r>   r?   r   r   r   r   rM      s    rM   )r   r   r'   collections.abcr   rP   dataproperty.typingr   _corer   _loggerr   errorr   r   ABCMetar	   r   rM   r   r   r   r   <module>   s     