Class: Gitlab::GrapeOpenapi::Converters::TypeResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/grape_openapi/converters/type_resolver.rb

Constant Summary collapse

TYPE_MAPPINGS =
{
  'API::Validations::Types::WorkhorseFile' => 'string',
  'Array' => 'array',
  'BigDecimal' => 'number',
  'Boolean' => 'boolean',
  'date' => 'string',
  'Date' => 'string',
  'date-time' => 'string',
  'dateTime' => 'string',
  'DateTime' => 'string',
  'FalseClass' => 'boolean',
  'Grape::API::Boolean' => 'boolean',
  'Gitlab::Color' => 'string',
  :int => 'integer',
  'int' => 'integer',
  Integer => 'integer',
  'Integer' => 'integer',
  'File' => 'string',
  Float => 'number',
  'Float' => 'number',
  :hash => 'object',
  'hash' => 'object',
  'Hash' => 'object',
  'JSON' => 'object',
  'Numeric' => 'number',
  String => 'string',
  'String' => 'string',
  'symbol' => 'string',
  'Symbol' => 'string',
  'text' => 'string',
  'Time' => 'string',
  'TrueClass' => 'boolean'
}.freeze
FORMAT_MAPPINGS =
{
  'API::Validations::Types::WorkhorseFile' => 'binary',
  'date' => 'date',
  'Date' => 'date',
  'date-time' => 'date-time',
  'dateTime' => 'date-time',
  'DateTime' => 'date-time',
  'File' => 'binary',
  'Time' => 'date-time'
}.freeze

Class Method Summary collapse

Class Method Details

.resolve_format(format, type) ⇒ Object



60
61
62
# File 'lib/gitlab/grape_openapi/converters/type_resolver.rb', line 60

def self.resolve_format(format, type)
  format || FORMAT_MAPPINGS[type]
end

.resolve_type(type) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/gitlab/grape_openapi/converters/type_resolver.rb', line 52

def self.resolve_type(type)
  return TYPE_MAPPINGS[type] if TYPE_MAPPINGS[type]
  return type unless type.is_a?(String)
  return 'object' if type.delete_prefix('::').start_with?('API::')

  type
end

.resolve_union_member(type) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/gitlab/grape_openapi/converters/type_resolver.rb', line 64

def self.resolve_union_member(type)
  if type.start_with?('[') && type.end_with?(']')
    item_type = type[1..-2]
    { type: 'array', items: { type: resolve_type(item_type) || 'string' } }
  else
    member = { type: resolve_type(type) || 'string' }
    format = resolve_format(nil, type)
    member[:format] = format if format
    member
  end
end

.union_schema(members) ⇒ Object

oneOf means "valid against exactly one". Members that differ only by format are indistinguishable to a validator, because format annotates rather than constrains, so nothing could satisfy it and anyOf ("at least one") is the accurate keyword. Keep oneOf everywhere else: it is the stricter of the two and says more about the parameter.



81
82
83
84
85
86
87
# File 'lib/gitlab/grape_openapi/converters/type_resolver.rb', line 81

def self.union_schema(members)
  members = members.uniq
  asserted = members.map { |member| member.except(:format) }
  keyword = asserted.uniq.size == members.size ? :oneOf : :anyOf

  { keyword => members }
end