Class: Dry::Swagger::DocumentationGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/dry/swagger/documentation_generator.rb

Constant Summary collapse

SWAGGER_FIELD_TYPE_DEFINITIONS =
{
    "string" => { type: :string },
    "integer" => { type: :integer },
    "boolean" => { type: :boolean },
    "float" => { type: :float },
    "decimal" => { type: :string, format: :decimal },
    "datetime" => { type: :string, format: :datetime },
    "date" => { type: :string, format: :date },
    "time" => { type: :string, format: :time },
    "uuid" => { type: :string, format: :uuid }
}.freeze

Instance Method Summary collapse

Constructor Details

#initializeDocumentationGenerator

Returns a new instance of DocumentationGenerator.



16
17
18
# File 'lib/dry/swagger/documentation_generator.rb', line 16

def initialize
  @config = ::Dry::Swagger::Config::SwaggerConfiguration
end

Instance Method Details

#array_of_primitive_type?(definition) ⇒ Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/dry/swagger/documentation_generator.rb', line 111

def array_of_primitive_type?(definition)
  definition[:array] && definition.fetch(:type) != 'array'
end

#from_struct(struct) ⇒ Object



20
21
22
# File 'lib/dry/swagger/documentation_generator.rb', line 20

def from_struct(struct)
  generate_documentation(::DryStructParser::StructSchemaParser.new.call(struct).keys)
end

#from_validation(validation) ⇒ Object



24
25
26
# File 'lib/dry/swagger/documentation_generator.rb', line 24

def from_validation(validation)
  generate_documentation(::DryValidationParser::ValidationSchemaParser.new.call(validation).keys)
end

#generate_documentation(fields) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/dry/swagger/documentation_generator.rb', line 28

def generate_documentation(fields)
  documentation = { properties: {}, required: [] }
  fields.each do |field_name, definition|
    documentation[:properties][field_name] = generate_field_properties(definition)
    if definition.is_a?(Hash)
      documentation[:required] << field_name if definition.fetch(:required, true) && @config.enable_required_validation
    else
      documentation[:required] << field_name if definition[0].fetch(:required, true) && @config.enable_required_validation
    end

  rescue Errors::MissingTypeError => e
    raise StandardError.new e.message % { field_name: field_name, valid_types: SWAGGER_FIELD_TYPE_DEFINITIONS.keys, definition: definition }
  rescue Errors::MissingHashSchemaError => e
    raise StandardError.new e.message % { field_name: field_name, valid_types: SWAGGER_FIELD_TYPE_DEFINITIONS.keys, definition: definition }
  end

  { :type => :object, :properties => documentation[:properties], :required => documentation[:required] }
end

#generate_field_properties(definition) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/dry/swagger/documentation_generator.rb', line 47

def generate_field_properties(definition)
  return generate_for_sti_type(definition) if definition.is_a?(Array)

  if definition[:type] == 'array' || definition[:array]
    documentation = generate_for_array(definition)
  elsif definition[:type] == 'hash'
    documentation = generate_for_hash(definition)
  else
    documentation = generate_for_primitive_type(definition)
  end
  @config.enable_nullable_validation ?
      documentation.merge(@config.nullable_type => definition.fetch(:nullable, false)) :
      documentation.merge(@config.nullable_type => true)

rescue KeyError
  raise Errors::MissingTypeError.new
end

#generate_for_array(definition) ⇒ Object



88
89
90
91
92
93
94
95
96
# File 'lib/dry/swagger/documentation_generator.rb', line 88

def generate_for_array(definition)
  items = array_of_primitive_type?(definition) ?
              SWAGGER_FIELD_TYPE_DEFINITIONS.fetch(definition.fetch(:type)) :
              generate_documentation(definition.fetch(:keys))
  items =  @config.enable_nullable_validation ?
               items.merge(@config.nullable_type => definition.fetch(:nullable, false)) :
               items.merge(@config.nullable_type => true)
  { type: :array, items: items }
end

#generate_for_hash(definition) ⇒ Object



98
99
100
101
# File 'lib/dry/swagger/documentation_generator.rb', line 98

def generate_for_hash(definition)
  raise Errors::MissingHashSchemaError.new unless definition[:keys]
  generate_documentation(definition.fetch(:keys))
end

#generate_for_primitive_type(definition) ⇒ Object



103
104
105
106
107
108
109
# File 'lib/dry/swagger/documentation_generator.rb', line 103

def generate_for_primitive_type(definition)
  documentation = SWAGGER_FIELD_TYPE_DEFINITIONS.fetch(definition.fetch(:type))
  documentation = documentation.merge(enum: definition.fetch(:enum)) if definition[:enum] && @config.enable_enums
  documentation = documentation.merge(description: definition.fetch(:description)) if definition[:description] &&
                                                                                      @config.enable_descriptions
  documentation
end

#generate_for_sti_type(definition) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/dry/swagger/documentation_generator.rb', line 65

def generate_for_sti_type(definition)
  properties = {}

  definition.each_with_index do |_, index|
    properties["definition_#{index + 1}"] = generate_field_properties(definition[index])
  end

  documentation = {
      type: :object,
      properties: properties,
      example: 'Dynamic Field. See Model Definitions'
  }

  if definition[0][:type] == 'array'
    definition.each { |it| it[:type] = 'hash'}
    documentation[:oneOf] = definition.map{ |it| generate_field_properties(it) }
    { type: :array, items: documentation }
  else
    documentation[:oneOf] = definition.map{ |it| generate_field_properties(it) }
    documentation
  end
end