module Scorpio::OpenAPI::Operation

An OpenAPI operation

Scorpio::OpenAPI::Operation is a module common to V2 and V3 operations.

Public Instance Methods

build_request(*a, &b) click to toggle source

@param a, b are passed to Scorpio::Request#initialize @return [Scorpio::Request]

# File lib/scorpio/openapi/operation.rb, line 154
def build_request(*a, &b)
  Scorpio::Request.new(self, *a, &b)
end
http_method() click to toggle source

@return the HTTP method of this operation as indicated by the attribute name

for this operation from the parent PathItem
# File lib/scorpio/openapi/operation.rb, line 88
def http_method
  return @http_method if instance_variable_defined?(:@http_method)
  raise(Bug) unless parent_jsi.is_a?(Scorpio::OpenAPI::V2::PathItem) || parent_jsi.is_a?(Scorpio::OpenAPI::V3::PathItem)
  @http_method = jsi_ptr.reference_tokens.last
end
human_id() click to toggle source

@return [String] a short identifier for this operation appropriate for an error message

# File lib/scorpio/openapi/operation.rb, line 95
def human_id
  operationId || "path: #{path_template_str}, method: #{http_method}"
end
inferred_parameters() click to toggle source

this method is not intended to be API-stable at the moment.

@return [#to_ary<#to_h>] the parameters specified for this operation, plus any others

scorpio considers to be parameters
# File lib/scorpio/openapi/operation.rb, line 113
def inferred_parameters
  parameters = self.parameters ? self.parameters.to_a.dup : []
  path_template.variables.each do |var|
    unless parameters.any? { |p| p['in'] == 'path' && p['name'] == var }
      # we could instantiate this as a V2::Parameter or a V3::Parameter
      # or a ParameterWithContentInPath or whatever. but I can't be bothered.
      parameters << {
        'name' => var,
        'in' => 'path',
        'required' => true,
        'type' => 'string',
      }
    end
  end
  parameters
end
oa_response(status: ) click to toggle source

@return [Scorpio::OpenAPI::V3::Response, Scorpio::OpenAPI::V2::Response]

# File lib/scorpio/openapi/operation.rb, line 100
def oa_response(status: )
  status = status.to_s if status.is_a?(Numeric)
  if self.responses
    _, oa_response = self.responses.detect { |k, v| k.to_s == status }
    oa_response ||= self.responses['default']
  end
  oa_response
end
openapi_document() click to toggle source

@return [Scorpio::OpenAPI::Document] the document whence this operation came

# File lib/scorpio/openapi/operation.rb, line 57
def openapi_document
  parent_jsis.detect { |p| p.is_a?(Scorpio::OpenAPI::Document) }
end
path_template() click to toggle source

@return [Addressable::Template] the path as an Addressable::Template

# File lib/scorpio/openapi/operation.rb, line 69
def path_template
  return @path_template if instance_variable_defined?(:@path_template)
  @path_template = Addressable::Template.new(path_template_str)
end
path_template_str() click to toggle source
# File lib/scorpio/openapi/operation.rb, line 61
def path_template_str
  return @path_template_str if instance_variable_defined?(:@path_template_str)
  raise(Bug) unless parent_jsi.is_a?(Scorpio::OpenAPI::V2::PathItem) || parent_jsi.is_a?(Scorpio::OpenAPI::V3::PathItem)
  raise(Bug) unless parent_jsi.parent_jsi.is_a?(Scorpio::OpenAPI::V2::Paths) || parent_jsi.parent_jsi.is_a?(Scorpio::OpenAPI::V3::Paths)
  @path_template_str = parent_jsi.jsi_ptr.reference_tokens.last
end
request_accessor_module() click to toggle source

@return [Module] a module with accessor methods for unambiguously named parameters of this operation.

# File lib/scorpio/openapi/operation.rb, line 131
def request_accessor_module
  return @request_accessor_module if instance_variable_defined?(:@request_accessor_module)
  @request_accessor_module = begin
    params_by_name = inferred_parameters.group_by { |p| p['name'] }
    Module.new do
      instance_method_modules = [Request, Request::Configurables]
      instance_method_names = instance_method_modules.map do |mod|
        (mod.instance_methods + mod.private_instance_methods).map(&:to_s)
      end.inject(Set.new, &:|)
      params_by_name.each do |name, params|
        next if instance_method_names.include?(name)
        if params.size == 1
          param = params.first
          define_method("#{name}=") { |value| set_param_from(param['in'], param['name'], value) }
          define_method(name) { get_param_from(param['in'], param['name']) }
        end
      end
    end
  end
end
run(*a, &b) click to toggle source

@param a, b are passed to Scorpio::Request#initialize @return response body object

# File lib/scorpio/openapi/operation.rb, line 166
def run(*a, &b)
  build_request(*a, &b).run
end
run_ur(*a, &b) click to toggle source

@param a, b are passed to Scorpio::Request#initialize @return [Scorpio::Ur] response ur

# File lib/scorpio/openapi/operation.rb, line 160
def run_ur(*a, &b)
  build_request(*a, &b).run_ur
end
uri_template(base_url: self.base_url) click to toggle source

@param base_url [#to_str] the base URL to which the path template is appended @return [Addressable::Template] the URI template, consisting of the base_url

concatenated with the path template
# File lib/scorpio/openapi/operation.rb, line 77
def uri_template(base_url: self.base_url)
  unless base_url
    raise(ArgumentError, "no base_url has been specified for operation #{self}")
  end
  # we do not use Addressable::URI#join as the paths should just be concatenated, not resolved.
  # we use File.join just to deal with consecutive slashes.
  Addressable::Template.new(File.join(base_url, path_template_str))
end
v2?() click to toggle source

@return [Boolean] v2?

# File lib/scorpio/openapi/operation.rb, line 52
def v2?
  is_a?(V2::Operation)
end
v3?() click to toggle source

@return [Boolean] v3?

# File lib/scorpio/openapi/operation.rb, line 47
def v3?
  is_a?(V3::Operation)
end