blockenspiel 0.3.3-java → 0.4.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Blockenspiel.rdoc +12 -4
- data/History.rdoc +8 -0
- data/README.rdoc +10 -6
- data/Rakefile +88 -92
- 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.rb +22 -4
- 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 +60 -51
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
|
|
data/lib/blockenspiel.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Blockenspiel entry point
|
|
4
4
|
#
|
|
5
5
|
# -----------------------------------------------------------------------------
|
|
6
|
-
# Copyright 2008 Daniel Azuma
|
|
6
|
+
# Copyright 2008-2010 Daniel Azuma
|
|
7
7
|
#
|
|
8
8
|
# All rights reserved.
|
|
9
9
|
#
|
|
@@ -34,10 +34,28 @@
|
|
|
34
34
|
;
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
# == Blockenspiel
|
|
38
|
+
#
|
|
39
|
+
# The Blockenspiel module provides a namespace for Blockenspiel, as well as
|
|
40
|
+
# the main entry point method "invoke".
|
|
41
|
+
|
|
42
|
+
module Blockenspiel
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
includes_ = [
|
|
47
|
+
'errors',
|
|
48
|
+
'dsl_setup',
|
|
49
|
+
'builder',
|
|
50
|
+
'impl',
|
|
51
|
+
'version',
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
dir_ = ::File.expand_path('blockenspiel', ::File.dirname(__FILE__))
|
|
37
56
|
if ::RUBY_PLATFORM =~ /java/
|
|
38
57
|
require "blockenspiel_unmixer"
|
|
39
58
|
else
|
|
40
|
-
|
|
59
|
+
includes_.unshift('unmixer')
|
|
41
60
|
end
|
|
42
|
-
require "#{
|
|
43
|
-
require "#{File.dirname(__FILE__)}/blockenspiel/version"
|
|
61
|
+
includes_.each{ |file_| require "#{dir_}/#{file_}" }
|
|
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,20 +1,21 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: blockenspiel
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 15
|
|
4
5
|
prerelease: false
|
|
5
6
|
segments:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
version: 0.
|
|
7
|
+
- 0
|
|
8
|
+
- 4
|
|
9
|
+
- 0
|
|
10
|
+
version: 0.4.0
|
|
10
11
|
platform: java
|
|
11
12
|
authors:
|
|
12
|
-
|
|
13
|
+
- Daniel Azuma
|
|
13
14
|
autorequire:
|
|
14
15
|
bindir: bin
|
|
15
16
|
cert_chain: []
|
|
16
17
|
|
|
17
|
-
date: 2010-
|
|
18
|
+
date: 2010-06-21 00:00:00 -07:00
|
|
18
19
|
default_executable:
|
|
19
20
|
dependencies: []
|
|
20
21
|
|
|
@@ -25,31 +26,35 @@ executables: []
|
|
|
25
26
|
extensions: []
|
|
26
27
|
|
|
27
28
|
extra_rdoc_files:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
- README.rdoc
|
|
30
|
+
- Blockenspiel.rdoc
|
|
31
|
+
- History.rdoc
|
|
32
|
+
- ImplementingDSLblocks.rdoc
|
|
32
33
|
files:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
34
|
+
- ext/blockenspiel/unmixer.c
|
|
35
|
+
- ext/blockenspiel/extconf.rb
|
|
36
|
+
- ext/blockenspiel/BlockenspielUnmixerService.java
|
|
37
|
+
- lib/blockenspiel/builder.rb
|
|
38
|
+
- lib/blockenspiel/dsl_setup.rb
|
|
39
|
+
- lib/blockenspiel/errors.rb
|
|
40
|
+
- lib/blockenspiel/impl.rb
|
|
41
|
+
- lib/blockenspiel/version.rb
|
|
42
|
+
- lib/blockenspiel/versionomy.rb
|
|
43
|
+
- lib/blockenspiel.rb
|
|
44
|
+
- lib/blockenspiel_unmixer.jar
|
|
45
|
+
- tests/files/file1.rb
|
|
46
|
+
- tests/tc_basic.rb
|
|
47
|
+
- tests/tc_behaviors.rb
|
|
48
|
+
- tests/tc_dsl_attrs.rb
|
|
49
|
+
- tests/tc_dsl_methods.rb
|
|
50
|
+
- tests/tc_dynamic.rb
|
|
51
|
+
- tests/tc_mixins.rb
|
|
52
|
+
- tests/tc_modules.rb
|
|
53
|
+
- Blockenspiel.rdoc
|
|
54
|
+
- History.rdoc
|
|
55
|
+
- ImplementingDSLblocks.rdoc
|
|
56
|
+
- README.rdoc
|
|
57
|
+
- Rakefile
|
|
53
58
|
has_rdoc: true
|
|
54
59
|
homepage: http://virtuoso.rubyforge.org/blockenspiel
|
|
55
60
|
licenses: []
|
|
@@ -58,35 +63,39 @@ post_install_message:
|
|
|
58
63
|
rdoc_options: []
|
|
59
64
|
|
|
60
65
|
require_paths:
|
|
61
|
-
|
|
66
|
+
- lib
|
|
62
67
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
68
|
+
none: false
|
|
63
69
|
requirements:
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
- - ">="
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
hash: 57
|
|
73
|
+
segments:
|
|
74
|
+
- 1
|
|
75
|
+
- 8
|
|
76
|
+
- 7
|
|
77
|
+
version: 1.8.7
|
|
71
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
|
+
none: false
|
|
72
80
|
requirements:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
- - ">="
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
hash: 3
|
|
84
|
+
segments:
|
|
85
|
+
- 0
|
|
86
|
+
version: "0"
|
|
78
87
|
requirements: []
|
|
79
88
|
|
|
80
89
|
rubyforge_project: virtuoso
|
|
81
|
-
rubygems_version: 1.3.
|
|
90
|
+
rubygems_version: 1.3.7
|
|
82
91
|
signing_key:
|
|
83
92
|
specification_version: 3
|
|
84
93
|
summary: Blockenspiel is a helper library designed to make it easy to implement DSL blocks.
|
|
85
94
|
test_files:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
- tests/tc_basic.rb
|
|
96
|
+
- tests/tc_behaviors.rb
|
|
97
|
+
- tests/tc_dsl_attrs.rb
|
|
98
|
+
- tests/tc_dsl_methods.rb
|
|
99
|
+
- tests/tc_dynamic.rb
|
|
100
|
+
- tests/tc_mixins.rb
|
|
101
|
+
- tests/tc_modules.rb
|