|
1 | | -from typing import Dict, List, Union |
| 1 | +from typing import List, Optional |
2 | 2 |
|
3 | | -from mindee.error.mindee_error import MindeeApiV2Error |
4 | | -from mindee.parsing.common.string_dict import StringDict |
| 3 | +from mindee.parsing.v2.dynamic_field import DynamicField |
5 | 4 |
|
6 | 5 |
|
7 | | -class BaseField: |
8 | | - """Base field class for V2.""" |
| 6 | +class BaseField(DynamicField): |
| 7 | + """Field with base information.""" |
9 | 8 |
|
10 | | - _indent_level: int |
11 | | - """Indentation level for rst display.""" |
12 | | - |
13 | | - def __init__(self, indent_level=0) -> None: |
14 | | - self._indent_level = indent_level |
15 | | - |
16 | | - @staticmethod |
17 | | - def create_field( |
18 | | - raw_response: StringDict, indent_level: int = 0 |
19 | | - ) -> Union["ListField", "ObjectField", "SimpleField"]: |
20 | | - """Factory function to create appropriate field instances.""" |
21 | | - if isinstance(raw_response, dict): |
22 | | - if "items" in raw_response: |
23 | | - return ListField(raw_response, indent_level) |
24 | | - if "fields" in raw_response: |
25 | | - return ObjectField(raw_response, indent_level) |
26 | | - if "value" in raw_response: |
27 | | - return SimpleField(raw_response, indent_level) |
28 | | - raise MindeeApiV2Error(f"Unrecognized field format in {raw_response}.") |
29 | | - raise MindeeApiV2Error(f"Unrecognized field format {raw_response}.") |
30 | | - |
31 | | - |
32 | | -class InferenceFields(Dict[str, Union["SimpleField", "ObjectField", "ListField"]]): |
33 | | - """Inference fields dict.""" |
34 | | - |
35 | | - def __init__(self, raw_response: StringDict, indent_level: int = 0) -> None: |
36 | | - super().__init__() |
37 | | - for key, value in raw_response.items(): |
38 | | - field_obj = BaseField.create_field(value, indent_level) |
39 | | - self[key] = field_obj |
40 | | - |
41 | | - def __getattr__(self, item): |
42 | | - try: |
43 | | - return self[item] |
44 | | - except KeyError: |
45 | | - raise AttributeError(item) from None |
46 | | - |
47 | | - def __str__(self) -> str: |
48 | | - str_fields = "" |
49 | | - for field_key, field_value in self.items(): |
50 | | - str_fields += f":{field_key}: {field_value}" |
51 | | - return str_fields |
52 | | - |
53 | | - |
54 | | -class ListField(BaseField): |
55 | | - """List field containing multiple fields.""" |
56 | | - |
57 | | - items: List[Union["ListField", "ObjectField", "SimpleField"]] |
58 | | - """Items contained in the list.""" |
59 | | - |
60 | | - def __init__(self, raw_response: StringDict, indent_level: int = 0): |
61 | | - super().__init__(indent_level) |
62 | | - |
63 | | - self.items = [] |
64 | | - for item in raw_response["items"]: |
65 | | - if isinstance(item, dict): |
66 | | - self.items.append(BaseField.create_field(item, self._indent_level + 2)) |
67 | | - else: |
68 | | - raise MindeeApiV2Error(f"Unrecognized field format '{item}'.") |
69 | | - |
70 | | - def __str__(self) -> str: |
71 | | - out_str = "" |
72 | | - for item in self.items: |
73 | | - out_str += f"* {str(item)[2:] if item else ''}" |
74 | | - return "\n" + out_str if out_str else "" |
75 | | - |
76 | | - |
77 | | -class ObjectField(BaseField): |
78 | | - """Object field containing multiple fields.""" |
79 | | - |
80 | | - fields: InferenceFields |
81 | | - """Fields contained in the object.""" |
82 | | - |
83 | | - def __init__(self, raw_response: StringDict, indent_level: int = 0): |
84 | | - super().__init__(indent_level) |
85 | | - inner_fields = raw_response.get("fields", raw_response) |
86 | | - |
87 | | - self.fields = InferenceFields(inner_fields, self._indent_level + 1) |
88 | | - |
89 | | - def __str__(self) -> str: |
90 | | - out_str = "" |
91 | | - for field_key, field_value in self.fields.items(): |
92 | | - if isinstance(field_value, ListField): |
93 | | - value_str = "" |
94 | | - if len(field_value.items) > 0: |
95 | | - value_str = ( |
96 | | - " " * self._indent_level + str(field_value) |
97 | | - if field_value |
98 | | - else "" |
99 | | - ) |
100 | | - out_str += f"{' ' * self._indent_level}:{field_key}: {value_str}" |
101 | | - else: |
102 | | - out_str += f"{' ' * self._indent_level}:{field_key}: {field_value if field_value else ''}" |
103 | | - return out_str |
104 | | - |
105 | | - |
106 | | -class SimpleField(BaseField): |
107 | | - """Simple field containing a single value.""" |
108 | | - |
109 | | - value: Union[str, float, bool, None] |
110 | | - |
111 | | - def __init__(self, raw_response: StringDict, indent_level: int = 0): |
112 | | - super().__init__(indent_level) |
113 | | - self.value = raw_response["value"] = raw_response.get("value", None) |
114 | | - |
115 | | - def __str__(self) -> str: |
116 | | - return f"{self.value}\n" if self.value else "\n" |
| 9 | + locations: List |
| 10 | + confidence: Optional[str] |
0 commit comments