U
    d                     @   sd   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ G d	d
 d
eZdS )z;Write worksheets to xml representations in an optimized way    )isgenerator)CellWriteOnlyCell)_WorkbookChild   )	WorksheetWorkbookAlreadySaved)WorksheetWriterc                       s   e Zd ZdZdZdZdZejZej	Z	ej
Z
ejZejZejZejZejZejZejZejZejZejZejZejZejZ fddZedd Zdd	 Zd
d Zdd Zdd Zdd Zdd Z dd Z!  Z"S )WriteOnlyWorksheetz
    Streaming worksheet. Optimised to reduce memory by writing rows just in
    time.
    Cells can be styled and have comments Styles for rows and columns
    must be applied before writing cells
    FNc                    s*   t t| || d| _d| _|   d S )Nr   )superr   __init__Z_max_colZ_max_row_setup)selfparenttitle	__class__ B/tmp/pip-unpacked-wheel-rwywncvq/openpyxl/worksheet/_write_only.pyr   .   s    zWriteOnlyWorksheet.__init__c                 C   s   | j S N)_WriteOnlyWorksheet__savedr   r   r   r   closed4   s    zWriteOnlyWorksheet.closedc              	   c   s   z| j jd}W n tk
r.   |   Y nX |dP d}z0dV }| ||}| j ||| |d7 }qBW n tk
r   Y nX W 5 Q R X | j jd dS )z2
        Send rows to the writer's stream
        TZ	sheetDatar   N)	_writerxfsendStopIteration_already_savedelement_values_to_rowZ	write_rowGeneratorExit)r   r   row_idxrowr   r   r   _write_rows9   s    zWriteOnlyWorksheet._write_rowsc                 C   s"   | j d krt| | _ | j   d S r   )r   r
   Z	write_topr   r   r   r   _get_writerP   s    

zWriteOnlyWorksheet._get_writerc                 C   sT   | j r|   |   | jd kr,| j  n
| j  | j  | j  d| _ d S )NT)r   r   r%   _rowsr   Z
write_rowscloseZ
write_tailr   r   r   r   r'   V   s    



zWriteOnlyWorksheet.closec                 C   sX   t |s"t|tttfs"| | |   | jdkrH|  | _t	| j | j
| dS )z^
        :param row: iterable containing values to append
        :type row: iterable
        N)r   
isinstancelisttuplerange_invalid_rowr%   r&   r$   nextr   )r   r#   r   r   r   appendg   s    



zWriteOnlyWorksheet.appendc              	   c   s   t | }t|dD ]\}}|dkr$qz
||_W n( tk
rV   t|trN|}ntY nX ||_||_|jdk	rx|j	|j_
|V  |js|jrt | }qdS )zW
        Convert whatever has been appended into a form suitable for work_rows
        r   N)r   	enumeratevalue
ValueErrorr(   r   columnr#   Z	hyperlinkZ
coordinaterefZ	has_style)r   valuesr"   cellZcol_idxr0   r   r   r   r    {   s"    




z!WriteOnlyWorksheet._values_to_rowc                 C   s   t dd S )NzHWorkbook has already been saved and cannot be modified or saved anymore.r   r   r   r   r   r      s    z!WriteOnlyWorksheet._already_savedc                 C   s   t dt|d S )NzGValue must be a list, tuple, range or a generator Supplied value is {0})	TypeErrorformattype)r   iterabler   r   r   r,      s    zWriteOnlyWorksheet._invalid_row)#__name__
__module____qualname____doc__r   r   r&   r   Z	_rel_type_pathZ	mime_typeZ_add_rowZ_add_columnZ	add_chartZ	add_imageZ	add_tableZtablesZprint_titlesZprint_title_colsZprint_title_rowsZfreeze_panesZ
print_areaZ
sheet_viewr   r   propertyr   r$   r%   r'   r.   r    r   r,   __classcell__r   r   r   r   r      s<   
r   N)r=   inspectr   Zopenpyxl.cellr   r   Zopenpyxl.workbook.childr   Z	worksheetr   Zopenpyxl.utils.exceptionsr	   r   r
   r   r   r   r   r   <module>   s   