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,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