geoip 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -2,3 +2,7 @@
2
2
 
3
3
  * 1 major enhancement:
4
4
  * Initial release
5
+
6
+ == 0.7.0 2008-05-03
7
+
8
+ * Added Hez Ronningen's patch for using the ISP lookup data file
data/README.txt CHANGED
@@ -2,7 +2,9 @@ GeoIP searches a GeoIP database for a given host or IP address, and
2
2
  returns information about the country where the IP address is allocated.
3
3
 
4
4
  You need at least the free GeoIP.dat, for which the last known download
5
- location is <http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz>
5
+ location is <http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz>,
6
+ or the city database from <http://www.maxmind.com/app/geolitecity>.
7
+
6
8
  This API requires the file to be decompressed for searching. Other versions
7
9
  of this database are available for purchase which contain more detailed
8
10
  information, but this information is not returned by this implementation.
data/lib/geoip.rb CHANGED
@@ -47,346 +47,346 @@ require 'socket'
47
47
  class GeoIP
48
48
  private
49
49
  CountryCode = [
50
- "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","AN",
51
- "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
52
- "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
53
- "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
54
- "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
55
- "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
56
- "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
57
- "FK","FM","FO","FR","FX","GA","GB","GD","GE","GF",
58
- "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
59
- "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
60
- "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
61
- "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
62
- "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
63
- "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
64
- "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
65
- "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
66
- "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
67
- "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
68
- "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
69
- "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
70
- "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
71
- "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
72
- "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
73
- "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
74
- "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
75
- "BL","MF"
50
+ "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","AN",
51
+ "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
52
+ "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
53
+ "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
54
+ "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
55
+ "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
56
+ "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
57
+ "FK","FM","FO","FR","FX","GA","GB","GD","GE","GF",
58
+ "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
59
+ "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
60
+ "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
61
+ "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
62
+ "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
63
+ "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
64
+ "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
65
+ "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
66
+ "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
67
+ "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
68
+ "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
69
+ "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
70
+ "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
71
+ "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
72
+ "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
73
+ "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
74
+ "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
75
+ "BL","MF"
76
76
  ]
77
77
 
78
78
  CountryCode3 = [
79
- "--","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT",
80
- "AGO","AQ","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
81
- "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
82
- "BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC","COD",
83
- "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
84
- "CUB","CPV","CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
85
- "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
86
- "FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD","GEO","GUF",
87
- "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM",
88
- "GUM","GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN",
89
- "IRL","ISR","IND","IO","IRQ","IRN","ISL","ITA","JAM","JOR",
90
- "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
91
- "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
92
- "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
93
- "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
94
- "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
95
- "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
96
- "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
97
- "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
98
- "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
99
- "SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF","TGO","THA",
100
- "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
101
- "TZA","UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN",
102
- "VGB","VIR","VNM","VUT","WLF","WSM","YEM","YT","SRB","ZAF",
103
- "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
104
- "BLM","MAF"
79
+ "--","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT",
80
+ "AGO","AQ","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
81
+ "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
82
+ "BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC","COD",
83
+ "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
84
+ "CUB","CPV","CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
85
+ "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
86
+ "FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD","GEO","GUF",
87
+ "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM",
88
+ "GUM","GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN",
89
+ "IRL","ISR","IND","IO","IRQ","IRN","ISL","ITA","JAM","JOR",
90
+ "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
91
+ "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
92
+ "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
93
+ "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
94
+ "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
95
+ "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
96
+ "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
97
+ "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
98
+ "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
99
+ "SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF","TGO","THA",
100
+ "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
101
+ "TZA","UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN",
102
+ "VGB","VIR","VNM","VUT","WLF","WSM","YEM","YT","SRB","ZAF",
103
+ "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
104
+ "BLM","MAF"
105
105
  ]
106
106
 
107
107
  CountryName = [
108
- "N/A",
109
- "Asia/Pacific Region",
110
- "Europe",
111
- "Andorra",
112
- "United Arab Emirates",
113
- "Afghanistan",
114
- "Antigua and Barbuda",
115
- "Anguilla",
116
- "Albania",
117
- "Armenia",
118
- "Netherlands Antilles",
119
- "Angola",
120
- "Antarctica",
121
- "Argentina",
122
- "American Samoa",
123
- "Austria",
124
- "Australia",
125
- "Aruba",
126
- "Azerbaijan",
127
- "Bosnia and Herzegovina",
128
- "Barbados",
129
- "Bangladesh",
130
- "Belgium",
131
- "Burkina Faso",
132
- "Bulgaria",
133
- "Bahrain",
134
- "Burundi",
135
- "Benin",
136
- "Bermuda",
137
- "Brunei Darussalam",
138
- "Bolivia",
139
- "Brazil",
140
- "Bahamas",
141
- "Bhutan",
142
- "Bouvet Island",
143
- "Botswana",
144
- "Belarus",
145
- "Belize",
146
- "Canada",
147
- "Cocos (Keeling) Islands",
148
- "Congo, the Democratic Republic of the",
149
- "Central African Republic",
150
- "Congo",
151
- "Switzerland",
152
- "Cote D'Ivoire",
153
- "Cook Islands",
154
- "Chile",
155
- "Cameroon",
156
- "China",
157
- "Colombia",
158
- "Costa Rica",
159
- "Cuba",
160
- "Cape Verde",
161
- "Christmas Island",
162
- "Cyprus",
163
- "Czech Republic",
164
- "Germany",
165
- "Djibouti",
166
- "Denmark",
167
- "Dominica",
168
- "Dominican Republic",
169
- "Algeria",
170
- "Ecuador",
171
- "Estonia",
172
- "Egypt",
173
- "Western Sahara",
174
- "Eritrea",
175
- "Spain",
176
- "Ethiopia",
177
- "Finland",
178
- "Fiji",
179
- "Falkland Islands (Malvinas)",
180
- "Micronesia, Federated States of",
181
- "Faroe Islands",
182
- "France",
183
- "France, Metropolitan",
184
- "Gabon",
185
- "United Kingdom",
186
- "Grenada",
187
- "Georgia",
188
- "French Guiana",
189
- "Ghana",
190
- "Gibraltar",
191
- "Greenland",
192
- "Gambia",
193
- "Guinea",
194
- "Guadeloupe",
195
- "Equatorial Guinea",
196
- "Greece",
197
- "South Georgia and the South Sandwich Islands",
198
- "Guatemala",
199
- "Guam",
200
- "Guinea-Bissau",
201
- "Guyana",
202
- "Hong Kong",
203
- "Heard Island and McDonald Islands",
204
- "Honduras",
205
- "Croatia",
206
- "Haiti",
207
- "Hungary",
208
- "Indonesia",
209
- "Ireland",
210
- "Israel",
211
- "India",
212
- "British Indian Ocean Territory",
213
- "Iraq",
214
- "Iran, Islamic Republic of",
215
- "Iceland",
216
- "Italy",
217
- "Jamaica",
218
- "Jordan",
219
- "Japan",
220
- "Kenya",
221
- "Kyrgyzstan",
222
- "Cambodia",
223
- "Kiribati",
224
- "Comoros",
225
- "Saint Kitts and Nevis",
226
- "Korea, Democratic People's Republic of",
227
- "Korea, Republic of",
228
- "Kuwait",
229
- "Cayman Islands",
230
- "Kazakhstan",
231
- "Lao People's Democratic Republic",
232
- "Lebanon",
233
- "Saint Lucia",
234
- "Liechtenstein",
235
- "Sri Lanka",
236
- "Liberia",
237
- "Lesotho",
238
- "Lithuania",
239
- "Luxembourg",
240
- "Latvia",
241
- "Libyan Arab Jamahiriya",
242
- "Morocco",
243
- "Monaco",
244
- "Moldova, Republic of",
245
- "Madagascar",
246
- "Marshall Islands",
247
- "Macedonia, the Former Yugoslav Republic of",
248
- "Mali",
249
- "Myanmar",
250
- "Mongolia",
251
- "Macau",
252
- "Northern Mariana Islands",
253
- "Martinique",
254
- "Mauritania",
255
- "Montserrat",
256
- "Malta",
257
- "Mauritius",
258
- "Maldives",
259
- "Malawi",
260
- "Mexico",
261
- "Malaysia",
262
- "Mozambique",
263
- "Namibia",
264
- "New Caledonia",
265
- "Niger",
266
- "Norfolk Island",
267
- "Nigeria",
268
- "Nicaragua",
269
- "Netherlands",
270
- "Norway",
271
- "Nepal",
272
- "Nauru",
273
- "Niue",
274
- "New Zealand",
275
- "Oman",
276
- "Panama",
277
- "Peru",
278
- "French Polynesia",
279
- "Papua New Guinea",
280
- "Philippines",
281
- "Pakistan",
282
- "Poland",
283
- "Saint Pierre and Miquelon",
284
- "Pitcairn",
285
- "Puerto Rico",
286
- "Palestinian Territory, Occupied",
287
- "Portugal",
288
- "Palau",
289
- "Paraguay",
290
- "Qatar",
291
- "Reunion",
292
- "Romania",
293
- "Russian Federation",
294
- "Rwanda",
295
- "Saudi Arabia",
296
- "Solomon Islands",
297
- "Seychelles",
298
- "Sudan",
299
- "Sweden",
300
- "Singapore",
301
- "Saint Helena",
302
- "Slovenia",
303
- "Svalbard and Jan Mayen",
304
- "Slovakia",
305
- "Sierra Leone",
306
- "San Marino",
307
- "Senegal",
308
- "Somalia",
309
- "Suriname",
310
- "Sao Tome and Principe",
311
- "El Salvador",
312
- "Syrian Arab Republic",
313
- "Swaziland",
314
- "Turks and Caicos Islands",
315
- "Chad",
316
- "French Southern Territories",
317
- "Togo",
318
- "Thailand",
319
- "Tajikistan",
320
- "Tokelau",
321
- "Turkmenistan",
322
- "Tunisia",
323
- "Tonga",
324
- "Timor-Leste",
325
- "Turkey",
326
- "Trinidad and Tobago",
327
- "Tuvalu",
328
- "Taiwan, Province of China",
329
- "Tanzania, United Republic of",
330
- "Ukraine",
331
- "Uganda",
332
- "United States Minor Outlying Islands",
333
- "United States",
334
- "Uruguay",
335
- "Uzbekistan",
336
- "Holy See (Vatican City State)",
337
- "Saint Vincent and the Grenadines",
338
- "Venezuela",
339
- "Virgin Islands, British",
340
- "Virgin Islands, U.S.",
341
- "Viet Nam",
342
- "Vanuatu",
343
- "Wallis and Futuna",
344
- "Samoa",
345
- "Yemen",
346
- "Mayotte",
347
- "Serbia",
348
- "South Africa",
349
- "Zambia",
350
- "Montenegro",
351
- "Zimbabwe",
352
- "Anonymous Proxy",
353
- "Satellite Provider",
354
- "Other",
355
- "Aland Islands",
356
- "Guernsey",
357
- "Isle of Man",
358
- "Jersey",
359
- "Saint Barthelemy",
360
- "Saint Martin"
108
+ "N/A",
109
+ "Asia/Pacific Region",
110
+ "Europe",
111
+ "Andorra",
112
+ "United Arab Emirates",
113
+ "Afghanistan",
114
+ "Antigua and Barbuda",
115
+ "Anguilla",
116
+ "Albania",
117
+ "Armenia",
118
+ "Netherlands Antilles",
119
+ "Angola",
120
+ "Antarctica",
121
+ "Argentina",
122
+ "American Samoa",
123
+ "Austria",
124
+ "Australia",
125
+ "Aruba",
126
+ "Azerbaijan",
127
+ "Bosnia and Herzegovina",
128
+ "Barbados",
129
+ "Bangladesh",
130
+ "Belgium",
131
+ "Burkina Faso",
132
+ "Bulgaria",
133
+ "Bahrain",
134
+ "Burundi",
135
+ "Benin",
136
+ "Bermuda",
137
+ "Brunei Darussalam",
138
+ "Bolivia",
139
+ "Brazil",
140
+ "Bahamas",
141
+ "Bhutan",
142
+ "Bouvet Island",
143
+ "Botswana",
144
+ "Belarus",
145
+ "Belize",
146
+ "Canada",
147
+ "Cocos (Keeling) Islands",
148
+ "Congo, the Democratic Republic of the",
149
+ "Central African Republic",
150
+ "Congo",
151
+ "Switzerland",
152
+ "Cote D'Ivoire",
153
+ "Cook Islands",
154
+ "Chile",
155
+ "Cameroon",
156
+ "China",
157
+ "Colombia",
158
+ "Costa Rica",
159
+ "Cuba",
160
+ "Cape Verde",
161
+ "Christmas Island",
162
+ "Cyprus",
163
+ "Czech Republic",
164
+ "Germany",
165
+ "Djibouti",
166
+ "Denmark",
167
+ "Dominica",
168
+ "Dominican Republic",
169
+ "Algeria",
170
+ "Ecuador",
171
+ "Estonia",
172
+ "Egypt",
173
+ "Western Sahara",
174
+ "Eritrea",
175
+ "Spain",
176
+ "Ethiopia",
177
+ "Finland",
178
+ "Fiji",
179
+ "Falkland Islands (Malvinas)",
180
+ "Micronesia, Federated States of",
181
+ "Faroe Islands",
182
+ "France",
183
+ "France, Metropolitan",
184
+ "Gabon",
185
+ "United Kingdom",
186
+ "Grenada",
187
+ "Georgia",
188
+ "French Guiana",
189
+ "Ghana",
190
+ "Gibraltar",
191
+ "Greenland",
192
+ "Gambia",
193
+ "Guinea",
194
+ "Guadeloupe",
195
+ "Equatorial Guinea",
196
+ "Greece",
197
+ "South Georgia and the South Sandwich Islands",
198
+ "Guatemala",
199
+ "Guam",
200
+ "Guinea-Bissau",
201
+ "Guyana",
202
+ "Hong Kong",
203
+ "Heard Island and McDonald Islands",
204
+ "Honduras",
205
+ "Croatia",
206
+ "Haiti",
207
+ "Hungary",
208
+ "Indonesia",
209
+ "Ireland",
210
+ "Israel",
211
+ "India",
212
+ "British Indian Ocean Territory",
213
+ "Iraq",
214
+ "Iran, Islamic Republic of",
215
+ "Iceland",
216
+ "Italy",
217
+ "Jamaica",
218
+ "Jordan",
219
+ "Japan",
220
+ "Kenya",
221
+ "Kyrgyzstan",
222
+ "Cambodia",
223
+ "Kiribati",
224
+ "Comoros",
225
+ "Saint Kitts and Nevis",
226
+ "Korea, Democratic People's Republic of",
227
+ "Korea, Republic of",
228
+ "Kuwait",
229
+ "Cayman Islands",
230
+ "Kazakhstan",
231
+ "Lao People's Democratic Republic",
232
+ "Lebanon",
233
+ "Saint Lucia",
234
+ "Liechtenstein",
235
+ "Sri Lanka",
236
+ "Liberia",
237
+ "Lesotho",
238
+ "Lithuania",
239
+ "Luxembourg",
240
+ "Latvia",
241
+ "Libyan Arab Jamahiriya",
242
+ "Morocco",
243
+ "Monaco",
244
+ "Moldova, Republic of",
245
+ "Madagascar",
246
+ "Marshall Islands",
247
+ "Macedonia, the Former Yugoslav Republic of",
248
+ "Mali",
249
+ "Myanmar",
250
+ "Mongolia",
251
+ "Macau",
252
+ "Northern Mariana Islands",
253
+ "Martinique",
254
+ "Mauritania",
255
+ "Montserrat",
256
+ "Malta",
257
+ "Mauritius",
258
+ "Maldives",
259
+ "Malawi",
260
+ "Mexico",
261
+ "Malaysia",
262
+ "Mozambique",
263
+ "Namibia",
264
+ "New Caledonia",
265
+ "Niger",
266
+ "Norfolk Island",
267
+ "Nigeria",
268
+ "Nicaragua",
269
+ "Netherlands",
270
+ "Norway",
271
+ "Nepal",
272
+ "Nauru",
273
+ "Niue",
274
+ "New Zealand",
275
+ "Oman",
276
+ "Panama",
277
+ "Peru",
278
+ "French Polynesia",
279
+ "Papua New Guinea",
280
+ "Philippines",
281
+ "Pakistan",
282
+ "Poland",
283
+ "Saint Pierre and Miquelon",
284
+ "Pitcairn",
285
+ "Puerto Rico",
286
+ "Palestinian Territory, Occupied",
287
+ "Portugal",
288
+ "Palau",
289
+ "Paraguay",
290
+ "Qatar",
291
+ "Reunion",
292
+ "Romania",
293
+ "Russian Federation",
294
+ "Rwanda",
295
+ "Saudi Arabia",
296
+ "Solomon Islands",
297
+ "Seychelles",
298
+ "Sudan",
299
+ "Sweden",
300
+ "Singapore",
301
+ "Saint Helena",
302
+ "Slovenia",
303
+ "Svalbard and Jan Mayen",
304
+ "Slovakia",
305
+ "Sierra Leone",
306
+ "San Marino",
307
+ "Senegal",
308
+ "Somalia",
309
+ "Suriname",
310
+ "Sao Tome and Principe",
311
+ "El Salvador",
312
+ "Syrian Arab Republic",
313
+ "Swaziland",
314
+ "Turks and Caicos Islands",
315
+ "Chad",
316
+ "French Southern Territories",
317
+ "Togo",
318
+ "Thailand",
319
+ "Tajikistan",
320
+ "Tokelau",
321
+ "Turkmenistan",
322
+ "Tunisia",
323
+ "Tonga",
324
+ "Timor-Leste",
325
+ "Turkey",
326
+ "Trinidad and Tobago",
327
+ "Tuvalu",
328
+ "Taiwan, Province of China",
329
+ "Tanzania, United Republic of",
330
+ "Ukraine",
331
+ "Uganda",
332
+ "United States Minor Outlying Islands",
333
+ "United States",
334
+ "Uruguay",
335
+ "Uzbekistan",
336
+ "Holy See (Vatican City State)",
337
+ "Saint Vincent and the Grenadines",
338
+ "Venezuela",
339
+ "Virgin Islands, British",
340
+ "Virgin Islands, U.S.",
341
+ "Viet Nam",
342
+ "Vanuatu",
343
+ "Wallis and Futuna",
344
+ "Samoa",
345
+ "Yemen",
346
+ "Mayotte",
347
+ "Serbia",
348
+ "South Africa",
349
+ "Zambia",
350
+ "Montenegro",
351
+ "Zimbabwe",
352
+ "Anonymous Proxy",
353
+ "Satellite Provider",
354
+ "Other",
355
+ "Aland Islands",
356
+ "Guernsey",
357
+ "Isle of Man",
358
+ "Jersey",
359
+ "Saint Barthelemy",
360
+ "Saint Martin"
361
361
  ]
362
362
 
363
363
  CountryContinent = [
364
- "--","AS","EU","EU","AS","AS","SA","SA","EU","AS","SA",
365
- "AF","AN","SA","OC","EU","OC","SA","AS","EU","SA",
366
- "AS","EU","AF","EU","AS","AF","AF","SA","AS","SA",
367
- "SA","SA","AS","AF","AF","EU","SA","NA","AS","AF",
368
- "AF","AF","EU","AF","OC","SA","AF","AS","SA","SA",
369
- "SA","AF","AS","AS","EU","EU","AF","EU","SA","SA",
370
- "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
371
- "SA","OC","EU","EU","EU","AF","EU","SA","AS","SA",
372
- "AF","EU","SA","AF","AF","SA","AF","EU","SA","SA",
373
- "OC","AF","SA","AS","AF","SA","EU","SA","EU","AS",
374
- "EU","AS","AS","AS","AS","AS","EU","EU","SA","AS",
375
- "AS","AF","AS","AS","OC","AF","SA","AS","AS","AS",
376
- "SA","AS","AS","AS","SA","EU","AS","AF","AF","EU",
377
- "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
378
- "AS","AS","AS","OC","SA","AF","SA","EU","AF","AS",
379
- "AF","NA","AS","AF","AF","OC","AF","OC","AF","SA",
380
- "EU","EU","AS","OC","OC","OC","AS","SA","SA","OC",
381
- "OC","AS","AS","EU","SA","OC","SA","AS","EU","OC",
382
- "SA","AS","AF","EU","AS","AF","AS","OC","AF","AF",
383
- "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
384
- "SA","AF","SA","AS","AF","SA","AF","AF","AF","AS",
385
- "AS","OC","AS","AF","OC","AS","AS","SA","OC","AS",
386
- "AF","EU","AF","OC","NA","SA","AS","EU","SA","SA",
387
- "SA","SA","AS","OC","OC","OC","AS","AF","EU","AF",
388
- "AF","EU","AF","--","--","--","EU","EU","EU","EU",
389
- "SA","SA"
364
+ "--","AS","EU","EU","AS","AS","SA","SA","EU","AS","SA",
365
+ "AF","AN","SA","OC","EU","OC","SA","AS","EU","SA",
366
+ "AS","EU","AF","EU","AS","AF","AF","SA","AS","SA",
367
+ "SA","SA","AS","AF","AF","EU","SA","NA","AS","AF",
368
+ "AF","AF","EU","AF","OC","SA","AF","AS","SA","SA",
369
+ "SA","AF","AS","AS","EU","EU","AF","EU","SA","SA",
370
+ "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
371
+ "SA","OC","EU","EU","EU","AF","EU","SA","AS","SA",
372
+ "AF","EU","SA","AF","AF","SA","AF","EU","SA","SA",
373
+ "OC","AF","SA","AS","AF","SA","EU","SA","EU","AS",
374
+ "EU","AS","AS","AS","AS","AS","EU","EU","SA","AS",
375
+ "AS","AF","AS","AS","OC","AF","SA","AS","AS","AS",
376
+ "SA","AS","AS","AS","SA","EU","AS","AF","AF","EU",
377
+ "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
378
+ "AS","AS","AS","OC","SA","AF","SA","EU","AF","AS",
379
+ "AF","NA","AS","AF","AF","OC","AF","OC","AF","SA",
380
+ "EU","EU","AS","OC","OC","OC","AS","SA","SA","OC",
381
+ "OC","AS","AS","EU","SA","OC","SA","AS","EU","OC",
382
+ "SA","AS","AF","EU","AS","AF","AS","OC","AF","AF",
383
+ "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
384
+ "SA","AF","SA","AS","AF","SA","AF","AF","AF","AS",
385
+ "AS","OC","AS","AF","OC","AS","AS","SA","OC","AS",
386
+ "AF","EU","AF","OC","NA","SA","AS","EU","SA","SA",
387
+ "SA","SA","AS","OC","OC","OC","AS","AF","EU","AF",
388
+ "AF","EU","AF","--","--","--","EU","EU","EU","EU",
389
+ "SA","SA"
390
390
  ]
391
391
 
392
392
  public
@@ -426,48 +426,48 @@ class GeoIP
426
426
  # +filename+ is a String holding the path to the GeoIP.dat file
427
427
  # +options+ is an integer holding caching flags (unimplemented)
428
428
  def initialize(filename, flags = 0)
429
- @flags = flags
430
- @databaseType = GEOIP_COUNTRY_EDITION
431
- @record_length = STANDARD_RECORD_LENGTH
432
- @file = File.open(filename, 'rb')
433
- @file.seek(-3, IO::SEEK_END)
434
- 0.upto(STRUCTURE_INFO_MAX_SIZE-1) { |i|
435
- if @file.read(3) == "\xFF\xFF\xFF"
436
- @databaseType = @file.getc
437
- @databaseType -= 105 if @databaseType >= 106
438
-
439
- if (@databaseType == GEOIP_REGION_EDITION_REV0)
440
- # Region Edition, pre June 2003
441
- @databaseSegments = [ STATE_BEGIN_REV0 ]
442
- elsif (@databaseType == GEOIP_REGION_EDITION_REV1)
443
- # Region Edition, post June 2003
444
- @databaseSegments = [ STATE_BEGIN_REV1 ]
445
- elsif (@databaseType == GEOIP_CITY_EDITION_REV0 ||
446
- @databaseType == GEOIP_CITY_EDITION_REV1 ||
447
- @databaseType == GEOIP_ORG_EDITION ||
448
- @databaseType == GEOIP_ISP_EDITION ||
449
- @databaseType == GEOIP_ASNUM_EDITION)
450
- # City/Org Editions have two segments, read offset of second segment
451
- @databaseSegments = [ 0 ]
452
- sr = @file.read(3).unpack("C*")
453
- @databaseSegments[0] += le_to_ui(sr)
454
-
455
- if (@databaseType == GEOIP_ORG_EDITION ||
456
- @databaseType == GEOIP_ISP_EDITION)
457
- @record_length = 4
458
- end
459
- end
460
- break
461
-
462
- else
463
- @file.seek(-4, IO::SEEK_CUR)
464
- end
465
- }
466
- if (@databaseType == GEOIP_COUNTRY_EDITION ||
467
- @databaseType == GEOIP_PROXY_EDITION ||
468
- @databaseType == GEOIP_NETSPEED_EDITION)
469
- @databaseSegments = [ COUNTRY_BEGIN ]
470
- end
429
+ @flags = flags
430
+ @databaseType = GEOIP_COUNTRY_EDITION
431
+ @record_length = STANDARD_RECORD_LENGTH
432
+ @file = File.open(filename, 'rb')
433
+ @file.seek(-3, IO::SEEK_END)
434
+ 0.upto(STRUCTURE_INFO_MAX_SIZE-1) { |i|
435
+ if @file.read(3) == "\xFF\xFF\xFF"
436
+ @databaseType = @file.getc
437
+ @databaseType -= 105 if @databaseType >= 106
438
+
439
+ if (@databaseType == GEOIP_REGION_EDITION_REV0)
440
+ # Region Edition, pre June 2003
441
+ @databaseSegments = [ STATE_BEGIN_REV0 ]
442
+ elsif (@databaseType == GEOIP_REGION_EDITION_REV1)
443
+ # Region Edition, post June 2003
444
+ @databaseSegments = [ STATE_BEGIN_REV1 ]
445
+ elsif (@databaseType == GEOIP_CITY_EDITION_REV0 ||
446
+ @databaseType == GEOIP_CITY_EDITION_REV1 ||
447
+ @databaseType == GEOIP_ORG_EDITION ||
448
+ @databaseType == GEOIP_ISP_EDITION ||
449
+ @databaseType == GEOIP_ASNUM_EDITION)
450
+ # City/Org Editions have two segments, read offset of second segment
451
+ @databaseSegments = [ 0 ]
452
+ sr = @file.read(3).unpack("C*")
453
+ @databaseSegments[0] += le_to_ui(sr)
454
+
455
+ if (@databaseType == GEOIP_ORG_EDITION ||
456
+ @databaseType == GEOIP_ISP_EDITION)
457
+ @record_length = 4
458
+ end
459
+ end
460
+ break
461
+
462
+ else
463
+ @file.seek(-4, IO::SEEK_CUR)
464
+ end
465
+ }
466
+ if (@databaseType == GEOIP_COUNTRY_EDITION ||
467
+ @databaseType == GEOIP_PROXY_EDITION ||
468
+ @databaseType == GEOIP_NETSPEED_EDITION)
469
+ @databaseSegments = [ COUNTRY_BEGIN ]
470
+ end
471
471
  end
472
472
 
473
473
  # Search the GeoIP database for the specified host, returning country info
@@ -483,32 +483,32 @@ class GeoIP
483
483
  # * The two-character continent code
484
484
  #
485
485
  def country(hostname)
486
- if (@databaseType == GEOIP_CITY_EDITION_REV0 ||
487
- @databaseType == GEOIP_CITY_EDITION_REV1)
488
- return city(hostname)
489
- end
490
-
491
- ip = hostname
492
- if ip.kind_of?(String) && ip !~ /^[0-9.]*$/
493
- # Lookup IP address, we were given a name
494
- ip = IPSocket.getaddress(hostname)
495
- end
496
-
497
- # Convert numeric IP address to an integer
498
- ipnum = iptonum(ip)
499
- if (@databaseType != GEOIP_COUNTRY_EDITION &&
500
- @databaseType != GEOIP_PROXY_EDITION &&
501
- @databaseType != GEOIP_NETSPEED_EDITION)
502
- throw "Invalid GeoIP database type, can't look up Country by IP"
503
- end
504
- code = seek_record(ipnum) - COUNTRY_BEGIN;
505
- [ hostname, # Requested hostname
506
- ip, # Ip address as dotted quad
507
- code, # GeoIP's country code
508
- CountryCode[code], # ISO3166-1 code
509
- CountryCode3[code], # ISO3166-2 code
510
- CountryName[code], # Country name, per IS03166
511
- CountryContinent[code] ] # Continent code.
486
+ if (@databaseType == GEOIP_CITY_EDITION_REV0 ||
487
+ @databaseType == GEOIP_CITY_EDITION_REV1)
488
+ return city(hostname)
489
+ end
490
+
491
+ ip = hostname
492
+ if ip.kind_of?(String) && ip !~ /^[0-9.]*$/
493
+ # Lookup IP address, we were given a name
494
+ ip = IPSocket.getaddress(hostname)
495
+ end
496
+
497
+ # Convert numeric IP address to an integer
498
+ ipnum = iptonum(ip)
499
+ if (@databaseType != GEOIP_COUNTRY_EDITION &&
500
+ @databaseType != GEOIP_PROXY_EDITION &&
501
+ @databaseType != GEOIP_NETSPEED_EDITION)
502
+ throw "Invalid GeoIP database type, can't look up Country by IP"
503
+ end
504
+ code = seek_record(ipnum) - COUNTRY_BEGIN;
505
+ [ hostname, # Requested hostname
506
+ ip, # Ip address as dotted quad
507
+ code, # GeoIP's country code
508
+ CountryCode[code], # ISO3166-1 code
509
+ CountryCode3[code], # ISO3166-2 code
510
+ CountryName[code], # Country name, per IS03166
511
+ CountryContinent[code] ] # Continent code.
512
512
  end
513
513
 
514
514
  # Search the GeoIP database for the specified host, returning city info
@@ -525,29 +525,29 @@ class GeoIP
525
525
  private
526
526
 
527
527
  def read_city(pos, hostname = '', ip = '')
528
- @file.seek(pos + (2*@record_length-1) * @databaseSegments[0])
528
+ @file.seek(pos + (2*@record_length-1) * @databaseSegments[0])
529
529
  return nil if((record = @file.read(FULL_RECORD_LENGTH)).nil?)
530
530
 
531
- # The country code is the first byte:
532
- code = record[0]
533
- record = record[1..-1]
531
+ # The country code is the first byte:
532
+ code = record[0]
533
+ record = record[1..-1]
534
534
  @iter_pos += 1 unless @iter_pos.nil?
535
535
 
536
536
  spl = record.split("\x00", 4)
537
- # Get the region:
537
+ # Get the region:
538
538
  region = spl[0]
539
539
  @iter_pos += (region.size + 1) unless @iter_pos.nil?
540
540
 
541
- # Get the city:
541
+ # Get the city:
542
542
  city = spl[1]
543
543
  @iter_pos += (city.size + 1) unless @iter_pos.nil?
544
544
 
545
- # Get the postal code:
545
+ # Get the postal code:
546
546
  postal_code = spl[2]
547
547
  @iter_pos += (postal_code.size + 1) unless @iter_pos.nil?
548
548
 
549
549
  record = spl[3]
550
- # Get the latitude/longitude:
550
+ # Get the latitude/longitude:
551
551
  if(record && record[0,3]) then
552
552
  latitude = le_to_ui(record[0,3].unpack('C*')) / 10000.0 - 180
553
553
  record = record[3..-1]
@@ -563,30 +563,30 @@ class GeoIP
563
563
  longitude = ''
564
564
  end
565
565
 
566
- us_area_codes = []
566
+ us_area_codes = []
567
567
  if (record &&
568
- record[0,3] &&
569
- @databaseType == GEOIP_CITY_EDITION_REV1 &&
570
- CountryCode[code] == "US") # UNTESTED
571
- dmaarea_combo = le_to_ui(record[0,3].unpack('C*'))
572
- dma_code = dmaarea_combo / 1000;
573
- area_code = dmaarea_combo % 1000;
574
- us_area_codes = [ dma_code, area_code ]
575
- @iter_pos += 3 unless @iter_pos.nil?
576
- end
577
-
578
- [ hostname, # Requested hostname
579
- ip, # Ip address as dotted quad
580
- CountryCode[code], # ISO3166-1 code
581
- CountryCode3[code], # ISO3166-2 code
582
- CountryName[code], # Country name, per IS03166
583
- CountryContinent[code], # Continent code.
584
- region, # Region name
585
- city, # City name
586
- postal_code, # Postal code
587
- latitude,
588
- longitude,
589
- ] + us_area_codes
568
+ record[0,3] &&
569
+ @databaseType == GEOIP_CITY_EDITION_REV1 &&
570
+ CountryCode[code] == "US") # UNTESTED
571
+ dmaarea_combo = le_to_ui(record[0,3].unpack('C*'))
572
+ dma_code = dmaarea_combo / 1000;
573
+ area_code = dmaarea_combo % 1000;
574
+ us_area_codes = [ dma_code, area_code ]
575
+ @iter_pos += 3 unless @iter_pos.nil?
576
+ end
577
+
578
+ [ hostname, # Requested hostname
579
+ ip, # Ip address as dotted quad
580
+ CountryCode[code], # ISO3166-1 code
581
+ CountryCode3[code], # ISO3166-2 code
582
+ CountryName[code], # Country name, per IS03166
583
+ CountryContinent[code], # Continent code.
584
+ region, # Region name
585
+ city, # City name
586
+ postal_code, # Postal code
587
+ latitude,
588
+ longitude,
589
+ ] + us_area_codes
590
590
  end
591
591
 
592
592
  public
@@ -626,6 +626,37 @@ class GeoIP
626
626
  read_city(pos, hostname, ip)
627
627
  end
628
628
 
629
+ # Search a ISP GeoIP database for the specified host, returning the ISP
630
+ #
631
+ # +hostname+ is a String holding the host's DNS name or numeric IP address.
632
+ # Return the ISP name
633
+ #
634
+ def isp(hostname)
635
+ ip = hostname
636
+ if ip.kind_of?(String) && ip !~ /^[0-9.]*$/
637
+ # Lookup IP address, we were given a name
638
+ ip = IPSocket.getaddress(hostname)
639
+ end
640
+
641
+ # Convert numeric IP address to an integer
642
+ ipnum = iptonum(ip)
643
+ if @databaseType != GEOIP_ISP_EDITION then
644
+ throw "Invalid GeoIP database type, can't look up Organization/ISP by IP"
645
+ end
646
+ pos = seek_record(ipnum);
647
+ @file.seek(pos + (2*@record_length-1) * @databaseSegments[0])
648
+ record = @file.read(MAX_ORG_RECORD_LENGTH)
649
+ record = record.sub(/\000.*/, '')
650
+ record
651
+ end
652
+
653
+ # Search a ISP GeoIP database for the specified host, returning the organization
654
+ #
655
+ # +hostname+ is a String holding the host's DNS name or numeric IP address.
656
+ # Return the organization associated with it
657
+ #
658
+ alias_method(:organization, :isp) # Untested, according to Maxmind docs this should work
659
+
629
660
  # Iterate through a GeoIP city database
630
661
  def each
631
662
  if (@databaseType != GEOIP_CITY_EDITION_REV0 &&
@@ -644,39 +675,39 @@ class GeoIP
644
675
  end
645
676
 
646
677
  private
647
- def iptonum(ip) # Convert numeric IP address to integer
648
- if ip.kind_of?(String) &&
649
- ip =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/
650
- ip = be_to_ui(Regexp.last_match().to_a.slice(1..4))
651
- end
652
- ip
678
+ def iptonum(ip) # Convert numeric IP address to integer
679
+ if ip.kind_of?(String) &&
680
+ ip =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/
681
+ ip = be_to_ui(Regexp.last_match().to_a.slice(1..4))
682
+ end
683
+ ip
653
684
  end
654
685
 
655
686
  def seek_record(ipnum)
656
- # Binary search in the file.
657
- # Records are pairs of little-endian integers, each of @record_length.
658
- offset = 0
687
+ # Binary search in the file.
688
+ # Records are pairs of little-endian integers, each of @record_length.
689
+ offset = 0
659
690
  mask = 0x80000000
660
- 31.downto(0) { |depth|
661
- @file.seek(@record_length * 2 * offset);
691
+ 31.downto(0) { |depth|
692
+ @file.seek(@record_length * 2 * offset);
662
693
  buf = @file.read(@record_length * 2);
663
- buf.slice!(0...@record_length) if ((ipnum & mask) != 0)
664
- offset = le_to_ui(buf[0...@record_length].unpack("C*"))
665
- return offset if (offset >= @databaseSegments[0])
694
+ buf.slice!(0...@record_length) if ((ipnum & mask) != 0)
695
+ offset = le_to_ui(buf[0...@record_length].unpack("C*"))
696
+ return offset if (offset >= @databaseSegments[0])
666
697
  mask >>= 1
667
- }
698
+ }
668
699
  end
669
700
 
670
701
  # Convert a big-endian array of numeric bytes to unsigned int
671
702
  def be_to_ui(s)
672
- s.inject(0) { |m, o|
703
+ s.inject(0) { |m, o|
673
704
  (m << 8) + o.to_i
674
- }
705
+ }
675
706
  end
676
707
 
677
708
  # Same for little-endian
678
709
  def le_to_ui(s)
679
- be_to_ui(s.reverse)
710
+ be_to_ui(s.reverse)
680
711
  end
681
712
  end
682
713
 
data/lib/geoip/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Geoip #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 6
5
- TINY = 1
4
+ MINOR = 7
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/script/destroy CHANGED
File without changes
data/script/generate CHANGED
File without changes
data/script/txt2html CHANGED
File without changes
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>geoip</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/geoip"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/geoip" class="numbers">0.6.1</a>
36
+ <a href="http://rubyforge.org/projects/geoip" class="numbers">0.7.0</a>
37
37
  </div>
38
38
  <h2>&#x2192; &#8216;Geographic info for an IP address&#8217;</h2>
39
39
 
metadata CHANGED
@@ -1,33 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: geoip
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.6.1
7
- date: 2008-03-11 00:00:00 +11:00
8
- summary: description of gem
9
- require_paths:
10
- - lib
11
- email: cjheath@rubyforge.org
12
- homepage: http://geoip.rubyforge.org
13
- rubyforge_project: geoip
14
- description: description of gem
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.7.0
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Clifford Heath
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-03 00:00:00 +10:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: description of gem
17
+ email: cjheath@rubyforge.org
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - History.txt
24
+ - License.txt
25
+ - Manifest.txt
26
+ - README.txt
27
+ - website/index.txt
31
28
  files:
32
29
  - History.txt
33
30
  - License.txt
@@ -53,23 +50,33 @@ files:
53
50
  - website/javascripts/rounded_corners_lite.inc.js
54
51
  - website/stylesheets/screen.css
55
52
  - website/template.rhtml
56
- test_files:
57
- - test/test_geoip.rb
58
- - test/test_helper.rb
53
+ has_rdoc: true
54
+ homepage: http://geoip.rubyforge.org
55
+ post_install_message:
59
56
  rdoc_options:
60
57
  - --main
61
58
  - README.txt
62
- extra_rdoc_files:
63
- - History.txt
64
- - License.txt
65
- - Manifest.txt
66
- - README.txt
67
- - website/index.txt
68
- executables: []
69
-
70
- extensions: []
71
-
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
72
73
  requirements: []
73
74
 
74
- dependencies: []
75
-
75
+ rubyforge_project: geoip
76
+ rubygems_version: 1.1.0
77
+ signing_key:
78
+ specification_version: 2
79
+ summary: description of gem
80
+ test_files:
81
+ - test/test_geoip.rb
82
+ - test/test_helper.rb