Skip to content

Commit 082b0fe

Browse files
✨ add simple fields typed accessors
1 parent 50274a8 commit 082b0fe

2 files changed

Lines changed: 101 additions & 0 deletions

File tree

mindee/v2/parsing/inference/field/simple_field.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,27 @@ def __init__(self, raw_response: StringDict, indent_level: int = 0):
1515
else:
1616
self.value = value
1717

18+
@property
19+
def string_value(self) -> str | None:
20+
"""Retrieves a string field value as a string."""
21+
if self.value is not None and not isinstance(self.value, str):
22+
raise ValueError("Value is not a string")
23+
return self.value
24+
25+
@property
26+
def number_value(self) -> float | None:
27+
"""Retrieves a number field value as a float."""
28+
if self.value is not None and not isinstance(self.value, float):
29+
raise ValueError("Value is not a number")
30+
return self.value
31+
32+
@property
33+
def boolean_value(self) -> bool | None:
34+
"""Retrieves a boolean field value as a boolean."""
35+
if self.value is not None and not isinstance(self.value, bool):
36+
raise ValueError("Value is not a boolean")
37+
return self.value
38+
1839
def __str__(self) -> str:
1940
if isinstance(self.value, bool):
2041
return "True" if self.value else "False"
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import pytest
2+
3+
from mindee.v2.parsing.inference.field.simple_field import SimpleField
4+
5+
6+
def _make_field(value) -> SimpleField:
7+
return SimpleField({"value": value} if value is not None else {})
8+
9+
10+
@pytest.mark.v2
11+
class TestSimpleFieldStringValue:
12+
def test_returns_string_when_value_is_string(self):
13+
field = _make_field("hello")
14+
assert field.string_value == "hello"
15+
16+
def test_returns_none_when_value_is_none(self):
17+
field = _make_field(None)
18+
assert field.string_value is None
19+
20+
def test_raises_when_value_is_number(self):
21+
field = _make_field(3.14)
22+
with pytest.raises(ValueError, match="Value is not a string"):
23+
_ = field.string_value
24+
25+
def test_raises_when_value_is_boolean(self):
26+
field = _make_field(True)
27+
with pytest.raises(ValueError, match="Value is not a string"):
28+
_ = field.string_value
29+
30+
31+
@pytest.mark.v2
32+
class TestSimpleFieldNumberValue:
33+
def test_returns_float_when_value_is_float(self):
34+
field = _make_field(3.14)
35+
assert field.number_value == 3.14
36+
37+
def test_returns_float_when_value_is_int(self):
38+
# Integers are coerced to float in the constructor
39+
field = SimpleField({"value": 42})
40+
assert field.number_value == 42.0
41+
assert isinstance(field.number_value, float)
42+
43+
def test_returns_none_when_value_is_none(self):
44+
field = _make_field(None)
45+
assert field.number_value is None
46+
47+
def test_raises_when_value_is_string(self):
48+
field = _make_field("42")
49+
with pytest.raises(ValueError, match="Value is not a number"):
50+
_ = field.number_value
51+
52+
def test_raises_when_value_is_boolean(self):
53+
field = _make_field(True)
54+
with pytest.raises(ValueError, match="Value is not a number"):
55+
_ = field.number_value
56+
57+
58+
@pytest.mark.v2
59+
class TestSimpleFieldBooleanValue:
60+
def test_returns_true_when_value_is_true(self):
61+
field = _make_field(True)
62+
assert field.boolean_value is True
63+
64+
def test_returns_false_when_value_is_false(self):
65+
field = _make_field(False)
66+
assert field.boolean_value is False
67+
68+
def test_returns_none_when_value_is_none(self):
69+
field = _make_field(None)
70+
assert field.boolean_value is None
71+
72+
def test_raises_when_value_is_string(self):
73+
field = _make_field("true")
74+
with pytest.raises(ValueError, match="Value is not a boolean"):
75+
_ = field.boolean_value
76+
77+
def test_raises_when_value_is_number(self):
78+
field = _make_field(1.0)
79+
with pytest.raises(ValueError, match="Value is not a boolean"):
80+
_ = field.boolean_value

0 commit comments

Comments
 (0)