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 +4 -4
- data/lib/usps/imis/api.rb +7 -3
- data/lib/usps/imis/errors/ambiguous_certificate_error.rb +21 -0
- data/lib/usps/imis/party_data.rb +14 -26
- data/lib/usps/imis/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6192c91d6014b89e3cb78b0afc8b05cb0cd8f44352bdbeb6fe55ac99d02bf9d4
|
|
4
|
+
data.tar.gz: f37891d8dabf058351c6dae8bc12f54b5c8752acdac352b52a1fc27add15b749
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
121
|
-
|
|
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:
|
|
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
|
data/lib/usps/imis/party_data.rb
CHANGED
|
@@ -31,7 +31,7 @@ module Usps
|
|
|
31
31
|
# Hash of all property names to values
|
|
32
32
|
#
|
|
33
33
|
def properties
|
|
34
|
-
@properties ||=
|
|
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
|
|
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
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
data/lib/usps/imis/version.rb
CHANGED
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.
|
|
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
|