eml 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +10 -0
- data/.env.example +6 -0
- data/.gitignore +5 -0
- data/.rspec +5 -0
- data/.rubocop.yml +90 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.md +87 -0
- data/eml.gemspec +37 -0
- data/lib/eml.rb +22 -0
- data/lib/eml/config.rb +49 -0
- data/lib/eml/data/countries.rb +260 -0
- data/lib/eml/data/currencies.rb +176 -0
- data/lib/eml/data/states.rb +4055 -0
- data/lib/eml/environment.rb +54 -0
- data/lib/eml/error.rb +25 -0
- data/lib/eml/error/rest.rb +42 -0
- data/lib/eml/error/rest/authentication.rb +21 -0
- data/lib/eml/error/rest/bad_request.rb +20 -0
- data/lib/eml/error/rest/daily_funding_limit.rb +19 -0
- data/lib/eml/error/rest/forbidden.rb +20 -0
- data/lib/eml/error/rest/internal_server.rb +9 -0
- data/lib/eml/error/rest/not_found.rb +20 -0
- data/lib/eml/error/rest/unprocessable_entity.rb +20 -0
- data/lib/eml/lib/endpoint_class.rb +42 -0
- data/lib/eml/parameters.rb +153 -0
- data/lib/eml/payload.rb +137 -0
- data/lib/eml/response.rb +103 -0
- data/lib/eml/uk.rb +51 -0
- data/lib/eml/uk/api_resource.rb +94 -0
- data/lib/eml/uk/config.rb +52 -0
- data/lib/eml/uk/lib/endpoint_class.rb +19 -0
- data/lib/eml/uk/lib/parse_date.rb +35 -0
- data/lib/eml/uk/model/transaction.rb +56 -0
- data/lib/eml/uk/parameters.rb +99 -0
- data/lib/eml/uk/parameters/agreement/show.rb +22 -0
- data/lib/eml/uk/parameters/card/activation.rb +24 -0
- data/lib/eml/uk/parameters/card/lock.rb +26 -0
- data/lib/eml/uk/parameters/card/register.rb +24 -0
- data/lib/eml/uk/parameters/card/reload.rb +24 -0
- data/lib/eml/uk/parameters/card/show.rb +102 -0
- data/lib/eml/uk/parameters/card/transaction.rb +59 -0
- data/lib/eml/uk/parameters/card/unload.rb +26 -0
- data/lib/eml/uk/parameters/card/unlock.rb +26 -0
- data/lib/eml/uk/parameters/card/void.rb +26 -0
- data/lib/eml/uk/payload.rb +94 -0
- data/lib/eml/uk/payload/agreement/show.rb +46 -0
- data/lib/eml/uk/payload/card/activation.rb +73 -0
- data/lib/eml/uk/payload/card/lock.rb +34 -0
- data/lib/eml/uk/payload/card/register.rb +70 -0
- data/lib/eml/uk/payload/card/reload.rb +38 -0
- data/lib/eml/uk/payload/card/show.rb +12 -0
- data/lib/eml/uk/payload/card/transaction.rb +12 -0
- data/lib/eml/uk/payload/card/unload.rb +38 -0
- data/lib/eml/uk/payload/card/unlock.rb +23 -0
- data/lib/eml/uk/payload/card/void.rb +23 -0
- data/lib/eml/uk/payload/contactentity.rb +64 -0
- data/lib/eml/uk/payload/iso.rb +48 -0
- data/lib/eml/uk/payload/location.rb +30 -0
- data/lib/eml/uk/resources/agreement.rb +32 -0
- data/lib/eml/uk/resources/card.rb +181 -0
- data/lib/eml/uk/response.rb +29 -0
- data/lib/eml/uk/responses/agreement/show.rb +16 -0
- data/lib/eml/uk/responses/card/reload.rb +19 -0
- data/lib/eml/uk/responses/card/show.rb +53 -0
- data/lib/eml/uk/responses/card/transaction.rb +24 -0
- data/lib/eml/version.rb +6 -0
- data/sorbet/config +2 -0
- data/sorbet/rbi/gems/addressable.rbi +198 -0
- data/sorbet/rbi/gems/ast.rbi +47 -0
- data/sorbet/rbi/gems/concurrent-ruby.rbi +218 -0
- data/sorbet/rbi/gems/crack.rbi +47 -0
- data/sorbet/rbi/gems/docile.rbi +31 -0
- data/sorbet/rbi/gems/domain_name.rbi +51 -0
- data/sorbet/rbi/gems/dotenv.rbi +67 -0
- data/sorbet/rbi/gems/faker.rbi +1350 -0
- data/sorbet/rbi/gems/hashdiff.rbi +65 -0
- data/sorbet/rbi/gems/http-cookie.rbi +92 -0
- data/sorbet/rbi/gems/http-form_data.rbi +73 -0
- data/sorbet/rbi/gems/http.rbi +609 -0
- data/sorbet/rbi/gems/http_parser.rb.rbi +36 -0
- data/sorbet/rbi/gems/i18n.rbi +191 -0
- data/sorbet/rbi/gems/jaro_winkler.rbi +14 -0
- data/sorbet/rbi/gems/parallel.rbi +81 -0
- data/sorbet/rbi/gems/parser.rbi +835 -0
- data/sorbet/rbi/gems/public_suffix.rbi +103 -0
- data/sorbet/rbi/gems/rainbow.rbi +117 -0
- data/sorbet/rbi/gems/rspec-core.rbi +1655 -0
- data/sorbet/rbi/gems/rspec-support.rbi +126 -0
- data/sorbet/rbi/gems/rspec.rbi +14 -0
- data/sorbet/rbi/gems/rubocop-performance.rbi +276 -0
- data/sorbet/rbi/gems/rubocop-rspec.rbi +860 -0
- data/sorbet/rbi/gems/rubocop.rbi +6943 -0
- data/sorbet/rbi/gems/ruby-progressbar.rbi +304 -0
- data/sorbet/rbi/gems/simplecov-html.rbi +30 -0
- data/sorbet/rbi/gems/simplecov.rbi +225 -0
- data/sorbet/rbi/gems/unf.rbi +18 -0
- data/sorbet/rbi/gems/unicode-display_width.rbi +16 -0
- data/sorbet/rbi/gems/vcr.rbi +503 -0
- data/sorbet/rbi/gems/webmock.rbi +521 -0
- data/sorbet/rbi/hidden-definitions/errors.txt +4802 -0
- data/sorbet/rbi/hidden-definitions/hidden.rbi +10700 -0
- data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +8682 -0
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi +4222 -0
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +111 -0
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +543 -0
- data/sorbet/rbi/todo.rbi +24 -0
- data/spec/config_spec.rb +26 -0
- data/spec/helpers/config_helper.rb +21 -0
- data/spec/helpers/vcr_helper.rb +19 -0
- data/spec/spec_helper.rb +120 -0
- data/spec/uk/api_resource_spec.rb +39 -0
- data/spec/uk/resources/agreement_spec.rb +23 -0
- data/spec/uk/resources/card_spec.rb +197 -0
- metadata +339 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
# typed: ignore
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Usually this class wouldn't be called directly, the environment can be managed
|
5
|
+
# via the EML::Config class or one of it's sub-classes
|
6
|
+
module EML
|
7
|
+
class Environment
|
8
|
+
class << self
|
9
|
+
def production?
|
10
|
+
to_sym == :production
|
11
|
+
end
|
12
|
+
|
13
|
+
def test?
|
14
|
+
to_sym == :test
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_sym
|
18
|
+
@to_sym ||= set(default)
|
19
|
+
end
|
20
|
+
|
21
|
+
ENVIRONMENTS = %i[production test].freeze
|
22
|
+
|
23
|
+
def set(value)
|
24
|
+
return @to_sym = value if ENVIRONMENTS.include?(value)
|
25
|
+
|
26
|
+
error_value = value.is_a?(Symbol) ? ":#{value}" : value.to_s
|
27
|
+
raise(
|
28
|
+
ArgumentError,
|
29
|
+
"#{error_value} is not an acceptable environment; " \
|
30
|
+
"please use either :production or :test"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def default
|
37
|
+
return :test if ENV["ENV"] == "test"
|
38
|
+
return rails if rails?
|
39
|
+
|
40
|
+
:production
|
41
|
+
end
|
42
|
+
|
43
|
+
def rails?
|
44
|
+
defined?(Rails)
|
45
|
+
end
|
46
|
+
|
47
|
+
def rails
|
48
|
+
return :production if Rails.env.prod?
|
49
|
+
|
50
|
+
:test
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/eml/error.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# typed: ignore
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
# Error is the base class for more specific EML errors
|
6
|
+
class Error < ::StandardError
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
attr_reader :message
|
10
|
+
|
11
|
+
sig { params(message: T.nilable(String)).void }
|
12
|
+
def initialize(message = nil)
|
13
|
+
@message = T.let(message, T.nilable(String))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
require "eml/error/rest"
|
19
|
+
require "eml/error/rest/authentication"
|
20
|
+
require "eml/error/rest/bad_request"
|
21
|
+
require "eml/error/rest/daily_funding_limit"
|
22
|
+
require "eml/error/rest/forbidden"
|
23
|
+
require "eml/error/rest/internal_server"
|
24
|
+
require "eml/error/rest/not_found"
|
25
|
+
require "eml/error/rest/unprocessable_entity"
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
# RESTError is the parent class for errors related to connections to the EML
|
6
|
+
# REST Web Services APIs
|
7
|
+
class RESTError < Error
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig do
|
11
|
+
params(
|
12
|
+
message: T.nilable(String),
|
13
|
+
response: T.nilable(EML::Response)
|
14
|
+
).void
|
15
|
+
end
|
16
|
+
def initialize(message = nil, response = nil)
|
17
|
+
super(message)
|
18
|
+
|
19
|
+
@response = T.let(response, EML::Response)
|
20
|
+
end
|
21
|
+
|
22
|
+
sig { returns(String) }
|
23
|
+
def http_body
|
24
|
+
@response.error || @response.body.to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
sig { returns(T::Hash[Symbol, String]) }
|
28
|
+
def http_headers
|
29
|
+
@response.headers
|
30
|
+
end
|
31
|
+
|
32
|
+
sig { returns(Integer) }
|
33
|
+
def http_status
|
34
|
+
@response.status
|
35
|
+
end
|
36
|
+
|
37
|
+
sig { returns(String) }
|
38
|
+
def url
|
39
|
+
@response.url.to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
module REST
|
6
|
+
class AuthenticationError < ::EML::RESTError
|
7
|
+
sig do
|
8
|
+
params(
|
9
|
+
message: T.nilable(String),
|
10
|
+
response: T.nilable(EML::Response)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
def initialize(message = nil, response = nil)
|
14
|
+
message ||= "Your credentials were rejected by the server. " \
|
15
|
+
"Please confirm you have set your username and password in the " \
|
16
|
+
"appropriate country configuration"
|
17
|
+
super(message, response)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
module REST
|
6
|
+
class BadRequestError < ::EML::RESTError
|
7
|
+
sig do
|
8
|
+
params(
|
9
|
+
message: T.nilable(String),
|
10
|
+
response: T.nilable(EML::Response)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
def initialize(message = nil, response = nil)
|
14
|
+
message ||= "The request could not be Fault information understood " \
|
15
|
+
"by the server due to malformed syntax"
|
16
|
+
super(message, response)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
module REST
|
6
|
+
class DailyFundingLimitError < ::EML::RESTError
|
7
|
+
sig do
|
8
|
+
params(
|
9
|
+
message: T.nilable(String),
|
10
|
+
response: T.nilable(EML::Response)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
def initialize(message = nil, response = nil)
|
14
|
+
message ||= "The daily maximum load amount has been reached"
|
15
|
+
super(message, response)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
module REST
|
6
|
+
class ForbiddenError < ::EML::RESTError
|
7
|
+
sig do
|
8
|
+
params(
|
9
|
+
message: T.nilable(String),
|
10
|
+
response: T.nilable(EML::Response)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
def initialize(message = nil, response = nil)
|
14
|
+
message ||= response&.body&.fetch("message", nil)
|
15
|
+
message ||= "The user is not authorised to perform the action"
|
16
|
+
super(message, response)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
module REST
|
6
|
+
class NotFoundError < ::EML::RESTError
|
7
|
+
sig do
|
8
|
+
params(
|
9
|
+
message: T.nilable(String),
|
10
|
+
response: T.nilable(EML::Response),
|
11
|
+
id: String
|
12
|
+
).void
|
13
|
+
end
|
14
|
+
def initialize(message = nil, response = nil, id:)
|
15
|
+
message ||= %(A record could not be found with ID "#{id}")
|
16
|
+
super(message, response)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
module REST
|
6
|
+
class UnprocessableEntityError < ::EML::RESTError
|
7
|
+
sig do
|
8
|
+
params(
|
9
|
+
message: T.nilable(String),
|
10
|
+
response: T.nilable(EML::Response)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
def initialize(message = nil, response = nil)
|
14
|
+
message ||= "The server understood the request but it could not be " \
|
15
|
+
"processed (possibly semantically erroneous)"
|
16
|
+
super(message, response)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module EML
|
5
|
+
class EndpointClass
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
def self.call(class_type:, resource_class:, endpoint:)
|
9
|
+
new(
|
10
|
+
class_type: class_type,
|
11
|
+
resource_class: resource_class,
|
12
|
+
endpoint: endpoint
|
13
|
+
).call
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(class_type:, resource_class:, endpoint:)
|
17
|
+
@class_type = class_type
|
18
|
+
@resource_class = resource_class
|
19
|
+
@endpoint = endpoint
|
20
|
+
end
|
21
|
+
|
22
|
+
def call
|
23
|
+
Object.const_get(class_name) if Object.const_defined?(class_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def class_name
|
29
|
+
@class_name ||= begin
|
30
|
+
name_parts = @resource_class.name.split("::")
|
31
|
+
name = name_parts[0..-2] << @class_type
|
32
|
+
name << name_parts.last
|
33
|
+
name << action_class_name
|
34
|
+
name.join("::")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def action_class_name
|
39
|
+
@endpoint.capitalize.sub(/s$/, "")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,153 @@
|
|
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
|
+
class Parameters
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).void }
|
10
|
+
def initialize(params)
|
11
|
+
assign_params(params)
|
12
|
+
validate_required_params_presence
|
13
|
+
end
|
14
|
+
|
15
|
+
ENDPOINT_CLASS_TYPE = "Parameters"
|
16
|
+
|
17
|
+
class << self
|
18
|
+
extend T::Sig
|
19
|
+
|
20
|
+
sig do
|
21
|
+
params(
|
22
|
+
resource_class: T.untyped,
|
23
|
+
endpoint: String,
|
24
|
+
params: T::Hash[Symbol, T.untyped]
|
25
|
+
).returns(T.untyped)
|
26
|
+
end
|
27
|
+
def self.convert(resource_class, endpoint, params)
|
28
|
+
endpoint_class = EML::EndpointClass.(
|
29
|
+
class_type: ENDPOINT_CLASS_TYPE, resource_class: resource_class,
|
30
|
+
endpoint: endpoint
|
31
|
+
)
|
32
|
+
|
33
|
+
convert_with_endpoint_class(
|
34
|
+
endpoint: endpoint, endpoint_class: endpoint_class,
|
35
|
+
resource_class: resource_class, params: params
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
sig do
|
42
|
+
params(
|
43
|
+
endpoint_class: T.nilable(T.class_of(EML::Parameters)),
|
44
|
+
resource_class: T.untyped,
|
45
|
+
endpoint: String,
|
46
|
+
params: T::Hash[Symbol, T.untyped]
|
47
|
+
).returns(T.untyped)
|
48
|
+
end
|
49
|
+
def convert_with_endpoint_class(
|
50
|
+
endpoint_class:, resource_class:, endpoint:, params:
|
51
|
+
)
|
52
|
+
return endpoint_class.new(params) unless endpoint_class.nil?
|
53
|
+
return params if params.empty?
|
54
|
+
|
55
|
+
message = "No endpoint class can be found for resource, " \
|
56
|
+
"#{resource_class}, with endpoint #{endpoint}"
|
57
|
+
raise ArgumentError, message
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
62
|
+
def to_h
|
63
|
+
instance_variables.each_with_object({}) do |variable_name, params|
|
64
|
+
key = variable_name.to_s[1..-1].to_sym
|
65
|
+
params[key] = instance_variable_get(variable_name)
|
66
|
+
params[key] = params[key].to_h if params[key].respond_to?(:to_h)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
protected
|
71
|
+
|
72
|
+
sig do
|
73
|
+
params(
|
74
|
+
param_name: String,
|
75
|
+
param_value: String,
|
76
|
+
allowed_values: T::Array[String]
|
77
|
+
).void
|
78
|
+
end
|
79
|
+
def validate_array(param_name, param_value, allowed_values)
|
80
|
+
return if allowed_values.include?(param_value)
|
81
|
+
|
82
|
+
error_message = "#{param_name} can include any of " \
|
83
|
+
"#{array_as_string(allowed_values)} but included #{param_value}"
|
84
|
+
raise ArgumentError, error_message
|
85
|
+
end
|
86
|
+
|
87
|
+
sig do
|
88
|
+
params(param_name: Symbol, param_value: String, allowed_values: T::Array[String]).
|
89
|
+
void
|
90
|
+
end
|
91
|
+
def validate_enum(param_name, param_value, allowed_values)
|
92
|
+
return if allowed_values.include?(param_value)
|
93
|
+
|
94
|
+
value_message = array_as_string(allowed_values)
|
95
|
+
raise(ArgumentError, "#{param_name} must be one of #{value_message}")
|
96
|
+
end
|
97
|
+
|
98
|
+
sig do
|
99
|
+
params(param_name: Symbol, param_value: String, length: Integer).void
|
100
|
+
end
|
101
|
+
def validate_max_length(param_name, param_value, length)
|
102
|
+
return if param_value.to_s.length <= length
|
103
|
+
|
104
|
+
raise(
|
105
|
+
ArgumentError,
|
106
|
+
"#{param_name} is expected to be no more than #{length} characters"
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
112
|
+
def array_as_string(array)
|
113
|
+
array.dup.tap { |vals| vals[-1] = "or #{vals.last}" }.join(", ")
|
114
|
+
end
|
115
|
+
|
116
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).void }
|
117
|
+
def assign_params(params)
|
118
|
+
params.each do |name, value|
|
119
|
+
__send__(:"#{name}=", value)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
sig { void }
|
124
|
+
def validate_required_params_presence
|
125
|
+
return unless self.class.const_defined?(:REQUIRED_VALUES)
|
126
|
+
|
127
|
+
required_params = self.class.const_get(:REQUIRED_VALUES)
|
128
|
+
required_params.each do |param_name|
|
129
|
+
validate_required_parameter_presence(param_name)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# rubocop:disable Metrics/MethodLength
|
134
|
+
sig { params(param_name: Symbol, object: EML::Parameters).void }
|
135
|
+
def validate_required_parameter_presence(param_name, object: self)
|
136
|
+
names = param_name.to_s.split(".")
|
137
|
+
value = object.instance_variable_get(:"@#{names.shift}")
|
138
|
+
|
139
|
+
if value.nil?
|
140
|
+
raise(
|
141
|
+
ArgumentError,
|
142
|
+
"#{param_name} was not supplied but it is a required field"
|
143
|
+
)
|
144
|
+
end
|
145
|
+
|
146
|
+
if names.length.positive?
|
147
|
+
param_name = names.join(".").to_sym
|
148
|
+
validate_required_parameter_presence(param_name, object: value)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
# rubocop:enable Metrics/MethodLength
|
152
|
+
end
|
153
|
+
end
|