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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/CLAUDE.md +390 -0
  4. data/Gemfile.lock +126 -0
  5. data/README.dev.md +1 -1
  6. data/README.md +17 -2
  7. data/Rakefile +2 -2
  8. data/lib/maxmind/geoip2/model/anonymous_plus.rb +46 -0
  9. data/lib/maxmind/geoip2/model/city.rb +1 -1
  10. data/lib/maxmind/geoip2/model/insights.rb +14 -0
  11. data/lib/maxmind/geoip2/reader.rb +26 -1
  12. data/lib/maxmind/geoip2/record/anonymizer.rb +105 -0
  13. data/lib/maxmind/geoip2/record/location.rb +3 -3
  14. data/lib/maxmind/geoip2/record/traits.rb +38 -1
  15. data/lib/maxmind/geoip2/version.rb +1 -1
  16. data/maxmind-geoip2.gemspec +8 -5
  17. data/test/data/LICENSE-APACHE +202 -0
  18. data/test/data/LICENSE-MIT +17 -0
  19. data/test/data/MaxMind-DB-spec.md +1 -2
  20. data/test/data/README.md +8 -1
  21. data/test/data/go.mod +1 -1
  22. data/test/data/pkg/writer/geoip2.go +7 -5
  23. data/test/data/pkg/writer/maxmind.go +2 -1
  24. data/test/data/pkg/writer/writer.go +4 -1
  25. data/test/data/source-data/GeoIP-Anonymous-Plus-Test.json +175 -0
  26. data/test/data/source-data/GeoIP2-Anonymous-IP-Test.json +6 -0
  27. data/test/data/source-data/GeoIP2-City-Test.json +73 -7
  28. data/test/data/source-data/GeoIP2-Country-Test.json +3 -28
  29. data/test/data/source-data/GeoIP2-Enterprise-Test.json +27 -8
  30. data/test/data/source-data/GeoIP2-IP-Risk-Test.json +31 -0
  31. data/test/data/source-data/GeoIP2-Precision-Enterprise-Test.json +585 -11
  32. data/test/data/source-data/GeoLite2-City-Test.json +0 -3
  33. data/test/data/source-data/GeoLite2-Country-Test.json +0 -3
  34. data/test/data/test-data/GeoIP-Anonymous-Plus-Test.mmdb +0 -0
  35. data/test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  36. data/test/data/test-data/GeoIP2-City-Test.mmdb +0 -0
  37. data/test/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  38. data/test/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
  39. data/test/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  40. data/test/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  41. data/test/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  42. data/test/data/test-data/GeoIP2-IP-Risk-Test.mmdb +0 -0
  43. data/test/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  44. data/test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  45. data/test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
  46. data/test/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
  47. data/test/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  48. data/test/data/test-data/GeoLite2-City-Test.mmdb +0 -0
  49. data/test/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
  50. data/test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
  51. data/test/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  52. data/test/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
  53. data/test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  54. data/test/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  55. data/test/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  56. data/test/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  57. data/test/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  58. data/test/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  59. data/test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  60. data/test/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  61. data/test/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  62. data/test/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  63. data/test/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  64. data/test/test_client.rb +31 -6
  65. data/test/test_model_country.rb +13 -14
  66. data/test/test_model_names.rb +3 -0
  67. data/test/test_reader.rb +60 -23
  68. metadata +58 -11
  69. data/test/data/LICENSE +0 -4
  70. data/test/data/perltidyrc +0 -18
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
- assert_equal(false, record.country.in_european_union?)
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
- assert_equal(false, record.registered_country.in_european_union?)
88
+ refute(record.registered_country.in_european_union?)
77
89
 
78
- assert_equal(true, record.traits.anycast?)
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
- assert_equal(true, record.traits.anycast?)
90
- assert_equal(true, record.traits.residential_proxy?)
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
- assert_equal(1.3, record.traits.static_ip_score)
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
@@ -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
- assert_equal(MaxMind::GeoIP2::Model::Country, model.class)
33
- assert_equal(MaxMind::GeoIP2::Record::Continent, model.continent.class)
34
- assert_equal(MaxMind::GeoIP2::Record::Country, model.country.class)
35
- assert_equal(
36
- MaxMind::GeoIP2::Record::Country,
37
- model.registered_country.class,
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
- assert_equal(
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
- assert_equal(
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
- assert_equal(false, model.country.in_european_union?)
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
- assert_equal(true, model.registered_country.in_european_union?)
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
@@ -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
- assert_equal(true, record.anonymous?)
17
- assert_equal(true, record.anonymous_vpn?)
18
- assert_equal(false, record.hosting_provider?)
19
- assert_equal(false, record.public_proxy?)
20
- assert_equal(false, record.residential_proxy?)
21
- assert_equal(false, record.tor_exit_node?)
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
- assert_equal(true, record.residential_proxy?)
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
- assert_equal(51.75, record.location.latitude)
70
- assert_equal(-1.25, record.location.longitude)
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
- assert_equal(true, record.traits.anycast?)
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
- assert_equal([], record.subdivisions)
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
- assert_equal(false, record.country.in_european_union?)
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
- assert_equal(true, record.registered_country.in_european_union?)
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
- assert_equal(true, record.traits.anycast?)
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
- assert_equal(false, record.country.in_european_union?)
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
- assert_equal(false, record.country.in_european_union?)
297
+ refute(record.country.in_european_union?)
270
298
 
271
299
  assert_equal(27, record.location.accuracy_radius)
272
300
 
273
- assert_equal(false, record.registered_country.in_european_union?)
301
+ refute(record.registered_country.in_european_union?)
274
302
 
275
303
  assert_equal('Cable/DSL', record.traits.connection_type)
276
- assert_equal(true, record.traits.legitimate_proxy?)
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
- assert_equal(true, record.traits.anycast?)
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
- assert_equal(false, record.traits.anonymous?)
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
- assert_equal(false, record.country.in_european_union?)
454
- assert_equal(false, record.registered_country.in_european_union?)
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.2.0
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: 2023-12-04 00:00:00.000000000 Z
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.2'
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.2'
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.5.0
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.4.18
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