sxgeo 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/README.md +6 -22
- data/Rakefile +2 -0
- data/lib/sxgeo.rb +21 -26
- data/lib/sxgeo/version.rb +1 -1
- data/spec/spec_helper.rb +9 -0
- data/spec/sxgeo_spec.rb +30 -0
- data/sxgeo.gemspec +4 -0
- metadata +56 -11
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cd697929b9ddf5145222d67da7902bfc90d3b9d5
|
4
|
+
data.tar.gz: 6db4e7baa20ab14f230e90034a42813d1ac26054
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7233b86e15438ac02be0bb98a9dcd7ea3537563e748d969497626a39b5c639093edd80054aa924d1c1dd8ebc5385c3ddcf52fbb50e4e75feb8824e0ad4494eed
|
7
|
+
data.tar.gz: 866fcd43728e09f9a99167aa6ef61d97151870705d1cb63964ec4fe06a60450448c35b8abe7a864bce23d31c266f917a93b50d7c5d599b1ea078157805d5e5ef
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/README.md
CHANGED
@@ -1,29 +1,13 @@
|
|
1
1
|
# Sxgeo
|
2
2
|
|
3
|
-
|
3
|
+
Порт Sypex Geo 2.1 - PHP класса для определение местоположения по IP-адресу заточенный для России.
|
4
4
|
|
5
|
-
|
5
|
+
Гем содержит в себе бинарный файл БД по городам городов.
|
6
6
|
|
7
|
-
|
7
|
+
Пример использования:
|
8
8
|
|
9
|
-
|
9
|
+
SxGeo.new.get(ip)['city'].force_encoding('UTF-8')
|
10
10
|
|
11
|
-
|
11
|
+
Еще примеры http://sypexgeo.net/ru/docs/
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
Or install it yourself as:
|
16
|
-
|
17
|
-
$ gem install sxgeo
|
18
|
-
|
19
|
-
## Usage
|
20
|
-
|
21
|
-
TODO: Write usage instructions here
|
22
|
-
|
23
|
-
## Contributing
|
24
|
-
|
25
|
-
1. Fork it
|
26
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
13
|
+
batch mode пока не работает.
|
data/Rakefile
CHANGED
data/lib/sxgeo.rb
CHANGED
@@ -5,8 +5,9 @@ class SxGeo
|
|
5
5
|
SXGEO_FILE = 0
|
6
6
|
SXGEO_MEMORY = 1
|
7
7
|
SXGEO_BATCH = 2
|
8
|
+
SXGEO_CITY_FILE = File.dirname(__FILE__) + "/sxgeo/SxGeoCity.dat"
|
8
9
|
|
9
|
-
def initialize (db_file =
|
10
|
+
def initialize (db_file = SXGEO_CITY_FILE, mode = SXGEO_FILE)
|
10
11
|
@cc2iso = [
|
11
12
|
'', 'AP', 'EU', 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AN', 'AO', 'AQ',
|
12
13
|
'AR', 'AS', 'AT', 'AU', 'AW', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH',
|
@@ -30,8 +31,8 @@ class SxGeo
|
|
30
31
|
'AX', 'GG', 'IM', 'JE', 'BL', 'MF'
|
31
32
|
]
|
32
33
|
|
33
|
-
@batch_mode =
|
34
|
-
@memory_mode =
|
34
|
+
@batch_mode = 0
|
35
|
+
@memory_mode = 0
|
35
36
|
@debug_mode = false
|
36
37
|
|
37
38
|
@fh = File.open(db_file, 'rb')
|
@@ -45,14 +46,14 @@ class SxGeo
|
|
45
46
|
@b_idx_str = @fh.read @b_idx_len * 4
|
46
47
|
@m_idx_str = @fh.read @m_idx_len * 4
|
47
48
|
@block_len = 3 + @id_len;
|
48
|
-
@batch_mode =
|
49
|
-
@memory_mode =
|
49
|
+
@batch_mode = mode & SXGEO_BATCH
|
50
|
+
@memory_mode = mode & SXGEO_MEMORY
|
50
51
|
@db_begin = @fh.tell
|
51
|
-
if
|
52
|
+
if @batch_mode != 0
|
52
53
|
@b_idx_arr = @b_idx_str.unpack("N*")
|
53
54
|
@m_idx_arr = @m_idx_str.scan(/.{1,4}/)
|
54
55
|
end
|
55
|
-
if
|
56
|
+
if @memory_mode != 0
|
56
57
|
@db = @fh.read @db_items * @block_len
|
57
58
|
@regions_db = @fh.read @region_size
|
58
59
|
@cities_db = @fh.read @city_size
|
@@ -72,7 +73,7 @@ class SxGeo
|
|
72
73
|
max = offset
|
73
74
|
end
|
74
75
|
end
|
75
|
-
while ipn > @m_idx_arr[min] && min < max
|
76
|
+
while (ipn > @m_idx_arr[min]) && (min < max)
|
76
77
|
min+=1
|
77
78
|
end
|
78
79
|
else
|
@@ -121,12 +122,11 @@ class SxGeo
|
|
121
122
|
# if ip1n == 0 || ip1n == 10 || ip1n == 127 || ip1n >= @b_idx_len || false === (ipn = ip2long(ip)) # TODO
|
122
123
|
# return false
|
123
124
|
# end
|
124
|
-
# binding.pry
|
125
125
|
ipn = [ipn].pack 'N'
|
126
126
|
@ip1c = ip1n.chr
|
127
127
|
# Находим блок данных индексе первых байт
|
128
128
|
blocks = {}
|
129
|
-
if @batch_mode
|
129
|
+
if @batch_mode != 0
|
130
130
|
blocks = {'min' => @b_idx_arr[ip1n.to_i-1], 'max' => @b_idx_arr[ip1n.to_i]}
|
131
131
|
else
|
132
132
|
blocks['min'], blocks['max'] = @b_idx_str[(ip1n - 1) * 4, (ip1n - 1) * 4+8].unpack 'NN'
|
@@ -143,8 +143,7 @@ class SxGeo
|
|
143
143
|
max = blocks['max'] if max > blocks['max']
|
144
144
|
len = max - min
|
145
145
|
# Находим нужный диапазон в БД
|
146
|
-
if @memory_mode
|
147
|
-
# binding.pry
|
146
|
+
if @memory_mode != 0
|
148
147
|
puts "#{ipn}, #{min}, #{max}" if @debug_mode
|
149
148
|
return search_db(@db, ipn, min, max)
|
150
149
|
else
|
@@ -161,17 +160,8 @@ class SxGeo
|
|
161
160
|
long
|
162
161
|
end
|
163
162
|
|
164
|
-
# def long2ip(long)
|
165
|
-
# ip = []
|
166
|
-
# 4.times do |i|
|
167
|
-
# ip.push(long.to_i & 255)
|
168
|
-
# long = long.to_i >> 8
|
169
|
-
# end
|
170
|
-
# ip.join(".")
|
171
|
-
# end
|
172
|
-
|
173
163
|
def parseCity(seek)
|
174
|
-
if @memory_mode
|
164
|
+
if @memory_mode != 0
|
175
165
|
raw = @cities_db[seek, @max_city]
|
176
166
|
else
|
177
167
|
@fh.pos = @cities_begin + seek
|
@@ -179,10 +169,15 @@ class SxGeo
|
|
179
169
|
end
|
180
170
|
@city = {}
|
181
171
|
@city['regid'], @city['cc'],
|
182
|
-
@city['
|
172
|
+
@city['fips'], @city['lat'], @city['lon'] = raw.unpack 'NCa2NN'
|
183
173
|
@city['country'] = @cc2iso[@city['cc']];
|
184
|
-
|
185
|
-
|
174
|
+
|
175
|
+
# convert unsigned int32 to signed int32
|
176
|
+
@city['lat'] -= 0xFFFF_FFFF if @city['lat'] >= 0x8000_0000
|
177
|
+
@city['lon'] -= 0xFFFF_FFFF if @city['lon'] >= 0x8000_0000
|
178
|
+
|
179
|
+
@city['lat'] /= 1000000.0;
|
180
|
+
@city['lon'] /= 1000000.0;
|
186
181
|
@city['city'] = raw[15,raw.length].split("\0").first
|
187
182
|
return @city;
|
188
183
|
end
|
@@ -234,7 +229,7 @@ class SxGeo
|
|
234
229
|
'Pacific/Auckland', 'Pacific/Chatham', 'Pacific/Efate', 'Pacific/Fiji', 'Pacific/Galapagos', 'Pacific/Guadalcanal', 'Pacific/Honolulu',
|
235
230
|
'Pacific/Port_Moresby' ]
|
236
231
|
if region_seek > 0
|
237
|
-
if @memory_mode
|
232
|
+
if @memory_mode != 0
|
238
233
|
region = @regions_db[region_seek, @max_region].split "\0"
|
239
234
|
else
|
240
235
|
@fh.pos = @info['regions_begin'] + region_seek
|
data/lib/sxgeo/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
data/spec/sxgeo_spec.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SxGeo do
|
4
|
+
it 'works in normal mode' do
|
5
|
+
SxGeo.new.get('87.250.250.203')['city'].force_encoding('UTF-8').should == 'Москва'
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'works in batch mode' do
|
9
|
+
pending 'Batch mode not work yet'
|
10
|
+
sxgeo = SxGeo.new SxGeo::SXGEO_CITY_FILE, SxGeo::SXGEO_BATCH
|
11
|
+
sxgeo.get('87.250.250.203')['city'].force_encoding('UTF-8').should == 'Москва'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'works in memory mode' do
|
15
|
+
sxgeo = SxGeo.new SxGeo::SXGEO_CITY_FILE, SxGeo::SXGEO_MEMORY
|
16
|
+
sxgeo.get('87.250.250.203')['city'].force_encoding('UTF-8').should == 'Москва'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'works in batch and memory modes' do
|
20
|
+
pending 'Batch mode not work yet'
|
21
|
+
sxgeo = SxGeo.new SxGeo::SXGEO_CITY_FILE, SxGeo::SXGEO_BATCH | SxGeo::SXGEO_MEMORY
|
22
|
+
sxgeo.get('87.250.250.203')['city'].force_encoding('UTF-8').should == 'Москва'
|
23
|
+
end
|
24
|
+
|
25
|
+
it '.ip2long works well' do
|
26
|
+
sxgeo = SxGeo.new
|
27
|
+
sxgeo.ip2long('87.250.250.203').should == 1476065995
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/sxgeo.gemspec
CHANGED
@@ -15,4 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
17
|
gem.require_paths = ["lib"]
|
18
|
+
|
19
|
+
gem.add_development_dependency "rspec-core", "~> 2.0"
|
20
|
+
gem.add_development_dependency "rspec-expectations", "~> 2.0"
|
21
|
+
gem.add_development_dependency "rr", "~> 1.0"
|
18
22
|
end
|
metadata
CHANGED
@@ -1,16 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sxgeo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- nleo
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
11
|
+
date: 2014-03-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec-core
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec-expectations
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rr
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
14
55
|
description: Sypex Geo port
|
15
56
|
email:
|
16
57
|
executables: []
|
@@ -18,6 +59,7 @@ extensions: []
|
|
18
59
|
extra_rdoc_files: []
|
19
60
|
files:
|
20
61
|
- .gitignore
|
62
|
+
- .rspec
|
21
63
|
- Gemfile
|
22
64
|
- LICENSE.txt
|
23
65
|
- README.md
|
@@ -25,29 +67,32 @@ files:
|
|
25
67
|
- lib/sxgeo.rb
|
26
68
|
- lib/sxgeo/SxGeoCity.dat
|
27
69
|
- lib/sxgeo/version.rb
|
70
|
+
- spec/spec_helper.rb
|
71
|
+
- spec/sxgeo_spec.rb
|
28
72
|
- sxgeo.gemspec
|
29
73
|
homepage: https://github.com/nleo/sxgeo
|
30
74
|
licenses: []
|
75
|
+
metadata: {}
|
31
76
|
post_install_message:
|
32
77
|
rdoc_options: []
|
33
78
|
require_paths:
|
34
79
|
- lib
|
35
80
|
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
-
none: false
|
37
81
|
requirements:
|
38
|
-
- -
|
82
|
+
- - '>='
|
39
83
|
- !ruby/object:Gem::Version
|
40
84
|
version: '0'
|
41
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
86
|
requirements:
|
44
|
-
- -
|
87
|
+
- - '>='
|
45
88
|
- !ruby/object:Gem::Version
|
46
89
|
version: '0'
|
47
90
|
requirements: []
|
48
91
|
rubyforge_project:
|
49
|
-
rubygems_version:
|
92
|
+
rubygems_version: 2.2.1
|
50
93
|
signing_key:
|
51
|
-
specification_version:
|
94
|
+
specification_version: 4
|
52
95
|
summary: Sypex Geo port
|
53
|
-
test_files:
|
96
|
+
test_files:
|
97
|
+
- spec/spec_helper.rb
|
98
|
+
- spec/sxgeo_spec.rb
|