rs_ipgeobase_mongoid 1.0.1
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/.gitignore +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +43 -0
- data/README.rdoc +53 -0
- data/Rakefile +3 -0
- data/app/models/ipgeobase/city.rb +21 -0
- data/app/models/ipgeobase/country.rb +14 -0
- data/app/models/ipgeobase/ip.rb +14 -0
- data/lib/ipgeobase.rb +30 -0
- data/lib/ipgeobase/engine.rb +5 -0
- data/lib/ipgeobase/railtie.rb +8 -0
- data/lib/ipgeobase/task.rb +19 -0
- data/lib/ipgeobase/tasks.rake +42 -0
- data/lib/ipgeobase/version.rb +3 -0
- data/lib/rs_ipgeobase_mongoid.rb +2 -0
- data/pkg/ipgeobase_mongoid-1.0.0.gem +0 -0
- data/rs_ipgeobase_mongoid.gemspec +25 -0
- data/spec/ipgeobase_spec.rb +19 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/mongoid.yml +8 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ac6984be29eb73ddf56c0b40659f1aa24e2161a6
|
4
|
+
data.tar.gz: 07a6cad165f9e31a983adf9ea9335118b22ae74d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8bb623b4f098fe791b779931c38d5efc7afa20059c671288d470fcd3e8257d60a64017fe19b4b0caf8af147ff7a02f5058185ae865f79e3944ce8c107f70d55e
|
7
|
+
data.tar.gz: fb3867ff850ebb2636369a05769b962c40a7064136e9a6489bf1755644984a45a26ef86be3265c4a26559401ba3dfa9b2f77d11bbb73c0642446ceda752469dd
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/tmp/*
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ipgeobase
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p353
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rs_ipgeobase_mongoid (1.0.0)
|
5
|
+
mongoid (>= 3.0, < 5.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.2.16)
|
11
|
+
activesupport (= 3.2.16)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
activesupport (3.2.16)
|
14
|
+
i18n (~> 0.6, >= 0.6.4)
|
15
|
+
multi_json (~> 1.0)
|
16
|
+
builder (3.0.4)
|
17
|
+
diff-lcs (1.2.5)
|
18
|
+
i18n (0.6.9)
|
19
|
+
mongoid (3.1.6)
|
20
|
+
activemodel (~> 3.2)
|
21
|
+
moped (~> 1.4)
|
22
|
+
origin (~> 1.0)
|
23
|
+
tzinfo (~> 0.3.29)
|
24
|
+
moped (1.5.1)
|
25
|
+
multi_json (1.8.4)
|
26
|
+
origin (1.1.0)
|
27
|
+
rspec (2.14.1)
|
28
|
+
rspec-core (~> 2.14.0)
|
29
|
+
rspec-expectations (~> 2.14.0)
|
30
|
+
rspec-mocks (~> 2.14.0)
|
31
|
+
rspec-core (2.14.7)
|
32
|
+
rspec-expectations (2.14.4)
|
33
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
34
|
+
rspec-mocks (2.14.4)
|
35
|
+
tzinfo (0.3.38)
|
36
|
+
|
37
|
+
PLATFORMS
|
38
|
+
ruby
|
39
|
+
|
40
|
+
DEPENDENCIES
|
41
|
+
bundler (>= 1.0.21)
|
42
|
+
rs_ipgeobase_mongoid!
|
43
|
+
rspec (>= 2.14.0)
|
data/README.rdoc
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
= IPGeoBase
|
2
|
+
|
3
|
+
Russia and Ukraine geoip lookup with DB from http://ipgeobase.ru for Mongoid 3/4
|
4
|
+
|
5
|
+
WARNING: 1.0 breaks backward compatibility. For mongoid 2 use ~> 0
|
6
|
+
|
7
|
+
Гем для работы с архивом с сайта http://ipgeobase.ru, содержащим базу местонахождений российских и украинских ip-адресов (с точностью до города) для MongoDB (Mongoid 3/4).
|
8
|
+
|
9
|
+
== Installation
|
10
|
+
|
11
|
+
Add to Gemfile:
|
12
|
+
|
13
|
+
gem "rs_ipgeobase_mongoid"
|
14
|
+
|
15
|
+
Install required gems:
|
16
|
+
|
17
|
+
bundle install
|
18
|
+
|
19
|
+
== Upload new database
|
20
|
+
|
21
|
+
* Update cities and regions. Downloads file if it's not present in tmp/cities.txt
|
22
|
+
|
23
|
+
rake ipgeobase:cities
|
24
|
+
|
25
|
+
* city id's are not changed on DB update and can be used as foreign keys
|
26
|
+
|
27
|
+
* Update geo ips. Downloads file if it's not present in tmp/cidr_optim.txt
|
28
|
+
|
29
|
+
rake ipgeobase:ips
|
30
|
+
|
31
|
+
== Methods
|
32
|
+
|
33
|
+
Search for city by IP (Russia and Ukraine only):
|
34
|
+
|
35
|
+
После того, как выполнены все предыдущие шаги можно искать город по IP адресу.
|
36
|
+
|
37
|
+
Работает только для РФ и Украины. Если город не найден, метод вернет nil.
|
38
|
+
|
39
|
+
> geo = Ipgeobase::find_region_by_ip('95.170.177.170')
|
40
|
+
> pp geo
|
41
|
+
=> #<Ipgeobase::City _id: 5059d68ee779891c72000201, _type: nil, geo_id: 1428, city: "Красноярск",
|
42
|
+
region: "Красноярский край", district: "Сибирский федеральный округ", lat: 56.001251, lon: 92.88559,
|
43
|
+
country_id: BSON::ObjectId('5059d68de779891c72000001')>
|
44
|
+
> geo.city
|
45
|
+
=> "Красноярск"
|
46
|
+
> geo.region
|
47
|
+
=> "Красноярский край"
|
48
|
+
> geo.district
|
49
|
+
=> "Сибирский федеральный округ"
|
50
|
+
> geo.country.name
|
51
|
+
=> "Россия"
|
52
|
+
> geo.country.code
|
53
|
+
=> "RU"
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module Ipgeobase
|
3
|
+
class City
|
4
|
+
include Mongoid::Document
|
5
|
+
|
6
|
+
field :geo_id, type: Integer
|
7
|
+
index({geo_id: 1}, {unique: true})
|
8
|
+
|
9
|
+
field :city, type: String
|
10
|
+
field :region, type: String
|
11
|
+
field :district, type: String
|
12
|
+
|
13
|
+
field :lat, type: Float
|
14
|
+
field :lon, type: Float
|
15
|
+
|
16
|
+
belongs_to :country, class_name: 'Ipgeobase::Country'
|
17
|
+
has_many :ips, class_name: 'Ipgeobase::Ip'
|
18
|
+
|
19
|
+
validates_presence_of :city, :country, :geo_id
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Ipgeobase
|
4
|
+
class Ip
|
5
|
+
include Mongoid::Document
|
6
|
+
|
7
|
+
field :start_ip, type: Integer
|
8
|
+
index({start_ip: 1}, {unique: true})
|
9
|
+
field :end_ip, type: Integer
|
10
|
+
|
11
|
+
belongs_to :city, class_name: 'Ipgeobase::City'
|
12
|
+
validates_presence_of :start_ip, :end_ip, :city_id
|
13
|
+
end
|
14
|
+
end
|
data/lib/ipgeobase.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require "ipgeobase/version"
|
4
|
+
require 'ipaddr'
|
5
|
+
|
6
|
+
if defined? Rails::Engine
|
7
|
+
require 'ipgeobase/engine'
|
8
|
+
end
|
9
|
+
|
10
|
+
if defined? Rails::Railtie
|
11
|
+
require 'ipgeobase/railtie'
|
12
|
+
end
|
13
|
+
|
14
|
+
module Ipgeobase
|
15
|
+
class << self
|
16
|
+
def find_region_by_ip(user_ip)
|
17
|
+
long = ip2long(user_ip)
|
18
|
+
ip = Ipgeobase::Ip.where(start_ip: { '$lte' => long }).order_by({ start_ip: -1 }).limit(1).first
|
19
|
+
if ip.nil? or ip.end_ip < long
|
20
|
+
nil
|
21
|
+
else
|
22
|
+
ip.city
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def ip2long(ip)
|
27
|
+
IPAddr.new(ip, Socket::AF_INET).to_i
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Ipgeobase
|
4
|
+
module Task
|
5
|
+
def self.obtain_content_by_filename(filename)
|
6
|
+
if defined? Rails
|
7
|
+
file = ::Rails.root.join('tmp', filename)
|
8
|
+
else
|
9
|
+
file = File.join(File.dirname(__FILE__), '..', '..', 'tmp', filename)
|
10
|
+
end
|
11
|
+
unless File.exist? file
|
12
|
+
puts 'downloading database'
|
13
|
+
url = 'http://ipgeobase.ru/files/db/Main/geo_files.tar.gz'
|
14
|
+
Kernel.system("curl #{url} | tar -xzOf - #{filename} | iconv -f cp1251 -t utf-8 > #{file}")
|
15
|
+
end
|
16
|
+
File.read(file)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require "ipgeobase/task"
|
4
|
+
|
5
|
+
namespace :ipgeobase do
|
6
|
+
desc "Update cities and regions. Downloads file if it's not present in tmp/cities.txt"
|
7
|
+
task :cities => :environment do
|
8
|
+
puts 'updating cities'
|
9
|
+
russia = Ipgeobase::Country.find_or_create_by(name: 'Россия', code: 'RU')
|
10
|
+
ukraine = Ipgeobase::Country.find_or_create_by(name: 'Украина', code: 'UA')
|
11
|
+
content = Ipgeobase::Task.obtain_content_by_filename('cities.txt')
|
12
|
+
content.each_line do |c|
|
13
|
+
options = c.split("\t")
|
14
|
+
country = if options[3].include? "Украина"
|
15
|
+
ukraine
|
16
|
+
else
|
17
|
+
russia
|
18
|
+
end
|
19
|
+
city = Ipgeobase::City.find_or_initialize_by(geo_id: options[0])
|
20
|
+
city.assign_attributes(city: options[1], region: options[2], district: options[3], lat: options[4], lon: options[5], country: country)
|
21
|
+
city.save!
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Update geo ips. Downloads file if it's not present in tmp/cidr_optim.txt"
|
26
|
+
task :ips => :environment do
|
27
|
+
puts 'updating ips'
|
28
|
+
content = Ipgeobase::Task.obtain_content_by_filename('cidr_optim.txt')
|
29
|
+
Ipgeobase::Ip.delete_all
|
30
|
+
content.each_line do |c|
|
31
|
+
options = c.split("\t")
|
32
|
+
next if options.last.to_i.zero?
|
33
|
+
city = Ipgeobase::City.where(geo_id: options.last.strip.to_i).first
|
34
|
+
if city.nil?
|
35
|
+
p "No city"
|
36
|
+
p options
|
37
|
+
next
|
38
|
+
end
|
39
|
+
Ipgeobase::Ip.create(:start_ip => options.first.to_i, :end_ip => options.second.to_i, city_id: city.id)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
Binary file
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
$:.push File.expand_path("../lib", __FILE__)
|
4
|
+
require "ipgeobase/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "rs_ipgeobase_mongoid"
|
8
|
+
s.version = Ipgeobase::VERSION
|
9
|
+
s.authors = ["GlebTv"]
|
10
|
+
s.email = ["glebtv@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/rs-pro/ipgeobase_mongoid"
|
12
|
+
s.description = "IPGeoBase.ru for mongoid 3/4"
|
13
|
+
s.summary = "IPGeoBase.ru for mongoid 3/4"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_runtime_dependency('mongoid', [">= 3.0", "< 5.0"])
|
21
|
+
s.required_ruby_version = '>= 1.9.2'
|
22
|
+
|
23
|
+
s.add_development_dependency(%q<rspec>, [">= 2.14.0"])
|
24
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.21"])
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Ipgeobase do
|
6
|
+
it 'finds city by ip' do
|
7
|
+
geo = Ipgeobase::find_region_by_ip('95.170.177.170')
|
8
|
+
geo.region.should eq 'Красноярский край'
|
9
|
+
geo.country.code.should eq 'RU'
|
10
|
+
end
|
11
|
+
it "doesn't return first or last city on fail" do
|
12
|
+
geo = Ipgeobase::find_region_by_ip('0.0.0.0')
|
13
|
+
geo.should be_nil
|
14
|
+
geo = Ipgeobase::find_region_by_ip('10.0.0.0')
|
15
|
+
geo.should be_nil
|
16
|
+
geo = Ipgeobase::find_region_by_ip('255.255.255.255')
|
17
|
+
geo.should be_nil
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
|
6
|
+
require 'rspec'
|
7
|
+
require 'mongoid'
|
8
|
+
require 'ipgeobase'
|
9
|
+
|
10
|
+
|
11
|
+
# Requires supporting files with custom matchers and macros, etc,
|
12
|
+
# in ./support/ and its subdirectories.
|
13
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
14
|
+
|
15
|
+
Mongoid.configure do |config|
|
16
|
+
ENV["MONGOID_ENV"] = "test"
|
17
|
+
Mongoid.load!("spec/support/mongoid.yml")
|
18
|
+
end
|
19
|
+
|
20
|
+
require File.dirname(__FILE__) + '/../app/models/ipgeobase/city.rb'
|
21
|
+
require File.dirname(__FILE__) + '/../app/models/ipgeobase/country.rb'
|
22
|
+
require File.dirname(__FILE__) + '/../app/models/ipgeobase/ip.rb'
|
23
|
+
|
24
|
+
Ipgeobase::City.create_indexes
|
25
|
+
Ipgeobase::Ip.create_indexes
|
26
|
+
|
27
|
+
require 'rake'
|
28
|
+
app = Rake.application
|
29
|
+
app.init
|
30
|
+
# do this as many times as needed
|
31
|
+
# app.add_import 'lib/ipgeobase/tasks.rake'
|
32
|
+
# this loads the Rakefile and other imports
|
33
|
+
app.load_rakefile
|
34
|
+
app["ipgeobase:cities"].execute
|
35
|
+
moscow_id1 = Ipgeobase::City.where(city: 'Москва').first.id
|
36
|
+
|
37
|
+
app["ipgeobase:cities"].execute
|
38
|
+
moscow_id2 = Ipgeobase::City.where(city: 'Москва').first.id
|
39
|
+
# check that city ids are not changed on reimport
|
40
|
+
raise 'city id changed' if moscow_id1 != moscow_id2
|
41
|
+
|
42
|
+
app["ipgeobase:ips"].execute
|
43
|
+
|
44
|
+
RSpec.configure do |config|
|
45
|
+
config.mock_with :rspec
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rs_ipgeobase_mongoid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- GlebTv
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: mongoid
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
- - <
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '5.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- - <
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 2.14.0
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.14.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.0.21
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.0.21
|
61
|
+
description: IPGeoBase.ru for mongoid 3/4
|
62
|
+
email:
|
63
|
+
- glebtv@gmail.com
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- .gitignore
|
69
|
+
- .ruby-gemset
|
70
|
+
- .ruby-version
|
71
|
+
- Gemfile
|
72
|
+
- Gemfile.lock
|
73
|
+
- README.rdoc
|
74
|
+
- Rakefile
|
75
|
+
- app/models/ipgeobase/city.rb
|
76
|
+
- app/models/ipgeobase/country.rb
|
77
|
+
- app/models/ipgeobase/ip.rb
|
78
|
+
- lib/ipgeobase.rb
|
79
|
+
- lib/ipgeobase/engine.rb
|
80
|
+
- lib/ipgeobase/railtie.rb
|
81
|
+
- lib/ipgeobase/task.rb
|
82
|
+
- lib/ipgeobase/tasks.rake
|
83
|
+
- lib/ipgeobase/version.rb
|
84
|
+
- lib/rs_ipgeobase_mongoid.rb
|
85
|
+
- pkg/ipgeobase_mongoid-1.0.0.gem
|
86
|
+
- rs_ipgeobase_mongoid.gemspec
|
87
|
+
- spec/ipgeobase_spec.rb
|
88
|
+
- spec/spec_helper.rb
|
89
|
+
- spec/support/mongoid.yml
|
90
|
+
- tmp/.gitkeep
|
91
|
+
homepage: https://github.com/rs-pro/ipgeobase_mongoid
|
92
|
+
licenses: []
|
93
|
+
metadata: {}
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.9.2
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 2.1.10
|
111
|
+
signing_key:
|
112
|
+
specification_version: 4
|
113
|
+
summary: IPGeoBase.ru for mongoid 3/4
|
114
|
+
test_files:
|
115
|
+
- spec/ipgeobase_spec.rb
|
116
|
+
- spec/spec_helper.rb
|
117
|
+
- spec/support/mongoid.yml
|