dslkit 0.2.2 → 0.2.3
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/CHANGES +2 -0
- data/VERSION +1 -1
- data/examples/mail.rb +3 -1
- data/examples/mm.rb +6 -9
- data/lib/dslkit/polite.rb +85 -84
- data/lib/dslkit/version.rb +1 -1
- metadata +22 -22
data/CHANGES
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
data/examples/mail.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'dslkit/polite'
|
2
2
|
require 'net/smtp'
|
3
|
+
require 'time'
|
3
4
|
|
4
5
|
class Mail
|
5
6
|
extend DSLKit::DSLAccessor
|
@@ -30,7 +31,7 @@ class Mail
|
|
30
31
|
|
31
32
|
def message_id
|
32
33
|
key = [ ENV['HOSTNAME'] || 'localhost', $$ , Time.now ].join
|
33
|
-
::Digest::MD5.new
|
34
|
+
(::Digest::MD5.new << key).to_s
|
34
35
|
end
|
35
36
|
|
36
37
|
def msg
|
@@ -58,6 +59,7 @@ end
|
|
58
59
|
|
59
60
|
def prompt
|
60
61
|
STDOUT.print "Send to? "
|
62
|
+
STDOUT.flush
|
61
63
|
STDIN.gets.strip
|
62
64
|
end
|
63
65
|
|
data/examples/mm.rb
CHANGED
@@ -6,17 +6,13 @@ require 'dslkit/polite'
|
|
6
6
|
module MM
|
7
7
|
class InterpreterError < StandardError; end
|
8
8
|
|
9
|
-
class
|
10
|
-
|
11
|
-
@interpreter = interpreter
|
12
|
-
@name = name
|
13
|
-
super(&block)
|
14
|
-
end
|
9
|
+
class ::Proc
|
10
|
+
attr_accessor :interpreter
|
15
11
|
|
16
|
-
|
12
|
+
attr_accessor :name
|
17
13
|
|
18
14
|
def execute
|
19
|
-
|
15
|
+
interpreter.display_registers(self)
|
20
16
|
call
|
21
17
|
end
|
22
18
|
end
|
@@ -88,7 +84,8 @@ module MM
|
|
88
84
|
def label(name, &block)
|
89
85
|
@labels.find { |l| l.name == name } and
|
90
86
|
raise InterpreterError, "label named '#{name}' was already defined"
|
91
|
-
|
87
|
+
block.interpreter, block.name = self, name
|
88
|
+
@labels << block
|
92
89
|
end
|
93
90
|
|
94
91
|
def register_fetch(register)
|
data/lib/dslkit/polite.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# :stopdoc:
|
2
|
+
require 'thread'
|
3
|
+
require 'sync'
|
4
|
+
# :startdoc:
|
5
|
+
|
1
6
|
# = dslkit - Building Blocks for Domain Specific Languages (DSL)
|
2
7
|
#
|
3
8
|
# == Description
|
@@ -79,6 +84,17 @@ module DSLKit
|
|
79
84
|
end
|
80
85
|
|
81
86
|
module ThreadLocal
|
87
|
+
@@mutex = Mutex.new
|
88
|
+
|
89
|
+
@@cleanup = lambda do |my_object_id|
|
90
|
+
my_id = "__thread_local_#{my_object_id}__"
|
91
|
+
@mutex.synchronize do
|
92
|
+
for t in Thread.list
|
93
|
+
t[my_id] = nil if t[my_id]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
82
98
|
# Define a thread local variable named _name_ in this module/class. If the
|
83
99
|
# value _value_ is given, it is used to initialize the variable.
|
84
100
|
def thread_local(name, value = nil)
|
@@ -87,21 +103,7 @@ module DSLKit
|
|
87
103
|
name = name.to_s
|
88
104
|
my_id = "__thread_local_#{__id__}__"
|
89
105
|
|
90
|
-
|
91
|
-
lambda do |my_object_id|
|
92
|
-
my_id = "__thread_local_#{my_object_id}__"
|
93
|
-
begin
|
94
|
-
old = Thread.critical
|
95
|
-
Thread.critical = true
|
96
|
-
for t in Thread.list
|
97
|
-
t[my_id] = nil if t[my_id]
|
98
|
-
end
|
99
|
-
ensure
|
100
|
-
Thread.critical = old
|
101
|
-
end
|
102
|
-
end
|
103
|
-
EOT
|
104
|
-
ObjectSpace.define_finalizer(self, cleanup)
|
106
|
+
ObjectSpace.define_finalizer(self, @@cleanup)
|
105
107
|
|
106
108
|
define_method(name) do
|
107
109
|
Thread.current[my_id] ||= {}
|
@@ -138,7 +140,6 @@ module DSLKit
|
|
138
140
|
def thread_global(name, value = nil)
|
139
141
|
is_a?(Module) or raise TypeError, "receiver has to be a Module"
|
140
142
|
|
141
|
-
require 'thread'
|
142
143
|
name = name.to_s
|
143
144
|
var_name = "@__#{name}_#{__id__.abs}__"
|
144
145
|
|
@@ -171,47 +172,49 @@ module DSLKit
|
|
171
172
|
end
|
172
173
|
|
173
174
|
module InstanceExec
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
175
|
+
unless (Object.instance_method(:instance_exec) rescue nil)
|
176
|
+
class << self
|
177
|
+
attr_accessor :pool
|
178
|
+
attr_accessor :count
|
179
|
+
end
|
180
|
+
self.count = 0
|
181
|
+
self.pool = []
|
182
|
+
|
183
|
+
# This is a pure ruby implementation of Ruby 1.9's instance_exec method. It
|
184
|
+
# executes _block_ in the context of this object while parsing <i>*args</i> into
|
185
|
+
# the block.
|
186
|
+
def instance_exec(*args, &block)
|
187
|
+
instance = self
|
188
|
+
id = instance_exec_fetch_symbol
|
189
|
+
InstanceExec.module_eval do
|
190
|
+
begin
|
191
|
+
define_method id, block
|
192
|
+
instance.__send__ id, *args
|
193
|
+
ensure
|
194
|
+
remove_method id if method_defined?(id)
|
195
|
+
end
|
193
196
|
end
|
197
|
+
ensure
|
198
|
+
InstanceExec.pool << id
|
194
199
|
end
|
195
|
-
ensure
|
196
|
-
InstanceExec.pool << id
|
197
|
-
end
|
198
200
|
|
199
|
-
|
201
|
+
private
|
200
202
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
203
|
+
@@mutex = Mutex.new
|
204
|
+
|
205
|
+
# Fetch a symbol from a pool in thread save way. If no more symbols are
|
206
|
+
# available create a new one, that will be pushed into the pool later.
|
207
|
+
def instance_exec_fetch_symbol
|
208
|
+
@@mutex.synchronize do
|
209
|
+
if InstanceExec.pool.empty?
|
210
|
+
InstanceExec.count += 1
|
211
|
+
symbol = :"__instance_exec_#{InstanceExec.count}__"
|
212
|
+
else
|
213
|
+
symbol = InstanceExec.pool.shift
|
214
|
+
end
|
215
|
+
return symbol
|
216
|
+
end
|
211
217
|
end
|
212
|
-
return symbol
|
213
|
-
ensure
|
214
|
-
Thread.critical = old
|
215
218
|
end
|
216
219
|
end
|
217
220
|
|
@@ -408,7 +411,8 @@ module DSLKit
|
|
408
411
|
klass = Class.new
|
409
412
|
klass.instance_eval do
|
410
413
|
instance_methods.each do |m|
|
411
|
-
|
414
|
+
m = m.to_s
|
415
|
+
undef_method m unless m =~ /^(__|object_id)/ or ids.any? { |i| i === m }
|
412
416
|
end
|
413
417
|
end
|
414
418
|
klass
|
@@ -477,28 +481,26 @@ module DSLKit
|
|
477
481
|
end
|
478
482
|
end
|
479
483
|
|
484
|
+
@@sync = Sync.new
|
485
|
+
|
480
486
|
# Start deflecting method calls named _id_ to the _from_ class using the
|
481
487
|
# Deflector instance deflector.
|
482
488
|
def deflect_start(from, id, deflector)
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
Thread.critical = old
|
496
|
-
super
|
489
|
+
@@sync.synchronize do
|
490
|
+
Deflect.deflecting ||= DeflectorCollection.new
|
491
|
+
Deflect.deflecting.member?(from, id) and
|
492
|
+
raise DeflectError, "#{from}##{id} is already deflected"
|
493
|
+
Deflect.deflecting.add(from, id, deflector)
|
494
|
+
from.class_eval do
|
495
|
+
define_method(id) do |*args|
|
496
|
+
if Deflect.deflecting and d = Deflect.deflecting.find(self.class, id)
|
497
|
+
d.call(self, id, *args)
|
498
|
+
else
|
499
|
+
super(*args)
|
500
|
+
end
|
497
501
|
end
|
498
502
|
end
|
499
503
|
end
|
500
|
-
ensure
|
501
|
-
Thread.critical = old
|
502
504
|
end
|
503
505
|
|
504
506
|
# Return true if method _id_ is deflected from class _from_, otherwise
|
@@ -517,24 +519,23 @@ module DSLKit
|
|
517
519
|
# Deflector instance deflector. After that yield to the given block and
|
518
520
|
# stop deflecting again.
|
519
521
|
def deflect(from, id, deflector)
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
522
|
+
@@sync.synchronize do
|
523
|
+
begin
|
524
|
+
deflect_start(from, id, deflector)
|
525
|
+
yield
|
526
|
+
ensure
|
527
|
+
deflect_stop(from, id)
|
528
|
+
end
|
529
|
+
end
|
527
530
|
end
|
528
531
|
|
529
532
|
# Stop deflection method calls named _id_ to class _from_.
|
530
533
|
def deflect_stop(from, id)
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
ensure
|
537
|
-
Thread.critical = old
|
534
|
+
@@sync.synchronize do
|
535
|
+
Deflect.deflecting.delete(from, id) or
|
536
|
+
raise DeflectError, "#{from}##{id} is not deflected from"
|
537
|
+
from.instance_eval { remove_method id }
|
538
|
+
end
|
538
539
|
end
|
539
540
|
end
|
540
541
|
|
@@ -588,7 +589,7 @@ module DSLKit
|
|
588
589
|
# This method returns the receiver _self_ of the context in which _block_
|
589
590
|
# was created.
|
590
591
|
def block_self(&block)
|
591
|
-
eval 'self', block.binding
|
592
|
+
eval 'self', block.__send__(:binding)
|
592
593
|
end
|
593
594
|
end
|
594
595
|
|
data/lib/dslkit/version.rb
CHANGED
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: dslkit
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.2.3
|
7
|
+
date: 2007-11-29 00:00:00 +01:00
|
8
8
|
summary: Kit for building DSLs in Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,33 +29,33 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Florian Frank
|
31
31
|
files:
|
32
|
-
- VERSION
|
33
|
-
- TODO
|
34
|
-
- tests
|
35
|
-
- GPL
|
36
32
|
- install.rb
|
37
|
-
- Rakefile
|
38
|
-
- examples
|
39
33
|
- lib
|
34
|
+
- lib/dslkit
|
35
|
+
- lib/dslkit/rude.rb
|
36
|
+
- lib/dslkit/polite.rb
|
37
|
+
- lib/dslkit/version.rb
|
38
|
+
- lib/dslkit.rb
|
40
39
|
- CHANGES
|
41
|
-
-
|
40
|
+
- TODO
|
41
|
+
- VERSION
|
42
|
+
- tests
|
42
43
|
- tests/test_common.rb
|
43
|
-
- tests/
|
44
|
+
- tests/runner.rb
|
44
45
|
- tests/test_polite.rb
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
46
|
+
- tests/test_rude.rb
|
47
|
+
- Rakefile
|
48
|
+
- GPL
|
49
|
+
- examples
|
50
|
+
- examples/recipe.rb
|
51
|
+
- examples/mm.rb
|
48
52
|
- examples/recipe2.rb
|
49
|
-
- examples/null_pattern.rb
|
50
53
|
- examples/subtract.reg
|
51
|
-
- examples/
|
54
|
+
- examples/null_pattern.rb
|
55
|
+
- examples/recipe_common.rb
|
52
56
|
- examples/let.rb
|
53
|
-
- examples/
|
54
|
-
-
|
55
|
-
- lib/dslkit.rb
|
56
|
-
- lib/dslkit/rude.rb
|
57
|
-
- lib/dslkit/polite.rb
|
58
|
-
- lib/dslkit/version.rb
|
57
|
+
- examples/multiply.reg
|
58
|
+
- examples/mail.rb
|
59
59
|
test_files:
|
60
60
|
- tests/runner.rb
|
61
61
|
rdoc_options: []
|