Skip to content

Commit 229b219

Browse files
committed
Add IRuby::EventManager
1 parent 671038a commit 229b219

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed

lib/iruby.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
require 'iruby/version'
99
require 'iruby/jupyter'
10+
require 'iruby/event_manager'
1011
require 'iruby/kernel'
1112
require 'iruby/backend'
1213
require 'iruby/ostream'

lib/iruby/event_manager.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
module IRuby
2+
class EventManager
3+
def initialize(available_events)
4+
@available_events = available_events.dup.freeze
5+
@callbacks = available_events.map {|n| [n, []] }.to_h
6+
end
7+
8+
attr_reader :available_events
9+
10+
def register(event, &block)
11+
check_available_event(event)
12+
@callbacks[event] << block unless block.nil?
13+
block
14+
end
15+
16+
def unregister(event, callback)
17+
check_available_event(event)
18+
val = @callbacks[event].delete(callback)
19+
unless val
20+
raise ArgumentError,
21+
"Given callable object #{callback} is not registered as a #{event} callback"
22+
end
23+
val
24+
end
25+
26+
def trigger(event, *args, **kwargs)
27+
check_available_event(event)
28+
@callbacks[event].each do |fn|
29+
fn.call(*args, **kwargs)
30+
end
31+
end
32+
33+
private
34+
35+
def check_available_event(event)
36+
return if @callbacks.key?(event)
37+
raise ArgumentError, "Unknown event name: #{event}", caller
38+
end
39+
end
40+
end

test/iruby/event_manager_test.rb

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
module IRubyTest
2+
class EventManagerTest < TestBase
3+
def setup
4+
@man = IRuby::EventManager.new([:foo, :bar])
5+
end
6+
7+
def test_available_events
8+
assert_equal([:foo, :bar],
9+
@man.available_events)
10+
end
11+
12+
sub_test_case("#register") do
13+
sub_test_case("known event name") do
14+
def test_register
15+
fn = ->() {}
16+
assert_equal(fn,
17+
@man.register(:foo, &fn))
18+
end
19+
end
20+
21+
sub_test_case("unknown event name") do
22+
def test_register
23+
assert_raise_message("Unknown event name: baz") do
24+
@man.register(:baz) {}
25+
end
26+
end
27+
end
28+
end
29+
30+
sub_test_case("#unregister") do
31+
sub_test_case("no event is registered") do
32+
def test_unregister
33+
fn = ->() {}
34+
assert_raise_message("Given callable object #{fn} is not registered as a foo callback") do
35+
@man.unregister(:foo, fn)
36+
end
37+
end
38+
end
39+
40+
sub_test_case("the registered callable is given") do
41+
def test_unregister
42+
results = { values: [] }
43+
fn = ->(a) { values << a }
44+
45+
@man.register(:foo, &fn)
46+
47+
results[:retval] = @man.unregister(:foo, fn)
48+
49+
@man.trigger(:foo, 42)
50+
51+
assert_equal({
52+
values: [],
53+
retval: fn
54+
},
55+
results)
56+
end
57+
end
58+
end
59+
60+
sub_test_case("#trigger") do
61+
sub_test_case("no event is registered") do
62+
def test_trigger
63+
assert_nothing_raised do
64+
@man.trigger(:foo)
65+
end
66+
end
67+
end
68+
69+
sub_test_case("some events are registered") do
70+
def test_trigger
71+
values = []
72+
@man.register(:foo) {|a| values << a }
73+
@man.register(:foo) {|a| values << 10*a }
74+
@man.register(:foo) {|a| values << 100+a }
75+
76+
@man.trigger(:foo, 5)
77+
78+
assert_equal([5, 50, 105],
79+
values)
80+
end
81+
end
82+
83+
sub_test_case("unknown event name") do
84+
def test_trigger
85+
assert_raise_message("Unknown event name: baz") do
86+
@man.trigger(:baz, 100)
87+
end
88+
end
89+
end
90+
end
91+
end
92+
end

0 commit comments

Comments
 (0)