mindee 3.3.1 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/README.md +4 -0
  4. data/bin/mindee.rb +39 -15
  5. data/docs/bank_statement_fr_v1.md +175 -0
  6. data/docs/carte_grise_v1.md +4 -4
  7. data/docs/code_samples/bank_statement_fr_v1_async.txt +19 -0
  8. data/docs/code_samples/default.txt +19 -19
  9. data/docs/code_samples/default_async.txt +25 -0
  10. data/docs/code_samples/eu_driver_license_v1.txt +19 -0
  11. data/docs/code_samples/international_id_v1_async.txt +19 -0
  12. data/docs/code_samples/international_id_v2_async.txt +19 -0
  13. data/docs/eu_driver_license_v1.md +223 -0
  14. data/docs/financial_document_v1.md +48 -40
  15. data/docs/generated_v1.md +90 -0
  16. data/docs/invoices_v4.md +13 -4
  17. data/docs/proof_of_address_v1.md +4 -4
  18. data/docs/us_driver_license_v1.md +2 -2
  19. data/lib/mindee/client.rb +5 -3
  20. data/lib/mindee/http/endpoint.rb +13 -12
  21. data/lib/mindee/input/sources.rb +28 -5
  22. data/lib/mindee/parsing/common/inference.rb +3 -1
  23. data/lib/mindee/parsing/generated/generated_list_field.rb +58 -0
  24. data/lib/mindee/parsing/generated/generated_object_field.rb +109 -0
  25. data/lib/mindee/parsing/generated.rb +4 -0
  26. data/lib/mindee/parsing/standard/string_field.rb +8 -0
  27. data/lib/mindee/parsing.rb +1 -0
  28. data/lib/mindee/product/barcode_reader/barcode_reader_v1.rb +3 -1
  29. data/lib/mindee/product/cropper/cropper_v1.rb +3 -1
  30. data/lib/mindee/product/eu/driver_license/driver_license_v1.rb +41 -0
  31. data/lib/mindee/product/eu/driver_license/driver_license_v1_document.rb +88 -0
  32. data/lib/mindee/product/eu/driver_license/driver_license_v1_page.rb +53 -0
  33. data/lib/mindee/product/eu/license_plate/license_plate_v1.rb +3 -1
  34. data/lib/mindee/product/financial_document/financial_document_v1.rb +3 -1
  35. data/lib/mindee/product/fr/bank_account_details/bank_account_details_v1.rb +3 -1
  36. data/lib/mindee/product/fr/bank_account_details/bank_account_details_v2.rb +3 -1
  37. data/lib/mindee/product/fr/bank_statement/bank_statement_v1.rb +41 -0
  38. data/lib/mindee/product/fr/bank_statement/bank_statement_v1_document.rb +130 -0
  39. data/lib/mindee/product/fr/bank_statement/bank_statement_v1_page.rb +34 -0
  40. data/lib/mindee/product/fr/bank_statement/bank_statement_v1_transaction.rb +64 -0
  41. data/lib/mindee/product/fr/carte_grise/carte_grise_v1.rb +3 -1
  42. data/lib/mindee/product/fr/carte_vitale/carte_vitale_v1.rb +3 -1
  43. data/lib/mindee/product/fr/id_card/id_card_v1.rb +3 -1
  44. data/lib/mindee/product/fr/id_card/id_card_v2.rb +3 -1
  45. data/lib/mindee/product/generated/generated_v1.rb +38 -0
  46. data/lib/mindee/product/generated/generated_v1_document.rb +35 -0
  47. data/lib/mindee/product/generated/generated_v1_page.rb +51 -0
  48. data/lib/mindee/product/generated/generated_v1_prediction.rb +114 -0
  49. data/lib/mindee/product/international_id/international_id_v1.rb +39 -0
  50. data/lib/mindee/product/international_id/international_id_v1_document.rb +109 -0
  51. data/lib/mindee/product/international_id/international_id_v1_page.rb +32 -0
  52. data/lib/mindee/product/international_id/international_id_v2.rb +39 -0
  53. data/lib/mindee/product/international_id/international_id_v2_document.rb +119 -0
  54. data/lib/mindee/product/international_id/international_id_v2_page.rb +32 -0
  55. data/lib/mindee/product/invoice/invoice_v4.rb +3 -1
  56. data/lib/mindee/product/invoice/invoice_v4_document.rb +5 -0
  57. data/lib/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.rb +3 -1
  58. data/lib/mindee/product/passport/passport_v1.rb +3 -1
  59. data/lib/mindee/product/proof_of_address/proof_of_address_v1.rb +3 -1
  60. data/lib/mindee/product/receipt/receipt_v5.rb +3 -1
  61. data/lib/mindee/product/us/bank_check/bank_check_v1.rb +3 -1
  62. data/lib/mindee/product/us/driver_license/driver_license_v1.rb +3 -1
  63. data/lib/mindee/product/us/w9/w9_v1.rb +3 -1
  64. data/lib/mindee/product.rb +5 -0
  65. data/lib/mindee/version.rb +1 -1
  66. data/lib/mindee.rb +4 -0
  67. metadata +30 -2
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../parsing'
4
+ require_relative 'bank_statement_v1_transaction'
5
+
6
+ module Mindee
7
+ module Product
8
+ module FR
9
+ module BankStatement
10
+ # Bank Statement (FR) V1 document prediction.
11
+ class BankStatementV1Document < Mindee::Parsing::Common::Prediction
12
+ include Mindee::Parsing::Standard
13
+ # The unique identifier for a customer's account in the bank's system.
14
+ # @return [Mindee::Parsing::Standard::StringField]
15
+ attr_reader :account_number
16
+ # The physical location of the bank where the statement was issued.
17
+ # @return [Mindee::Parsing::Standard::StringField]
18
+ attr_reader :bank_address
19
+ # The name of the bank that issued the statement.
20
+ # @return [Mindee::Parsing::Standard::StringField]
21
+ attr_reader :bank_name
22
+ # The address of the client associated with the bank statement.
23
+ # @return [Mindee::Parsing::Standard::StringField]
24
+ attr_reader :client_address
25
+ # The name of the client who owns the bank statement.
26
+ # @return [Mindee::Parsing::Standard::StringField]
27
+ attr_reader :client_name
28
+ # The final amount of money in the account at the end of the statement period.
29
+ # @return [Mindee::Parsing::Standard::AmountField]
30
+ attr_reader :closing_balance
31
+ # The initial amount of money in an account at the start of the period.
32
+ # @return [Mindee::Parsing::Standard::AmountField]
33
+ attr_reader :opening_balance
34
+ # The date on which the bank statement was generated.
35
+ # @return [Mindee::Parsing::Standard::DateField]
36
+ attr_reader :statement_date
37
+ # The date when the statement period ends.
38
+ # @return [Mindee::Parsing::Standard::DateField]
39
+ attr_reader :statement_end_date
40
+ # The date when the bank statement period begins.
41
+ # @return [Mindee::Parsing::Standard::DateField]
42
+ attr_reader :statement_start_date
43
+ # The total amount of money deposited into the account.
44
+ # @return [Mindee::Parsing::Standard::AmountField]
45
+ attr_reader :total_credits
46
+ # The total amount of money debited from the account.
47
+ # @return [Mindee::Parsing::Standard::AmountField]
48
+ attr_reader :total_debits
49
+ # The list of values that represent the financial transactions recorded in a bank statement.
50
+ # @return [Array<Mindee::Product::FR::BankStatement::BankStatementV1Transaction>]
51
+ attr_reader :transactions
52
+
53
+ # @param prediction [Hash]
54
+ # @param page_id [Integer, nil]
55
+ def initialize(prediction, page_id)
56
+ super()
57
+ @account_number = StringField.new(prediction['account_number'], page_id)
58
+ @bank_address = StringField.new(prediction['bank_address'], page_id)
59
+ @bank_name = StringField.new(prediction['bank_name'], page_id)
60
+ @client_address = StringField.new(prediction['client_address'], page_id)
61
+ @client_name = StringField.new(prediction['client_name'], page_id)
62
+ @closing_balance = AmountField.new(prediction['closing_balance'], page_id)
63
+ @opening_balance = AmountField.new(prediction['opening_balance'], page_id)
64
+ @statement_date = DateField.new(prediction['statement_date'], page_id)
65
+ @statement_end_date = DateField.new(prediction['statement_end_date'], page_id)
66
+ @statement_start_date = DateField.new(prediction['statement_start_date'], page_id)
67
+ @total_credits = AmountField.new(prediction['total_credits'], page_id)
68
+ @total_debits = AmountField.new(prediction['total_debits'], page_id)
69
+ @transactions = []
70
+ prediction['transactions'].each do |item|
71
+ @transactions.push(BankStatementV1Transaction.new(item, page_id))
72
+ end
73
+ end
74
+
75
+ # @return [String]
76
+ def to_s
77
+ transactions = transactions_to_s
78
+ out_str = String.new
79
+ out_str << "\n:Account Number: #{@account_number}".rstrip
80
+ out_str << "\n:Bank Name: #{@bank_name}".rstrip
81
+ out_str << "\n:Bank Address: #{@bank_address}".rstrip
82
+ out_str << "\n:Client Name: #{@client_name}".rstrip
83
+ out_str << "\n:Client Address: #{@client_address}".rstrip
84
+ out_str << "\n:Statement Date: #{@statement_date}".rstrip
85
+ out_str << "\n:Statement Start Date: #{@statement_start_date}".rstrip
86
+ out_str << "\n:Statement End Date: #{@statement_end_date}".rstrip
87
+ out_str << "\n:Opening Balance: #{@opening_balance}".rstrip
88
+ out_str << "\n:Closing Balance: #{@closing_balance}".rstrip
89
+ out_str << "\n:Transactions:"
90
+ out_str << transactions
91
+ out_str << "\n:Total Debits: #{@total_debits}".rstrip
92
+ out_str << "\n:Total Credits: #{@total_credits}".rstrip
93
+ out_str[1..].to_s
94
+ end
95
+
96
+ private
97
+
98
+ # @param char [String]
99
+ # @return [String]
100
+ def transactions_separator(char)
101
+ out_str = String.new
102
+ out_str << ' '
103
+ out_str << "+#{char * 11}"
104
+ out_str << "+#{char * 12}"
105
+ out_str << "+#{char * 38}"
106
+ out_str << '+'
107
+ out_str
108
+ end
109
+
110
+ # @return [String]
111
+ def transactions_to_s
112
+ return '' if @transactions.empty?
113
+
114
+ line_items = @transactions.map(&:to_table_line).join("\n#{transactions_separator('-')}\n ")
115
+ out_str = String.new
116
+ out_str << "\n#{transactions_separator('-')}"
117
+ out_str << "\n |"
118
+ out_str << ' Amount |'
119
+ out_str << ' Date |'
120
+ out_str << ' Description |'
121
+ out_str << "\n#{transactions_separator('=')}"
122
+ out_str << "\n #{line_items}"
123
+ out_str << "\n#{transactions_separator('-')}"
124
+ out_str
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../parsing'
4
+ require_relative 'bank_statement_v1_document'
5
+
6
+ module Mindee
7
+ module Product
8
+ module FR
9
+ module BankStatement
10
+ # Bank Statement (FR) V1 page.
11
+ class BankStatementV1Page < Mindee::Parsing::Common::Page
12
+ # @param prediction [Hash]
13
+ def initialize(prediction)
14
+ super(prediction)
15
+ @prediction = BankStatementV1PagePrediction.new(
16
+ prediction['prediction'],
17
+ prediction['id']
18
+ )
19
+ end
20
+ end
21
+
22
+ # Bank Statement (FR) V1 page prediction.
23
+ class BankStatementV1PagePrediction < BankStatementV1Document
24
+ # @return [String]
25
+ def to_s
26
+ out_str = String.new
27
+ out_str << "\n#{super}"
28
+ out_str
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../parsing'
4
+
5
+ module Mindee
6
+ module Product
7
+ module FR
8
+ module BankStatement
9
+ # The list of values that represent the financial transactions recorded in a bank statement.
10
+ class BankStatementV1Transaction < Mindee::Parsing::Standard::FeatureField
11
+ include Mindee::Parsing::Standard
12
+ # The monetary amount of the transaction.
13
+ # @return [Float]
14
+ attr_reader :amount
15
+ # The date on which the transaction occurred.
16
+ # @return [String]
17
+ attr_reader :date
18
+ # The additional information about the transaction.
19
+ # @return [String]
20
+ attr_reader :description
21
+
22
+ # @param prediction [Hash]
23
+ # @param page_id [Integer, nil]
24
+ def initialize(prediction, page_id)
25
+ super(prediction, page_id)
26
+ @amount = prediction['amount']
27
+ @date = prediction['date']
28
+ @description = prediction['description']
29
+ @page_id = page_id
30
+ end
31
+
32
+ # @return [Hash]
33
+ def printable_values
34
+ printable = {}
35
+ printable[:amount] = @amount.nil? ? '' : Field.float_to_string(@amount)
36
+ printable[:date] = format_for_display(@date, nil)
37
+ printable[:description] = format_for_display(@description, 36)
38
+ printable
39
+ end
40
+
41
+ # @return [String]
42
+ def to_table_line
43
+ printable = printable_values
44
+ out_str = String.new
45
+ out_str << format('| %- 10s', printable[:amount])
46
+ out_str << format('| %- 11s', printable[:date])
47
+ out_str << format('| %- 37s', printable[:description])
48
+ out_str << '|'
49
+ end
50
+
51
+ # @return [String]
52
+ def to_s
53
+ printable = printable_values
54
+ out_str = String.new
55
+ out_str << "\n :Amount: #{printable[:amount]}"
56
+ out_str << "\n :Date: #{printable[:date]}"
57
+ out_str << "\n :Description: #{printable[:description]}"
58
+ out_str
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -20,7 +20,9 @@ module Mindee
20
20
  @prediction = CarteGriseV1Document.new(prediction['prediction'], nil)
21
21
  @pages = []
22
22
  prediction['pages'].each do |page|
23
- @pages.push(CarteGriseV1Page.new(page))
23
+ if page.key?('prediction') && !page['prediction'].nil? && !page['prediction'].empty?
24
+ @pages.push(CarteGriseV1Page.new(page))
25
+ end
24
26
  end
25
27
  end
26
28
 
@@ -20,7 +20,9 @@ module Mindee
20
20
  @prediction = CarteVitaleV1Document.new(prediction['prediction'], nil)
21
21
  @pages = []
22
22
  prediction['pages'].each do |page|
23
- @pages.push(CarteVitaleV1Page.new(page))
23
+ if page.key?('prediction') && !page['prediction'].nil? && !page['prediction'].empty?
24
+ @pages.push(CarteVitaleV1Page.new(page))
25
+ end
24
26
  end
25
27
  end
26
28
 
@@ -20,7 +20,9 @@ module Mindee
20
20
  @prediction = IdCardV1Document.new(prediction['prediction'], nil)
21
21
  @pages = []
22
22
  prediction['pages'].each do |page|
23
- @pages.push(IdCardV1Page.new(page))
23
+ if page.key?('prediction') && !page['prediction'].nil? && !page['prediction'].empty?
24
+ @pages.push(IdCardV1Page.new(page))
25
+ end
24
26
  end
25
27
  end
26
28
 
@@ -20,7 +20,9 @@ module Mindee
20
20
  @prediction = IdCardV2Document.new(prediction['prediction'], nil)
21
21
  @pages = []
22
22
  prediction['pages'].each do |page|
23
- @pages.push(IdCardV2Page.new(page))
23
+ if page.key?('prediction') && !page['prediction'].nil? && !page['prediction'].empty?
24
+ @pages.push(IdCardV2Page.new(page))
25
+ end
24
26
  end
25
27
  end
26
28
 
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'generated_v1_document'
4
+ require_relative 'generated_v1_page'
5
+
6
+ module Mindee
7
+ module Product
8
+ # Generated product module.
9
+ module Generated
10
+ # Generated Document V1 prediction inference.
11
+ class GeneratedV1 < Mindee::Parsing::Common::Inference
12
+ @endpoint_name = ''
13
+ @endpoint_version = ''
14
+
15
+ # @param prediction [Hash]
16
+ def initialize(prediction)
17
+ super
18
+ @prediction = GeneratedV1Document.new(prediction['prediction'])
19
+ @pages = []
20
+ prediction['pages'].each do |page|
21
+ if page.key?('prediction') && !page['prediction'].nil? && !page['prediction'].empty?
22
+ @pages.push(GeneratedV1Page.new(page))
23
+ end
24
+ end
25
+ end
26
+
27
+ class << self
28
+ # Name of the endpoint for this product.
29
+ # @return [String]
30
+ attr_reader :endpoint_name
31
+ # Version for this product.
32
+ # @return [String]
33
+ attr_reader :endpoint_version
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../parsing'
4
+ require_relative 'generated_v1_prediction'
5
+
6
+ module Mindee
7
+ module Product
8
+ module Generated
9
+ # Generated Document V1 prediction
10
+ class GeneratedV1Document < Mindee::Product::Generated::GeneratedV1Prediction
11
+ include Mindee::Parsing::Standard
12
+ # @param raw_prediction [Hash]
13
+ def initialize(raw_prediction)
14
+ # Generated document.
15
+
16
+ # raw_prediction: Dictionary containing the JSON document response
17
+ super()
18
+ raw_prediction.each do |field_name, field_contents|
19
+ if field_contents.is_a?(Array)
20
+ @fields[field_name] = Parsing::Generated::GeneratedListField.new(field_contents)
21
+ elsif field_contents.is_a?(Hash) && Parsing::Generated.generated_object?(field_contents)
22
+ @fields[field_name] = Parsing::Generated::GeneratedObjectField.new(field_contents)
23
+ else
24
+ field_contents_str = field_contents.dup
25
+ if field_contents_str.key?('value') && field_contents_str['value'].nil? == false
26
+ field_contents_str['value'] = field_contents_str['value'].to_s
27
+ end
28
+ @fields[field_name] = StringField.new(field_contents_str)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../parsing'
4
+ require_relative 'generated_v1_prediction'
5
+
6
+ module Mindee
7
+ module Product
8
+ module Generated
9
+ # Generated Document V1 page.
10
+ class GeneratedV1Page < Mindee::Parsing::Common::Page
11
+ # @param prediction [Hash]
12
+ def initialize(prediction)
13
+ super(prediction)
14
+ @prediction = GeneratedV1PagePrediction.new(
15
+ prediction['prediction'],
16
+ prediction['id']
17
+ )
18
+ end
19
+ end
20
+
21
+ # Generated Document V1 page prediction.
22
+ class GeneratedV1PagePrediction < GeneratedV1Prediction
23
+ include Mindee::Parsing::Standard
24
+ include Mindee::Parsing::Generated
25
+ def initialize(raw_prediction, page_id = nil)
26
+ super()
27
+ raw_prediction.each do |field_name, field_contents|
28
+ if field_contents.is_a?(Array)
29
+ @fields[field_name] = GeneratedListField.new(field_contents, page_id)
30
+ elsif field_contents.is_a?(Hash) && Parsing::Generated.generated_object?(field_contents)
31
+ @fields[field_name] = GeneratedObjectField.new(field_contents, page_id)
32
+ else
33
+ field_contents_str = field_contents.dup
34
+ if field_contents_str.key?('value') && !field_contents_str['value'].nil?
35
+ field_contents_str['value'] = field_contents_str['value'].to_s
36
+ end
37
+ @fields[field_name] = StringField.new(field_contents_str, page_id)
38
+ end
39
+ end
40
+ end
41
+
42
+ # @return [String]
43
+ def to_s
44
+ out_str = String.new
45
+ out_str << "\n#{super}"
46
+ out_str
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../parsing'
4
+
5
+ module Mindee
6
+ module Product
7
+ module Generated
8
+ # Generated Document V1 page.
9
+ class GeneratedV1Prediction < Mindee::Parsing::Common::Prediction
10
+ include Mindee::Parsing::Common
11
+ include Mindee::Parsing::Standard
12
+ include Mindee::Parsing::Generated
13
+ # All value fields in the document
14
+ # @return [Hash<Symbol, Mindee::Parsing::Generated::GeneratedListField>]
15
+ attr_reader :fields
16
+
17
+ def initialize
18
+ super()
19
+ @fields = {}
20
+ end
21
+
22
+ # String representation.
23
+ def to_s
24
+ out_str = ''
25
+ pattern = %r{^(\n* *)( {2}):}
26
+ @fields.each do |field_name, field_value|
27
+ str_value = if field_value.is_a?(GeneratedListField) && field_value.values.length.positive?
28
+ generate_field_string(field_name, field_value, pattern)
29
+ else
30
+ field_value.to_s
31
+ end
32
+ out_str += "\n:#{field_name}:"
33
+
34
+ out_str += " #{str_value}".sub(%r{^\s+\n}, "\n") if str_value.length.positive?
35
+ end
36
+ out_str.sub("\n", '')
37
+ end
38
+
39
+ private
40
+
41
+ def generate_field_string(field_name, field_value, pattern)
42
+ return '' if field_value.values.empty? || field_value.values.nil?
43
+
44
+ str_value = ''
45
+ str_value += if field_value.values[0].is_a?(Parsing::Generated::GeneratedObjectField)
46
+ field_value.values[0].str_level(1).sub(pattern, '\\1* :')
47
+ else
48
+ "#{field_value.values[0].to_s.sub(pattern, '\\1* :')}\n"
49
+ end
50
+ field_value.values[1..].each do |sub_value|
51
+ str_value += if sub_value.is_a?(Parsing::Generated::GeneratedObjectField)
52
+ sub_value.str_level(1).sub(pattern, '\\1* :')
53
+ else
54
+ "#{' ' * (field_name.length + 2)} #{sub_value}\n"
55
+ end
56
+ end
57
+ str_value.rstrip
58
+ end
59
+
60
+ def generate_list_field_string(field_name, field_value, pattern)
61
+ str_value = ''
62
+ field_value.each_value do |sub_value|
63
+ str_value += generate_sub_value_string(field_name, sub_value, pattern)
64
+ end
65
+ str_value.rstrip
66
+ end
67
+
68
+ def generate_sub_value_string(field_name, sub_value, pattern)
69
+ if sub_value.is_a?(GeneratedObjectField)
70
+ sub_value.str_level(1).gsub(pattern, '\1* :')
71
+ else
72
+ (' ' * (field_name.length + 2)) + "#{sub_value}\n"
73
+ end
74
+ end
75
+
76
+ # Returns a hash of all fields that aren't a collection
77
+ # @return [Hash<String, StringField>]
78
+ def single_fields
79
+ single_fields = {}
80
+ @fields.each do |field_name, field_value|
81
+ single_fields[field_name] = field_value if field_value.is_a?(StringField)
82
+ end
83
+ single_fields
84
+ end
85
+
86
+ # Returns a hash of all list-like fields
87
+ # @return [Hash<String, GeneratedListField>]
88
+ def list_fields
89
+ list_fields = {}
90
+ @fields.each do |field_name, field_value|
91
+ list_fields[field_name] = field_value if field_value.is_a?(GeneratedListField)
92
+ end
93
+ list_fields
94
+ end
95
+
96
+ # Returns a hash of all object-like fields
97
+ # @return [Hash<String, GeneratedObjectField>]
98
+ def object_fields
99
+ object_fields = {}
100
+ @fields.each do |field_name, field_value|
101
+ object_fields[field_name] = field_value if field_value.is_a?(GeneratedObjectField)
102
+ end
103
+ object_fields
104
+ end
105
+
106
+ # Lists names of all top-level field keys
107
+ # @return [Array<String>]
108
+ def list_field_names
109
+ @fields.keys.map(&:to_s)
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../parsing'
4
+ require_relative 'international_id_v1_document'
5
+ require_relative 'international_id_v1_page'
6
+
7
+ module Mindee
8
+ module Product
9
+ # International ID module.
10
+ module InternationalId
11
+ # International ID V1 prediction inference.
12
+ class InternationalIdV1 < Mindee::Parsing::Common::Inference
13
+ @endpoint_name = 'international_id'
14
+ @endpoint_version = '1'
15
+
16
+ # @param prediction [Hash]
17
+ def initialize(prediction)
18
+ super
19
+ @prediction = InternationalIdV1Document.new(prediction['prediction'], nil)
20
+ @pages = []
21
+ prediction['pages'].each do |page|
22
+ if page.key?('prediction') && !page['prediction'].nil? && !page['prediction'].empty?
23
+ @pages.push(InternationalIdV1Page.new(page))
24
+ end
25
+ end
26
+ end
27
+
28
+ class << self
29
+ # Name of the endpoint for this product.
30
+ # @return [String]
31
+ attr_reader :endpoint_name
32
+ # Version for this product.
33
+ # @return [String]
34
+ attr_reader :endpoint_version
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../parsing'
4
+
5
+ module Mindee
6
+ module Product
7
+ module InternationalId
8
+ # International ID V1 document prediction.
9
+ class InternationalIdV1Document < Mindee::Parsing::Common::Prediction
10
+ include Mindee::Parsing::Standard
11
+ # The physical location of the document holder's residence.
12
+ # @return [Mindee::Parsing::Standard::StringField]
13
+ attr_reader :address
14
+ # The date of birth of the document holder.
15
+ # @return [Mindee::Parsing::Standard::DateField]
16
+ attr_reader :birth_date
17
+ # The location where the document holder was born.
18
+ # @return [Mindee::Parsing::Standard::StringField]
19
+ attr_reader :birth_place
20
+ # The country that issued the identification document.
21
+ # @return [Mindee::Parsing::Standard::StringField]
22
+ attr_reader :country_of_issue
23
+ # The unique identifier assigned to the identification document.
24
+ # @return [Mindee::Parsing::Standard::StringField]
25
+ attr_reader :document_number
26
+ # The type of identification document being used.
27
+ # @return [Mindee::Parsing::Standard::ClassificationField]
28
+ attr_reader :document_type
29
+ # The date when the document will no longer be valid for use.
30
+ # @return [Mindee::Parsing::Standard::DateField]
31
+ attr_reader :expiry_date
32
+ # The first names or given names of the document holder.
33
+ # @return [Array<Mindee::Parsing::Standard::StringField>]
34
+ attr_reader :given_names
35
+ # The date when the document was issued.
36
+ # @return [Mindee::Parsing::Standard::DateField]
37
+ attr_reader :issue_date
38
+ # First line of information in a standardized format for easy machine reading and processing.
39
+ # @return [Mindee::Parsing::Standard::StringField]
40
+ attr_reader :mrz1
41
+ # Second line of information in a standardized format for easy machine reading and processing.
42
+ # @return [Mindee::Parsing::Standard::StringField]
43
+ attr_reader :mrz2
44
+ # Third line of information in a standardized format for easy machine reading and processing.
45
+ # @return [Mindee::Parsing::Standard::StringField]
46
+ attr_reader :mrz3
47
+ # Indicates the country of citizenship or nationality of the document holder.
48
+ # @return [Mindee::Parsing::Standard::StringField]
49
+ attr_reader :nationality
50
+ # The document holder's biological sex, such as male or female.
51
+ # @return [Mindee::Parsing::Standard::StringField]
52
+ attr_reader :sex
53
+ # The surnames of the document holder.
54
+ # @return [Array<Mindee::Parsing::Standard::StringField>]
55
+ attr_reader :surnames
56
+
57
+ # @param prediction [Hash]
58
+ # @param page_id [Integer, nil]
59
+ def initialize(prediction, page_id)
60
+ super()
61
+ @address = StringField.new(prediction['address'], page_id)
62
+ @birth_date = DateField.new(prediction['birth_date'], page_id)
63
+ @birth_place = StringField.new(prediction['birth_place'], page_id)
64
+ @country_of_issue = StringField.new(prediction['country_of_issue'], page_id)
65
+ @document_number = StringField.new(prediction['document_number'], page_id)
66
+ @document_type = ClassificationField.new(prediction['document_type'], page_id)
67
+ @expiry_date = DateField.new(prediction['expiry_date'], page_id)
68
+ @given_names = []
69
+ prediction['given_names'].each do |item|
70
+ @given_names.push(StringField.new(item, page_id))
71
+ end
72
+ @issue_date = DateField.new(prediction['issue_date'], page_id)
73
+ @mrz1 = StringField.new(prediction['mrz1'], page_id)
74
+ @mrz2 = StringField.new(prediction['mrz2'], page_id)
75
+ @mrz3 = StringField.new(prediction['mrz3'], page_id)
76
+ @nationality = StringField.new(prediction['nationality'], page_id)
77
+ @sex = StringField.new(prediction['sex'], page_id)
78
+ @surnames = []
79
+ prediction['surnames'].each do |item|
80
+ @surnames.push(StringField.new(item, page_id))
81
+ end
82
+ end
83
+
84
+ # @return [String]
85
+ def to_s
86
+ surnames = @surnames.join("\n #{' ' * 10}")
87
+ given_names = @given_names.join("\n #{' ' * 13}")
88
+ out_str = String.new
89
+ out_str << "\n:Document Type: #{@document_type}".rstrip
90
+ out_str << "\n:Document Number: #{@document_number}".rstrip
91
+ out_str << "\n:Country of Issue: #{@country_of_issue}".rstrip
92
+ out_str << "\n:Surnames: #{surnames}".rstrip
93
+ out_str << "\n:Given Names: #{given_names}".rstrip
94
+ out_str << "\n:Gender: #{@sex}".rstrip
95
+ out_str << "\n:Birth date: #{@birth_date}".rstrip
96
+ out_str << "\n:Birth Place: #{@birth_place}".rstrip
97
+ out_str << "\n:Nationality: #{@nationality}".rstrip
98
+ out_str << "\n:Issue Date: #{@issue_date}".rstrip
99
+ out_str << "\n:Expiry Date: #{@expiry_date}".rstrip
100
+ out_str << "\n:Address: #{@address}".rstrip
101
+ out_str << "\n:Machine Readable Zone Line 1: #{@mrz1}".rstrip
102
+ out_str << "\n:Machine Readable Zone Line 2: #{@mrz2}".rstrip
103
+ out_str << "\n:Machine Readable Zone Line 3: #{@mrz3}".rstrip
104
+ out_str[1..].to_s
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end