Class: Liminal::Internal::Normalizer

Inherits:
Object
  • Object
show all
Defined in:
lib/liminal/internal/normalizer.rb

Overview

Resolves private predicate constraints after type fragments have merged.

Constant Summary collapse

CONSTRAINTS_KEY =
"__liminal_constraints__"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_name:) ⇒ Normalizer

Returns a new instance of Normalizer.



50
51
52
# File 'lib/liminal/internal/normalizer.rb', line 50

def initialize(source_name:)
  @source_name = source_name
end

Class Method Details

.constraint(name, argument = UNSET) ⇒ Object



15
16
17
18
# File 'lib/liminal/internal/normalizer.rb', line 15

def constraint(name, argument = UNSET)
  entry = argument.equal?(UNSET) ? [name] : [name, argument]
  {CONSTRAINTS_KEY => [entry.freeze]}
end

.normalize_keys(value, path = []) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/liminal/internal/normalizer.rb', line 20

def normalize_keys(value, path = [])
  case value
  when Hash
    original_keys = {}
    value.each_with_object({}) do |(key, item), normalized|
      unless key.is_a?(String) || key.is_a?(Symbol)
        raise InvalidSchemaError,
              "OpenAPI object key #{key.inspect} at #{Path.display(path)} must be a String or Symbol."
      end

      normalized_key = key.to_s.dup
      if original_keys.key?(normalized_key)
        raise InvalidSchemaError,
              "OpenAPI object keys #{original_keys.fetch(normalized_key).inspect} and #{key.inspect} " \
              "both normalize to #{normalized_key.inspect} at #{Path.display(path)}."
      end

      original_keys[normalized_key] = key
      normalized[normalized_key] = normalize_keys(item, path + [normalized_key])
    end
  when Array
    value.map.with_index { |item, index| normalize_keys(item, path + [index]) }
  when String
    value.dup
  else
    value
  end
end

Instance Method Details

#call(fragment, path: []) ⇒ Object



54
55
56
# File 'lib/liminal/internal/normalizer.rb', line 54

def call(fragment, path: [])
  normalize_schema(self.class.normalize_keys(fragment), path)
end