
    }i)              	         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
LazyFrameTTFgh㈵>g:0yE>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     R/home/jrussi/.local/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KK88P P P 	 nn /1EzIJ#$=y*UUU7eW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$$emmG&<&<<< $ZZ 5kk"	     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XKD%eooFWFWX4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ZZiH9#$A8YWWW1}}+K $-A!A!A
 YX;+<+<+>+>XXX 	+^C%c***yy!!

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 )
zCompares 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    {ELGW ']]__gmmooFFVc&kk$D"4??4#8#8999 
#..111		
 	
 	
 	
 #4??4#8#8999 
#..111		
 	
 	
 	
  
f..#6V6	
 	
 	
 	
  
 "<GNN;;;;F;;; 	 ~~'''GG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,   