Skip to content

Commit 3b730d9

Browse files
gforsythcpcloud
authored andcommitted
refactor(tests): remove test rounding mixins
1 parent ab0a8f6 commit 3b730d9

File tree

18 files changed

+59
-61
lines changed

18 files changed

+59
-61
lines changed

ibis/backends/bigquery/tests/conftest.py

Lines changed: 2 additions & 2 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
18+
from ibis.backends.tests.base import BackendTest
1919
from ibis.backends.tests.data import json_types, non_null_array_types, struct_types, win
2020

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

2727

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

3131
supports_divide_by_zero = True

ibis/backends/clickhouse/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import ibis
1010
import ibis.expr.types as ir
1111
from ibis import util
12-
from ibis.backends.tests.base import RoundHalfToEven, ServiceBackendTest
12+
from ibis.backends.tests.base import ServiceBackendTest
1313

1414
if TYPE_CHECKING:
1515
from collections.abc import Iterable
@@ -22,14 +22,15 @@
2222
IBIS_TEST_CLICKHOUSE_DB = os.environ.get("IBIS_TEST_DATA_DB", "ibis_testing")
2323

2424

25-
class TestConf(ServiceBackendTest, RoundHalfToEven):
25+
class TestConf(ServiceBackendTest):
2626
check_dtype = False
2727
supports_window_operations = False
2828
returned_timestamp_unit = "s"
2929
supported_to_timestamp_units = {"s"}
3030
supports_floating_modulus = False
3131
supports_json = False
3232
force_sort_before_comparison = True
33+
rounding_method = "half_to_even"
3334
data_volume = "/var/lib/clickhouse/user_files/ibis"
3435
service_name = "clickhouse"
3536
deps = ("clickhouse_connect",)

ibis/backends/datafusion/tests/conftest.py

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

77
import ibis
88
from ibis.backends.conftest import TEST_TABLES
9-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
9+
from ibis.backends.tests.base import BackendTest
1010
from ibis.backends.tests.data import array_types, win
1111

1212

13-
class TestConf(BackendTest, RoundAwayFromZero):
13+
class TestConf(BackendTest):
1414
# check_names = False
1515
# supports_divide_by_zero = True
1616
# returned_timestamp_unit = 'ns'

ibis/backends/druid/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from requests import Session
1313

1414
import ibis
15-
from ibis.backends.tests.base import RoundHalfToEven, ServiceBackendTest
15+
from ibis.backends.tests.base import ServiceBackendTest
1616

1717
if TYPE_CHECKING:
1818
from collections.abc import Iterable
@@ -89,7 +89,7 @@ def run_query(session: Session, query: str) -> None:
8989
time.sleep(REQUEST_INTERVAL)
9090

9191

92-
class TestConf(ServiceBackendTest, RoundHalfToEven):
92+
class TestConf(ServiceBackendTest):
9393
# druid has the same rounding behavior as postgres
9494
check_dtype = False
9595
supports_window_operations = False
@@ -99,6 +99,7 @@ class TestConf(ServiceBackendTest, RoundHalfToEven):
9999
native_bool = True
100100
supports_structs = False
101101
supports_json = False # it does, but we haven't implemented it
102+
rounding_method = "half_to_even"
102103
service_name = "druid-middlemanager"
103104
deps = ("pydruid.db.sqlalchemy",)
104105

ibis/backends/duckdb/tests/conftest.py

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

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

1212
if TYPE_CHECKING:
@@ -15,7 +15,7 @@
1515
from ibis.backends.base import BaseBackend
1616

1717

18-
class TestConf(BackendTest, RoundAwayFromZero):
18+
class TestConf(BackendTest):
1919
supports_map = True
2020
deps = "duckdb", "duckdb_engine"
2121
stateful = False

ibis/backends/flink/tests/conftest.py

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

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

1111

12-
class TestConf(BackendTest, RoundAwayFromZero):
12+
class TestConf(BackendTest):
1313
supports_structs = False
1414
force_sort_before_comparison = True
1515
deps = "pandas", "pyflink"

ibis/backends/impala/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
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
21+
from ibis.backends.tests.base import BackendTest
2222
from ibis.backends.tests.data import win
2323
from ibis.tests.expr.mocks import MockBackend
2424

2525

26-
class TestConf(BackendTest, RoundAwayFromZero):
26+
class TestConf(BackendTest):
2727
supports_arrays = True
2828
supports_arrays_outside_of_select = False
2929
check_dtype = False

ibis/backends/mssql/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import ibis
1010
from ibis.backends.conftest import init_database
11-
from ibis.backends.tests.base import RoundHalfToEven, ServiceBackendTest
11+
from ibis.backends.tests.base import ServiceBackendTest
1212

1313
if TYPE_CHECKING:
1414
from collections.abc import Iterable
@@ -21,7 +21,7 @@
2121
IBIS_TEST_MSSQL_DB = os.environ.get("IBIS_TEST_MSSQL_DATABASE", "ibis_testing")
2222

2323

24-
class TestConf(ServiceBackendTest, RoundHalfToEven):
24+
class TestConf(ServiceBackendTest):
2525
# MSSQL has the same rounding behavior as postgres
2626
check_dtype = False
2727
supports_window_operations = False
@@ -30,6 +30,7 @@ class TestConf(ServiceBackendTest, RoundHalfToEven):
3030
supports_arrays_outside_of_select = supports_arrays
3131
supports_structs = False
3232
supports_json = False
33+
rounding_method = "half_to_even"
3334
service_name = "mssql"
3435
deps = "pymssql", "sqlalchemy"
3536

ibis/backends/mysql/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import ibis
1111
from ibis.backends.conftest import TEST_TABLES, init_database
12-
from ibis.backends.tests.base import RoundHalfToEven, ServiceBackendTest
12+
from ibis.backends.tests.base import ServiceBackendTest
1313

1414
if TYPE_CHECKING:
1515
from collections.abc import Iterable
@@ -22,14 +22,15 @@
2222
IBIS_TEST_MYSQL_DB = os.environ.get("IBIS_TEST_MYSQL_DATABASE", "ibis_testing")
2323

2424

25-
class TestConf(ServiceBackendTest, RoundHalfToEven):
25+
class TestConf(ServiceBackendTest):
2626
# mysql has the same rounding behavior as postgres
2727
check_dtype = False
2828
returned_timestamp_unit = "s"
2929
supports_arrays = False
3030
supports_arrays_outside_of_select = supports_arrays
3131
native_bool = False
3232
supports_structs = False
33+
rounding_method = "half_to_even"
3334
service_name = "mysql"
3435
deps = "pymysql", "sqlalchemy"
3536

ibis/backends/oracle/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import sqlalchemy as sa
1212

1313
import ibis
14-
from ibis.backends.tests.base import RoundHalfToEven, ServiceBackendTest
14+
from ibis.backends.tests.base import ServiceBackendTest
1515

1616
if TYPE_CHECKING:
1717
from collections.abc import Iterable
@@ -29,7 +29,7 @@
2929
# where ORACLE_DB is the same name you used in the docker-compose file.
3030

3131

32-
class TestConf(ServiceBackendTest, RoundHalfToEven):
32+
class TestConf(ServiceBackendTest):
3333
check_dtype = False
3434
supports_window_operations = False
3535
returned_timestamp_unit = "s"
@@ -40,6 +40,7 @@ class TestConf(ServiceBackendTest, RoundHalfToEven):
4040
native_bool = False
4141
supports_structs = False
4242
supports_json = False
43+
rounding_method = "half_to_even"
4344
data_volume = "/opt/oracle/data"
4445
service_name = "oracle"
4546
deps = "oracledb", "sqlalchemy"

ibis/backends/pandas/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44

55
import ibis
66
from ibis.backends.conftest import TEST_TABLES
7-
from ibis.backends.tests.base import BackendTest, RoundHalfToEven
7+
from ibis.backends.tests.base import BackendTest
88
from ibis.backends.tests.data import array_types, json_types, struct_types, win
99

1010

11-
class TestConf(BackendTest, RoundHalfToEven):
11+
class TestConf(BackendTest):
1212
check_names = False
1313
supported_to_timestamp_units = BackendTest.supported_to_timestamp_units | {"ns"}
1414
supports_divide_by_zero = True
1515
returned_timestamp_unit = "ns"
1616
stateful = False
17+
rounding_method = "half_to_even"
1718
deps = ("pandas",)
1819

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

ibis/backends/polars/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
import ibis
99
from ibis.backends.conftest import TEST_TABLES
10-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
10+
from ibis.backends.tests.base import BackendTest
1111
from ibis.backends.tests.data import array_types, struct_types, win
1212

1313

14-
class TestConf(BackendTest, RoundAwayFromZero):
14+
class TestConf(BackendTest):
1515
supports_structs = True
1616
supports_json = False
1717
reduction_tolerance = 1e-3

ibis/backends/postgres/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import ibis
2323
from ibis.backends.conftest import init_database
24-
from ibis.backends.tests.base import RoundHalfToEven, ServiceBackendTest
24+
from ibis.backends.tests.base import ServiceBackendTest
2525

2626
if TYPE_CHECKING:
2727
from collections.abc import Iterable
@@ -42,12 +42,13 @@
4242
)
4343

4444

45-
class TestConf(ServiceBackendTest, RoundHalfToEven):
45+
class TestConf(ServiceBackendTest):
4646
# postgres rounds half to even for double precision and half away from zero
4747
# for numeric and decimal
4848

4949
returned_timestamp_unit = "s"
5050
supports_structs = False
51+
rounding_method = "half_to_even"
5152
service_name = "postgres"
5253
deps = "psycopg2", "sqlalchemy"
5354

ibis/backends/pyspark/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
import ibis
1212
from ibis import util
1313
from ibis.backends.conftest import TEST_TABLES
14-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
14+
from ibis.backends.tests.base import BackendTest
1515
from ibis.backends.tests.data import json_types, win
1616

1717

1818
def set_pyspark_database(con, database):
1919
con._session.catalog.setCurrentDatabase(database)
2020

2121

22-
class TestConf(BackendTest, RoundAwayFromZero):
22+
class TestConf(BackendTest):
2323
supported_to_timestamp_units = {"s"}
2424
deps = ("pyspark",)
2525

ibis/backends/snowflake/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import ibis
1414
from ibis.backends.conftest import TEST_TABLES
1515
from ibis.backends.snowflake.datatypes import SnowflakeType
16-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
16+
from ibis.backends.tests.base import BackendTest
1717
from ibis.formats.pyarrow import PyArrowSchema
1818

1919
if TYPE_CHECKING:
@@ -63,7 +63,7 @@ def copy_into(con, data_dir: Path, table: str) -> None:
6363
)
6464

6565

66-
class TestConf(BackendTest, RoundAwayFromZero):
66+
class TestConf(BackendTest):
6767
supports_map = True
6868
default_identifier_case_fn = staticmethod(str.upper)
6969
deps = ("snowflake.connector", "snowflake.sqlalchemy")

ibis/backends/sqlite/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
import ibis
1212
import ibis.expr.types as ir
1313
from ibis.backends.conftest import TEST_TABLES
14-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
14+
from ibis.backends.tests.base import BackendTest
1515

1616

17-
class TestConf(BackendTest, RoundAwayFromZero):
17+
class TestConf(BackendTest):
1818
supports_arrays = False
1919
supports_arrays_outside_of_select = supports_arrays
2020
supports_window_operations = True

ibis/backends/tests/base.py

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,6 @@
2020
import ibis.expr.types as ir
2121

2222

23-
# TODO: Merge into BackendTest, #2564
24-
class RoundingConvention:
25-
@staticmethod
26-
@abc.abstractmethod
27-
def round(series: pd.Series, decimals: int = 0) -> pd.Series:
28-
"""Round a series to `decimals` number of decimal values."""
29-
30-
31-
# TODO: Merge into BackendTest, #2564
32-
class RoundAwayFromZero(RoundingConvention):
33-
@staticmethod
34-
def round(series: pd.Series, decimals: int = 0) -> pd.Series:
35-
if not decimals:
36-
return (-(np.sign(series)) * np.ceil(-(series.abs()) - 0.5)).astype(
37-
np.int64
38-
)
39-
return series.round(decimals=decimals)
40-
41-
42-
# TODO: Merge into BackendTest, #2564
43-
class RoundHalfToEven(RoundingConvention):
44-
@staticmethod
45-
def round(series: pd.Series, decimals: int = 0) -> pd.Series:
46-
result = series.round(decimals=decimals)
47-
return result if decimals else result.astype(np.int64)
48-
49-
5023
class BackendTest(abc.ABC):
5124
check_dtype = True
5225
check_names = True
@@ -67,6 +40,7 @@ class BackendTest(abc.ABC):
6740
service_name = None
6841
supports_tpch = False
6942
force_sort_before_comparison = False
43+
rounding_method = "away_from_zero"
7044

7145
@property
7246
@abc.abstractmethod
@@ -186,6 +160,23 @@ def assert_frame_equal(
186160
kwargs.setdefault("check_dtype", cls.check_dtype)
187161
tm.assert_frame_equal(left, right, *args, **kwargs)
188162

163+
@classmethod
164+
def round(cls, series: pd.Series, decimals: int = 0) -> pd.Series:
165+
return getattr(cls, cls.rounding_method)(series, decimals)
166+
167+
@staticmethod
168+
def away_from_zero(series: pd.Series, decimals: int = 0) -> pd.Series:
169+
if not decimals:
170+
return (-(np.sign(series)) * np.ceil(-(series.abs()) - 0.5)).astype(
171+
np.int64
172+
)
173+
return series.round(decimals=decimals)
174+
175+
@staticmethod
176+
def half_to_even(series: pd.Series, decimals: int = 0) -> pd.Series:
177+
result = series.round(decimals=decimals)
178+
return result if decimals else result.astype(np.int64)
179+
189180
@staticmethod
190181
def default_series_rename(series: pd.Series, name: str = "tmp") -> pd.Series:
191182
return series.rename(name)

ibis/backends/trino/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import ibis.expr.datatypes as dt
1212
import ibis.selectors as s
1313
from ibis.backends.conftest import TEST_TABLES
14-
from ibis.backends.tests.base import BackendTest, RoundAwayFromZero
14+
from ibis.backends.tests.base import BackendTest
1515

1616
if TYPE_CHECKING:
1717
from collections.abc import Iterable
@@ -32,7 +32,7 @@
3232
)
3333

3434

35-
class TestConf(BackendTest, RoundAwayFromZero):
35+
class TestConf(BackendTest):
3636
# trino rounds half to even for double precision and half away from zero
3737
# for numeric and decimal
3838

0 commit comments

Comments
 (0)