Module: Liminal::Schema

Defined in:
lib/liminal/schema.rb

Overview

Validation, normalization, and non-mutating composition for OpenAPI Schema Objects.

Class Method Summary collapse

Class Method Details

.all_of(*schemas) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/liminal/schema.rb', line 47

def all_of(*schemas)
  if schemas.empty?
    raise InvalidSchemaCompositionError,
          "all_of requires at least one OpenAPI Schema Object."
  end

  normalize({"allOf" => schemas.map { |schema| normalize_composition_input(schema) }})
end

.exactly_one(schema, *names) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/liminal/schema.rb', line 36

def exactly_one(schema, *names)
  result = normalize_composition_input(schema)
  normalized_names = normalize_names(names, minimum: 2)
  constraint = {
    "oneOf" => normalized_names.map { |name| {"required" => [name]} }
  }
  return normalize(result.merge(constraint)) unless result.key?("oneOf") || result.key?("$ref")

  all_of(result, constraint)
end

.normalize(schema, dialect: :openapi_3_0) ⇒ Object



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

def normalize(schema, dialect: :openapi_3_0)
  unless schema.is_a?(Hash)
    raise InvalidSchemaError,
          "Schema Object must be a Hash; received #{schema.class}."
  end

  validator = build_dialect(dialect)
  normalized = Internal::Normalizer.normalize_keys(schema)
  validator.validate!(normalized)
  validator.order(normalized)
rescue Dialects::OpenAPI30::InvalidFragmentError => e
  raise InvalidSchemaError, "Invalid OpenAPI 3.0 Schema Object: #{e.message}."
end

.required(schema, *names) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/liminal/schema.rb', line 23

def required(schema, *names)
  result = normalize_composition_input(schema)
  normalized_names = normalize_names(names, minimum: 1)
  constraint = {"required" => normalized_names}

  if result.key?("$ref")
    all_of(result, constraint)
  else
    result["required"] = (Array(result["required"]) | normalized_names)
    normalize(result)
  end
end