zipfinder 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in zipfinder.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ == ZipFinder.me
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,31 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ require 'ostruct'
4
+ require "forwardable"
5
+ require 'json'
6
+ require 'restclient'
7
+ require 'logger'
8
+ require "zipfinder/version"
9
+ require "zipfinder/loggable"
10
+ require "zipfinder/response_handler"
11
+ require "zipfinder/rest_client_adapter"
12
+ require "zipfinder/exceptions"
13
+ require "zipfinder/client"
14
+
15
+ module ZipFinder
16
+ BASE_URL = 'http://zipfinder.me/zipcode'
17
+ class << self
18
+ attr_accessor :logger
19
+ end
20
+
21
+ def self.configure
22
+ yield self
23
+ end
24
+ end
25
+
26
+ ZipFinder.configure do |config|
27
+ config.logger = Logger.new(STDOUT)
28
+ config.logger.level = Logger::ERROR
29
+ end
30
+
31
+
@@ -0,0 +1,27 @@
1
+ module ZipFinder
2
+ class Client
3
+ extend Forwardable
4
+ attr_accessor :http_adapter, :response_handler
5
+
6
+ def self.get(zipcode)
7
+ ZipFinder::Client.new.get(zipcode)
8
+ end
9
+
10
+ def initialize(http_adapter = RestClientAdapter, response_handler = ResponseHandler.new)
11
+ @http_adapter = http_adapter
12
+ @response_handler = response_handler
13
+ end
14
+
15
+ def get(zipcode)
16
+ url = build_url(zipcode)
17
+ response = http_adapter.http_get(url)
18
+ response_handler.process(response)
19
+ end
20
+
21
+ private
22
+
23
+ def build_url(zipcode)
24
+ "#{ZipFinder::BASE_URL}/#{zipcode}"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ module ZipFinder
2
+ class RequestFailedError < StandardError
3
+ end
4
+
5
+ class ServiceNotAvailableError < StandardError
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module ZipFinder
2
+ module Loggable
3
+ private
4
+
5
+ def log(message, logger = ZipFinder.logger)
6
+ logger << "#{message}\n" if logger
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ module ZipFinder
2
+ class ResponseHandler
3
+ include Loggable
4
+ attr_accessor :json_adapter
5
+
6
+ def initialize(json_adapter = JSON)
7
+ @json_adapter = json_adapter
8
+ end
9
+
10
+ def process(response)
11
+ if response.status == 200
12
+ json_adapter.parse response.body
13
+ else
14
+ log "ZipFinder::RequestFailedError : #{response.message}"
15
+ raise RequestFailedError, response.message
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module ZipFinder
2
+ class RestClientAdapter
3
+ def self.http_get url, headers = {}
4
+ response = RestClient.get(url, headers)
5
+ OpenStruct.new(:status => response.code, :body => response.body)
6
+
7
+ rescue RestClient::Exception, Errno::EINVAL, Errno::ECONNRESET, Errno::ECONNREFUSED, EOFError => e
8
+ raise ServiceNotAvailableError, e.message
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Zipfinder
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe ZipFinder::Client do
4
+ let(:zipcode) { "37713172" }
5
+ let(:url) { "#{ZipFinder::BASE_URL}/#{zipcode}" }
6
+
7
+ it "calls the get method in a instance passing the zipcode" do
8
+ ZipFinder::Client.any_instance.should_receive(:get).with(zipcode)
9
+ ZipFinder::Client.get(zipcode)
10
+ end
11
+
12
+ describe ".get" do
13
+ it "executes the http call" do
14
+ http_adapter = mock
15
+ response_handler = stub(:process => nil)
16
+ subject = ZipFinder::Client.new(http_adapter, response_handler)
17
+ http_adapter.should_receive(:http_get).with(url)
18
+ subject.get(zipcode)
19
+ end
20
+
21
+ it "handles the request response" do
22
+ http_adapter = stub(:http_get => :response)
23
+ response_handler = mock
24
+ subject = ZipFinder::Client.new(http_adapter, response_handler)
25
+ response_handler.should_receive(:process).with(:response).and_return(:result)
26
+ subject.get(zipcode).should == :result
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe ZipFinder::ResponseHandler do
4
+ let(:json_adapter) { mock('json_adapter') }
5
+ subject { ZipFinder::ResponseHandler.new(json_adapter) }
6
+ let(:valid_response) {OpenStruct.new(:status => 200, :body => :body)}
7
+ let(:invalid_response) {OpenStruct.new(:status => 404, :body => :body)}
8
+
9
+ describe "#process" do
10
+ it "parses the body response" do
11
+ json_adapter.should_receive(:parse).with valid_response.body
12
+ subject.process(valid_response)
13
+ end
14
+
15
+ it "raises a RequestFailedError" do
16
+ expect {
17
+ subject.process(invalid_response)
18
+ }.to raise_error ZipFinder::RequestFailedError
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe ZipFinder::RestClientAdapter do
4
+ subject { ZipFinder::RestClientAdapter }
5
+ let(:response) { OpenStruct.new(:code => 200, :body => :body) }
6
+
7
+ describe "#http_get" do
8
+ it "delegates to RestClient and return a custom Struct" do
9
+ expected = OpenStruct.new(:status => response.code, :body => response.body)
10
+ RestClient.should_receive(:get).with(:url, {}).and_return(response)
11
+ subject.http_get(:url, {}).should == expected
12
+ end
13
+
14
+ it "raises a ServiceNotAvailableError" do
15
+ RestClient.should_receive(:get).and_raise RestClient::Exception
16
+ expect {
17
+ subject.http_get(:url, {})
18
+ }.to raise_error(ZipFinder::ServiceNotAvailableError)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ $:.unshift File.dirname(__FILE__) + "../lib"
2
+ require "rubygems"
3
+ require "zipfinder"
4
+ require "rspec"
5
+
6
+ ZipFinder.configure do |config|
7
+ config.logger = nil
8
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "zipfinder/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "zipfinder"
7
+ s.version = Zipfinder::VERSION
8
+ s.authors = ["Rinaldi Fonseca"]
9
+ s.email = ["rinaldifonseca@gmail.com"]
10
+ s.homepage = "http://zipfinder.me"
11
+ s.summary = %q{A wrapper for ZipFinder.me Service}
12
+ s.description = %q{A wrapper for ZipFinder.me Service}
13
+
14
+ s.rubyforge_project = "zipfinder"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "rspec"
22
+ s.add_dependency "rest-client"
23
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zipfinder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rinaldi Fonseca
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-20 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70115444827780 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70115444827780
25
+ - !ruby/object:Gem::Dependency
26
+ name: rest-client
27
+ requirement: &70115444827240 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70115444827240
36
+ description: A wrapper for ZipFinder.me Service
37
+ email:
38
+ - rinaldifonseca@gmail.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - .gitignore
44
+ - Gemfile
45
+ - README.rdoc
46
+ - Rakefile
47
+ - lib/zipfinder.rb
48
+ - lib/zipfinder/client.rb
49
+ - lib/zipfinder/exceptions.rb
50
+ - lib/zipfinder/loggable.rb
51
+ - lib/zipfinder/response_handler.rb
52
+ - lib/zipfinder/rest_client_adapter.rb
53
+ - lib/zipfinder/version.rb
54
+ - spec/client_spec.rb
55
+ - spec/response_handler_spec.rb
56
+ - spec/rest_client_adapter_spec.rb
57
+ - spec/spec_helper.rb
58
+ - zipfinder.gemspec
59
+ homepage: http://zipfinder.me
60
+ licenses: []
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project: zipfinder
79
+ rubygems_version: 1.8.15
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: A wrapper for ZipFinder.me Service
83
+ test_files:
84
+ - spec/client_spec.rb
85
+ - spec/response_handler_spec.rb
86
+ - spec/rest_client_adapter_spec.rb
87
+ - spec/spec_helper.rb