maxmind-geoip2 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/README.md +13 -10
  4. data/lib/maxmind/geoip2/client.rb +18 -9
  5. data/lib/maxmind/geoip2/errors.rb +17 -8
  6. data/lib/maxmind/geoip2/model/city.rb +4 -5
  7. data/lib/maxmind/geoip2/model/connection_type.rb +3 -2
  8. data/lib/maxmind/geoip2/model/enterprise.rb +2 -3
  9. data/lib/maxmind/geoip2/model/insights.rb +3 -5
  10. data/lib/maxmind/geoip2/model/isp.rb +16 -0
  11. data/lib/maxmind/geoip2/reader.rb +1 -2
  12. data/lib/maxmind/geoip2/record/traits.rb +58 -26
  13. data/lib/maxmind/geoip2/version.rb +8 -0
  14. data/maxmind-geoip2.gemspec +8 -2
  15. data/test/data/MaxMind-DB-spec.md +15 -11
  16. data/test/data/cmd/write-test-data/main.go +68 -0
  17. data/test/data/go.mod +13 -0
  18. data/test/data/go.sum +16 -0
  19. data/test/data/perltidyrc +6 -0
  20. data/test/data/pkg/writer/decoder.go +178 -0
  21. data/test/data/pkg/writer/geoip2.go +182 -0
  22. data/test/data/pkg/writer/ip.go +39 -0
  23. data/test/data/pkg/writer/maxmind.go +245 -0
  24. data/test/data/pkg/writer/nestedstructures.go +73 -0
  25. data/test/data/pkg/writer/writer.go +58 -0
  26. data/test/data/source-data/GeoIP2-City-Test.json +402 -48
  27. data/test/data/source-data/GeoIP2-Connection-Type-Test.json +35 -10
  28. data/test/data/source-data/GeoIP2-Country-Test.json +145 -58
  29. data/test/data/source-data/GeoIP2-Domain-Test.json +5 -0
  30. data/test/data/source-data/GeoIP2-Enterprise-Test.json +408 -4
  31. data/test/data/source-data/GeoIP2-ISP-Test.json +10 -0
  32. data/test/data/source-data/GeoIP2-Precision-Enterprise-Sandbox-Test.json +296 -0
  33. data/test/data/source-data/GeoIP2-Precision-Enterprise-Test.json +473 -6
  34. data/test/data/source-data/GeoIP2-Static-IP-Score-Test.json +15 -0
  35. data/test/data/source-data/GeoIP2-User-Count-Test.json +18 -0
  36. data/test/data/source-data/GeoLite2-ASN-Test.json +4091 -8
  37. data/test/data/source-data/GeoLite2-City-Test.json +12972 -0
  38. data/test/data/source-data/GeoLite2-Country-Test.json +11372 -0
  39. data/test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  40. data/test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb +0 -0
  41. data/test/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb +0 -0
  42. data/test/data/test-data/GeoIP2-City-Test.mmdb +0 -0
  43. data/test/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  44. data/test/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
  45. data/test/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  46. data/test/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  47. data/test/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  48. data/test/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  49. data/test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  50. data/test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
  51. data/test/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
  52. data/test/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  53. data/test/data/test-data/GeoLite2-City-Test.mmdb +0 -0
  54. data/test/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
  55. data/test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
  56. data/test/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  57. data/test/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb +0 -0
  58. data/test/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb +0 -0
  59. data/test/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
  60. data/test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  61. data/test/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  62. data/test/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  63. data/test/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  64. data/test/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  65. data/test/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  66. data/test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  67. data/test/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  68. data/test/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  69. data/test/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  70. data/test/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  71. data/test/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb +0 -0
  72. data/test/data/test-data/README.md +30 -14
  73. data/test/test_client.rb +18 -2
  74. data/test/test_reader.rb +37 -3
  75. metadata +21 -8
  76. data/test/data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  77. data/test/data/source-data/README +0 -15
  78. data/test/data/test-data/write-test-data.pl +0 -691
@@ -1,26 +1,42 @@
1
- The write-test-dbs script will create a small set of test databases with a
2
- variety of data and record sizes (24, 28, & 32 bit).
1
+ ## How to generate test data
2
+ Use the [write-test-data](https://github.com/maxmind/MaxMind-DB/blob/main/cmd/write-test-data)
3
+ go tool to create a small set of test databases with a variety of data and
4
+ record sizes.
3
5
 
4
6
  These test databases are useful for testing code that reads MaxMind DB files.
5
7
 
6
- There is also a `maps-with-pointers.raw` file. This contains the raw output of
7
- the MaxMind::DB::Writer::Serializer module, when given a series of maps which
8
- share some keys and values. It is used to test that decoder code can handle
9
- pointers to map keys and values, as well as to the whole map.
10
-
11
8
  There are several ways to figure out what IP addresses are actually in the
12
9
  test databases. You can take a look at the
13
- [source-data directory](https://github.com/maxmind/MaxMind-DB/tree/master/source-data)
10
+ [source-data directory](https://github.com/maxmind/MaxMind-DB/tree/main/source-data)
14
11
  in this repository. This directory contains JSON files which are used to
15
12
  generate many (but not all) of the database files.
16
13
 
17
14
  You can also use the
18
- [mmdb-dump-database script](https://github.com/maxmind/MaxMind-DB-Reader-perl/blob/master/eg/mmdb-dump-database)
15
+ [mmdb-dump-database script](https://github.com/maxmind/MaxMind-DB-Reader-perl/blob/main/eg/mmdb-dump-database)
19
16
  in the
20
17
  [MaxMind-DB-Reader-perl repository](https://github.com/maxmind/MaxMind-DB-Reader-perl).
21
18
 
22
- Some databases are intentionally broken and cannot be dumped. You can look at
23
- the
24
- [script which generates these databases](https://github.com/maxmind/MaxMind-DB/blob/master/test-data/write-test-data.pl)
25
- to see what IP addresses they include, which will be necessary for those
26
- databases which cannot be dumped because they contain intentional errors.
19
+ ## Static test data
20
+ Some of the test files are remnants of the
21
+ [old perl test data writer](https://github.com/maxmind/MaxMind-DB/blob/f0a85c671c5b6e9c5e514bd66162724ee1dedea3/test-data/write-test-data.pl)
22
+ and cannot be generated with the go tool. These databases are intentionally broken,
23
+ and exploited functionality simply not available in the go mmdbwriter:
24
+
25
+ - MaxMind-DB-test-broken-pointers-24.mmdb
26
+ - MaxMind-DB-test-broken-search-tree-24.mmdb
27
+ - MaxMind-DB-test-pointer-decoder.mmdb
28
+ - GeoIP2-City-Test-Broken-Double-Format.mmdb
29
+ - GeoIP2-City-Test-Invalid-Node-Count.mmdb
30
+ - maps-with-pointers.raw
31
+
32
+ ## Usage
33
+ ```
34
+ Usage of ./write-test-data:
35
+ -source string
36
+ Source data directory
37
+ -target string
38
+ Destination directory for the generated mmdb files
39
+ ```
40
+
41
+ Example:
42
+ `./write-test-data --source ../../source-data --target ../../test-data`
data/test/test_client.rb CHANGED
@@ -22,6 +22,7 @@ class ClientTest < Minitest::Test
22
22
  },
23
23
  'traits' => {
24
24
  'ip_address' => '1.2.3.4',
25
+ 'is_anycast' => true,
25
26
  'network' => '1.2.3.0/24',
26
27
  },
27
28
  }.freeze
@@ -42,6 +43,7 @@ class ClientTest < Minitest::Test
42
43
  },
43
44
  'traits' => {
44
45
  'ip_address' => '1.2.3.40',
46
+ 'is_anycast' => true,
45
47
  'is_residential_proxy' => true,
46
48
  'network' => '1.2.3.0/24',
47
49
  'static_ip_score' => 1.3,
@@ -73,6 +75,7 @@ class ClientTest < Minitest::Test
73
75
 
74
76
  assert_equal(false, record.registered_country.in_european_union?)
75
77
 
78
+ assert_equal(true, record.traits.anycast?)
76
79
  assert_equal('1.2.3.0/24', record.traits.network)
77
80
  end
78
81
 
@@ -83,6 +86,7 @@ class ClientTest < Minitest::Test
83
86
 
84
87
  assert_equal(42, record.continent.geoname_id)
85
88
 
89
+ assert_equal(true, record.traits.anycast?)
86
90
  assert_equal(true, record.traits.residential_proxy?)
87
91
  assert_equal('1.2.3.0/24', record.traits.network)
88
92
  assert_equal(1.3, record.traits.static_ip_score)
@@ -126,7 +130,7 @@ class ClientTest < Minitest::Test
126
130
  )
127
131
  end
128
132
 
129
- def test_invalid_ip_error
133
+ def test_invalid_ip_error_from_web_service
130
134
  error = assert_raises(
131
135
  MaxMind::GeoIP2::AddressInvalidError,
132
136
  ) { request(:country, '1.2.3.6') }
@@ -137,6 +141,17 @@ class ClientTest < Minitest::Test
137
141
  )
138
142
  end
139
143
 
144
+ def test_invalid_ip_error_from_client
145
+ error = assert_raises(
146
+ MaxMind::GeoIP2::AddressInvalidError,
147
+ ) { request(:country, '1.2.3') }
148
+
149
+ assert_equal(
150
+ 'The value "1.2.3" is not a valid IP address',
151
+ error.message,
152
+ )
153
+ end
154
+
140
155
  def test_no_error_body_ip_error
141
156
  assert_raises(
142
157
  JSON::ParserError,
@@ -290,7 +305,7 @@ class ClientTest < Minitest::Test
290
305
  license_key: 'abcdef123456',
291
306
  )
292
307
 
293
- client.send(method, '1.2.3.4')
308
+ client.send(method, ip_address)
294
309
  end
295
310
 
296
311
  def get_response(ip_address)
@@ -300,6 +315,7 @@ class ClientTest < Minitest::Test
300
315
  headers: { 'Content-Type': CONTENT_TYPES[:country] },
301
316
  status: 200,
302
317
  },
318
+ '1.2.3' => {},
303
319
  '1.2.3.4' => {
304
320
  body: JSON.generate(COUNTRY),
305
321
  headers: { 'Content-Type': CONTENT_TYPES[:country] },
data/test/test_reader.rb CHANGED
@@ -97,6 +97,12 @@ class ReaderTest < Minitest::Test
97
97
  assert_equal('WA', record.most_specific_subdivision.iso_code)
98
98
  )
99
99
 
100
+ # This IP has is_anycast.
101
+
102
+ ip_address = '214.1.1.0'
103
+ record = reader.city(ip_address)
104
+ assert_equal(true, record.traits.anycast?)
105
+
100
106
  reader.close
101
107
  end
102
108
 
@@ -119,7 +125,7 @@ class ReaderTest < Minitest::Test
119
125
  ip = '1.0.1.1'
120
126
  record = reader.connection_type(ip)
121
127
 
122
- assert_equal('Cable/DSL', record.connection_type)
128
+ assert_equal('Cellular', record.connection_type)
123
129
  assert_equal(ip, record.ip_address)
124
130
  assert_equal('1.0.1.0/24', record.network)
125
131
 
@@ -150,7 +156,7 @@ class ReaderTest < Minitest::Test
150
156
  assert_equal('Europe', record.continent.name)
151
157
 
152
158
  assert_equal(2_635_167, record.country.geoname_id)
153
- assert_equal(true, record.country.in_european_union?)
159
+ assert_equal(false, record.country.in_european_union?)
154
160
  assert_equal('GB', record.country.iso_code)
155
161
  assert_equal(
156
162
  {
@@ -209,6 +215,12 @@ class ReaderTest < Minitest::Test
209
215
  assert_equal('81.2.69.163', record.traits.ip_address)
210
216
  assert_equal('81.2.69.160/27', record.traits.network)
211
217
 
218
+ # This IP has is_anycast.
219
+
220
+ ip_address = '214.1.1.0'
221
+ record = reader.country(ip_address)
222
+ assert_equal(true, record.traits.anycast?)
223
+
212
224
  assert_raises(NoMethodError) { record.foo }
213
225
  reader.close
214
226
  end
@@ -266,6 +278,20 @@ class ReaderTest < Minitest::Test
266
278
  assert_equal(ip_address, record.traits.ip_address)
267
279
  assert_equal('74.209.16.0/20', record.traits.network)
268
280
 
281
+ # This IP has MCC/MNC data.
282
+
283
+ ip_address = '149.101.100.0'
284
+ record = reader.enterprise(ip_address)
285
+
286
+ assert_equal('310', record.traits.mobile_country_code)
287
+ assert_equal('004', record.traits.mobile_network_code)
288
+
289
+ # This IP has is_anycast.
290
+
291
+ ip_address = '214.1.1.0'
292
+ record = reader.enterprise(ip_address)
293
+ assert_equal(true, record.traits.anycast?)
294
+
269
295
  reader.close
270
296
  end
271
297
 
@@ -283,6 +309,14 @@ class ReaderTest < Minitest::Test
283
309
  assert_equal(ip, record.ip_address)
284
310
  assert_equal('1.128.0.0/11', record.network)
285
311
 
312
+ # This IP has MCC/MNC data.
313
+
314
+ ip_address = '149.101.100.0'
315
+ record = reader.isp(ip_address)
316
+
317
+ assert_equal('310', record.mobile_country_code)
318
+ assert_equal('004', record.mobile_network_code)
319
+
286
320
  reader.close
287
321
  end
288
322
 
@@ -416,7 +450,7 @@ class ReaderTest < Minitest::Test
416
450
  "test/data/test-data/GeoIP2-#{t['file']}-Test.mmdb",
417
451
  )
418
452
  record = reader.send(t['method'], '81.2.69.160')
419
- assert_equal(true, record.country.in_european_union?)
453
+ assert_equal(false, record.country.in_european_union?)
420
454
  assert_equal(false, record.registered_country.in_european_union?)
421
455
  reader.close
422
456
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maxmind-geoip2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Storey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-14 00:00:00.000000000 Z
11
+ date: 2023-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -50,14 +50,14 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '1.1'
53
+ version: '1.2'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.1'
60
+ version: '1.2'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: minitest
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -167,10 +167,10 @@ files:
167
167
  - lib/maxmind/geoip2/record/represented_country.rb
168
168
  - lib/maxmind/geoip2/record/subdivision.rb
169
169
  - lib/maxmind/geoip2/record/traits.rb
170
+ - lib/maxmind/geoip2/version.rb
170
171
  - maxmind-geoip2.gemspec
171
172
  - test/data/LICENSE
172
173
  - test/data/MaxMind-DB-spec.md
173
- - test/data/MaxMind-DB-test-metadata-pointers.mmdb
174
174
  - test/data/README.md
175
175
  - test/data/bad-data/README.md
176
176
  - test/data/bad-data/libmaxminddb/libmaxminddb-offset-integer-overflow.mmdb
@@ -182,7 +182,16 @@ files:
182
182
  - test/data/bad-data/maxminddb-golang/metadata-is-an-uint128.mmdb
183
183
  - test/data/bad-data/maxminddb-golang/unexpected-bytes.mmdb
184
184
  - test/data/bad-data/maxminddb-python/bad-unicode-in-map-key.mmdb
185
+ - test/data/cmd/write-test-data/main.go
186
+ - test/data/go.mod
187
+ - test/data/go.sum
185
188
  - test/data/perltidyrc
189
+ - test/data/pkg/writer/decoder.go
190
+ - test/data/pkg/writer/geoip2.go
191
+ - test/data/pkg/writer/ip.go
192
+ - test/data/pkg/writer/maxmind.go
193
+ - test/data/pkg/writer/nestedstructures.go
194
+ - test/data/pkg/writer/writer.go
186
195
  - test/data/source-data/GeoIP2-Anonymous-IP-Test.json
187
196
  - test/data/source-data/GeoIP2-City-Test.json
188
197
  - test/data/source-data/GeoIP2-Connection-Type-Test.json
@@ -191,11 +200,13 @@ files:
191
200
  - test/data/source-data/GeoIP2-Domain-Test.json
192
201
  - test/data/source-data/GeoIP2-Enterprise-Test.json
193
202
  - test/data/source-data/GeoIP2-ISP-Test.json
203
+ - test/data/source-data/GeoIP2-Precision-Enterprise-Sandbox-Test.json
194
204
  - test/data/source-data/GeoIP2-Precision-Enterprise-Test.json
195
205
  - test/data/source-data/GeoIP2-Static-IP-Score-Test.json
196
206
  - test/data/source-data/GeoIP2-User-Count-Test.json
197
207
  - test/data/source-data/GeoLite2-ASN-Test.json
198
- - test/data/source-data/README
208
+ - test/data/source-data/GeoLite2-City-Test.json
209
+ - test/data/source-data/GeoLite2-Country-Test.json
199
210
  - test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb
200
211
  - test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb
201
212
  - test/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb
@@ -210,6 +221,8 @@ files:
210
221
  - test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb
211
222
  - test/data/test-data/GeoIP2-User-Count-Test.mmdb
212
223
  - test/data/test-data/GeoLite2-ASN-Test.mmdb
224
+ - test/data/test-data/GeoLite2-City-Test.mmdb
225
+ - test/data/test-data/GeoLite2-Country-Test.mmdb
213
226
  - test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb
214
227
  - test/data/test-data/MaxMind-DB-string-value-entries.mmdb
215
228
  - test/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb
@@ -229,7 +242,6 @@ files:
229
242
  - test/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb
230
243
  - test/data/test-data/README.md
231
244
  - test/data/test-data/maps-with-pointers.raw
232
- - test/data/test-data/write-test-data.pl
233
245
  - test/data/tidyall.ini
234
246
  - test/test_client.rb
235
247
  - test/test_model_country.rb
@@ -244,6 +256,7 @@ metadata:
244
256
  changelog_uri: https://github.com/maxmind/GeoIP2-ruby/blob/main/CHANGELOG.md
245
257
  documentation_uri: https://www.rubydoc.info/gems/maxmind-geoip2
246
258
  homepage_uri: https://github.com/maxmind/GeoIP2-ruby
259
+ rubygems_mfa_required: 'true'
247
260
  source_code_uri: https://github.com/maxmind/GeoIP2-ruby
248
261
  post_install_message:
249
262
  rdoc_options: []
@@ -260,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
273
  - !ruby/object:Gem::Version
261
274
  version: '0'
262
275
  requirements: []
263
- rubygems_version: 3.2.15
276
+ rubygems_version: 3.4.18
264
277
  signing_key:
265
278
  specification_version: 4
266
279
  summary: A gem for interacting with the GeoIP2 webservices and databases.
@@ -1,15 +0,0 @@
1
- All of these but the City and Enterprise files are JSON dumps of the databases
2
- created by the GeoIP2 build integration tests
3
- (TestFor::MM::Integration::GeoIP2::Build).
4
-
5
- Additional data was added to match our legacy test databases.
6
-
7
- The City file is of unknown origin.
8
-
9
- The Enterprise file was a single example IP address, modified slightly to
10
- include all fields. It now has more than that.
11
-
12
- The Precision file was the normal Enterprise file with an additional marker
13
- (128.101.101.101) to differentiate the two. It now contains additional
14
- additions and changes as it is the database used in many MaxMind
15
- integration tests.