publisher 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/README.txt +7 -4
- data/Rakefile +11 -2
- data/lib/publisher.rb +16 -2
- data/test/publisher_test.rb +84 -14
- metadata +26 -8
data/History.txt
CHANGED
data/README.txt
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
* http://
|
1
|
+
== Publisher
|
2
|
+
|
3
|
+
* http://atomicobject.github.com/publisher
|
4
|
+
* http://github.com/atomicobject/publisher
|
5
|
+
* http://gemcutter.com/gems/publisher
|
4
6
|
|
5
7
|
== DESCRIPTION:
|
6
8
|
|
7
9
|
publisher is a module for extending a class with event subscription and firing capabilities. This is helpful for implementing objects that participate in the Observer design pattern.
|
8
10
|
|
9
|
-
== FEATURES
|
11
|
+
== FEATURES:
|
10
12
|
|
11
13
|
* Nice syntax for declaring events that can be subscribed for
|
12
14
|
* Convenient event firing syntax
|
@@ -73,3 +75,4 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
73
75
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
74
76
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
75
77
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
78
|
+
|
data/Rakefile
CHANGED
@@ -13,6 +13,9 @@ Rake::TestTask.new("test") { |t|
|
|
13
13
|
t.verbose = true
|
14
14
|
}
|
15
15
|
|
16
|
+
#
|
17
|
+
# Hoe stuff: rubyforge project release
|
18
|
+
#
|
16
19
|
Hoe.new('publisher', Publisher::VERSION) do |p|
|
17
20
|
p.rubyforge_name = 'atomicobjectrb'
|
18
21
|
p.author = 'Atomic Object'
|
@@ -20,8 +23,14 @@ Hoe.new('publisher', Publisher::VERSION) do |p|
|
|
20
23
|
p.summary = 'Event subscription and firing mechanism'
|
21
24
|
p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
|
22
25
|
p.url = p.paragraphs_of('README.txt', 1).first.gsub(/\* /,'').split(/\n/)
|
23
|
-
# p.url = p.paragraphs_of('README.txt', 1).first.split(/\n/)[1..-1]
|
24
26
|
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
25
27
|
end
|
26
28
|
|
27
|
-
|
29
|
+
if File.exists?("../tools/")
|
30
|
+
load "../tools/tasks/homepage.rake"
|
31
|
+
load "../tools/tasks/release_tagging.rake"
|
32
|
+
ReleaseTagging.new do |t|
|
33
|
+
t.package = "publisher"
|
34
|
+
t.version = Publisher::VERSION
|
35
|
+
end
|
36
|
+
end
|
data/lib/publisher.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# See README.txt for synopsis
|
2
2
|
module Publisher
|
3
|
-
VERSION = "1.1.
|
3
|
+
VERSION = "1.1.1" #:nodoc:#
|
4
4
|
|
5
5
|
# Use this method (or one of the aliases) to declare which events you support
|
6
6
|
# Once invoked, your class will have the neccessary supporting methods for subscribing and firing.
|
@@ -13,6 +13,19 @@ module Publisher
|
|
13
13
|
alias :has_event :has_events
|
14
14
|
alias :can_fire :has_events
|
15
15
|
|
16
|
+
def published_events
|
17
|
+
return @published_events if @published_events == :any_event_is_ok
|
18
|
+
my_events = @published_events || []
|
19
|
+
if self.superclass.respond_to?(:published_events)
|
20
|
+
inherited = self.superclass.published_events
|
21
|
+
if inherited == :any_event_is_ok
|
22
|
+
return :any_event_is_ok
|
23
|
+
end
|
24
|
+
my_events += self.superclass.published_events
|
25
|
+
end
|
26
|
+
my_events
|
27
|
+
end
|
28
|
+
|
16
29
|
# Use this method to allow subscription and firing of arbitrary events.
|
17
30
|
# This is convenient if, eg, your class has dynamic event names.
|
18
31
|
# Don't use this unless you have to; it's better to declare your events if you
|
@@ -65,7 +78,8 @@ module Publisher
|
|
65
78
|
# Does nothing if the current class supports the named event.
|
66
79
|
# Raises RuntimeError otherwise.
|
67
80
|
def ensure_valid(event) #:nodoc:#
|
68
|
-
events = self.class.class_eval { @published_events }
|
81
|
+
# events = self.class.class_eval { @published_events }
|
82
|
+
events = self.class.published_events
|
69
83
|
return if events == :any_event_is_ok
|
70
84
|
raise "Event '#{event}' not available" unless events and events.include?(event)
|
71
85
|
end
|
data/test/publisher_test.rb
CHANGED
@@ -188,20 +188,6 @@ class PublisherTest < Test::Unit::TestCase
|
|
188
188
|
assert_equal 'huh', out
|
189
189
|
end
|
190
190
|
|
191
|
-
# Cannot inherit events right now
|
192
|
-
# class SomebodyKid < Somebody
|
193
|
-
# end
|
194
|
-
#
|
195
|
-
# def test_inheriting_events
|
196
|
-
# obj = SomebodyKid.new
|
197
|
-
# out = nil
|
198
|
-
# obj.on :eat_this do |food|
|
199
|
-
# out = food
|
200
|
-
# end
|
201
|
-
# obj.go "taco"
|
202
|
-
# assert_equal "taco", out
|
203
|
-
# end
|
204
|
-
|
205
191
|
def test_extending_publisher_doesnt_affect_normal_inheritance
|
206
192
|
obj = Billy.new('wheel')
|
207
193
|
assert_equal 'wheel', obj.chair
|
@@ -248,6 +234,56 @@ class PublisherTest < Test::Unit::TestCase
|
|
248
234
|
assert_equal "burger", out1, "First subscription no go"
|
249
235
|
assert_equal "burger", out2, "Second subscription no go"
|
250
236
|
end
|
237
|
+
|
238
|
+
def test_subclasses_inherit_events
|
239
|
+
a = []
|
240
|
+
grampa = Grandfather.new
|
241
|
+
grampa.on :cannons do
|
242
|
+
a << "grampa's cannons"
|
243
|
+
end
|
244
|
+
|
245
|
+
dad = Dad.new
|
246
|
+
dad.on :cannons do
|
247
|
+
a << "dad's cannons"
|
248
|
+
end
|
249
|
+
|
250
|
+
dave = Dave.new
|
251
|
+
dave.on :cannons do
|
252
|
+
a << "dave's cannons"
|
253
|
+
end
|
254
|
+
dave.on :specific do
|
255
|
+
a << "dave's specific"
|
256
|
+
end
|
257
|
+
|
258
|
+
grampa.go
|
259
|
+
dad.go
|
260
|
+
dave.go
|
261
|
+
dave.doit
|
262
|
+
|
263
|
+
assert_equal [
|
264
|
+
"grampa's cannons",
|
265
|
+
"dad's cannons",
|
266
|
+
"dave's cannons",
|
267
|
+
"dave's specific"
|
268
|
+
], a
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_subclasses_inherit_wide_open_events
|
272
|
+
a = []
|
273
|
+
dynamo = Dynamo.new
|
274
|
+
dynamo.when :surprise do
|
275
|
+
a << "surprise"
|
276
|
+
end
|
277
|
+
dynamo.go(:surprise)
|
278
|
+
|
279
|
+
son = SonOfDynamo.new
|
280
|
+
son.when :hooray do
|
281
|
+
a << "hooray"
|
282
|
+
end
|
283
|
+
son.kick_it(:hooray)
|
284
|
+
|
285
|
+
assert_equal [ "surprise", "hooray" ], a
|
286
|
+
end
|
251
287
|
|
252
288
|
#
|
253
289
|
# HELPERS
|
@@ -355,4 +391,38 @@ class PublisherTest < Test::Unit::TestCase
|
|
355
391
|
end
|
356
392
|
end
|
357
393
|
|
394
|
+
class Grandfather
|
395
|
+
extend Publisher
|
396
|
+
can_fire :cannons
|
397
|
+
|
398
|
+
def go
|
399
|
+
fire :cannons
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
class Dad < Grandfather
|
404
|
+
end
|
405
|
+
|
406
|
+
class Dave < Dad
|
407
|
+
can_fire :specific
|
408
|
+
|
409
|
+
def doit
|
410
|
+
fire :specific
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
class Dynamo
|
415
|
+
extend Publisher
|
416
|
+
can_fire_anything
|
417
|
+
def go(sym)
|
418
|
+
fire sym
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
class SonOfDynamo < Dynamo
|
423
|
+
def kick_it(sym)
|
424
|
+
fire sym
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
358
428
|
end
|
metadata
CHANGED
@@ -1,27 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: publisher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
5
|
-
platform:
|
4
|
+
version: 1.1.1
|
5
|
+
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Atomic Object
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-11-08 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: hoe
|
17
|
+
type: :development
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
20
21
|
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
23
|
+
version: 2.3.3
|
23
24
|
version:
|
24
|
-
description:
|
25
|
+
description: |-
|
26
|
+
== DESCRIPTION:
|
27
|
+
|
28
|
+
publisher is a module for extending a class with event subscription and firing capabilities. This is helpful for implementing objects that participate in the Observer design pattern.
|
29
|
+
|
30
|
+
== FEATURES:
|
31
|
+
|
32
|
+
* Nice syntax for declaring events that can be subscribed for
|
33
|
+
* Convenient event firing syntax
|
34
|
+
* Subscribe / unsubscribe functionality
|
35
|
+
* Several method name aliases give you the flexibility to make your code more readable (eg, *fire*, *notify*, *emit*)
|
36
|
+
|
37
|
+
== SYNOPSIS:
|
38
|
+
|
39
|
+
require 'rubygems'
|
40
|
+
require 'publisher'
|
25
41
|
email: dev@atomicobject.com
|
26
42
|
executables: []
|
27
43
|
|
@@ -40,7 +56,9 @@ files:
|
|
40
56
|
- test/publisher_test.rb
|
41
57
|
- test/test_helper.rb
|
42
58
|
has_rdoc: true
|
43
|
-
homepage:
|
59
|
+
homepage: http://atomicobject.github.com/publisher
|
60
|
+
licenses: []
|
61
|
+
|
44
62
|
post_install_message:
|
45
63
|
rdoc_options:
|
46
64
|
- --main
|
@@ -62,9 +80,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
80
|
requirements: []
|
63
81
|
|
64
82
|
rubyforge_project: atomicobjectrb
|
65
|
-
rubygems_version:
|
83
|
+
rubygems_version: 1.3.5
|
66
84
|
signing_key:
|
67
|
-
specification_version:
|
85
|
+
specification_version: 3
|
68
86
|
summary: Event subscription and firing mechanism
|
69
87
|
test_files:
|
70
88
|
- test/test_helper.rb
|