Skip to content

Commit 2a846fe

Browse files
committed
feat(builders): support coercion from Builder and Deferred instances
1 parent 1867b40 commit 2a846fe

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

koerce/builders.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,12 @@ def __rxor__(self, other: Any) -> Deferred:
152152

153153
@cython.cclass
154154
class Builder:
155-
# TODO(kszucs): cover with tests
156155
@staticmethod
157-
def __coerce__(value):
156+
def __coerce__(value) -> Builder:
158157
if isinstance(value, Builder):
159158
return value
160159
elif isinstance(value, Deferred):
161-
return value._builder
160+
return cython.cast(Deferred, value)._builder
162161
else:
163162
raise ValueError(f"Cannot coerce {type(value).__name__!r} to Builder")
164163

koerce/tests/test_builders.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
Item,
1919
Just,
2020
Map,
21+
Builder,
2122
Seq,
2223
Unop,
2324
Var,
@@ -510,3 +511,10 @@ def test_deferred_is_not_truthy(obj):
510511
TypeError, match="The truth value of Deferred objects is not defined"
511512
):
512513
bool(obj)
514+
515+
516+
def test_builder_coercion():
517+
assert Builder.__coerce__(Deferred(Var("a"))) == Var("a")
518+
assert Builder.__coerce__(Var("a")) == Var("a")
519+
with pytest.raises(ValueError):
520+
Builder.__coerce__(1)

0 commit comments

Comments
 (0)