From 57e5d605d7068a95f30f5d56ba91245457eac4fa Mon Sep 17 00:00:00 2001 From: AD Date: Wed, 18 Jun 2025 20:31:02 +0530 Subject: [PATCH 1/3] Fix decimal.FloatOperation error in pytest.approx Decimal __repr__ --- src/_pytest/python_api.py | 11 +++++++++++ testing/test_decimal_approx.py | 12 ++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 testing/test_decimal_approx.py diff --git a/src/_pytest/python_api.py b/src/_pytest/python_api.py index 07794abea95..ad62306cfea 100644 --- a/src/_pytest/python_api.py +++ b/src/_pytest/python_api.py @@ -530,6 +530,17 @@ class ApproxDecimal(ApproxScalar): DEFAULT_ABSOLUTE_TOLERANCE = Decimal("1e-12") DEFAULT_RELATIVE_TOLERANCE = Decimal("1e-6") + def __repr__(self): + rel = Decimal(str(self.rel)) if isinstance(self.rel, float) else self.rel + abs_ = Decimal(str(self.abs)) if isinstance(self.abs, float) else self.abs + if rel is not None and Decimal("1e-3") <= rel <= Decimal("1e3"): + tol_str = f"{rel:.1e}" + elif abs_ is not None: + tol_str = f"{abs_:.1e}" + else: + tol_str = "???" + return f"{self.expected} ± {tol_str}" + def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: """Assert that two numbers (or two ordered sequences of numbers) are equal to each other diff --git a/testing/test_decimal_approx.py b/testing/test_decimal_approx.py new file mode 100644 index 00000000000..34b91e232ac --- /dev/null +++ b/testing/test_decimal_approx.py @@ -0,0 +1,12 @@ +import decimal +import pytest + +def test_decimal_approx_repr_issue(): + trap = decimal.getcontext().traps[decimal.FloatOperation] + decimal.getcontext().traps[decimal.FloatOperation] = False + + approx_obj = pytest.approx(decimal.Decimal("2.60")) + print(f"Attempting to represent pytest.approx(Decimal): {approx_obj}") + assert decimal.Decimal("2.600001") == approx_obj + + decimal.getcontext().traps[decimal.FloatOperation] = trap From dae8cf98064a29c8cb4259796af403e28ddab809 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 15:05:56 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- testing/test_decimal_approx.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/testing/test_decimal_approx.py b/testing/test_decimal_approx.py index 34b91e232ac..eacdab926c5 100644 --- a/testing/test_decimal_approx.py +++ b/testing/test_decimal_approx.py @@ -1,6 +1,10 @@ +from __future__ import annotations + import decimal + import pytest + def test_decimal_approx_repr_issue(): trap = decimal.getcontext().traps[decimal.FloatOperation] decimal.getcontext().traps[decimal.FloatOperation] = False From 95c52879bcb2c65e353bc118b35b6812a1c0eb74 Mon Sep 17 00:00:00 2001 From: Aditi De <92822822+coder-aditi@users.noreply.github.com> Date: Wed, 18 Jun 2025 21:40:11 +0530 Subject: [PATCH 3/3] Update testing/test_decimal_approx.py Co-authored-by: Bruno Oliveira --- testing/test_decimal_approx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/test_decimal_approx.py b/testing/test_decimal_approx.py index eacdab926c5..6cd07399f36 100644 --- a/testing/test_decimal_approx.py +++ b/testing/test_decimal_approx.py @@ -5,7 +5,7 @@ import pytest -def test_decimal_approx_repr_issue(): +def test_decimal_approx_repr_issue() -> None: trap = decimal.getcontext().traps[decimal.FloatOperation] decimal.getcontext().traps[decimal.FloatOperation] = False