eml 1.0.0

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.
Files changed (116) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +10 -0
  3. data/.env.example +6 -0
  4. data/.gitignore +5 -0
  5. data/.rspec +5 -0
  6. data/.rubocop.yml +90 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE +21 -0
  9. data/README.md +87 -0
  10. data/eml.gemspec +37 -0
  11. data/lib/eml.rb +22 -0
  12. data/lib/eml/config.rb +49 -0
  13. data/lib/eml/data/countries.rb +260 -0
  14. data/lib/eml/data/currencies.rb +176 -0
  15. data/lib/eml/data/states.rb +4055 -0
  16. data/lib/eml/environment.rb +54 -0
  17. data/lib/eml/error.rb +25 -0
  18. data/lib/eml/error/rest.rb +42 -0
  19. data/lib/eml/error/rest/authentication.rb +21 -0
  20. data/lib/eml/error/rest/bad_request.rb +20 -0
  21. data/lib/eml/error/rest/daily_funding_limit.rb +19 -0
  22. data/lib/eml/error/rest/forbidden.rb +20 -0
  23. data/lib/eml/error/rest/internal_server.rb +9 -0
  24. data/lib/eml/error/rest/not_found.rb +20 -0
  25. data/lib/eml/error/rest/unprocessable_entity.rb +20 -0
  26. data/lib/eml/lib/endpoint_class.rb +42 -0
  27. data/lib/eml/parameters.rb +153 -0
  28. data/lib/eml/payload.rb +137 -0
  29. data/lib/eml/response.rb +103 -0
  30. data/lib/eml/uk.rb +51 -0
  31. data/lib/eml/uk/api_resource.rb +94 -0
  32. data/lib/eml/uk/config.rb +52 -0
  33. data/lib/eml/uk/lib/endpoint_class.rb +19 -0
  34. data/lib/eml/uk/lib/parse_date.rb +35 -0
  35. data/lib/eml/uk/model/transaction.rb +56 -0
  36. data/lib/eml/uk/parameters.rb +99 -0
  37. data/lib/eml/uk/parameters/agreement/show.rb +22 -0
  38. data/lib/eml/uk/parameters/card/activation.rb +24 -0
  39. data/lib/eml/uk/parameters/card/lock.rb +26 -0
  40. data/lib/eml/uk/parameters/card/register.rb +24 -0
  41. data/lib/eml/uk/parameters/card/reload.rb +24 -0
  42. data/lib/eml/uk/parameters/card/show.rb +102 -0
  43. data/lib/eml/uk/parameters/card/transaction.rb +59 -0
  44. data/lib/eml/uk/parameters/card/unload.rb +26 -0
  45. data/lib/eml/uk/parameters/card/unlock.rb +26 -0
  46. data/lib/eml/uk/parameters/card/void.rb +26 -0
  47. data/lib/eml/uk/payload.rb +94 -0
  48. data/lib/eml/uk/payload/agreement/show.rb +46 -0
  49. data/lib/eml/uk/payload/card/activation.rb +73 -0
  50. data/lib/eml/uk/payload/card/lock.rb +34 -0
  51. data/lib/eml/uk/payload/card/register.rb +70 -0
  52. data/lib/eml/uk/payload/card/reload.rb +38 -0
  53. data/lib/eml/uk/payload/card/show.rb +12 -0
  54. data/lib/eml/uk/payload/card/transaction.rb +12 -0
  55. data/lib/eml/uk/payload/card/unload.rb +38 -0
  56. data/lib/eml/uk/payload/card/unlock.rb +23 -0
  57. data/lib/eml/uk/payload/card/void.rb +23 -0
  58. data/lib/eml/uk/payload/contactentity.rb +64 -0
  59. data/lib/eml/uk/payload/iso.rb +48 -0
  60. data/lib/eml/uk/payload/location.rb +30 -0
  61. data/lib/eml/uk/resources/agreement.rb +32 -0
  62. data/lib/eml/uk/resources/card.rb +181 -0
  63. data/lib/eml/uk/response.rb +29 -0
  64. data/lib/eml/uk/responses/agreement/show.rb +16 -0
  65. data/lib/eml/uk/responses/card/reload.rb +19 -0
  66. data/lib/eml/uk/responses/card/show.rb +53 -0
  67. data/lib/eml/uk/responses/card/transaction.rb +24 -0
  68. data/lib/eml/version.rb +6 -0
  69. data/sorbet/config +2 -0
  70. data/sorbet/rbi/gems/addressable.rbi +198 -0
  71. data/sorbet/rbi/gems/ast.rbi +47 -0
  72. data/sorbet/rbi/gems/concurrent-ruby.rbi +218 -0
  73. data/sorbet/rbi/gems/crack.rbi +47 -0
  74. data/sorbet/rbi/gems/docile.rbi +31 -0
  75. data/sorbet/rbi/gems/domain_name.rbi +51 -0
  76. data/sorbet/rbi/gems/dotenv.rbi +67 -0
  77. data/sorbet/rbi/gems/faker.rbi +1350 -0
  78. data/sorbet/rbi/gems/hashdiff.rbi +65 -0
  79. data/sorbet/rbi/gems/http-cookie.rbi +92 -0
  80. data/sorbet/rbi/gems/http-form_data.rbi +73 -0
  81. data/sorbet/rbi/gems/http.rbi +609 -0
  82. data/sorbet/rbi/gems/http_parser.rb.rbi +36 -0
  83. data/sorbet/rbi/gems/i18n.rbi +191 -0
  84. data/sorbet/rbi/gems/jaro_winkler.rbi +14 -0
  85. data/sorbet/rbi/gems/parallel.rbi +81 -0
  86. data/sorbet/rbi/gems/parser.rbi +835 -0
  87. data/sorbet/rbi/gems/public_suffix.rbi +103 -0
  88. data/sorbet/rbi/gems/rainbow.rbi +117 -0
  89. data/sorbet/rbi/gems/rspec-core.rbi +1655 -0
  90. data/sorbet/rbi/gems/rspec-support.rbi +126 -0
  91. data/sorbet/rbi/gems/rspec.rbi +14 -0
  92. data/sorbet/rbi/gems/rubocop-performance.rbi +276 -0
  93. data/sorbet/rbi/gems/rubocop-rspec.rbi +860 -0
  94. data/sorbet/rbi/gems/rubocop.rbi +6943 -0
  95. data/sorbet/rbi/gems/ruby-progressbar.rbi +304 -0
  96. data/sorbet/rbi/gems/simplecov-html.rbi +30 -0
  97. data/sorbet/rbi/gems/simplecov.rbi +225 -0
  98. data/sorbet/rbi/gems/unf.rbi +18 -0
  99. data/sorbet/rbi/gems/unicode-display_width.rbi +16 -0
  100. data/sorbet/rbi/gems/vcr.rbi +503 -0
  101. data/sorbet/rbi/gems/webmock.rbi +521 -0
  102. data/sorbet/rbi/hidden-definitions/errors.txt +4802 -0
  103. data/sorbet/rbi/hidden-definitions/hidden.rbi +10700 -0
  104. data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +8682 -0
  105. data/sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi +4222 -0
  106. data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +111 -0
  107. data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +543 -0
  108. data/sorbet/rbi/todo.rbi +24 -0
  109. data/spec/config_spec.rb +26 -0
  110. data/spec/helpers/config_helper.rb +21 -0
  111. data/spec/helpers/vcr_helper.rb +19 -0
  112. data/spec/spec_helper.rb +120 -0
  113. data/spec/uk/api_resource_spec.rb +39 -0
  114. data/spec/uk/resources/agreement_spec.rb +23 -0
  115. data/spec/uk/resources/card_spec.rb +197 -0
  116. metadata +339 -0
@@ -0,0 +1,12 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Transaction < ::EML::UK::Payload; end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Unload < ::EML::UK::Payload
9
+ REQUIRED_CONFIG = %i[merchant_group].freeze
10
+ REQUIRED_VALUES = %i[amount location.country note].freeze
11
+
12
+ private
13
+
14
+ sig { params(amount: Numeric).returns(Numeric) }
15
+ attr_accessor :amount
16
+
17
+ # While client_time is sent to EML as a JSON DateTime, there are many
18
+ # classes that could be used which causes a typing challenge. For
19
+ # example, if Rails is in use, we will probably receive a
20
+ # ActiveSupport::TimeWithZone
21
+ sig { params(client_time: T.untyped).returns(T.untyped) }
22
+ attr_accessor :client_time
23
+
24
+ sig { params(location: Hash).void }
25
+ def location=(location)
26
+ @location = EML::UK::Payload::Location.new(location)
27
+ end
28
+
29
+ sig { params(merchant_group: String).returns(String) }
30
+ attr_accessor :merchant_group
31
+
32
+ sig { params(note: String).returns(String) }
33
+ attr_accessor :note
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Unlock < ::EML::UK::Payload
9
+ REQUIRED_CONFIG = %i[merchant_group].freeze
10
+ REQUIRED_VALUES = %i[note].freeze
11
+
12
+ private
13
+
14
+ sig { params(merchant_group: String).returns(String) }
15
+ attr_accessor :merchant_group
16
+
17
+ sig { params(note: String).returns(String) }
18
+ attr_accessor :note
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Void < ::EML::UK::Payload
9
+ REQUIRED_CONFIG = %i[merchant_group].freeze
10
+ REQUIRED_VALUES = %i[note].freeze
11
+
12
+ private
13
+
14
+ sig { params(merchant_group: String).returns(String) }
15
+ attr_accessor :merchant_group
16
+
17
+ sig { params(note: String).returns(String) }
18
+ attr_accessor :note
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,64 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ class Contactentity < ::EML::Payload
8
+ REQUIRED_VALUES = %i[first_name last_name address1 city country].freeze
9
+
10
+ include ISO
11
+
12
+ private
13
+
14
+ sig { params(first_name: String).void }
15
+ def first_name=(first_name)
16
+ validate_max_length(:first_name, first_name, 50)
17
+ @first_name = first_name
18
+ end
19
+
20
+ sig { params(last_name: String).void }
21
+ def last_name=(last_name)
22
+ validate_max_length(:last_name, last_name, 50)
23
+ @last_name = last_name
24
+ end
25
+
26
+ sig { params(address1: String).void }
27
+ def address1=(address1)
28
+ validate_max_length(:address1, address1, 255)
29
+ @address1 = address1
30
+ end
31
+
32
+ sig { params(address2: String).void }
33
+ def address2=(address2)
34
+ validate_max_length(:address2, address2, 255)
35
+ @address2 = address2
36
+ end
37
+
38
+ sig { params(city: String).returns(String) }
39
+ attr_accessor :city
40
+
41
+ sig { params(postal_code: String).returns(String) }
42
+ attr_accessor :postal_code
43
+
44
+ sig { params(phone: String).void }
45
+ def phone=(phone)
46
+ validate_max_length(:phone, phone, 20)
47
+ @phone = phone
48
+ end
49
+
50
+ sig { params(email: String).void }
51
+ def email=(email)
52
+ validate_max_length(:email, email, 255)
53
+ @email = email
54
+ end
55
+
56
+ sig { params(dob: String).void }
57
+ def dob=(dob)
58
+ validate_max_length(:dob, dob, 8)
59
+ @dob = dob
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,48 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module ISO
8
+ private
9
+
10
+ def state=(state)
11
+ state_or_province(state, "state")
12
+ end
13
+
14
+ def province=(province)
15
+ state_or_province(province, "province")
16
+ end
17
+
18
+ def state_or_province(state, title)
19
+ if EML::STATES.include?(state) || state.nil?
20
+ instance_variable_set(:"@#{title}", state)
21
+ return
22
+ end
23
+
24
+ raise(
25
+ ArgumentError,
26
+ "Expected #{title} to be an uppercase ISO 3166-2 code " +
27
+ %(but received "#{state}".) + "\n" \
28
+ "Please see http://www.unece.org/cefact/locode/subdivisions.html"
29
+ )
30
+ end
31
+
32
+ def country=(country)
33
+ if EML::COUNTRIES.include?(country) || country.nil?
34
+ @country = country
35
+ return
36
+ end
37
+
38
+ raise(
39
+ ArgumentError,
40
+ "Expected country to be an uppercase ISO 3166-1 alpha-3 code " +
41
+ %(but received "#{country}".) + "\nPlease see " \
42
+ "https://unstats.un.org/unsd/tradekb/Knowledgebase/Country-Code"
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,30 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ class Location < ::EML::Payload
8
+ extend T::Sig
9
+ include ISO
10
+
11
+ private
12
+
13
+ sig { params(name: String).returns(String) }
14
+ attr_accessor :name
15
+
16
+ sig { params(address1: String).returns(String) }
17
+ attr_accessor :address1
18
+
19
+ sig { params(address2: String).returns(String) }
20
+ attr_accessor :address2
21
+
22
+ sig { params(city: String).returns(String) }
23
+ attr_accessor :city
24
+
25
+ sig { params(postal_code: String).returns(String) }
26
+ attr_accessor :postal_code
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Agreement < APIResource
7
+ ENDPOINT_BASE = T.let("agreements", String)
8
+
9
+ class << self
10
+ extend T::Sig
11
+
12
+ # Cardholder Agreement Lookup
13
+ # Look up the cardholder agreement URL for a card that has not been
14
+ # created
15
+ #
16
+ # @param payload [Hash] POST payload that conforms to
17
+ # EML::UK::Payload::Agreement::Show
18
+ # @param params [Hash] URL query string parameters that conform to
19
+ # EML::UK::Parameters::Agreement::Show
20
+ sig do
21
+ params(
22
+ payload: T::Hash[Symbol, T.untyped],
23
+ params: T::Hash[Symbol, T.untyped]
24
+ ).returns(EML::Response)
25
+ end
26
+ def show(payload: {}, params: {})
27
+ new.request(:post, payload: payload, params: params)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,181 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Card < APIResource
7
+ ENDPOINT_BASE = T.let("cards", String)
8
+
9
+ class << self
10
+ extend T::Sig
11
+
12
+ # Activate a card
13
+ # Activation is a necessary first step but does not associate a person
14
+ # with the card; that requires registration
15
+ #
16
+ # @param id [String] Card identifier
17
+ # @param payload [Hash] POST payload that conforms to
18
+ # EML::UK::Payload::Card::Activation
19
+ # @param params [Hash] URL query string parameters that conform to
20
+ # EML::UK::Parameters::Card::Activation
21
+ sig do
22
+ params(
23
+ id: String,
24
+ payload: T::Hash[Symbol, T.untyped],
25
+ params: T::Hash[Symbol, T.untyped]
26
+ ).returns(EML::Response)
27
+ end
28
+ def activate(id:, payload:, params: {})
29
+ new(id: id).
30
+ request(:post, "activations", payload: payload, params: params)
31
+ end
32
+
33
+ # Register a card
34
+ # Registration is associating a person with an activated card
35
+ #
36
+ # @param id [String] Card identifier
37
+ # @param payload [Hash] POST payload that conforms to
38
+ # EML::UK::Payload::Card::Register
39
+ # @param params [Hash] URL query string parameters that conform to
40
+ # EML::UK::Parameters::Card::Register
41
+ sig do
42
+ params(
43
+ id: String,
44
+ payload: T::Hash[Symbol, T.untyped],
45
+ params: T::Hash[Symbol, T.untyped]
46
+ ).returns(EML::Response)
47
+ end
48
+ def register(id:, payload:, params: {})
49
+ new(id: id).
50
+ request(:post, "register", payload: payload, params: params)
51
+ end
52
+
53
+ # Retrieve card information
54
+ #
55
+ # @param id [String] Card identifier
56
+ # @param params [Hash] URL query string parameters that conform to
57
+ # EML::UK::Parameters::Card::Info
58
+ sig do
59
+ params(id: String, params: T::Hash[Symbol, T.untyped]).
60
+ returns(EML::Response)
61
+ end
62
+ def show(id:, params: {})
63
+ new(id: id).request(:get, params: params)
64
+ end
65
+
66
+ # Access a card's transaction history
67
+ # The level of detail in this transaction history is relatively
68
+ # extensive and therefore would not be suitable for presentation to card
69
+ # holders
70
+ #
71
+ # @param id [String] Card identifier
72
+ # @param params [Hash] URL query string parameters that conform to
73
+ # EML::UK::Parameters::Card::Transactions
74
+ sig do
75
+ params(
76
+ id: String,
77
+ params: T::Hash[Symbol, T.untyped]
78
+ ).returns(EML::Response)
79
+ end
80
+ def transactions(id:, params: {})
81
+ new(id: id).request(:get, "transactions", params: params)
82
+ end
83
+
84
+ # Reload a card
85
+ # Add funds onto an active card, provided the amount does not violate
86
+ # the existing regulations
87
+ #
88
+ # @param id [String] Card identifier
89
+ # @param payload [Hash] POST payload that conforms to
90
+ # EML::UK::Payload::Card::Reload
91
+ # @param params [Hash] URL query string parameters that conform to
92
+ # EML::UK::Parameters::Card::Reload
93
+ sig do
94
+ params(
95
+ id: String,
96
+ payload: T::Hash[Symbol, T.untyped],
97
+ params: T::Hash[Symbol, T.untyped]
98
+ ).returns(EML::Response)
99
+ end
100
+ def reload(id:, payload:, params: {})
101
+ new(id: id).
102
+ request(:post, "reloads", payload: payload, params: params)
103
+ end
104
+
105
+ # Unload a card
106
+ # Remove funds from a card
107
+ #
108
+ # @param id [String] Card identifier
109
+ # @param payload [Hash] POST payload that conforms to
110
+ # EML::UK::Payload::Card::Unload
111
+ # @param params [Hash] URL query string parameters that conform to
112
+ # EML::UK::Parameters::Card::Unload
113
+ sig do
114
+ params(
115
+ id: String,
116
+ payload: T::Hash[Symbol, T.untyped],
117
+ params: T::Hash[Symbol, T.untyped]
118
+ ).returns(EML::Response)
119
+ end
120
+ def unload(id:, payload:, params: {})
121
+ new(id: id).request(:post, "unload", payload: payload, params: params)
122
+ end
123
+
124
+ # Lock a card
125
+ #
126
+ # @param id [String] Card identifier
127
+ # @param payload [Hash] POST payload that conforms to
128
+ # EML::UK::Payload::Card::Lock
129
+ # @param params [Hash] URL query string parameters that conform to
130
+ # EML::UK::Parameters::Card::Lock
131
+ sig do
132
+ params(
133
+ id: String,
134
+ payload: T::Hash[Symbol, T.untyped],
135
+ params: T::Hash[Symbol, T.untyped]
136
+ ).returns(EML::Response)
137
+ end
138
+ def lock(id:, payload:, params: {})
139
+ new(id: id).request(:post, "locks", payload: payload, params: params)
140
+ end
141
+
142
+ # Unlock a card
143
+ #
144
+ # @param id [String] Card identifier
145
+ # @param payload [Hash] POST payload that conforms to
146
+ # EML::UK::Payload::Card::Unlock
147
+ # @param params [Hash] URL query string parameters that conform to
148
+ # EML::UK::Parameters::Card::Unlock
149
+ sig do
150
+ params(
151
+ id: String,
152
+ payload: T::Hash[Symbol, T.untyped],
153
+ params: T::Hash[Symbol, T.untyped]
154
+ ).returns(EML::Response)
155
+ end
156
+ def unlock(id:, payload:, params: {})
157
+ new(id: id).
158
+ request(:post, "unlocks", payload: payload, params: params)
159
+ end
160
+
161
+ # Void a card
162
+ #
163
+ # @param id [String] Card identifier
164
+ # @param payload [Hash] POST payload that conforms to
165
+ # EML::UK::Payload::Card::Void
166
+ # @param params [Hash] URL query string parameters that conform to
167
+ # EML::UK::Parameters::Card::Void
168
+ sig do
169
+ params(
170
+ id: String,
171
+ payload: T::Hash[Symbol, T.untyped],
172
+ params: T::Hash[Symbol, T.untyped]
173
+ ).returns(EML::Response)
174
+ end
175
+ def void(id:, payload:, params: {})
176
+ new(id: id).request(:post, "voids", payload: payload, params: params)
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end