technekes/grape-apiary

View on GitHub
lib/grape-apiary/sample_generator.rb

Summary

Maintainability
A
0 mins
Test Coverage
module GrapeApiary
  class SampleGenerator
    attr_reader :resource, :root

    delegate :unique_params, to: :resource

    def initialize(resource)
      @resource = resource
      @root     = resource.key.singularize
    end

    def sample(id = false)
      array = resource.unique_params.map do |param|
        next if param.name == root

        [param.name, param.example]
      end

      hash = Hash[array.compact]

      hash = hash.reverse_merge(id: Config.generate_id) if id
      hash = { root => hash } if Config.include_root

      hash
    end

    def request
      hash = sample

      return unless hash.present?

      # format json spaces for blueprint markdown
      JSON
        .pretty_generate(hash)
        .gsub('{', (' ' * 14) + '{')
        .gsub('}', (' ' * 14) + '}')
        .gsub(/\ {2}\"/, (' ' * 16) + '"')
    end

    def response(list = false)
      return unless (hash = sample(true)).present?

      pretty_response_for(list ? [hash] : hash)
    end

    private

    # rubocop:disable Metrics/AbcSize
    def pretty_response_for(hash)
      JSON
        .pretty_generate(hash)
        .gsub('[', (' ' * 12) + '[')
        .gsub(']', (' ' * 12) + ']')
        .gsub('{', (' ' * 14) + '{')
        .gsub('}', (' ' * 14) + '}')
        .gsub(/\ {2}\"/, (' ' * 16) + '"')
    end
    # rubocop:enable Metrics/AbcSize
  end
end