§
    cŠtj)  ã            	      ó  — d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZmZ erd dlmZmZmZmZ d d	lmZmZ ej        ej        ej        ej        ej        ej         hZ!d
d
d
ddddddœd(d „Z"d)d"„Z#d*d&„Z$d+d'„Z%dS ),é    )Úannotations)ÚTYPE_CHECKINGÚAny)ÚImplementationÚqualified_type_name)Ú	DataFrameÚ	LazyFrame©Úis_narwhals_dataframeÚis_narwhals_lazyframe)Úassert_series_equal)Úraise_assertion_errorÚraise_frame_assertion_error)ÚArrowÚIntoBackendÚPandasÚPolars)Ú
DataFrameTÚ
LazyFrameTTFgñhãˆµøä>g:Œ0âŽyE>N)Úcheck_row_orderÚcheck_column_orderÚcheck_dtypesÚcheck_exactÚrel_tolÚabs_tolÚcategorical_as_strÚbackendÚleftúDataFrameT | LazyFrameTÚrightr   Úboolr   r   r   r   Úfloatr   r   r   ú+IntoBackend[Polars | Pandas | Arrow] | NoneÚreturnÚNonec               ó~  — d}
t          d„ | |fD ¦   «         ¦  «        rLdt          t          | ¦  «        ¦  «        › dt          t          |¦  «        ¦  «        › d�}t          |¦  «        ‚| j        |j        }}||k    rt          d||¦  «         t          | ||	¬¦  «        \  }}t          ||||||||||¬¦
  «
         d	S )
uG  Assert that the left and right frames are equal.

    Raises a detailed `AssertionError` if the frames differ.
    This function is intended for use in unit tests.

    Warning:
        1. In the case of backends that do not guarantee the row order, such as DuckDB,
            Ibis, PySpark, and SQLFrame, `check_row_order` argument is ignored and the
            comparands are sorted by all the columns regardless.
        2. In the case of lazy backends a [`collect(...)`](lazyframe.md#narwhals.dataframe.LazyFrame.collect)
            operation is triggered.

    Arguments:
        left: The first DataFrame or LazyFrame to compare.
        right: The second DataFrame or LazyFrame to compare.
        check_row_order: Requires row order to match.

            This flag is ignored for backends that do not guarantee row order such as
            DuckDB, Ibis, PySpark, SQLFrame.
        check_column_order: Requires column order to match.
        check_dtypes: Requires data types to match.
        check_exact: Requires float values to match exactly. If set to `False`, values are
            considered equal when within tolerance of each other (see `rel_tol` and `abs_tol`).

            Only affects columns with a Float data type.
        rel_tol: Relative tolerance for inexact checking. Fraction of values in `right`.
        abs_tol: Absolute tolerance for inexact checking.
        categorical_as_str: Cast categorical columns to string before comparing.
            Enabling this helps compare columns that do not share the same string cache.
        backend: Allows to specify which eager backend to collect to.
            Check out [`narwhals.LazyFrame.collect`](lazyframe.md#narwhals.dataframe.LazyFrame.collect)
            for more information.

    Examples:
        >>> import polars as pl
        >>> import narwhals as nw
        >>> from narwhals.testing import assert_frame_equal
        >>>
        >>> left_native = pl.LazyFrame({"a": [1, 2, 3]})
        >>> right_native = pl.LazyFrame({"a": [1, 5, 3]})
        >>> left = nw.from_native(left_native)
        >>> right = nw.from_native(right_native)
        >>> assert_frame_equal(left, right)  # doctest: +ELLIPSIS
        Traceback (most recent call last):
            ...
        AssertionError: DataFrames are different (value mismatch for column "a")
        [left]:
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
        | Narwhals Series |
        |-----------------|
        |shape: (3,)      |
        |Series: 'a' [i64]|
        |[                |
        |        1        |
        |        2        |
        |        3        |
        |]                |
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        [right]:
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
        | Narwhals Series |
        |-----------------|
        |shape: (3,)      |
        |Series: 'a' [i64]|
        |[                |
        |        1        |
        |        5        |
        |        3        |
        |]                |
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
    Tc              3  óT   K  — | ]#}t          |¦  «        pt          |¦  «         V — Œ$d S )Nr
   )Ú.0Úobjs     ú\/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/narwhals/testing/asserts/frame.pyú	<genexpr>z%assert_frame_equal.<locals>.<genexpr>r   sO   è è € ð ð àõ # 3Ñ'Ô'ÐEÕ+@ÀÑ+EÔ+EÐFðð ð ð ð ð ó    zOExpected `narwhals.DataFrame` or `narwhals.LazyFrame` instance, found:
[left]: z

[right]: zŽ

Hint: Use `nw.from_native(obj, allow_series=False)` to convert each native object into a `narwhals.DataFrame` or `narwhals.LazyFrame` first.zimplementation mismatch)r   )
r   r    Úimplr   r   r   r   r   r   r   N)Úanyr   ÚtypeÚ	TypeErrorÚimplementationr   Ú_check_correct_input_typeÚ_assert_dataframe_equal)r   r    r   r   r   r   r   r   r   r   Ú__tracebackhide__ÚmsgÚ	left_implÚ
right_implÚ
left_eagerÚright_eagers                   r*   Úassert_frame_equalr:      s  € ðh Ðå
ð ð à˜%�=ðñ ô ñ ô ð ð
PÝ*­4°©:¬:Ñ6Ô6ðPð På+­D°©K¬KÑ8Ô8ðPð Pð Pð 	õ ˜‰nŒnÐà Ô/°Ô1Eˆz€IØ�JÒÐÝ#Ð$=¸yÈ*ÑUÔUÐUå7¸¸eÈWÐUÑUÔUÑ€J�åØØØØ'Ø-Ø!ØØØØ-ðñ ô ð ð ð r,   ú%tuple[DataFrame[Any], DataFrame[Any]]c                óx  — t          | t          ¦  «        rt          |t          ¦  «        r| |fS t          | t          ¦  «        r?t          |t          ¦  «        r*|                      |¦  «        |                     |¦  «        fS t	          ddt          | ¦  «        j        t          |¦  «        j        ¬¦  «         d S )NÚinputszunexpected input types)r   r    )Ú
isinstancer   r	   Úcollectr   r/   Ú__name__)r   r    r   s      r*   r2   r2   “   s¶   € õ �$�	Ñ"Ô"ð ¥z°%½Ñ'CÔ'Cð Ø�Uˆ{Ðå�$�	Ñ"Ô"ð =¥z°%½Ñ'CÔ'Cð =Ø�|Š|˜GÑ$Ô$ e§m¢m°GÑ&<Ô&<Ð<Ð<åØØ Ý�$‰ZŒZÔ Ý�5‰kŒkÔ"ð	ñ ô ð ð ð r,   r   r-   r   c               ó‚  — t          | |||¬¦  «         t          | ¦  «        t          |¦  «        }}
|
|k    rt          d|
|¦  «         |
dk    rd S | j        }|r	|t          vr[d„ |                     ¦   «         D ¦   «         }|sd}t          |¦  «        ‚|                      |¦  «        } |                     |¦  «        }|                     ¦   «         D ]l}|  	                    |¦  «        }| 	                    |¦  «        }	 t          ||ddd||||	¬¦	  «	         ŒF# t          $ r t          d	||d
|› d�¬¦  «         Y Œiw xY wd S )N)r   r   zheight (row count) mismatchr   c                ó@   — g | ]\  }}|                      ¦   «         °|‘ŒS © )Ú	is_nested)r(   ÚnameÚdtypes      r*   ú
<listcomp>z+_assert_dataframe_equal.<locals>.<listcomp>È   s+   € ÐXÐXÐX™K˜D %ÀeÇoÂoÑFWÔFWÐX�4ÐXÐXÐXr,   zJ`check_row_order=False` is not supported (yet) with only nested data type.FT)r   Úcheck_namesÚcheck_orderr   r   r   r   zvalue mismatch for columnz "ú")Údetailr   r    Údetail_suffix)Ú_check_schema_equalÚlenr   ÚschemaÚGUARANTEES_ROW_ORDERÚitemsÚNotImplementedErrorÚsortÚnamesÚ
get_columnr   ÚAssertionError)r   r    r-   r   r   r   r   r   r   r   Úleft_lenÚ	right_lenÚleft_schemaÚsort_byr5   Úcol_nameÚ_series_leftÚ_series_rights                     r*   r3   r3   §   s»  € õ  Øˆe ,ÐCUðñ ô ð õ ˜d™)œ)¥S¨¡Z¤Zˆi€HØ�9ÒÐÝ#Ð$AÀ8ÈYÑWÔWÐWà�1‚}€}Øˆà”+€KØð $ Õ-AÐ!AÐ!Að
 YÐX¨;×+<Ò+<Ñ+>Ô+>ÐXÑXÔXˆàð 	+à^ˆCÝ% cÑ*Ô*Ð*à�yŠy˜Ñ!Ô!ˆØ—
’
˜7Ñ#Ô#ˆà×%Ò%Ñ'Ô'ð ð ˆØ—’ xÑ0Ô0ˆØ×(Ò(¨Ñ2Ô2ˆð	ÝØØØ"Ø!Ø Ø'ØØØ#5ð
ñ 
ô 
ð 
ð 
øõ ð 	ð 	ð 	Ý'Ø2Ø!Ø#Ø. 8Ð.Ð.Ð.ð	ñ ô ð ð ð ð	øøøðð s   Ã?DÄ!D<Ä;D<c               óŠ  ‡— | j         |j         c}Š|‰k    rdS |                     ¦   «         ‰                     ¦   «         }}t          |¦  «        t          |¦  «        }}t          |                     |¦  «        ¦  «        x}	rt          d|||	› d�¬¦  «         t          |                     |¦  «        ¦  «        x}
rt          d|||
› d�¬¦  «         |r||k    rt          d||¬¦  «         |rR|r‰                     ¦   «         nˆfd„|D ¦   «         }|                     ¦   «         x}|k    rt          d	||¬¦  «         dS dS dS )
zÒCompares DataFrame schema based on specified criteria.

    Adapted from https://github.com/pola-rs/polars/blob/afdbf3056d1228cf493901e45f536b0905cec8ea/crates/polars-testing/src/asserts/utils.rs#L667-L698
    Nzin left, but not in rightú )rK   r   r    Údetail_prefixzin right, but not in leftz!columns are not in the same order)rK   r   r    c                ó    •— g | ]
}‰|         ‘ŒS rC   rC   )r(   r[   Úrschemas     €r*   rG   z'_check_schema_equal.<locals>.<listcomp>  s   ø€ Ð;Ð;Ð;¨�'˜(Ô#Ð;Ð;Ð;r,   zdtypes do not match)rO   rT   ÚsetÚsortedÚ
differencer   Údtypes)r   r    r   r   ÚlschemaÚlnamesÚrnamesÚlsetÚrsetÚleft_not_in_rightÚright_not_in_leftÚrdtypesÚldtypesrb   s                @r*   rM   rM   ê   sº  ø€ ð ”{ E¤LÐ€GˆWð �'ÒÐØˆà—]’]‘_”_ g§m¢m¡o¤oˆF€FÝ�V‘”�c &™kœkˆ$€Då" 4§?¢?°4Ñ#8Ô#8Ñ9Ô9Ð9Ðð 
Ý#Ø.ØØØ.Ð1Ð1Ð1ð		
ñ 	
ô 	
ð 	
õ # 4§?¢?°4Ñ#8Ô#8Ñ9Ô9Ð9Ðð 
Ý#Ø.ØØØ.Ð1Ð1Ð1ð		
ñ 	
ô 	
ð 	
ð ð 
˜f¨Ò.Ð.Ý#Ø6¸VÈ6ð	
ñ 	
ô 	
ð 	
ð ð 
ð "ð<ˆG�NŠNÑÔÐà;Ð;Ð;Ð;°FÐ;Ñ;Ô;ð 	ð —~’~Ñ'Ô'Ð'ˆG¨GÒ3Ð3Ý'Ø,°7À'ðñ ô ð ð ð ð
ð 
ð 4Ð3r,   )r   r   r    r   r   r!   r   r!   r   r!   r   r!   r   r"   r   r"   r   r!   r   r#   r$   r%   )r   r   r    r   r   r#   r$   r;   )r   r   r    r   r-   r   r   r!   r   r!   r   r!   r   r!   r   r"   r   r"   r   r!   r$   r%   )
r   r   r    r   r   r!   r   r!   r$   r%   )&Ú
__future__r   Útypingr   r   Únarwhals._utilsr   r   Únarwhals.dataframer   r	   Únarwhals.dependenciesr   r   Únarwhals.testing.asserts.seriesr   Únarwhals.testing.asserts.utilsr   r   Únarwhals._typingr   r   r   r   Únarwhals.typingr   r   ÚPANDASÚMODINÚCUDFÚPYARROWÚPOLARSÚDASKrP   r:   r2   r3   rM   rC   r,   r*   ú<module>r      s¯  ðØ "Ð "Ð "Ð "Ð "Ð "à %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð ð ð
 ð 7ØCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCØ6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð ÔØÔØÔØÔØÔØÔðÐ ð !Ø#ØØØØØ$Ø;?ðtð tð tð tð tð tðnð ð ð ð(@ð @ð @ð @ðF.ð .ð .ð .ð .ð .r,   