maxmind-geoip2 1.2.0 → 1.4.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/CLAUDE.md +390 -0
- data/Gemfile.lock +126 -0
- data/README.dev.md +1 -1
- data/README.md +17 -2
- data/Rakefile +2 -2
- data/lib/maxmind/geoip2/model/anonymous_plus.rb +46 -0
- data/lib/maxmind/geoip2/model/city.rb +1 -1
- data/lib/maxmind/geoip2/model/insights.rb +14 -0
- data/lib/maxmind/geoip2/reader.rb +26 -1
- data/lib/maxmind/geoip2/record/anonymizer.rb +105 -0
- data/lib/maxmind/geoip2/record/location.rb +3 -3
- data/lib/maxmind/geoip2/record/traits.rb +38 -1
- data/lib/maxmind/geoip2/version.rb +1 -1
- data/maxmind-geoip2.gemspec +8 -5
- data/test/data/LICENSE-APACHE +202 -0
- data/test/data/LICENSE-MIT +17 -0
- data/test/data/MaxMind-DB-spec.md +1 -2
- data/test/data/README.md +8 -1
- data/test/data/go.mod +1 -1
- data/test/data/pkg/writer/geoip2.go +7 -5
- data/test/data/pkg/writer/maxmind.go +2 -1
- data/test/data/pkg/writer/writer.go +4 -1
- data/test/data/source-data/GeoIP-Anonymous-Plus-Test.json +175 -0
- data/test/data/source-data/GeoIP2-Anonymous-IP-Test.json +6 -0
- data/test/data/source-data/GeoIP2-City-Test.json +73 -7
- data/test/data/source-data/GeoIP2-Country-Test.json +3 -28
- data/test/data/source-data/GeoIP2-Enterprise-Test.json +27 -8
- data/test/data/source-data/GeoIP2-IP-Risk-Test.json +31 -0
- data/test/data/source-data/GeoIP2-Precision-Enterprise-Test.json +585 -11
- data/test/data/source-data/GeoLite2-City-Test.json +0 -3
- data/test/data/source-data/GeoLite2-Country-Test.json +0 -3
- data/test/data/test-data/GeoIP-Anonymous-Plus-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-City-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-IP-Risk-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
- data/test/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
- data/test/data/test-data/GeoLite2-City-Test.mmdb +0 -0
- data/test/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
- data/test/test_client.rb +31 -6
- data/test/test_model_country.rb +13 -14
- data/test/test_model_names.rb +3 -0
- data/test/test_reader.rb +60 -23
- metadata +58 -11
- data/test/data/LICENSE +0 -4
- data/test/data/perltidyrc +0 -18
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/test/test_client.rb
CHANGED
|
@@ -28,6 +28,17 @@ class ClientTest < Minitest::Test
|
|
|
28
28
|
}.freeze
|
|
29
29
|
|
|
30
30
|
INSIGHTS = {
|
|
31
|
+
'anonymizer' => {
|
|
32
|
+
'confidence' => 85,
|
|
33
|
+
'is_anonymous' => true,
|
|
34
|
+
'is_anonymous_vpn' => true,
|
|
35
|
+
'is_hosting_provider' => false,
|
|
36
|
+
'is_public_proxy' => false,
|
|
37
|
+
'is_residential_proxy' => true,
|
|
38
|
+
'is_tor_exit_node' => false,
|
|
39
|
+
'network_last_seen' => '2025-10-15',
|
|
40
|
+
'provider_name' => 'NordVPN',
|
|
41
|
+
},
|
|
31
42
|
'continent' => {
|
|
32
43
|
'code' => 'NA',
|
|
33
44
|
'geoname_id' => 42,
|
|
@@ -43,6 +54,7 @@ class ClientTest < Minitest::Test
|
|
|
43
54
|
},
|
|
44
55
|
'traits' => {
|
|
45
56
|
'ip_address' => '1.2.3.40',
|
|
57
|
+
'ip_risk_snapshot' => 45.5,
|
|
46
58
|
'is_anycast' => true,
|
|
47
59
|
'is_residential_proxy' => true,
|
|
48
60
|
'network' => '1.2.3.0/24',
|
|
@@ -66,16 +78,16 @@ class ClientTest < Minitest::Test
|
|
|
66
78
|
assert_equal('North America', record.continent.name)
|
|
67
79
|
|
|
68
80
|
assert_equal(1, record.country.geoname_id)
|
|
69
|
-
|
|
81
|
+
refute(record.country.in_european_union?)
|
|
70
82
|
assert_equal('US', record.country.iso_code)
|
|
71
83
|
assert_equal({ 'en' => 'United States of America' }, record.country.names)
|
|
72
84
|
assert_equal('United States of America', record.country.name)
|
|
73
85
|
|
|
74
86
|
assert_equal(11, record.maxmind.queries_remaining)
|
|
75
87
|
|
|
76
|
-
|
|
88
|
+
refute(record.registered_country.in_european_union?)
|
|
77
89
|
|
|
78
|
-
|
|
90
|
+
assert(record.traits.anycast?)
|
|
79
91
|
assert_equal('1.2.3.0/24', record.traits.network)
|
|
80
92
|
end
|
|
81
93
|
|
|
@@ -86,11 +98,24 @@ class ClientTest < Minitest::Test
|
|
|
86
98
|
|
|
87
99
|
assert_equal(42, record.continent.geoname_id)
|
|
88
100
|
|
|
89
|
-
|
|
90
|
-
assert_equal(
|
|
101
|
+
# Test anonymizer object
|
|
102
|
+
assert_equal(85, record.anonymizer.confidence)
|
|
103
|
+
assert(record.anonymizer.anonymous?)
|
|
104
|
+
assert(record.anonymizer.anonymous_vpn?)
|
|
105
|
+
refute(record.anonymizer.hosting_provider?)
|
|
106
|
+
refute(record.anonymizer.public_proxy?)
|
|
107
|
+
assert(record.anonymizer.residential_proxy?)
|
|
108
|
+
refute(record.anonymizer.tor_exit_node?)
|
|
109
|
+
assert_equal(Date.parse('2025-10-15'), record.anonymizer.network_last_seen)
|
|
110
|
+
assert_equal('NordVPN', record.anonymizer.provider_name)
|
|
111
|
+
|
|
112
|
+
# Test traits
|
|
113
|
+
assert(record.traits.anycast?)
|
|
114
|
+
assert(record.traits.residential_proxy?)
|
|
91
115
|
assert_equal('1.2.3.0/24', record.traits.network)
|
|
92
|
-
|
|
116
|
+
assert_in_delta(1.3, record.traits.static_ip_score)
|
|
93
117
|
assert_equal(2, record.traits.user_count)
|
|
118
|
+
assert_in_delta(45.5, record.traits.ip_risk_snapshot)
|
|
94
119
|
end
|
|
95
120
|
|
|
96
121
|
def test_city
|
data/test/test_model_country.rb
CHANGED
|
@@ -29,20 +29,18 @@ class CountryModelTest < Minitest::Test
|
|
|
29
29
|
|
|
30
30
|
def test_objects
|
|
31
31
|
model = MaxMind::GeoIP2::Model::Country.new(RAW, ['en'])
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
model.registered_country
|
|
32
|
+
|
|
33
|
+
assert_instance_of(MaxMind::GeoIP2::Model::Country, model)
|
|
34
|
+
assert_instance_of(MaxMind::GeoIP2::Record::Continent, model.continent)
|
|
35
|
+
assert_instance_of(MaxMind::GeoIP2::Record::Country, model.country)
|
|
36
|
+
assert_instance_of(
|
|
37
|
+
MaxMind::GeoIP2::Record::Country, model.registered_country,
|
|
38
38
|
)
|
|
39
|
-
|
|
40
|
-
MaxMind::GeoIP2::Record::RepresentedCountry,
|
|
41
|
-
model.represented_country.class,
|
|
39
|
+
assert_instance_of(
|
|
40
|
+
MaxMind::GeoIP2::Record::RepresentedCountry, model.represented_country,
|
|
42
41
|
)
|
|
43
|
-
|
|
44
|
-
MaxMind::GeoIP2::Record::Traits,
|
|
45
|
-
model.traits.class,
|
|
42
|
+
assert_instance_of(
|
|
43
|
+
MaxMind::GeoIP2::Record::Traits, model.traits,
|
|
46
44
|
)
|
|
47
45
|
end
|
|
48
46
|
|
|
@@ -55,14 +53,14 @@ class CountryModelTest < Minitest::Test
|
|
|
55
53
|
assert_equal('North America', model.continent.name)
|
|
56
54
|
|
|
57
55
|
assert_equal(1, model.country.geoname_id)
|
|
58
|
-
|
|
56
|
+
refute(model.country.in_european_union?)
|
|
59
57
|
assert_equal('US', model.country.iso_code)
|
|
60
58
|
assert_equal({ 'en' => 'United States of America' }, model.country.names)
|
|
61
59
|
assert_equal('United States of America', model.country.name)
|
|
62
60
|
assert_nil(model.country.confidence)
|
|
63
61
|
|
|
64
62
|
assert_equal(2, model.registered_country.geoname_id)
|
|
65
|
-
|
|
63
|
+
assert(model.registered_country.in_european_union?)
|
|
66
64
|
assert_equal('DE', model.registered_country.iso_code)
|
|
67
65
|
assert_equal({ 'en' => 'Germany' }, model.registered_country.names)
|
|
68
66
|
assert_equal('Germany', model.registered_country.name)
|
|
@@ -91,6 +89,7 @@ class CountryModelTest < Minitest::Test
|
|
|
91
89
|
},
|
|
92
90
|
['en'],
|
|
93
91
|
)
|
|
92
|
+
|
|
94
93
|
assert_equal(42, model.continent.geoname_id)
|
|
95
94
|
end
|
|
96
95
|
end
|
data/test/test_model_names.rb
CHANGED
|
@@ -29,18 +29,21 @@ class ModelNameTest < Minitest::Test
|
|
|
29
29
|
|
|
30
30
|
def test_fallback
|
|
31
31
|
model = MaxMind::GeoIP2::Model::Country.new(RAW, %w[ru zh-CN en])
|
|
32
|
+
|
|
32
33
|
assert_equal('北美洲', model.continent.name)
|
|
33
34
|
assert_equal('объединяет государства', model.country.name)
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
def test_two_fallbacks
|
|
37
38
|
model = MaxMind::GeoIP2::Model::Country.new(RAW, %w[ru jp])
|
|
39
|
+
|
|
38
40
|
assert_nil(model.continent.name)
|
|
39
41
|
assert_equal('объединяет государства', model.country.name)
|
|
40
42
|
end
|
|
41
43
|
|
|
42
44
|
def test_no_fallbacks
|
|
43
45
|
model = MaxMind::GeoIP2::Model::Country.new(RAW, %w[jp])
|
|
46
|
+
|
|
44
47
|
assert_nil(model.continent.name)
|
|
45
48
|
assert_nil(model.country.name)
|
|
46
49
|
end
|
data/test/test_reader.rb
CHANGED
|
@@ -13,12 +13,12 @@ class ReaderTest < Minitest::Test
|
|
|
13
13
|
ip = '1.2.0.1'
|
|
14
14
|
record = reader.anonymous_ip(ip)
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
assert(record.anonymous?)
|
|
17
|
+
assert(record.anonymous_vpn?)
|
|
18
|
+
refute(record.hosting_provider?)
|
|
19
|
+
refute(record.public_proxy?)
|
|
20
|
+
refute(record.residential_proxy?)
|
|
21
|
+
refute(record.tor_exit_node?)
|
|
22
22
|
assert_equal(ip, record.ip_address)
|
|
23
23
|
assert_equal('1.2.0.0/16', record.network)
|
|
24
24
|
|
|
@@ -32,7 +32,30 @@ class ReaderTest < Minitest::Test
|
|
|
32
32
|
ip = '81.2.69.1'
|
|
33
33
|
record = reader.anonymous_ip(ip)
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
assert(record.residential_proxy?)
|
|
36
|
+
|
|
37
|
+
reader.close
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_anonymous_plus
|
|
41
|
+
reader = MaxMind::GeoIP2::Reader.new(
|
|
42
|
+
'test/data/test-data/GeoIP-Anonymous-Plus-Test.mmdb',
|
|
43
|
+
)
|
|
44
|
+
ip = '1.2.0.1'
|
|
45
|
+
record = reader.anonymous_plus(ip)
|
|
46
|
+
|
|
47
|
+
assert_equal(30, record.anonymizer_confidence)
|
|
48
|
+
assert(record.anonymous?)
|
|
49
|
+
assert(record.anonymous_vpn?)
|
|
50
|
+
refute(record.hosting_provider?)
|
|
51
|
+
assert_equal(Date.new(2025, 4, 14), record.network_last_seen)
|
|
52
|
+
assert_equal('foo', record.provider_name)
|
|
53
|
+
refute(record.public_proxy?)
|
|
54
|
+
refute(record.residential_proxy?)
|
|
55
|
+
refute(record.tor_exit_node?)
|
|
56
|
+
|
|
57
|
+
assert_equal(ip, record.ip_address)
|
|
58
|
+
assert_equal('1.2.0.1/32', record.network)
|
|
36
59
|
|
|
37
60
|
reader.close
|
|
38
61
|
end
|
|
@@ -66,8 +89,8 @@ class ReaderTest < Minitest::Test
|
|
|
66
89
|
assert_nil(record.city.confidence)
|
|
67
90
|
|
|
68
91
|
assert_equal(100, record.location.accuracy_radius)
|
|
69
|
-
|
|
70
|
-
|
|
92
|
+
assert_in_delta(51.75, record.location.latitude)
|
|
93
|
+
assert_in_delta(-1.25, record.location.longitude)
|
|
71
94
|
assert_equal('Europe/London', record.location.time_zone)
|
|
72
95
|
|
|
73
96
|
assert_equal(2, record.subdivisions.size)
|
|
@@ -94,14 +117,16 @@ class ReaderTest < Minitest::Test
|
|
|
94
117
|
'zh-CN' => '华盛顿州',
|
|
95
118
|
},
|
|
96
119
|
record.subdivisions[0].names,
|
|
97
|
-
assert_equal('WA', record.most_specific_subdivision.iso_code)
|
|
98
120
|
)
|
|
99
121
|
|
|
122
|
+
assert_equal('WA', record.most_specific_subdivision.iso_code)
|
|
123
|
+
|
|
100
124
|
# This IP has is_anycast.
|
|
101
125
|
|
|
102
126
|
ip_address = '214.1.1.0'
|
|
103
127
|
record = reader.city(ip_address)
|
|
104
|
-
|
|
128
|
+
|
|
129
|
+
assert(record.traits.anycast?)
|
|
105
130
|
|
|
106
131
|
reader.close
|
|
107
132
|
end
|
|
@@ -112,7 +137,7 @@ class ReaderTest < Minitest::Test
|
|
|
112
137
|
)
|
|
113
138
|
record = reader.city('2001:218::')
|
|
114
139
|
|
|
115
|
-
|
|
140
|
+
assert_empty(record.subdivisions)
|
|
116
141
|
assert_nil(record.most_specific_subdivision)
|
|
117
142
|
|
|
118
143
|
reader.close
|
|
@@ -156,7 +181,7 @@ class ReaderTest < Minitest::Test
|
|
|
156
181
|
assert_equal('Europe', record.continent.name)
|
|
157
182
|
|
|
158
183
|
assert_equal(2_635_167, record.country.geoname_id)
|
|
159
|
-
|
|
184
|
+
refute(record.country.in_european_union?)
|
|
160
185
|
assert_equal('GB', record.country.iso_code)
|
|
161
186
|
assert_equal(
|
|
162
187
|
{
|
|
@@ -174,7 +199,7 @@ class ReaderTest < Minitest::Test
|
|
|
174
199
|
assert_equal('United Kingdom', record.country.name)
|
|
175
200
|
|
|
176
201
|
assert_equal(3_017_382, record.registered_country.geoname_id)
|
|
177
|
-
|
|
202
|
+
assert(record.registered_country.in_european_union?)
|
|
178
203
|
assert_equal('FR', record.registered_country.iso_code)
|
|
179
204
|
assert_equal(
|
|
180
205
|
{
|
|
@@ -212,6 +237,7 @@ class ReaderTest < Minitest::Test
|
|
|
212
237
|
assert_equal('military', record.represented_country.type)
|
|
213
238
|
|
|
214
239
|
record = reader.country('81.2.69.163')
|
|
240
|
+
|
|
215
241
|
assert_equal('81.2.69.163', record.traits.ip_address)
|
|
216
242
|
assert_equal('81.2.69.160/27', record.traits.network)
|
|
217
243
|
|
|
@@ -219,7 +245,8 @@ class ReaderTest < Minitest::Test
|
|
|
219
245
|
|
|
220
246
|
ip_address = '214.1.1.0'
|
|
221
247
|
record = reader.country(ip_address)
|
|
222
|
-
|
|
248
|
+
|
|
249
|
+
assert(record.traits.anycast?)
|
|
223
250
|
|
|
224
251
|
assert_raises(NoMethodError) { record.foo }
|
|
225
252
|
reader.close
|
|
@@ -230,7 +257,8 @@ class ReaderTest < Minitest::Test
|
|
|
230
257
|
'test/data/test-data/GeoIP2-Country-Test.mmdb',
|
|
231
258
|
)
|
|
232
259
|
record = reader.country('74.209.24.0')
|
|
233
|
-
|
|
260
|
+
|
|
261
|
+
refute(record.country.in_european_union?)
|
|
234
262
|
|
|
235
263
|
reader.close
|
|
236
264
|
end
|
|
@@ -266,14 +294,14 @@ class ReaderTest < Minitest::Test
|
|
|
266
294
|
assert_equal(11, record.city.confidence)
|
|
267
295
|
assert_equal(99, record.country.confidence)
|
|
268
296
|
assert_equal(6_252_001, record.country.geoname_id)
|
|
269
|
-
|
|
297
|
+
refute(record.country.in_european_union?)
|
|
270
298
|
|
|
271
299
|
assert_equal(27, record.location.accuracy_radius)
|
|
272
300
|
|
|
273
|
-
|
|
301
|
+
refute(record.registered_country.in_european_union?)
|
|
274
302
|
|
|
275
303
|
assert_equal('Cable/DSL', record.traits.connection_type)
|
|
276
|
-
|
|
304
|
+
assert(record.traits.legitimate_proxy?)
|
|
277
305
|
|
|
278
306
|
assert_equal(ip_address, record.traits.ip_address)
|
|
279
307
|
assert_equal('74.209.16.0/20', record.traits.network)
|
|
@@ -290,7 +318,8 @@ class ReaderTest < Minitest::Test
|
|
|
290
318
|
|
|
291
319
|
ip_address = '214.1.1.0'
|
|
292
320
|
record = reader.enterprise(ip_address)
|
|
293
|
-
|
|
321
|
+
|
|
322
|
+
assert(record.traits.anycast?)
|
|
294
323
|
|
|
295
324
|
reader.close
|
|
296
325
|
end
|
|
@@ -329,7 +358,7 @@ class ReaderTest < Minitest::Test
|
|
|
329
358
|
assert_equal('2.125.160.216', record.traits.ip_address)
|
|
330
359
|
assert_equal('2.125.160.216/29', record.traits.network)
|
|
331
360
|
assert_nil(record.traits.autonomous_system_number)
|
|
332
|
-
|
|
361
|
+
refute(record.traits.anonymous?)
|
|
333
362
|
|
|
334
363
|
reader.close
|
|
335
364
|
end
|
|
@@ -415,6 +444,7 @@ class ReaderTest < Minitest::Test
|
|
|
415
444
|
"test/data/test-data/GeoIP2-#{t['file']}-Test.mmdb",
|
|
416
445
|
)
|
|
417
446
|
record = reader.send(t['method'], '81.2.69.160')
|
|
447
|
+
|
|
418
448
|
assert_equal('United Kingdom', record.country.name)
|
|
419
449
|
reader.close
|
|
420
450
|
end
|
|
@@ -427,6 +457,7 @@ class ReaderTest < Minitest::Test
|
|
|
427
457
|
%w[xx ru pt-BR es en],
|
|
428
458
|
)
|
|
429
459
|
record = reader.send(t['method'], '81.2.69.160')
|
|
460
|
+
|
|
430
461
|
assert_equal('Великобритания', record.country.name)
|
|
431
462
|
reader.close
|
|
432
463
|
end
|
|
@@ -438,6 +469,7 @@ class ReaderTest < Minitest::Test
|
|
|
438
469
|
"test/data/test-data/GeoIP2-#{t['file']}-Test.mmdb",
|
|
439
470
|
)
|
|
440
471
|
record = reader.send(t['method'], '81.2.69.163')
|
|
472
|
+
|
|
441
473
|
assert_equal('81.2.69.163', record.traits.ip_address)
|
|
442
474
|
assert_equal('81.2.69.160/27', record.traits.network)
|
|
443
475
|
reader.close
|
|
@@ -450,8 +482,9 @@ class ReaderTest < Minitest::Test
|
|
|
450
482
|
"test/data/test-data/GeoIP2-#{t['file']}-Test.mmdb",
|
|
451
483
|
)
|
|
452
484
|
record = reader.send(t['method'], '81.2.69.160')
|
|
453
|
-
|
|
454
|
-
|
|
485
|
+
|
|
486
|
+
refute(record.country.in_european_union?)
|
|
487
|
+
refute(record.registered_country.in_european_union?)
|
|
455
488
|
reader.close
|
|
456
489
|
end
|
|
457
490
|
end
|
|
@@ -501,6 +534,7 @@ class ReaderTest < Minitest::Test
|
|
|
501
534
|
reader = MaxMind::GeoIP2::Reader.new(
|
|
502
535
|
'test/data/test-data/GeoIP2-City-Test.mmdb',
|
|
503
536
|
)
|
|
537
|
+
|
|
504
538
|
assert_equal('GeoIP2-City', reader.metadata.database_type)
|
|
505
539
|
reader.close
|
|
506
540
|
end
|
|
@@ -510,6 +544,7 @@ class ReaderTest < Minitest::Test
|
|
|
510
544
|
database: 'test/data/test-data/GeoIP2-Country-Test.mmdb',
|
|
511
545
|
)
|
|
512
546
|
record = reader.country('81.2.69.160')
|
|
547
|
+
|
|
513
548
|
assert_equal('United Kingdom', record.country.name)
|
|
514
549
|
reader.close
|
|
515
550
|
end
|
|
@@ -521,6 +556,7 @@ class ReaderTest < Minitest::Test
|
|
|
521
556
|
mode: MaxMind::DB::MODE_MEMORY,
|
|
522
557
|
)
|
|
523
558
|
record = reader.country('81.2.69.160')
|
|
559
|
+
|
|
524
560
|
assert_equal('Великобритания', record.country.name)
|
|
525
561
|
reader.close
|
|
526
562
|
end
|
|
@@ -546,6 +582,7 @@ class ReaderTest < Minitest::Test
|
|
|
546
582
|
mode: MaxMind::DB::MODE_MEMORY,
|
|
547
583
|
)
|
|
548
584
|
record = reader.country('81.2.69.160')
|
|
585
|
+
|
|
549
586
|
assert_equal('Великобритания', record.country.name)
|
|
550
587
|
reader.close
|
|
551
588
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: maxmind-geoip2
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- William Storey
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: connection_pool
|
|
@@ -50,14 +49,14 @@ dependencies:
|
|
|
50
49
|
requirements:
|
|
51
50
|
- - "~>"
|
|
52
51
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '1.
|
|
52
|
+
version: '1.4'
|
|
54
53
|
type: :runtime
|
|
55
54
|
prerelease: false
|
|
56
55
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
56
|
requirements:
|
|
58
57
|
- - "~>"
|
|
59
58
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '1.
|
|
59
|
+
version: '1.4'
|
|
61
60
|
- !ruby/object:Gem::Dependency
|
|
62
61
|
name: minitest
|
|
63
62
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -100,6 +99,20 @@ dependencies:
|
|
|
100
99
|
- - ">="
|
|
101
100
|
- !ruby/object:Gem::Version
|
|
102
101
|
version: '0'
|
|
102
|
+
- !ruby/object:Gem::Dependency
|
|
103
|
+
name: rubocop-minitest
|
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - ">="
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: '0'
|
|
109
|
+
type: :development
|
|
110
|
+
prerelease: false
|
|
111
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
112
|
+
requirements:
|
|
113
|
+
- - ">="
|
|
114
|
+
- !ruby/object:Gem::Version
|
|
115
|
+
version: '0'
|
|
103
116
|
- !ruby/object:Gem::Dependency
|
|
104
117
|
name: rubocop-performance
|
|
105
118
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -114,6 +127,34 @@ dependencies:
|
|
|
114
127
|
- - ">="
|
|
115
128
|
- !ruby/object:Gem::Version
|
|
116
129
|
version: '0'
|
|
130
|
+
- !ruby/object:Gem::Dependency
|
|
131
|
+
name: rubocop-rake
|
|
132
|
+
requirement: !ruby/object:Gem::Requirement
|
|
133
|
+
requirements:
|
|
134
|
+
- - ">="
|
|
135
|
+
- !ruby/object:Gem::Version
|
|
136
|
+
version: '0'
|
|
137
|
+
type: :development
|
|
138
|
+
prerelease: false
|
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
140
|
+
requirements:
|
|
141
|
+
- - ">="
|
|
142
|
+
- !ruby/object:Gem::Version
|
|
143
|
+
version: '0'
|
|
144
|
+
- !ruby/object:Gem::Dependency
|
|
145
|
+
name: rubocop-thread_safety
|
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
|
147
|
+
requirements:
|
|
148
|
+
- - ">="
|
|
149
|
+
- !ruby/object:Gem::Version
|
|
150
|
+
version: '0'
|
|
151
|
+
type: :development
|
|
152
|
+
prerelease: false
|
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
154
|
+
requirements:
|
|
155
|
+
- - ">="
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: '0'
|
|
117
158
|
- !ruby/object:Gem::Dependency
|
|
118
159
|
name: webmock
|
|
119
160
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -136,7 +177,9 @@ extensions: []
|
|
|
136
177
|
extra_rdoc_files: []
|
|
137
178
|
files:
|
|
138
179
|
- CHANGELOG.md
|
|
180
|
+
- CLAUDE.md
|
|
139
181
|
- Gemfile
|
|
182
|
+
- Gemfile.lock
|
|
140
183
|
- LICENSE-APACHE
|
|
141
184
|
- LICENSE-MIT
|
|
142
185
|
- README.dev.md
|
|
@@ -147,6 +190,7 @@ files:
|
|
|
147
190
|
- lib/maxmind/geoip2/errors.rb
|
|
148
191
|
- lib/maxmind/geoip2/model/abstract.rb
|
|
149
192
|
- lib/maxmind/geoip2/model/anonymous_ip.rb
|
|
193
|
+
- lib/maxmind/geoip2/model/anonymous_plus.rb
|
|
150
194
|
- lib/maxmind/geoip2/model/asn.rb
|
|
151
195
|
- lib/maxmind/geoip2/model/city.rb
|
|
152
196
|
- lib/maxmind/geoip2/model/connection_type.rb
|
|
@@ -157,6 +201,7 @@ files:
|
|
|
157
201
|
- lib/maxmind/geoip2/model/isp.rb
|
|
158
202
|
- lib/maxmind/geoip2/reader.rb
|
|
159
203
|
- lib/maxmind/geoip2/record/abstract.rb
|
|
204
|
+
- lib/maxmind/geoip2/record/anonymizer.rb
|
|
160
205
|
- lib/maxmind/geoip2/record/city.rb
|
|
161
206
|
- lib/maxmind/geoip2/record/continent.rb
|
|
162
207
|
- lib/maxmind/geoip2/record/country.rb
|
|
@@ -169,7 +214,8 @@ files:
|
|
|
169
214
|
- lib/maxmind/geoip2/record/traits.rb
|
|
170
215
|
- lib/maxmind/geoip2/version.rb
|
|
171
216
|
- maxmind-geoip2.gemspec
|
|
172
|
-
- test/data/LICENSE
|
|
217
|
+
- test/data/LICENSE-APACHE
|
|
218
|
+
- test/data/LICENSE-MIT
|
|
173
219
|
- test/data/MaxMind-DB-spec.md
|
|
174
220
|
- test/data/README.md
|
|
175
221
|
- test/data/bad-data/README.md
|
|
@@ -185,13 +231,13 @@ files:
|
|
|
185
231
|
- test/data/cmd/write-test-data/main.go
|
|
186
232
|
- test/data/go.mod
|
|
187
233
|
- test/data/go.sum
|
|
188
|
-
- test/data/perltidyrc
|
|
189
234
|
- test/data/pkg/writer/decoder.go
|
|
190
235
|
- test/data/pkg/writer/geoip2.go
|
|
191
236
|
- test/data/pkg/writer/ip.go
|
|
192
237
|
- test/data/pkg/writer/maxmind.go
|
|
193
238
|
- test/data/pkg/writer/nestedstructures.go
|
|
194
239
|
- test/data/pkg/writer/writer.go
|
|
240
|
+
- test/data/source-data/GeoIP-Anonymous-Plus-Test.json
|
|
195
241
|
- test/data/source-data/GeoIP2-Anonymous-IP-Test.json
|
|
196
242
|
- test/data/source-data/GeoIP2-City-Test.json
|
|
197
243
|
- test/data/source-data/GeoIP2-Connection-Type-Test.json
|
|
@@ -199,6 +245,7 @@ files:
|
|
|
199
245
|
- test/data/source-data/GeoIP2-DensityIncome-Test.json
|
|
200
246
|
- test/data/source-data/GeoIP2-Domain-Test.json
|
|
201
247
|
- test/data/source-data/GeoIP2-Enterprise-Test.json
|
|
248
|
+
- test/data/source-data/GeoIP2-IP-Risk-Test.json
|
|
202
249
|
- test/data/source-data/GeoIP2-ISP-Test.json
|
|
203
250
|
- test/data/source-data/GeoIP2-Precision-Enterprise-Sandbox-Test.json
|
|
204
251
|
- test/data/source-data/GeoIP2-Precision-Enterprise-Test.json
|
|
@@ -207,6 +254,7 @@ files:
|
|
|
207
254
|
- test/data/source-data/GeoLite2-ASN-Test.json
|
|
208
255
|
- test/data/source-data/GeoLite2-City-Test.json
|
|
209
256
|
- test/data/source-data/GeoLite2-Country-Test.json
|
|
257
|
+
- test/data/test-data/GeoIP-Anonymous-Plus-Test.mmdb
|
|
210
258
|
- test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb
|
|
211
259
|
- test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb
|
|
212
260
|
- test/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb
|
|
@@ -216,6 +264,7 @@ files:
|
|
|
216
264
|
- test/data/test-data/GeoIP2-DensityIncome-Test.mmdb
|
|
217
265
|
- test/data/test-data/GeoIP2-Domain-Test.mmdb
|
|
218
266
|
- test/data/test-data/GeoIP2-Enterprise-Test.mmdb
|
|
267
|
+
- test/data/test-data/GeoIP2-IP-Risk-Test.mmdb
|
|
219
268
|
- test/data/test-data/GeoIP2-ISP-Test.mmdb
|
|
220
269
|
- test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb
|
|
221
270
|
- test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb
|
|
@@ -258,7 +307,6 @@ metadata:
|
|
|
258
307
|
homepage_uri: https://github.com/maxmind/GeoIP2-ruby
|
|
259
308
|
rubygems_mfa_required: 'true'
|
|
260
309
|
source_code_uri: https://github.com/maxmind/GeoIP2-ruby
|
|
261
|
-
post_install_message:
|
|
262
310
|
rdoc_options: []
|
|
263
311
|
require_paths:
|
|
264
312
|
- lib
|
|
@@ -266,15 +314,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
266
314
|
requirements:
|
|
267
315
|
- - ">="
|
|
268
316
|
- !ruby/object:Gem::Version
|
|
269
|
-
version: 2
|
|
317
|
+
version: '3.2'
|
|
270
318
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
319
|
requirements:
|
|
272
320
|
- - ">="
|
|
273
321
|
- !ruby/object:Gem::Version
|
|
274
322
|
version: '0'
|
|
275
323
|
requirements: []
|
|
276
|
-
rubygems_version: 3.
|
|
277
|
-
signing_key:
|
|
324
|
+
rubygems_version: 3.6.9
|
|
278
325
|
specification_version: 4
|
|
279
326
|
summary: A gem for interacting with the GeoIP2 webservices and databases.
|
|
280
327
|
test_files: []
|
data/test/data/LICENSE
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
This work is licensed under the Creative Commons Attribution-ShareAlike 3.0
|
|
2
|
-
Unported License. To view a copy of this license, visit
|
|
3
|
-
http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative
|
|
4
|
-
Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
|
data/test/data/perltidyrc
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
--blank-lines-before-packages=0
|
|
2
|
-
--iterations=2
|
|
3
|
-
--no-outdent-long-comments
|
|
4
|
-
--weld-nested-containers
|
|
5
|
-
-b
|
|
6
|
-
-bar
|
|
7
|
-
-boc
|
|
8
|
-
-ci=4
|
|
9
|
-
-i=4
|
|
10
|
-
-l=78
|
|
11
|
-
-nolq
|
|
12
|
-
-se
|
|
13
|
-
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
|
|
14
|
-
--character-encoding=utf8
|
|
15
|
-
--valign-exclusion-list="q"
|
|
16
|
-
--want-trailing-commas=m
|
|
17
|
-
--add-trailing-commas
|
|
18
|
-
--delete-repeated-commas
|