devdnsd 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.DS_Store CHANGED
Binary file
data/.travis.yml CHANGED
@@ -1,5 +1,8 @@
1
+ language: ruby
1
2
  rvm:
2
3
  - 1.8.7
3
4
  - 1.9.2
4
5
  - 1.9.3
5
6
  script: bundle exec rake spec:coverage
7
+ notifications:
8
+ email: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- devdnsd (1.0.3)
4
+ devdnsd (1.1.0)
5
5
  cowtech-extensions (~> 2.7.0)
6
6
  gli (~> 1.6.0)
7
7
  rainbow (~> 1.1.0)
@@ -52,8 +52,8 @@ module DevDNSd
52
52
  @logger = self.get_logger
53
53
 
54
54
  rescue DevDNSd::Errors::InvalidConfiguration, DevDNSd::Errors::InvalidRule => e
55
- @logger.fatal(e.message)
56
- raise SystemExit
55
+ @logger ? @logger.fatal(e.message) : DevDNSd::Logger.create("STDERR").fatal("Cannot log to #{config.log_file}. Exiting...")
56
+ raise ::SystemExit
57
57
  end
58
58
 
59
59
  self
@@ -64,7 +64,7 @@ module DevDNSd
64
64
  #
65
65
  # @return [Boolean] `true` if the current platform is MacOS X, `false` otherwise.
66
66
  def is_osx?
67
- Config::CONFIG['host_os'] =~ /^darwin/
67
+ ::Config::CONFIG['host_os'] =~ /^darwin/
68
68
  end
69
69
 
70
70
  # Gets the current logger of the application.
@@ -112,23 +112,24 @@ module DevDNSd
112
112
  # @return [Object] The result of stop callbacks.
113
113
  def perform_server
114
114
  RubyDNS::run_server(:listen => [[:udp, @config.address, @config.port.to_integer]]) do
115
- self.logger = Application.instance.logger
115
+ self.logger = DevDNSd::Application.instance.logger
116
116
 
117
- match(/.+/, Application::ANY_REQUEST) do |match_data, transaction|
117
+ match(/.+/, DevDNSd::Application::ANY_CLASSES) do |match_data, transaction|
118
118
  transaction.append_question!
119
119
 
120
- Application.instance.config.rules.each do |rule|
120
+ DevDNSd::Application.instance.config.rules.each do |rule|
121
121
  begin
122
122
  # Get the subset of handled class that is valid for the rule
123
- resource_classes = Application::ANY_CLASSES & rule.resource_class.ensure_array
123
+ resource_classes = DevDNSd::Application::ANY_CLASSES & rule.resource_class.ensure_array
124
+ resource_classes = resource_classes & [transaction.resource_class] if transaction.resource_class != DevDNSd::Application::ANY_REQUEST
124
125
 
125
126
  if resource_classes.present? then
126
127
  resource_classes.each do |resource_class| # Now for every class
127
128
  matches = rule.match_host(match_data[0])
128
- Application.instance.process_rule(rule, resource_class, rule.is_regexp? ? matches : nil, transaction) if matches
129
+ DevDNSd::Application.instance.process_rule(rule, resource_class, rule.is_regexp? ? matches : nil, transaction) if matches
129
130
  end
130
131
  end
131
- rescue Exception => e
132
+ rescue ::Exception => e
132
133
  raise e
133
134
  end
134
135
  end
@@ -141,11 +142,11 @@ module DevDNSd
141
142
 
142
143
  # Attach event handlers
143
144
  self.on(:start) do
144
- Application.instance.on_start
145
+ DevDNSd::Application.instance.on_start
145
146
  end
146
147
 
147
148
  self.on(:stop) do
148
- Application.instance.on_stop
149
+ DevDNSd::Application.instance.on_stop
149
150
  end
150
151
  end
151
152
  end
@@ -158,10 +159,10 @@ module DevDNSd
158
159
  # @param transaction [Transaction] The current DNS transaction (http://rubydoc.info/gems/rubydns/RubyDNS/Transaction).
159
160
  # @return A reply for the request if matched, otherwise `false` or `nil`.
160
161
  def process_rule(rule, type, match_data, transaction)
161
- is_regex = rule.match.is_a?(Regexp)
162
+ is_regex = rule.match.is_a?(::Regexp)
162
163
  type = DevDNSd::Rule.resource_class_to_symbol(type)
163
164
 
164
- Application.instance.logger.debug("Found match on #{rule.match} with type #{type}.")
165
+ DevDNSd::Application.instance.logger.debug("Found match on #{rule.match} with type #{type}.")
165
166
 
166
167
  if !rule.block.nil? then
167
168
  reply = rule.block.call(match_data, type, transaction)
@@ -173,7 +174,7 @@ module DevDNSd
173
174
  reply = match_data[0].gsub(rule.match, reply.gsub("$", "\\"))
174
175
  end
175
176
 
176
- Application.instance.logger.debug(reply ? "Reply is #{reply} with type #{type}." : "No reply found.")
177
+ DevDNSd::Application.instance.logger.debug(reply ? "Reply is #{reply} with type #{type}." : "No reply found.")
177
178
 
178
179
  if reply then
179
180
  options = rule.options
@@ -261,8 +262,8 @@ module DevDNSd
261
262
 
262
263
  args = $ARGV ? $ARGV[0, $ARGV.length - 1] : ["A"]
263
264
 
264
- plist = {"KeepAlive" => true, "Label" => "it.cowtech.devdnsd", "Program" => (Pathname.new(Dir.pwd) + $0).to_s, "ProgramArguments" => args, "RunAtLoad" => true}
265
- File.open(launch_agent, "w") {|f|
265
+ plist = {"KeepAlive" => true, "Label" => "it.cowtech.devdnsd", "Program" => (::Pathname.new(Dir.pwd) + $0).to_s, "ProgramArguments" => args, "RunAtLoad" => true}
266
+ ::File.open(launch_agent, "w") {|f|
266
267
  f.write(plist.to_json)
267
268
  f.flush
268
269
  }
@@ -302,7 +303,7 @@ module DevDNSd
302
303
  # Remove the resolver
303
304
  begin
304
305
  logger.info("Deleting the resolver #{resolver_file} ...")
305
- File.delete(resolver_file)
306
+ ::File.delete(resolver_file)
306
307
  rescue => e
307
308
  logger.warn("Cannot delete the resolver file.")
308
309
  return false
@@ -318,7 +319,7 @@ module DevDNSd
318
319
  # Delete the launch agent.
319
320
  begin
320
321
  logger.info("Deleting the launch agent #{launch_agent} ...")
321
- File.delete(launch_agent)
322
+ ::File.delete(launch_agent)
322
323
  rescue => e
323
324
  logger.warn("Cannot delete the launch agent.")
324
325
  return false
@@ -345,10 +346,11 @@ module DevDNSd
345
346
  # @param globals [Hash] Global options.
346
347
  # @param locals [Hash] Local command options.
347
348
  # @param args [Array] Extra arguments.
349
+ # @param force [Boolean] If to force recreation of the instance.
348
350
  # @return [Application] The unique (singleton) instance of the application.
349
351
  def self.instance(globals = {}, locals = {}, args = [], force = false)
350
- @@instance = nil if force
351
- @@instance ||= Application.new(globals, locals, args)
352
+ @instance = nil if force
353
+ @instance ||= DevDNSd::Application.new(globals, locals, args)
352
354
  end
353
355
 
354
356
  # Runs the application in foreground.
@@ -360,7 +362,7 @@ module DevDNSd
360
362
 
361
363
  # Stops the application.
362
364
  def self.quit
363
- EventMachine.stop
365
+ ::EventMachine.stop
364
366
  end
365
367
  end
366
368
  end
@@ -45,29 +45,29 @@ module DevDNSd
45
45
  @port = 7771
46
46
  @tld = "dev"
47
47
  @log_file = "/var/log/devdnsd.log"
48
- @log_level = Logger::INFO
48
+ @log_level = ::Logger::INFO
49
49
  @rules = []
50
50
  @foreground = false
51
51
 
52
52
  if file.present?
53
53
  begin
54
54
  # Open the file
55
- path = Pathname.new(file).realpath
55
+ path = ::Pathname.new(file).realpath
56
56
  application.logger.info("Using configuration file #{path}.") if application
57
57
  self.tap do |config|
58
- eval(File.read(path))
58
+ eval(::File.read(path))
59
59
  end
60
60
 
61
61
  @log_file = $stdout if @log_file == "STDOUT"
62
62
  @log_file = $stderr if @log_file == "STDERR"
63
- rescue Errno::ENOENT, LoadError
64
- rescue Exception => e
63
+ rescue ::Errno::ENOENT, ::LoadError
64
+ rescue ::Exception => e
65
65
  raise DevDNSd::Errors::InvalidConfiguration.new("Config file #{file} is not valid.")
66
66
  end
67
67
  end
68
68
 
69
69
  # Apply overrides
70
- if overrides.is_a?(Hash) then
70
+ if overrides.is_a?(::Hash) then
71
71
  overrides.each_pair do |k, v|
72
72
  self.send("#{k}=", v) if self.respond_to?("#{k}=") && !v.nil?
73
73
  end
@@ -8,11 +8,11 @@ module DevDNSd
8
8
  # Exceptions for {DevDNSd DevDNSd}.
9
9
  module Errors
10
10
  # This exception is raised if a {Rule Rule} is invalid.
11
- class InvalidRule < ArgumentError
11
+ class InvalidRule < ::ArgumentError
12
12
  end
13
13
 
14
14
  # This exception is raised if a {Configuration Configuration} is invalid.
15
- class InvalidConfiguration < ArgumentError
15
+ class InvalidConfiguration < ::ArgumentError
16
16
  end
17
17
  end
18
18
  end
@@ -32,7 +32,13 @@ module DevDNSd
32
32
  # @return [Logger] The new logger.
33
33
  def self.create(file = nil, level = Logger::INFO, formatter = nil)
34
34
  file ||= self.default_file
35
- rv = self.new(self.get_real_file(file))
35
+
36
+ begin
37
+ rv = self.new(self.get_real_file(file))
38
+ rescue
39
+ raise DevDNSd::Errors::InvalidConfiguration
40
+ end
41
+
36
42
  rv.level = level.to_i
37
43
  rv.formatter = formatter || self.default_formatter
38
44
  rv
@@ -59,7 +65,7 @@ module DevDNSd
59
65
  # The default formatter for logging.
60
66
  # @return [Proc] The default formatter for logging.
61
67
  def self.default_formatter
62
- @default_formatter ||= Proc.new {|severity, datetime, progname, msg|
68
+ @default_formatter ||= ::Proc.new {|severity, datetime, progname, msg|
63
69
  color = case severity
64
70
  when "DEBUG" then :cyan
65
71
  when "INFO" then :green
@@ -78,7 +84,7 @@ module DevDNSd
78
84
  # The log time of the first logger. This allows to show a `T+0.1234` information into the log.
79
85
  # @return [Time] The log time of the first logger.
80
86
  def self.start_time
81
- @start_time ||= Time.now
87
+ @start_time ||= ::Time.now
82
88
  end
83
89
  end
84
90
  end
data/lib/devdnsd/rule.rb CHANGED
@@ -46,7 +46,7 @@ module DevDNSd
46
46
  @block = block
47
47
 
48
48
  raise(DevDNSd::Errors::InvalidRule.new("You must specify at least a rule and a host (also via a block). Optionally you can add a record type (default: A) and the options.")) if @reply.blank? && @block.nil?
49
- raise(DevDNSd::Errors::InvalidRule.new("You can only use hashs for options.")) if !@options.is_a?(Hash)
49
+ raise(DevDNSd::Errors::InvalidRule.new("You can only use hashs for options.")) if !@options.is_a?(::Hash)
50
50
  end
51
51
 
52
52
  # Returns the resource class(es) for the current rule.
@@ -61,7 +61,7 @@ module DevDNSd
61
61
  #
62
62
  # @return [Boolean] `true` if the rule is a Regexp, `false` otherwise.
63
63
  def is_regexp?
64
- self.match.is_a?(Regexp)
64
+ self.match.is_a?(::Regexp)
65
65
  end
66
66
 
67
67
  # Checks if the rule is a regexp.
@@ -88,7 +88,7 @@ module DevDNSd
88
88
  # @param block [Proc] An optional block to compute the reply instead of using the `reply_or_type` parameter. In this case `reply_or_type` is used for the type of the request and `type` is ignored.
89
89
  def self.create(match, reply_or_type = nil, type = nil, options = {}, &block)
90
90
  raise(DevDNSd::Errors::InvalidRule.new("You must specify at least a rule and a host (also via a block). Optionally you can add a record type (default: A) and the options.")) if reply_or_type.blank? && block.nil?
91
- raise(DevDNSd::Errors::InvalidRule.new("You can only use hashs for options.")) if !options.is_a?(Hash)
91
+ raise(DevDNSd::Errors::InvalidRule.new("You can only use hashs for options.")) if !options.is_a?(::Hash)
92
92
 
93
93
  rv = self.new(match)
94
94
  rv.options = options
@@ -122,7 +122,7 @@ module DevDNSd
122
122
 
123
123
  begin
124
124
  "Resolv::DNS::Resource::IN::#{symbol}".constantize
125
- rescue NameError
125
+ rescue ::NameError
126
126
  raise(DevDNSd::Errors::InvalidRule.new("Invalid resource class #{symbol}."))
127
127
  end
128
128
  end
@@ -13,10 +13,10 @@ module DevDNSd
13
13
  MAJOR = 1
14
14
 
15
15
  # The minor version.
16
- MINOR = 0
16
+ MINOR = 1
17
17
 
18
18
  # The patch version.
19
- PATCH = 3
19
+ PATCH = 0
20
20
 
21
21
  # The current version number of DevDNSd.
22
22
  STRING = [MAJOR, MINOR, PATCH].compact.join(".")
@@ -11,12 +11,12 @@ describe DevDNSd::Application do
11
11
  DevDNSd::Logger.stub(:default_file).and_return("/dev/null")
12
12
  end
13
13
 
14
- let(:log_file) { "/tmp/devdnsd-test-log-#{Time.now.strftime("%Y%m%d-%H:%M:%S")}" }
15
- let(:application){ app = DevDNSd::Application.instance(:log_file => log_file) }
16
- let(:executable) { Pathname.new(File.dirname((__FILE__))) + "../../bin/devdnsd" }
17
- let(:sample_config) { Pathname.new(File.dirname((__FILE__))) + "../../config/devdnsd_config.sample" }
18
- let(:resolver_path) { "/tmp/devdnsd-test-resolver-#{Time.now.strftime("%Y%m%d-%H:%M:%S")}" }
19
- let(:launch_agent_path) { "/tmp/devdnsd-test-agent-#{Time.now.strftime("%Y%m%d-%H:%M:%S")}" }
14
+ let(:log_file) { "/tmp/devdnsd-test-log-#{Time.now.strftime("%Y%m%d-%H%M%S")}" }
15
+ let(:application){ DevDNSd::Application.instance({:log_file => log_file}, {}, {}, true) }
16
+ let(:executable) { ::Pathname.new(::File.dirname((__FILE__))) + "../../bin/devdnsd" }
17
+ let(:sample_config) { ::Pathname.new(::File.dirname((__FILE__))) + "../../config/devdnsd_config.sample" }
18
+ let(:resolver_path) { "/tmp/devdnsd-test-resolver-#{Time.now.strftime("%Y%m%d-%H%M%S")}" }
19
+ let(:launch_agent_path) { "/tmp/devdnsd-test-agent-#{Time.now.strftime("%Y%m%d-%H%M%S")}" }
20
20
 
21
21
  describe "#initialize" do
22
22
  it("should setup the logger") do application.logger.should_not be_nil end
@@ -24,122 +24,130 @@ describe DevDNSd::Application do
24
24
 
25
25
  it("should abort with an invalid configuration") do
26
26
  path = "/tmp/devdnsd-test-#{Time.now.strftime("%Y%m%d-%H:%M:%S")}"
27
- file = File.new(path, "w")
27
+ file = ::File.new(path, "w")
28
28
  file.write("config.port = ")
29
29
  file.close
30
30
 
31
- expect { DevDNSd::Application.new({:config => file.path, :log_file => log_file}) }.to raise_error(SystemExit)
32
- File.unlink(path)
31
+ expect { DevDNSd::Application.new({:config => file.path, :log_file => log_file}) }.to raise_error(::SystemExit)
32
+ ::File.unlink(path)
33
33
  end
34
34
  end
35
35
 
36
36
  describe ".run" do
37
37
  it "should run the server" do
38
38
  application.should_receive(:perform_server)
39
-
40
- Thread.start {
41
- devdnsd_resolv("match.dev")
42
- DevDNSd::Application.quit
43
- }
44
-
45
39
  DevDNSd::Application.run
46
40
  end
47
41
  end
48
42
 
43
+ describe ".quit" do
44
+ it "should quit the application" do
45
+ ::EventMachine.should_receive(:stop)
46
+ DevDNSd::Application.quit
47
+ end
48
+ end
49
+
49
50
  describe "#perform_server" do
51
+ let(:application){ DevDNSd::Application.instance({:log_file => log_file, :config => sample_config}, {}, {}, true) }
52
+
50
53
  before(:each) do
51
54
  DevDNSd::Logger.stub(:default_file).and_return($stdout)
52
- end
53
55
 
54
- it "should run the server" do
55
56
  class DevDNSd::Application
56
57
  def on_start
57
- EventMachine.add_periodic_timer(1) do
58
- devdnsd_resolv("match.dev")
59
- DevDNSd::Application.quit
60
- end
58
+ Thread.main[:resolver].wakeup if Thread.main[:resolver].try(:alive?)
61
59
  end
62
60
  end
61
+ end
62
+
63
+ def test_resolve(host = "match_1.dev", type = "ANY", nameserver = "127.0.0.1", port = 7771, logger = nil)
64
+ host ||= "match.dev"
65
+
66
+ Thread.current[:resolver] = Thread.start {
67
+ Thread.stop
68
+ Thread.main[:result] = devdnsd_resolv(host, type, nameserver, port, logger)
69
+ }
70
+
71
+ Thread.current[:server] = Thread.start {
72
+ sleep(0.1)
73
+
74
+ if block_given? then
75
+ yield
76
+ else
77
+ application.perform_server
78
+ end
79
+ }
80
+
81
+ Thread.current[:resolver].join
82
+ Thread.kill(Thread.current[:server])
83
+ Thread.main[:running] = false
84
+ Thread.main[:result]
85
+ end
63
86
 
87
+ it "should run the server" do
64
88
  RubyDNS.should_receive(:run_server)
65
- DevDNSd::Application.instance.perform_server
89
+ application.perform_server
90
+ end
91
+
92
+ it "should stop the server" do
93
+ application.should_receive(:on_stop)
94
+
95
+ Thread.new {
96
+ sleep(1)
97
+ application.class.quit
98
+ }
99
+
100
+ application.perform_server
66
101
  end
67
102
 
68
103
  it "should iterate the rules" do
69
- class DevDNSd::Application
70
- def on_start
71
- EventMachine.add_periodic_timer(1) do
72
- devdnsd_resolv("match.dev")
73
- DevDNSd::Application.quit
74
- end
75
- end
104
+ test_resolve do
105
+ application.config.rules.should_receive(:each).at_least(1)
106
+ application.perform_server
76
107
  end
77
-
78
- DevDNSd::Application.instance.config.rules.should_receive(:each).at_least(1)
79
- DevDNSd::Application.instance.perform_server
80
108
  end
81
109
 
82
110
  it "should call process_rule" do
83
- class DevDNSd::Application
84
- def on_start
85
- EventMachine.add_periodic_timer(1) do
86
- devdnsd_resolv("match.dev")
87
- DevDNSd::Application.quit
88
- end
89
- end
111
+ test_resolve do
112
+ application.should_receive(:process_rule).at_least(1)
113
+ application.perform_server
90
114
  end
91
-
92
- DevDNSd::Application.instance.should_receive(:process_rule).at_least(1)
93
- DevDNSd::Application.instance.perform_server
94
115
  end
95
116
 
96
117
  it "should complain about wrong rules" do
97
- class DevDNSd::Application
98
- def on_start
99
- EventMachine.add_periodic_timer(1) do
100
- devdnsd_resolv("invalid.dev")
101
- DevDNSd::Application.quit
102
- end
103
- end
118
+ test_resolve do
119
+ application.stub(:process_rule).and_raise(::Exception)
120
+ expect { application.perform_server }.to raise_exception
104
121
  end
105
-
106
- DevDNSd::Application.instance.stub(:process_rule).and_raise(Exception)
107
- expect { DevDNSd::Application.instance.perform_server }.to raise_exception
108
122
  end
109
123
 
110
124
  describe "should correctly resolve hostnames" do
111
- before(:all) do
112
- system("ruby \"#{executable}\" -L 0 -l /dev/null -c \"#{sample_config}\" start > /dev/null 2>&1")
113
- end
114
-
115
- after(:all) do
116
- system("ruby \"#{executable}\" -L 0 -l /dev/null stop > /dev/null 2>&1")
117
- end
118
-
119
125
  it "basing on a exact pattern" do
120
- devdnsd_resolv("match_1.dev").should == ["10.0.1.1", :A]
121
- devdnsd_resolv("match_2.dev").should == ["10.0.2.1", :MX]
122
- devdnsd_resolv("match_3.dev").should == ["10.0.3.1", :A]
123
- devdnsd_resolv("match_4.dev").should == ["10.0.4.1", :CNAME]
126
+ test_resolve("match_1.dev").should == ["10.0.1.1", :A]
127
+ test_resolve("match_2.dev").should == ["10.0.2.1", :MX]
128
+ test_resolve("match_3.dev").should == ["10.0.3.1", :A]
129
+ test_resolve("match_4.dev").should == ["10.0.4.1", :CNAME]
124
130
  end
125
131
 
126
132
  it "basing on a regexp pattern" do
127
- devdnsd_resolv("match_5_11.dev").should == ["10.0.5.11", :A]
128
- devdnsd_resolv("match_5_22.dev").should == ["10.0.5.22", :A]
129
- devdnsd_resolv("match_6_33.dev").should == ["10.0.6.33", :PTR]
130
- devdnsd_resolv("match_6_44.dev").should == ["10.0.6.44", :PTR]
131
- devdnsd_resolv("match_7_55.dev").should == ["10.0.7.55", :A]
132
- devdnsd_resolv("match_7_66.dev").should == ["10.0.7.66", :A]
133
- devdnsd_resolv("match_8_77.dev").should == ["10.0.8.77", :PTR]
134
- devdnsd_resolv("match_8_88.dev").should == ["10.0.8.88", :PTR]
135
-
133
+ test_resolve("match_5_11.dev").should == ["10.0.5.11", :A]
134
+ test_resolve("match_5_22.dev").should == ["10.0.5.22", :A]
135
+ test_resolve("match_6_33.dev").should == ["10.0.6.33", :PTR]
136
+ test_resolve("match_6_44.dev").should == ["10.0.6.44", :PTR]
137
+ test_resolve("match_7_55.dev").should == ["10.0.7.55", :A]
138
+ test_resolve("match_7_66.dev").should == ["10.0.7.66", :A]
139
+ test_resolve("match_8_77.dev").should == ["10.0.8.77", :PTR]
140
+ test_resolve("match_8_88.dev").should == ["10.0.8.88", :PTR]
136
141
  end
137
142
 
138
- it "and return multiple answsers" do devdnsd_resolv("match_10.dev").should == [["10.0.10.1", :A], ["10.0.10.2", :MX]] end
143
+ it "and return multiple or only relevant answsers" do
144
+ test_resolve("match_10.dev").should == [["10.0.10.1", :A], ["10.0.10.2", :MX]]
145
+ test_resolve("match_10.dev", "MX").should == ["10.0.10.2", :MX]
146
+ end
139
147
 
140
148
  it "and reject invalid matches (with or without rules)" do
141
- devdnsd_resolv("match_9.dev").should be_nil
142
- devdnsd_resolv("invalid.dev").should be_nil
149
+ test_resolve("match_9.dev").should be_nil
150
+ test_resolve("invalid.dev").should be_nil
143
151
  end
144
152
  end
145
153
  end
@@ -157,7 +165,7 @@ describe DevDNSd::Application do
157
165
  end
158
166
  end
159
167
 
160
- let(:application){ DevDNSd::Application.new({:config => Pathname.new(File.dirname((__FILE__))) + "../../config/devdnsd_config.sample" }) }
168
+ let(:application){ DevDNSd::Application.instance({:log_file => log_file, :config => sample_config}, {}, {}, true) }
161
169
  let(:transaction){ FakeTransaction.new }
162
170
 
163
171
  it "should match a valid string request" do
@@ -180,7 +188,6 @@ describe DevDNSd::Application do
180
188
  application.process_rule(rule, rule.resource_class, nil, transaction).should be_true
181
189
  end
182
190
 
183
-
184
191
  it "should match a valid regexp request" do
185
192
  rule = application.config.rules[4]
186
193
  mo = rule.match_host("match_5_12.dev")
@@ -229,115 +236,118 @@ describe DevDNSd::Application do
229
236
  it "should return the resolver file basing on the argument" do application.resolver_path("foo").should == "/etc/resolver/foo" end
230
237
  end
231
238
 
232
- describe "launch_agent_path" do
239
+ describe "#launch_agent_path" do
233
240
  it "should return the agent file with a default name" do application.launch_agent_path.should == ENV["HOME"] + "/Library/LaunchAgents/it.cowtech.devdnsd.plist" end
234
241
  it "should return the agent file with a specified name" do application.launch_agent_path("foo").should == ENV["HOME"] + "/Library/LaunchAgents/foo.plist" end
235
242
  end
236
243
 
237
244
  describe "#action_start" do
238
245
  it "should call perform_server in foreground" do
239
- DevDNSd::Application.instance({}, {:foreground => true}, [], true).should_receive(:perform_server)
246
+ application = DevDNSd::Application.instance({:log_file => log_file}, {:foreground => true}, [], true)
247
+ application.should_receive(:perform_server)
240
248
  application.action_start
241
249
  end
242
250
 
243
251
  it "should start the daemon" do
244
- DevDNSd::Application.instance({:log_file => log_file}, {}, [], true)
245
- RExec::Daemon::Controller.should_receive(:start)
252
+ application = DevDNSd::Application.instance({:log_file => log_file}, {}, [], true)
253
+ ::RExec::Daemon::Controller.should_receive(:start)
246
254
  application.action_start
247
255
  end
248
256
  end
249
257
 
250
258
  describe "#action_stop" do
251
259
  it "should stop the daemon" do
252
- RExec::Daemon::Controller.should_receive(:stop)
260
+ ::RExec::Daemon::Controller.should_receive(:stop)
253
261
  application.action_stop
254
262
  end
255
263
  end
256
264
 
257
265
  describe "#action_install" do
258
- it "should create the resolver" do
259
- application.stub(:resolver_path).and_return(resolver_path)
260
- application.stub(:launch_agent_path).and_return(launch_agent_path)
261
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
262
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
263
-
264
- application.action_install
265
- File.exists?(resolver_path).should be_true
266
-
267
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
268
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
269
- end
266
+ if ::Config::CONFIG['host_os'] =~ /^darwin/ then
267
+ it "should create the resolver" do
268
+ application.stub(:resolver_path).and_return(resolver_path)
269
+ application.stub(:launch_agent_path).and_return(launch_agent_path)
270
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
271
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
272
+
273
+ application.action_install
274
+ ::File.exists?(resolver_path).should be_true
275
+
276
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
277
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
278
+ end
270
279
 
271
- it "should create the agent" do
272
- application.stub(:resolver_path).and_return(resolver_path)
273
- application.stub(:launch_agent_path).and_return(launch_agent_path)
274
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
275
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
280
+ it "should create the agent" do
281
+ application.stub(:resolver_path).and_return(resolver_path)
282
+ application.stub(:launch_agent_path).and_return(launch_agent_path)
283
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
284
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
276
285
 
277
- application.stub(:resolver_path).and_return(resolver_path)
278
- application.action_install
279
- File.exists?(application.launch_agent_path).should be_true
286
+ application.stub(:resolver_path).and_return(resolver_path)
287
+ application.action_install
288
+ ::File.exists?(application.launch_agent_path).should be_true
280
289
 
281
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
282
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
283
- end
290
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
291
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
292
+ end
284
293
 
285
- it "should update the DNS cache" do
286
- application.stub(:resolver_path).and_return(resolver_path)
287
- application.stub(:launch_agent_path).and_return(launch_agent_path)
288
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
289
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
294
+ it "should update the DNS cache" do
295
+ application.stub(:resolver_path).and_return(resolver_path)
296
+ application.stub(:launch_agent_path).and_return(launch_agent_path)
297
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
298
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
290
299
 
291
- application.should_receive(:dns_update)
292
- application.action_install
300
+ application.should_receive(:dns_update)
301
+ application.action_install
293
302
 
294
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
295
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
296
- end
303
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
304
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
305
+ end
297
306
 
298
- it "should not create and invalid logger" do
299
- application.stub(:resolver_path).and_return("/invalid/resolver")
300
- application.stub(:launch_agent_path).and_return("/invalid/agent")
301
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
302
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
307
+ it "should not create and invalid logger" do
308
+ application.stub(:resolver_path).and_return("/invalid/resolver")
309
+ application.stub(:launch_agent_path).and_return("/invalid/agent")
310
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
311
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
303
312
 
304
- application.get_logger.should_receive(:error).with("Cannot create the resolver file.")
305
- application.action_install
313
+ application.get_logger.should_receive(:error).with("Cannot create the resolver file.")
314
+ application.action_install
306
315
 
307
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
308
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
309
- end
316
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
317
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
318
+ end
310
319
 
311
- it "should not create and invalid agent" do
312
- application.stub(:resolver_path).and_return(resolver_path)
313
- application.stub(:launch_agent_path).and_return("/invalid/agent")
314
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
315
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
320
+ it "should not create and invalid agent" do
321
+ application.stub(:resolver_path).and_return(resolver_path)
322
+ application.stub(:launch_agent_path).and_return("/invalid/agent")
323
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
324
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
316
325
 
317
- application.get_logger.should_receive(:error).with("Cannot create the launch agent.")
318
- application.action_install
326
+ application.get_logger.should_receive(:error).with("Cannot create the launch agent.")
327
+ application.action_install
319
328
 
320
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
321
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
322
- end
329
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
330
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
331
+ end
323
332
 
324
- it "should not load an invalid agent" do
325
- class DevDNSd::Application
326
- def execute_command(command)
327
- command =~ /^launchctl/ ? raise(StandardError) : system(command)
333
+ it "should not load an invalid agent" do
334
+ class DevDNSd::Application
335
+ def execute_command(command)
336
+ command =~ /^launchctl/ ? raise(StandardError) : system(command)
337
+ end
328
338
  end
329
- end
330
339
 
331
- application.stub(:resolver_path).and_return(resolver_path)
332
- application.stub(:launch_agent_path).and_return(launch_agent_path)
333
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
334
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
340
+ application.stub(:resolver_path).and_return(resolver_path)
341
+ application.stub(:launch_agent_path).and_return(launch_agent_path)
342
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
343
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
335
344
 
336
- application.get_logger.should_receive(:error).with("Cannot load the launch agent.")
337
- application.action_install
345
+ application.get_logger.should_receive(:error).with("Cannot load the launch agent.")
346
+ application.action_install
338
347
 
339
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
340
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
348
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
349
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
350
+ end
341
351
  end
342
352
 
343
353
  it "should raise an exception if not running on OSX" do
@@ -348,84 +358,86 @@ describe DevDNSd::Application do
348
358
  end
349
359
 
350
360
  describe "#action_uninstall" do
351
- it "should remove the resolver" do
352
- application.stub(:resolver_path).and_return(resolver_path)
353
- application.stub(:launch_agent_path).and_return(launch_agent_path)
354
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
355
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
356
-
357
- application.action_install
358
- application.action_uninstall
359
- File.exists?(resolver_path).should be_false
360
-
361
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
362
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
363
- end
361
+ if ::Config::CONFIG['host_os'] =~ /^darwin/ then
362
+ it "should remove the resolver" do
363
+ application.stub(:resolver_path).and_return(resolver_path)
364
+ application.stub(:launch_agent_path).and_return(launch_agent_path)
365
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
366
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
367
+
368
+ application.action_install
369
+ application.action_uninstall
370
+ ::File.exists?(resolver_path).should be_false
371
+
372
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
373
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
374
+ end
364
375
 
365
- it "should remove the agent" do
366
- application.stub(:resolver_path).and_return(resolver_path)
367
- application.stub(:launch_agent_path).and_return(launch_agent_path)
368
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
369
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
376
+ it "should remove the agent" do
377
+ application.stub(:resolver_path).and_return(resolver_path)
378
+ application.stub(:launch_agent_path).and_return(launch_agent_path)
379
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
380
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
370
381
 
371
- DevDNSd::Logger.stub(:default_file).and_return($stdout)
372
- application.action_install
373
- application.action_uninstall
374
- File.exists?(application.launch_agent_path).should be_false
382
+ DevDNSd::Logger.stub(:default_file).and_return($stdout)
383
+ application.action_install
384
+ application.action_uninstall
385
+ ::File.exists?(application.launch_agent_path).should be_false
375
386
 
376
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
377
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
378
- end
387
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
388
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
389
+ end
379
390
 
380
- it "should not load delete an invalid resolver" do
381
- application.stub(:resolver_path).and_return("/invalid/resolver")
382
- application.stub(:launch_agent_path).and_return("/invalid/agent")
391
+ it "should not load delete an invalid resolver" do
392
+ application.stub(:resolver_path).and_return("/invalid/resolver")
393
+ application.stub(:launch_agent_path).and_return("/invalid/agent")
383
394
 
384
- application.action_install
385
- application.get_logger.should_receive(:warn).at_least(1)
386
- application.action_uninstall
395
+ application.action_install
396
+ application.get_logger.should_receive(:warn).at_least(1)
397
+ application.action_uninstall
387
398
 
388
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
389
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
390
- end
399
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
400
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
401
+ end
391
402
 
392
- it "should not delete an invalid agent" do
393
- application.stub(:resolver_path).and_return(resolver_path)
394
- application.stub(:launch_agent_path).and_return("/invalid/agent")
403
+ it "should not delete an invalid agent" do
404
+ application.stub(:resolver_path).and_return(resolver_path)
405
+ application.stub(:launch_agent_path).and_return("/invalid/agent")
395
406
 
396
- application.action_install
397
- application.get_logger.should_receive(:warn).at_least(1)
398
- application.action_uninstall
407
+ application.action_install
408
+ application.get_logger.should_receive(:warn).at_least(1)
409
+ application.action_uninstall
399
410
 
400
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
401
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
402
- end
411
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
412
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
413
+ end
403
414
 
404
- it "should not load delete invalid agent" do
405
- application.stub(:resolver_path).and_return(resolver_path)
406
- application.stub(:launch_agent_path).and_return("/invalid/agent")
415
+ it "should not load delete invalid agent" do
416
+ application.stub(:resolver_path).and_return(resolver_path)
417
+ application.stub(:launch_agent_path).and_return("/invalid/agent")
407
418
 
408
- application.action_install
409
- application.stub(:execute_command).and_raise(StandardError)
410
- application.get_logger.should_receive(:warn).at_least(1)
411
- application.action_uninstall
419
+ application.action_install
420
+ application.stub(:execute_command).and_raise(StandardError)
421
+ application.get_logger.should_receive(:warn).at_least(1)
422
+ application.action_uninstall
412
423
 
413
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
414
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
415
- end
424
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
425
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
426
+ end
416
427
 
417
- it "should update the DNS cache" do
418
- application.stub(:resolver_path).and_return(resolver_path)
419
- application.stub(:launch_agent_path).and_return(launch_agent_path)
420
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
421
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
428
+ it "should update the DNS cache" do
429
+ application.stub(:resolver_path).and_return(resolver_path)
430
+ application.stub(:launch_agent_path).and_return(launch_agent_path)
431
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
432
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
422
433
 
423
- application.action_install
424
- application.should_receive(:dns_update)
425
- application.action_uninstall
434
+ application.action_install
435
+ application.should_receive(:dns_update)
436
+ application.action_uninstall
426
437
 
427
- File.unlink(application.resolver_path) if File.exists?(application.resolver_path)
428
- File.unlink(application.launch_agent_path) if File.exists?(application.launch_agent_path)
438
+ ::File.unlink(application.resolver_path) if ::File.exists?(application.resolver_path)
439
+ ::File.unlink(application.launch_agent_path) if ::File.exists?(application.launch_agent_path)
440
+ end
429
441
  end
430
442
 
431
443
  it "should raise an exception if not running on OSX" do
@@ -29,13 +29,13 @@ describe DevDNSd::Configuration do
29
29
  config.port.should == 7771
30
30
  config.tld.should == "dev"
31
31
  config.log_file.should == "/var/log/devdnsd.log"
32
- config.log_level.should == Logger::INFO
32
+ config.log_level.should == ::Logger::INFO
33
33
  config.rules.count.should == 1
34
34
  config.foreground.should == false
35
35
  end
36
36
 
37
37
  it "reads a valid configuration file" do
38
- file = Tempfile.new('devdnsd-test')
38
+ file = ::Tempfile.new('devdnsd-test')
39
39
  file.write("config.port = 7772")
40
40
  file.close
41
41
 
@@ -45,7 +45,7 @@ describe DevDNSd::Configuration do
45
45
  end
46
46
 
47
47
  it "reject an invalid configuration" do
48
- file = Tempfile.new('devdnsd-test')
48
+ file = ::Tempfile.new('devdnsd-test')
49
49
  file.write("config.port = ")
50
50
  file.close
51
51
 
@@ -54,7 +54,7 @@ describe DevDNSd::Configuration do
54
54
  end
55
55
 
56
56
  it "allows overrides" do
57
- file = Tempfile.new('devdnsd-test')
57
+ file = ::Tempfile.new('devdnsd-test')
58
58
  file.write("config.port = 7772")
59
59
  file.close
60
60
 
@@ -15,28 +15,32 @@ describe DevDNSd::Logger do
15
15
  it("should create a new default logger") do
16
16
  logger = DevDNSd::Logger.create
17
17
  logger.device.should == DevDNSd::Logger.default_file
18
- logger.level.should == Logger::INFO
18
+ logger.level.should == ::Logger::INFO
19
19
  logger.formatter.should == DevDNSd::Logger.default_formatter
20
20
  end
21
21
 
22
22
  it("should create a logger with a custom file and level") do
23
- logger = DevDNSd::Logger.create("/dev/null", Logger::WARN)
23
+ logger = DevDNSd::Logger.create("/dev/null", ::Logger::WARN)
24
24
  logger.device.should == "/dev/null"
25
- logger.level.should == Logger::WARN
25
+ logger.level.should == ::Logger::WARN
26
26
  logger.formatter.should == DevDNSd::Logger.default_formatter
27
27
  end
28
28
 
29
29
  it("should create a logger with a custom formatter") do
30
30
  formatter = Proc.new {|severity, datetime, progname, msg| msg }
31
- logger = DevDNSd::Logger.create("/dev/null", Logger::WARN, formatter)
31
+ logger = DevDNSd::Logger.create("/dev/null", ::Logger::WARN, formatter)
32
32
  logger.device.should == "/dev/null"
33
- logger.level.should == Logger::WARN
33
+ logger.level.should == ::Logger::WARN
34
34
  logger.formatter.should == formatter
35
35
  end
36
+
37
+ it("should raise exceptions for invalid files") do
38
+ expect { DevDNSd::Logger.create("/invalid/file") }.to raise_error(DevDNSd::Errors::InvalidConfiguration)
39
+ end
36
40
  end
37
41
 
38
42
  describe ".default_formatter" do
39
- let(:output) { StringIO.new }
43
+ let(:output) { ::StringIO.new }
40
44
  let(:logger) { DevDNSd::Logger.create(output, Logger::DEBUG) }
41
45
 
42
46
  def get_last_line(buffer)
@@ -45,32 +49,32 @@ describe DevDNSd::Logger do
45
49
 
46
50
  it "should correctly format a DEBUG message" do
47
51
  logger.debug("Message.")
48
- get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] DEBUG: Message."
52
+ get_last_line(output).should == "[#{::Time.now.strftime("%Y/%b/%d %H:%M:%S")}] DEBUG: Message."
49
53
  end
50
54
 
51
55
  it "should correctly format a INFO message" do
52
56
  logger.info("Message.")
53
- get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] INFO: Message."
57
+ get_last_line(output).should == "[#{::Time.now.strftime("%Y/%b/%d %H:%M:%S")}] INFO: Message."
54
58
  end
55
59
 
56
60
  it "should correctly format a WARN message" do
57
61
  logger.warn("Message.")
58
- get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] WARN: Message."
62
+ get_last_line(output).should == "[#{::Time.now.strftime("%Y/%b/%d %H:%M:%S")}] WARN: Message."
59
63
  end
60
64
 
61
65
  it "should correctly format a ERROR message" do
62
66
  logger.error("Message.")
63
- get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] ERROR: Message."
67
+ get_last_line(output).should == "[#{::Time.now.strftime("%Y/%b/%d %H:%M:%S")}] ERROR: Message."
64
68
  end
65
69
 
66
70
  it "should correctly format a FATAL message" do
67
71
  logger.fatal("Message.")
68
- get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] FATAL: Message."
72
+ get_last_line(output).should == "[#{::Time.now.strftime("%Y/%b/%d %H:%M:%S")}] FATAL: Message."
69
73
  end
70
74
 
71
75
  it "should correctly format a INVALID message" do
72
- logger.log(Logger::UNKNOWN, "Message.")
73
- get_last_line(output).should == "[#{Time.now.strftime("%Y/%b/%d %H:%M:%S")}] ANY: Message."
76
+ logger.log(::Logger::UNKNOWN, "Message.")
77
+ get_last_line(output).should == "[#{::Time.now.strftime("%Y/%b/%d %H:%M:%S")}] ANY: Message."
74
78
  end
75
79
  end
76
80
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devdnsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-24 00:00:00.000000000 Z
12
+ date: 2012-07-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubydns
@@ -266,7 +266,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
266
266
  version: '0'
267
267
  segments:
268
268
  - 0
269
- hash: 433211050793937719
269
+ hash: 97728399073097527
270
270
  required_rubygems_version: !ruby/object:Gem::Requirement
271
271
  none: false
272
272
  requirements:
@@ -275,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
275
275
  version: '0'
276
276
  segments:
277
277
  - 0
278
- hash: 433211050793937719
278
+ hash: 97728399073097527
279
279
  requirements: []
280
280
  rubyforge_project: devdnsd
281
281
  rubygems_version: 1.8.24