eml 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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