Module: Scorpio::OpenAPI::Operation

Includes:
Configurables
Included in:
V2::Operation, V3::Operation
Defined in:
lib/scorpio/openapi/operation.rb

Overview

An OpenAPI operation

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

Defined Under Namespace

Modules: Configurables

Instance Attribute Summary

Attributes included from Configurables

#base_url, #faraday_adapter, #faraday_builder, #logger, #request_headers, #user_agent

Instance Method Summary collapse

Instance Method Details

#build_request(*a, &b) ⇒ Scorpio::Request

Parameters:

  • a,

    b are passed to Scorpio::Request#initialize

Returns:



154
155
156
# File 'lib/scorpio/openapi/operation.rb', line 154

def build_request(*a, &b)
  Scorpio::Request.new(self, *a, &b)
end

#http_methodObject

Returns the HTTP method of this operation as indicated by the attribute name for this operation from the parent PathItem.

Returns:

  • the HTTP method of this operation as indicated by the attribute name for this operation from the parent PathItem

Raises:



88
89
90
91
92
# 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_idString

Returns a short identifier for this operation appropriate for an error message.

Returns:

  • (String)

    a short identifier for this operation appropriate for an error message



95
96
97
# File 'lib/scorpio/openapi/operation.rb', line 95

def human_id
  operationId || "path: #{path_template_str}, method: #{http_method}"
end

#inferred_parameters#to_ary<#to_h>

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

Returns:

  • (#to_ary<#to_h>)

    the parameters specified for this operation, plus any others scorpio considers to be parameters



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 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:) ⇒ Scorpio::OpenAPI::V3::Response, Scorpio::OpenAPI::V2::Response



100
101
102
103
104
105
106
107
# 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_documentScorpio::OpenAPI::Document

Returns the document whence this operation came.

Returns:



57
58
59
# File 'lib/scorpio/openapi/operation.rb', line 57

def openapi_document
  parent_jsis.detect { |p| p.is_a?(Scorpio::OpenAPI::Document) }
end

#path_templateAddressable::Template

Returns the path as an Addressable::Template.

Returns:

  • (Addressable::Template)

    the path as an Addressable::Template



69
70
71
72
# 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_strObject

Raises:



61
62
63
64
65
66
# 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_moduleModule

Returns a module with accessor methods for unambiguously named parameters of this operation.

Returns:

  • (Module)

    a module with accessor methods for unambiguously named parameters of this operation.



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# 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) ⇒ Object

Returns response body object.

Parameters:

  • a,

    b are passed to Scorpio::Request#initialize

Returns:

  • response body object



166
167
168
# File 'lib/scorpio/openapi/operation.rb', line 166

def run(*a, &b)
  build_request(*a, &b).run
end

#run_ur(*a, &b) ⇒ Scorpio::Ur

Returns response ur.

Parameters:

  • a,

    b are passed to Scorpio::Request#initialize

Returns:



160
161
162
# 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) ⇒ Addressable::Template

Returns the URI template, consisting of the base_url concatenated with the path template.

Parameters:

  • base_url (#to_str) (defaults to: self.base_url)

    the base URL to which the path template is appended

Returns:

  • (Addressable::Template)

    the URI template, consisting of the base_url concatenated with the path template



77
78
79
80
81
82
83
84
# 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?Boolean

Returns v2?.

Returns:

  • (Boolean)

    v2?



52
53
54
# File 'lib/scorpio/openapi/operation.rb', line 52

def v2?
  is_a?(V2::Operation)
end

#v3?Boolean

Returns v3?.

Returns:

  • (Boolean)

    v3?



47
48
49
# File 'lib/scorpio/openapi/operation.rb', line 47

def v3?
  is_a?(V3::Operation)
end