quova 0.0.1 → 0.0.2
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/README.md +36 -12
- data/lib/quova.rb +5 -0
- data/lib/quova/qod.rb +17 -56
- data/lib/quova/rest.rb +127 -0
- data/lib/quova/result.rb +48 -0
- data/lib/quova/version.rb +1 -1
- data/quova.gemspec +4 -4
- data/spec/qod_spec.rb +21 -21
- data/spec/rest_spec.rb +360 -0
- metadata +16 -13
data/README.md
CHANGED
@@ -11,35 +11,54 @@ ruby Hash objects in response. Data-types will be cast where appropriate (e.g.
|
|
11
11
|
|
12
12
|
## Usage
|
13
13
|
|
14
|
-
|
14
|
+
There are two interfaces, depending on which API you want to use. You can use
|
15
|
+
either `Quova::QOD` (Quova on Demand), which is for the paid service and
|
16
|
+
includes slightly more data, or you can use `Quova::REST`, which is for the
|
17
|
+
standard service, providing slightly less data (such as anonymizer information).
|
15
18
|
|
16
|
-
|
19
|
+
You'll need the appropriate credential for each of these. You can register for
|
20
|
+
a free account at http://developer.quova.com/.
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
### Quova on Demand
|
23
|
+
|
24
|
+
lookup = Quova::QOD.new(:id => "your-id", :password => "your-password")
|
25
|
+
info = lookup.info("4.2.2.2")
|
20
26
|
|
21
27
|
Or you can use the alternative syntax:
|
22
28
|
|
23
|
-
info =
|
29
|
+
info = lookup["4.2.2.2"]
|
30
|
+
|
31
|
+
### Standard REST API
|
24
32
|
|
25
|
-
|
33
|
+
lookup = Quova::REST.new(:api_key => "your-key", :secret => "your-secret")
|
34
|
+
info = lookup.info("4.2.2.2")
|
35
|
+
|
36
|
+
Or you can use the alternative syntax:
|
37
|
+
|
38
|
+
info = lookup["4.2.2.2"]
|
39
|
+
|
40
|
+
Both clients return the same Result object, which acts like a Hash. How much
|
41
|
+
information you get depends on the API you're using. Anything that is not
|
42
|
+
provided, will be left as `nil`:
|
26
43
|
|
27
44
|
:ip_address => String
|
28
45
|
:ip_type => String
|
29
46
|
:anonymizer_status => String
|
30
|
-
:
|
31
|
-
:
|
47
|
+
:domain_tld => String
|
48
|
+
:domain_sld => String
|
32
49
|
:aol => Boolean
|
50
|
+
:organization => String
|
33
51
|
:carrier => String
|
34
52
|
:asn => String
|
35
|
-
:
|
53
|
+
:connection_type => String
|
36
54
|
:line_speed => String
|
37
|
-
:
|
55
|
+
:ip_routing_type => String
|
38
56
|
:continent_name => String
|
39
57
|
:country_code => String
|
58
|
+
:country_name => String
|
40
59
|
:country_confidence => Integer
|
41
60
|
:region_name => String
|
42
|
-
:
|
61
|
+
:state_code => String
|
43
62
|
:state_name => String
|
44
63
|
:state_confidence => Integer
|
45
64
|
:city_name => String
|
@@ -53,7 +72,12 @@ This returns a Hash with the following elements:
|
|
53
72
|
:msa_id => Integer
|
54
73
|
|
55
74
|
For any field that was returned blank, or missing, `nil` will be present in the
|
56
|
-
result
|
75
|
+
result.
|
76
|
+
|
77
|
+
The Result is an object with [Virtus](https://github.com/solnic/virtus) mixed
|
78
|
+
in to ensure valid data types. As a side-effect, you may access the properties
|
79
|
+
either using a Hash (`[:key]`) syntax, or just like a regular method call.
|
80
|
+
(`result.longitude`). If you want a plain Hash, call `result.attributes`.
|
57
81
|
|
58
82
|
## Resources
|
59
83
|
|
data/lib/quova.rb
CHANGED
data/lib/quova/qod.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
require 'rest_client'
|
2
|
-
require 'virtus'
|
3
|
-
require 'nokogiri'
|
4
|
-
|
5
1
|
module Quova
|
6
2
|
|
7
|
-
# Interface to the Quova QOD (
|
3
|
+
# Interface to the Quova QOD (Quova On Demand) service
|
8
4
|
#
|
9
5
|
# @api public
|
10
6
|
class QOD
|
@@ -31,25 +27,25 @@ module Quova
|
|
31
27
|
# @param [String, IPAddr, #to_s] ip
|
32
28
|
# The IP address to look up
|
33
29
|
#
|
34
|
-
# @return [
|
35
|
-
# A Hash containing a key for each element. Provided fields:
|
30
|
+
# @return [Quova::Result<Virtus>]
|
31
|
+
# A Hash-like object containing a key for each element. Provided fields:
|
36
32
|
#
|
37
33
|
# :ip_address
|
38
34
|
# :ip_type
|
39
35
|
# :anonymizer_status
|
40
|
-
# :
|
41
|
-
# :
|
36
|
+
# :domain_tld
|
37
|
+
# :domain_sld
|
42
38
|
# :aol
|
39
|
+
# :organization
|
43
40
|
# :carrier
|
44
41
|
# :asn
|
45
|
-
# :
|
42
|
+
# :connection_type
|
46
43
|
# :line_speed
|
47
|
-
# :
|
44
|
+
# :ip_routing_type
|
48
45
|
# :continent_name
|
49
46
|
# :country_code
|
50
47
|
# :country_confidence
|
51
48
|
# :region_name
|
52
|
-
# :region_confidence
|
53
49
|
# :state_name
|
54
50
|
# :state_confidence
|
55
51
|
# :city_name
|
@@ -71,7 +67,7 @@ module Quova
|
|
71
67
|
|
72
68
|
private
|
73
69
|
|
74
|
-
# Map XML to a meaningful
|
70
|
+
# Map XML to a meaningful Result
|
75
71
|
#
|
76
72
|
# @api private
|
77
73
|
def parse_xml(xml)
|
@@ -79,19 +75,19 @@ module Quova
|
|
79
75
|
:ip_address => "IPAddress",
|
80
76
|
:ip_type => "IPType",
|
81
77
|
:anonymizer_status => "AnonymizerStatus",
|
82
|
-
:
|
83
|
-
:
|
78
|
+
:domain_tld => "Domain TopLevel",
|
79
|
+
:domain_sld => "Domain SecondLevel",
|
84
80
|
:aol => "AOL",
|
81
|
+
:organization => "Organization",
|
85
82
|
:carrier => "Carrier",
|
86
83
|
:asn => "ASN",
|
87
|
-
:
|
84
|
+
:connection_type => "Connection",
|
88
85
|
:line_speed => "LineSpeed",
|
89
|
-
:
|
86
|
+
:ip_routing_type => "IPRoutingType",
|
90
87
|
:continent_name => "Continent Name",
|
91
88
|
:country_code => "Country Name",
|
92
89
|
:country_confidence => "Country Confidence",
|
93
90
|
:region_name => "Region Name",
|
94
|
-
:region_confidence => "Region Confidence",
|
95
91
|
:state_name => "State Name",
|
96
92
|
:state_confidence => "State Confidence",
|
97
93
|
:city_name => "City Name",
|
@@ -109,46 +105,11 @@ module Quova
|
|
109
105
|
result = Result.new
|
110
106
|
|
111
107
|
paths.each_pair do |attr, selector|
|
112
|
-
node = doc.at_css(selector)
|
113
|
-
result
|
108
|
+
next unless node = doc.at_css(selector)
|
109
|
+
result[attr] = node.text unless node.text == ""
|
114
110
|
end
|
115
111
|
|
116
|
-
result
|
117
|
-
end
|
118
|
-
|
119
|
-
# Internally maps Strings from the API to the correct types
|
120
|
-
#
|
121
|
-
# @api private
|
122
|
-
class Result
|
123
|
-
include Virtus
|
124
|
-
|
125
|
-
attribute :ip_address, String
|
126
|
-
attribute :ip_type, String
|
127
|
-
attribute :anonymizer_status, String
|
128
|
-
attribute :network_tld, String
|
129
|
-
attribute :network_sld, String
|
130
|
-
attribute :aol, Boolean
|
131
|
-
attribute :carrier, String
|
132
|
-
attribute :asn, String
|
133
|
-
attribute :connection, String
|
134
|
-
attribute :line_speed, String
|
135
|
-
attribute :routing_type, String
|
136
|
-
attribute :continent_name, String
|
137
|
-
attribute :country_code, String
|
138
|
-
attribute :country_confidence, Integer
|
139
|
-
attribute :region_name, String
|
140
|
-
attribute :region_confidence, Integer
|
141
|
-
attribute :state_name, String
|
142
|
-
attribute :state_confidence, Integer
|
143
|
-
attribute :city_name, String
|
144
|
-
attribute :city_confidence, Integer
|
145
|
-
attribute :postal_code, String
|
146
|
-
attribute :time_zone, String
|
147
|
-
attribute :area_code, String
|
148
|
-
attribute :longitude, Float
|
149
|
-
attribute :latitude, Float
|
150
|
-
attribute :dma_id, Integer
|
151
|
-
attribute :msa_id, Integer
|
112
|
+
result
|
152
113
|
end
|
153
114
|
end
|
154
115
|
end
|
data/lib/quova/rest.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
3
|
+
module Quova
|
4
|
+
|
5
|
+
# Interface to the standard Quova REST API.
|
6
|
+
#
|
7
|
+
# @api public
|
8
|
+
class REST
|
9
|
+
|
10
|
+
# Initialize the REST client with the Quova credentials.
|
11
|
+
#
|
12
|
+
# @example Quova::REST.new(:api_key => 'your-key', :secret => 'your-secret')
|
13
|
+
#
|
14
|
+
# @api public
|
15
|
+
def initialize(options)
|
16
|
+
@options = options.dup
|
17
|
+
@resource = RestClient::Resource.new("http://api.quova.com/v1/ipinfo")
|
18
|
+
end
|
19
|
+
|
20
|
+
# Query the API for a given IP address
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# rest.info("4.2.2.2") # => { ... }
|
24
|
+
#
|
25
|
+
# @param [String, IPAddr, #to_s] ip
|
26
|
+
# The IP address to look up
|
27
|
+
#
|
28
|
+
# @return [Quova::Result<Virtus>]
|
29
|
+
# A Hash-like object containing a key for each element. Provided fields:
|
30
|
+
#
|
31
|
+
# :ip_address
|
32
|
+
# :ip_type
|
33
|
+
# :domain_tld
|
34
|
+
# :domain_sld
|
35
|
+
# :organization
|
36
|
+
# :carrier
|
37
|
+
# :asn
|
38
|
+
# :connection_type
|
39
|
+
# :line_speed
|
40
|
+
# :ip_routing_type
|
41
|
+
# :continent_name
|
42
|
+
# :country_code
|
43
|
+
# :country_name
|
44
|
+
# :country_confidence
|
45
|
+
# :region_name
|
46
|
+
# :state_code
|
47
|
+
# :state_name
|
48
|
+
# :state_confidence
|
49
|
+
# :city_name
|
50
|
+
# :city_confidence
|
51
|
+
# :postal_code
|
52
|
+
# :time_zone
|
53
|
+
# :area_code
|
54
|
+
# :longitude
|
55
|
+
# :latitude
|
56
|
+
# :dma_id
|
57
|
+
# :msa_id
|
58
|
+
#
|
59
|
+
# @api public
|
60
|
+
def info(ip)
|
61
|
+
parse_xml(@resource[ip].get(:params => params_for_ip(ip)).body)
|
62
|
+
end
|
63
|
+
|
64
|
+
alias_method :[], :info
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
# Map XML to a meaningful Result
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
def parse_xml(xml)
|
72
|
+
paths = {
|
73
|
+
:ip_address => "ip_address",
|
74
|
+
:ip_type => "ip_type",
|
75
|
+
:domain_tld => "Domain tld",
|
76
|
+
:domain_sld => "Domain sld",
|
77
|
+
:organization => "organization",
|
78
|
+
:carrier => "carrier",
|
79
|
+
:asn => "asn",
|
80
|
+
:connection_type => "connection_type",
|
81
|
+
:line_speed => "line_speed",
|
82
|
+
:ip_routing_type => "ip_routing_type",
|
83
|
+
:continent_name => "continent",
|
84
|
+
:country_name => "country",
|
85
|
+
:country_code => "country_code",
|
86
|
+
:country_confidence => "country_cf",
|
87
|
+
:region_name => "region",
|
88
|
+
:state_name => "state",
|
89
|
+
:state_code => "state_code",
|
90
|
+
:state_confidence => "state_cf",
|
91
|
+
:city_name => "city",
|
92
|
+
:city_confidence => "city_cf",
|
93
|
+
:postal_code => "postal_code",
|
94
|
+
:time_zone => "time_zone",
|
95
|
+
:area_code => "area_code",
|
96
|
+
:longitude => "longitude",
|
97
|
+
:latitude => "latitude",
|
98
|
+
:dma_id => "dma",
|
99
|
+
:msa_id => "msa"
|
100
|
+
}
|
101
|
+
|
102
|
+
doc = Nokogiri::XML(xml)
|
103
|
+
result = Result.new
|
104
|
+
|
105
|
+
paths.each_pair do |attr, selector|
|
106
|
+
next unless node = doc.at_css(selector)
|
107
|
+
result[attr] = node.text unless node.text == ""
|
108
|
+
end
|
109
|
+
|
110
|
+
result
|
111
|
+
end
|
112
|
+
|
113
|
+
# See http://developer.quova.com/docs#parameters
|
114
|
+
#
|
115
|
+
# @api private
|
116
|
+
def params_for_ip(ip)
|
117
|
+
{ :apikey => @options[:api_key], :sig => signature }
|
118
|
+
end
|
119
|
+
|
120
|
+
# See http://developer.quova.com/docs#signing_api
|
121
|
+
#
|
122
|
+
# @api private
|
123
|
+
def signature
|
124
|
+
Digest::MD5.hexdigest(@options[:api_key].to_s + @options[:secret].to_s + Time.now.to_i.to_s)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/lib/quova/result.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'virtus'
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
module Quova
|
5
|
+
|
6
|
+
# Provides the result data from a Quova API call.
|
7
|
+
# Acts both like a Hash and Plain Old Ruby Object.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
class Result
|
11
|
+
include Virtus
|
12
|
+
extend Forwardable
|
13
|
+
|
14
|
+
def_delegators :attributes, :each, :each_pair
|
15
|
+
|
16
|
+
attribute :ip_address, String
|
17
|
+
attribute :ip_type, String
|
18
|
+
attribute :anonymizer_status, String
|
19
|
+
attribute :domain_tld, String
|
20
|
+
attribute :domain_sld, String
|
21
|
+
attribute :aol, Boolean
|
22
|
+
attribute :organization, String
|
23
|
+
attribute :carrier, String
|
24
|
+
attribute :asn, String
|
25
|
+
attribute :connection_type, String
|
26
|
+
attribute :line_speed, String
|
27
|
+
attribute :ip_routing_type, String
|
28
|
+
attribute :continent_name, String
|
29
|
+
attribute :country_name, String
|
30
|
+
attribute :country_code, String
|
31
|
+
attribute :country_confidence, Integer
|
32
|
+
attribute :region_name, String
|
33
|
+
attribute :state_code, String
|
34
|
+
attribute :state_name, String
|
35
|
+
attribute :state_confidence, Integer
|
36
|
+
attribute :city_name, String
|
37
|
+
attribute :city_confidence, Integer
|
38
|
+
attribute :postal_code, String
|
39
|
+
attribute :time_zone, String
|
40
|
+
attribute :area_code, String
|
41
|
+
attribute :longitude, Float
|
42
|
+
attribute :latitude, Float
|
43
|
+
attribute :dma_id, Integer
|
44
|
+
attribute :msa_id, Integer
|
45
|
+
|
46
|
+
include Enumerable
|
47
|
+
end
|
48
|
+
end
|
data/lib/quova/version.rb
CHANGED
data/quova.gemspec
CHANGED
@@ -6,16 +6,16 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "quova"
|
7
7
|
s.version = Quova::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["
|
10
|
-
s.email = ["chris@
|
11
|
-
s.homepage = "
|
9
|
+
s.authors = ["Chris Corbyn"]
|
10
|
+
s.email = ["chris@w3style.co.uk"]
|
11
|
+
s.homepage = "https://github.com/d11wtq/quova"
|
12
12
|
s.summary = %q{Quova GeoIP Client for Ruby}
|
13
13
|
s.description = %q{Provides a high-level client for Quova's On-Demand REST API}
|
14
14
|
|
15
15
|
s.rubyforge_project = "quova"
|
16
16
|
|
17
17
|
s.add_dependency "rest-client", "~> 1.6.3"
|
18
|
-
s.add_dependency "virtus"
|
18
|
+
s.add_dependency "virtus", ">= 0.0.5"
|
19
19
|
s.add_dependency "nokogiri", "~> 1.5.0"
|
20
20
|
|
21
21
|
s.add_development_dependency "rspec", "~> 2.6"
|
data/spec/qod_spec.rb
CHANGED
@@ -30,7 +30,7 @@ describe Quova::QOD do
|
|
30
30
|
@resource.should_receive(:[]).with("4.2.2.2") { @resource }
|
31
31
|
@resource.should_receive(:get) { @response }
|
32
32
|
|
33
|
-
@qod["4.2.2.2"]
|
33
|
+
@qod["4.2.2.2"]
|
34
34
|
end
|
35
35
|
|
36
36
|
it "maps <IPAddress/> to :ip_address" do
|
@@ -69,7 +69,7 @@ describe Quova::QOD do
|
|
69
69
|
@qod.info("4.2.2.2")[:anonymizer_status].should == "SUSPECT"
|
70
70
|
end
|
71
71
|
|
72
|
-
it "maps <Network><Domain><TopLevel/></Domain></Network> to :
|
72
|
+
it "maps <Network><Domain><TopLevel/></Domain></Network> to :domain_tld" do
|
73
73
|
@response.stub(:body) do
|
74
74
|
<<-XML
|
75
75
|
<IpInfo xmlns="https://webservices.quova.com/ipinfo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
|
@@ -78,10 +78,10 @@ describe Quova::QOD do
|
|
78
78
|
XML
|
79
79
|
end
|
80
80
|
|
81
|
-
@qod.info("4.2.2.2")[:
|
81
|
+
@qod.info("4.2.2.2")[:domain_tld].should == ".net.au"
|
82
82
|
end
|
83
83
|
|
84
|
-
it "maps <Network><Domain><SecondLevel/></Domain></Network> to :
|
84
|
+
it "maps <Network><Domain><SecondLevel/></Domain></Network> to :domain_sld" do
|
85
85
|
@response.stub(:body) do
|
86
86
|
<<-XML
|
87
87
|
<IpInfo xmlns="https://webservices.quova.com/ipinfo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
|
@@ -90,7 +90,7 @@ describe Quova::QOD do
|
|
90
90
|
XML
|
91
91
|
end
|
92
92
|
|
93
|
-
@qod.info("4.2.2.2")[:
|
93
|
+
@qod.info("4.2.2.2")[:domain_sld].should == "iinet"
|
94
94
|
end
|
95
95
|
|
96
96
|
it "maps <Network><AOL/></Network> to :aol" do
|
@@ -105,6 +105,18 @@ describe Quova::QOD do
|
|
105
105
|
@qod.info("4.2.2.2")[:aol].should be(false)
|
106
106
|
end
|
107
107
|
|
108
|
+
it "maps <Network><Organization/></Network> to :organization" do
|
109
|
+
@response.stub(:body) do
|
110
|
+
<<-XML
|
111
|
+
<IpInfo xmlns="https://webservices.quova.com/ipinfo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
|
112
|
+
<Network><Organization>iinet limited</Organization></Network>
|
113
|
+
</IpInfo>
|
114
|
+
XML
|
115
|
+
end
|
116
|
+
|
117
|
+
@qod.info("4.2.2.2")[:organization].should == "iinet limited"
|
118
|
+
end
|
119
|
+
|
108
120
|
it "maps <Network><Carrier/></Network> to :carrier" do
|
109
121
|
@response.stub(:body) do
|
110
122
|
<<-XML
|
@@ -129,7 +141,7 @@ describe Quova::QOD do
|
|
129
141
|
@qod.info("4.2.2.2")[:asn].should == "3356"
|
130
142
|
end
|
131
143
|
|
132
|
-
it "maps <Network><Connection/></Network> to :
|
144
|
+
it "maps <Network><Connection/></Network> to :connection_type" do
|
133
145
|
@response.stub(:body) do
|
134
146
|
<<-XML
|
135
147
|
<IpInfo xmlns="https://webservices.quova.com/ipinfo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
|
@@ -138,7 +150,7 @@ describe Quova::QOD do
|
|
138
150
|
XML
|
139
151
|
end
|
140
152
|
|
141
|
-
@qod.info("4.2.2.2")[:
|
153
|
+
@qod.info("4.2.2.2")[:connection_type].should == "dsl"
|
142
154
|
end
|
143
155
|
|
144
156
|
it "maps <Network><LineSpeed/></Network> to :line_speed" do
|
@@ -153,7 +165,7 @@ describe Quova::QOD do
|
|
153
165
|
@qod.info("4.2.2.2")[:line_speed].should == "medium"
|
154
166
|
end
|
155
167
|
|
156
|
-
it "maps <Network><IPRoutingType/></Network> to :
|
168
|
+
it "maps <Network><IPRoutingType/></Network> to :ip_routing_type" do
|
157
169
|
@response.stub(:body) do
|
158
170
|
<<-XML
|
159
171
|
<IpInfo xmlns="https://webservices.quova.com/ipinfo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
|
@@ -162,7 +174,7 @@ describe Quova::QOD do
|
|
162
174
|
XML
|
163
175
|
end
|
164
176
|
|
165
|
-
@qod.info("4.2.2.2")[:
|
177
|
+
@qod.info("4.2.2.2")[:ip_routing_type].should == "fixed"
|
166
178
|
end
|
167
179
|
|
168
180
|
it "maps <Location><Continent><Name/></Continent></Location> to :continent_name" do
|
@@ -214,18 +226,6 @@ describe Quova::QOD do
|
|
214
226
|
@qod.info("4.2.2.2")[:region_name].should == "test"
|
215
227
|
end
|
216
228
|
|
217
|
-
it "maps <Location><Region><Confidence/></Region></Location> to :region_confidence" do
|
218
|
-
@response.stub(:body) do
|
219
|
-
<<-XML
|
220
|
-
<IpInfo xmlns="https://webservices.quova.com/ipinfo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
|
221
|
-
<Location><Region><Confidence>43</Confidence></Region></Location>
|
222
|
-
</IpInfo>
|
223
|
-
XML
|
224
|
-
end
|
225
|
-
|
226
|
-
@qod.info("4.2.2.2")[:region_confidence].should == 43
|
227
|
-
end
|
228
|
-
|
229
229
|
it "maps <Location><State><Name/></State></Location> to :state_name" do
|
230
230
|
@response.stub(:body) do
|
231
231
|
<<-XML
|
data/spec/rest_spec.rb
ADDED
@@ -0,0 +1,360 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Quova::REST do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "prepares a RestClient with the base URI" do
|
6
|
+
RestClient::Resource.should_receive(:new).with("http://api.quova.com/v1/ipinfo")
|
7
|
+
Quova::REST.new(:api_key => "key", :secret => "secrit")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#info" do
|
12
|
+
before(:each) do
|
13
|
+
@resource = double()
|
14
|
+
@response = double()
|
15
|
+
@resource.stub(:[]) { @resource }
|
16
|
+
@resource.stub(:get) { @response }
|
17
|
+
@response.stub(:body) { "" }
|
18
|
+
RestClient::Resource.stub(:new) { @resource }
|
19
|
+
@api = Quova::REST.new(:api_key => "key", :secret => "secrit")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "queries the API for the given IP" do
|
23
|
+
@resource.should_receive(:[]).with("4.2.2.2") { @resource }
|
24
|
+
@resource.should_receive(:get) { @response }
|
25
|
+
|
26
|
+
@api.info("4.2.2.2")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "is aliased by []" do
|
30
|
+
@resource.should_receive(:[]).with("4.2.2.2") { @resource }
|
31
|
+
@resource.should_receive(:get) { @response }
|
32
|
+
|
33
|
+
@api["4.2.2.2"]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "maps <ip_address/> to :ip_address" do
|
37
|
+
@response.stub(:body) do
|
38
|
+
<<-XML
|
39
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
40
|
+
<ip_address>4.2.2.2</ip_address>
|
41
|
+
</ipinfo>
|
42
|
+
XML
|
43
|
+
end
|
44
|
+
|
45
|
+
@api.info("4.2.2.2")[:ip_address].should == "4.2.2.2"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "maps <ip_type/> to :ip_type" do
|
49
|
+
@response.stub(:body) do
|
50
|
+
<<-XML
|
51
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
52
|
+
<ip_type>Mapped</ip_type>
|
53
|
+
</ipinfo>
|
54
|
+
XML
|
55
|
+
end
|
56
|
+
|
57
|
+
@api.info("4.2.2.2")[:ip_type].should == "Mapped"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "maps <Network><Domain><tld/></Domain></Network> to :domain_tld" do
|
61
|
+
@response.stub(:body) do
|
62
|
+
<<-XML
|
63
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
64
|
+
<Network><Domain><tld>.net.au</tld></Domain></Network>
|
65
|
+
</ipinfo>
|
66
|
+
XML
|
67
|
+
end
|
68
|
+
|
69
|
+
@api.info("4.2.2.2")[:domain_tld].should == ".net.au"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "maps <Network><Domain><sld/></Domain></Network> to :domain_sld" do
|
73
|
+
@response.stub(:body) do
|
74
|
+
<<-XML
|
75
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
76
|
+
<Network><Domain><sld>iinet</sld></Domain></Network>
|
77
|
+
</ipinfo>
|
78
|
+
XML
|
79
|
+
end
|
80
|
+
|
81
|
+
@api.info("4.2.2.2")[:domain_sld].should == "iinet"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "maps <Network><organization/></Network> to :organization" do
|
85
|
+
@response.stub(:body) do
|
86
|
+
<<-XML
|
87
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
88
|
+
<Network><organization>iinet limited</organization></Network>
|
89
|
+
</ipinfo>
|
90
|
+
XML
|
91
|
+
end
|
92
|
+
|
93
|
+
@api.info("4.2.2.2")[:organization].should == "iinet limited"
|
94
|
+
end
|
95
|
+
|
96
|
+
it "maps <Network><carrier/></Network> to :carrier" do
|
97
|
+
@response.stub(:body) do
|
98
|
+
<<-XML
|
99
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
100
|
+
<Network><carrier>iinet limited</carrier></Network>
|
101
|
+
</ipinfo>
|
102
|
+
XML
|
103
|
+
end
|
104
|
+
|
105
|
+
@api.info("4.2.2.2")[:carrier].should == "iinet limited"
|
106
|
+
end
|
107
|
+
|
108
|
+
it "maps <Network><asn/></Network> to :asn" do
|
109
|
+
@response.stub(:body) do
|
110
|
+
<<-XML
|
111
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
112
|
+
<Network><asn>3356</asn></Network>
|
113
|
+
</ipinfo>
|
114
|
+
XML
|
115
|
+
end
|
116
|
+
|
117
|
+
@api.info("4.2.2.2")[:asn].should == "3356"
|
118
|
+
end
|
119
|
+
|
120
|
+
it "maps <Network><connection_type/></Network> to :connection_type" do
|
121
|
+
@response.stub(:body) do
|
122
|
+
<<-XML
|
123
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
124
|
+
<Network><connection_type>dsl</connection_type></Network>
|
125
|
+
</ipinfo>
|
126
|
+
XML
|
127
|
+
end
|
128
|
+
|
129
|
+
@api.info("4.2.2.2")[:connection_type].should == "dsl"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "maps <Network><line_speed/></Network> to :line_speed" do
|
133
|
+
@response.stub(:body) do
|
134
|
+
<<-XML
|
135
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
136
|
+
<Network><line_speed>medium</line_speed></Network>
|
137
|
+
</ipinfo>
|
138
|
+
XML
|
139
|
+
end
|
140
|
+
|
141
|
+
@api.info("4.2.2.2")[:line_speed].should == "medium"
|
142
|
+
end
|
143
|
+
|
144
|
+
it "maps <Network><ip_routing_type/></Network> to :ip_routing_type" do
|
145
|
+
@response.stub(:body) do
|
146
|
+
<<-XML
|
147
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
148
|
+
<Network><ip_routing_type>fixed</ip_routing_type></Network>
|
149
|
+
</ipinfo>
|
150
|
+
XML
|
151
|
+
end
|
152
|
+
|
153
|
+
@api.info("4.2.2.2")[:ip_routing_type].should == "fixed"
|
154
|
+
end
|
155
|
+
|
156
|
+
it "maps <Location><continent/></Location> to :continent_name" do
|
157
|
+
@response.stub(:body) do
|
158
|
+
<<-XML
|
159
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
160
|
+
<Location><continent>oceania</continent></Location>
|
161
|
+
</ipinfo>
|
162
|
+
XML
|
163
|
+
end
|
164
|
+
|
165
|
+
@api.info("4.2.2.2")[:continent_name].should == "oceania"
|
166
|
+
end
|
167
|
+
|
168
|
+
it "maps <Location><CountryData><country_code/></CountryData></Location> to :country_code" do
|
169
|
+
@response.stub(:body) do
|
170
|
+
<<-XML
|
171
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
172
|
+
<Location><CountryData><country_code>au</country_code></CountryData></Location>
|
173
|
+
</ipinfo>
|
174
|
+
XML
|
175
|
+
end
|
176
|
+
|
177
|
+
@api.info("4.2.2.2")[:country_code].should == "au"
|
178
|
+
end
|
179
|
+
|
180
|
+
it "maps <Location><CountryData><country/></CountryData></Location> to :country_name" do
|
181
|
+
@response.stub(:body) do
|
182
|
+
<<-XML
|
183
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
184
|
+
<Location><CountryData><country>australia</country></CountryData></Location>
|
185
|
+
</ipinfo>
|
186
|
+
XML
|
187
|
+
end
|
188
|
+
|
189
|
+
@api.info("4.2.2.2")[:country_name].should == "australia"
|
190
|
+
end
|
191
|
+
|
192
|
+
it "maps <Location><CountryData><country_cf/></CountryData></Location> to :country_confidence" do
|
193
|
+
@response.stub(:body) do
|
194
|
+
<<-XML
|
195
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
196
|
+
<Location><CountryData><country_cf>94</country_cf></CountryData></Location>
|
197
|
+
</ipinfo>
|
198
|
+
XML
|
199
|
+
end
|
200
|
+
|
201
|
+
@api.info("4.2.2.2")[:country_confidence].should == 94
|
202
|
+
end
|
203
|
+
|
204
|
+
it "maps <Location><region/></Location> to :region_name" do
|
205
|
+
@response.stub(:body) do
|
206
|
+
<<-XML
|
207
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
208
|
+
<Location><region>test</region></Location>
|
209
|
+
</ipinfo>
|
210
|
+
XML
|
211
|
+
end
|
212
|
+
|
213
|
+
@api.info("4.2.2.2")[:region_name].should == "test"
|
214
|
+
end
|
215
|
+
|
216
|
+
it "maps <Location><StateData><state_code/></StateData></Location> to :state_code" do
|
217
|
+
@response.stub(:body) do
|
218
|
+
<<-XML
|
219
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
220
|
+
<Location><StateData><state_code>vic</state_code></StateData></Location>
|
221
|
+
</ipinfo>
|
222
|
+
XML
|
223
|
+
end
|
224
|
+
|
225
|
+
@api.info("4.2.2.2")[:state_code].should == "vic"
|
226
|
+
end
|
227
|
+
|
228
|
+
it "maps <Location><StateData><state/></StateData></Location> to :state_name" do
|
229
|
+
@response.stub(:body) do
|
230
|
+
<<-XML
|
231
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
232
|
+
<Location><StateData><state>victoria</state></StateData></Location>
|
233
|
+
</ipinfo>
|
234
|
+
XML
|
235
|
+
end
|
236
|
+
|
237
|
+
@api.info("4.2.2.2")[:state_name].should == "victoria"
|
238
|
+
end
|
239
|
+
|
240
|
+
it "maps <Location><state_cf/></Location> to :state_confidence" do
|
241
|
+
@response.stub(:body) do
|
242
|
+
<<-XML
|
243
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
244
|
+
<Location><state_cf>86</state_cf></Location>
|
245
|
+
</ipinfo>
|
246
|
+
XML
|
247
|
+
end
|
248
|
+
|
249
|
+
@api.info("4.2.2.2")[:state_confidence].should == 86
|
250
|
+
end
|
251
|
+
|
252
|
+
it "maps <Location><CityData><city/></CityData></Location> to :city_name" do
|
253
|
+
@response.stub(:body) do
|
254
|
+
<<-XML
|
255
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
256
|
+
<Location><CityData><city>melbourne</city></CityData></Location>
|
257
|
+
</ipinfo>
|
258
|
+
XML
|
259
|
+
end
|
260
|
+
|
261
|
+
@api.info("4.2.2.2")[:city_name].should == "melbourne"
|
262
|
+
end
|
263
|
+
|
264
|
+
it "maps <Location><CityData><city_cf/></CityData></Location> to :city_confidence" do
|
265
|
+
@response.stub(:body) do
|
266
|
+
<<-XML
|
267
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
268
|
+
<Location><CityData><city_cf>51</city_cf></CityData></Location>
|
269
|
+
</ipinfo>
|
270
|
+
XML
|
271
|
+
end
|
272
|
+
|
273
|
+
@api.info("4.2.2.2")[:city_confidence].should == 51
|
274
|
+
end
|
275
|
+
|
276
|
+
it "maps <Location><CityData><postal_code/></CityData></Location> to :postal_code" do
|
277
|
+
@response.stub(:body) do
|
278
|
+
<<-XML
|
279
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
280
|
+
<Location><CityData><postal_code>3000</postal_code></CityData></Location>
|
281
|
+
</ipinfo>
|
282
|
+
XML
|
283
|
+
end
|
284
|
+
|
285
|
+
@api.info("4.2.2.2")[:postal_code].should == "3000"
|
286
|
+
end
|
287
|
+
|
288
|
+
it "maps <Location><CityData><time_zone/></CityData></Location> to :time_zone" do
|
289
|
+
@response.stub(:body) do
|
290
|
+
<<-XML
|
291
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
292
|
+
<Location><CityData><time_zone>10</time_zone></CityData></Location>
|
293
|
+
</ipinfo>
|
294
|
+
XML
|
295
|
+
end
|
296
|
+
|
297
|
+
@api.info("4.2.2.2")[:time_zone].should == "10"
|
298
|
+
end
|
299
|
+
|
300
|
+
it "maps <Location><CityData><area_code/></CityData></Location> to :area_code" do
|
301
|
+
@response.stub(:body) do
|
302
|
+
<<-XML
|
303
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
304
|
+
<Location><CityData><area_code>03</area_code></CityData></Location>
|
305
|
+
</ipinfo>
|
306
|
+
XML
|
307
|
+
end
|
308
|
+
|
309
|
+
@api.info("4.2.2.2")[:area_code].should == "03"
|
310
|
+
end
|
311
|
+
|
312
|
+
it "maps <Location><longitude/></Location> to :longitude" do
|
313
|
+
@response.stub(:body) do
|
314
|
+
<<-XML
|
315
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
316
|
+
<Location><longitude>145.031113</longitude></Location>
|
317
|
+
</ipinfo>
|
318
|
+
XML
|
319
|
+
end
|
320
|
+
|
321
|
+
@api.info("4.2.2.2")[:longitude].should == 145.031113
|
322
|
+
end
|
323
|
+
|
324
|
+
it "maps <Location><latitude/></Location> to :latitude" do
|
325
|
+
@response.stub(:body) do
|
326
|
+
<<-XML
|
327
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
328
|
+
<Location><latitude>-37.8808327</latitude></Location>
|
329
|
+
</ipinfo>
|
330
|
+
XML
|
331
|
+
end
|
332
|
+
|
333
|
+
@api.info("4.2.2.2")[:latitude].should == -37.8808327
|
334
|
+
end
|
335
|
+
|
336
|
+
it "maps <Location><dma/></Location> to :dma_id" do
|
337
|
+
@response.stub(:body) do
|
338
|
+
<<-XML
|
339
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
340
|
+
<Location><dma>1234</dma></Location>
|
341
|
+
</ipinfo>
|
342
|
+
XML
|
343
|
+
end
|
344
|
+
|
345
|
+
@api.info("4.2.2.2")[:dma_id].should == 1234
|
346
|
+
end
|
347
|
+
|
348
|
+
it "maps <Location><msa/></Location> to :msa_id" do
|
349
|
+
@response.stub(:body) do
|
350
|
+
<<-XML
|
351
|
+
<ipinfo xmlns="http://data.quova.com/1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
|
352
|
+
<Location><msa>1234</msa></Location>
|
353
|
+
</ipinfo>
|
354
|
+
XML
|
355
|
+
end
|
356
|
+
|
357
|
+
@api.info("4.2.2.2")[:msa_id].should == 1234
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quova
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- Chris Corbyn
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
@@ -13,7 +13,7 @@ date: 2011-07-10 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
16
|
-
requirement: &
|
16
|
+
requirement: &16674100 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: 1.6.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16674100
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: virtus
|
27
|
-
requirement: &
|
27
|
+
requirement: &16673560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: 0.0.5
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16673560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: nokogiri
|
38
|
-
requirement: &
|
38
|
+
requirement: &16673100 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.5.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16673100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &16672640 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '2.6'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *16672640
|
58
58
|
description: Provides a high-level client for Quova's On-Demand REST API
|
59
59
|
email:
|
60
|
-
- chris@
|
60
|
+
- chris@w3style.co.uk
|
61
61
|
executables: []
|
62
62
|
extensions: []
|
63
63
|
extra_rdoc_files: []
|
@@ -69,11 +69,14 @@ files:
|
|
69
69
|
- Rakefile
|
70
70
|
- lib/quova.rb
|
71
71
|
- lib/quova/qod.rb
|
72
|
+
- lib/quova/rest.rb
|
73
|
+
- lib/quova/result.rb
|
72
74
|
- lib/quova/version.rb
|
73
75
|
- quova.gemspec
|
74
76
|
- spec/qod_spec.rb
|
77
|
+
- spec/rest_spec.rb
|
75
78
|
- spec/spec_helper.rb
|
76
|
-
homepage:
|
79
|
+
homepage: https://github.com/d11wtq/quova
|
77
80
|
licenses: []
|
78
81
|
post_install_message:
|
79
82
|
rdoc_options: []
|