triton 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ .idea
2
+ *.gem
data/.rvmrc ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
+ environment_id="ruby-1.9.3-p0@triton"
8
+
9
+ #
10
+ # Uncomment following line if you want options to be set only for given project.
11
+ #
12
+ # PROJECT_JRUBY_OPTS=( --1.9 )
13
+
14
+ #
15
+ # First we attempt to load the desired environment directly from the environment
16
+ # file. This is very fast and efficient compared to running through the entire
17
+ # CLI and selector. If you want feedback on which environment was used then
18
+ # insert the word 'use' after --create as this triggers verbose mode.
19
+ #
20
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
21
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
22
+ then
23
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
24
+
25
+ if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
26
+ then
27
+ . "${rvm_path:-$HOME/.rvm}/hooks/after_use"
28
+ fi
29
+ else
30
+ # If the environment file has not yet been created, use the RVM CLI to select.
31
+ if ! rvm --create "$environment_id"
32
+ then
33
+ echo "Failed to create RVM environment '${environment_id}'."
34
+ exit 1
35
+ fi
36
+ fi
37
+
38
+ #
39
+ # If you use an RVM gemset file to install a list of gems (*.gems), you can have
40
+ # it be automatically loaded. Uncomment the following and adjust the filename if
41
+ # necessary.
42
+ #
43
+ # filename=".gems"
44
+ # if [[ -s "$filename" ]]
45
+ # then
46
+ # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
47
+ # fi
48
+
49
+ # If you use bundler, this might be useful to you:
50
+ if command -v bundle && [[ -s Gemfile ]]
51
+ then
52
+ bundle install
53
+ fi
54
+
55
+
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ platforms :mri_18 do
6
+ gem "ruby-debug", ">= 0.10.3"
7
+ gem "linecache", "<= 0.45"
8
+ end
9
+
10
+ platforms :mri_19 do
11
+ gem "ruby-debug19"
12
+ end
@@ -0,0 +1,44 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ triton (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ archive-tar-minitar (0.5.2)
10
+ columnize (0.3.4)
11
+ linecache (0.45)
12
+ linecache19 (0.5.12)
13
+ ruby_core_source (>= 0.1.4)
14
+ metaclass (0.0.1)
15
+ minitest (2.7.0)
16
+ mocha (0.10.0)
17
+ metaclass (~> 0.0.1)
18
+ ruby-debug (0.10.4)
19
+ columnize (>= 0.1)
20
+ ruby-debug-base (~> 0.10.4.0)
21
+ ruby-debug-base (0.10.4)
22
+ linecache (>= 0.3)
23
+ ruby-debug-base19 (0.11.25)
24
+ columnize (>= 0.3.1)
25
+ linecache19 (>= 0.5.11)
26
+ ruby_core_source (>= 0.1.4)
27
+ ruby-debug19 (0.11.6)
28
+ columnize (>= 0.3.1)
29
+ linecache19 (>= 0.5.11)
30
+ ruby-debug-base19 (>= 0.11.19)
31
+ ruby_core_source (0.1.5)
32
+ archive-tar-minitar (>= 0.5.2)
33
+
34
+ PLATFORMS
35
+ ruby
36
+
37
+ DEPENDENCIES
38
+ bundler (~> 1.0)
39
+ linecache (<= 0.45)
40
+ minitest (~> 2.7.0)
41
+ mocha (~> 0.10.0)
42
+ ruby-debug (>= 0.10.3)
43
+ ruby-debug19
44
+ triton!
@@ -0,0 +1,7 @@
1
+ Copyright (c) 2011 Cédric Darné.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,23 @@
1
+ Triton
2
+ ======
3
+
4
+ Description
5
+ -----------
6
+ Triton is an implementation of the event/listener pattern like EventEmitter on Node.js.
7
+
8
+ Installation
9
+ ------------
10
+ gem install triton
11
+
12
+ Example
13
+ -------
14
+ require 'triton'
15
+ Triton::Messenger.on(:alert) { puts "alert!" }
16
+ Triton::Messenger.emit(:alert)
17
+ # -> alert!
18
+
19
+ License
20
+ -------
21
+ Released under the MIT License. See the [LICENSE][license] file for further details.
22
+
23
+ [license]: https://github.com/cdarne/triton/blob/master/LICENSE.md
@@ -0,0 +1,2 @@
1
+ require_relative "triton/version"
2
+ require_relative "triton/messenger"
@@ -0,0 +1,99 @@
1
+ module Triton
2
+ # The Messenger module provides a simple event emitter/listener system
3
+ #
4
+ # == Example
5
+ #
6
+ # require 'triton'
7
+ #
8
+ # Triton::Messenger.on(:alert) { puts "alert!" }
9
+ # Triton::Messenger.emit(:alert)
10
+ # # -> alert!
11
+ module Messenger
12
+ extend self # This make Messenger behave like a singleton
13
+
14
+ def listeners # this makes @listeners to be auto-initialized and accessed read-only
15
+ @listeners ||= Hash.new
16
+ end
17
+
18
+ # Register the given block to be called when the events of type +type+ will be emitted.
19
+ # if +once+, the block will be called once
20
+ def add_listener(type, once=false, &callback)
21
+ listeners[type] ||= []
22
+ listeners[type] << Listener.new(type, callback, once)
23
+ emit(:new_listener, self, type, once, callback)
24
+ end
25
+
26
+ alias :on :add_listener
27
+
28
+ # Register the given block to be called only once when the events of type +type+ will be emitted.
29
+ def once(type, &callback)
30
+ add_listener(type, true, &callback)
31
+ end
32
+
33
+ # Unregister the given block. It won't be call then went an event is emitted.
34
+ def remove_listener(type, listener)
35
+ if listeners.has_key? type
36
+ listeners[type].delete(listener)
37
+ listeners.delete(type) if listeners[type].empty?
38
+ end
39
+ end
40
+
41
+ # Unregister all the listener for the +type+ events.
42
+ # If +type+ is omitted, unregister *all* the listeners.
43
+ def remove_all_listeners(type=nil)
44
+ if type
45
+ listeners.delete(type)
46
+ else
47
+ listeners.clear
48
+ end
49
+ end
50
+
51
+ # Emit an event of type +type+ and call all the registered listeners to this event.
52
+ # The +sender+ param will help the listener to identify who is emitting the event.
53
+ # You can pass then every additional arguments you'll need
54
+ def emit(type, sender=nil, *args)
55
+ listeners[type].each { |l| l.fire(sender, *args) } if listeners.has_key? type
56
+ end
57
+
58
+ # Mixin that add shortcuts to emit events
59
+ module Emittable
60
+ def emit(type, *args)
61
+ Triton::Messenger.emit(type, self, *args)
62
+ end
63
+ end
64
+
65
+ # Mixin that add shortcuts to emit events
66
+ module Listenable
67
+ def add_listener(type, once=false, &listener)
68
+ Triton::Messenger.add_listener(type, once, &listener)
69
+ end
70
+
71
+ alias :on :add_listener
72
+
73
+ def once(type, &listener)
74
+ Triton::Messenger.once(type, &listener)
75
+ end
76
+ end
77
+
78
+ # The Listener class helps managing event triggering.
79
+ # It may not be used as its own.
80
+ class Listener
81
+ attr_accessor :type, :callback, :once
82
+
83
+ def initialize(type, callback, once=false)
84
+ @type = type
85
+ @callback = callback
86
+ @once = once
87
+ end
88
+
89
+ # Call the event listener passing through the +sender+ and the additional args
90
+ def fire(sender=nil, *args)
91
+ @callback.call(sender, *args)
92
+
93
+ if @once
94
+ Messenger::remove_listener(@type, self)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,3 @@
1
+ module Triton
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,170 @@
1
+ require_relative "./test_helper"
2
+
3
+ describe Triton::Messenger do
4
+
5
+ before :each do
6
+ Triton::Messenger.remove_all_listeners
7
+ end
8
+
9
+ it "registers listeners" do
10
+ ok = false
11
+ Triton::Messenger.on(:test) { ok = true }
12
+ Triton::Messenger.emit(:test)
13
+ ok.must_equal true
14
+ end
15
+
16
+ it "registers listeners once with the +once+ parameter" do
17
+ ok = 0
18
+ Triton::Messenger.on(:test, true) { ok += 1 }
19
+ 2.times { Triton::Messenger.emit(:test) }
20
+ ok.must_equal 1
21
+ end
22
+
23
+ it "registers listeners once with _once_" do
24
+ ok = 0
25
+ Triton::Messenger.once(:test) { ok += 1 }
26
+ 2.times { Triton::Messenger.emit(:test) }
27
+ ok.must_equal 1
28
+ end
29
+
30
+ it "emits a new_listener event when an listener is registered" do
31
+ received_sender = nil
32
+ received_args = nil
33
+ cb = lambda do |s, *args|
34
+ received_sender = s
35
+ received_args = args
36
+ end
37
+ Triton::Messenger.on(:new_listener, false, &cb)
38
+ received_sender.must_be_same_as Triton::Messenger
39
+ received_args.must_equal [:new_listener, false, cb]
40
+ end
41
+
42
+ it "unregisters listeners" do
43
+ ok = false
44
+ Triton::Messenger.on(:test) { fail "it should not have been called" }
45
+ Triton::Messenger.on(:test) { ok = true }
46
+ Triton::Messenger.remove_listener(:test, Triton::Messenger.listeners[:test].first)
47
+ Triton::Messenger.emit(:test)
48
+ ok.must_equal true
49
+ end
50
+
51
+ it "should not unregister listeners of unknown type" do
52
+ ok = false
53
+ Triton::Messenger.on(:test) { ok = true }
54
+ Triton::Messenger.remove_listener(:unknown, Triton::Messenger.listeners[:test].first)
55
+ Triton::Messenger.emit(:test)
56
+ ok.must_equal true
57
+ end
58
+
59
+ it "should not unregister unknown listeners" do
60
+ ok = false
61
+ Triton::Messenger.on(:test) { ok = true }
62
+ Triton::Messenger.remove_listener(:test, Triton::Messenger::Listener.new(:test, nil))
63
+ Triton::Messenger.emit(:test)
64
+ ok.must_equal true
65
+ end
66
+
67
+ it "unregisters all listeners of one type" do
68
+ ok = false
69
+ Triton::Messenger.on(:test) { fail "it should not have been called" }
70
+ Triton::Messenger.on(:test) { fail "it should not have been called" }
71
+ Triton::Messenger.on(:test2) { ok = true }
72
+ Triton::Messenger.remove_all_listeners(:test)
73
+ Triton::Messenger.emit(:test)
74
+ Triton::Messenger.emit(:test2)
75
+ ok.must_equal true
76
+ end
77
+
78
+ it "unregisters all listeners of all type" do
79
+ Triton::Messenger.on(:test) { fail "it should not have been called" }
80
+ Triton::Messenger.on(:test2) { fail "it should not have been called" }
81
+ Triton::Messenger.remove_all_listeners
82
+ Triton::Messenger.emit(:test)
83
+ Triton::Messenger.emit(:test2)
84
+ end
85
+
86
+ it "emits events to the right listener" do
87
+ Triton::Messenger.on(:test) { }
88
+ Triton::Messenger.on(:test2) { fail "it should not have been called" }
89
+ Triton::Messenger.emit(:test)
90
+ end
91
+
92
+ it "should not emit events when the type is unknown" do
93
+ Triton::Messenger.on(:test) { fail "it should not have been called" }
94
+ Triton::Messenger.on(:test2) { fail "it should not have been called" }
95
+ Triton::Messenger.emit(:unknown)
96
+ end
97
+
98
+ it "emits events and passes the sender" do
99
+ received_sender = nil
100
+ expected_sender = Object.new
101
+ Triton::Messenger.on(:test) { |s| received_sender = s }
102
+ Triton::Messenger.emit(:test, expected_sender)
103
+ received_sender.must_be_same_as expected_sender
104
+ end
105
+
106
+ it "emits events and passes additional arguments" do
107
+ received_args = nil
108
+ expected_args = {:arg => "yeah"}
109
+ Triton::Messenger.on(:test) { |s, opts| received_args = opts }
110
+ Triton::Messenger.emit(:test, nil, :arg => "yeah")
111
+ received_args.must_equal expected_args
112
+ end
113
+ end
114
+
115
+
116
+ describe Triton::Messenger::Listener do
117
+
118
+ it "should default the once instance variable to false" do
119
+ event = Triton::Messenger::Listener.new(:test, nil)
120
+ event.once.must_equal false
121
+ end
122
+
123
+ it "calls the provided callback" do
124
+ called = false
125
+ cb = lambda { |s| called = true }
126
+ event = Triton::Messenger::Listener.new(:test, cb)
127
+ event.fire
128
+ called.must_equal true
129
+ end
130
+
131
+ it "unregisters itself once the event fired" do
132
+ event = Triton::Messenger::Listener.new(:test, lambda { |s| }, true)
133
+ Triton::Messenger.expects(:remove_listener).with(:test, event)
134
+ event.fire
135
+ end
136
+ end
137
+
138
+ describe Triton::Messenger::Emittable do
139
+
140
+ it "should emit a signal on this name" do
141
+ klass = Class.new { include Triton::Messenger::Emittable }
142
+ instance = klass.new
143
+ Triton::Messenger.expects(:emit).with(:test, instance, :arg)
144
+ instance.emit(:test, :arg)
145
+ end
146
+ end
147
+
148
+ describe Triton::Messenger::Listenable do
149
+
150
+ before :each do
151
+ Triton::Messenger.remove_all_listeners
152
+ klass = Class.new { include Triton::Messenger::Listenable }
153
+ @instance = klass.new
154
+ end
155
+
156
+ it "should shortcut the #add_listener method" do
157
+ Triton::Messenger.expects(:add_listener).with(:test_add_listener, true)
158
+ @instance.add_listener(:test_add_listener, true)
159
+ end
160
+
161
+ it "should shortcut the #on method" do
162
+ Triton::Messenger.expects(:add_listener).with(:test_on, true)
163
+ @instance.on(:test_on, true)
164
+ end
165
+
166
+ it "should shortcut the #once method" do
167
+ Triton::Messenger.expects(:once).with(:test_once)
168
+ @instance.once(:test_once)
169
+ end
170
+ end
@@ -0,0 +1,4 @@
1
+ require 'minitest/spec'
2
+ require 'minitest/autorun'
3
+ require 'mocha'
4
+ require_relative '../lib/triton'
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require "#{File.dirname(__FILE__)}/lib/triton/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.add_development_dependency "minitest", "~> 2.7.0"
6
+ s.add_development_dependency "mocha", "~> 0.10.0"
7
+ s.add_development_dependency "bundler", "~> 1.0"
8
+ s.authors = ["Cédric Darné"]
9
+ s.description = %q{Triton is an implementation of the event/listener pattern like EventEmitter on Node.js}
10
+ s.email = "cedric.darne@gmail.com"
11
+ s.extra_rdoc_files = ['LICENSE.md', 'README.md']
12
+ s.files = `git ls-files`.split("\n")
13
+ s.homepage = 'http://github.com/cdarne/triton'
14
+ s.name = "triton"
15
+ s.require_path = ['lib']
16
+ s.required_ruby_version = ">= 1.9.2"
17
+ s.required_rubygems_version = Gem::Requirement.new('>= 1.8.0')
18
+ s.summary = s.description
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.version = Triton::VERSION.dup
21
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: triton
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Cédric Darné
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: minitest
16
+ requirement: &21387460 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.7.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *21387460
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ requirement: &21386660 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.10.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *21386660
36
+ - !ruby/object:Gem::Dependency
37
+ name: bundler
38
+ requirement: &21385920 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '1.0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *21385920
47
+ description: Triton is an implementation of the event/listener pattern like EventEmitter
48
+ on Node.js
49
+ email: cedric.darne@gmail.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files:
53
+ - LICENSE.md
54
+ - README.md
55
+ files:
56
+ - .gitignore
57
+ - .rvmrc
58
+ - Gemfile
59
+ - Gemfile.lock
60
+ - LICENSE.md
61
+ - README.md
62
+ - lib/triton.rb
63
+ - lib/triton/messenger.rb
64
+ - lib/triton/version.rb
65
+ - test/messenger_test.rb
66
+ - test/test_helper.rb
67
+ - triton.gemspec
68
+ homepage: http://github.com/cdarne/triton
69
+ licenses: []
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: 1.9.2
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 1.8.0
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 1.8.11
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: Triton is an implementation of the event/listener pattern like EventEmitter
92
+ on Node.js
93
+ test_files:
94
+ - test/messenger_test.rb
95
+ - test/test_helper.rb