o
    iW                     @  sd  U d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ 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mZ d dlmZmZ d dlmZ d dl m!Z!m"Z"m#Z# erd dlm$Z$ d dl
m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dlm,Z,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7 ddddZ8dZ9dZ:ed ed!ed"iZ;d#e<d$< G d%d& d&Z=dd.d/Z>dd2d3Z?dd7d8Z@ddBdCZAedDdEddKdLZBeddOdLZBdPdEddRdLZBddSdTZCdUdUdVdd\d]ZDdd`daZEddddeZF	U	U	U	U	U	U	U	f	UdddydzZGdd|d}ZHd~ddddZI	UddddZJdddZKdddZLdUS )    )annotations)Sequence)BytesIO)PathLike)Path)TYPE_CHECKINGAnyoverload)	functions)json)qualified_type_name)DateDatetimeFloat64Int64Time)FLOAT_DTYPESINTEGER_DTYPES)DuplicateError)_expand_selector_dicts_expand_selectorsnumeric)Iterable)LiteralWorkbookFormat	Worksheet)	DataFrameSchemaSeries)ColumnFormatDictColumnTotalsDefinitionConditionalFormatDictOneOrMoreDataTypesPolarsDataTypeRowTotalsDefinition)Expr   iterableIterable[Any]nintreturnc                 C  s   t t| g| ddiS )NstrictT)zipiter)r+   r-    r3   Y/home/app/Keep/.python/lib/python3.10/site-packages/polars/io/spreadsheet/_write_utils.py_cluster+   s   r5   z#,##0.000;[Red]-#,##0.000z#,##0;[Red]-#,##0zyyyy-mm-dd hh:mm:sszyyyy-mm-dd;@z
hh:mm:ss;@zdict[PolarsDataType, str]_XL_DEFAULT_DTYPE_FORMATS_c                   @  s2   e Zd ZdZdddZedddZdddZdS )_XLFormatCachezGCreate/cache only one Format object per distinct set of format options.wbr   r/   Nonec                 C  s   i | _ || _d S N)_cacher8   )selfr8   r3   r3   r4   __init__;   s   
z_XLFormatCache.__init__fmtdict[str, Any]strc                 C  s   t j| dtdS )NT)	sort_keysdefault)r   dumpsr@   )r>   r3   r3   r4   _key?   s   z_XLFormatCache._keydict[str, Any] | Formatr   c                 C  sJ   t |ts	|}|S | |}| j|}|d u r#| j|}|| j|< |S r:   )
isinstancedictrD   r;   getr8   Z
add_format)r<   r>   Zwbfmtkeyr3   r3   r4   rH   C   s   


z_XLFormatCache.getN)r8   r   r/   r9   )r>   r?   r/   r@   )r>   rE   r/   r   )__name__
__module____qualname____doc__r=   staticmethodrD   rH   r3   r3   r3   r4   r7   8   s    
r7   dfr    colsIterable[str]min_maxr?   boolc                   sv   t  fdd|D }|t tt|t|d krdS  j}|d ||d  d|d< |d ||d  d|d	< d
S )z>Indicate if the given columns are all adjacent to one another.c                 3  s    | ]}  |V  qd S r:   )get_column_index.0colrO   r3   r4   	<genexpr>Q   s    z!_adjacent_cols.<locals>.<genexpr>   Fr   )idxnameminmaxT)sortedranger]   r_   columns)rO   rP   rR   Zidxsrb   r3   rX   r4   _adjacent_colsO   s   rc   schemar!   c                   s   t  fdd| D S )z4Indicate if the given columns are all integer-typed.c                 3  s    | ]	} |   V  qd S r:   )
is_integerrU   rd   r3   r4   rY   ]       z$_all_integer_cols.<locals>.<genexpr>)all)rP   rd   r3   rf   r4   _all_integer_cols[   s   ri   d$dict[str | Sequence[str], Any] | Anydict[str, Any] | Anyc                 C  sT   t | ts| S i }|  D ]\}}t |tst |ts|f}|D ]}|||< q q|S )zCUnpack multi-col dictionary into equivalent single-col definitions.)rF   rG   itemsr@   r   )rj   unpackedrI   valuekr3   r3   r4   _unpack_multi_column_dict`   s   

rq   wsr   conditional_formatsr%   table_starttuple[int, int]include_headerformat_cacher9   c                C  s$  ddl m} t| |dddd D ]~\}}t|ts&t|dkr&tt|}t|tt	fr0|g}|D ]\}	t|	t	s=d|	i}	t|trKt
| |||d}
nt| |||d}
d	|
v ritt|}|
|	d
< t
| |||d}
d|	v r|	d }t||rx|n|t|trd|in||	d< ||
|	 q2qdS )zJTake all conditional formatting options and apply them to the table/range.r   r   TFexpand_keysexpand_valuesZ
tuple_keysrZ   typerv    Zmulti_rangeformat
num_formatN)xlsxwriter.formatr   r   rm   rF   r@   lennextr2   rG   _xl_column_range_xl_column_multi_rangerH   Zconditional_format)rO   rr   rs   rt   rv   rw   r   rP   formatsr>   Z	col_rangerW   fr3   r3   r4   _xl_apply_conditional_formatso   sJ   




r   .)as_rangerW   str | tuple[int, int]r   Literal[True]r@   c                C     d S r:   r3   rO   rt   rW   rv   r   r3   r3   r4   r         r   Literal[False]tuple[int, int, int, int]c                C  r   r:   r3   r   r3   r3   r4   r      r   Ttuple[int, int, int, int] | strc                C  s   |d t | |d t|tr| |n|d  f}|d | j d |d t|tr,dn|d |d   f}|rDdtg ||R  S || S )zKReturn the Excel sheet range of a named column, accounting for all offsets.r   rZ    )r.   rF   r@   rT   heightjoin_xl_rowcols_to_range)rO   rt   rW   rv   r   Z	col_startZ
col_finishr3   r3   r4   r      s   
"$c                  sR   i }t  ||drt |d d |d d fdS d fdd|D S )	zNReturn column ranges as an xlsxwriter 'multi_range' string, or spanning range.rR   r]   r[   r_   r|   r}   c                 3  s     | ]}t  |d V  qdS )r|   N)r   rU   rO   rv   rt   r3   r4   rY      s
    
z)_xl_column_multi_range.<locals>.<genexpr>)rc   r   r   )rO   rt   rP   rv   mr3   r   r4   r      s   r   N)dtypeexprcoldefsr   1dict[str, PolarsDataType] | PolarsDataType | Noner   Expr | Nonec                  s   t | j| j }i  | D ]R\}}|v r"d|d}t|t|ts-|| q|d |< |d}|d}	|	du rL|du rL|| q|du rW|	|	d n|	|}
|
|
| qdu rltdn|  fdd	|D } | S )
zHInsert dummy frame columns in order to create empty/named table columns.zcannot create a second z columnZreturn_dtypeinsert_beforeinsert_afterNrZ   c              
   3  s`    | ]+}|v r
|n!s  |d ur'  |ttr# |tnn|V  qd S r:   )rH   castrF   rG   r   aliasrU   Zcast_lookupZdf_original_columnsr   r   r3   r4   rY     s"    	
z1_xl_inject_dummy_table_columns.<locals>.<genexpr>)setrb   copyrm   r   rF   rG   appendrH   indexinsertFZlitselect)rO   r   r   r   Zdf_select_colsrW   Z
definitionmsgr   r   Z
insert_idxr3   r   r4   _xl_inject_dummy_table_columns   s0   




r   paramsSequence[str] | dict[str, Any]c                C  s   ddl m} i }t|tr|dn|}|sd}	t|	t|||ds)d}	t|	t||||dd\}
}}}|d	 |d
 d  }|d	 |d d  }t|tsRi }ndd |	 D }d|vrh|ddv |d< t
|jD ] }||
|}||
|}| d| |d< | |
|| |
d	7 }
qmdS )z@Inject sparklines into (previously-created) empty table columns.r   xl_rowcol_to_cellrb   z;supplying 'columns' param value is mandatory for sparklinesr   z.sparkline data range/cols must all be adjacentF)rv   r   rZ   r]   r[   r_   c                 S  s   i | ]\}}|d vr||qS ))rb   r   r   r3   )rV   r\   valr3   r3   r4   
<dictcomp>9  s
    z)_xl_inject_sparklines.<locals>.<dictcomp>Znegative_pointsr{   )columnZwin_loss:ra   N)xlsxwriter.utilityr   rF   rG   rH   
ValueErrorrc   RuntimeErrorr   rm   ra   r   Zadd_sparkline)rr   rO   rt   rW   rv   r   r   r   Z	data_colsr   Zspk_rowZspk_col_Zdata_start_colZdata_end_coloptionsZ
data_startZdata_endr3   r3   r4   _xl_inject_sparklines  s8   





r   row_col_pairs	list[str]c                    s4   ddl m   fddt| D }dd t|D S )z@Return list of "A1:B2" range refs from pairs of row/col indexes.r   r   c                 3  s    | ]
\}} ||V  qd S r:   r3   )rV   rowrW   r   r3   r4   rY   M  s    z'_xl_rowcols_to_range.<locals>.<genexpr>c                 S  s   g | ]\}}| d | qS )r   r3   )rV   Z
cell_startZcell_endr3   r3   r4   
<listcomp>N  s    z(_xl_rowcols_to_range.<locals>.<listcomp>)r   r   r5   )r   Z	cell_refsr3   r   r4   r   I  s   r      column_totalsColumnTotalsDefinition | Nonecolumn_formatsColumnFormatDict | Nonedtype_formats$dict[OneOrMoreDataTypes, str] | Noneheader_formatdict[str, Any] | None
sparklines0dict[str, Sequence[str] | dict[str, Any]] | Noneformulas&dict[str, str | dict[str, str]] | None
row_totalsRowTotalsDefinition | Nonefloat_precisiontable_styledict[str, Any] | str | NoneHtuple[list[dict[str, Any]], dict[str | tuple[str, ...], str], DataFrame]c              	     s  d*dd  fddj  D }|r|ttdd	dd
|s*d}i nsj dd  D t|ts}trBtnt	}|du rJnt|t
rR|hntt|}tdd jD }|jd krldnd d}|t|di|g}n t|d	dd}fdd| D }fdd| D |du rt dit|pdd}nt|t
r| }t |it|pd|}tt|trt|dd	dnt|}t|trt|dn
t|tr| ni dd |pi  D tpi t|pi }t|D ]}t|ttfr!|t||| q| D ]}t|t
s>d|dt|d}t|q'|rHt|rPt|rZt|d|dd i}|
du rkt }t!}nt "d!d"d# }t!"d!d"d# }t#D ]}|t$|< q}d$|	 }|s|n|%d%d&| }t$ D ]\}}|&|| qt'D ]	}|&|| q| D ]	\}}|||< qj  D ]%\}}|( }||v r|||| }&|| |vr||< qƈ D ]C\}}t|t
r||d d'|< qt|tr2d(|vr"j |}||v r"|| |d(< d|vr+d |d< |||< q|r<||ndfd)djD }|fS )+z7Setup and unify all column-related formatting/defaults.sr"   r/   c                 S  s   |  | jdd |  D S )Nc                 S  s    g | ]}|d u r
d nt |qS r:   )r@   )rV   vr3   r3   r4   r   c  s     z=_xl_setup_table_columns.<locals>._map_str.<locals>.<listcomp>)	__class__r\   Zto_list)r   r3   r3   r4   _map_stra  s   z)_xl_setup_table_columns.<locals>._map_strc                   s6   g | ]\}}|  s| rt| |qS r3   )Z	is_nestedZ	is_objectr   rW   Zmap_batchesr   rV   rW   tp)r   r3   r4   r   f  s    z+_xl_setup_table_columns.<locals>.<listcomp>TFrx   Nc                 S  s   h | ]
\}}|  r|qS r3   )Z
is_numericr   r3   r3   r4   	<setcomp>{  s    z*_xl_setup_table_columns.<locals>.<setcomp>c                 s  s$    | ]}|r
|d  nd  V  qdS )r   r   N)isupperrV   cr3   r3   r4   rY     s   " z*_xl_setup_table_columns.<locals>.<genexpr>r*   TtZotalsum)ry   rz   c                   s0   i | ]\}}|t |d u r n|rtntqS )T)ri   r   r   )rV   nmrP   )numeric_colsrd   r3   r4   r     s    z+_xl_setup_table_columns.<locals>.<dictcomp>c                   s*   i | ]\}}|t  |d u rn|dqS )Tr   )_xl_table_formula)rV   r\   rP   )rO   r   r3   r4   r     s    r3   c                 S  s(   i | ]\}}|t |trd |in|qS )formula)rF   r@   )rV   rW   r   r3   r3   r4   r     s    zinvalid dtype_format value: z (expected format string, got ))r   valignZvcenter;rZ   r   0z.000.)r   r   r   c                   sL   g | ]"}d d ||   | |p |i  dd D qS )c                 S  s   i | ]\}}|d ur||qS r:   r3   )rV   rp   r   r3   r3   r4   r     s
    
z6_xl_setup_table_columns.<locals>.<listcomp>.<dictcomp>r   )headerr~   r   Ztotal_functionr   )rH   rm   rU   )col_header_formatr   column_formulascolumn_total_funcsrow_total_funcsr3   r4   r     s    
	)r   r"   r/   r"   ))rd   rm   Zwith_columnsrq   r   rF   rG   ri   r   r   r@   r   r   r   rb   widthr   r   fromkeyslowerr   r   listtuple	frozensetupdatepopvaluesr   	TypeErrorr   rH   _XL_DEFAULT_INTEGER_FORMAT__XL_DEFAULT_FLOAT_FORMAT_splitr   r6   replace
setdefaultr   	base_type)rO   rw   r   r   r   r   r   r   r   r   r   Z	cast_colsZrow_totals_dtypeZsum_colsZn_ucasetotalfnr   r>   r   Zfmt_defaultZint_base_fmtZflt_base_fmtZzerosZ	fmt_floatrW   r   table_columnsr3   )	r   r   r   r   r   rO   r   r   rd   r4   _xl_setup_table_columnsQ  s   




	










r   2tuple[dict[str, Any] | str | None, dict[str, Any]]c                 C  sZ   t | tr'd}| D ]}||vrd|}t|q	|  }|dd} | |fS i }| |fS )zESetup table options, distinguishing style name from other formatting.)styleZbanded_columnsZbanded_rowsfirst_columnlast_columnzinvalid table style key: r   N)rF   rG   r   r   r   )r   Zvalid_optionsrI   r   Ztable_optionsr3   r3   r4   _xl_setup_table_options  s   

r  Freturn_worksheetr8   r   r  bool | Worksheetc                  sB   t  fdd|  D r|r S dS d| jd j}t|)Nc                 3  s    | ]} |u V  qd S r:   r3   )rV   Zsheetrr   r3   r4   rY   2  s    z,_xl_worksheet_in_workbook.<locals>.<genexpr>Tzthe given workbook object z  is not the parent of worksheet )any
worksheetsfilenamer\   r   )r8   rr   r  r   r3   r  r4   _xl_worksheet_in_workbook/  s   r  workbook&Workbook | BytesIO | Path | str | None	worksheetstr | Worksheet | None tuple[Workbook, Worksheet, bool]c           
      C  s>  ddl m} ddlm} t| |r)| d}}t||r"t||r"|n|j|d}nZt||r7d| }t|ddtt	 d}t| t
rP|| |d	d}}}n3| d	u rYtd
}	nt| trct| }	n| }	t|	trz|	jro|	n|	d jdd}	||	|}d\}}|d	u rt||rt||dd}n|j|d}|||fS )z2Establish the target Excel workbook and worksheet.r   r   r   F)r\   zEworksheet object requires the parent workbook object; found workbook=T)Znan_inf_to_errorsZstrings_to_formulasZdefault_date_formatNzdataframe.xlsxz.xlsx)r0   )NTr  )
xlsxwriterr   xlsxwriter.worksheetr   rF   r  Zget_worksheet_by_namer   r6   r   r   r   r@   r   suffixwith_suffix
expanduserresolveZadd_worksheet)
r  r  r   r   r8   Z	can_closerr   r   Zworkbook_optionsfiler3   r3   r4   _xl_setup_workbook8  sJ   












r  funcc                 C  sx   i }t |tr
|g}t| ||dr'd|  d|d d  d|d d  dS d	d
d |D }d|  d| dS )zIReturn a formula using structured references to columns in a named table.r   =z([@[r]   r\   z]:[r_   z]]),c                 s  s    | ]	}d | dV  qdS )z[@[z]]Nr3   r   r3   r3   r4   rY   v  rg   z$_xl_table_formula.<locals>.<genexpr>(r   )rF   r@   rc   upperr   )rO   rP   r  r   Zcolrefsr3   r3   r4   r   n  s   
,r   c                   sn   d t  }|  D ]}| fdd|jD  q	t|}  | }||v r5|d7 }  | }||v s'|S )z4Establish a unique (per-workbook) table object name.Framec                 3  s&    | ]}|d    r|d  V  qdS )r\   N)
startswith)rV   tblZtable_prefixr3   r4   rY     s    
z(_xl_unique_table_name.<locals>.<genexpr>rZ   )r   r	  r   Ztablesr   )r8   Zpolars_tablesrr   r-   Z
table_namer3   r!  r4   _xl_unique_table_namez  s   
r"  )r*   )r+   r,   r-   r.   r/   r,   )rO   r    rP   rQ   rR   r?   r/   rS   )rP   rQ   rd   r!   r/   rS   )rj   rk   r/   rl   )rO   r    rr   r   rs   r%   rt   ru   rv   rS   rw   r7   r/   r9   )rO   r    rt   ru   rW   r   rv   rS   r   r   r/   r@   )rO   r    rt   ru   rW   r   rv   rS   r   r   r/   r   )rO   r    rt   ru   rW   r   rv   rS   r   rS   r/   r   )
rO   r    rt   ru   rP   rQ   rv   rS   r/   r@   )
rO   r    r   r?   r   r   r   r   r/   r    )rr   r   rO   r    rt   ru   rW   r@   rv   rS   r   r   r/   r9   )r   r.   r/   r   )	NNNNNNNr   N)rO   r    rw   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r   r   r/   r   )r   r   r/   r   )r8   r   rr   r   r  rS   r/   r  r:   )r  r  r  r  r/   r  )rO   r    rP   rQ   r  r@   r/   r@   )r8   r   r/   r@   )M
__future__r   collections.abcr   ior   osr   pathlibr   typingr   r   r	   Zpolarsr
   r   Zpolars._dependenciesr   Zpolars._utils.variousr   Zpolars.datatypesr   r   r   r   r   Zpolars.datatypes.groupr   r   Zpolars.exceptionsr   Zpolars.selectorsr   r   r   r   r   r  r   r   r   r  r   r    r!   r"   Zpolars._typingr#   r$   r%   r&   r'   r(   Zpolars.exprr)   r5   r   r   r6   __annotations__r7   rc   ri   rq   r   r   r   r   r   r   r   r  r  r  r   r"  r3   r3   r3   r4   <module>   s     



2


6
/ 
F
6