watchdog 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ == 0.3.0
2
+ * Add Watchdog.sleep
3
+
1
4
  == 0.2.0
2
5
  * Fix multiple guards per extended class
3
6
  * Fix guarding for subclasses of extended classes
data/README.md CHANGED
@@ -59,6 +59,15 @@ Watchdog also guards over extension modules that define class methods:
59
59
  Date.extend DaysTillXmas
60
60
  # Date.days_till_xmas -> 253 NOOOO...
61
61
 
62
+ Caveats
63
+ =======
64
+
65
+ Watchdog's protectiveness can be problematic with mocks in a test suite as they love to redefine
66
+ methods. Watchdog provides Watchdog.sleep, a Proc to conditionally turn off guarding extension
67
+ methods. By default, Watchdog sets this so that Rspec mocks are allowed to slip by:
68
+
69
+ Watchdog.sleep = lambda { defined? RSpec && !caller.grep(/rspec-mocks/).empty? }
70
+
62
71
  Credits
63
72
  =======
64
73
 
@@ -3,12 +3,14 @@ require 'watchdog/german_shepard'
3
3
  require 'watchdog/version'
4
4
 
5
5
  module Watchdog
6
- class <<self; attr_accessor :extensions, :subclasses; end
6
+ class <<self; attr_accessor :extensions, :subclasses, :sleep; end
7
7
  self.extensions, self.subclasses = {}, []
8
+ # sleep when rspec mocks redefine guarded methods
9
+ self.sleep = lambda { defined? RSpec && !caller.grep(/rspec-mocks/).empty? }
8
10
 
9
11
  # Guards extension methods from being overwritten
10
12
  def self.guard(obj, meth)
11
- return if subclasses.include?(obj)
13
+ return if subclasses.include?(obj) || (sleep && sleep.call)
12
14
  return subclasses << obj if !extensions.key?(obj) && extensions.keys.
13
15
  any? {|e| e.is_a?(Module) && e > obj }
14
16
  if extensions[obj].instance_methods.map(&:to_sym).include?(meth)
@@ -1,3 +1,3 @@
1
1
  module Watchdog
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'watchdog'
2
+ Watchdog.sleep = nil
2
3
 
3
4
  describe Watchdog do
4
5
  def create_methods(obj, *meths)
@@ -103,5 +104,23 @@ describe Watchdog do
103
104
  existing.send :include, another_extensions
104
105
  Watchdog::GermanShepard.created.size.should == 1
105
106
  end
107
+
108
+ context ".sleep" do
109
+ def redefined_method
110
+ existing = Class.new.send :include, extensions
111
+ lambda { existing.send(:define_method, :blah) { } }
112
+ end
113
+ after { Watchdog.sleep = nil }
114
+
115
+ it "ignores error if it evaluates to true" do
116
+ Watchdog.sleep = lambda { true }
117
+ redefined_method.should_not raise_error
118
+ end
119
+
120
+ it "ignores error if set to false" do
121
+ Watchdog.sleep = false
122
+ redefined_method.should raise_error Watchdog::ExtensionMethodExistsError
123
+ end
124
+ end
106
125
  end
107
126
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: watchdog
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.0
5
+ version: 0.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Gabriel Horner
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-17 00:00:00 -04:00
13
+ date: 2011-04-20 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency