Skip to content

Commit 3051e66

Browse files
authored
:chg: ✨ Make sure all document information is printed (#57)
1 parent ec99757 commit 3051e66

File tree

12 files changed

+114
-109
lines changed

12 files changed

+114
-109
lines changed

mindee/documents/invoice.py

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -183,31 +183,24 @@ def build_from_api_prediction(self, api_prediction: dict, page_n=0):
183183
)
184184

185185
def __str__(self) -> str:
186+
company_numbers = "; ".join([str(n.value) for n in self.company_number])
187+
payments = ", ".join([str(p) for p in self.payment_details])
188+
taxes = ", ".join([f"{t.value} {t.rate}%" for t in self.taxes])
186189
return (
187190
"-----Invoice data-----\n"
188-
"Filename: %s \n"
189-
"Invoice number: %s \n"
190-
"Total amount including taxes: %s \n"
191-
"Total amount excluding taxes: %s \n"
192-
"Invoice date: %s\n"
193-
"Invoice due date: %s\n"
194-
"Supplier name: %s\n"
195-
"Payment details: %s\n"
196-
"Taxes: %s\n"
197-
"Total taxes: %s\n"
191+
f"Filename: {self.filename}\n"
192+
f"Invoice number: {self.invoice_number.value}\n"
193+
f"Total amount including taxes: {self.total_incl.value}\n"
194+
f"Total amount excluding taxes: {self.total_excl.value}\n"
195+
f"Invoice date: {self.invoice_date.value}\n"
196+
f"Invoice due date: {self.due_date.value}\n"
197+
f"Supplier name: {self.supplier.value}\n"
198+
f"Payment details: {payments}\n"
199+
f"Company numbers: {company_numbers}\n"
200+
f"Taxes: {taxes}\n"
201+
f"Total taxes: {self.total_tax.value}\n"
202+
f"Locale: {self.locale}\n"
198203
"----------------------"
199-
% (
200-
self.filename,
201-
self.invoice_number.value,
202-
self.total_incl.value,
203-
self.total_excl.value,
204-
self.invoice_date.value,
205-
self.due_date.value,
206-
self.supplier.value,
207-
", ".join([str(p) for p in self.payment_details]),
208-
", ".join([str(t.value) + " " + str(t.rate) + "%" for t in self.taxes]),
209-
self.total_tax.value,
210-
)
211204
)
212205

213206
@staticmethod

mindee/documents/passport.py

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -150,40 +150,27 @@ def build_from_api_prediction(self, api_prediction, page_n=0):
150150
self.full_name = Field({"value": None, "confidence": 0.0}, page_n=page_n)
151151

152152
def __str__(self) -> str:
153+
given_names = " ".join(
154+
[
155+
given_name.value if given_name.value is not None else ""
156+
for given_name in self.given_names
157+
]
158+
)
153159
return (
154160
"-----Passport data-----\n"
155-
"Filename: %s \n"
156-
"Full name: %s \n"
157-
"Given names: %s \n"
158-
"Surname: %s\n"
159-
"Country: %s\n"
160-
"ID Number: %s\n"
161-
"Issuance date: %s\n"
162-
"Birth date: %s\n"
163-
"Expiry date: %s\n"
164-
"MRZ 1: %s\n"
165-
"MRZ 2: %s\n"
166-
"MRZ: %s\n"
161+
f"Filename: {self.filename}\n"
162+
f"Full name: {self.full_name.value}\n"
163+
f"Given names: {given_names}\n"
164+
f"Surname: {self.surname.value}\n"
165+
f"Country: {self.country.value}\n"
166+
f"ID Number: {self.id_number.value}\n"
167+
f"Issuance date: {self.issuance_date.value}\n"
168+
f"Birth date: {self.birth_date.value}\n"
169+
f"Expiry date: {self.expiry_date.value}\n"
170+
f"MRZ 1: {self.mrz1.value}\n"
171+
f"MRZ 2: {self.mrz2.value}\n"
172+
f"MRZ: {self.mrz.value}\n"
167173
"----------------------"
168-
% (
169-
self.filename,
170-
self.full_name.value,
171-
" ".join(
172-
[
173-
given_name.value if given_name.value is not None else ""
174-
for given_name in self.given_names
175-
]
176-
),
177-
self.surname.value,
178-
self.country.value,
179-
self.id_number.value,
180-
self.issuance_date.value,
181-
self.birth_date.value,
182-
self.expiry_date.value,
183-
self.mrz1.value,
184-
self.mrz2.value,
185-
self.mrz.value,
186-
)
187174
)
188175

189176
def is_expired(self):

mindee/documents/receipt.py

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -125,29 +125,20 @@ def get_document_config() -> DocumentConfig:
125125
)
126126

127127
def __str__(self) -> str:
128+
taxes = ", ".join([f"{t.value} {t.rate}%" for t in self.taxes])
128129
return (
129130
"-----Receipt data-----\n"
130-
"Filename: %s\n"
131-
"Total amount including taxes: %s \n"
132-
"Total amount excluding taxes: %s \n"
133-
"Date: %s\n"
134-
"Category: %s\n"
135-
"Time: %s\n"
136-
"Merchant name: %s\n"
137-
"Taxes: %s\n"
138-
"Total taxes: %s\n"
131+
f"Filename: {self.filename}\n"
132+
f"Total amount including taxes: {self.total_incl.value}\n"
133+
f"Total amount excluding taxes: {self.total_excl.value}\n"
134+
f"Date: {self.date.value}\n"
135+
f"Category: {self.category.value}\n"
136+
f"Time: {self.time.value}\n"
137+
f"Merchant name: {self.merchant_name.value}\n"
138+
f"Taxes: {taxes}\n"
139+
f"Total taxes: {self.total_tax.value}\n"
140+
f"Locale: {self.locale}\n"
139141
"----------------------"
140-
% (
141-
self.filename,
142-
self.total_incl.value,
143-
self.total_excl.value,
144-
self.date.value,
145-
self.category.value,
146-
self.time.value,
147-
self.merchant_name.value,
148-
" - ".join([str(t) for t in self.taxes]),
149-
self.total_tax.value,
150-
)
151142
)
152143

153144
def build_from_api_prediction(self, api_prediction, page_n=0):

mindee/fields/amount.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
from typing import Optional
12
from mindee.fields.base import Field
23

34

45
class Amount(Field):
6+
value: Optional[float] = None
7+
58
def __init__(
69
self, amount_prediction, value_key="amount", reconstructed=False, page_n=None
710
):

mindee/fields/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional, Any, List
1+
from typing import Optional, Any, List, Dict
22

33

44
class Field:
@@ -8,8 +8,8 @@ class Field:
88

99
def __init__(
1010
self,
11-
abstract_prediction,
12-
value_key="value",
11+
abstract_prediction: Dict[str, Any],
12+
value_key: str = "value",
1313
reconstructed=False,
1414
extra_fields=None,
1515
page_n=None,

mindee/fields/locale.py

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
from typing import Optional
12
from mindee.fields.base import Field
23

34

45
class Locale(Field):
6+
language: Optional[str] = None
7+
country: Optional[str] = None
8+
currency: Optional[str] = None
9+
510
def __init__(
611
self, locale_prediction, value_key="value", reconstructed=False, page_n=None
712
):
@@ -17,27 +22,25 @@ def __init__(
1722
reconstructed=reconstructed,
1823
page_n=page_n,
1924
)
25+
self.language = self._get_value(locale_prediction, "language")
26+
self.country = self._get_value(locale_prediction, "country")
27+
self.currency = self._get_value(locale_prediction, "currency")
2028

29+
@staticmethod
30+
def _get_value(locale_prediction, key: str):
2131
if (
22-
"language" not in locale_prediction.keys()
32+
key not in locale_prediction.keys()
2333
or locale_prediction["language"] == "N/A"
2434
):
25-
self.language = None
26-
else:
27-
self.language = locale_prediction["language"]
28-
29-
if (
30-
"country" not in locale_prediction.keys()
31-
or locale_prediction["country"] == "N/A"
32-
):
33-
self.country = None
34-
else:
35-
self.country = locale_prediction["country"]
35+
return None
36+
return locale_prediction[key]
3637

37-
if (
38-
"currency" not in locale_prediction.keys()
39-
or locale_prediction["currency"] == "N/A"
40-
):
41-
self.currency = None
42-
else:
43-
self.currency = locale_prediction["currency"]
38+
def __str__(self) -> str:
39+
output_str = f"{self.value}; "
40+
if self.language is not None:
41+
output_str += self.language + "; "
42+
if self.country is not None:
43+
output_str += self.country + "; "
44+
if self.currency is not None:
45+
output_str += self.currency + "; "
46+
return output_str.strip()

mindee/fields/payment_details.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,14 @@ def __init__(
6868
except (KeyError, AssertionError):
6969
self.swift = None
7070

71-
def __str__(self):
72-
payment_str = ""
71+
def __str__(self) -> str:
72+
output_str = ""
7373
if self.account_number is not None:
74-
payment_str += str(self.account_number) + "; "
75-
74+
output_str += str(self.account_number) + "; "
7675
if self.iban is not None:
77-
payment_str += str(self.iban) + "; "
78-
76+
output_str += str(self.iban) + "; "
7977
if self.routing_number is not None:
80-
payment_str += str(self.routing_number) + "; "
81-
78+
output_str += str(self.routing_number) + "; "
8279
if self.swift is not None:
83-
payment_str += str(self.swift) + "; "
84-
85-
return payment_str
80+
output_str += str(self.swift) + "; "
81+
return output_str.strip()

tests/documents/test_invoice.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,23 @@ def test_constructor(invoice_object):
5151
assert invoice_object.invoice_date.confidence == 0.97
5252
assert invoice_object.invoice_number.value == "0042004801351"
5353
assert invoice_object.invoice_number.confidence == 0.95
54-
assert isinstance(invoice_object.__str__(), str)
54+
assert (
55+
str(invoice_object)
56+
== """-----Invoice data-----
57+
Filename: None
58+
Invoice number: 0042004801351
59+
Total amount including taxes: 587.95
60+
Total amount excluding taxes: 489.97
61+
Invoice date: 2020-02-17
62+
Invoice due date: 2020-02-17
63+
Supplier name: 1
64+
Payment details:
65+
Company numbers: 501124705; FR33501124705
66+
Taxes: 97.98 20.0%
67+
Total taxes: 97.98
68+
Locale: fr; fr; EUR;
69+
----------------------"""
70+
)
5571

5672

5773
def test_all_na(invoice_object_all_na):

tests/documents/test_receipt.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,21 @@ def test_constructor(receipt_object):
4747
assert receipt_object.date.value == "2016-02-26"
4848
assert receipt_object.total_tax.value == 1.7
4949
assert receipt_object.checklist["taxes_match_total_incl"] is True
50-
assert type(receipt_object.__str__()) == str
50+
assert (
51+
str(receipt_object)
52+
== """-----Receipt data-----
53+
Filename: None
54+
Total amount including taxes: 10.2
55+
Total amount excluding taxes: 8.5
56+
Date: 2016-02-26
57+
Category: food
58+
Time: 15:20
59+
Merchant name: CLACHAN
60+
Taxes: 1.7 20.0%
61+
Total taxes: 1.7
62+
Locale: en-GB; en; GB; GBP;
63+
----------------------"""
64+
)
5165

5266

5367
def test_all_na(receipt_object_all_na):

tests/fields/test_date.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def test_constructor():
1717
}
1818
date = Date(field_dict)
1919
assert date.value == "2018-04-01"
20+
assert isinstance(date.date_object, datetime.date)
2021

2122

2223
def test_constructor_no_date():

0 commit comments

Comments
 (0)