sentinel 0.2.0 → 0.3.0

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.
data/README.textile CHANGED
@@ -16,7 +16,7 @@ $ [sudo] gem install sentinel
16
16
 
17
17
  Then, add it as a dependency in your code using your favorite way (a simple require or mechanisms like the bundler gem).
18
18
 
19
- To use it, first you'll need an observer class that responds to a class method called *_notify_*. All the observed method's arguments will be passed to this method, hence the _args_ splat.
19
+ To use it, first you'll need an observer class that responds to a class method called *_notify_* by default. All the observed method's arguments will be passed to this method, hence the _args_ splat.
20
20
 
21
21
  <pre>
22
22
  class MyObserver
@@ -55,7 +55,21 @@ class MyClass
55
55
  end
56
56
  </pre>
57
57
 
58
- And... that's it! Every time the observed method is called, the _notify_ method from the defined _observer class_ will be called *before* it, then it will run normally.
58
+ And... that's it! Every time the observed method is called, by default the _notify_ method from the defined _observer class_ will be called *before* it, then it will run normally.
59
+
60
+ You can also choose another method to call when the observed method is called, instead of the default _notify_ method:
61
+
62
+ <pre>
63
+ class MyObserver
64
+ include Sentinel
65
+
66
+ observe MyClass, :instance_method, :method_to_notify => :my_notifier
67
+
68
+ def self.my_notifier(*args)
69
+ puts "Do your thing!"
70
+ end
71
+ end
72
+ </pre>
59
73
 
60
74
  h2. Note on Patches/Pull Requests
61
75
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
data/lib/sentinel.rb CHANGED
@@ -9,9 +9,13 @@ module Sentinel
9
9
  def observe(class_name, method_name, options = {})
10
10
  sentinel = self
11
11
 
12
+ options = {
13
+ :method_to_notify => :notify
14
+ }.merge(options)
15
+
12
16
  body = <<-CODE
13
17
  define_method "#{method_name}_with_observer" do |*args|
14
- sentinel.notify(*args)
18
+ sentinel.send("#{options[:method_to_notify]}", *args)
15
19
  self.send("#{method_name}_without_observer", *args)
16
20
  end
17
21
 
data/sentinel.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sentinel}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Lucas H\303\272ngaro"]
12
- s.date = %q{2010-03-02}
12
+ s.date = %q{2010-03-26}
13
13
  s.description = %q{Transparent (unobtrusive) Observers for your Ruby code}
14
14
  s.email = %q{lucashungaro@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -2,4 +2,8 @@ class MyObserver
2
2
  def self.notify(*args)
3
3
  "Observing!"
4
4
  end
5
+
6
+ def self.another_method(*args)
7
+ "Observing!"
8
+ end
5
9
  end
@@ -2,23 +2,27 @@ class SentinelSubject
2
2
  def instance_method
3
3
  "hi from instance method!"
4
4
  end
5
-
5
+
6
+ def new_method
7
+ "hi from new method!"
8
+ end
9
+
6
10
  def self.class_method
7
11
  "hi from class method!"
8
12
  end
9
-
13
+
10
14
  def instance_method_with_params(*params)
11
15
  "hi from instance method with params!"
12
16
  end
13
-
17
+
14
18
  def self.class_method_with_params(*params)
15
19
  "hi from class method with params!"
16
20
  end
17
-
21
+
18
22
  def instance_returning_something
19
23
  42
20
24
  end
21
-
25
+
22
26
  def self.class_returning_something
23
27
  42
24
28
  end
@@ -6,7 +6,7 @@ describe Sentinel, "defining an observer for a method" do
6
6
  before(:all) do
7
7
  MyObserver.send(:include, Sentinel)
8
8
  end
9
-
9
+
10
10
  context "with the minimum required options" do
11
11
  it "should notify the specified Observer when calling a class method" do
12
12
  MyObserver.send(:observe, SentinelSubject, :instance_method)
@@ -14,24 +14,24 @@ describe Sentinel, "defining an observer for a method" do
14
14
 
15
15
  SentinelSubject.new.instance_method
16
16
  end
17
-
17
+
18
18
  it "should notify the specified Observer when calling an instance method" do
19
19
  MyObserver.send(:observe, SentinelSubject, :class_method, :class_method => true)
20
20
  MyObserver.expects(:notify)
21
-
21
+
22
22
  SentinelSubject.class_method
23
23
  end
24
-
24
+
25
25
  it "should not modify the observed methods output" do
26
26
  MyObserver.send(:observe, SentinelSubject, :class_returning_something, :class_method => true)
27
27
  MyObserver.send(:observe, SentinelSubject, :instance_returning_something)
28
-
28
+
29
29
  MyObserver.expects(:notify).twice
30
30
 
31
31
  SentinelSubject.class_returning_something.should == 42
32
32
  SentinelSubject.new.instance_returning_something.should == 42
33
33
  end
34
-
34
+
35
35
  context "observing methods with parameters" do
36
36
  it "should pass all parameters of the observed methods to the Observer" do
37
37
  MyObserver.send(:observe, SentinelSubject, :class_method_with_params, :class_method => true)
@@ -43,20 +43,29 @@ describe Sentinel, "defining an observer for a method" do
43
43
  SentinelSubject.new.instance_method_with_params("texto", 1)
44
44
  end
45
45
  end
46
+
47
+ context "observing methods using a different Observer method" do
48
+ it "should call the specified method in the observe call" do
49
+ MyObserver.send(:observe, SentinelSubject, :new_method, :method_to_notify => :another_method)
50
+ MyObserver.expects(:another_method)
51
+
52
+ SentinelSubject.new.new_method
53
+ end
54
+ end
46
55
  end
47
-
56
+
48
57
  context "without the minimum required options" do
49
58
  it "should raise ArgumentError when the observer of an instance method is not defined" do
50
59
  MyObserver.expects(:notify).never
51
60
  SentinelSubject.expects(:observe).raises(ArgumentError)
52
-
61
+
53
62
  SentinelSubject.send(:observe, :instance_method) rescue nil
54
63
  end
55
64
 
56
65
  it "should raise ArgumentError when the observer of a class method is not defined" do
57
66
  MyObserver.expects(:notify).never
58
67
  SentinelSubject.expects(:observe).raises(ArgumentError)
59
-
68
+
60
69
  SentinelSubject.send(:observe, :class_method, :class_method => true) rescue nil
61
70
  end
62
71
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
7
+ - 3
8
8
  - 0
9
- version: 0.2.0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - "Lucas H\xC3\xBAngaro"
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-02 00:00:00 -03:00
17
+ date: 2010-03-26 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency