lib/dry/swagger/documentation_generator.rb in dry-swagger-0.5.2 vs lib/dry/swagger/documentation_generator.rb in dry-swagger-0.6.0

- old
+ new

@@ -15,85 +15,92 @@ @config = config end def generate_documentation(fields) documentation = { properties: {}, required: [] } - fields.each do |field_name, attributes_hash| - documentation[:properties][field_name] = generate_field_properties(attributes_hash) - if attributes_hash.is_a?(Hash) - documentation[:required] << field_name if attributes_hash.fetch(:required, true) && @config.enable_required_validation + 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 attributes_hash[0].fetch(:required, true) && @config.enable_required_validation + 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, attributes_hash: attributes_hash } + 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, attributes_hash: attributes_hash } + 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 - def generate_field_properties(attributes_hash) - if attributes_hash.is_a?(Array) - properties = {} - attributes_hash.each_with_index do |_, index| - properties["definition_#{index + 1}"] = generate_field_properties(attributes_hash[index]) - end - if attributes_hash[0][:type] == 'array' - attributes_hash.each { |definition| definition[:type] = 'hash'} - { - type: :array, - items: { - type: :object, - properties: properties, - oneOf: attributes_hash.map{ |it| generate_field_properties(it) }, - example: 'Dynamic Field. See Model Definitions' - }, - } - else - { - oneOf: attributes_hash.map{ |it| generate_field_properties(it) }, - type: :object, - properties: properties, - example: 'Dynamic Field. See Model Definitions' - } - end - else - if attributes_hash[:type] == 'array' - items = generate_documentation(attributes_hash.fetch(:keys)) - items = @config.enable_nullable_validation ? - items.merge(@config.nullable_type => attributes_hash.fetch(@config.nullable_type, false)) : - items.merge(@config.nullable_type => true) - documentation = { type: :array, items: items } - elsif attributes_hash[:array] && attributes_hash.fetch(:type) != 'array' - items = SWAGGER_FIELD_TYPE_DEFINITIONS.fetch(attributes_hash.fetch(:type)) - items = @config.enable_nullable_validation ? - items.merge(@config.nullable_type => attributes_hash.fetch(@config.nullable_type, false)) : - items.merge(@config.nullable_type => true) - documentation = { type: :array, items: items } - elsif attributes_hash[:type] == 'hash' - raise Errors::MissingHashSchemaError.new unless attributes_hash[:keys] - documentation = generate_documentation(attributes_hash.fetch(:keys)) - else - documentation = SWAGGER_FIELD_TYPE_DEFINITIONS.fetch(attributes_hash.fetch(:type)) - if attributes_hash[:enum] && @config.enable_enums - documentation = documentation.merge(enum: attributes_hash.fetch(:enum)) - end + def generate_field_properties(definition) + return generate_for_sti_type(definition) if definition.is_a?(Array) - if attributes_hash[:description] && @config.enable_descriptions - documentation = documentation.merge(description: attributes_hash.fetch(:description)) - end - end - - @config.enable_nullable_validation ? - documentation.merge(@config.nullable_type => attributes_hash.fetch(@config.nullable_type, false)) : - documentation.merge(@config.nullable_type => true) + 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(@config.nullable_type, false)) : + documentation.merge(@config.nullable_type => true) rescue KeyError raise Errors::MissingTypeError.new + end + + 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 + + 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(@config.nullable_type, false)) : + items.merge(@config.nullable_type => true) + { type: :array, items: items } + end + + def generate_for_hash(definition) + raise Errors::MissingHashSchemaError.new unless definition[:keys] + generate_documentation(definition.fetch(:keys)) + end + + 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 + + def array_of_primitive_type?(definition) + definition[:array] && definition.fetch(:type) != 'array' end end end end