resolver_replace 0.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/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +44 -0
- data/LICENSE.txt +22 -0
- data/README.md +72 -0
- data/Rakefile +14 -0
- data/example/example.rb +11 -0
- data/lib/resolver_replace/plugins/mysql2.rb +15 -0
- data/lib/resolver_replace.rb +102 -0
- data/resolver_replace.gemspec +25 -0
- data/spec/resolver_replace_spec.rb +42 -0
- data/spec/spec_helper.rb +15 -0
- metadata +128 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 13a898dc3155fb550affbfe858cb070d033e2d74
|
4
|
+
data.tar.gz: dcfc046f9e40bade813df3f46715667965e2bf46
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e498affc9788ec2e3bac1dd092d9bac53eceba8a83e925b567537b8fbc7025366777bf55324e186685824f55ae22675328824f9d6530255f1ea5caa0d8be57ab
|
7
|
+
data.tar.gz: f5c747339d275a779a66defce9c1575eef9845afd71353ac2fa64372296237c2bd67d074fab1879ee42fb5c0fc764d2d4704600c21fb9fd3c14a6a43da14df85
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
resolver_replace (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
coderay (1.1.0)
|
10
|
+
diff-lcs (1.2.5)
|
11
|
+
method_source (0.8.2)
|
12
|
+
mysql2 (0.3.16)
|
13
|
+
pry (0.9.12.6)
|
14
|
+
coderay (~> 1.0)
|
15
|
+
method_source (~> 0.8)
|
16
|
+
slop (~> 3.4)
|
17
|
+
pry-nav (0.2.3)
|
18
|
+
pry (~> 0.9.10)
|
19
|
+
rake (10.3.2)
|
20
|
+
rspec (3.0.0)
|
21
|
+
rspec-core (~> 3.0.0)
|
22
|
+
rspec-expectations (~> 3.0.0)
|
23
|
+
rspec-mocks (~> 3.0.0)
|
24
|
+
rspec-core (3.0.2)
|
25
|
+
rspec-support (~> 3.0.0)
|
26
|
+
rspec-expectations (3.0.2)
|
27
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
28
|
+
rspec-support (~> 3.0.0)
|
29
|
+
rspec-mocks (3.0.2)
|
30
|
+
rspec-support (~> 3.0.0)
|
31
|
+
rspec-support (3.0.2)
|
32
|
+
slop (3.5.0)
|
33
|
+
|
34
|
+
PLATFORMS
|
35
|
+
ruby
|
36
|
+
|
37
|
+
DEPENDENCIES
|
38
|
+
bundler (~> 1.6)
|
39
|
+
mysql2
|
40
|
+
pry
|
41
|
+
pry-nav
|
42
|
+
rake
|
43
|
+
resolver_replace!
|
44
|
+
rspec
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Naotoshi Seo
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# resolver-replace
|
2
|
+
|
3
|
+
Replace the DNS resolver.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```bash
|
8
|
+
gem install resolver_replace
|
9
|
+
```
|
10
|
+
|
11
|
+
## How it works
|
12
|
+
|
13
|
+
Ruby comes with a pure Ruby replacement, [resolv-replace](https://github.com/ruby/ruby/blob/b1f2effda85efd03bd4ad5c06e0aae5e14f3f864/lib/resolv-replace.rb).
|
14
|
+
It replaces the libc resolver with the built-in [Resolv](http://apidock.com/ruby/Resolv) class which is a thread-aware DNS resolver library.
|
15
|
+
|
16
|
+
This gem works similarly, but allows to replace the resolver with your favorite resolver.
|
17
|
+
|
18
|
+
## How to use
|
19
|
+
|
20
|
+
For example, if you want to replace the resolver with `Resolv::DNS`, write as followings:
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
require 'resolve' # Resolve::DNS
|
24
|
+
require 'resolver-replace' # ResolverReplace
|
25
|
+
|
26
|
+
resolver = Resolv::DNS.new(:nameserver => ['210.251.121.21'],
|
27
|
+
:search => ['ruby-lang.org'],
|
28
|
+
:ndots => 1)
|
29
|
+
|
30
|
+
ResolverReplace.configure(
|
31
|
+
getaddress: Proc.new {|host| resolver.getaddress(host) },
|
32
|
+
getaddresses: Proc.new {|host| resolver.getaddresses(host) },
|
33
|
+
error_class: Resolv::ResolvError,
|
34
|
+
)
|
35
|
+
```
|
36
|
+
|
37
|
+
## Plugin
|
38
|
+
|
39
|
+
Some gems like `mysql2` implement its connection in its C extension without using ruby library.
|
40
|
+
In such case, another monkeypatch must be applied. A plugin scheme of ResolveReplace is ready for such case.
|
41
|
+
|
42
|
+
The `mysql2` plugin is available for example. Use as followings:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
ResolverReplace.load_plugin('mysql2')
|
46
|
+
ResolverReplace.configure(
|
47
|
+
getaddress: Proc.new {|host| resolver.getaddress(host) },
|
48
|
+
getaddresses: Proc.new {|host| resolver.getaddresses(host) },
|
49
|
+
error_class: Resolv::ResolvError,
|
50
|
+
)
|
51
|
+
```
|
52
|
+
|
53
|
+
## ChangeLog
|
54
|
+
|
55
|
+
See [CHANGELOG.md](CHANGELOG.md) for details.
|
56
|
+
|
57
|
+
## See Also
|
58
|
+
|
59
|
+
* [例えば Resolver をすげかえる - sonots:blog](http://blog.livedoor.jp/sonots/archives/38822072.html)
|
60
|
+
|
61
|
+
## Contributing
|
62
|
+
|
63
|
+
1. Fork it
|
64
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
65
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
66
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
67
|
+
5. Create new [Pull Request](../../pull/new/master)
|
68
|
+
|
69
|
+
## Copyright
|
70
|
+
|
71
|
+
Copyright (c) 2014 Naotoshi Seo. See [LICENSE.txt](LICENSE.txt) for details.
|
72
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'rspec/core'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
6
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
7
|
+
end
|
8
|
+
task :default => :spec
|
9
|
+
|
10
|
+
desc 'Open an irb session preloaded with the gem library'
|
11
|
+
task :console do
|
12
|
+
sh 'irb -rubygems -I lib -r resolver_replace'
|
13
|
+
end
|
14
|
+
task :c => :console
|
data/example/example.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'resolve'
|
2
|
+
|
3
|
+
resolver = Resolv::DNS.new(:nameserver => ['210.251.121.21'],
|
4
|
+
:search => ['ruby-lang.org'],
|
5
|
+
:ndots => 1)
|
6
|
+
|
7
|
+
ResolverReplace.configure(
|
8
|
+
getaddress_proc: Proc.new {|host| resolver.getaddress(host) },
|
9
|
+
getaddresses_proc: Proc.new {|host| resolver.getaddresses(host) },
|
10
|
+
error_class: Resolv::ResolvError,
|
11
|
+
)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
if defined?(Mysql2)
|
2
|
+
module Mysql2
|
3
|
+
class Client
|
4
|
+
alias original_resolver_connect connect
|
5
|
+
def connect user, pass, host, port, database, socket, flags
|
6
|
+
begin
|
7
|
+
ip = ResolverReplace.getaddress(host).to_s
|
8
|
+
original_resolver_connect user, pass, ip, port, database, socket, flags
|
9
|
+
rescue ResolverReplace.error_class => e
|
10
|
+
raise Mysql2::Error, "#{e.class}: #{e.message}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
class ResolverReplace
|
2
|
+
def self.register!(params = {})
|
3
|
+
unless @getaddress = params[:getaddress]
|
4
|
+
raise ArgumentError, 'getaddress is required'
|
5
|
+
end
|
6
|
+
unless @getaddresses = params[:getaddresses]
|
7
|
+
raise ArgumentError, 'getaddresses is required'
|
8
|
+
end
|
9
|
+
@error_class = params[:error_class] || StandardError
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.getaddress(host)
|
13
|
+
@getaddress.call(host)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.getaddresses(host)
|
17
|
+
@getaddresses.call(host)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.error_class
|
21
|
+
@error_class
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.load_plugin(name)
|
25
|
+
load "resolver_replace/plugins/#{name}.rb"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# reference: ruby/lib/resolv-replace.rb
|
30
|
+
require 'socket'
|
31
|
+
|
32
|
+
class << IPSocket
|
33
|
+
# :stopdoc:
|
34
|
+
alias original_resolver_getaddress getaddress
|
35
|
+
# :startdoc:
|
36
|
+
def getaddress(host)
|
37
|
+
begin
|
38
|
+
return ResolverReplace.getaddress(host).to_s
|
39
|
+
rescue ResolverReplace.error_class => e
|
40
|
+
raise SocketError, "#{e.class} #{e.message}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class TCPSocket < IPSocket
|
46
|
+
# :stopdoc:
|
47
|
+
alias original_resolver_initialize initialize
|
48
|
+
# :startdoc:
|
49
|
+
def initialize(host, serv, *rest)
|
50
|
+
rest[0] = IPSocket.getaddress(rest[0]) unless rest.empty?
|
51
|
+
original_resolver_initialize(IPSocket.getaddress(host), serv, *rest)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class UDPSocket < IPSocket
|
56
|
+
# :stopdoc:
|
57
|
+
alias original_resolver_bind bind
|
58
|
+
# :startdoc:
|
59
|
+
def bind(host, port)
|
60
|
+
host = IPSocket.getaddress(host) if host != ""
|
61
|
+
original_resolver_bind(host, port)
|
62
|
+
end
|
63
|
+
|
64
|
+
# :stopdoc:
|
65
|
+
alias original_resolver_connect connect
|
66
|
+
# :startdoc:
|
67
|
+
def connect(host, port)
|
68
|
+
original_resolver_connect(IPSocket.getaddress(host), port)
|
69
|
+
end
|
70
|
+
|
71
|
+
# :stopdoc:
|
72
|
+
alias original_resolver_send send
|
73
|
+
# :startdoc:
|
74
|
+
def send(mesg, flags, *rest)
|
75
|
+
if rest.length == 2
|
76
|
+
host, port = rest
|
77
|
+
begin
|
78
|
+
addrs = ResolverReplace.getaddresses(host)
|
79
|
+
rescue ResolverReplace.error_class => e
|
80
|
+
raise SocketError, "#{e.class} #{e.message}"
|
81
|
+
end
|
82
|
+
addrs[0...-1].each {|addr|
|
83
|
+
begin
|
84
|
+
return original_resolver_send(mesg, flags, addr, port)
|
85
|
+
rescue SystemCallError
|
86
|
+
end
|
87
|
+
}
|
88
|
+
original_resolver_send(mesg, flags, addrs[-1], port)
|
89
|
+
else
|
90
|
+
original_resolver_send(mesg, flags, *rest)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class SOCKSSocket < TCPSocket
|
96
|
+
# :stopdoc:
|
97
|
+
alias original_resolver_initialize initialize
|
98
|
+
# :startdoc:
|
99
|
+
def initialize(host, serv)
|
100
|
+
original_resolver_initialize(IPSocket.getaddress(host), port)
|
101
|
+
end
|
102
|
+
end if defined? SOCKSSocket
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "resolver_replace"
|
7
|
+
spec.version = "0.0.1"
|
8
|
+
spec.authors = ["Naotoshi Seo"]
|
9
|
+
spec.email = ["sonots@gmail.com"]
|
10
|
+
spec.summary = %q{Replace the DNS resolver}
|
11
|
+
spec.description = %q{Replace the DNS resolver.}
|
12
|
+
spec.homepage = ""
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
21
|
+
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency "rspec"
|
23
|
+
spec.add_development_dependency "pry"
|
24
|
+
spec.add_development_dependency "pry-nav"
|
25
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
require 'resolver_replace'
|
3
|
+
|
4
|
+
describe ResolverReplace do
|
5
|
+
let(:host) { 'ruby-lang.org' }
|
6
|
+
let(:ip) { '127.0.0.1' }
|
7
|
+
|
8
|
+
before do
|
9
|
+
ResolverReplace.register!(
|
10
|
+
getaddress: Proc.new {|host| ip },
|
11
|
+
getaddresses: Proc.new {|host| ip },
|
12
|
+
error_class: StandardError,
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'IPSocket' do
|
17
|
+
expect(IPSocket.getaddress(host)).to be == ip
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'net/http' do
|
21
|
+
require 'net/http'
|
22
|
+
begin
|
23
|
+
Net::HTTP.get_print(host, '/index.html')
|
24
|
+
rescue => e
|
25
|
+
expect(e.message).to match(/Connection refused.*127.0.0.1/)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'mysql2' do
|
30
|
+
require 'mysql2'
|
31
|
+
ResolverReplace.load_plugin("mysql2")
|
32
|
+
begin
|
33
|
+
Mysql2::Client.new(
|
34
|
+
host: 'foo',
|
35
|
+
username: 'root',
|
36
|
+
database: 'foo',
|
37
|
+
)
|
38
|
+
rescue => e
|
39
|
+
expect(e.message).not_to match(/Unknown MySQL server/)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler'
|
4
|
+
Bundler.setup(:default, :test)
|
5
|
+
Bundler.require(:default, :test)
|
6
|
+
require 'pry'
|
7
|
+
ROOT = File.dirname(File.dirname(__FILE__))
|
8
|
+
|
9
|
+
if ENV['TRAVIS']
|
10
|
+
require 'coveralls'
|
11
|
+
Coveralls.wear!
|
12
|
+
end
|
13
|
+
|
14
|
+
$TESTING=true
|
15
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: resolver_replace
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Naotoshi Seo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-06-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-nav
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Replace the DNS resolver.
|
84
|
+
email:
|
85
|
+
- sonots@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- CHANGELOG.md
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
93
|
+
- LICENSE.txt
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- example/example.rb
|
97
|
+
- lib/resolver_replace.rb
|
98
|
+
- lib/resolver_replace/plugins/mysql2.rb
|
99
|
+
- resolver_replace.gemspec
|
100
|
+
- spec/resolver_replace_spec.rb
|
101
|
+
- spec/spec_helper.rb
|
102
|
+
homepage: ''
|
103
|
+
licenses:
|
104
|
+
- MIT
|
105
|
+
metadata: {}
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubyforge_project:
|
122
|
+
rubygems_version: 2.2.2
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: Replace the DNS resolver
|
126
|
+
test_files:
|
127
|
+
- spec/resolver_replace_spec.rb
|
128
|
+
- spec/spec_helper.rb
|