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



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.

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



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.



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



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



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



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



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



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



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



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

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

#v3?Boolean



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

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