Class: OpenapiRuby::DSL::OperationContext

Inherits:
Object
  • Object
show all
Defined in:
lib/openapi_ruby/dsl/operation_context.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(verb, summary = nil) ⇒ OperationContext

Returns a new instance of OperationContext.



9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 9

def initialize(verb, summary = nil)
  @verb = verb.to_s
  @summary = summary
  @parameters = []
  @responses = {}
  @request_body_definition = nil
  @request_examples = []
  @metadata = {}
  @tags_list = []
  @consumes_list = []
  @produces_list = []
  @security_list = nil
end

Instance Attribute Details

#metadataObject (readonly)

Returns the value of attribute metadata.



6
7
8
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 6

def 
  @metadata
end

#parametersObject (readonly)

Returns the value of attribute parameters.



6
7
8
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 6

def parameters
  @parameters
end

#request_body_definitionObject (readonly)

Returns the value of attribute request_body_definition.



6
7
8
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 6

def request_body_definition
  @request_body_definition
end

#request_examplesObject (readonly)

Returns the value of attribute request_examples.



6
7
8
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 6

def request_examples
  @request_examples
end

#responsesObject (readonly)

Returns the value of attribute responses.



6
7
8
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 6

def responses
  @responses
end

#summaryObject (readonly)

Returns the value of attribute summary.



6
7
8
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 6

def summary
  @summary
end

#verbObject (readonly)

Returns the value of attribute verb.



6
7
8
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 6

def verb
  @verb
end

Instance Method Details

#consumes(*content_types) ⇒ Object



39
40
41
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 39

def consumes(*content_types)
  @consumes_list.concat(content_types.flatten)
end

#deprecated(value = true) ⇒ Object



35
36
37
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 35

def deprecated(value = true)
  @metadata["deprecated"] = value
end

#description(text) ⇒ Object



31
32
33
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 31

def description(text)
  @metadata["description"] = text.to_s
end

#operationId(id) ⇒ Object

rubocop:disable Naming/MethodName



27
28
29
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 27

def operationId(id) # rubocop:disable Naming/MethodName
  @metadata["operationId"] = id.to_s
end

#parameter(attributes = {}) ⇒ Object



51
52
53
54
55
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 51

def parameter(attributes = {})
  param = deep_stringify(attributes)
  param["required"] = true if param["in"] == "path"
  @parameters << param
end

#produces(*content_types) ⇒ Object



43
44
45
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 43

def produces(*content_types)
  @produces_list.concat(content_types.flatten)
end

#request_body(attributes = {}) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 57

def request_body(attributes = {})
  stringified = deep_stringify(attributes)

  # Shorthand: if schema is provided without content, wrap it in
  # content: { "application/json" => { schema: ... } }
  if stringified["schema"] && !stringified["content"]
    schema = stringified.delete("schema")
    stringified["content"] = {"application/json" => {"schema" => schema}}
  end

  @request_body_definition = stringified
end

#request_body_example(value:, name: "example", summary: nil) ⇒ Object



70
71
72
73
74
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 70

def request_body_example(value:, name: "example", summary: nil)
  entry = {"value" => value, "name" => name.to_s}
  entry["summary"] = summary if summary
  @request_examples << entry
end

#response(status_code, description, hidden: false, &block) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 76

def response(status_code, description, hidden: false, &block)
  ctx = ResponseContext.new(status_code, description, hidden: hidden)
  ctx.produces(*@produces_list) if @produces_list.any?
  ctx.instance_eval(&block) if block

  key = status_code.to_s
  # Keep the first visible response for each status code. Subsequent responses
  # with the same code are test variants and should not overwrite the schema.
  # A visible response always wins over a hidden one.
  existing = @responses[key]
  @responses[key] = ctx if existing.nil? || (existing.hidden && !hidden)

  ctx
end

#security(schemes) ⇒ Object



47
48
49
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 47

def security(schemes)
  @security_list = Array(schemes).map { |s| deep_stringify(s) }
end

#tags(*values) ⇒ Object



23
24
25
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 23

def tags(*values)
  @tags_list.concat(values.flatten.map(&:to_s))
end

#to_openapiObject



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/openapi_ruby/dsl/operation_context.rb', line 91

def to_openapi
  result = {}
  result["summary"] = @summary if @summary
  result["tags"] = @tags_list if @tags_list.any?
  result.merge!(@metadata)
  result["parameters"] = @parameters if @parameters.any?
  result["security"] = @security_list if @security_list

  result["requestBody"] = build_request_body if @request_body_definition

  result["responses"] = {}
  @responses.each do |code, ctx|
    next if ctx.hidden
    result["responses"][code] = ctx.to_openapi
  end

  result
end