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

Attributes

presenter[R]

Public Class Methods

new(presenter, field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 14
def initialize(presenter, field)
  @presenter = presenter
  @field = field
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/presenter_field_formatter.rb, line 19
def format
  format_field(@field)
end
Also aliased as: call

Private Instance Methods

format_array_items(field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 48
def format_array_items(field)
  field_nested_levels = field.options[:nested_levels]

  if has_properties?(field)
    [format_nested_field(field, false), field_nested_levels - 1]
  else
    [type_and_format(field.options[:item_type]), field_nested_levels]
  end
end
format_conditional_description(field_options) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 125
def format_conditional_description(field_options)
  return '' if field_options[:if].blank?

  conditions = field_options[:if]
    .reject { |cond| presenter.conditionals[cond].options[:nodoc] }
    .map    { |cond| uncapitalize(presenter.conditionals[cond].description) }
    .delete_if(&:empty?)
    .uniq
    .to_sentence

  conditions.present? ? "\nVisible when #{conditions}.\n" : ''
end
format_description(field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 115
def format_description(field)
  field_description = format_sentence(field.description) || ''
  field_description << format_conditional_description(field.options)
  if field.optional?
    field_description << "\nOnly returned when requested through the optional_fields param.\n"
  end
  field_description.try(:chomp!)
  field_description
end
format_field(field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 32
def format_field(field)
  if field.options[:nested_levels]
    format_nested_array_field(field)
  elsif has_properties?(field)
    format_nested_field(field)
  else
    format_simple_field(field)
  end
end
format_field_properties(branches) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 108
def format_field_properties(branches)
  branches.inject(ActiveSupport::HashWithIndifferentAccess.new) do |buffer, (field_name, field)|
    buffer[field_name.to_s] = format_field(field)
    buffer
  end
end
format_nested_array_field(field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 42
def format_nested_array_field(field)
  field_properties_data, nested_levels = format_array_items(field)

  format_nested_array_parent(nested_levels, field_properties_data, format_description(field))
end
format_nested_array_parent(nested_level, formatted_data, description = nil) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 58
def format_nested_array_parent(nested_level, formatted_data, description = nil)
  if nested_level == 1
    {
      'type' => 'array',
      'description' => description,
      'items' => formatted_data
    }
  else
    {
      'type' => 'array',
      'description' => description,
      'items' => format_nested_array_parent(nested_level - 1, formatted_data)
    }
  end.with_indifferent_access.reject { |_, v| v.blank? }
end
format_nested_field(field, include_description = true) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 74
def format_nested_field(field, include_description = true)
  case field.type
    when 'hash'
      format_object_field(field, include_description)
    when 'array'
      {
        type: 'array',
        description: include_description && format_description(field),
        items: format_object_field(field, false)
      }
  end.with_indifferent_access.reject { |_, v| v.blank? }
end
format_object_field(field, include_description = true) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 87
def format_object_field(field, include_description = true)
  {
    type: 'object',
    description: include_description && format_description(field),
    properties: format_field_properties(field.to_h),
  }.with_indifferent_access.reject { |_, v| v.blank? }
end
format_simple_field(field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 95
def format_simple_field(field)
  field_data = type_and_format(field.type) || raise(invalid_type_error_message(field))
  field_data.merge!(description: format_description(field))
  field_data.with_indifferent_access.reject { |_, v| v.blank? }
end
has_properties?(field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 28
def has_properties?(field)
  field.respond_to?(:configuration)
end
invalid_type_error_message(field) click to toggle source
# File lib/brainstem/api_docs/formatters/open_api_specification/version_2/field_definitions/presenter_field_formatter.rb, line 101
              def invalid_type_error_message(field)
                <<-MSG.strip_heredoc
                  Unknown Brainstem Field type encountered(#{field.type}) for field #{field.name}
                  in #{presenter.target_class.to_s}.
                MSG
              end