Skip to content

Commit 13834be

Browse files
authored
✨ add list field typed accessors (#353)
1 parent 7f28c6f commit 13834be

File tree

7 files changed

+95
-21
lines changed

7 files changed

+95
-21
lines changed

mindee/parsing/v2/field/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from mindee.parsing.v2.field.base_field import BaseField
22
from mindee.parsing.v2.field.field_confidence import FieldConfidence
33
from mindee.parsing.v2.field.field_location import FieldLocation
4+
from mindee.parsing.v2.field.inference_fields import InferenceFields
45
from mindee.parsing.v2.field.list_field import ListField
56
from mindee.parsing.v2.field.object_field import ObjectField
67
from mindee.parsing.v2.field.simple_field import SimpleField
@@ -12,4 +13,5 @@
1213
"ListField",
1314
"ObjectField",
1415
"SimpleField",
16+
"InferenceFields",
1517
]

mindee/parsing/v2/field/inference_result_fields.py renamed to mindee/parsing/v2/field/inference_fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
)
99

1010

11-
class InferenceResultFields(Dict[str, DynamicField]):
11+
class InferenceFields(Dict[str, DynamicField]):
1212
"""Inference fields dict."""
1313

1414
def __init__(self, raw_response: StringDict, indent_level: int = 0) -> None:

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/object_field.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
from mindee.parsing.common.string_dict import StringDict
22
from mindee.parsing.v2.field.base_field import BaseField
33
from mindee.parsing.v2.field.dynamic_field import FieldType
4-
from mindee.parsing.v2.field.inference_result_fields import InferenceResultFields
4+
from mindee.parsing.v2.field.inference_fields import InferenceFields
55

66

77
class ObjectField(BaseField):
88
"""Object field containing multiple fields."""
99

10-
fields: InferenceResultFields
10+
fields: InferenceFields
1111
"""Fields contained in the object."""
1212

1313
def __init__(self, raw_response: StringDict, indent_level: int = 0):
1414
super().__init__(FieldType.OBJECT, raw_response, indent_level)
1515
inner_fields = raw_response.get("fields", raw_response)
1616

17-
self.fields = InferenceResultFields(inner_fields, self._indent_level + 1)
17+
self.fields = InferenceFields(inner_fields, self._indent_level + 1)
1818

1919
def single_str(self) -> str:
2020
"""String representation of a single object field."""

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

mindee/parsing/v2/inference_result.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
from typing import Optional
22

33
from mindee.parsing.common.string_dict import StringDict
4-
from mindee.parsing.v2.field.inference_result_fields import InferenceResultFields
4+
from mindee.parsing.v2.field.inference_fields import InferenceFields
55
from mindee.parsing.v2.raw_text import RawText
66

77

88
class InferenceResult:
99
"""Inference result info."""
1010

11-
fields: InferenceResultFields
11+
fields: InferenceFields
1212
"""Fields contained in the inference."""
1313
raw_text: Optional[RawText] = None
1414
"""Potential options retrieved alongside the inference."""
1515

1616
def __init__(self, raw_response: StringDict) -> None:
17-
self.fields = InferenceResultFields(raw_response["fields"])
17+
self.fields = InferenceFields(raw_response["fields"])
1818
if raw_response.get("raw_text"):
1919
self.raw_text = RawText(raw_response["raw_text"])
2020

tests/v2/test_inference_response.py

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from mindee import InferenceResponse
88
from mindee.parsing.v2.field import FieldConfidence, ListField, ObjectField, SimpleField
9+
from mindee.parsing.v2.field.inference_fields import InferenceFields
910
from mindee.parsing.v2.inference import Inference
1011
from mindee.parsing.v2.inference_file import InferenceFile
1112
from mindee.parsing.v2.inference_model import InferenceModel
@@ -116,6 +117,14 @@ def test_standard_field_types():
116117
assert field_simple_string.confidence == FieldConfidence.CERTAIN
117118
assert str(field_simple_string) == "field_simple_string-value"
118119

120+
field_simple_int = inference_result.inference.result.fields["field_simple_int"]
121+
assert isinstance(field_simple_int, SimpleField)
122+
assert isinstance(field_simple_int.value, float)
123+
124+
field_simple_float = inference_result.inference.result.fields["field_simple_float"]
125+
assert isinstance(field_simple_float, SimpleField)
126+
assert isinstance(field_simple_float.value, float)
127+
119128
field_simple_bool = inference_result.inference.result.fields["field_simple_bool"]
120129
assert isinstance(field_simple_bool, SimpleField)
121130
assert field_simple_bool.value is True
@@ -126,18 +135,55 @@ def test_standard_field_types():
126135
assert field_simple_null.value is None
127136
assert str(field_simple_null) == ""
128137

129-
assert isinstance(
130-
inference_result.inference.result.fields["field_object"], ObjectField
131-
)
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-
)
138138
assert rst_sample == str(inference_result)
139139

140140

141+
@pytest.mark.v2
142+
def test_standard_field_object():
143+
json_sample, _ = _get_inference_samples("standard_field_types")
144+
inference_result = InferenceResponse(json_sample)
145+
146+
object_field = inference_result.inference.result.fields["field_object"]
147+
assert isinstance(object_field, ObjectField)
148+
149+
sub_fields = object_field.fields
150+
assert isinstance(sub_fields, InferenceFields)
151+
assert len(sub_fields) == 2
152+
153+
subfield_1 = sub_fields["subfield_1"]
154+
assert isinstance(subfield_1, SimpleField)
155+
156+
for field_name, sub_field in sub_fields.items():
157+
assert field_name.startswith("subfield_")
158+
assert isinstance(sub_field, SimpleField)
159+
160+
161+
@pytest.mark.v2
162+
def test_standard_field_object_list():
163+
json_sample, _ = _get_inference_samples("standard_field_types")
164+
inference_result = InferenceResponse(json_sample)
165+
assert isinstance(inference_result.inference, Inference)
166+
167+
field_object_list = inference_result.inference.result.fields["field_object_list"]
168+
assert isinstance(field_object_list, ListField)
169+
assert len(field_object_list.items) == 2
170+
for object_field in field_object_list.object_items:
171+
assert isinstance(object_field, ObjectField)
172+
173+
174+
@pytest.mark.v2
175+
def test_standard_field_simple_list():
176+
json_sample, _ = _get_inference_samples("standard_field_types")
177+
inference_result = InferenceResponse(json_sample)
178+
assert isinstance(inference_result.inference, Inference)
179+
180+
field_simple_list = inference_result.inference.result.fields["field_simple_list"]
181+
assert isinstance(field_simple_list, ListField)
182+
assert len(field_simple_list.simple_items) == 2
183+
for object_field in field_simple_list.simple_items:
184+
assert isinstance(object_field, SimpleField)
185+
186+
141187
@pytest.mark.v2
142188
def test_raw_texts():
143189
json_sample, rst_sample = _get_inference_samples("raw_texts")
@@ -159,18 +205,20 @@ def test_full_inference_response():
159205

160206
assert isinstance(inference_result.inference, Inference)
161207
assert inference_result.inference.id == "12345678-1234-1234-1234-123456789abc"
162-
assert isinstance(inference_result.inference.result.fields.date, SimpleField)
208+
assert isinstance(inference_result.inference.result.fields["date"], SimpleField)
163209
assert inference_result.inference.result.fields["date"].value == "2019-11-02"
164-
assert isinstance(inference_result.inference.result.fields.taxes, ListField)
210+
assert isinstance(inference_result.inference.result.fields["taxes"], ListField)
165211
assert isinstance(
166212
inference_result.inference.result.fields["taxes"].items[0], ObjectField
167213
)
168214
assert (
169-
inference_result.inference.result.fields["customer_address"].fields.city.value
215+
inference_result.inference.result.fields["customer_address"]
216+
.fields["city"]
217+
.value
170218
== "New York"
171219
)
172220
assert (
173-
inference_result.inference.result.fields.taxes.items[0].fields["base"].value
221+
inference_result.inference.result.fields["taxes"].items[0].fields["base"].value
174222
== 31.5
175223
)
176224

0 commit comments

Comments
 (0)