Sha256: 6883a686339d91f3acad914a5fa4bd81182bddc27c7866c3c7b6269415b72ea8

Contents?: true

Size: 1.74 KB

Versions: 8

Compression:

Stored size: 1.74 KB

Contents

class Betterdocs::Dsl::Controller::Action::Response
  include Betterdocs::Dsl::Common
  extend Tins::DSLAccessor

  class Error < StandardError; end

  def initialize(name = :default, &block)
    @name = name.to_sym
    @data_block = block || proc {}
  end

  dsl_accessor :name

  def params
    -> name { param(name).full?(:value) }
  end

  def data
    @data ||= instance_eval(&@data_block)
    @data.is_a? Betterdocs::Responding or
      raise Error, "result #{@data.class} is not Betterdocs::Responding"
    hash = @data.to_hash
    if hash.key?(:data) && hash[:data].empty?
      raise Error, "result data for action #{controller}##{action} is empty"
    elsif hash.empty?
      raise Error, "result for action #{controller}##{action} is empty"
    end
    @data
  rescue => e
    error = e.is_a?(Error) ? e : Error.new("#{e.class}: #{e}")
    error.set_backtrace e.backtrace.grep(/^#{Betterdocs.rails.root}/)
    raise error
  end

  def properties
    representer.full? { |r| r.docs.nested_properties }  || []
  end

  def links
    representer.full? { |r| r.docs.nested_links }  || []
  end

  def representer
    data or return
    data.ask_and_send(:representer) || inherited_representer(data)
  end

  private\
  def inherited_representer(data)
    data.singleton_class.ancestors.find { |c|
      Betterdocs::ResultRepresenter >= c && c.respond_to?(:docs)
    }
  end

  def to_json(*a)
    data.nil? and raise Error, "result for action #{controller}##{action} was nil"
    unless data.is_a?(Betterdocs::Responding)
      infobar.puts "#{data.class}".red
      infobar.puts "Result of type #{data.class} for action #{controller}##{action} is not hash / Betterdocs::Representer"
    end
    my_data = data.ask_and_send(:to_hash) || data
    data.to_json(*a)
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
betterdocs-0.14.0 lib/betterdocs/dsl/controller/action/response.rb
betterdocs-0.13.0 lib/betterdocs/dsl/controller/action/response.rb
betterdocs-0.12.5 lib/betterdocs/dsl/controller/action/response.rb
betterdocs-0.12.4 lib/betterdocs/dsl/controller/action/response.rb
betterdocs-0.12.3 lib/betterdocs/dsl/controller/action/response.rb
betterdocs-0.12.2 lib/betterdocs/dsl/controller/action/response.rb
betterdocs-0.12.1 lib/betterdocs/dsl/controller/action/response.rb
betterdocs-0.12.0 lib/betterdocs/dsl/controller/action/response.rb