dslkit 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +5 -0
- data/Rakefile +20 -3
- data/VERSION +1 -1
- data/examples/let.rb +62 -0
- data/examples/mail.rb +8 -13
- data/examples/mm.rb +3 -3
- data/examples/recipe_common.rb +0 -2
- data/install.rb +6 -5
- data/lib/dslkit/polite.rb +51 -0
- data/lib/dslkit/rude.rb +1 -0
- data/lib/dslkit/version.rb +8 -0
- data/tests/test_common.rb +13 -0
- data/tests/test_polite.rb +3 -0
- metadata +18 -16
data/CHANGES
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
2007-04-11 (0.2.2)
|
2
|
+
* Ported Reginald Braithwaite's let DSL to DSLKit as examples/let.rb, see
|
3
|
+
http://weblog.raganwald.com/2007/03/approach-to-composing-domain-specific.html.
|
4
|
+
Added BlockSelf and MethodMissingDelegator modules for the implementation.
|
5
|
+
* Added version.rb.
|
1
6
|
2007-02-22 (0.2.1)
|
2
7
|
* Add coverage to tests.
|
3
8
|
* New delegate method for classes/modules.
|
data/Rakefile
CHANGED
@@ -32,9 +32,6 @@ task :clean do
|
|
32
32
|
rm_rf %w[doc coverage]
|
33
33
|
end
|
34
34
|
|
35
|
-
desc "Prepare a release"
|
36
|
-
task :release => [:clean, :package]
|
37
|
-
|
38
35
|
spec = Gem::Specification.new do |s|
|
39
36
|
#### Basic information.
|
40
37
|
|
@@ -85,4 +82,24 @@ Rake::GemPackageTask.new(spec) do |pkg|
|
|
85
82
|
pkg.need_tar = true
|
86
83
|
pkg.package_files += PKG_FILES
|
87
84
|
end
|
85
|
+
|
86
|
+
desc m = "Writing version information for #{PKG_VERSION}"
|
87
|
+
task :version do
|
88
|
+
puts m
|
89
|
+
File.open(File.join('lib', 'dslkit', 'version.rb'), 'w') do |v|
|
90
|
+
v.puts <<EOT
|
91
|
+
module DSLKit
|
92
|
+
# DSLKit version
|
93
|
+
VERSION = '#{PKG_VERSION}'
|
94
|
+
VERSION_ARRAY = VERSION.split(/\\./).map { |x| x.to_i } # :nodoc:
|
95
|
+
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
|
96
|
+
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
|
97
|
+
VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
|
98
|
+
end
|
99
|
+
EOT
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
desc "Prepare a release"
|
104
|
+
task :release => [:clean, :version, :package]
|
88
105
|
# vim: set et sw=2 ts=2:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.2
|
data/examples/let.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'dslkit/polite'
|
4
|
+
|
5
|
+
LetScope = DSLKit::BlankSlate.with :instance_eval, :to_s, :inspect, :extend
|
6
|
+
class LetScope
|
7
|
+
include DSLKit::MethodMissingDelegator::DelegatorModule
|
8
|
+
include DSLKit::BlockSelf
|
9
|
+
|
10
|
+
def initialize(my_self, bindings = {}, outer_scope = nil)
|
11
|
+
super(my_self)
|
12
|
+
@outer_scope = outer_scope
|
13
|
+
@bindings = bindings
|
14
|
+
extend DSLKit::Eigenclass
|
15
|
+
eigenclass_eval { extend DSLKit::Constant }
|
16
|
+
each_binding do |name, value|
|
17
|
+
eigenclass_eval { constant name, value }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def each_binding(&block)
|
22
|
+
if @outer_scope
|
23
|
+
@outer_scope.each_binding(&block)
|
24
|
+
end
|
25
|
+
@bindings.each(&block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def let(bindings = {}, &block)
|
29
|
+
ls = LetScope.new(block_self(&block), bindings, self)
|
30
|
+
ls.instance_eval(&block)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Inlcuding this module into your current namespace defines the let method.
|
34
|
+
module Include
|
35
|
+
include DSLKit::BlockSelf
|
36
|
+
|
37
|
+
def let(bindings = {}, &block)
|
38
|
+
ls = LetScope.new(block_self(&block), bindings)
|
39
|
+
ls.instance_eval(&block)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if $0 == __FILE__
|
45
|
+
class Foo
|
46
|
+
include LetScope::Include
|
47
|
+
|
48
|
+
def twice(x)
|
49
|
+
2 * x
|
50
|
+
end
|
51
|
+
|
52
|
+
def test
|
53
|
+
let :x => 1, :y => twice(1) do
|
54
|
+
let :z => twice(x) do
|
55
|
+
puts "#{x} * #{y} == #{z} # => #{x * y == twice(x)}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
Foo.new.test
|
62
|
+
end
|
data/examples/mail.rb
CHANGED
@@ -4,9 +4,11 @@ require 'net/smtp'
|
|
4
4
|
class Mail
|
5
5
|
extend DSLKit::DSLAccessor
|
6
6
|
include DSLKit::InstanceExec
|
7
|
+
include DSLKit::MethodMissingDelegator::DelegatorModule
|
8
|
+
include DSLKit::BlockSelf
|
7
9
|
|
8
|
-
def initialize(
|
9
|
-
|
10
|
+
def initialize(&block)
|
11
|
+
super block_self(&block)
|
10
12
|
instance_exec(&block)
|
11
13
|
end
|
12
14
|
|
@@ -48,18 +50,10 @@ class Mail
|
|
48
50
|
smtp.send_message msg, from, to
|
49
51
|
end
|
50
52
|
end
|
51
|
-
|
52
|
-
def method_missing(id, *args, &block)
|
53
|
-
if @dispatch
|
54
|
-
@dispatch.instance_eval { __send__(id, *args, &block) }
|
55
|
-
else
|
56
|
-
super
|
57
|
-
end
|
58
|
-
end
|
59
53
|
end
|
60
54
|
|
61
55
|
def mail(&block)
|
62
|
-
Mail.new(
|
56
|
+
Mail.new(&block)
|
63
57
|
end
|
64
58
|
|
65
59
|
def prompt
|
@@ -67,10 +61,11 @@ def prompt
|
|
67
61
|
STDIN.gets.strip
|
68
62
|
end
|
69
63
|
|
70
|
-
rcpt = prompt
|
71
64
|
m = mail do
|
72
65
|
subject subject + ': Hi!'
|
73
|
-
|
66
|
+
if rcpt = prompt
|
67
|
+
to rcpt
|
68
|
+
end
|
74
69
|
body "Hello, world!\n"
|
75
70
|
end
|
76
71
|
m.send
|
data/examples/mm.rb
CHANGED
@@ -44,7 +44,7 @@ module MM
|
|
44
44
|
if name[-1] == ?=
|
45
45
|
name = name[0..-2].intern
|
46
46
|
value >= 0 or raise InterpreterError,
|
47
|
-
"only non-negative numbers can be stored in
|
47
|
+
"only non-negative numbers can be stored in register #{name}"
|
48
48
|
@registers[name] = value
|
49
49
|
else
|
50
50
|
super
|
@@ -137,7 +137,7 @@ module MM
|
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
|
-
|
140
|
+
if $0 == __FILE__
|
141
141
|
if ARGV.empty?
|
142
142
|
MM::Interpreter.new(STDIN.read).run
|
143
143
|
else
|
@@ -145,4 +145,4 @@ end
|
|
145
145
|
interpreter.stepping = !ARGV.empty?
|
146
146
|
interpreter.run
|
147
147
|
end
|
148
|
-
|
148
|
+
end
|
data/examples/recipe_common.rb
CHANGED
data/install.rb
CHANGED
@@ -9,9 +9,10 @@ include Config
|
|
9
9
|
src = File.join(*%w[lib dslkit])
|
10
10
|
dst = File.join(CONFIG["sitelibdir"], 'dslkit')
|
11
11
|
mkdir_p dst
|
12
|
-
|
13
|
-
|
12
|
+
cd src do
|
13
|
+
for file in Dir['*.rb']
|
14
|
+
install file, File.join(dst, file)
|
15
|
+
end
|
14
16
|
end
|
15
|
-
install File.join('lib', 'dslkit.rb'), File.join(CONFIG["sitelibdir"],
|
16
|
-
|
17
|
-
# vim: set et sw=4 ts=4:
|
17
|
+
install File.join('lib', 'dslkit.rb'), File.join(CONFIG["sitelibdir"], 'dslkit.rb')
|
18
|
+
# vim: set et sw=2 ts=2:
|
data/lib/dslkit/polite.rb
CHANGED
@@ -31,6 +31,8 @@
|
|
31
31
|
# subdirectory of this library.
|
32
32
|
#
|
33
33
|
module DSLKit
|
34
|
+
require 'dslkit/version'
|
35
|
+
|
34
36
|
# This module contains some handy methods to deal with eigenclasses. Those
|
35
37
|
# are also known as virtual classes, singleton classes, metaclasses, plus all
|
36
38
|
# the other names Matz doesn't like enough to actually accept one of the
|
@@ -578,4 +580,53 @@ module DSLKit
|
|
578
580
|
end
|
579
581
|
end
|
580
582
|
end
|
583
|
+
|
584
|
+
# This module includes the block_self module_function.
|
585
|
+
module BlockSelf
|
586
|
+
module_function
|
587
|
+
|
588
|
+
# This method returns the receiver _self_ of the context in which _block_
|
589
|
+
# was created.
|
590
|
+
def block_self(&block)
|
591
|
+
eval 'self', block.binding
|
592
|
+
end
|
593
|
+
end
|
594
|
+
|
595
|
+
# This module contains a configurable method missing delegator and can be
|
596
|
+
# mixed into a module/class.
|
597
|
+
module MethodMissingDelegator
|
598
|
+
|
599
|
+
# Including this module in your classes makes an _initialize_ method
|
600
|
+
# available, whose first argument is used as method_missing_delegator
|
601
|
+
# attribute. If a superior _initialize_ method was defined it is called
|
602
|
+
# with all arguments but the first.
|
603
|
+
module DelegatorModule
|
604
|
+
include DSLKit::MethodMissingDelegator
|
605
|
+
|
606
|
+
def initialize(delegator, *a, &b)
|
607
|
+
self.method_missing_delegator = delegator
|
608
|
+
super(*a, &b) if defined? super
|
609
|
+
end
|
610
|
+
end
|
611
|
+
|
612
|
+
# This class includes DelegatorModule and can be used as a superclass
|
613
|
+
# instead of including DelegatorModule.
|
614
|
+
class DelegatorClass
|
615
|
+
include DelegatorModule
|
616
|
+
end
|
617
|
+
|
618
|
+
# This object will be the receiver of all missing method calls, if it has a
|
619
|
+
# value other than nil.
|
620
|
+
attr_accessor :method_missing_delegator
|
621
|
+
|
622
|
+
# Delegates all missing method calls to _method_missing_delegator_ if this
|
623
|
+
# attribute has been set. Otherwise it will call super.
|
624
|
+
def method_missing(id, *a, &b)
|
625
|
+
unless method_missing_delegator.nil?
|
626
|
+
method_missing_delegator.__send__(id, *a, &b)
|
627
|
+
else
|
628
|
+
super
|
629
|
+
end
|
630
|
+
end
|
631
|
+
end
|
581
632
|
end
|
data/lib/dslkit/rude.rb
CHANGED
data/tests/test_common.rb
CHANGED
@@ -185,4 +185,17 @@ class TC_DSLKit < Test::Unit::TestCase
|
|
185
185
|
assert_equal 3, d.size
|
186
186
|
assert_equal 3, d.length
|
187
187
|
end
|
188
|
+
|
189
|
+
if defined? D3
|
190
|
+
def test_delegate
|
191
|
+
d = D3.new []
|
192
|
+
assert_equal 0, d.size
|
193
|
+
d.push 1
|
194
|
+
assert_equal [1], d.map { |x| x }
|
195
|
+
d.push 2
|
196
|
+
assert_equal [1, 2], d.map { |x| x }
|
197
|
+
d.push 3
|
198
|
+
assert_equal [1, 2, 3], d.map { |x| x }
|
199
|
+
end
|
200
|
+
end
|
188
201
|
end
|
data/tests/test_polite.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
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.2
|
7
|
+
date: 2007-04-13 00:00:00 +02:00
|
8
8
|
summary: Kit for building DSLs in Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,31 +29,33 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Florian Frank
|
31
31
|
files:
|
32
|
+
- VERSION
|
33
|
+
- TODO
|
32
34
|
- tests
|
33
|
-
- lib
|
34
|
-
- examples
|
35
|
-
- Rakefile
|
36
35
|
- GPL
|
37
|
-
- TODO
|
38
|
-
- VERSION
|
39
|
-
- CHANGES
|
40
36
|
- install.rb
|
37
|
+
- Rakefile
|
38
|
+
- examples
|
39
|
+
- lib
|
40
|
+
- CHANGES
|
41
|
+
- tests/runner.rb
|
41
42
|
- tests/test_common.rb
|
42
43
|
- tests/test_rude.rb
|
43
44
|
- tests/test_polite.rb
|
44
|
-
- tests/runner.rb
|
45
|
-
- lib/dslkit
|
46
|
-
- lib/dslkit.rb
|
47
|
-
- lib/dslkit/polite.rb
|
48
|
-
- lib/dslkit/rude.rb
|
49
45
|
- examples/recipe_common.rb
|
50
|
-
- examples/
|
46
|
+
- examples/multiply.reg
|
51
47
|
- examples/mail.rb
|
48
|
+
- examples/recipe2.rb
|
52
49
|
- examples/null_pattern.rb
|
50
|
+
- examples/subtract.reg
|
53
51
|
- examples/recipe.rb
|
52
|
+
- examples/let.rb
|
54
53
|
- examples/mm.rb
|
55
|
-
-
|
56
|
-
-
|
54
|
+
- lib/dslkit
|
55
|
+
- lib/dslkit.rb
|
56
|
+
- lib/dslkit/rude.rb
|
57
|
+
- lib/dslkit/polite.rb
|
58
|
+
- lib/dslkit/version.rb
|
57
59
|
test_files:
|
58
60
|
- tests/runner.rb
|
59
61
|
rdoc_options: []
|