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,26 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Unload < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ private
13
+
14
+ sig { params(program: String).returns(String) }
15
+ attr_accessor :program
16
+
17
+ sig { params(search_parameter: String).returns(String) }
18
+ def search_parameter=(search_parameter)
19
+ validate_search_parameter(search_parameter)
20
+ @search_parameter = search_parameter
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Unlock < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ private
13
+
14
+ sig { params(program: String).returns(String) }
15
+ attr_accessor :program
16
+
17
+ sig { params(search_parameter: String).returns(String) }
18
+ def search_parameter=(search_parameter)
19
+ validate_search_parameter(search_parameter)
20
+ @search_parameter = search_parameter
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Unlock < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ private
13
+
14
+ sig { params(program: String).returns(String) }
15
+ attr_accessor :program
16
+
17
+ sig { params(search_parameter: String).returns(String) }
18
+ def search_parameter=(search_parameter)
19
+ validate_search_parameter(search_parameter)
20
+ @search_parameter = search_parameter
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,94 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # A payload is the data sent in the body of a request such as POST or PUT
5
+ module EML
6
+ module UK
7
+ class Payload < ::EML::Payload
8
+ extend T::Sig
9
+
10
+ sig { params(payload: T::Hash[Symbol, T.untyped]).void }
11
+ def initialize(payload)
12
+ payload = merge_optional_config(payload)
13
+ payload = merge_required_config(payload)
14
+ super
15
+ end
16
+
17
+ class << self
18
+ extend T::Sig
19
+
20
+ sig do
21
+ params(
22
+ resource_class: T.untyped,
23
+ endpoint: String,
24
+ payload: T::Hash[Symbol, T.untyped]
25
+ ).returns(T.untyped)
26
+ end
27
+ def convert(resource_class, endpoint, payload)
28
+ endpoint_class = EML::UK::EndpointClass.(
29
+ class_type: self::ENDPOINT_CLASS_TYPE,
30
+ resource_class: resource_class,
31
+ endpoint: endpoint
32
+ )
33
+
34
+ convert_with_endpoint_class(
35
+ endpoint: endpoint, endpoint_class: endpoint_class,
36
+ payload: payload, resource_class: resource_class
37
+ )
38
+ end
39
+ end
40
+
41
+ protected
42
+
43
+ BOOLEAN_OPTIONS = %w[true false].freeze
44
+
45
+ sig { params(param_name: String, param_value: String).void }
46
+ def validate_boolean(param_name, param_value)
47
+ return if BOOLEAN_OPTIONS.include?(param_value)
48
+
49
+ message = "#{param_name} should be the string 'true' or 'false' but " \
50
+ "received #{param_value.inspect}"
51
+ raise ArgumentError, message
52
+ end
53
+
54
+ sig { params(dob: String).void }
55
+ def validate_dob(dob)
56
+ validate_max_length(:dob, dob, 8)
57
+ dob_i = dob.to_i
58
+ raise ArgumentError if dob_i < 1_011_900 || dob_i > 13_000_000
59
+ rescue ArgumentError
60
+ raise ArgumentError, "DOB should be in the format MMDDYYYY"
61
+ end
62
+
63
+ private
64
+
65
+ sig do
66
+ params(payload: T::Hash[Symbol, T.untyped]).
67
+ returns(T::Hash[Symbol, T.untyped])
68
+ end
69
+ def merge_optional_config(payload)
70
+ return payload unless self.class.const_defined?(:OPTIONAL_CONFIG)
71
+
72
+ config = EML::UK.config
73
+ self.class.const_get(:OPTIONAL_CONFIG).
74
+ each_with_object(payload.dup) do |name, new_payload|
75
+ new_payload[name] ||= config.public_send(name)
76
+ end
77
+ end
78
+
79
+ sig do
80
+ params(payload: T::Hash[Symbol, T.untyped]).
81
+ returns(T::Hash[Symbol, T.untyped])
82
+ end
83
+ def merge_required_config(payload)
84
+ return payload unless self.class.const_defined?(:REQUIRED_CONFIG)
85
+
86
+ config = EML::UK.config
87
+ self.class.const_get(:REQUIRED_CONFIG).
88
+ each_with_object(payload.dup) do |name, new_payload|
89
+ new_payload[name] ||= config.require_parameter(name)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,46 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Agreement
8
+ class Show < ::EML::UK::Payload
9
+ OPTIONAL_DEFAULTS = %i[merchant_group program].freeze
10
+
11
+ private
12
+
13
+ sig { params(bin: String).returns(String) }
14
+ attr_accessor :bin
15
+
16
+ sig { params(country: String).returns(String) }
17
+ attr_accessor :country
18
+
19
+ sig { params(developer: String).returns(String) }
20
+ attr_accessor :developer
21
+
22
+ sig { params(is_account_expiry: String).returns(String) }
23
+ def is_account_expiry=(is_account_expiry)
24
+ validate_boolean("is_account_expiry", is_account_expiry)
25
+ @Is_account_expiry = is_account_expiry
26
+ end
27
+
28
+ sig { params(is_fee_free: String).returns(String) }
29
+ def is_fee_free=(is_fee_free)
30
+ validate_boolean("is_fee_free", is_fee_free)
31
+ @Is_fee_free = is_fee_free
32
+ end
33
+
34
+ sig { params(merchant_group: String).returns(String) }
35
+ attr_accessor :merchant_group
36
+
37
+ sig { params(program: String).returns(String) }
38
+ attr_accessor :program
39
+
40
+ sig { params(region: String).returns(String) }
41
+ attr_accessor :region
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,73 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Activation < ::EML::UK::Payload
9
+ REQUIRED_VALUES =
10
+ %i[amount location.name location.country sales_channel].freeze
11
+ REQUIRED_CONFIG = %i[merchant_group].freeze
12
+
13
+ private
14
+
15
+ sig { params(amount: Numeric).returns(Numeric) }
16
+ attr_accessor :amount
17
+
18
+ sig { params(campaign: String).returns(String) }
19
+ attr_accessor :campaign
20
+
21
+ sig { params(cardholder_user_id: String).returns(String) }
22
+ attr_accessor :cardholder_user_id
23
+
24
+ # While client_order_date is sent to EML as a JSON DateTime,
25
+ # there are many classes that could be used which causes a typing
26
+ # challenge. For example, if Rails is in use, we will probably receive
27
+ # a ActiveSupport::TimeWithZone
28
+ sig { params(client_order_date: T.untyped).returns(T.untyped) }
29
+ attr_accessor :client_order_date
30
+
31
+ sig { params(client_reference_number: String).void }
32
+ def client_reference_number=(client_reference_number)
33
+ validate_max_length(
34
+ :client_reference_number, client_reference_number, 50
35
+ )
36
+ @client_reference_number = client_reference_number
37
+ end
38
+
39
+ # While client_time is sent to EML as a JSON DateTime,
40
+ # there are many classes that could be used which causes a typing
41
+ # challenge. For example, if Rails is in use, we will probably receive
42
+ # a ActiveSupport::TimeWithZone
43
+ sig { params(client_time: T.untyped).returns(T.untyped) }
44
+ attr_accessor :client_time
45
+
46
+ sig { params(client_tracking_id: String).void }
47
+ def client_tracking_id=(client_tracking_id)
48
+ validate_max_length(
49
+ :client_tracking_id, client_tracking_id, 50
50
+ )
51
+ @client_tracking_id = client_tracking_id
52
+ end
53
+
54
+ sig { params(location: Hash).void }
55
+ def location=(location)
56
+ @location = EML::UK::Payload::Location.new(location)
57
+ end
58
+
59
+ sig { params(merchant_group: String).returns(String) }
60
+ attr_accessor :merchant_group
61
+
62
+ sig { params(note: String).returns(String) }
63
+ attr_accessor :note
64
+
65
+ SALES_CHANNELS = %w[Online InPerson].freeze
66
+
67
+ sig { params(sales_channel: String).returns(String) }
68
+ attr_accessor :sales_channel
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,34 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Lock < ::EML::UK::Payload
9
+ REQUIRED_CONFIG = %i[merchant_group].freeze
10
+ REQUIRED_VALUES = %i[note reason].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
+
20
+ REASONS = %w[
21
+ Damaged DataBreach Lost Miscellaneous OfficeError
22
+ PastAccountExpirationDate Stolen UnclaimedProperty
23
+ ].freeze
24
+
25
+ sig { params(reason: String).void }
26
+ def reason=(reason)
27
+ validate_enum(:reason, reason, REASONS)
28
+ @reason = reason
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,70 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Register < ::EML::UK::Payload
9
+ include ISO
10
+
11
+ REQUIRED_VALUES =
12
+ %i[first_name last_name address1 city country email].freeze
13
+
14
+ private
15
+
16
+ sig { params(first_name: String).void }
17
+ def first_name=(first_name)
18
+ validate_max_length(:first_name, first_name, 50)
19
+ @first_name = first_name
20
+ end
21
+
22
+ sig { params(last_name: String).void }
23
+ def last_name=(last_name)
24
+ validate_max_length(:last_name, last_name, 50)
25
+ @last_name = last_name
26
+ end
27
+
28
+ sig { params(address1: String).void }
29
+ def address1=(address1)
30
+ validate_max_length(:address1, address1, 255)
31
+ @address1 = address1
32
+ end
33
+
34
+ sig { params(address2: String).void }
35
+ def address2=(address2)
36
+ validate_max_length(:address2, address2, 255)
37
+ @address2 = address2
38
+ end
39
+
40
+ sig { params(city: String).void }
41
+ def city=(city)
42
+ validate_max_length(:city, city, 255)
43
+ @city = city
44
+ end
45
+
46
+ sig { params(dob: String).void }
47
+ def dob=(dob)
48
+ validate_dob(dob)
49
+ @dob = dob
50
+ end
51
+
52
+ sig { params(email: String).void }
53
+ def email=(email)
54
+ validate_max_length(:email, email, 255)
55
+ @email = email
56
+ end
57
+
58
+ sig { params(phone: String).void }
59
+ def phone=(phone)
60
+ validate_max_length(:phone, phone, 20)
61
+ @phone = phone
62
+ end
63
+
64
+ sig { params(postal_code: String).returns(String) }
65
+ attr_accessor :postal_code
66
+ end
67
+ end
68
+ end
69
+ end
70
+ 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 Reload < ::EML::UK::Payload
9
+ REQUIRED_CONFIG = %i[merchant_group].freeze
10
+ REQUIRED_VALUES = %i[amount location.country].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,12 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Payload
7
+ module Card
8
+ class Show < ::EML::UK::Payload; end
9
+ end
10
+ end
11
+ end
12
+ end