Skip to content

Commit f26405c

Browse files
authored
feat: Allow int values for Decimal type constraints (#263)
1 parent 5b9ed98 commit f26405c

2 files changed

Lines changed: 41 additions & 4 deletions

File tree

dataframely/columns/decimal.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ def __init__(
2929
*,
3030
nullable: bool = False,
3131
primary_key: bool = False,
32-
min: decimal.Decimal | None = None,
33-
min_exclusive: decimal.Decimal | None = None,
34-
max: decimal.Decimal | None = None,
35-
max_exclusive: decimal.Decimal | None = None,
32+
min: decimal.Decimal | int | None = None,
33+
min_exclusive: decimal.Decimal | int | None = None,
34+
max: decimal.Decimal | int | None = None,
35+
max_exclusive: decimal.Decimal | int | None = None,
3636
check: Check | None = None,
3737
alias: str | None = None,
3838
metadata: dict[str, Any] | None = None,
@@ -70,6 +70,15 @@ def __init__(
7070
names, the specified alias is the only valid name.
7171
metadata: A dictionary of metadata to attach to the column.
7272
"""
73+
if isinstance(min, int):
74+
min = decimal.Decimal(min)
75+
if isinstance(min_exclusive, int):
76+
min_exclusive = decimal.Decimal(min_exclusive)
77+
if isinstance(max, int):
78+
max = decimal.Decimal(max)
79+
if isinstance(max_exclusive, int):
80+
max_exclusive = decimal.Decimal(max_exclusive)
81+
7382
if min is not None:
7483
_validate(min, precision, scale, "min")
7584
if min_exclusive is not None:

tests/column_types/test_decimal.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,34 @@ def test_args_zero_and_negative_min_max(kwargs: dict[str, Any]) -> None:
4747
dy.Decimal(**kwargs)
4848

4949

50+
@pytest.mark.parametrize(
51+
"kwargs",
52+
[
53+
{"min": 0},
54+
{"min_exclusive": 0},
55+
{"max": 0},
56+
{"max_exclusive": 0},
57+
{"min": -2, "max": 0},
58+
{"min_exclusive": -2, "max_exclusive": 0},
59+
],
60+
)
61+
def test_int_args_for_min_max(kwargs: dict[str, Any]) -> None:
62+
dy.Decimal(**kwargs)
63+
64+
65+
def test_validate_int_args_for_min_max() -> None:
66+
column = dy.Decimal(min=0, max_exclusive=3, nullable=True)
67+
lf = pl.LazyFrame({"a": [-1, 0, 1, 2, 3]})
68+
actual = evaluate_rules(lf, rules_from_exprs(column.validation_rules(pl.col("a"))))
69+
expected = pl.LazyFrame(
70+
{
71+
"min": [False, True, True, True, True],
72+
"max_exclusive": [True, True, True, True, False],
73+
}
74+
)
75+
assert_frame_equal(actual, expected)
76+
77+
5078
@pytest.mark.parametrize(
5179
"kwargs",
5280
[

0 commit comments

Comments
 (0)