Skip to content

Commit 4a89a16

Browse files
committed
"compliant" -> "interchange"
1 parent b30af16 commit 4a89a16

File tree

5 files changed

+34
-57
lines changed

5 files changed

+34
-57
lines changed

tests/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ def pytest_configure(config):
3838

3939

4040
ci_failing_ids = [
41-
# dataframe objects return the interchange dataframe, not a dict
41+
# dataframe objects return the interchange dataframe, not a dict, although
42+
# this behaviour might be in the spec soon.
4243
"test_dataframe_object.py::test_toplevel_dunder_dataframe[pandas]",
4344
"test_dataframe_object.py::test_toplevel_dunder_dataframe[vaex]",
4445
"test_dataframe_object.py::test_toplevel_dunder_dataframe[modin]",

tests/test_dataframe_object.py

Lines changed: 19 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,36 @@
1-
from typing import Callable, Iterable
1+
from typing import Iterable
22

3-
import numpy as np
4-
import pytest
53
from hypothesis import assume, given
64
from hypothesis import strategies as st
75

8-
from .strategies import MockColumn, MockDataFrame, NominalDtype, mock_dataframes
6+
from .strategies import mock_dataframes
97
from .wrappers import LibraryInfo
108

119

12-
def test_library_supports_zero_cols(libinfo: LibraryInfo):
13-
if not libinfo.allow_zero_cols:
14-
pytest.xfail("library doesn't support zero cols")
15-
mock_df = MockDataFrame({})
16-
df = libinfo.mock_to_toplevel(mock_df)
17-
# Just initialising a dataframe might not catch that a library doesn't
18-
# support zero-column dataframes - using a method like repr might!
19-
repr(df)
20-
21-
22-
def test_library_supports_zero_rows(libinfo: LibraryInfo):
23-
if not libinfo.allow_zero_rows:
24-
pytest.xfail("library doesn't support zero rows")
25-
mock_df = MockDataFrame(
26-
{"foo_col": MockColumn(np.asarray([], dtype=np.int64), NominalDtype.INT64)}
27-
)
28-
df = libinfo.mock_to_toplevel(mock_df)
29-
# See above comment
30-
repr(df)
31-
32-
33-
def _test_dunder_dataframe(df):
10+
@given(data=st.data())
11+
def test_toplevel_dunder_dataframe(libinfo: LibraryInfo, data: st.DataObject):
12+
df = data.draw(libinfo.toplevel_dataframes(), label="df")
3413
assert hasattr(df, "__dataframe__")
35-
assert isinstance(df.__dataframe__, Callable)
3614
out = df.__dataframe__()
3715
assert isinstance(out, dict)
3816
assert hasattr(out, "dataframe")
3917
assert hasattr(out, "version")
4018

4119

42-
@given(data=st.data())
43-
def test_toplevel_dunder_dataframe(libinfo: LibraryInfo, data: st.DataObject):
44-
df = data.draw(libinfo.toplevel_dataframes(), label="df")
45-
_test_dunder_dataframe(df)
46-
47-
4820
@given(data=st.data())
4921
def test_dunder_dataframe(libinfo: LibraryInfo, data: st.DataObject):
50-
df = data.draw(libinfo.compliant_dataframes(), label="df")
51-
_test_dunder_dataframe(df)
22+
df = data.draw(libinfo.interchange_dataframes(), label="df")
23+
assert hasattr(df, "__dataframe__")
24+
out = df.__dataframe__()
25+
assert isinstance(out, dict)
26+
assert hasattr(out, "dataframe")
27+
assert hasattr(out, "version")
5228

5329

5430
@given(data=st.data())
5531
def test_num_columns(libinfo: LibraryInfo, data: st.DataObject):
5632
mock_df = data.draw(libinfo.mock_dataframes(), label="mock_df")
57-
df = libinfo.mock_to_compliant(mock_df)
33+
df = libinfo.mock_to_interchange(mock_df)
5834
out = df.num_columns()
5935
assert isinstance(out, int)
6036
assert out == mock_df.num_columns()
@@ -66,7 +42,7 @@ def test_num_rows(libinfo: LibraryInfo, data: st.DataObject):
6642
mock_dataframes(**{**libinfo.mock_dataframes_kwargs, "allow_zero_cols": False}),
6743
label="mock_df",
6844
)
69-
df = libinfo.mock_to_compliant(mock_df)
45+
df = libinfo.mock_to_interchange(mock_df)
7046
out = df.num_rows()
7147
assume(out is not None)
7248
assert isinstance(out, int)
@@ -76,7 +52,7 @@ def test_num_rows(libinfo: LibraryInfo, data: st.DataObject):
7652
@given(data=st.data())
7753
def test_num_chunks(libinfo: LibraryInfo, data: st.DataObject):
7854
mock_df = data.draw(libinfo.mock_dataframes(), label="mock_df")
79-
df = libinfo.mock_to_compliant(mock_df)
55+
df = libinfo.mock_to_interchange(mock_df)
8056
out = df.num_chunks()
8157
assert isinstance(out, int)
8258
# result is implementation-dependant
@@ -85,7 +61,7 @@ def test_num_chunks(libinfo: LibraryInfo, data: st.DataObject):
8561
@given(data=st.data())
8662
def test_column_names(libinfo: LibraryInfo, data: st.DataObject):
8763
mock_df = data.draw(libinfo.mock_dataframes(), label="mock_df")
88-
df = libinfo.mock_to_compliant(mock_df)
64+
df = libinfo.mock_to_interchange(mock_df)
8965
out = df.column_names()
9066
assert isinstance(out, Iterable)
9167
assert len(list(out)) == len(mock_df)
@@ -100,7 +76,7 @@ def test_get_column(libinfo: LibraryInfo, data: st.DataObject):
10076
mock_dataframes(**{**libinfo.mock_dataframes_kwargs, "allow_zero_cols": False}),
10177
label="mock_df",
10278
)
103-
df = libinfo.mock_to_compliant(mock_df)
79+
df = libinfo.mock_to_interchange(mock_df)
10480
for i in range(len(mock_df)):
10581
df.get_column(i)
10682

@@ -111,7 +87,7 @@ def test_select_columns(libinfo: LibraryInfo, data: st.DataObject):
11187
mock_dataframes(**{**libinfo.mock_dataframes_kwargs, "allow_zero_cols": False}),
11288
label="mock_df",
11389
)
114-
df = libinfo.mock_to_compliant(mock_df)
90+
df = libinfo.mock_to_interchange(mock_df)
11591
indices = data.draw(
11692
st.lists(st.integers(0, len(mock_df) - 1), min_size=1, unique=True),
11793
label="indices",
@@ -125,7 +101,7 @@ def test_select_columns_by_name(libinfo: LibraryInfo, data: st.DataObject):
125101
mock_dataframes(**{**libinfo.mock_dataframes_kwargs, "allow_zero_cols": False}),
126102
label="mock_df",
127103
)
128-
df = libinfo.mock_to_compliant(mock_df)
104+
df = libinfo.mock_to_interchange(mock_df)
129105
names = data.draw(
130106
st.lists(st.sampled_from(list(mock_df.keys())), min_size=1, unique=True),
131107
label="names",
@@ -135,7 +111,7 @@ def test_select_columns_by_name(libinfo: LibraryInfo, data: st.DataObject):
135111

136112
@given(data=st.data())
137113
def test_get_chunks(libinfo: LibraryInfo, data: st.DataObject):
138-
df = data.draw(libinfo.compliant_dataframes(), label="df")
114+
df = data.draw(libinfo.interchange_dataframes(), label="df")
139115
_n_chunks = df.num_chunks()
140116
assert isinstance(_n_chunks, int) # sanity check
141117
n_chunks = data.draw(

tests/test_meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def test_mock_dataframes(_):
1616

1717

1818
@pytest.mark.parametrize(
19-
"func_name", ["mock_dataframes", "toplevel_dataframes", "compliant_dataframes"]
19+
"func_name", ["mock_dataframes", "toplevel_dataframes", "interchange_dataframes"]
2020
)
2121
@given(data=st.data())
2222
def test_strategy(libinfo: LibraryInfo, func_name: str, data: st.DataObject):

tests/test_signatures.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def test_toplevel_dataframe_dunder_dataframe(libinfo: LibraryInfo, data: st.Data
9191
def test_dataframe_method(
9292
libinfo: LibraryInfo, stub: FunctionType, data: st.DataObject
9393
):
94-
df = data.draw(libinfo.compliant_dataframes(), label="df")
94+
df = data.draw(libinfo.interchange_dataframes(), label="df")
9595
assert hasattr(df, stub.__name__)
9696
method = getattr(df, stub.__name__)
9797
assert isinstance(method, Callable) # type: ignore
@@ -108,7 +108,7 @@ def test_dataframe_method(
108108
@given(data=st.data())
109109
@settings(max_examples=1)
110110
def test_column_method(libinfo: LibraryInfo, stub: FunctionType, data: st.DataObject):
111-
df = data.draw(libinfo.compliant_dataframes(), label="df")
111+
df = data.draw(libinfo.interchange_dataframes(), label="df")
112112
assume(df.num_columns() > 0)
113113
col = df.get_column(0)
114114
note(f"{col=}")
@@ -128,7 +128,7 @@ def test_column_method(libinfo: LibraryInfo, stub: FunctionType, data: st.DataOb
128128
@given(data=st.data())
129129
@settings(max_examples=1)
130130
def test_buffer_method(libinfo: LibraryInfo, stub: FunctionType, data: st.DataObject):
131-
df = data.draw(libinfo.compliant_dataframes(), label="df")
131+
df = data.draw(libinfo.interchange_dataframes(), label="df")
132132
assume(df.num_columns() > 0)
133133
col = df.get_column(0)
134134
note(f"{col=}")

tests/wrappers.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ class LibraryInfo(NamedTuple):
1919
mock_to_toplevel: Callable[[MockDataFrame], TopLevelDataFrame]
2020
from_dataframe: Callable[[TopLevelDataFrame], DataFrame]
2121
frame_equal: Callable[[TopLevelDataFrame, DataFrame], bool]
22-
toplevel_to_compliant: Callable[[TopLevelDataFrame], DataFrame] = lambda df: (
22+
toplevel_to_interchange: Callable[[TopLevelDataFrame], DataFrame] = lambda df: (
2323
df.__dataframe__()["dataframe"]
2424
)
2525
exclude_dtypes: List[NominalDtype] = []
2626
allow_zero_cols: bool = True
2727
allow_zero_rows: bool = True
2828

29-
def mock_to_compliant(self, mock_dataframe: MockDataFrame) -> DataFrame:
30-
return self.toplevel_to_compliant(self.mock_to_toplevel(mock_dataframe))
29+
def mock_to_interchange(self, mock_dataframe: MockDataFrame) -> DataFrame:
30+
return self.toplevel_to_interchange(self.mock_to_toplevel(mock_dataframe))
3131

3232
@property
3333
def mock_dataframes_kwargs(self) -> Dict[str, Any]:
@@ -43,8 +43,8 @@ def mock_dataframes(self) -> st.SearchStrategy[MockDataFrame]:
4343
def toplevel_dataframes(self) -> st.SearchStrategy[TopLevelDataFrame]:
4444
return self.mock_dataframes().map(self.mock_to_toplevel)
4545

46-
def compliant_dataframes(self) -> st.SearchStrategy[TopLevelDataFrame]:
47-
return self.toplevel_dataframes().map(self.toplevel_to_compliant)
46+
def interchange_dataframes(self) -> st.SearchStrategy[TopLevelDataFrame]:
47+
return self.toplevel_dataframes().map(self.toplevel_to_interchange)
4848

4949
def __repr__(self) -> str:
5050
return f"LibraryInfo(<{self.name}>)"
@@ -82,7 +82,7 @@ def pandas_mock_to_toplevel(mock_df: MockDataFrame) -> pd.DataFrame:
8282
mock_to_toplevel=pandas_mock_to_toplevel,
8383
from_dataframe=pandas_from_dataframe,
8484
frame_equal=lambda df1, df2: df1.equals(df2),
85-
toplevel_to_compliant=lambda df: df.__dataframe__(),
85+
toplevel_to_interchange=lambda df: df.__dataframe__(),
8686
exclude_dtypes=[NominalDtype.DATETIME64NS],
8787
)
8888
libinfo_params.append(pytest.param(pandas_libinfo, id=pandas_libinfo.name))
@@ -140,7 +140,7 @@ def vaex_frame_equal(df1, df2) -> bool:
140140
mock_to_toplevel=vaex_mock_to_toplevel,
141141
from_dataframe=vaex_from_dataframe,
142142
frame_equal=vaex_frame_equal,
143-
toplevel_to_compliant=lambda df: df.__dataframe__(),
143+
toplevel_to_interchange=lambda df: df.__dataframe__(),
144144
exclude_dtypes=[NominalDtype.DATETIME64NS],
145145
# https://github.com/vaexio/vaex/issues/2094
146146
allow_zero_cols=False,
@@ -220,7 +220,7 @@ def modin_frame_equal(df1: mpd.DataFrame, df2: mpd.DataFrame) -> bool:
220220
mock_to_toplevel=modin_mock_to_toplevel,
221221
from_dataframe=modin_from_dataframe,
222222
frame_equal=modin_frame_equal,
223-
toplevel_to_compliant=lambda df: df.__dataframe__(),
223+
toplevel_to_interchange=lambda df: df.__dataframe__(),
224224
# https://github.com/modin-project/modin/issues/4654
225225
# https://github.com/modin-project/modin/issues/4652
226226
exclude_dtypes=[
@@ -292,7 +292,7 @@ def cudf_mock_to_toplevel(mock_df: MockDataFrame) -> cudf.DataFrame:
292292
mock_to_toplevel=cudf_mock_to_toplevel,
293293
from_dataframe=cudf_from_dataframe,
294294
frame_equal=lambda df1, df2: df1.equals(df2), # NaNs considered equal
295-
toplevel_to_compliant=lambda df: df.__dataframe__(),
295+
toplevel_to_interchange=lambda df: df.__dataframe__(),
296296
)
297297
libinfo_params.append(pytest.param(cupy_libinfo, id=cupy_libinfo.name))
298298

0 commit comments

Comments
 (0)