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