beacon 0.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
- doc
2
- *.gem
1
+ /doc
2
+ /pkg
3
+ /Gemfile.lock
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - rbx-19mode
6
+ - jruby-19mode
7
+ env:
8
+ - RUBYOPT="$RUBYOPT -Ilib"
9
+ notifications:
10
+ email:
11
+ - contacto@nicolassanguinetti.info
data/CHANGES ADDED
@@ -0,0 +1,11 @@
1
+ 0.9 - March 20th, 2012
2
+ ----------------------
3
+
4
+ * Support for isolated events.
5
+ * Beacon is now a mixin.
6
+ * Added aliases `on` and `trigger` for `watch` and `fire`.
7
+
8
+ 0.1 - April 25th, 2009
9
+ ----------------------
10
+
11
+ Initial release!
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
@@ -25,6 +25,10 @@ Each time you call <tt>watch</tt> with a given name, you register a different
25
25
  handler for that name. Each time you call <tt>fire</tt> <b>all</b> handlers
26
26
  for that event are run, in the order they were registered.
27
27
 
28
+ You can use <tt>on</tt> as an alias of <tt>watch</tt>, and <tt>trigger</tt> as
29
+ an alias of <tt>fire</tt>, since those seem to be popular choices among event
30
+ observing libraries.
31
+
28
32
  == Passing arguments
29
33
 
30
34
  If you want to pass arguments to the watchers, just pass them along in
@@ -38,6 +42,47 @@ And you'll get them as arguments on the block that handles the message:
38
42
  # here object == "cuack", index == 3
39
43
  end
40
44
 
41
- == License
45
+ == Advanced handlers
46
+
47
+ Instead of blocks, <tt>Beacon.watch</tt> can receive any object that responds
48
+ to <tt>call</tt>, so if you need any advanced logic in your handlers, you can
49
+ declare them like this:
50
+
51
+ class MyHandler
52
+ def call(foo, bar=0)
53
+ puts foo.inspect, bar
54
+ end
55
+ end
56
+
57
+ Beacon.watch :an_event, MyHandler.new
58
+
59
+ == Isolated events
60
+
61
+ You can include Beacon into your objects to have isolated events on a per-object
62
+ basis if you need that:
63
+
64
+ class MyObservable
65
+ include Beacon
66
+ end
67
+
68
+ obj = MyObservable.new
69
+ obj.watch(:an_event) { |object, *args| puts *args }
70
+ obj.trigger(:an_event, "foo")
71
+
72
+ == Installing with rubygems
73
+
74
+ gem install beacon
75
+
76
+ == Contributing
77
+
78
+ Clone our git repo from <tt>git://github.com/foca/beacon.git</tt>. The preffered
79
+ way to send a patch is to push to a clone of the repo on github[http://github.com]
80
+ but if you want to mail me a patch or point me to a diff I won't complain. Though
81
+ I'll probably take more to apply it :)
82
+
83
+ == Authors
84
+
85
+ Code written by foca[http://github.com/foca], with the help and ideas of
86
+ halorgium[http://github.com/halorgium], and tizoc[http://github.com/tizoc].
42
87
 
43
88
  The code is licensed under an MIT license. Check the LICENSE file for details.
data/Rakefile CHANGED
@@ -1,33 +1,25 @@
1
- require "rake/testtask"
2
-
3
- begin
4
- require "hanna/rdoctask"
5
- rescue LoadError
6
- require "rake/rdoctask"
7
- end
8
-
9
- begin
10
- require "metric_fu"
11
- rescue LoadError
12
- end
13
-
14
- begin
15
- require "mg"
16
- MG.new("beacon.gemspec")
17
- rescue LoadError
18
- end
1
+ require "rspec/core/rake_task"
2
+ require "hanna/rdoctask"
3
+ require "rubygems/package_task"
19
4
 
20
5
  desc "Default: run all tests"
21
- task :default => :test
6
+ task default: :spec
22
7
 
23
- desc "Run web application tests"
24
- Rake::TestTask.new(:test) do |t|
25
- t.test_files = FileList["test/**/*_test.rb"]
8
+ desc "Run library tests"
9
+ RSpec::Core::RakeTask.new do |t|
10
+ t.pattern = "spec/**/*_spec.rb"
11
+ t.rspec_opts = %w(-fs --color)
26
12
  end
27
13
 
28
14
  Rake::RDocTask.new do |rd|
29
- rd.main = "README"
30
15
  rd.title = "Beacon Documentation"
16
+ rd.main = "README.rdoc"
31
17
  rd.rdoc_files.include("README.rdoc", "LICENSE", "lib/**/*.rb")
32
18
  rd.rdoc_dir = "doc"
33
19
  end
20
+
21
+ gem_spec = eval(File.read("./beacon.gemspec")) rescue nil
22
+ Gem::PackageTask.new(gem_spec) do |pkg|
23
+ pkg.need_zip = false
24
+ pkg.need_tar = false
25
+ end
@@ -1,31 +1,22 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "beacon"
3
- s.version = "0.1"
4
- s.date = "2009-04-22"
3
+ s.version = "0.9.0"
4
+ s.date = "2012-03-20"
5
5
 
6
6
  s.description = "Simple and straightforward observers for your code"
7
7
  s.summary = "Simple and straightforward observers for your code"
8
8
  s.homepage = "http://github.com/foca/beacon"
9
9
 
10
- s.authors = ["Nicolás Sanguinetti"]
10
+ s.authors = ["Nicolas Sanguinetti"]
11
11
  s.email = "contacto@nicolassanguinetti.info"
12
12
 
13
13
  s.require_paths = ["lib"]
14
14
  s.has_rdoc = true
15
- s.rubygems_version = "1.3.1"
15
+ s.rubyforge_project = "beacon"
16
16
 
17
- if s.respond_to?(:add_development_dependency)
18
- s.add_development_dependency "sr-mg"
19
- s.add_development_dependency "contest"
20
- s.add_development_dependency "redgreen"
21
- end
17
+ s.add_development_dependency "rspec", "~> 2.0"
18
+ s.add_development_dependency "hanna", "~> 0.1"
22
19
 
23
- s.files = %w[
24
- .gitignore
25
- LICENSE
26
- README.rdoc
27
- Rakefile
28
- beacon.gemspec
29
- lib/beacon.rb
30
- ]
20
+ s.files = `git ls-files`.split "\n"
21
+ s.platform = Gem::Platform::RUBY
31
22
  end
@@ -1,13 +1,16 @@
1
1
  module Beacon
2
+ extend self
3
+
2
4
  # Fire an event to be processed by all the watchers. You pass the event name
3
5
  # and any arguments you want passed to the event handlers.
4
6
  #
5
7
  # Beacon.fire(:some_event, "an argument", 2, "another")
6
- def self.fire(event, *args)
8
+ def fire(event, *args)
7
9
  events[event].each do |callback|
8
10
  callback.call(*args)
9
11
  end
10
12
  end
13
+ alias_method :trigger, :fire
11
14
 
12
15
  # Register a callback for a given event. Each time you call <tt>fire</tt> then
13
16
  # all the callbacks registered for that name will be called in order.
@@ -15,12 +18,28 @@ module Beacon
15
18
  # Beacon.watch :some_event do |foo, bar, baz|
16
19
  # # do stuff with foo, bar, and baz
17
20
  # end
18
- def self.watch(event, &handler)
21
+ #
22
+ # Instead of passing a block, you can pass any object that responds to
23
+ # <tt>#call</tt>. Like this:
24
+ #
25
+ # class MyHandler
26
+ # def call(foo=1, bar=2, baz=3)
27
+ # puts foo, bar, baz
28
+ # end
29
+ # end
30
+ #
31
+ # Beacon.watch :some_event, MyHandler.new
32
+ def watch(event, handler=nil, &default_handler)
33
+ if handler && block_given?
34
+ raise ArgumentError, "You cannot register a handler with both a block and an object"
35
+ end
36
+ handler = handler || default_handler || raise(ArgumentError, "You must provide a handler")
19
37
  events[event] << handler
20
38
  end
39
+ alias_method :on, :watch
21
40
 
22
- def self.events
41
+ def events
23
42
  @events ||= Hash.new {|h,k| h[k] = [] }
24
43
  end
25
- private_class_method :events
44
+ private :events
26
45
  end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Beacon do
4
+ describe "with a pass-through handler watching :event" do
5
+ before(:each) do
6
+ @args = nil
7
+ Beacon.watch(:event) do |*args|
8
+ @args = args
9
+ end
10
+ end
11
+
12
+ it "allows firing an event with no args" do
13
+ Beacon.fire(:event)
14
+ @args.should == []
15
+ end
16
+
17
+ it "allows firing an event with 1 arg" do
18
+ Beacon.fire(:event, :test)
19
+ @args.should == [:test]
20
+ end
21
+
22
+ it "allows firing an event with args and options" do
23
+ Beacon.fire(:event, :foo, :bar, :baz => :quux)
24
+ @args.should == [:foo, :bar, {:baz => :quux}]
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe Beacon do
4
+ class Observable < Struct.new(:int)
5
+ include Beacon
6
+ end
7
+
8
+ let(:observable_1) { Observable.new(1) }
9
+ let(:observable_2) { Observable.new(1) }
10
+
11
+ before do
12
+ observable_1.watch(:inc) { observable_1.int += 1 }
13
+ end
14
+
15
+ it "can listen to events on instances of objects where you mix in Beacon" do
16
+ expect { observable_1.trigger(:inc) }.to change { observable_1.int }.by(1)
17
+ end
18
+
19
+ it "will ignore events fired on other instances" do
20
+ expect { observable_2.trigger(:inc) }.to_not change { observable_1.int }.by(1)
21
+ expect { Beacon.trigger(:inc) }.to_not change { observable_1.int }.by(1)
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ require "beacon"
2
+
3
+ RSpec.configure do |config|
4
+ config.before(:each) do
5
+ Beacon.instance_variable_set(:@events, nil)
6
+ end
7
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ class Handler
4
+ def initialize
5
+ @value = nil
6
+ end
7
+ attr_reader :value
8
+
9
+ def call
10
+ @value = 1
11
+ end
12
+ end
13
+
14
+ describe Beacon do
15
+ it "allows watching an event with a block" do
16
+ value = nil
17
+ Beacon.watch(:event) do
18
+ value = 1
19
+ end
20
+ Beacon.fire(:event)
21
+ value.should == 1
22
+ end
23
+
24
+ it "allows watching an event with an object" do
25
+ handler = Handler.new
26
+ Beacon.watch(:event, handler)
27
+ Beacon.fire(:event)
28
+ handler.value.should == 1
29
+ end
30
+
31
+ it "disallows watching an event without either a block or an object" do
32
+ lambda { Beacon.watch(:event) }.
33
+ should raise_error(ArgumentError, "You must provide a handler")
34
+ end
35
+
36
+ it "disallows watching an event both a block and an object" do
37
+ lambda {
38
+ Beacon.watch(:event, Handler.new) do
39
+ nil
40
+ end
41
+ }.should raise_error(ArgumentError, "You cannot register a handler with both a block and an object")
42
+ end
43
+ end
metadata CHANGED
@@ -1,87 +1,85 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: beacon
3
- version: !ruby/object:Gem::Version
4
- version: "0.1"
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ prerelease:
5
6
  platform: ruby
6
- authors:
7
- - "Nicol\xC3\xA1s Sanguinetti"
7
+ authors:
8
+ - Nicolas Sanguinetti
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2009-04-22 00:00:00 -03:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: sr-mg
12
+ date: 2012-03-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70336345771700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
17
22
  type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: contest
23
+ prerelease: false
24
+ version_requirements: *70336345771700
25
+ - !ruby/object:Gem::Dependency
26
+ name: hanna
27
+ requirement: &70336345769800 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '0.1'
27
33
  type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: redgreen
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: "0"
44
- version:
34
+ prerelease: false
35
+ version_requirements: *70336345769800
45
36
  description: Simple and straightforward observers for your code
46
37
  email: contacto@nicolassanguinetti.info
47
38
  executables: []
48
-
49
39
  extensions: []
50
-
51
40
  extra_rdoc_files: []
52
-
53
- files:
41
+ files:
54
42
  - .gitignore
43
+ - .travis.yml
44
+ - CHANGES
45
+ - Gemfile
55
46
  - LICENSE
56
47
  - README.rdoc
57
48
  - Rakefile
58
49
  - beacon.gemspec
59
50
  - lib/beacon.rb
60
- has_rdoc: true
51
+ - spec/fire_spec.rb
52
+ - spec/isolated_spec.rb
53
+ - spec/spec_helper.rb
54
+ - spec/watch_spec.rb
61
55
  homepage: http://github.com/foca/beacon
56
+ licenses: []
62
57
  post_install_message:
63
58
  rdoc_options: []
64
-
65
- require_paths:
59
+ require_paths:
66
60
  - lib
67
- required_ruby_version: !ruby/object:Gem::Requirement
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- version: "0"
72
- version:
73
- required_rubygems_version: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- version: "0"
78
- version:
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ segments:
68
+ - 0
69
+ hash: -1274202390002964611
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ segments:
77
+ - 0
78
+ hash: -1274202390002964611
79
79
  requirements: []
80
-
81
- rubyforge_project:
82
- rubygems_version: 1.3.1
80
+ rubyforge_project: beacon
81
+ rubygems_version: 1.8.11
83
82
  signing_key:
84
- specification_version: 2
83
+ specification_version: 3
85
84
  summary: Simple and straightforward observers for your code
86
85
  test_files: []
87
-