usps-imis-api 0.15.2 → 0.15.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71bf86bea5de43c3a42aee00194fc56a1e0b42269e960e49508f8f2b1cc3e22f
4
- data.tar.gz: d5721fd614d0da0f92d24e495d9cc4de8631af9d1609c9a5cca9eee6fc24a31b
3
+ metadata.gz: 6192c91d6014b89e3cb78b0afc8b05cb0cd8f44352bdbeb6fe55ac99d02bf9d4
4
+ data.tar.gz: f37891d8dabf058351c6dae8bc12f54b5c8752acdac352b52a1fc27add15b749
5
5
  SHA512:
6
- metadata.gz: b414c11006fca75e300b1847474aab6319aaac3807eab7a025bb13d45c44d248a2b894b651affda14e7924341f6dea722bd2613d275cfeea908f9589cfa05535
7
- data.tar.gz: b302e648c10ab09c427acfdc90fe9622b1fda6e03e6587ce8be1e7dc96c33b2c98cd293ea9191f6c78428193e55f395252cba5ee337e046a9716783264cfd24c
6
+ metadata.gz: 25d2d665ce5a3e323977de8c2308fad23284ef1fa3fb93b56b68f0e649978214d3cd296e4a4792f23eb09a9992fee3412344097055088191cecc64f8ffc13c58
7
+ data.tar.gz: e79ca2364a98b9394a21c2c213e35cfb956c75990a790baa99ae49f4441e652aa573bee3b4247aaa224f2b8684cec64a5f12b935ee72d41538cbfcef7430f9bd
data/lib/usps/imis/api.rb CHANGED
@@ -112,15 +112,19 @@ module Usps
112
112
  #
113
113
  # @return [Integer] Corresponding iMIS ID
114
114
  #
115
+ # @raise [Errors::AmbiguousCertificateError] If the certificate matches more than one person
116
+ #
115
117
  def imis_id_for(certificate)
116
118
  raise Errors::LockedIdError if lock_imis_id
117
119
 
118
120
  logger.debug "Fetching iMIS ID for #{certificate}"
119
121
 
120
- net_contact_data = query('NetContactData', MajorKey: certificate).one
121
- raise Errors::NotFoundError, 'Member not found' if net_contact_data.nil?
122
+ # Family records can share their member's MajorKey, so only people are candidates
123
+ people = query('NetContactData', MajorKey: certificate).page.reject { it['IsCompany'] }
124
+ raise Errors::NotFoundError, 'Member not found' if people.empty?
125
+ raise Errors::AmbiguousCertificateError, certificate if people.many?
122
126
 
123
- party = query('Party', UniformId: net_contact_data.id).one
127
+ party = query('Party', UniformId: people.first.id).one
124
128
  raise Errors::NotFoundError, 'Member not found' if party.nil?
125
129
 
126
130
  self.imis_id = party.imis_id
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Errors
6
+ # Raised when a certificate number matches more than one person, so there is no single
7
+ # iMIS ID to select for it
8
+ #
9
+ class AmbiguousCertificateError < Error
10
+ attr_reader :certificate
11
+
12
+ def initialize(certificate)
13
+ @certificate = certificate
14
+ super(message)
15
+ end
16
+
17
+ def message = "Multiple members found for certificate #{certificate}"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -31,7 +31,7 @@ module Usps
31
31
  # Hash of all property names to values
32
32
  #
33
33
  def properties
34
- @properties ||= format_extracted(extract_hash(raw))
34
+ @properties ||= extract_hash(raw)
35
35
  end
36
36
 
37
37
  private
@@ -40,18 +40,12 @@ module Usps
40
40
  { entity:, imis_id: }.compact
41
41
  end
42
42
 
43
- def extract_hash(hash)
44
- hash.filter_map do |key, value|
45
- next if key == '$type'
46
-
47
- [key, extract_value(value)]
48
- end
49
- end
43
+ def extract_hash(hash) = hash.except('$type').transform_values { extract_value(it) }
50
44
 
51
45
  def extract_value(value)
52
46
  case value
53
47
  when String, Integer, true, false, nil then value
54
- when Array then value.map { extract_value(it) }
48
+ when Array then extract_array(value)
55
49
  when Hash then extract_hash_value(value)
56
50
  else
57
51
  raise Errors::ApiError, "Unrecognized value type: #{value.inspect}"
@@ -60,29 +54,23 @@ module Usps
60
54
 
61
55
  def extract_hash_value(value)
62
56
  return value['$value'] if value.key?('$value')
63
- return extract_value(value['$values']) if value.key?('$values')
64
- return [value['Name'], extract_value(value['Value'])] if value.key?('Name') && value.key?('Value')
57
+ return extract_array(value['$values']) if value.key?('$values')
65
58
 
66
59
  extract_hash(value)
67
60
  end
68
61
 
69
- def format_extracted(data)
70
- hash = data.to_h
71
-
72
- hash.each do |key, value|
73
- case value
74
- when String, Integer, true, false then next
75
- end
76
-
77
- if %w[Addresses AlternateIds CommunicationPreferences Emails Phones Salutations].include?(key)
78
- hash[key] = value.map { format_extracted(it.to_h) }
79
- elsif value.all?(String)
80
- # Do nothing
81
- else
82
- hash[key] = format_extracted(value.to_h)
83
- end
62
+ # A list of +Name+ / +Value+ objects (e.g. +AdditionalAttributes+) is a property bag, so
63
+ # collapse it into a hash; any other list stays a list
64
+ #
65
+ def extract_array(values)
66
+ if values.any? && values.all? { named_value?(it) }
67
+ values.to_h { [it['Name'], extract_value(it['Value'])] }
68
+ else
69
+ values.map { extract_value(it) }
84
70
  end
85
71
  end
72
+
73
+ def named_value?(value) = value.is_a?(Hash) && value.key?('Name') && value.key?('Value')
86
74
  end
87
75
  end
88
76
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Usps
4
4
  module Imis
5
- VERSION = '0.15.2'
5
+ VERSION = '0.15.3'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: usps-imis-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.2
4
+ version: 0.15.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Fiander
@@ -119,6 +119,7 @@ files:
119
119
  - lib/usps/imis/data.rb
120
120
  - lib/usps/imis/dependencies.rb
121
121
  - lib/usps/imis/error.rb
122
+ - lib/usps/imis/errors/ambiguous_certificate_error.rb
122
123
  - lib/usps/imis/errors/api_error.rb
123
124
  - lib/usps/imis/errors/command_line_error.rb
124
125
  - lib/usps/imis/errors/config_error.rb