From a4ca6827c9b42e53083f1093cd28b50146610ef6 Mon Sep 17 00:00:00 2001 From: Michael Noack Date: Sun, 12 Jan 2014 17:11:51 +1030 Subject: [PATCH] Add Typhoeus NetAdapter to show example of caching --- geokit.gemspec | 1 + lib/geokit/geocoders.rb | 1 + lib/geokit/net_adapter/typhoeus.rb | 13 +++++++++ test/helper.rb | 4 +++ test/test_net_adapter.rb | 46 ++++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+) create mode 100644 lib/geokit/net_adapter/typhoeus.rb create mode 100644 test/test_net_adapter.rb diff --git a/geokit.gemspec b/geokit.gemspec index 51382cb6..d1e4f3fb 100644 --- a/geokit.gemspec +++ b/geokit.gemspec @@ -31,4 +31,5 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'coveralls' spec.add_development_dependency 'vcr' spec.add_development_dependency 'webmock' # used in vcr + spec.add_development_dependency 'typhoeus' # used in net_adapter end diff --git a/lib/geokit/geocoders.rb b/lib/geokit/geocoders.rb index e1318c82..7a6ca65f 100644 --- a/lib/geokit/geocoders.rb +++ b/lib/geokit/geocoders.rb @@ -1,5 +1,6 @@ require 'net/http' require 'geokit/net_adapter/net_http' +require 'geokit/net_adapter/typhoeus' require 'ipaddr' require 'rexml/document' require 'yaml' diff --git a/lib/geokit/net_adapter/typhoeus.rb b/lib/geokit/net_adapter/typhoeus.rb new file mode 100644 index 00000000..7e585b78 --- /dev/null +++ b/lib/geokit/net_adapter/typhoeus.rb @@ -0,0 +1,13 @@ +module Geokit + module NetAdapter + class Typhoeus + def self.do_get(url) + ::Typhoeus.get(url.to_s) + end + + def self.success?(response) + response.success? + end + end + end +end diff --git a/test/helper.rb b/test/helper.rb index e829a6a6..80244a6d 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -42,6 +42,10 @@ class MockSuccess < Net::HTTPSuccess #:nodoc: all def initialize @header = {} end + + def success? # Typhoeus + true + end end class MockFailure < Net::HTTPServiceUnavailable #:nodoc: all diff --git a/test/test_net_adapter.rb b/test/test_net_adapter.rb new file mode 100644 index 00000000..06a1a04e --- /dev/null +++ b/test/test_net_adapter.rb @@ -0,0 +1,46 @@ +require File.join(File.dirname(__FILE__), 'helper') + +# Base class for testing geocoders. +class NetAdapterTest < Test::Unit::TestCase #:nodoc: all + class Geokit::Geocoders::CachedGeocoder < Geokit::Geocoders::Geocoder + def self.parse_json(hash) + hash + end + end + + class SuperSimpleCache + def initialize + @cache = {} + end + + def write(key, value) + @cache[key] = value + end + + def fetch(key) + @cache[key] + end + end + + RESULT = '{"name":"json"}' + RESULT_HASH = {"name" => "json"} + + # Defines common test fixtures. + def setup + @url = 'http://www.cacheme.com' + @address = 'San Francisco, CA' + end + + def test_cache + old_adapter = Geokit::Geocoders::net_adapter + Geokit::Geocoders::net_adapter = Geokit::NetAdapter::Typhoeus + Typhoeus::Config.cache = SuperSimpleCache + success = MockSuccess.new + success.expects(:body).returns(RESULT) + url = 'http://www.cacheme.com' + Geokit::NetAdapter::Typhoeus.expects(:do_get).with(@url).returns(success) + assert_equal RESULT_HASH, Geokit::Geocoders::CachedGeocoder.process(:json, @url) + Typhoeus::Config.cache = nil + Geokit::Geocoders::net_adapter = old_adapter + end +end