class Brainstem::ApiDocs::Formatters::OpenApiSpecification::Version2::FieldDefinitions::ResponseFieldFormatter

Public Class Methods

new(endpoint, param_name, param_tree) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 14
def initialize(endpoint, param_name, param_tree)
  @endpoint = endpoint
  @param_name = param_name
  @param_tree = param_tree
end

Public Instance Methods

call()
Alias for: format
format() click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 20
def format
  field_config = @param_tree[:_config]
  field_properties = @param_tree.except(:_config)
  
  format_field(field_config, field_properties)
end
Also aliased as: call

Private Instance Methods

format_array_items(field_config, field_properties) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 46
def format_array_items(field_config, field_properties)
  field_nested_levels = field_config[:nested_levels]
  
  if field_properties.present?
    [format_nested_field(field_config, field_properties), field_nested_levels - 1]
  else
    [type_and_format(field_config[:item_type]), field_nested_levels]
  end
end
format_description(field_config) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 134
def format_description(field_config)
  format_sentence(field_config[:info])
end
format_field(field_config, field_branches) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 30
def format_field(field_config, field_branches)
  if field_config[:nested_levels]
    format_nested_array_field(field_config, field_branches)
  elsif field_branches.present?
    format_nested_field(field_config, field_branches)
  else
    format_simple_field(field_config)
  end
end
format_field_properties(branches) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 120
def format_field_properties(branches)
  branches.inject(ActiveSupport::HashWithIndifferentAccess.new) do |buffer, (field_name, field_config)|
    config = field_config[:_config]
    branches = field_config.except(:_config)

    if config[:dynamic_key]
      format_field(config, branches)
    else
      buffer[field_name.to_s] = format_field(config, branches)
      buffer
    end
  end
end
format_nested_array_field(field_config, field_properties) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 40
def format_nested_array_field(field_config, field_properties)
  field_properties_data, nested_levels = format_array_items(field_config, field_properties)
  
  format_nested_array_parent(nested_levels, field_properties_data)
end
format_nested_array_parent(nested_level, formatted_data) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 56
def format_nested_array_parent(nested_level, formatted_data)
  if nested_level == 1
    {
      'type' => 'array',
      'items' => formatted_data
    }
  else
    {
      'type' => 'array',
      'items' => format_nested_array_parent(nested_level - 1, formatted_data)
    }
  end
end
format_nested_field(field_config, field_properties) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 70
def format_nested_field(field_config, field_properties)
  case field_config[:type]
    when 'hash'
      format_object_field(field_config, field_properties)
    when 'array'
      {
        type: 'array',
        description: format_description(field_config),
        items: format_object_field(field_config, field_properties, false)
      }
  end.with_indifferent_access.reject { |_, v| v.blank? }
end
format_object_field(field_config, field_properties, include_description = true) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 83
def format_object_field(field_config, field_properties, include_description = true)
  properties, additional_properties = split_properties(field_properties)

  {
    type: 'object',
    description: include_description && format_description(field_config),
    properties: format_field_properties(properties),
    additionalProperties: format_field_properties(additional_properties),
  }.with_indifferent_access.reject { |_, v| v.blank? }
end
format_simple_field(field_config) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 106
def format_simple_field(field_config)
  field_data = type_and_format(field_config[:type], field_config[:item_type])
  raise(invalid_type_error_message(field_config)) unless field_data
  field_data.merge!(description: format_sentence(field_config[:info])) if field_config[:info].present?
  field_data
end
invalid_type_error_message(field_config) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 113
              def invalid_type_error_message(field_config)
                <<-MSG.strip_heredoc
                  Unknown Brainstem Field type encountered(#{field_config[:type]}) for field #{field_config[:name]}
                  in #{@endpoint.controller_name} for #{@endpoint.action} action. 
                MSG
              end
split_properties(field_properties) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/response_field_formatter.rb, line 94
def split_properties(field_properties)
  split_properties = field_properties.each_with_object({ properties: {}, additional_properties: {} }) do |(field_name, field_config), acc|
    if field_config[:_config][:dynamic_key]
      acc[:additional_properties][field_name] = field_config
    else
      acc[:properties][field_name] = field_config
    end
  end

  [split_properties[:properties], split_properties[:additional_properties]]
end