maxmind-geoip2 0.0.1 → 0.5.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 (99) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +30 -0
  3. data/Gemfile +1 -5
  4. data/README.md +121 -0
  5. data/lib/maxmind/geoip2.rb +1 -13
  6. data/lib/maxmind/geoip2/client.rb +328 -0
  7. data/lib/maxmind/geoip2/errors.rb +37 -3
  8. data/lib/maxmind/geoip2/model/abstract.rb +31 -0
  9. data/lib/maxmind/geoip2/model/anonymous_ip.rb +75 -0
  10. data/lib/maxmind/geoip2/model/asn.rb +43 -0
  11. data/lib/maxmind/geoip2/model/city.rb +63 -44
  12. data/lib/maxmind/geoip2/model/connection_type.rb +36 -0
  13. data/lib/maxmind/geoip2/model/country.rb +64 -45
  14. data/lib/maxmind/geoip2/model/domain.rb +36 -0
  15. data/lib/maxmind/geoip2/model/enterprise.rb +13 -9
  16. data/lib/maxmind/geoip2/model/insights.rb +18 -0
  17. data/lib/maxmind/geoip2/model/isp.rb +57 -0
  18. data/lib/maxmind/geoip2/reader.rb +250 -131
  19. data/lib/maxmind/geoip2/record/abstract.rb +17 -12
  20. data/lib/maxmind/geoip2/record/city.rb +33 -24
  21. data/lib/maxmind/geoip2/record/continent.rb +32 -23
  22. data/lib/maxmind/geoip2/record/country.rb +47 -34
  23. data/lib/maxmind/geoip2/record/location.rb +64 -50
  24. data/lib/maxmind/geoip2/record/maxmind.rb +21 -0
  25. data/lib/maxmind/geoip2/record/place.rb +22 -16
  26. data/lib/maxmind/geoip2/record/postal.rb +26 -18
  27. data/lib/maxmind/geoip2/record/represented_country.rb +20 -14
  28. data/lib/maxmind/geoip2/record/subdivision.rb +42 -34
  29. data/lib/maxmind/geoip2/record/traits.rb +204 -160
  30. data/maxmind-geoip2.gemspec +12 -2
  31. data/test/data/LICENSE +4 -0
  32. data/test/data/MaxMind-DB-spec.md +570 -0
  33. data/test/data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  34. data/test/data/README.md +4 -0
  35. data/test/data/bad-data/README.md +7 -0
  36. data/test/data/bad-data/libmaxminddb/libmaxminddb-offset-integer-overflow.mmdb +0 -0
  37. data/test/data/bad-data/maxminddb-golang/cyclic-data-structure.mmdb +0 -0
  38. data/test/data/bad-data/maxminddb-golang/invalid-bytes-length.mmdb +1 -0
  39. data/test/data/bad-data/maxminddb-golang/invalid-data-record-offset.mmdb +0 -0
  40. data/test/data/bad-data/maxminddb-golang/invalid-map-key-length.mmdb +0 -0
  41. data/test/data/bad-data/maxminddb-golang/invalid-string-length.mmdb +1 -0
  42. data/test/data/bad-data/maxminddb-golang/metadata-is-an-uint128.mmdb +1 -0
  43. data/test/data/bad-data/maxminddb-golang/unexpected-bytes.mmdb +0 -0
  44. data/test/data/bad-data/maxminddb-python/bad-unicode-in-map-key.mmdb +0 -0
  45. data/test/data/perltidyrc +12 -0
  46. data/test/data/source-data/GeoIP2-Anonymous-IP-Test.json +49 -0
  47. data/test/data/source-data/GeoIP2-City-Test.json +12852 -0
  48. data/test/data/source-data/GeoIP2-Connection-Type-Test.json +102 -0
  49. data/test/data/source-data/GeoIP2-Country-Test.json +15916 -0
  50. data/test/data/source-data/GeoIP2-DensityIncome-Test.json +14 -0
  51. data/test/data/source-data/GeoIP2-Domain-Test.json +452 -0
  52. data/test/data/source-data/GeoIP2-Enterprise-Test.json +687 -0
  53. data/test/data/source-data/GeoIP2-ISP-Test.json +12595 -0
  54. data/test/data/source-data/GeoIP2-Precision-Enterprise-Test.json +2148 -0
  55. data/test/data/source-data/GeoIP2-Static-IP-Score-Test.json +2132 -0
  56. data/test/data/source-data/GeoIP2-User-Count-Test.json +2837 -0
  57. data/test/data/source-data/GeoLite2-ASN-Test.json +37 -0
  58. data/test/data/source-data/README +15 -0
  59. data/test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  60. data/test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb +0 -0
  61. data/test/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb +0 -0
  62. data/test/data/test-data/GeoIP2-City-Test.mmdb +0 -0
  63. data/test/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  64. data/test/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
  65. data/test/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  66. data/test/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  67. data/test/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  68. data/test/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  69. data/test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  70. data/test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
  71. data/test/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
  72. data/test/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  73. data/test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
  74. data/test/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  75. data/test/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb +0 -0
  76. data/test/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb +0 -0
  77. data/test/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
  78. data/test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  79. data/test/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  80. data/test/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  81. data/test/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  82. data/test/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  83. data/test/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  84. data/test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  85. data/test/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  86. data/test/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  87. data/test/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  88. data/test/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  89. data/test/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb +0 -0
  90. data/test/data/test-data/README.md +26 -0
  91. data/test/data/test-data/maps-with-pointers.raw +0 -0
  92. data/test/data/test-data/write-test-data.pl +691 -0
  93. data/test/data/tidyall.ini +5 -0
  94. data/test/test_client.rb +426 -0
  95. data/test/test_model_country.rb +1 -1
  96. data/test/test_model_names.rb +1 -1
  97. data/test/test_reader.rb +92 -1
  98. metadata +194 -10
  99. data/Gemfile.lock +0 -36
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'maxmind/geoip2/model/abstract'
4
+
5
+ module MaxMind
6
+ module GeoIP2
7
+ module Model
8
+ # Model class for the GeoIP2 Domain database.
9
+ class Domain < Abstract
10
+ # The second level domain associated with the IP address. This will be
11
+ # something like "example.com" or "example.co.uk", not "foo.example.com".
12
+ #
13
+ # @return [String, nil]
14
+ def domain
15
+ get('domain')
16
+ end
17
+
18
+ # The IP address that the data in the model is for.
19
+ #
20
+ # @return [String]
21
+ def ip_address
22
+ get('ip_address')
23
+ end
24
+
25
+ # The network in CIDR notation associated with the record. In particular,
26
+ # this is the largest network where all of the fields besides ip_address
27
+ # have the same value.
28
+ #
29
+ # @return [String]
30
+ def network
31
+ get('network')
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,14 +2,18 @@
2
2
 
3
3
  require 'maxmind/geoip2/model/city'
4
4
 
5
- module MaxMind::GeoIP2::Model
6
- # Model class for the data returned by GeoIP2 Enterprise database lookups.
7
- #
8
- # The only difference between the City and Insights model classes is which
9
- # fields in each record may be populated. See
10
- # https://dev.maxmind.com/geoip/geoip2/web-services for more details.
11
- #
12
- # See City for inherited methods.
13
- class Enterprise < City
5
+ module MaxMind
6
+ module GeoIP2
7
+ module Model
8
+ # Model class for the data returned by GeoIP2 Enterprise database lookups.
9
+ #
10
+ # The only difference between the City and Insights model classes is which
11
+ # fields in each record may be populated. See
12
+ # https://dev.maxmind.com/geoip/geoip2/web-services for more details.
13
+ #
14
+ # See {MaxMind::GeoIP2::Model::City} for inherited methods.
15
+ class Enterprise < City
16
+ end
17
+ end
14
18
  end
15
19
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'maxmind/geoip2/model/city'
4
+
5
+ module MaxMind
6
+ module GeoIP2
7
+ module Model
8
+ # Model class for the data returned by the GeoIP2 Precision Insights web
9
+ # service.
10
+ #
11
+ # The only difference between the City and Insights model classes is which
12
+ # fields in each record may be populated. See
13
+ # https://dev.maxmind.com/geoip/geoip2/web-services for more details.
14
+ class Insights < City
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'maxmind/geoip2/model/abstract'
4
+
5
+ module MaxMind
6
+ module GeoIP2
7
+ module Model
8
+ # Model class for the GeoIP2 ISP database.
9
+ class ISP < Abstract
10
+ # The autonomous system number associated with the IP address.
11
+ #
12
+ # @return [Integer, nil]
13
+ def autonomous_system_number
14
+ get('autonomous_system_number')
15
+ end
16
+
17
+ # The organization associated with the registered autonomous system number
18
+ # for the IP address.
19
+ #
20
+ # @return [String, nil]
21
+ def autonomous_system_organization
22
+ get('autonomous_system_organization')
23
+ end
24
+
25
+ # The IP address that the data in the model is for.
26
+ #
27
+ # @return [String]
28
+ def ip_address
29
+ get('ip_address')
30
+ end
31
+
32
+ # The name of the ISP associated with the IP address.
33
+ #
34
+ # @return [String, nil]
35
+ def isp
36
+ get('isp')
37
+ end
38
+
39
+ # The network in CIDR notation associated with the record. In particular,
40
+ # this is the largest network where all of the fields besides ip_address
41
+ # have the same value.
42
+ #
43
+ # @return [String]
44
+ def network
45
+ get('network')
46
+ end
47
+
48
+ # The name of the organization associated with the IP address.
49
+ #
50
+ # @return [String, nil]
51
+ def organization
52
+ get('organization')
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -2,159 +2,278 @@
2
2
 
3
3
  require 'maxmind/db'
4
4
  require 'maxmind/geoip2/errors'
5
+ require 'maxmind/geoip2/model/anonymous_ip'
6
+ require 'maxmind/geoip2/model/asn'
5
7
  require 'maxmind/geoip2/model/city'
8
+ require 'maxmind/geoip2/model/connection_type'
6
9
  require 'maxmind/geoip2/model/country'
10
+ require 'maxmind/geoip2/model/domain'
7
11
  require 'maxmind/geoip2/model/enterprise'
12
+ require 'maxmind/geoip2/model/isp'
8
13
 
9
- module MaxMind::GeoIP2
10
- # Reader is a reader for the GeoIP2/GeoLite2 database format. IP addresses
11
- # can be looked up using the database specific methods.
12
- #
13
- # == Example
14
- #
15
- # require 'maxmind/geoip2'
16
- #
17
- # reader = MaxMind::GeoIP2::Reader.new('GeoIP2-Country.mmdb')
18
- #
19
- # record = reader.country('1.2.3.4')
20
- # puts record.country.iso_code
21
- #
22
- # reader.close
23
- class Reader
24
- # Create a Reader for looking up IP addresses in a GeoIP2/GeoLite2 database
25
- # file.
14
+ module MaxMind
15
+ module GeoIP2
16
+ # Reader is a reader for the GeoIP2/GeoLite2 database format. IP addresses
17
+ # can be looked up using the database specific methods.
26
18
  #
27
- # If you're performing multiple lookups, it's most efficient to create one
28
- # Reader and reuse it.
19
+ # == Example
29
20
  #
30
- # Once created, the Reader is safe to use for lookups from multiple
31
- # threads. It is safe to use after forking only if you use
32
- # MaxMind::DB::MODE_MEMORY or if your version of Ruby supports IO#pread.
21
+ # require 'maxmind/geoip2'
33
22
  #
34
- # Creating the Reader may raise an exception if initialization fails.
23
+ # reader = MaxMind::GeoIP2::Reader.new('GeoIP2-Country.mmdb')
35
24
  #
36
- # +database+ is a path to a GeoIP2/GeoLite2 database file.
25
+ # record = reader.country('1.2.3.4')
26
+ # puts record.country.iso_code
37
27
  #
38
- # +locales+ is a list of locale codes to use in the name property from most
39
- # preferred to least preferred.
40
- #
41
- # +options+ is an option hash where each key is a symbol. The options
42
- # control the behavior of the Reader.
43
- #
44
- # The available options are:
45
- #
46
- # [+:mode+] defines how to open the database. It may be one of
47
- # MaxMind::DB::MODE_AUTO, MaxMind::DB::MODE_FILE, or
48
- # MaxMind::DB::MODE_MEMORY. If you don't provide one, the Reader uses
49
- # MaxMind::DB::MODE_AUTO. Refer to the definition of those constants
50
- # in MaxMind::DB for an explanation of their meaning.
51
- #
52
- # === Exceptions
53
- #
54
- # Raises a MaxMind::DB::InvalidDatabaseError if the database is corrupt or
55
- # invalid. It can raise other exceptions, such as ArgumentError, if other
56
- # errors occur.
57
- def initialize(database, locales = ['en'], options = {})
58
- @reader = MaxMind::DB.new(database, options)
59
- @type = @reader.metadata.database_type
60
- locales = ['en'] if locales.empty?
61
- @locales = locales
62
- end
28
+ # reader.close
29
+ class Reader
30
+ # Create a Reader for looking up IP addresses in a GeoIP2/GeoLite2 database
31
+ # file.
32
+ #
33
+ # If you're performing multiple lookups, it's most efficient to create one
34
+ # Reader and reuse it.
35
+ #
36
+ # Once created, the Reader is safe to use for lookups from multiple
37
+ # threads. It is safe to use after forking only if you use
38
+ # MaxMind::DB::MODE_MEMORY or if your version of Ruby supports IO#pread.
39
+ #
40
+ # @param database [String] a path to a GeoIP2/GeoLite2 database file.
41
+ #
42
+ # @param locales [Array<String>] a list of locale codes to use in the name
43
+ # property from most preferred to least preferred.
44
+ #
45
+ # @param options [Hash<Symbol, Symbol>] options controlling the behavior of
46
+ # the Reader.
47
+ #
48
+ # @option options [Symbol] :mode Defines how to open the database. It may
49
+ # be one of MaxMind::DB::MODE_AUTO, MaxMind::DB::MODE_FILE, or
50
+ # MaxMind::DB::MODE_MEMORY. If you don't provide one, the Reader uses
51
+ # MaxMind::DB::MODE_AUTO. Refer to the definition of those constants in
52
+ # MaxMind::DB for an explanation of their meaning.
53
+ #
54
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database is corrupt or
55
+ # invalid.
56
+ #
57
+ # @raise [ArgumentError] if the mode is invalid.
58
+ def initialize(database, locales = ['en'], options = {})
59
+ @reader = MaxMind::DB.new(database, options)
60
+ @type = @reader.metadata.database_type
61
+ locales = ['en'] if locales.empty?
62
+ @locales = locales
63
+ end
63
64
 
64
- # Look up the +ip_address+ in the database and returns a
65
- # MaxMind::GeoIP2::Model::City object.
66
- #
67
- # +ip_address+ is a string in the standard notation. It may be IPv4 or
68
- # IPv6.
69
- #
70
- # === Exceptions
71
- #
72
- # Raises an ArgumentError if used against a non-City database or if you
73
- # attempt to look up an IPv6 address in an IPv4 only database.
74
- #
75
- # Raises an AddressNotFoundError if +ip_address+ is not found in the
76
- # database.
77
- #
78
- # Raises a MaxMind::DB::InvalidDatabaseError if the database appears
79
- # corrupt.
80
- def city(ip_address)
81
- model_for(Model::City, 'city', 'City', ip_address)
82
- end
65
+ # Look up the IP address in the database.
66
+ #
67
+ # @param ip_address [String] a string in the standard notation. It may be
68
+ # IPv4 or IPv6.
69
+ #
70
+ # @return [MaxMind::GeoIP2::Model::AnonymousIP]
71
+ #
72
+ # @raise [ArgumentError] if used against a non-Anonymous IP database or if
73
+ # you attempt to look up an IPv6 address in an IPv4 only database.
74
+ #
75
+ # @raise [AddressNotFoundError] if the IP address is not found in the
76
+ # database.
77
+ #
78
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
79
+ # corrupt.
80
+ def anonymous_ip(ip_address)
81
+ flat_model_for(
82
+ Model::AnonymousIP,
83
+ 'anonymous_ip',
84
+ 'GeoIP2-Anonymous-IP',
85
+ ip_address,
86
+ )
87
+ end
83
88
 
84
- # Look up the +ip_address+ in the database and returns a
85
- # MaxMind::GeoIP2::Model::Country object.
86
- #
87
- # +ip_address+ is a string in the standard notation. It may be IPv4 or
88
- # IPv6.
89
- #
90
- # === Exceptions
91
- #
92
- # Raises an ArgumentError if used against a non-Country database or if you
93
- # attempt to look up an IPv6 address in an IPv4 only database.
94
- #
95
- # Raises an AddressNotFoundError if +ip_address+ is not found in the
96
- # database.
97
- #
98
- # Raises a MaxMind::DB::InvalidDatabaseError if the database appears
99
- # corrupt.
100
- def country(ip_address)
101
- model_for(Model::Country, 'country', 'Country', ip_address)
102
- end
89
+ # Look up the IP address in an ASN database.
90
+ #
91
+ # @param ip_address [String] a string in the standard notation. It may be
92
+ # IPv4 or IPv6.
93
+ #
94
+ # @return [MaxMind::GeoIP2::Model::ASN]
95
+ #
96
+ # @raise [ArgumentError] if used against a non-ASN database or if you
97
+ # attempt to look up an IPv6 address in an IPv4 only database.
98
+ #
99
+ # @raise [AddressNotFoundError] if the IP address is not found in the
100
+ # database.
101
+ #
102
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
103
+ # corrupt.
104
+ def asn(ip_address)
105
+ flat_model_for(Model::ASN, 'asn', 'GeoLite2-ASN', ip_address)
106
+ end
103
107
 
104
- # Look up the +ip_address+ in the database and returns a
105
- # MaxMind::GeoIP2::Model::Enterprise object.
106
- #
107
- # +ip_address+ is a string in the standard notation. It may be IPv4 or
108
- # IPv6.
109
- #
110
- # === Exceptions
111
- #
112
- # Raises an ArgumentError if used against a non-Enterprise database or if
113
- # you attempt to look up an IPv6 address in an IPv4 only database.
114
- #
115
- # Raises an AddressNotFoundError if +ip_address+ is not found in the
116
- # database.
117
- #
118
- # Raises a MaxMind::DB::InvalidDatabaseError if the database appears
119
- # corrupt.
120
- def enterprise(ip_address)
121
- model_for(Model::Enterprise, 'enterprise', 'Enterprise', ip_address)
122
- end
108
+ # Look up the IP address in a City database.
109
+ #
110
+ # @param ip_address [String] a string in the standard notation. It may be
111
+ # IPv4 or IPv6.
112
+ #
113
+ # @return [MaxMind::GeoIP2::Model::City]
114
+ #
115
+ # @raise [ArgumentError] if used against a non-City database or if you
116
+ # attempt to look up an IPv6 address in an IPv4 only database.
117
+ #
118
+ # @raise [AddressNotFoundError] if the IP address is not found in the
119
+ # database.
120
+ #
121
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
122
+ # corrupt.
123
+ def city(ip_address)
124
+ model_for(Model::City, 'city', 'City', ip_address)
125
+ end
123
126
 
124
- # Return the metadata associated with the database as a
125
- # MaxMind::DB::Metadata object.
126
- def metadata
127
- @reader.metadata
128
- end
127
+ # Look up the IP address in a Connection Type database.
128
+ #
129
+ # @param ip_address [String] a string in the standard notation. It may be
130
+ # IPv4 or IPv6.
131
+ #
132
+ # @return [MaxMind::GeoIP2::Model::ConnectionType]
133
+ #
134
+ # @raise [ArgumentError] if used against a non-Connection Type database or if
135
+ # you attempt to look up an IPv6 address in an IPv4 only database.
136
+ #
137
+ # @raise [AddressNotFoundError] if the IP address is not found in the
138
+ # database.
139
+ #
140
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
141
+ # corrupt.
142
+ def connection_type(ip_address)
143
+ flat_model_for(
144
+ Model::ConnectionType,
145
+ 'connection_type',
146
+ 'GeoIP2-Connection-Type',
147
+ ip_address,
148
+ )
149
+ end
129
150
 
130
- # Close the Reader and return resources to the system.
131
- #
132
- # There is no useful return value. #close raises an exception if there is
133
- # an error.
134
- def close
135
- @reader.close
136
- end
151
+ # Look up the IP address in a Country database.
152
+ #
153
+ # @param ip_address [String] a string in the standard notation. It may be
154
+ # IPv4 or IPv6.
155
+ #
156
+ # @return [MaxMind::GeoIP2::Model::Country]
157
+ #
158
+ # @raise [ArgumentError] if used against a non-Country database or if you
159
+ # attempt to look up an IPv6 address in an IPv4 only database.
160
+ #
161
+ # @raise [AddressNotFoundError] if the IP address is not found in the
162
+ # database.
163
+ #
164
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
165
+ # corrupt.
166
+ def country(ip_address)
167
+ model_for(Model::Country, 'country', 'Country', ip_address)
168
+ end
169
+
170
+ # Look up the IP address in a Domain database.
171
+ #
172
+ # @param ip_address [String] a string in the standard notation. It may be
173
+ # IPv4 or IPv6.
174
+ #
175
+ # @return [MaxMind::GeoIP2::Model::Domain]
176
+ #
177
+ # @raise [ArgumentError] if used against a non-Domain database or if you
178
+ # attempt to look up an IPv6 address in an IPv4 only database.
179
+ #
180
+ # @raise [AddressNotFoundError] if the IP address is not found in the
181
+ # database.
182
+ #
183
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
184
+ # corrupt.
185
+ def domain(ip_address)
186
+ flat_model_for(Model::Domain, 'domain', 'GeoIP2-Domain', ip_address)
187
+ end
188
+
189
+ # Look up the IP address in an Enterprise database.
190
+ #
191
+ # @param ip_address [String] a string in the standard notation. It may be
192
+ # IPv4 or IPv6.
193
+ #
194
+ # @return [MaxMind::GeoIP2::Model::Enterprise]
195
+ #
196
+ # @raise [ArgumentError] if used against a non-Enterprise database or if
197
+ # you attempt to look up an IPv6 address in an IPv4 only database.
198
+ #
199
+ # @raise [AddressNotFoundError] if the IP address is not found in the
200
+ # database.
201
+ #
202
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
203
+ # corrupt.
204
+ def enterprise(ip_address)
205
+ model_for(Model::Enterprise, 'enterprise', 'Enterprise', ip_address)
206
+ end
137
207
 
138
- private
208
+ # Look up the IP address in an ISP database.
209
+ #
210
+ # @param ip_address [String] a string in the standard notation. It may be
211
+ # IPv4 or IPv6.
212
+ #
213
+ # @return [MaxMind::GeoIP2::Model::ISP]
214
+ #
215
+ # @raise [ArgumentError] if used against a non-ISP database or if you
216
+ # attempt to look up an IPv6 address in an IPv4 only database.
217
+ #
218
+ # @raise [AddressNotFoundError] if the IP address is not found in the
219
+ # database.
220
+ #
221
+ # @raise [MaxMind::DB::InvalidDatabaseError] if the database appears
222
+ # corrupt.
223
+ def isp(ip_address)
224
+ flat_model_for(Model::ISP, 'isp', 'GeoIP2-ISP', ip_address)
225
+ end
226
+
227
+ # Return the metadata associated with the database.
228
+ #
229
+ # @return [MaxMind::DB::Metadata]
230
+ def metadata
231
+ @reader.metadata
232
+ end
233
+
234
+ # Close the Reader and return resources to the system.
235
+ #
236
+ # @return [void]
237
+ def close
238
+ @reader.close
239
+ end
240
+
241
+ private
139
242
 
140
- def model_for(model_class, method, type, ip_address)
141
- if !@type.include?(type)
142
- raise ArgumentError,
143
- "The #{method} method cannot be used with the #{@type} database."
243
+ def model_for(model_class, method, type, ip_address)
244
+ record, prefix_length = get_record(method, type, ip_address)
245
+
246
+ record['traits'] = {} if !record.key?('traits')
247
+ record['traits']['ip_address'] = ip_address
248
+ record['traits']['prefix_length'] = prefix_length
249
+
250
+ model_class.new(record, @locales)
144
251
  end
145
252
 
146
- record, prefix_length = @reader.get_with_prefix_length(ip_address)
253
+ def get_record(method, type, ip_address)
254
+ if !@type.include?(type)
255
+ raise ArgumentError,
256
+ "The #{method} method cannot be used with the #{@type} database."
257
+ end
258
+
259
+ record, prefix_length = @reader.get_with_prefix_length(ip_address)
147
260
 
148
- if record.nil?
149
- raise AddressNotFoundError,
150
- "The address #{ip_address} is not in the database."
261
+ if record.nil?
262
+ raise AddressNotFoundError,
263
+ "The address #{ip_address} is not in the database."
264
+ end
265
+
266
+ [record, prefix_length]
151
267
  end
152
268
 
153
- record['traits'] = {} if !record.key?('traits')
154
- record['traits']['ip_address'] = ip_address
155
- record['traits']['prefix_length'] = prefix_length
269
+ def flat_model_for(model_class, method, type, ip_address)
270
+ record, prefix_length = get_record(method, type, ip_address)
271
+
272
+ record['ip_address'] = ip_address
273
+ record['prefix_length'] = prefix_length
156
274
 
157
- model_class.new(record, @locales)
275
+ model_class.new(record)
276
+ end
158
277
  end
159
278
  end
160
279
  end