Skip to content

Commit e044fc5

Browse files
committed
✨ add list field typed accessors
1 parent 7f28c6f commit e044fc5

File tree

3 files changed

+65
-11
lines changed

3 files changed

+65
-11
lines changed

mindee/parsing/v2/field/list_field.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
FieldType,
88
get_field_type,
99
)
10+
from mindee.parsing.v2.field.object_field import ObjectField
11+
from mindee.parsing.v2.field.simple_field import SimpleField
1012

1113

1214
class ListField(BaseField):
@@ -22,6 +24,28 @@ def __init__(self, raw_response: StringDict, indent_level: int = 0):
2224
for item in raw_response["items"]:
2325
self.items.append(get_field_type(item))
2426

27+
@property
28+
def simple_items(self) -> List[SimpleField]:
29+
"""List of items as ``SimpleField``."""
30+
simple_items = []
31+
for item in self.items:
32+
if isinstance(item, SimpleField):
33+
simple_items.append(item)
34+
else:
35+
raise ValueError("List item is not a simple field.")
36+
return simple_items
37+
38+
@property
39+
def object_items(self) -> List[ObjectField]:
40+
"""List of items as ``ObjectField``."""
41+
object_items = []
42+
for item in self.items:
43+
if isinstance(item, ObjectField):
44+
object_items.append(item)
45+
else:
46+
raise ValueError("List item is not an object field.")
47+
return object_items
48+
2549
def __str__(self) -> str:
2650
out_str = ""
2751
indent = " " * self._indent_level

mindee/parsing/v2/field/simple_field.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class SimpleField(BaseField):
1313
def __init__(self, raw_response: StringDict, indent_level: int = 0):
1414
super().__init__(FieldType.SIMPLE, raw_response, indent_level)
1515
value = raw_response.get("value", None)
16-
if isinstance(value, int) and not isinstance(raw_response.get("value"), bool):
16+
if isinstance(value, int) and not isinstance(value, bool):
1717
self.value = float(value)
1818
else:
1919
self.value = value

tests/v2/test_inference_response.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,14 @@ def test_standard_field_types():
116116
assert field_simple_string.confidence == FieldConfidence.CERTAIN
117117
assert str(field_simple_string) == "field_simple_string-value"
118118

119+
field_simple_int = inference_result.inference.result.fields["field_simple_int"]
120+
assert isinstance(field_simple_int, SimpleField)
121+
assert isinstance(field_simple_int.value, float)
122+
123+
field_simple_float = inference_result.inference.result.fields["field_simple_float"]
124+
assert isinstance(field_simple_float, SimpleField)
125+
assert isinstance(field_simple_float.value, float)
126+
119127
field_simple_bool = inference_result.inference.result.fields["field_simple_bool"]
120128
assert isinstance(field_simple_bool, SimpleField)
121129
assert field_simple_bool.value is True
@@ -129,15 +137,35 @@ def test_standard_field_types():
129137
assert isinstance(
130138
inference_result.inference.result.fields["field_object"], ObjectField
131139
)
132-
assert isinstance(
133-
inference_result.inference.result.fields["field_simple_list"], ListField
134-
)
135-
assert isinstance(
136-
inference_result.inference.result.fields["field_object_list"], ListField
137-
)
138140
assert rst_sample == str(inference_result)
139141

140142

143+
@pytest.mark.v2
144+
def test_standard_field_object_list():
145+
json_sample, _ = _get_inference_samples("standard_field_types")
146+
inference_result = InferenceResponse(json_sample)
147+
assert isinstance(inference_result.inference, Inference)
148+
149+
field_object_list = inference_result.inference.result.fields["field_object_list"]
150+
assert isinstance(field_object_list, ListField)
151+
assert len(field_object_list.items) == 2
152+
for object_field in field_object_list.object_items:
153+
assert isinstance(object_field, ObjectField)
154+
155+
156+
@pytest.mark.v2
157+
def test_standard_field_simple_list():
158+
json_sample, _ = _get_inference_samples("standard_field_types")
159+
inference_result = InferenceResponse(json_sample)
160+
assert isinstance(inference_result.inference, Inference)
161+
162+
field_simple_list = inference_result.inference.result.fields["field_simple_list"]
163+
assert isinstance(field_simple_list, ListField)
164+
assert len(field_simple_list.simple_items) == 2
165+
for object_field in field_simple_list.simple_items:
166+
assert isinstance(object_field, SimpleField)
167+
168+
141169
@pytest.mark.v2
142170
def test_raw_texts():
143171
json_sample, rst_sample = _get_inference_samples("raw_texts")
@@ -159,18 +187,20 @@ def test_full_inference_response():
159187

160188
assert isinstance(inference_result.inference, Inference)
161189
assert inference_result.inference.id == "12345678-1234-1234-1234-123456789abc"
162-
assert isinstance(inference_result.inference.result.fields.date, SimpleField)
190+
assert isinstance(inference_result.inference.result.fields["date"], SimpleField)
163191
assert inference_result.inference.result.fields["date"].value == "2019-11-02"
164-
assert isinstance(inference_result.inference.result.fields.taxes, ListField)
192+
assert isinstance(inference_result.inference.result.fields["taxes"], ListField)
165193
assert isinstance(
166194
inference_result.inference.result.fields["taxes"].items[0], ObjectField
167195
)
168196
assert (
169-
inference_result.inference.result.fields["customer_address"].fields.city.value
197+
inference_result.inference.result.fields["customer_address"]
198+
.fields["city"]
199+
.value
170200
== "New York"
171201
)
172202
assert (
173-
inference_result.inference.result.fields.taxes.items[0].fields["base"].value
203+
inference_result.inference.result.fields["taxes"].items[0].fields["base"].value
174204
== 31.5
175205
)
176206

0 commit comments

Comments
 (0)