geo_ip 0.6.2 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGES.md +7 -0
- data/lib/geo_ip.rb +3 -2
- data/spec/geo_ip_spec.rb +52 -40
- metadata +10 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1b657b45c91e3977b4d16e5f890e24c0acf9ce70cbcec8a29c72ab2c7ac7c0a1
|
4
|
+
data.tar.gz: 521cb290641b1011acb6d62364788f084569872803e94b475549c90b3851f38f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 358758b68eee3a17a27082ec69242cf46a6e1760e6f6dd14e5f9d7b01b634e2b53ac0193351ee44b931de2ce060d7c4b6d8d9cb03a9a2933f1c80c63757c6252
|
7
|
+
data.tar.gz: 8b8f3e731d78609f6eb188b53a95e380d65a122bedb18214b797724ad30104ef126001d3d49dfa443a155ad6a52787ca95a1b03a2817918cd544f4ef70cf5502
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
### 0.7.0 (2018-03-03)
|
2
|
+
|
3
|
+
* Requires ruby >= 1.9.3 from the gemspec.
|
4
|
+
* Adds ruby 2.4 and 2.5 to the Travis build matrix
|
5
|
+
* Removes dependency on rest-client. By [elfenars](https://github.com/elfenars)
|
6
|
+
* Updates test suite to RSpec 3.x. By [elfenars](https://github.com/elfenars)
|
7
|
+
|
1
8
|
### 0.6.2 (2016-02-10)
|
2
9
|
|
3
10
|
* Removes explicit json (gem) dependency as it is bundled with all supported ruby versions.
|
data/lib/geo_ip.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'json'
|
2
|
-
require '
|
2
|
+
require 'resolv'
|
3
|
+
require 'net/http'
|
3
4
|
|
4
5
|
class GeoIp
|
5
6
|
class InvalidPrecissionError < ArgumentError; end
|
@@ -66,7 +67,7 @@ class GeoIp
|
|
66
67
|
def geolocation(ip, options = {})
|
67
68
|
location = nil
|
68
69
|
Timeout.timeout(fallback_timeout) do
|
69
|
-
parsed_response = JSON.parse
|
70
|
+
parsed_response = JSON.parse Net::HTTP.get(URI(lookup_url(ip, options)))
|
70
71
|
location = convert_keys(parsed_response, options)
|
71
72
|
end
|
72
73
|
|
data/spec/geo_ip_spec.rb
CHANGED
@@ -12,6 +12,7 @@ USE_WEBMOCK = true
|
|
12
12
|
|
13
13
|
describe 'GeoIp' do
|
14
14
|
before :all do
|
15
|
+
@ruby_19 = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2')
|
15
16
|
unless USE_WEBMOCK
|
16
17
|
puts 'Running tests WITHOUT WebMock. You will need an internet connection. You may need to increase the GeoIp.fallback_timeout amount.'
|
17
18
|
WebMock.disable!
|
@@ -19,9 +20,20 @@ describe 'GeoIp' do
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def stub_geolocation(ip, options = {}, &_block)
|
23
|
+
headers = {
|
24
|
+
'Accept' => '*/*',
|
25
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
26
|
+
'Host' => 'api.ipinfodb.com',
|
27
|
+
'User-Agent' => 'Ruby'
|
28
|
+
}
|
29
|
+
if @ruby_19
|
30
|
+
headers.delete('Accept-Encoding')
|
31
|
+
headers.delete('Host')
|
32
|
+
end
|
33
|
+
|
22
34
|
if USE_WEBMOCK
|
23
35
|
stub_request(:get, GeoIp.lookup_url(ip, options))
|
24
|
-
.with(headers:
|
36
|
+
.with(headers: headers)
|
25
37
|
.to_return(status: 200, body: yield, headers: {})
|
26
38
|
end
|
27
39
|
end
|
@@ -34,12 +46,12 @@ describe 'GeoIp' do
|
|
34
46
|
context 'api_key' do
|
35
47
|
it 'should return the API key when set' do
|
36
48
|
GeoIp.api_key = 'my_api_key'
|
37
|
-
GeoIp.api_key.
|
49
|
+
expect(GeoIp.api_key).to eq('my_api_key')
|
38
50
|
end
|
39
51
|
|
40
52
|
it 'should throw an error when API key is not set' do
|
41
53
|
GeoIp.api_key = nil
|
42
|
-
|
54
|
+
expect { GeoIp.geolocation(IP_GOOGLE_US) }.to raise_error(GeoIp::ApiKeyError)
|
43
55
|
end
|
44
56
|
end
|
45
57
|
|
@@ -62,9 +74,9 @@ describe 'GeoIp' do
|
|
62
74
|
end
|
63
75
|
|
64
76
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US)
|
65
|
-
geolocation[:country_code].
|
66
|
-
geolocation[:country_name].
|
67
|
-
geolocation[:city].
|
77
|
+
expect(geolocation[:country_code]).to eq('US')
|
78
|
+
expect(geolocation[:country_name]).to eq('UNITED STATES')
|
79
|
+
expect(geolocation[:city]).to eq('MONTEREY PARK')
|
68
80
|
end
|
69
81
|
|
70
82
|
it 'should return nothing city for a private ip address' do
|
@@ -85,9 +97,9 @@ describe 'GeoIp' do
|
|
85
97
|
end
|
86
98
|
|
87
99
|
geolocation = GeoIp.geolocation(IP_PRIVATE)
|
88
|
-
geolocation[:country_code].
|
89
|
-
geolocation[:country_name].
|
90
|
-
geolocation[:city].
|
100
|
+
expect(geolocation[:country_code]).to eq('-')
|
101
|
+
expect(geolocation[:country_name]).to eq('-')
|
102
|
+
expect(geolocation[:city]).to eq('-')
|
91
103
|
end
|
92
104
|
|
93
105
|
it 'should return nothing for localhost ip address' do
|
@@ -108,9 +120,9 @@ describe 'GeoIp' do
|
|
108
120
|
end
|
109
121
|
|
110
122
|
geolocation = GeoIp.geolocation(IP_LOCAL)
|
111
|
-
geolocation[:country_code].
|
112
|
-
geolocation[:country_name].
|
113
|
-
geolocation[:city].
|
123
|
+
expect(geolocation[:country_code]).to eq('-')
|
124
|
+
expect(geolocation[:country_name]).to eq('-')
|
125
|
+
expect(geolocation[:city]).to eq('-')
|
114
126
|
end
|
115
127
|
|
116
128
|
it 'should return the correct city for a public ip address when explicitly requiring it' do
|
@@ -131,9 +143,9 @@ describe 'GeoIp' do
|
|
131
143
|
end
|
132
144
|
|
133
145
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US, precision: :city)
|
134
|
-
geolocation[:country_code].
|
135
|
-
geolocation[:country_name].
|
136
|
-
geolocation[:city].
|
146
|
+
expect(geolocation[:country_code]).to eq('US')
|
147
|
+
expect(geolocation[:country_name]).to eq('UNITED STATES')
|
148
|
+
expect(geolocation[:city]).to eq('MONTEREY PARK')
|
137
149
|
end
|
138
150
|
end
|
139
151
|
|
@@ -149,8 +161,8 @@ describe 'GeoIp' do
|
|
149
161
|
})
|
150
162
|
end
|
151
163
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US, precision: :country)
|
152
|
-
geolocation[:country_code].
|
153
|
-
geolocation[:country_name].
|
164
|
+
expect(geolocation[:country_code]).to eq('US')
|
165
|
+
expect(geolocation[:country_name]).to eq('UNITED STATES')
|
154
166
|
end
|
155
167
|
|
156
168
|
it 'should return nothing country for a private ip address' do
|
@@ -164,8 +176,8 @@ describe 'GeoIp' do
|
|
164
176
|
})
|
165
177
|
end
|
166
178
|
geolocation = GeoIp.geolocation(IP_PRIVATE, precision: :country)
|
167
|
-
geolocation[:country_code].
|
168
|
-
geolocation[:country_name].
|
179
|
+
expect(geolocation[:country_code]).to eq('-')
|
180
|
+
expect(geolocation[:country_name]).to eq('-')
|
169
181
|
end
|
170
182
|
|
171
183
|
it 'should return nothing country for localhost ip address' do
|
@@ -179,8 +191,8 @@ describe 'GeoIp' do
|
|
179
191
|
})
|
180
192
|
end
|
181
193
|
geolocation = GeoIp.geolocation(IP_LOCAL, precision: :country)
|
182
|
-
geolocation[:country_code].
|
183
|
-
geolocation[:country_name].
|
194
|
+
expect(geolocation[:country_code]).to eq('-')
|
195
|
+
expect(geolocation[:country_name]).to eq('-')
|
184
196
|
end
|
185
197
|
|
186
198
|
it 'should not return the city for a public ip address' do
|
@@ -194,9 +206,9 @@ describe 'GeoIp' do
|
|
194
206
|
})
|
195
207
|
end
|
196
208
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US, precision: :country)
|
197
|
-
geolocation[:country_code].
|
198
|
-
geolocation[:country_name].
|
199
|
-
geolocation[:city].
|
209
|
+
expect(geolocation[:country_code]).to eq('US')
|
210
|
+
expect(geolocation[:country_name]).to eq('UNITED STATES')
|
211
|
+
expect(geolocation[:city]).to eq(nil)
|
200
212
|
end
|
201
213
|
end
|
202
214
|
|
@@ -218,7 +230,7 @@ describe 'GeoIp' do
|
|
218
230
|
})
|
219
231
|
end
|
220
232
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US, timezone: true)
|
221
|
-
geolocation[:timezone].
|
233
|
+
expect(geolocation[:timezone]).to eq('-08:00') # This one is likely to break when dst changes.
|
222
234
|
end
|
223
235
|
|
224
236
|
it 'should not return the timezone information when explicitly not requesting it' do
|
@@ -238,7 +250,7 @@ describe 'GeoIp' do
|
|
238
250
|
})
|
239
251
|
end
|
240
252
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US, timezone: false)
|
241
|
-
geolocation[:timezone].
|
253
|
+
expect(geolocation[:timezone]).to eq(nil)
|
242
254
|
end
|
243
255
|
|
244
256
|
it 'should not return the timezone information when not requesting it' do
|
@@ -258,7 +270,7 @@ describe 'GeoIp' do
|
|
258
270
|
})
|
259
271
|
end
|
260
272
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US)
|
261
|
-
geolocation[:timezone].
|
273
|
+
expect(geolocation[:timezone]).to eq(nil)
|
262
274
|
end
|
263
275
|
|
264
276
|
it 'should not return the timezone information when country precision is selected' do
|
@@ -278,26 +290,26 @@ describe 'GeoIp' do
|
|
278
290
|
})
|
279
291
|
end
|
280
292
|
geolocation = GeoIp.geolocation(IP_GOOGLE_US, precision: :country, timezone: true)
|
281
|
-
geolocation[:timezone].
|
293
|
+
expect(geolocation[:timezone]).to eq(nil)
|
282
294
|
end
|
283
295
|
end
|
284
296
|
|
285
297
|
context 'timeout' do
|
286
298
|
it 'should trigger timeout when the request is taking too long' do
|
287
299
|
stub_request(:get, GeoIp.lookup_url(IP_GOOGLE_US)).to_timeout
|
288
|
-
|
300
|
+
expect { GeoIp.geolocation(IP_GOOGLE_US) }.to raise_error(Timeout::Error)
|
289
301
|
end
|
290
302
|
|
291
|
-
it 'should trigger fallback timeout when
|
303
|
+
it 'should trigger fallback timeout when Net::HTTP is taking too long to send the request', focus: true do
|
292
304
|
GeoIp.fallback_timeout = 1
|
293
|
-
|
294
|
-
|
305
|
+
allow(Net::HTTP).to receive(:get) { sleep 2 }
|
306
|
+
expect { GeoIp.geolocation(IP_GOOGLE_US) }.to raise_error(Timeout::Error)
|
295
307
|
end
|
296
308
|
end
|
297
309
|
|
298
310
|
context 'ip' do
|
299
311
|
it 'should trigger invalid ip when invalid IPv4 address is provided' do
|
300
|
-
|
312
|
+
allow(Net::HTTP).to receive(:get) do
|
301
313
|
%({
|
302
314
|
"statusCode" : "OK",
|
303
315
|
"statusMessage" : "",
|
@@ -312,11 +324,11 @@ describe 'GeoIp' do
|
|
312
324
|
"timeZone" : "-08:00"
|
313
325
|
})
|
314
326
|
end
|
315
|
-
|
327
|
+
expect { GeoIp.geolocation(IPV4_INVALID) }.to raise_error(GeoIp::InvalidIpError)
|
316
328
|
end
|
317
329
|
|
318
330
|
it 'should not trigger invalid ip when valid IPv4 address is provided' do
|
319
|
-
|
331
|
+
allow(Net::HTTP).to receive(:get) do
|
320
332
|
%({
|
321
333
|
"statusCode" : "OK",
|
322
334
|
"statusMessage" : "",
|
@@ -331,11 +343,11 @@ describe 'GeoIp' do
|
|
331
343
|
"timeZone" : "-08:00"
|
332
344
|
})
|
333
345
|
end
|
334
|
-
|
346
|
+
expect { GeoIp.geolocation(IP_GOOGLE_US) }.not_to raise_error
|
335
347
|
end
|
336
348
|
|
337
349
|
it 'should trigger invalid ip when invalid IPv6 address is provided' do
|
338
|
-
|
350
|
+
allow(Net::HTTP).to receive(:get) do
|
339
351
|
%({
|
340
352
|
"statusCode" : "OK",
|
341
353
|
"statusMessage" : "",
|
@@ -350,11 +362,11 @@ describe 'GeoIp' do
|
|
350
362
|
"timeZone" : "-08:00"
|
351
363
|
})
|
352
364
|
end
|
353
|
-
|
365
|
+
expect { GeoIp.geolocation(IPV6_INVALID) }.to raise_error(GeoIp::InvalidIpError)
|
354
366
|
end
|
355
367
|
|
356
368
|
it 'should not trigger invalid ip when valid IPv6 address is provided' do
|
357
|
-
|
369
|
+
allow(Net::HTTP).to receive(:get) do
|
358
370
|
%({
|
359
371
|
"statusCode" : "OK",
|
360
372
|
"statusMessage" : "",
|
@@ -369,7 +381,7 @@ describe 'GeoIp' do
|
|
369
381
|
"timeZone" : "-08:00"
|
370
382
|
})
|
371
383
|
end
|
372
|
-
|
384
|
+
expect { GeoIp.geolocation(IPV6) }.not_to raise_error
|
373
385
|
end
|
374
386
|
end
|
375
387
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geo_ip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeroen Jacobs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rest-client
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.6'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.6'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: rake
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,28 +30,28 @@ dependencies:
|
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
33
|
+
version: '3.0'
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
40
|
+
version: '3.0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: webmock
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
45
|
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
47
|
+
version: 2.3.2
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
52
|
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
54
|
+
version: 2.3.2
|
69
55
|
description: A call to the ipinfodb.com will be done to retreive the geolocation based
|
70
56
|
on the IP address. No need to include a database file in the application.
|
71
57
|
email: gems@jeroenj.be
|
@@ -93,7 +79,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
79
|
requirements:
|
94
80
|
- - ">="
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
82
|
+
version: 1.9.3
|
97
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
84
|
requirements:
|
99
85
|
- - ">="
|
@@ -101,14 +87,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
87
|
version: '0'
|
102
88
|
requirements: []
|
103
89
|
rubyforge_project:
|
104
|
-
rubygems_version: 2.
|
90
|
+
rubygems_version: 2.7.3
|
105
91
|
signing_key:
|
106
92
|
specification_version: 4
|
107
93
|
summary: Retreive the geolocation of an IP address based on the ipinfodb.com webservice
|
108
94
|
test_files:
|
109
95
|
- spec/api.yml
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
- spec/spec.opts
|
110
98
|
- spec/api.yml.example
|
111
99
|
- spec/geo_ip_spec.rb
|
112
|
-
- spec/spec.opts
|
113
|
-
- spec/spec_helper.rb
|
114
|
-
has_rdoc:
|