Module: GrapeOAS::ValuesNormalizer

Defined in:
lib/grape_oas/values_normalizer.rb

Overview

Normalizes values from Grape parameter or entity documentation into Array, Range, or nil for OpenAPI schema generation.

Class Method Summary collapse

Class Method Details

.normalize(values, context: "values") ⇒ Array, ...

Parameters:

  • values (Object)

    raw values from spec or documentation

  • context (String) (defaults to: "values")

    description for warning messages

Returns:

  • (Array, Range, nil)


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/grape_oas/values_normalizer.rb', line 10

def self.normalize(values, context: "values")
  return nil unless values

  return nil if values.is_a?(Hash) && !values.key?(:value) && !values.key?("value")

  values = values.key?(:value) ? values[:value] : values["value"] if values.is_a?(Hash)
  return nil unless values

  if values.respond_to?(:call)
    # Two-stage defense for callable values:
    # 1) Arity check filters out validators (arity > 0) and objects without arity.
    #    This is a heuristic — optional-arg procs (proc { |v = nil| ... }) report arity 0.
    # 2) Post-call type check catches those false positives by verifying the return
    #    value is a collection type. Both guards are load-bearing; do not remove either.
    return nil unless values.respond_to?(:arity) && values.arity.zero?

    begin
      values = values.call
    rescue StandardError => e
      GrapeOAS.logger.warn("Proc evaluation failed for #{context} (#{e.class}): #{e.message}")
      return nil
    end
    return nil unless values.is_a?(Array) || values.is_a?(Range) || set_instance?(values)
  end

  values = values.to_a if set_instance?(values)
  return nil unless values.is_a?(Array) || values.is_a?(Range)
  return nil if values.is_a?(Array) && values.empty?

  values
end