ip_locator_cn 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a6d59b99c393a70bc272fb7d6a9af22488f358aff70803fa8edc5ef6a2cd1bc
4
- data.tar.gz: 3f35ee0f891112133baa58a3938e6d2a199296e40bf21c442b34204dd49ecdf2
3
+ metadata.gz: d7a329456174c6d309051f83b38dce8004116c4e86ef6c6c9c7e816cdee527cc
4
+ data.tar.gz: ab81c58038e50b9d85bc75853c5670bab3bcee8c537b4de5f692721bc310559b
5
5
  SHA512:
6
- metadata.gz: 2bea475014d0f4ad880129b10a8c39dd6e1f930ea4ce92892713bef024160f0ef8ad7804011807bff06b403fbf1dcff27a27b74cd9f471377a0d206002f04fb9
7
- data.tar.gz: d3847a4a344ae42069c5f4a981d21169fdeb231c4b332e606f864efe5b60779c5f76903e7380f1c1605e6524953fe8a346bfaca344f17a95da4ee850456e6a62
6
+ metadata.gz: 5c76128be6fe760277a4734def75823063827c775c172ecad3d7c484c3174a2ac8839baf31fb8a33d86780fcc33cec3556ade86b84f57e8a831d090843e43c3f
7
+ data.tar.gz: ee5994b55c2b0ddcab0a2dc509e241f797f05d239d2492fbbe79098f21e149df407e37cb80ae2e2e74ce0007ee1d7bf5c9856a9ed51df1d2fedfa3391b6f87df
data/.gitignore CHANGED
@@ -6,6 +6,6 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
-
9
+ /*.gem
10
10
  # rspec failure tracking
11
11
  .rspec_status
data/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ Style/ExpandPathArguments:
2
+ Enabled: false
3
+ Layout/SpaceAroundEqualsInParameterDefault:
4
+ Enabled: false
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in ip_locator_cn.gemspec
6
6
  gemspec
data/Gemfile.lock CHANGED
@@ -1,12 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ip_locator_cn (0.1.0)
4
+ ip_locator_cn (0.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  diff-lcs (1.3)
10
+ docile (1.3.1)
11
+ json (2.2.0)
10
12
  rake (10.5.0)
11
13
  rspec (3.8.0)
12
14
  rspec-core (~> 3.8.0)
@@ -21,6 +23,11 @@ GEM
21
23
  diff-lcs (>= 1.2.0, < 2.0)
22
24
  rspec-support (~> 3.8.0)
23
25
  rspec-support (3.8.0)
26
+ simplecov (0.16.1)
27
+ docile (~> 1.1)
28
+ json (>= 1.8, < 3)
29
+ simplecov-html (~> 0.10.0)
30
+ simplecov-html (0.10.2)
24
31
 
25
32
  PLATFORMS
26
33
  ruby
@@ -30,6 +37,7 @@ DEPENDENCIES
30
37
  ip_locator_cn!
31
38
  rake (~> 10.0)
32
39
  rspec (~> 3.0)
40
+ simplecov (~> 0.16.1)
33
41
 
34
42
  BUNDLED WITH
35
43
  1.16.6
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
- # IpLocatorCn
1
+ # IP Locator CN
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ip_locator_cn`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ 基于纯真 IP 库解析中国的 IP,参考了“[纯真数据库自动更新原理](https://github.com/shuax/QQWryUpdate/blob/master/update.php)” “[PHP 版本的 IP 搜索源码](https://github.com/itbdw/ip-database/blob/master/src/IpLocation.php)”
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,42 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ Gem 包集成的 qqwry.dat 数据库解析 IP:
24
+
25
+ ```ruby
26
+ 2.4.5 :001 > require 'ip_locator_cn'
27
+ => true
28
+ 2.4.5 :002 > IpLocatorCn.resolve('60.195.153.98')
29
+ => {:province=>"北京", :city=>"顺义区", :country=>"中国", :ip=>"60.195.153.98", :county=>"", :isp=>"", :area=>"中国北京顺义区后沙峪金龙网吧", :origin_country=>"北京市顺义区", :origin_area=>"后沙峪金龙网吧"}
30
+ ```
31
+
32
+ 在线下载并解码 qqwry.dat ,然后解析 IP:
33
+
34
+ ```ruby
35
+ 2.4.5 :001 > require 'ip_locator_cn'
36
+ => true
37
+ 2.4.5 :002 > IpLocatorCn.resolve('60.195.153.98', live_dat: true)
38
+ => {:province=>"北京", :city=>"顺义区", :country=>"中国", :ip=>"60.195.153.98", :county=>"", :isp=>"", :area=>"中国北京顺义区后沙峪金龙网吧", :origin_country=>"北京市顺义区", :origin_area=>"后沙峪金龙网吧"}
39
+ ```
40
+
41
+ 开启调试信息:
42
+
43
+ ```ruby
44
+ 2.4.5 :001 > require 'ip_locator_cn'
45
+ => true
46
+ 2.4.5 :002 > IpLocatorCn.resolve('60.195.153.98', live_dat: true, debug: true)
47
+ [2019-03-01 17:37:46 +0800] => downloading http://update.cz88.net/ip/copywrite.rar
48
+ [2019-03-01 17:37:46 +0800] => downloading http://update.cz88.net/ip/qqwry.rar
49
+ [2019-03-01 17:37:49 +0800] => qqwry decoding key is 225
50
+ [2019-03-01 17:37:49 +0800] => total ip ranges: 472217
51
+ [2019-03-01 17:37:53 +0800] => pos is 6658343
52
+ [2019-03-01 17:37:53 +0800] => begin_ip is 60.195.153.0
53
+ [2019-03-01 17:37:53 +0800] => endip is 60.195.153.255
54
+ [2019-03-01 17:37:53 +0800] => offset is 696416
55
+ [2019-03-01 17:37:53 +0800] => country is 北京市顺义区
56
+ [2019-03-01 17:37:53 +0800] => area is 后沙峪金龙网吧
57
+ => {:province=>"北京", :city=>"顺义区", :country=>"中国", :ip=>"60.195.153.98", :county=>"", :isp=>"", :area=>"中国北京顺义区后沙峪金龙网吧", :origin_country=>"北京市顺义区", :origin_area=>"后沙峪金龙网吧"}
58
+ ```
26
59
 
27
60
  ## Development
28
61
 
@@ -34,6 +67,12 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
34
67
 
35
68
  Bug reports and pull requests are welcome on GitHub at https://github.com/xiaohui-zhangxh/ip_locator_cn.
36
69
 
70
+ ### Test
71
+
72
+ ```bash
73
+ bundle exec rspec
74
+ ```
75
+
37
76
  ## License
38
77
 
39
78
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "ip_locator_cn"
3
+ require 'bundler/setup'
4
+ require 'ip_locator_cn'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "ip_locator_cn"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start(__FILE__)
@@ -1,42 +1,42 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "ip_locator_cn/version"
3
+ require 'ip_locator_cn/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "ip_locator_cn"
6
+ spec.name = 'ip_locator_cn'
8
7
  spec.version = IpLocatorCn::VERSION
9
- spec.authors = ["xiaohui"]
10
- spec.email = ["xiaohui@tanmer.com"]
8
+ spec.authors = ['xiaohui']
9
+ spec.email = ['xiaohui@tanmer.com']
11
10
 
12
- spec.summary = %q{Resolve IP info in China}
13
- spec.description = %q{Resolve IP with qqwry.data, can download qqwry.data on the air.}
14
- spec.homepage = "https://github.com/xiaohui-zhangxh/"
15
- spec.license = "MIT"
11
+ spec.summary = 'Resolve IP info in China'
12
+ spec.description = 'Resolve IP with qqwry.data, can download qqwry.data on the air.'
13
+ spec.homepage = 'https://github.com/xiaohui-zhangxh/'
14
+ spec.license = 'MIT'
16
15
 
17
16
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
17
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
18
  if spec.respond_to?(:metadata)
20
19
  # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
21
20
 
22
- spec.metadata["homepage_uri"] = spec.homepage
21
+ spec.metadata['homepage_uri'] = spec.homepage
23
22
  # spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
24
23
  # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
25
24
  else
26
- raise "RubyGems 2.0 or newer is required to protect against " \
27
- "public gem pushes."
25
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
26
+ 'public gem pushes.'
28
27
  end
29
28
 
30
29
  # Specify which files should be added to the gem when it is released.
31
30
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
32
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
31
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
33
32
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
34
33
  end
35
- spec.bindir = "exe"
34
+ spec.bindir = 'exe'
36
35
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
- spec.require_paths = ["lib"]
36
+ spec.require_paths = ['lib']
38
37
 
39
- spec.add_development_dependency "bundler", "~> 1.16"
40
- spec.add_development_dependency "rake", "~> 10.0"
41
- spec.add_development_dependency "rspec", "~> 3.0"
38
+ spec.add_development_dependency 'bundler', '~> 1.16'
39
+ spec.add_development_dependency 'rake', '~> 10.0'
40
+ spec.add_development_dependency 'rspec', '~> 3.0'
41
+ spec.add_development_dependency 'simplecov', '~> 0.16.1'
42
42
  end
@@ -1,10 +1,10 @@
1
1
  module IpLocatorCn
2
2
  class QQWry
3
- CITY_DIRECTLY = [
4
- '北京',
5
- '天津',
6
- '重庆',
7
- '上海',
3
+ CITY_DIRECTLY = %w[
4
+ 北京
5
+ 天津
6
+ 重庆
7
+ 上海
8
8
  ].freeze
9
9
  end
10
10
  end
@@ -1,12 +1,12 @@
1
1
  module IpLocatorCn
2
2
  class QQWry
3
- ISP = [
4
- '联通',
5
- '移动',
6
- '铁通',
7
- '电信',
8
- '长城',
9
- '聚友',
3
+ ISP = %w[
4
+ 联通
5
+ 移动
6
+ 铁通
7
+ 电信
8
+ 长城
9
+ 聚友
10
10
  ].freeze
11
11
  end
12
12
  end
@@ -1,40 +1,40 @@
1
1
  module IpLocatorCn
2
2
  class QQWry
3
- PROVINCES = [
4
- '北京',
5
- '天津',
6
- '重庆',
7
- '上海',
8
- '河北',
9
- '山西',
10
- '辽宁',
11
- '吉林',
12
- '黑龙江',
13
- '江苏',
14
- '浙江',
15
- '安徽',
16
- '福建',
17
- '江西',
18
- '山东',
19
- '河南',
20
- '湖北',
21
- '湖南',
22
- '广东',
23
- '海南',
24
- '四川',
25
- '贵州',
26
- '云南',
27
- '陕西',
28
- '甘肃',
29
- '青海',
30
- '台湾',
31
- '内蒙古',
32
- '广西',
33
- '宁夏',
34
- '新疆',
35
- '西藏',
36
- '香港',
37
- '澳门',
3
+ PROVINCES = %w[
4
+ 北京
5
+ 天津
6
+ 重庆
7
+ 上海
8
+ 河北
9
+ 山西
10
+ 辽宁
11
+ 吉林
12
+ 黑龙江
13
+ 江苏
14
+ 浙江
15
+ 安徽
16
+ 福建
17
+ 江西
18
+ 山东
19
+ 河南
20
+ 湖北
21
+ 湖南
22
+ 广东
23
+ 海南
24
+ 四川
25
+ 贵州
26
+ 云南
27
+ 陕西
28
+ 甘肃
29
+ 青海
30
+ 台湾
31
+ 内蒙古
32
+ 广西
33
+ 宁夏
34
+ 新疆
35
+ 西藏
36
+ 香港
37
+ 澳门
38
38
  ].freeze
39
39
  end
40
40
  end
@@ -4,7 +4,7 @@ require 'ip_locator_cn/qqwry/isp'
4
4
 
5
5
  module IpLocatorCn
6
6
  class QQWry
7
- IP_ENTRY_BYTES = 7.freeze
7
+ IP_ENTRY_BYTES = 7
8
8
 
9
9
  attr_reader :first_ip_pos, :last_ip_pos, :total_ips, :debug
10
10
 
@@ -20,13 +20,15 @@ module IpLocatorCn
20
20
  end
21
21
 
22
22
  # return: <Hash> result
23
- # result['ip'] 输入的ip
24
- # result['country'] 国家 如 中国
25
- # result['province'] 省份信息 如 河北省
26
- # result['city'] 市区 如 邢台市
27
- # result['county'] 郡县 如 威县
28
- # result['isp'] 运营商 如 联通
29
- # result['area'] 最完整的信息 如 中国河北省邢台市威县新科网吧(北外街)
23
+ # result['ip'] 输入的ip
24
+ # result['country'] 国家 如 中国
25
+ # result['province'] 省份信息 如 河北省
26
+ # result['city'] 市区 如 邢台市
27
+ # result['county'] 郡县 如 威县
28
+ # result['isp'] 运营商 如 联通
29
+ # result['area'] 最完整的信息 如 中国河北省邢台市威县新科网吧(北外街)
30
+ # result['origin_country'] 解析之前的原始信息
31
+ # result['origin_area'] 解析之前的原始信息
30
32
  def resolve(ip)
31
33
  location = location_from_ip(ip)
32
34
  extract_location(location[:country]).tap do |result|
@@ -43,6 +45,8 @@ module IpLocatorCn
43
45
  result[:county],
44
46
  location[:area]
45
47
  ].join
48
+ result[:origin_country] = location[:country]
49
+ result[:origin_area] = location[:area]
46
50
  end
47
51
  end
48
52
 
@@ -52,40 +56,40 @@ module IpLocatorCn
52
56
  log "pos is #{pos}"
53
57
  # 用户IP所在范围的开始地址
54
58
  seek(pos)
55
- begin_ip = long2ip(read_ip())
59
+ begin_ip = long2ip(read_ip)
56
60
  log "begin_ip is #{begin_ip}"
57
61
  # 用户IP所在范围的结束地址
58
- offset = getlong3()
62
+ offset = getlong3
59
63
  seek(offset)
60
- endip = long2ip(read_ip())
64
+ endip = long2ip(read_ip)
61
65
  log "endip is #{endip}"
62
66
  log "offset is #{offset}"
63
67
  byte = read(1) # 标志字节
64
68
  case byte.ord
65
69
  when 1
66
70
  # 标志字节为1,表示国家和区域信息都被同时重定向
67
- country_offset = getlong3() # 重定向地址
71
+ country_offset = getlong3 # 重定向地址
68
72
  seek(country_offset)
69
73
  byte = read(1) # 标志字节
70
74
  case byte.ord
71
75
  when 2
72
76
  seek(getlong3)
73
- info[:country] = getstring()
77
+ info[:country] = getstring
74
78
  seek(country_offset + 4)
75
- info[:area] = getarea()
79
+ info[:area] = getarea
76
80
  else
77
81
  info[:country] = getstring(byte)
78
- info[:area] = getarea()
82
+ info[:area] = getarea
79
83
  end
80
84
  when 2
81
85
  # 标志字节为2,表示国家信息被重定向
82
86
  seek(getlong3)
83
- info[:country] = getstring()
87
+ info[:country] = getstring
84
88
  seek(offset + 8)
85
- info[:area] = getarea()
89
+ info[:area] = getarea
86
90
  else
87
91
  info[:country] = getstring(byte)
88
- info[:area] = getarea()
92
+ info[:area] = getarea
89
93
  end
90
94
 
91
95
  info[:country] = encoding_convert(info[:country])
@@ -116,8 +120,8 @@ module IpLocatorCn
116
120
  if str.include?(seperator_sheng)
117
121
  collection[:province], str = str.split(seperator_sheng, 2)
118
122
  else
119
- province = (PROVINCES + CITY_DIRECTLY).find{ |x| str.start_with?(x) }
120
- if x
123
+ province = (PROVINCES + CITY_DIRECTLY).find { |x| str.start_with?(x) }
124
+ if province
121
125
  collection[:province] = province
122
126
  is_city_directly = CITY_DIRECTLY.include?(province)
123
127
  str = str[province.length..-1]
@@ -162,8 +166,8 @@ module IpLocatorCn
162
166
 
163
167
  def live_load_dat
164
168
  require 'open-uri'
165
- copywrite = download(IpLocatorCn.copywrite_url).read and nil
166
- qqwry = download(IpLocatorCn.live_data_url).read.bytes and nil
169
+ (copywrite = download(IpLocatorCn.copywrite_url).read) && nil
170
+ (qqwry = download(IpLocatorCn.live_data_url).read.bytes) && nil
167
171
  key = copywrite.unpack('V6')[5]
168
172
  log "qqwry decoding key is #{key}"
169
173
  (0...0x200).each do |i|
@@ -172,25 +176,26 @@ module IpLocatorCn
172
176
  key &= 0xFF
173
177
  qqwry[i] ^= key
174
178
  end
175
- qqwry = Zlib::Inflate.inflate(qqwry.pack('C*')) and nil
179
+ (qqwry = Zlib::Inflate.inflate(qqwry.pack('C*'))) && nil
176
180
  @io = StringIO.new(qqwry)
177
181
  end
178
182
 
179
183
  def parse_dat_info
180
- @first_ip_pos = getlong4()
181
- @last_ip_pos = getlong4()
184
+ @first_ip_pos = getlong4
185
+ @last_ip_pos = getlong4
182
186
  @total_ips = (last_ip_pos - first_ip_pos) / IP_ENTRY_BYTES
183
187
  log "total ip ranges: #{total_ips}"
184
188
  end
185
189
 
186
190
  def get_isp(str)
187
- ISP.find {|x| str.include?(x)}
191
+ ISP.find { |x| str.include?(x) }
188
192
  end
189
193
 
190
194
  # b-tree search ip from qqwry.dat
191
195
  def locate_ip_pos(ip)
192
196
  x = ip2long(ip)
193
- min, max = 0, total_ips
197
+ min = 0
198
+ max = total_ips
194
199
 
195
200
  while min <= max
196
201
  # b-tree search
@@ -198,14 +203,14 @@ module IpLocatorCn
198
203
  pos = first_ip_pos + i * IP_ENTRY_BYTES
199
204
  seek(pos)
200
205
  # get middle ip
201
- y = read_ip()
206
+ y = read_ip
202
207
  if x < y
203
208
  # user ip < middle ip
204
209
  max = i - 1
205
210
  else
206
211
  # user ip > middle ip, read next ip entry
207
212
  read(3)
208
- y = read_ip()
213
+ y = read_ip
209
214
  if x > y
210
215
  # user ip > next ip
211
216
  min = i + 1
@@ -243,14 +248,14 @@ module IpLocatorCn
243
248
  end
244
249
 
245
250
  def ipparts2long(parts)
246
- 0.upto(3).map{|i| parts[i] << ((3 - i) * 8) }.sum
251
+ 0.upto(3).map { |i| parts[i] << ((3 - i) * 8) }.sum
247
252
  end
248
253
 
249
254
  def long2ip(n)
250
- 0.upto(3).map{|i| (n >> ((3 - i) * 8)) & 0xFF }.join('.')
255
+ 0.upto(3).map { |i| (n >> ((3 - i) * 8)) & 0xFF }.join('.')
251
256
  end
252
257
 
253
- def getstring(data='')
258
+ def getstring(data = '')
254
259
  char = read(1)
255
260
  while char.ord > 0
256
261
  data += char
@@ -267,14 +272,14 @@ module IpLocatorCn
267
272
  return ''
268
273
  when 1, 2
269
274
  seek(getlong3)
270
- return getstring()
275
+ return getstring
271
276
  else
272
277
  return getstring(char)
273
278
  end
274
279
  end
275
280
 
276
281
  def encoding_convert(str)
277
- ec = Encoding::Converter.new("GBK", "UTF-8")
282
+ ec = Encoding::Converter.new('GBK', 'UTF-8')
278
283
  result = ec.convert(str)
279
284
  ec.finish
280
285
  result
@@ -1,3 +1,3 @@
1
1
  module IpLocatorCn
2
- VERSION = "0.1.0"
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/lib/ip_locator_cn.rb CHANGED
@@ -1,5 +1,6 @@
1
- require "ip_locator_cn/version"
1
+ require 'ip_locator_cn/version'
2
2
  require 'ip_locator_cn/qqwry'
3
+
3
4
  module IpLocatorCn
4
5
  # embeded qqwry.dat
5
6
  def self.data_path
@@ -15,7 +16,7 @@ module IpLocatorCn
15
16
  'http://update.cz88.net/ip/copywrite.rar'
16
17
  end
17
18
 
18
- def self.resolve(ip)
19
- QQWry.new(dat_path: data_path).resolve(ip)
19
+ def self.resolve(ip, options={ dat_path: data_path })
20
+ QQWry.new(options).resolve(ip)
20
21
  end
21
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ip_locator_cn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - xiaohui
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-28 00:00:00.000000000 Z
11
+ date: 2019-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.16.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.16.1
55
69
  description: Resolve IP with qqwry.data, can download qqwry.data on the air.
56
70
  email:
57
71
  - xiaohui@tanmer.com
@@ -61,6 +75,7 @@ extra_rdoc_files: []
61
75
  files:
62
76
  - ".gitignore"
63
77
  - ".rspec"
78
+ - ".rubocop.yml"
64
79
  - ".travis.yml"
65
80
  - Gemfile
66
81
  - Gemfile.lock