Skip to content

Commit ab0a8f6

Browse files
gforsythcpcloud
authored andcommitted
refactor(tests): remove UnorderedComparator class
Merging into `BackendTest` and replacing with class variable
1 parent f95f1d8 commit ab0a8f6

File tree

6 files changed

+42
-35
lines changed

6 files changed

+42
-35
lines changed

docs/contribute/BackendTest.org

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#+title: Backend Test
2+
3+
| Variable | Default | Type | Description | Required |
4+
|-------------------------------------+------------------------------+---------------------------+-------------------------------------------------------------------------+----------|
5+
| ~check_dtype~ | True | Bool | check that dtypes match when comparing Pandas ~series~ | True |
6+
| ~check_names~ | True | Bool | check that column name matches when comparing Pandas ~series~ | True |
7+
| ~supports_arrays~ | True | Bool | backend supports arrays | |
8+
| ~supports_arrays_outside_of_select~ | True | Bool | backend supports arrays outside of select statements | |
9+
| ~supports_window_operations~ | True | Bool | backend supports windowing | |
10+
| ~supports_divide_by_zero~ | False | Bool | backend supports division by zero | |
11+
| ~returned_timestamp_unit~ | "us" | Unit abbreviation | precision of timestamp unit returned | |
12+
| ~supported_to_timestamp_units~ | {"s", "ms", "us"} | Set of unit abbreviations | supported units of precision for timestamps | |
13+
| ~supports_floating_modulus~ | True | Bool | backend supports floating numbers in modulus operations | |
14+
| ~native_bool~ | True | Bool | backend has native boolean types | |
15+
| ~supports_structs~ | True | Bool | backend supports structs | |
16+
| ~supports_json~ | True | Bool | backend supports JSON | |
17+
| ~supports_map~ | False | Bool | backend supports maps basically nothing does except trino and snowflake | |
18+
| ~reduction_tolerance~ | 1e-7 | Float | | |
19+
| ~default_identifier_case_fn~ | staticmethod(toolz.identity) | Function | | |
20+
| ~stateful~ | True | Bool | | |
21+
| ~service_name~ | None | | | |
22+
| ~supports_tpch~ | False | Bool | | |

ibis/backends/bigquery/tests/conftest.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from ibis.backends.bigquery import EXTERNAL_DATA_SCOPES, Backend
1616
from ibis.backends.bigquery.datatypes import BigQuerySchema
1717
from ibis.backends.conftest import TEST_TABLES
18-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero, UnorderedComparator
18+
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
1919
from ibis.backends.tests.data import json_types, non_null_array_types, struct_types, win
2020

2121
DATASET_ID = "ibis_gbq_testing"
@@ -25,18 +25,16 @@
2525
PROJECT_ID_ENV_VAR = "GOOGLE_BIGQUERY_PROJECT_ID"
2626

2727

28-
class TestConf(UnorderedComparator, BackendTest, RoundAwayFromZero):
28+
class TestConf(BackendTest, RoundAwayFromZero):
2929
"""Backend-specific class with information for testing."""
3030

31-
# These were moved from TestConf for use in common test suite.
32-
# TODO: Indicate RoundAwayFromZero and UnorderedComparator.
33-
# https://github.com/ibis-project/ibis-bigquery/issues/30
3431
supports_divide_by_zero = True
3532
supports_floating_modulus = False
3633
returned_timestamp_unit = "us"
3734
supports_structs = True
3835
supports_json = True
3936
check_names = False
37+
force_sort_before_comparison = True
4038
deps = ("google.cloud.bigquery",)
4139

4240
@staticmethod

ibis/backends/clickhouse/tests/conftest.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@
99
import ibis
1010
import ibis.expr.types as ir
1111
from ibis import util
12-
from ibis.backends.tests.base import (
13-
RoundHalfToEven,
14-
ServiceBackendTest,
15-
UnorderedComparator,
16-
)
12+
from ibis.backends.tests.base import RoundHalfToEven, ServiceBackendTest
1713

1814
if TYPE_CHECKING:
1915
from collections.abc import Iterable
@@ -26,13 +22,14 @@
2622
IBIS_TEST_CLICKHOUSE_DB = os.environ.get("IBIS_TEST_DATA_DB", "ibis_testing")
2723

2824

29-
class TestConf(UnorderedComparator, ServiceBackendTest, RoundHalfToEven):
25+
class TestConf(ServiceBackendTest, RoundHalfToEven):
3026
check_dtype = False
3127
supports_window_operations = False
3228
returned_timestamp_unit = "s"
3329
supported_to_timestamp_units = {"s"}
3430
supports_floating_modulus = False
3531
supports_json = False
32+
force_sort_before_comparison = True
3633
data_volume = "/var/lib/clickhouse/user_files/ibis"
3734
service_name = "clickhouse"
3835
deps = ("clickhouse_connect",)

ibis/backends/flink/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
import ibis
88
from ibis.backends.conftest import TEST_TABLES
9-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero, UnorderedComparator
9+
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
1010

1111

12-
class TestConf(UnorderedComparator, BackendTest, RoundAwayFromZero):
12+
class TestConf(BackendTest, RoundAwayFromZero):
1313
supports_structs = False
14+
force_sort_before_comparison = True
1415
deps = "pandas", "pyflink"
1516

1617
@staticmethod

ibis/backends/impala/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,20 @@
1818
from ibis import options, util
1919
from ibis.backends.conftest import TEST_TABLES
2020
from ibis.backends.impala.compiler import ImpalaCompiler, ImpalaExprTranslator
21-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero, UnorderedComparator
21+
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
2222
from ibis.backends.tests.data import win
2323
from ibis.tests.expr.mocks import MockBackend
2424

2525

26-
class TestConf(UnorderedComparator, BackendTest, RoundAwayFromZero):
26+
class TestConf(BackendTest, RoundAwayFromZero):
2727
supports_arrays = True
2828
supports_arrays_outside_of_select = False
2929
check_dtype = False
3030
supports_divide_by_zero = True
3131
returned_timestamp_unit = "s"
3232
supports_structs = False
3333
supports_json = False
34+
force_sort_before_comparison = True
3435
deps = "fsspec", "requests", "impala"
3536

3637
def _load_data(self, **_: Any) -> None:

ibis/backends/tests/base.py

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,6 @@ def round(series: pd.Series, decimals: int = 0) -> pd.Series:
4747
return result if decimals else result.astype(np.int64)
4848

4949

50-
# TODO: Merge into BackendTest, #2564
51-
class UnorderedComparator:
52-
@classmethod
53-
def assert_series_equal(
54-
cls, left: pd.Series, right: pd.Series, *args: Any, **kwargs: Any
55-
) -> None:
56-
left = left.sort_values().reset_index(drop=True)
57-
right = right.sort_values().reset_index(drop=True)
58-
return super().assert_series_equal(left, right, *args, **kwargs)
59-
60-
@classmethod
61-
def assert_frame_equal(
62-
cls, left: pd.DataFrame, right: pd.DataFrame, *args: Any, **kwargs: Any
63-
) -> None:
64-
columns = list(set(left.columns) & set(right.columns))
65-
left = left.sort_values(by=columns)
66-
right = right.sort_values(by=columns)
67-
return super().assert_frame_equal(left, right, *args, **kwargs)
68-
69-
7050
class BackendTest(abc.ABC):
7151
check_dtype = True
7252
check_names = True
@@ -86,6 +66,7 @@ class BackendTest(abc.ABC):
8666
stateful = True
8767
service_name = None
8868
supports_tpch = False
69+
force_sort_before_comparison = False
8970

9071
@property
9172
@abc.abstractmethod
@@ -185,6 +166,9 @@ def postload(self, **_): # noqa: B027
185166
def assert_series_equal(
186167
cls, left: pd.Series, right: pd.Series, *args: Any, **kwargs: Any
187168
) -> None:
169+
if cls.force_sort_before_comparison:
170+
left = left.sort_values().reset_index(drop=True)
171+
right = right.sort_values().reset_index(drop=True)
188172
kwargs.setdefault("check_dtype", cls.check_dtype)
189173
kwargs.setdefault("check_names", cls.check_names)
190174
tm.assert_series_equal(left, right, *args, **kwargs)
@@ -193,6 +177,10 @@ def assert_series_equal(
193177
def assert_frame_equal(
194178
cls, left: pd.DataFrame, right: pd.DataFrame, *args: Any, **kwargs: Any
195179
) -> None:
180+
if cls.force_sort_before_comparison:
181+
columns = list(set(left.columns) & set(right.columns))
182+
left = left.sort_values(by=columns)
183+
right = right.sort_values(by=columns)
196184
left = left.reset_index(drop=True)
197185
right = right.reset_index(drop=True)
198186
kwargs.setdefault("check_dtype", cls.check_dtype)

0 commit comments

Comments
 (0)