maxmind-db-rust 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +52 -0
- data/CONTRIBUTING.md +496 -0
- data/LICENSE +15 -0
- data/README.md +343 -0
- data/ext/maxmind_db_rust/Cargo.toml +25 -0
- data/ext/maxmind_db_rust/extconf.rb +5 -0
- data/ext/maxmind_db_rust/lib/maxmind/db/rust.rb +16 -0
- data/ext/maxmind_db_rust/src/lib.rs +970 -0
- data/lib/maxmind/db/rust.rb +135 -0
- metadata +183 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'ipaddr'
|
|
4
|
+
require 'maxmind/db/maxmind_db_rust'
|
|
5
|
+
|
|
6
|
+
module MaxMind
|
|
7
|
+
# Check if DB is already defined as a Class (official gem)
|
|
8
|
+
if const_defined?(:DB) && DB.is_a?(Class)
|
|
9
|
+
# Official gem loaded - Rust module is already attached to the class by native extension
|
|
10
|
+
# Just add documentation here
|
|
11
|
+
class << DB
|
|
12
|
+
# The Rust module provides a high-performance Rust-based implementation for reading
|
|
13
|
+
# {MaxMind DB files}[https://maxmind.github.io/MaxMind-DB/].
|
|
14
|
+
#
|
|
15
|
+
# MaxMind DB is a binary file format that stores data indexed by IP address
|
|
16
|
+
# subnets (IPv4 or IPv6).
|
|
17
|
+
#
|
|
18
|
+
# This is a Rust-based implementation that provides significant performance
|
|
19
|
+
# improvements over pure Ruby implementations while maintaining API compatibility
|
|
20
|
+
# with the official MaxMind::DB gem.
|
|
21
|
+
#
|
|
22
|
+
# == Example
|
|
23
|
+
#
|
|
24
|
+
# require 'maxmind/db/rust'
|
|
25
|
+
#
|
|
26
|
+
# reader = MaxMind::DB::Rust::Reader.new(
|
|
27
|
+
# 'GeoIP2-City.mmdb',
|
|
28
|
+
# mode: MaxMind::DB::Rust::MODE_MEMORY
|
|
29
|
+
# )
|
|
30
|
+
#
|
|
31
|
+
# record = reader.get('1.1.1.1')
|
|
32
|
+
# if record.nil?
|
|
33
|
+
# puts '1.1.1.1 was not found in the database'
|
|
34
|
+
# else
|
|
35
|
+
# puts record['country']['iso_code']
|
|
36
|
+
# puts record['country']['names']['en']
|
|
37
|
+
# end
|
|
38
|
+
#
|
|
39
|
+
# reader.close
|
|
40
|
+
#
|
|
41
|
+
# == Using the Iterator
|
|
42
|
+
#
|
|
43
|
+
# require 'maxmind/db/rust'
|
|
44
|
+
#
|
|
45
|
+
# reader = MaxMind::DB::Rust::Reader.new('GeoLite2-Country.mmdb')
|
|
46
|
+
#
|
|
47
|
+
# # Iterate over all networks in the database
|
|
48
|
+
# reader.each do |network, data|
|
|
49
|
+
# puts "#{network}: #{data['country']['iso_code']}"
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
52
|
+
# # Iterate over networks within a specific subnet
|
|
53
|
+
# reader.each('192.168.0.0/16') do |network, data|
|
|
54
|
+
# puts "#{network}: #{data['city']['names']['en']}"
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
# # Also accepts IPAddr objects
|
|
58
|
+
# subnet = IPAddr.new('10.0.0.0/8')
|
|
59
|
+
# reader.each(subnet) do |network, data|
|
|
60
|
+
# puts "#{network}: #{data['country']['iso_code']}"
|
|
61
|
+
# end
|
|
62
|
+
#
|
|
63
|
+
# reader.close
|
|
64
|
+
#
|
|
65
|
+
# The Rust module (MaxMind::DB::Rust) defines:
|
|
66
|
+
# - Reader class
|
|
67
|
+
# - Metadata class
|
|
68
|
+
# - InvalidDatabaseError exception
|
|
69
|
+
# - MODE_AUTO, MODE_MEMORY, MODE_MMAP constants
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
# Official gem not loaded - define DB as a module
|
|
73
|
+
module DB
|
|
74
|
+
# Rust provides a high-performance Rust-based implementation for reading
|
|
75
|
+
# {MaxMind DB files}[https://maxmind.github.io/MaxMind-DB/].
|
|
76
|
+
#
|
|
77
|
+
# MaxMind DB is a binary file format that stores data indexed by IP address
|
|
78
|
+
# subnets (IPv4 or IPv6).
|
|
79
|
+
#
|
|
80
|
+
# This is a Rust-based implementation that provides significant performance
|
|
81
|
+
# improvements over pure Ruby implementations while maintaining API compatibility
|
|
82
|
+
# with the official MaxMind::DB gem.
|
|
83
|
+
#
|
|
84
|
+
# == Example
|
|
85
|
+
#
|
|
86
|
+
# require 'maxmind/db/rust'
|
|
87
|
+
#
|
|
88
|
+
# reader = MaxMind::DB::Rust::Reader.new(
|
|
89
|
+
# 'GeoIP2-City.mmdb',
|
|
90
|
+
# mode: MaxMind::DB::Rust::MODE_MEMORY
|
|
91
|
+
# )
|
|
92
|
+
#
|
|
93
|
+
# record = reader.get('1.1.1.1')
|
|
94
|
+
# if record.nil?
|
|
95
|
+
# puts '1.1.1.1 was not found in the database'
|
|
96
|
+
# else
|
|
97
|
+
# puts record['country']['iso_code']
|
|
98
|
+
# puts record['country']['names']['en']
|
|
99
|
+
# end
|
|
100
|
+
#
|
|
101
|
+
# reader.close
|
|
102
|
+
#
|
|
103
|
+
# == Using the Iterator
|
|
104
|
+
#
|
|
105
|
+
# require 'maxmind/db/rust'
|
|
106
|
+
#
|
|
107
|
+
# reader = MaxMind::DB::Rust::Reader.new('GeoLite2-Country.mmdb')
|
|
108
|
+
#
|
|
109
|
+
# # Iterate over all networks in the database
|
|
110
|
+
# reader.each do |network, data|
|
|
111
|
+
# puts "#{network}: #{data['country']['iso_code']}"
|
|
112
|
+
# end
|
|
113
|
+
#
|
|
114
|
+
# # Iterate over networks within a specific subnet
|
|
115
|
+
# reader.each('192.168.0.0/16') do |network, data|
|
|
116
|
+
# puts "#{network}: #{data['city']['names']['en']}"
|
|
117
|
+
# end
|
|
118
|
+
#
|
|
119
|
+
# # Also accepts IPAddr objects
|
|
120
|
+
# subnet = IPAddr.new('10.0.0.0/8')
|
|
121
|
+
# reader.each(subnet) do |network, data|
|
|
122
|
+
# puts "#{network}: #{data['country']['iso_code']}"
|
|
123
|
+
# end
|
|
124
|
+
#
|
|
125
|
+
# reader.close
|
|
126
|
+
module Rust
|
|
127
|
+
# The native extension defines:
|
|
128
|
+
# - Reader class
|
|
129
|
+
# - Metadata class
|
|
130
|
+
# - InvalidDatabaseError exception
|
|
131
|
+
# - MODE_AUTO, MODE_MEMORY, MODE_MMAP constants
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: maxmind-db-rust
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Gregory Oschwald
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: rb_sys
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0.9'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0.9'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: minitest
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '5.0'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '5.0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: rake
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '13.0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '13.0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rake-compiler
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '1.2'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.2'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rubocop
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '1.0'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '1.0'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: rubocop-minitest
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '0.36'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '0.36'
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: rubocop-performance
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '1.0'
|
|
103
|
+
type: :development
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '1.0'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: rubocop-rake
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - "~>"
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '0.6'
|
|
117
|
+
type: :development
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '0.6'
|
|
124
|
+
- !ruby/object:Gem::Dependency
|
|
125
|
+
name: rubocop-thread_safety
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '0.6'
|
|
131
|
+
type: :development
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - "~>"
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: '0.6'
|
|
138
|
+
description: An unofficial high-performance Rust-based gem for reading MaxMind DB
|
|
139
|
+
files. Provides API compatibility with the official maxmind-db gem while leveraging
|
|
140
|
+
Rust for superior performance. This library is not endorsed by MaxMind.
|
|
141
|
+
email: oschwald@gmail.com
|
|
142
|
+
executables: []
|
|
143
|
+
extensions:
|
|
144
|
+
- ext/maxmind_db_rust/extconf.rb
|
|
145
|
+
extra_rdoc_files: []
|
|
146
|
+
files:
|
|
147
|
+
- CHANGELOG.md
|
|
148
|
+
- CONTRIBUTING.md
|
|
149
|
+
- LICENSE
|
|
150
|
+
- README.md
|
|
151
|
+
- ext/maxmind_db_rust/Cargo.toml
|
|
152
|
+
- ext/maxmind_db_rust/extconf.rb
|
|
153
|
+
- ext/maxmind_db_rust/lib/maxmind/db/rust.rb
|
|
154
|
+
- ext/maxmind_db_rust/src/lib.rs
|
|
155
|
+
- lib/maxmind/db/rust.rb
|
|
156
|
+
homepage: https://github.com/oschwald/maxmind-db-rust-ruby
|
|
157
|
+
licenses:
|
|
158
|
+
- ISC
|
|
159
|
+
metadata:
|
|
160
|
+
bug_tracker_uri: https://github.com/oschwald/maxmind-db-rust-ruby/issues
|
|
161
|
+
changelog_uri: https://github.com/oschwald/maxmind-db-rust-ruby/blob/main/CHANGELOG.md
|
|
162
|
+
documentation_uri: https://www.rubydoc.info/gems/maxmind-db-rust
|
|
163
|
+
homepage_uri: https://github.com/oschwald/maxmind-db-rust-ruby
|
|
164
|
+
source_code_uri: https://github.com/oschwald/maxmind-db-rust-ruby
|
|
165
|
+
rubygems_mfa_required: 'true'
|
|
166
|
+
rdoc_options: []
|
|
167
|
+
require_paths:
|
|
168
|
+
- lib
|
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
|
+
requirements:
|
|
171
|
+
- - ">="
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '3.2'
|
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
|
+
requirements:
|
|
176
|
+
- - ">="
|
|
177
|
+
- !ruby/object:Gem::Version
|
|
178
|
+
version: '0'
|
|
179
|
+
requirements: []
|
|
180
|
+
rubygems_version: 3.6.9
|
|
181
|
+
specification_version: 4
|
|
182
|
+
summary: Unofficial high-performance Rust-based MaxMind DB reader for Ruby
|
|
183
|
+
test_files: []
|