module Wordnik class Response require 'active_model' require 'json' require 'nokogiri' require 'htmlentities' include ActiveModel::Validations include ActiveModel::Conversion extend ActiveModel::Naming attr_accessor :raw validates_presence_of :raw def initialize(raw) self.raw = raw end def code raw.code end # If body is JSON, parse it # TODO: If body is XML, parse it # Otherwise return raw string def body JSON.parse raw.body#.encode(::Encoding::UTF_8, undef: :replace) rescue raw.body#.encode(::Encoding::UTF_8, undef: :replace) end def headers h = {} raw.headers_hash.each {|k,v| h[k] = v } h end # Extract the response format from the header hash # e.g. {'Content-Type' => 'application/json'} def format headers['Content-Type'].split("/").last.to_sym end def json? format == :json end def xml? format == :xml end def pretty_body return unless body.present? case format when :json JSON.pretty_generate(body).gsub(/\n/, '
') when :xml xsl = Nokogiri::XSLT(File.open(File.join(File.dirname(__FILE__), "../../config/pretty_print.xsl"))) xml = Nokogiri(body) coder = HTMLEntities.new coder.encode(xsl.apply_to(xml).to_s) end end def pretty_headers JSON.pretty_generate(headers).gsub(/\n/, '
') end # It's an ActiveModel thing.. def persisted? false end end end