apia 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/VERSION +1 -0
- data/lib/apia.rb +21 -0
- data/lib/apia/api.rb +100 -0
- data/lib/apia/argument_set.rb +221 -0
- data/lib/apia/authenticator.rb +57 -0
- data/lib/apia/callable_with_environment.rb +43 -0
- data/lib/apia/controller.rb +32 -0
- data/lib/apia/defineable.rb +60 -0
- data/lib/apia/definition.rb +27 -0
- data/lib/apia/definitions/api.rb +51 -0
- data/lib/apia/definitions/argument.rb +77 -0
- data/lib/apia/definitions/argument_set.rb +33 -0
- data/lib/apia/definitions/authenticator.rb +46 -0
- data/lib/apia/definitions/controller.rb +41 -0
- data/lib/apia/definitions/endpoint.rb +74 -0
- data/lib/apia/definitions/enum.rb +31 -0
- data/lib/apia/definitions/error.rb +59 -0
- data/lib/apia/definitions/field.rb +117 -0
- data/lib/apia/definitions/lookup_argument_set.rb +27 -0
- data/lib/apia/definitions/object.rb +29 -0
- data/lib/apia/definitions/polymorph.rb +29 -0
- data/lib/apia/definitions/polymorph_option.rb +53 -0
- data/lib/apia/definitions/scalar.rb +23 -0
- data/lib/apia/definitions/type.rb +109 -0
- data/lib/apia/dsl.rb +23 -0
- data/lib/apia/dsls/api.rb +37 -0
- data/lib/apia/dsls/argument.rb +27 -0
- data/lib/apia/dsls/argument_set.rb +35 -0
- data/lib/apia/dsls/authenticator.rb +38 -0
- data/lib/apia/dsls/concerns/has_fields.rb +38 -0
- data/lib/apia/dsls/controller.rb +34 -0
- data/lib/apia/dsls/endpoint.rb +79 -0
- data/lib/apia/dsls/enum.rb +19 -0
- data/lib/apia/dsls/error.rb +26 -0
- data/lib/apia/dsls/field.rb +27 -0
- data/lib/apia/dsls/lookup_argument_set.rb +24 -0
- data/lib/apia/dsls/object.rb +19 -0
- data/lib/apia/dsls/polymorph.rb +19 -0
- data/lib/apia/dsls/route_group.rb +43 -0
- data/lib/apia/dsls/route_set.rb +40 -0
- data/lib/apia/dsls/scalar.rb +23 -0
- data/lib/apia/dsls/scope_descriptions.rb +17 -0
- data/lib/apia/endpoint.rb +110 -0
- data/lib/apia/enum.rb +43 -0
- data/lib/apia/environment_error_handling.rb +74 -0
- data/lib/apia/error.rb +61 -0
- data/lib/apia/error_set.rb +15 -0
- data/lib/apia/errors/error_exception_error.rb +32 -0
- data/lib/apia/errors/field_spec_parse_error.rb +23 -0
- data/lib/apia/errors/invalid_argument_error.rb +68 -0
- data/lib/apia/errors/invalid_enum_option_error.rb +21 -0
- data/lib/apia/errors/invalid_helper_error.rb +6 -0
- data/lib/apia/errors/invalid_json_error.rb +23 -0
- data/lib/apia/errors/invalid_polymorph_value_error.rb +21 -0
- data/lib/apia/errors/invalid_scalar_value_error.rb +21 -0
- data/lib/apia/errors/manifest_error.rb +43 -0
- data/lib/apia/errors/missing_argument_error.rb +40 -0
- data/lib/apia/errors/null_field_value_error.rb +37 -0
- data/lib/apia/errors/parse_error.rb +10 -0
- data/lib/apia/errors/runtime_error.rb +30 -0
- data/lib/apia/errors/scope_not_granted_error.rb +15 -0
- data/lib/apia/errors/standard_error.rb +6 -0
- data/lib/apia/field_set.rb +76 -0
- data/lib/apia/field_spec.rb +155 -0
- data/lib/apia/helpers.rb +34 -0
- data/lib/apia/hook_set.rb +30 -0
- data/lib/apia/lookup_argument_set.rb +57 -0
- data/lib/apia/lookup_environment.rb +27 -0
- data/lib/apia/manifest_errors.rb +62 -0
- data/lib/apia/mock_request.rb +18 -0
- data/lib/apia/object.rb +68 -0
- data/lib/apia/object_set.rb +21 -0
- data/lib/apia/pagination_object.rb +34 -0
- data/lib/apia/polymorph.rb +50 -0
- data/lib/apia/rack.rb +184 -0
- data/lib/apia/rack_error.rb +17 -0
- data/lib/apia/request.rb +67 -0
- data/lib/apia/request_environment.rb +84 -0
- data/lib/apia/request_headers.rb +42 -0
- data/lib/apia/response.rb +64 -0
- data/lib/apia/route.rb +61 -0
- data/lib/apia/route_group.rb +20 -0
- data/lib/apia/route_set.rb +89 -0
- data/lib/apia/scalar.rb +52 -0
- data/lib/apia/scalars.rb +25 -0
- data/lib/apia/scalars/base64.rb +31 -0
- data/lib/apia/scalars/boolean.rb +37 -0
- data/lib/apia/scalars/date.rb +45 -0
- data/lib/apia/scalars/decimal.rb +36 -0
- data/lib/apia/scalars/integer.rb +34 -0
- data/lib/apia/scalars/string.rb +24 -0
- data/lib/apia/scalars/unix_time.rb +40 -0
- data/lib/apia/schema/api_controller_schema_type.rb +17 -0
- data/lib/apia/schema/api_schema_type.rb +43 -0
- data/lib/apia/schema/argument_schema_type.rb +28 -0
- data/lib/apia/schema/argument_set_schema_type.rb +21 -0
- data/lib/apia/schema/authenticator_schema_type.rb +22 -0
- data/lib/apia/schema/controller.rb +39 -0
- data/lib/apia/schema/controller_endpoint_schema_type.rb +17 -0
- data/lib/apia/schema/controller_schema_type.rb +32 -0
- data/lib/apia/schema/endpoint_schema_type.rb +35 -0
- data/lib/apia/schema/enum_schema_type.rb +20 -0
- data/lib/apia/schema/enum_value_schema_type.rb +14 -0
- data/lib/apia/schema/error_schema_type.rb +23 -0
- data/lib/apia/schema/field_schema_type.rb +38 -0
- data/lib/apia/schema/field_spec_options_schema_type.rb +16 -0
- data/lib/apia/schema/lookup_argument_set_schema_type.rb +25 -0
- data/lib/apia/schema/object_schema_polymorph.rb +31 -0
- data/lib/apia/schema/object_schema_type.rb +21 -0
- data/lib/apia/schema/polymorph_option_schema_type.rb +16 -0
- data/lib/apia/schema/polymorph_schema_type.rb +20 -0
- data/lib/apia/schema/request_method_enum.rb +21 -0
- data/lib/apia/schema/route_group_schema_type.rb +19 -0
- data/lib/apia/schema/route_schema_type.rb +31 -0
- data/lib/apia/schema/route_set_schema_type.rb +20 -0
- data/lib/apia/schema/scalar_schema_type.rb +15 -0
- data/lib/apia/schema/scope_type.rb +14 -0
- data/lib/apia/version.rb +12 -0
- metadata +188 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/defineable'
|
4
|
+
require 'apia/definitions/controller'
|
5
|
+
require 'apia/helpers'
|
6
|
+
|
7
|
+
module Apia
|
8
|
+
class Controller
|
9
|
+
|
10
|
+
extend Defineable
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
# Return the definition object for the controller
|
15
|
+
#
|
16
|
+
# @return [Apia::Definitions::Controller]
|
17
|
+
def definition
|
18
|
+
@definition ||= Definitions::Controller.new(Helpers.class_name_to_id(name))
|
19
|
+
end
|
20
|
+
|
21
|
+
# Collate all objects that this controller references and add them to the
|
22
|
+
# given object set
|
23
|
+
#
|
24
|
+
# @param set [Apia::ObjectSet]
|
25
|
+
# @return [void]
|
26
|
+
def collate_objects(set)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Apia
|
4
|
+
module Defineable
|
5
|
+
|
6
|
+
# Inspect an object
|
7
|
+
#
|
8
|
+
# @return [String]
|
9
|
+
def inspect
|
10
|
+
type = ancestors.find { |c| c.name =~ /\AApia::/ }
|
11
|
+
"<#{definition.id} [#{type}]>"
|
12
|
+
end
|
13
|
+
|
14
|
+
# Create a new object
|
15
|
+
#
|
16
|
+
# @param id [String]
|
17
|
+
# @return [Class]
|
18
|
+
def create(id, &block)
|
19
|
+
klass = Class.new(self)
|
20
|
+
klass.definition.id = id
|
21
|
+
if block_given?
|
22
|
+
klass.definition.dsl.instance_eval(&block)
|
23
|
+
end
|
24
|
+
klass
|
25
|
+
end
|
26
|
+
|
27
|
+
# Ability to set a name (for DSL purposes) but also returns a name
|
28
|
+
# of the actual class if no new value is provided
|
29
|
+
#
|
30
|
+
# @param new_name [String, nil]
|
31
|
+
# @return [String]
|
32
|
+
def name(new_name = nil)
|
33
|
+
if new_name
|
34
|
+
definition.name = new_name
|
35
|
+
return new_name
|
36
|
+
end
|
37
|
+
|
38
|
+
super()
|
39
|
+
end
|
40
|
+
|
41
|
+
# Passes all other values through to the DSL for the definition if
|
42
|
+
# the DSL supoprts it.
|
43
|
+
def method_missing(name, *args, **kwargs, &block)
|
44
|
+
if definition.dsl.respond_to?(name)
|
45
|
+
if kwargs.empty?
|
46
|
+
definition.dsl.send(name, *args, &block)
|
47
|
+
else
|
48
|
+
definition.dsl.send(name, *args, **kwargs, &block)
|
49
|
+
end
|
50
|
+
else
|
51
|
+
super
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def respond_to_missing?(name, include_private = false)
|
56
|
+
definition.dsl.respond_to?(name) || super
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Apia
|
4
|
+
class Definition
|
5
|
+
|
6
|
+
attr_accessor :id
|
7
|
+
attr_accessor :name
|
8
|
+
attr_accessor :description
|
9
|
+
attr_accessor :schema
|
10
|
+
|
11
|
+
def initialize(id)
|
12
|
+
@id = id
|
13
|
+
setup
|
14
|
+
end
|
15
|
+
|
16
|
+
def schema?
|
17
|
+
@schema != false
|
18
|
+
end
|
19
|
+
|
20
|
+
def validate(errors)
|
21
|
+
end
|
22
|
+
|
23
|
+
def setup
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/definition'
|
4
|
+
require 'apia/dsls/api'
|
5
|
+
require 'apia/hook_set'
|
6
|
+
require 'apia/route_set'
|
7
|
+
|
8
|
+
module Apia
|
9
|
+
module Definitions
|
10
|
+
class API < Definition
|
11
|
+
|
12
|
+
attr_accessor :authenticator
|
13
|
+
attr_reader :controllers
|
14
|
+
attr_reader :route_set
|
15
|
+
attr_reader :exception_handlers
|
16
|
+
attr_reader :scopes
|
17
|
+
|
18
|
+
def setup
|
19
|
+
@route_set = RouteSet.new
|
20
|
+
@controllers = {}
|
21
|
+
@exception_handlers = HookSet.new
|
22
|
+
@scopes = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def dsl
|
26
|
+
@dsl ||= DSLs::API.new(self)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Validate the API to ensure that everything within is acceptable for use
|
30
|
+
#
|
31
|
+
# @param errors [Apia::ManifestErrors]
|
32
|
+
# @return [void]
|
33
|
+
def validate(errors)
|
34
|
+
if @authenticator && !(@authenticator.respond_to?(:ancestors) && @authenticator.ancestors.include?(Apia::Authenticator))
|
35
|
+
errors.add self, 'InvalidAuthenticator', 'The authenticator must be a class that inherits from Apia::Authenticator'
|
36
|
+
end
|
37
|
+
|
38
|
+
@controllers.each do |name, controller|
|
39
|
+
unless name.to_s =~ /\A[\w\-]+\z/i
|
40
|
+
errors.add self, 'InvalidControllerName', "The controller name #{name} is invalid. It can only contain letters, numbers, underscores, and hyphens"
|
41
|
+
end
|
42
|
+
|
43
|
+
unless controller.respond_to?(:ancestors) && controller.ancestors.include?(Apia::Controller)
|
44
|
+
errors.add self, 'InvalidController', "The controller for #{name} must be a class that inherits from Apia::Controller"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/definition'
|
4
|
+
require 'apia/dsls/argument'
|
5
|
+
require 'apia/helpers'
|
6
|
+
|
7
|
+
module Apia
|
8
|
+
module Definitions
|
9
|
+
class Argument < Definition
|
10
|
+
|
11
|
+
attr_reader :options
|
12
|
+
attr_reader :validations
|
13
|
+
attr_accessor :required
|
14
|
+
attr_accessor :array
|
15
|
+
attr_accessor :default
|
16
|
+
attr_writer :type
|
17
|
+
|
18
|
+
def initialize(name, id: nil)
|
19
|
+
@id = id
|
20
|
+
@name = name
|
21
|
+
@validations = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def dsl
|
25
|
+
@dsl ||= DSLs::Argument.new(self)
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate(errors)
|
29
|
+
if @name.nil?
|
30
|
+
errors.add self, 'MissingName', 'Arguments must have a name'
|
31
|
+
elsif @name.to_s !~ /\A[a-z0-9\-_]+\z/i
|
32
|
+
errors.add self, 'InvalidName', 'Argument name must only include letters, numbers, hyphens and underscores'
|
33
|
+
end
|
34
|
+
|
35
|
+
if @type.nil?
|
36
|
+
errors.add self, 'MissingType', 'Arguments must have a type'
|
37
|
+
elsif !type.usable_for_argument?
|
38
|
+
errors.add self, 'InvalidType', 'Type must be an argument set, scalar or enum'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Return the type of object (either a ArgumentSet or a Scalar) which
|
43
|
+
# this argument represents.
|
44
|
+
#
|
45
|
+
# @return [Class]
|
46
|
+
def type
|
47
|
+
Type.new(@type)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Is this argument required?
|
51
|
+
#
|
52
|
+
# @return [Boolean]
|
53
|
+
def required?
|
54
|
+
@required == true
|
55
|
+
end
|
56
|
+
|
57
|
+
# Is this an array?
|
58
|
+
#
|
59
|
+
# @return [Boolean]
|
60
|
+
def array?
|
61
|
+
@array == true
|
62
|
+
end
|
63
|
+
|
64
|
+
# Validate a given value through all validations and
|
65
|
+
# return an array of all errors
|
66
|
+
#
|
67
|
+
# @param value [Object]
|
68
|
+
# @return [Array]
|
69
|
+
def validate_value(value)
|
70
|
+
@validations.each_with_object([]) do |validation, errors|
|
71
|
+
errors << validation[:name] unless validation[:block].call(value)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/definition'
|
4
|
+
require 'apia/error_set'
|
5
|
+
require 'apia/dsls/argument_set'
|
6
|
+
|
7
|
+
module Apia
|
8
|
+
module Definitions
|
9
|
+
class ArgumentSet < Definition
|
10
|
+
|
11
|
+
attr_reader :arguments
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@arguments = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def dsl
|
18
|
+
@dsl ||= DSLs::ArgumentSet.new(self)
|
19
|
+
end
|
20
|
+
|
21
|
+
def validate(errors)
|
22
|
+
@arguments.each do |name, argument|
|
23
|
+
if argument.is_a?(Apia::Definitions::Argument)
|
24
|
+
argument.validate(errors)
|
25
|
+
else
|
26
|
+
errors.add self, 'InvalidArgument', "The argument '#{name}' is not an instance of Apia::Definitions::Argument"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/definition'
|
4
|
+
require 'apia/dsls/authenticator'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Definitions
|
8
|
+
class Authenticator < Definition
|
9
|
+
|
10
|
+
TYPES = [:bearer, :anonymous].freeze
|
11
|
+
|
12
|
+
attr_accessor :type
|
13
|
+
attr_accessor :action
|
14
|
+
attr_accessor :scope_validator
|
15
|
+
attr_reader :potential_errors
|
16
|
+
|
17
|
+
def setup
|
18
|
+
@id = id
|
19
|
+
@potential_errors = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def dsl
|
23
|
+
@dsl ||= DSLs::Authenticator.new(self)
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate(errors)
|
27
|
+
if @type.nil?
|
28
|
+
errors.add self, 'MissingType', 'A type must be defined for authenticators'
|
29
|
+
elsif !TYPES.include?(@type)
|
30
|
+
errors.add self, 'InvalidType', "The type must be one of #{TYPES.join(', ')} (was: #{@type.inspect})"
|
31
|
+
end
|
32
|
+
|
33
|
+
if @action && !@action.is_a?(Proc)
|
34
|
+
errors.add self, 'InvalidAction', 'The action provided must be a Proc'
|
35
|
+
end
|
36
|
+
|
37
|
+
@potential_errors.each_with_index do |error, index|
|
38
|
+
unless error.respond_to?(:ancestors) && error.ancestors.include?(Apia::Error)
|
39
|
+
errors.add self, 'InvalidPotentialError', "Potential error at index #{index} must be a class that inherits from Apia::Error"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/definition'
|
4
|
+
require 'apia/dsls/controller'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Definitions
|
8
|
+
class Controller < Definition
|
9
|
+
|
10
|
+
attr_accessor :authenticator
|
11
|
+
attr_reader :endpoints
|
12
|
+
attr_reader :helpers
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@endpoints = {}
|
16
|
+
@helpers = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def dsl
|
20
|
+
@dsl ||= DSLs::Controller.new(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
def validate(errors)
|
24
|
+
if @authenticator && !(@authenticator.respond_to?(:ancestors) && @authenticator.ancestors.include?(Apia::Authenticator))
|
25
|
+
errors.add self, 'InvalidAuthenticator', 'The authenticator must be a class that inherits from Apia::Authenticator'
|
26
|
+
end
|
27
|
+
|
28
|
+
@endpoints.each do |name, endpoint|
|
29
|
+
unless name.to_s =~ /\A[\w-]+\z/i
|
30
|
+
errors.add self, 'InvalidEndpointName', "The endpoint name #{name} is invalid. It can only contain letters, numbers, underscores, and hyphens"
|
31
|
+
end
|
32
|
+
|
33
|
+
unless endpoint.respond_to?(:ancestors) && endpoint.ancestors.include?(Apia::Endpoint)
|
34
|
+
errors.add self, 'InvalidEndpoint', "The endpoint for #{name} must be a class that inherits from Apia::Endpoint"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/definition'
|
4
|
+
require 'apia/argument_set'
|
5
|
+
require 'apia/dsls/endpoint'
|
6
|
+
require 'apia/field_set'
|
7
|
+
require 'apia/error_set'
|
8
|
+
require 'rack/utils'
|
9
|
+
|
10
|
+
module Apia
|
11
|
+
module Definitions
|
12
|
+
class Endpoint < Definition
|
13
|
+
|
14
|
+
attr_accessor :authenticator
|
15
|
+
attr_accessor :action
|
16
|
+
attr_accessor :http_status
|
17
|
+
attr_accessor :paginated_field
|
18
|
+
attr_reader :fields
|
19
|
+
attr_reader :scopes
|
20
|
+
|
21
|
+
def setup
|
22
|
+
@fields = FieldSet.new
|
23
|
+
@http_status = 200
|
24
|
+
@scopes = []
|
25
|
+
end
|
26
|
+
|
27
|
+
def argument_set
|
28
|
+
@argument_set ||= begin
|
29
|
+
as = Apia::ArgumentSet.create("#{@id}/BaseArgumentSet")
|
30
|
+
as.definition.schema = schema?
|
31
|
+
as
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def potential_errors
|
36
|
+
@potential_errors ||= Apia::ErrorSet.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def dsl
|
40
|
+
@dsl ||= DSLs::Endpoint.new(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
def http_status_code
|
44
|
+
if @http_status.is_a?(Symbol)
|
45
|
+
::Rack::Utils::SYMBOL_TO_STATUS_CODE[@http_status]
|
46
|
+
else
|
47
|
+
@http_status
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def validate(errors)
|
52
|
+
if @action && !@action.is_a?(Proc)
|
53
|
+
errors.add self, 'InvalidAction', 'The action provided must be a Proc'
|
54
|
+
end
|
55
|
+
|
56
|
+
if http_status_code.is_a?(Integer) && ::Rack::Utils::HTTP_STATUS_CODES[http_status_code]
|
57
|
+
# OK
|
58
|
+
elsif http_status_code.is_a?(Integer)
|
59
|
+
errors.add self, 'InvalidHTTPStatus', "The HTTP status is not valid (must be one of #{::Rack::Utils::HTTP_STATUS_CODES.keys.join(', ')})"
|
60
|
+
else
|
61
|
+
errors.add self, 'InvalidHTTPStatus', 'The HTTP status is not valid (must be an integer)'
|
62
|
+
end
|
63
|
+
|
64
|
+
if @authenticator && !(@authenticator.respond_to?(:ancestors) && @authenticator.ancestors.include?(Apia::Authenticator))
|
65
|
+
errors.add self, 'InvalidAuthenticator', 'The authenticator must be a class that inherits from Apia::Authenticator'
|
66
|
+
end
|
67
|
+
|
68
|
+
@fields.validate(errors, self)
|
69
|
+
@potential_errors&.validate(errors, self)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|