Class: OpenapiFirst::Definition

Inherits:
Object
  • Object
show all
Defined in:
lib/openapi_first/definition.rb

Overview

Represents an OpenAPI API Description document This is returned by OpenapiFirst.load.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resolved, filepath = nil) {|@config| ... } ⇒ Definition

Returns a new instance of Definition.

Parameters:

  • resolved (Hash)

    The resolved OpenAPI document.

  • filepath (String) (defaults to: nil)

    The file path of the OpenAPI document.

Yields:



17
18
19
20
21
22
23
24
# File 'lib/openapi_first/definition.rb', line 17

def initialize(resolved, filepath = nil)
  @filepath = filepath
  @config = OpenapiFirst.configuration.clone
  yield @config if block_given?
  @config.freeze
  @router = Builder.build_router(resolved, @config)
  @paths = resolved['paths'].keys # TODO: Move into builder as well
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



13
14
15
# File 'lib/openapi_first/definition.rb', line 13

def config
  @config
end

#filepathObject (readonly)

Returns the value of attribute filepath.



13
14
15
# File 'lib/openapi_first/definition.rb', line 13

def filepath
  @filepath
end

#pathsObject (readonly)

Returns the value of attribute paths.



13
14
15
# File 'lib/openapi_first/definition.rb', line 13

def paths
  @paths
end

#routerObject (readonly)

Returns the value of attribute router.



13
14
15
# File 'lib/openapi_first/definition.rb', line 13

def router
  @router
end

Instance Method Details

#routesObject



26
27
28
# File 'lib/openapi_first/definition.rb', line 26

def routes
  @router.routes
end

#validate_request(request, raise_error: false) ⇒ ValidatedRequest

Validates the request against the API description.

Parameters:

  • rack_request (Rack::Request)

    The Rack request object.

  • raise_error (Boolean) (defaults to: false)

    Whether to raise an error if validation fails.

Returns:



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/openapi_first/definition.rb', line 34

def validate_request(request, raise_error: false)
  route = @router.match(request.request_method, request.path, content_type: request.content_type)
  validated = if route.error
                ValidatedRequest.new(request, error: route.error)
              else
                route.request_definition.validate(request, route_params: route.params)
              end
  @config.hooks[:after_request_validation].each { |hook| hook.call(validated, self) }
  raise validated.error.exception(validated) if validated.error && raise_error

  validated
end

#validate_response(rack_request, rack_response, raise_error: false) ⇒ ValidatedResponse

Validates the response against the API description.

Parameters:

  • rack_request (Rack::Request)

    The Rack request object.

  • rack_response (Rack::Response)

    The Rack response object.

  • raise_error (Boolean) (defaults to: false)

    Whether to raise an error if validation fails.

Returns:



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/openapi_first/definition.rb', line 52

def validate_response(rack_request, rack_response, raise_error: false)
  route = @router.match(rack_request.request_method, rack_request.path, content_type: rack_request.content_type)
  return if route.error # Skip response validation for unknown requests

  response_match = route.match_response(status: rack_response.status, content_type: rack_response.content_type)
  error = response_match.error
  validated = if error
                ValidatedResponse.new(rack_response, error:)
              else
                response_match.response.validate(rack_response)
              end
  @config.hooks[:after_response_validation]&.each { |hook| hook.call(validated, rack_request, self) }
  raise validated.error.exception(validated) if raise_error && validated.invalid?

  validated
end