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,35 @@
1
+ # typed: ignore
2
+ # frozen_string_literal: true
3
+
4
+ require "bigdecimal"
5
+
6
+ module EML
7
+ module UK
8
+ class ParseDate
9
+ extend T::Sig
10
+
11
+ def self.call(date_string)
12
+ new(date_string).call
13
+ end
14
+
15
+ def initialize(date_string)
16
+ @date_string = date_string
17
+ end
18
+
19
+ def call
20
+ return if @date_string.nil?
21
+
22
+ matches = @date_string.match(%r(/Date\(((\d{13})([\+\-]\d{4})?)\)/))
23
+ return if matches.nil?
24
+
25
+ milliseconds = BigDecimal(matches[2])
26
+ timezone_offset = matches[3]
27
+
28
+ time = Time.at(milliseconds / 1000).utc
29
+ return time if timezone_offset.nil?
30
+
31
+ time.localtime("#{timezone_offset[0, 3]}:#{timezone_offset[3, 4]}")
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,56 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Model
7
+ class Transaction
8
+ FIELDS = %w[
9
+ acceptor_code
10
+ acceptor_location
11
+ activity
12
+ amount
13
+ auth_id
14
+ authorization_request_id
15
+ currency
16
+ eml_id
17
+ expiration_minutes
18
+ location
19
+ merchant_category_code
20
+ merchant_country
21
+ notes
22
+ original_transaction_date
23
+ pos_transaction_time
24
+ reason
25
+ result
26
+ retrieval_reference_number
27
+ system_transaction_id
28
+ timestamp
29
+ transaction_amount
30
+ transaction_currency
31
+ user
32
+ ].freeze
33
+ private_constant :FIELDS
34
+
35
+ FIELDS.each { |field| __send__(:attr_reader, :"#{field}") }
36
+
37
+ def initialize(response)
38
+ FIELDS.each do |field|
39
+ value = field_value(field, response[field])
40
+ instance_variable_set(:"@#{field}", value)
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def field_value(field, raw_value)
47
+ if field.include?("time")
48
+ EML::UK::ParseDate.(raw_value)
49
+ else
50
+ raw_value
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,99 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # Parameters are the elements of a query string.
5
+ # For example: example.com?param1=value1&param2=value2
6
+ module EML
7
+ module UK
8
+ class Parameters < ::EML::Parameters
9
+ extend T::Sig
10
+
11
+ sig { params(params: T::Hash[Symbol, T.untyped]).void }
12
+ def initialize(params)
13
+ params = merge_required_config(params)
14
+ params = merge_optional_config(params)
15
+ super
16
+ end
17
+
18
+ class << self
19
+ extend T::Sig
20
+
21
+ sig do
22
+ params(
23
+ resource_class: T.untyped,
24
+ endpoint: String,
25
+ params: T::Hash[Symbol, T.untyped]
26
+ ).returns(T.untyped)
27
+ end
28
+ def convert(resource_class, endpoint, params)
29
+ endpoint_class = EML::UK::EndpointClass.(
30
+ class_type: self::ENDPOINT_CLASS_TYPE,
31
+ resource_class: resource_class, endpoint: endpoint
32
+ )
33
+
34
+ convert_with_endpoint_class(
35
+ endpoint: endpoint, endpoint_class: endpoint_class,
36
+ resource_class: resource_class, params: params
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
+ SEARCH_PARAMETER_OPTIONS = %w[
55
+ ActualCardNumber CarrierNumber ClientTrackingId ExternalId
56
+ PaymentTrackingID PrintText
57
+ ].freeze
58
+
59
+ sig { params(value: String).void }
60
+ def validate_search_parameter(value)
61
+ return if SEARCH_PARAMETER_OPTIONS.include?(value)
62
+
63
+ message = "search_parameter should be one of " \
64
+ "#{SEARCH_PARAMETER_OPTIONS.join(", ")} but received #{value.inspect}"
65
+ raise ArgumentError, message
66
+ end
67
+
68
+ private
69
+
70
+ sig do
71
+ params(params: T::Hash[Symbol, T.untyped]).
72
+ returns(T::Hash[Symbol, T.untyped])
73
+ end
74
+ def merge_optional_config(params)
75
+ return params unless self.class.const_defined?(:OPTIONAL_CONFIG)
76
+
77
+ config = EML::UK.config
78
+ self.class.const_get(:OPTIONAL_CONFIG).
79
+ each_with_object(params.dup) do |name, new_params|
80
+ new_params[name] ||= config.public_send(name)
81
+ end
82
+ end
83
+
84
+ sig do
85
+ params(params: T::Hash[Symbol, T.untyped]).
86
+ returns(T::Hash[Symbol, T.untyped])
87
+ end
88
+ def merge_required_config(params)
89
+ return params unless self.class.const_defined?(:REQUIRED_CONFIG)
90
+
91
+ config = EML::UK.config
92
+ self.class.const_get(:REQUIRED_CONFIG).
93
+ each_with_object(params.dup) do |name, new_params|
94
+ new_params[name] ||= config.require_parameter(name)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,22 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Agreement
8
+ class Show < ::EML::UK::Parameters
9
+ def initialize(params)
10
+ params[:client_language] ||= "en"
11
+ super
12
+ end
13
+
14
+ private
15
+
16
+ sig { params(client_language: String).returns(String) }
17
+ attr_accessor :client_language
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Activation < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ sig { params(program: String).returns(String) }
13
+ attr_accessor :program
14
+
15
+ sig { params(search_parameter: String).returns(String) }
16
+ def search_parameter=(search_parameter)
17
+ validate_search_parameter(search_parameter)
18
+ @search_parameter = search_parameter
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ 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 Lock < ::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,24 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Register < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ sig { params(program: String).returns(String) }
13
+ attr_accessor :program
14
+
15
+ sig { params(search_parameter: String).returns(String) }
16
+ def search_parameter=(search_parameter)
17
+ validate_search_parameter(search_parameter)
18
+ @search_parameter = search_parameter
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Reload < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ sig { params(program: String).returns(String) }
13
+ attr_accessor :program
14
+
15
+ sig { params(search_parameter: String).returns(String) }
16
+ def search_parameter=(search_parameter)
17
+ validate_search_parameter(search_parameter)
18
+ @search_parameter = search_parameter
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,102 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Show < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ FIELDS_OPTIONS = %w[
13
+ account_expiration_date
14
+ activating_merchant_group_name
15
+ activating_merchant_group_uniquetag
16
+ activation_amount
17
+ activation_country
18
+ activation_date
19
+ activation_transaction_Id
20
+ actual_balance
21
+ adjusted_balance
22
+ agreement_txt
23
+ agreement_pdf
24
+ agreement_pdf_fileName
25
+ amf_amount
26
+ amf_start_date
27
+ amf_next_date
28
+ available_balance
29
+ bank_name
30
+ barcode_image
31
+ can_activate
32
+ can_redeem
33
+ card_image
34
+ card_type
35
+ client_tracking_id
36
+ currency
37
+ cvv2
38
+ distributor_refund
39
+ expiration_date
40
+ has_atm_access
41
+ has_pin
42
+ id
43
+ is_icc_card
44
+ is_organization_registration
45
+ is_registered
46
+ is_reloadable
47
+ is_virtual
48
+ pan
49
+ pan_last_four
50
+ pin_enabled
51
+ print_text
52
+ program_can_register
53
+ program_name
54
+ program_uniquetag
55
+ promotion_balance
56
+ promotion_expiration
57
+ promotion_type_id
58
+ security_code
59
+ status
60
+ uri
61
+ unload_to_ach_fee
62
+ ].freeze
63
+
64
+ sig { params(fields: T::Array[String]).returns(String) }
65
+ def fields=(fields)
66
+ unless fields.first == "all"
67
+ fields.each do |field|
68
+ validate_array("fields", field, FIELDS_OPTIONS)
69
+ end
70
+ end
71
+
72
+ @fields = fields.join(",")
73
+ end
74
+
75
+ sig { params(log_balance_inquiry: String).returns(String) }
76
+ def log_balance_inquiry=(log_balance_inquiry)
77
+ validate_boolean("log_balance_inquiry", log_balance_inquiry)
78
+ @log_balance_inquiry = log_balance_inquiry
79
+ end
80
+
81
+ sig { params(only_valid_status: String).returns(String) }
82
+ def only_valid_status=(only_valid_status)
83
+ validate_boolean("only_valid_status", only_valid_status)
84
+ @only_valid_status = only_valid_status
85
+ end
86
+
87
+ sig { params(program: String).returns(String) }
88
+ attr_accessor :program
89
+
90
+ sig { params(search_parameter: String).returns(String) }
91
+ def search_parameter=(search_parameter)
92
+ validate_search_parameter(search_parameter)
93
+ @search_parameter = search_parameter
94
+ end
95
+
96
+ sig { params(security_code: String).returns(String) }
97
+ attr_accessor :security_code
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,59 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module EML
5
+ module UK
6
+ class Parameters
7
+ module Card
8
+ class Transaction < ::EML::UK::Parameters
9
+ REQUIRED_CONFIG = %i[program].freeze
10
+ OPTIONAL_CONFIG = %i[search_parameter].freeze
11
+
12
+ private
13
+
14
+ FIELDS_OPTIONS = %w[
15
+ activity
16
+ amount
17
+ authorization_request_id
18
+ currency
19
+ location
20
+ merchant_category_code
21
+ merchant_country
22
+ notes
23
+ original_transaction_date
24
+ pos_transaction_time
25
+ reason
26
+ result
27
+ retrieval_reference_number
28
+ system_transaction_id
29
+ timestamp
30
+ user
31
+ ].freeze
32
+
33
+ sig { params(fields: T::Array[String]).returns(String) }
34
+ def fields=(fields)
35
+ unless fields.first == "all"
36
+ fields.each do |field|
37
+ validate_array("fields", field, FIELDS_OPTIONS)
38
+ end
39
+ end
40
+
41
+ @fields = fields.join(",")
42
+ end
43
+
44
+ sig { params(filter: String).returns(String) }
45
+ attr_accessor :filter
46
+
47
+ sig { params(program: String).returns(String) }
48
+ attr_accessor :program
49
+
50
+ sig { params(search_parameter: String).returns(String) }
51
+ def search_parameter=(search_parameter)
52
+ validate_search_parameter(search_parameter)
53
+ @search_parameter = search_parameter
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end