lib/grape-swagger/entity/parser.rb in grape-swagger-entity-0.2.2 vs lib/grape-swagger/entity/parser.rb in grape-swagger-entity-0.2.3

- old
+ new

@@ -25,23 +25,24 @@ return unless params params.each_with_object({}) do |(entity_name, entity_options), memo| next if entity_options.fetch(:documentation, {}).fetch(:in, nil).to_s == 'header' - entity_name = entity_options[:as] if entity_options[:as] + final_entity_name = entity_options.fetch(:as, entity_name) documentation = entity_options[:documentation] - memo[entity_name] = if entity_options[:nesting] - parse_nested(entity_name, entity_options, parent_model) - else - attribute_parser.call(entity_options) - end + memo[final_entity_name] = if entity_options[:nesting] + parse_nested(entity_name, entity_options, parent_model) + else + attribute_parser.call(entity_options) + end - if documentation - memo[entity_name][:read_only] = documentation[:read_only].to_s == 'true' if documentation[:read_only] - memo[entity_name][:description] = documentation[:desc] if documentation[:desc] + next unless documentation + if documentation[:read_only] + memo[final_entity_name][:read_only] = documentation[:read_only].to_s == 'true' end + memo[final_entity_name][:description] = documentation[:desc] if documentation[:desc] end end def parse_nested(entity_name, entity_options, parent_model = nil) nested_entity = if parent_model.nil? @@ -52,29 +53,41 @@ params = nested_entity.nested_exposures.each_with_object({}) do |value, memo| memo[value.attribute] = value.send(:options) end + required = required_params(params) + properties = parse_grape_entity_params(params, nested_entity) is_a_collection = entity_options[:documentation].is_a?(Hash) && entity_options[:documentation][:type].to_s.casecmp('array').zero? if is_a_collection { type: :array, - items: { + items: with_required({ type: :object, properties: properties - }, - description: entity_options[:desc] || '' + }, required) } else - { + with_required({ type: :object, - properties: properties, - description: entity_options[:desc] || '' - } + properties: properties + }, required) end + end + + def required_params(params) + params.select { |_, options| options.fetch(:documentation, {}).fetch(:required, false) } + .map { |(key, options)| [options.fetch(:as, key), options] } + .map(&:first) + end + + def with_required(hash, required) + return hash if required.empty? + hash[:required] = required + hash end end end end