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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +1 -0
- data/Rakefile +1 -0
- data/lib/zipfinder.rb +31 -0
- data/lib/zipfinder/client.rb +27 -0
- data/lib/zipfinder/exceptions.rb +7 -0
- data/lib/zipfinder/loggable.rb +9 -0
- data/lib/zipfinder/response_handler.rb +19 -0
- data/lib/zipfinder/rest_client_adapter.rb +11 -0
- data/lib/zipfinder/version.rb +3 -0
- data/spec/client_spec.rb +29 -0
- data/spec/response_handler_spec.rb +21 -0
- data/spec/rest_client_adapter_spec.rb +21 -0
- data/spec/spec_helper.rb +8 -0
- data/zipfinder.gemspec +23 -0
- metadata +87 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
== ZipFinder.me
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/zipfinder.rb
ADDED
@@ -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,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
|
data/spec/client_spec.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
data/zipfinder.gemspec
ADDED
@@ -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
|