U
    ±[Öen*  ć                   @   sB   d Z ddlZddlZddlmZ ddlmZ G dd dej	Z
dS )zæ
    pyexcel.internal.sheets.column
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Generic table column

    :copyright: (c) 2015-2022 by Onni Software Ltd.
    :license: New BSD License
é    N)Ś_compacté   )Ś_sharedc                   @   sb   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdddZdd ZdS )ŚColumnap  Represent columns of a matrix

    .. table:: "example.csv"

        = = =
        1 2 3
        4 5 6
        7 8 9
        = = =

    Let us manipulate the data columns on the above data matrix::

        >>> import pyexcel as pe
        >>> data = [[1,2,3], [4,5,6], [7,8,9]]
        >>> m = pe.internal.sheets.Matrix(data)
        >>> m.column[0]
        [1, 4, 7]
        >>> m.column[2] = [0, 0, 0]
        >>> m.column[2]
        [0, 0, 0]
        >>> del m.column[1]
        >>> m.column[1]
        [0, 0, 0]
        >>> m.column[2]
        Traceback (most recent call last):
            ...
        IndexError

    c                 C   s^   g }t  |t”r"t || jj”}n|}g }| j ” D ]}||kr4| |” q4| jj	|d dS )a]  
        Examples:

            >>> import pyexcel as pe
            >>> data = [[1,2,3,4,5,6,7,9]]
            >>> sheet = pe.Sheet(data)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> sheet.column.select([1,2,3,5])
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | 2 | 3 | 4 | 6 |
            +---+---+---+---+
            >>> data = [[1,2,3,4,5,6,7,9]]
            >>> sheet = pe.Sheet(data)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> sheet.column.select([1,2,3,5])
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | 2 | 3 | 4 | 6 |
            +---+---+---+---+
            >>> data = [
            ...     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
            ...     [1,2,3,4,5,6,7,9],
            ... ]
            >>> sheet = pe.Sheet(data, name_columns_by_row=0)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | a | b | c | d | e | f | g | h |
            +===+===+===+===+===+===+===+===+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> del sheet.column['a', 'b', 'i', 'f'] # doctest:+ELLIPSIS
            Traceback (most recent call last):
                ...
            ValueError: ...
            >>> sheet.column.select(['a', 'c', 'e', 'h'])
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | a | c | e | h |
            +===+===+===+===+
            | 1 | 3 | 5 | 9 |
            +---+---+---+---+
        ©Zcolumn_indicesN)
ŚcompactZis_array_typeŚstrŚutilsŚnames_to_indicesŚ_refŚcolnamesŚcolumn_rangeŚappendŚfilter)ŚselfŚindicesŚnew_indicesŚ	to_removeŚindex© r   ś`/var/www/html/services/stratfitenv/lib/python3.8/site-packages/pyexcel/internal/sheets/column.pyŚselect1   s    8zColumn.selectc                 C   s@  t  t|”ot| jd}|r.| j |” nt  |”rZt t	|| jj
”}| j |” nāt|trt || j ” ”}| j |” nøt|trØt |”}| j |g” nt|trŹt	|}| jj|d nrt|t	rč|}| jj|d nTt|tr| j |g” n8t|tjr|  |” nt|tjr8|  |” ntdS )a³  Override the operator to delete items

        Examples:

            >>> import pyexcel as pe
            >>> data = [[1,2,3,4,5,6,7,9]]
            >>> sheet = pe.Sheet(data)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> del sheet.column[1,2,3,5]
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | 1 | 5 | 7 | 9 |
            +---+---+---+---+
            >>> data = [
            ...     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
            ...     [1,2,3,4,5,6,7,9],
            ... ]
            >>> sheet = pe.Sheet(data, name_columns_by_row=0)
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+---+---+---+---+
            | a | b | c | d | e | f | g | h |
            +===+===+===+===+===+===+===+===+
            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
            +---+---+---+---+---+---+---+---+
            >>> del sheet.column['a', 'b', 'i', 'f'] # doctest:+ELLIPSIS
            Traceback (most recent call last):
                ...
            ValueError: ...
            >>> del sheet.column['a', 'c', 'e', 'h']
            >>> sheet
            pyexcel sheet:
            +---+---+---+---+
            | b | d | f | g |
            +===+===+===+===+
            | 2 | 4 | 6 | 7 |
            +---+---+---+---+

        Śdelete_named_column_atr   N)r   Ś	is_stringŚtypeŚhasattrr   r   Zis_tuple_consists_of_stringsr	   r
   Ślistr   Śdelete_columnsŚ
isinstanceŚsliceŚanalyse_sliceŚnumber_of_columnsr   Śexcel_column_indexŚtupler   ŚintŚtypesŚ
LambdaTypeŚ_delete_columns_by_contentŚFunctionTypeŚ
IndexError)r   ŚasliceŚis_sheetr   Śmy_ranger   r   r   r   Ś__delitem__t   s>    - ’

 ’



zColumn.__delitem__c                 C   sL   g }t | j ” D ]\}}|||r| |” qt|dkrH| j |” d S ©Nr   )Ś	enumerater   Ścolumnsr   Ślenr   )r   Ślocatorr   r   Ścolumnr   r   r   r'   Ą   s    
z!Column._delete_columns_by_contentc                 C   sŖ   t  t|”ot| jd}|r.| j ||” nxt|trdt 	|| j 
” ”}|D ]}| j ||” qNnBt|trt |”}| j ||” nt|tr¢| j ||” ntdS )z"Override the operator to set itemsŚset_named_column_atN)r   r   r   r   r   r4   r   r   r	   r    r!   Zset_column_atr   r"   r$   r)   )r   r*   Za_columnr+   r,   Śir   r   r   r   Ś__setitem__Č   s&     ’
 ’


zColumn.__setitem__c                 C   sŖ   |}t  t|”ot| jd}|r.| j |”S t|trnt 	|| j 
” ”}g }|D ]}| | j |”” qR|S t|trt |”}t |”| j ” kr¢| j |”S tdS )zNBy default, this class recognize from top to bottom
        from left to rightŚnamed_column_atN)r   r   r   r   r   r7   r   r   r	   r    r!   r   Z	column_atr   r"   Śabsr   r)   )r   r*   r   r+   r,   Śresultsr5   r   r   r   Ś__getitem__Ż   s*     ’
 ’

zColumn.__getitem__c                 C   sh   t |tjr | j t |”” nDt |tr>| j t |”” n&t|dr`| j 	t | 
” ”” nt| S )z0Overload += sign

        :return: self
        Śget_internal_array)r   r   ŚOrderedDictr   Śextend_columnsŚcopyŚdeepcopyr   r   Śextend_columns_with_rowsr;   Ś	TypeError)r   Śotherr   r   r   Ś__iadd__ų   s    

’zColumn.__iadd__c                 C   sl   | j  ” }t|tjr(| t |”” n@t|trD| t |”” n$t	|drd| 
t | ” ”” nt|S )z6Overload + sign
        :return: new instance
        r;   )r   Ścloner   r   r<   r=   r>   r?   r   r   r@   r;   rA   )r   rB   Znew_instancer   r   r   Ś__add__
  s    


’zColumn.__add__c                 C   s@   |}|| j jkr4| dd”}|| j jkr4td| | j  |”S )z,
        Refer to sheet.column.name
        Ś_ś z%s is not found)r   r   ŚreplaceŚAttributeErrorr7   )r   ŚattrZthe_attrr   r   r   Ś__getattr__  s    zColumn.__getattr__Nc                 C   s<   |dk	r|   ||” n"|r8|D ]}|   |d |d ” qdS )zFormat a columnNr   r   )Ś_handle_one_formatter)r   Ścolumn_indexŚ	formatterZformat_specsŚspecr   r   r   Śformat(  s
    zColumn.formatc                 C   sÄ   |}t | jjdkr$t || jj”}tj |”}t|tr| j 	” D ]B}||krD| j 
” D ]*}| j ||”}||}| j |||” qZqDn6| j 
” D ]*}| j ||”}||}| j |||” qd S r.   )r1   r   r   r	   r
   ŚCommonPropertyAmongRowNColumnZget_converterr   r   r   Z	row_rangeZ
cell_value)r   r0   Ztheformatterr   Ś	converterZrcolumnŚrowŚvaluer   r   r   rL   0  s"    ’
zColumn._handle_one_formatter)NNN)Ś__name__Ś
__module__Ś__qualname__Ś__doc__r   r-   r'   r6   r:   rC   rE   rK   rP   rL   r   r   r   r   r      s   CL
r   )rX   r>   r%   Zpyexcelr   r   Ś r   r	   rQ   r   r   r   r   r   Ś<module>   s
   	