blockenspiel 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Blockenspiel.rdoc +12 -4
- data/History.rdoc +8 -0
- data/README.rdoc +10 -6
- data/Rakefile +88 -92
- data/lib/blockenspiel.rb +22 -4
- data/lib/blockenspiel/builder.rb +201 -0
- data/lib/blockenspiel/dsl_setup.rb +361 -0
- data/lib/blockenspiel/errors.rb +61 -0
- data/lib/blockenspiel/impl.rb +290 -604
- data/lib/blockenspiel/version.rb +2 -2
- data/lib/blockenspiel/versionomy.rb +1 -1
- data/lib/blockenspiel_unmixer.jar +0 -0
- data/tests/files/file1.rb +2 -0
- data/tests/tc_basic.rb +30 -0
- data/tests/tc_mixins.rb +139 -2
- metadata +12 -8
data/lib/blockenspiel/version.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# Blockenspiel version
|
4
4
|
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
|
-
# Copyright 2008-
|
6
|
+
# Copyright 2008-2010 Daniel Azuma
|
7
7
|
#
|
8
8
|
# All rights reserved.
|
9
9
|
#
|
@@ -37,7 +37,7 @@
|
|
37
37
|
module Blockenspiel
|
38
38
|
|
39
39
|
# Current gem version, as a frozen string.
|
40
|
-
VERSION_STRING = '0.
|
40
|
+
VERSION_STRING = '0.4.0'.freeze
|
41
41
|
|
42
42
|
autoload(:VERSION, ::File.dirname(__FILE__)+'/versionomy.rb')
|
43
43
|
|
Binary file
|
data/tests/tc_basic.rb
CHANGED
@@ -131,6 +131,36 @@ module Blockenspiel
|
|
131
131
|
end
|
132
132
|
|
133
133
|
|
134
|
+
# Test basic usage with a string.
|
135
|
+
#
|
136
|
+
# * Asserts that the specified target object receives the messages.
|
137
|
+
|
138
|
+
def test_basic_string
|
139
|
+
string_ = <<-STR
|
140
|
+
set_value(:a, 1)
|
141
|
+
set_value_by_block(:b){ 2 }
|
142
|
+
STR
|
143
|
+
target_ = SimpleTarget.new
|
144
|
+
::Blockenspiel.invoke(string_, target_)
|
145
|
+
assert(!self.respond_to?(:set_value))
|
146
|
+
assert_equal(1, target_.get_value(:a))
|
147
|
+
assert_equal(2, target_.get_value(:b))
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
# Test basic usage with a file.
|
152
|
+
#
|
153
|
+
# * Asserts that the specified target object receives the messages.
|
154
|
+
|
155
|
+
def test_basic_file
|
156
|
+
target_ = SimpleTarget.new
|
157
|
+
::Blockenspiel.invoke(target_, :file => "#{File.dirname(__FILE__)}/files/file1.rb")
|
158
|
+
assert(!self.respond_to?(:set_value))
|
159
|
+
assert_equal(1, target_.get_value(:a))
|
160
|
+
assert_equal(2, target_.get_value(:b))
|
161
|
+
end
|
162
|
+
|
163
|
+
|
134
164
|
end
|
135
165
|
|
136
166
|
end
|
data/tests/tc_mixins.rb
CHANGED
@@ -242,12 +242,12 @@ module Blockenspiel
|
|
242
242
|
hash_ = ::Hash.new
|
243
243
|
block1_ = ::Proc.new do
|
244
244
|
set_value('a', 1)
|
245
|
-
sleep(0.
|
245
|
+
sleep(0.1)
|
246
246
|
set_value2('b'){ 2 }
|
247
247
|
end
|
248
248
|
block2_ = ::Proc.new do
|
249
249
|
set_value('c', 3)
|
250
|
-
sleep(
|
250
|
+
sleep(0.2)
|
251
251
|
set_value2('d'){ 4 }
|
252
252
|
end
|
253
253
|
target_ = Target1.new(hash_)
|
@@ -266,6 +266,143 @@ module Blockenspiel
|
|
266
266
|
end
|
267
267
|
|
268
268
|
|
269
|
+
# A full thread test with the same set of nested mixins done into the same
|
270
|
+
# object twice in two different threads.
|
271
|
+
#
|
272
|
+
# * Asserts that the right methods are added and removed at the right time.
|
273
|
+
# * Asserts that the methods delegate to the right target object, even when
|
274
|
+
# multiple mixins add the same method name, multiple times from different
|
275
|
+
# threads.
|
276
|
+
|
277
|
+
def test_nested_two_threads
|
278
|
+
hash_ = {}
|
279
|
+
target1_ = Target1.new(hash_)
|
280
|
+
target2_ = Target2.new(hash_)
|
281
|
+
assert(!self.respond_to?(:set_value))
|
282
|
+
assert(!self.respond_to?(:set_value2))
|
283
|
+
assert(!self.respond_to?(:set_value2_inmixin))
|
284
|
+
t1_ = ::Thread.new do
|
285
|
+
::Blockenspiel.invoke(::Proc.new do
|
286
|
+
sleep(0.1)
|
287
|
+
set_value('a', 1)
|
288
|
+
set_value2('b'){ 2 }
|
289
|
+
::Blockenspiel.invoke(::Proc.new do
|
290
|
+
sleep(0.1)
|
291
|
+
set_value('c', 3)
|
292
|
+
set_value2_inmixin('d'){ 4 }
|
293
|
+
end, target2_)
|
294
|
+
sleep(0.1)
|
295
|
+
set_value('e', 5)
|
296
|
+
set_value2('f'){ 6 }
|
297
|
+
end, target1_)
|
298
|
+
end
|
299
|
+
t2_ = ::Thread.new do
|
300
|
+
::Blockenspiel.invoke(::Proc.new do
|
301
|
+
sleep(0.1)
|
302
|
+
set_value('A', 11)
|
303
|
+
set_value2_inmixin('B'){ 12 }
|
304
|
+
::Blockenspiel.invoke(::Proc.new do
|
305
|
+
sleep(0.1)
|
306
|
+
set_value('C', 13)
|
307
|
+
set_value2('D'){ 14 }
|
308
|
+
end, target1_)
|
309
|
+
sleep(0.1)
|
310
|
+
set_value('E', 15)
|
311
|
+
set_value2_inmixin('F'){ 16 }
|
312
|
+
end, target2_)
|
313
|
+
end
|
314
|
+
t1_.join
|
315
|
+
t2_.join
|
316
|
+
assert(!self.respond_to?(:set_value))
|
317
|
+
assert(!self.respond_to?(:set_value2))
|
318
|
+
assert(!self.respond_to?(:set_value2_inmixin))
|
319
|
+
assert_equal(1, hash_['a1'])
|
320
|
+
assert_equal(2, hash_['b1'])
|
321
|
+
assert_equal(3, hash_['c2'])
|
322
|
+
assert_equal(4, hash_['d2'])
|
323
|
+
assert_equal(5, hash_['e1'])
|
324
|
+
assert_equal(6, hash_['f1'])
|
325
|
+
assert_equal(11, hash_['A2'])
|
326
|
+
assert_equal(12, hash_['B2'])
|
327
|
+
assert_equal(13, hash_['C1'])
|
328
|
+
assert_equal(14, hash_['D1'])
|
329
|
+
assert_equal(15, hash_['E2'])
|
330
|
+
assert_equal(16, hash_['F2'])
|
331
|
+
end
|
332
|
+
|
333
|
+
|
334
|
+
# A full fiber test with the same set of nested mixins done into the same
|
335
|
+
# object twice in two different fibers.
|
336
|
+
#
|
337
|
+
# * Asserts that the right methods are added and removed at the right time.
|
338
|
+
# * Asserts that the methods delegate to the right target object, even when
|
339
|
+
# multiple mixins add the same method name, multiple times from different
|
340
|
+
# fibers.
|
341
|
+
|
342
|
+
def test_nested_two_fibers
|
343
|
+
return unless defined?(::Fiber)
|
344
|
+
hash_ = {}
|
345
|
+
target1_ = Target1.new(hash_)
|
346
|
+
target2_ = Target2.new(hash_)
|
347
|
+
assert(!self.respond_to?(:set_value))
|
348
|
+
assert(!self.respond_to?(:set_value2))
|
349
|
+
assert(!self.respond_to?(:set_value2_inmixin))
|
350
|
+
f1_ = ::Fiber.new do
|
351
|
+
::Blockenspiel.invoke(::Proc.new do
|
352
|
+
::Fiber.yield
|
353
|
+
set_value('a', 1)
|
354
|
+
set_value2('b'){ 2 }
|
355
|
+
::Blockenspiel.invoke(::Proc.new do
|
356
|
+
::Fiber.yield
|
357
|
+
set_value('c', 3)
|
358
|
+
set_value2_inmixin('d'){ 4 }
|
359
|
+
end, target2_)
|
360
|
+
::Fiber.yield
|
361
|
+
set_value('e', 5)
|
362
|
+
set_value2('f'){ 6 }
|
363
|
+
end, target1_)
|
364
|
+
end
|
365
|
+
f2_ = ::Fiber.new do
|
366
|
+
::Blockenspiel.invoke(::Proc.new do
|
367
|
+
::Fiber.yield
|
368
|
+
set_value('A', 11)
|
369
|
+
set_value2_inmixin('B'){ 12 }
|
370
|
+
::Blockenspiel.invoke(::Proc.new do
|
371
|
+
::Fiber.yield
|
372
|
+
set_value('C', 13)
|
373
|
+
set_value2('D'){ 14 }
|
374
|
+
end, target1_)
|
375
|
+
::Fiber.yield
|
376
|
+
set_value('E', 15)
|
377
|
+
set_value2_inmixin('F'){ 16 }
|
378
|
+
end, target2_)
|
379
|
+
end
|
380
|
+
f1_.resume
|
381
|
+
f2_.resume
|
382
|
+
f1_.resume
|
383
|
+
f2_.resume
|
384
|
+
f1_.resume
|
385
|
+
f2_.resume
|
386
|
+
f1_.resume
|
387
|
+
f2_.resume
|
388
|
+
assert(!self.respond_to?(:set_value))
|
389
|
+
assert(!self.respond_to?(:set_value2))
|
390
|
+
assert(!self.respond_to?(:set_value2_inmixin))
|
391
|
+
assert_equal(1, hash_['a1'])
|
392
|
+
assert_equal(2, hash_['b1'])
|
393
|
+
assert_equal(3, hash_['c2'])
|
394
|
+
assert_equal(4, hash_['d2'])
|
395
|
+
assert_equal(5, hash_['e1'])
|
396
|
+
assert_equal(6, hash_['f1'])
|
397
|
+
assert_equal(11, hash_['A2'])
|
398
|
+
assert_equal(12, hash_['B2'])
|
399
|
+
assert_equal(13, hash_['C1'])
|
400
|
+
assert_equal(14, hash_['D1'])
|
401
|
+
assert_equal(15, hash_['E2'])
|
402
|
+
assert_equal(16, hash_['F2'])
|
403
|
+
end
|
404
|
+
|
405
|
+
|
269
406
|
# Test mixin omissions.
|
270
407
|
#
|
271
408
|
# * Asserts that underscore methods are not mixed in.
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blockenspiel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
version: 0.4.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel Azuma
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-06-21 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -34,11 +34,15 @@ files:
|
|
34
34
|
- ext/blockenspiel/unmixer.c
|
35
35
|
- ext/blockenspiel/extconf.rb
|
36
36
|
- ext/blockenspiel/BlockenspielUnmixerService.java
|
37
|
+
- lib/blockenspiel/builder.rb
|
38
|
+
- lib/blockenspiel/dsl_setup.rb
|
39
|
+
- lib/blockenspiel/errors.rb
|
37
40
|
- lib/blockenspiel/impl.rb
|
38
41
|
- lib/blockenspiel/version.rb
|
39
42
|
- lib/blockenspiel/versionomy.rb
|
40
43
|
- lib/blockenspiel.rb
|
41
44
|
- lib/blockenspiel_unmixer.jar
|
45
|
+
- tests/files/file1.rb
|
42
46
|
- tests/tc_basic.rb
|
43
47
|
- tests/tc_behaviors.rb
|
44
48
|
- tests/tc_dsl_attrs.rb
|
@@ -65,12 +69,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
65
69
|
requirements:
|
66
70
|
- - ">="
|
67
71
|
- !ruby/object:Gem::Version
|
68
|
-
hash:
|
72
|
+
hash: 57
|
69
73
|
segments:
|
70
74
|
- 1
|
71
75
|
- 8
|
72
|
-
-
|
73
|
-
version: 1.8.
|
76
|
+
- 7
|
77
|
+
version: 1.8.7
|
74
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
79
|
none: false
|
76
80
|
requirements:
|