U
    d?                     @   sT   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 Z
G d	d
 d
eZdS )z Read worksheets on-demand
   )	Worksheet    )ReadOnlyCell
EMPTY_CELL)get_column_letter)WorkSheetParserc                 C   s   t | g }| S N)r   parse_dimensions)sourceparser r   A/tmp/pip-unpacked-wheel-rwywncvq/openpyxl/worksheet/_read_only.pyread_dimension   s    
r   c                   @   s   e Zd ZdZdZd ZZejZej	Z	ej
Z
ejZejZejZdd Zdd Zdd Zdd
dZdddZdd Zd ddZdd Zdd Zedd Zedd Zedd Zedd ZdS )!ReadOnlyWorksheetr   Nc                 C   s0   || _ || _d| _d | _|| _|| _|   d S )NZvisible)parenttitleZsheet_stateZ_current_row_worksheet_path_shared_strings	_get_size)selfZparent_workbookr   Zworksheet_pathZshared_stringsr   r   r   __init__"   s    zReadOnlyWorksheet.__init__c                 C   sB   |   }t|g }| }|  |d k	r>|\| _| _| _| _d S r   )_get_sourcer   r	   close_min_column_min_row_max_column_max_row)r   srcr   Z
dimensionsr   r   r   r   ,   s    
zReadOnlyWorksheet._get_sizec                 C   s   | j j| jS )z0Parse xml source on demand, must close after use)r   Z_archiveopenr   r   r   r   r   r   5   s    zReadOnlyWorksheet._get_sourceFc                 c   s  t }|rd}|p| j}|p| j}g }|dk	r>|f|d |  }|}d}	|  }
t|
| j| jj| jj| jj	d}|
 D ]`\}	}|dk	r|	|kr qt||	D ]}|d7 }|V  q||	krv| ||||}|d7 }|V  qv|
  |dk	r||	k rt||d D ]}|V  qdS )zt
        The source worksheet file may have columns or rows missing.
        Missing cells will be created.
        Nr   )	data_onlyepochZdate_formats)r   
max_columnmax_rowr   r   r   r   r    r!   Z_date_formatsparserange_get_rowr   )r   min_colmin_rowmax_colr#   values_onlyZfillerZ	empty_rowcounteridxr   r   row_r   r   r   _cells_by_row:   s<    

 zReadOnlyWorksheet._cells_by_rowc           
      C   s   |s|sdS |p|d d }|d | }t g| }|r@dg| }|D ]L}|d }||  krd|krDn qD|| }	|d ||	< |sDt| f|||	< qDt|S )zT
        Make sure a row contains always the same number of cells or values
        r   columnr   Nvalue)r   r   tuple)
r   r-   r'   r)   r*   Z	row_widthZnew_rowcellr+   r,   r   r   r   r&   e   s    

zReadOnlyWorksheet._get_rowc                 C   s*   |  ||||D ]}|r|d   S qtS )z4Cells are returned by a generator which can be emptyr   )r/   r   )r   r-   r1   r   r   r   	_get_cell~   s    zReadOnlyWorksheet._get_cellc                 C   sL   t | j| jgs&|r|   ntdt| j | j dt| j | j S )Nz9Worksheet is unsized, use calculate_dimension(force=True):)allr"   r#   _calculate_dimension
ValueErrorr   
min_columnr(   )r   forcer   r   r   calculate_dimension   s
    
z%ReadOnlyWorksheet.calculate_dimensionc                 C   s<   d}| j D ]}|sq
|d }t||j}q
|j| _|| _dS )z
        Loop through all the cells to get the size of a worksheet.
        Do this only if it is explicitly requested.
        r   r0   N)rowsmaxr1   r-   r   r   )r   r)   rr4   r   r   r   r8      s    
z&ReadOnlyWorksheet._calculate_dimensionc                 C   s   d | _ | _dS )z
        Remove worksheet dimensions if these are incorrect in the worksheet source.
        NB. This probably indicates a bug in the library or application that created
        the workbook.
        N)r   r   r   r   r   r   reset_dimensions   s    z"ReadOnlyWorksheet.reset_dimensionsc                 C   s   | j S r   )r   r   r   r   r   r(      s    zReadOnlyWorksheet.min_rowc                 C   s   | j S r   )r   r   r   r   r   r#      s    zReadOnlyWorksheet.max_rowc                 C   s   | j S r   )r   r   r   r   r   r:      s    zReadOnlyWorksheet.min_columnc                 C   s   | j S r   )r   r   r   r   r   r"      s    zReadOnlyWorksheet.max_column)F)r   NF)F)__name__
__module____qualname__r   r   r   r   r   r4   Z	iter_rowsvaluesr=   __getitem____iter__r   r   r   r/   r&   r5   r<   r8   r@   propertyr(   r#   r:   r"   r   r   r   r   r      s4   
	
+

		


r   N)__doc__Z	worksheetr   Zopenpyxl.cell.read_onlyr   r   Zopenpyxl.utilsr   Z_readerr   r   objectr   r   r   r   r   <module>   s   