def_dsl 0.0.2 → 0.0.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/lib/def_dsl/version.rb +1 -1
- data/lib/def_dsl.rb +21 -8
- data/spec/exmaple_spec.rb +74 -2
- metadata +4 -4
data/lib/def_dsl/version.rb
CHANGED
data/lib/def_dsl.rb
CHANGED
@@ -13,8 +13,10 @@ require "def_dsl/version"
|
|
13
13
|
module DefDsl
|
14
14
|
|
15
15
|
|
16
|
-
def def_dsl const
|
17
|
-
|
16
|
+
def def_dsl *const
|
17
|
+
const.each do |const|
|
18
|
+
define_dsl! self, [[const.name.to_s.underscore(self), const]]
|
19
|
+
end
|
18
20
|
end
|
19
21
|
alias define_dsl def_dsl
|
20
22
|
|
@@ -32,16 +34,18 @@ module DefDsl
|
|
32
34
|
who.send :include, So
|
33
35
|
define_dsl! const if const.is_a? Class
|
34
36
|
|
37
|
+
meth = const.instance_eval { @dsl } || mini
|
38
|
+
|
35
39
|
who.class_eval do
|
36
|
-
define_method(
|
37
|
-
so mini,*a,&b
|
40
|
+
define_method(meth) do |*a,&b|
|
41
|
+
so [mini,meth],*a,&b
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
41
45
|
# const.send :include, So if const.is_a? Module # or even class
|
42
46
|
# who.send :include, So if who.is_a? Module # or even class
|
43
47
|
if who.class == Module
|
44
|
-
who.send :module_function,
|
48
|
+
who.send :module_function, meth
|
45
49
|
who.send :module_function, :so
|
46
50
|
who.send :module_function, :so1
|
47
51
|
who.send :module_function, :so2
|
@@ -50,10 +54,18 @@ module DefDsl
|
|
50
54
|
end
|
51
55
|
|
52
56
|
module So
|
57
|
+
def feed_block &block
|
58
|
+
instance_eval &block
|
59
|
+
end
|
60
|
+
|
53
61
|
def so klass_name=nil,*a,&b
|
54
62
|
return @so if klass_name.nil?
|
55
63
|
|
56
|
-
klass_name = klass_name.
|
64
|
+
klass_name, label = if klass_name.is_a? Array
|
65
|
+
klass_name.map &:to_sym
|
66
|
+
else
|
67
|
+
[klass_name.to_sym, klass_name.to_sym]
|
68
|
+
end
|
57
69
|
|
58
70
|
if self.class == Module
|
59
71
|
klass = self.const_get(klass_name.to_s.camelize)
|
@@ -62,8 +74,9 @@ module DefDsl
|
|
62
74
|
end
|
63
75
|
|
64
76
|
obj = klass.new(*a) #,&b)
|
65
|
-
obj.instance_eval &b if b
|
66
|
-
|
77
|
+
# obj.instance_eval &b if b
|
78
|
+
obj.feed_block &b if b
|
79
|
+
(@so ||= {}).tap { |h| h[label] = h[label] ? [h[label], obj].flatten(1) : obj }
|
67
80
|
end
|
68
81
|
def so1(name)
|
69
82
|
value = @so[name]
|
data/spec/exmaple_spec.rb
CHANGED
@@ -32,6 +32,7 @@ describe [DefDsl,DefDSL].join' or ' do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
|
35
36
|
example 'usage inside object' do
|
36
37
|
class My
|
37
38
|
|
@@ -42,8 +43,7 @@ describe [DefDsl,DefDSL].join' or ' do
|
|
42
43
|
end
|
43
44
|
|
44
45
|
extend DefDSL
|
45
|
-
def_dsl Dir
|
46
|
-
def_dsl File
|
46
|
+
def_dsl Dir, File
|
47
47
|
|
48
48
|
def initialize
|
49
49
|
file 'root.txt'
|
@@ -65,4 +65,76 @@ describe [DefDsl,DefDSL].join' or ' do
|
|
65
65
|
end
|
66
66
|
My.new
|
67
67
|
end
|
68
|
+
|
69
|
+
|
70
|
+
example 'explicit dsl method name definition' do
|
71
|
+
module My
|
72
|
+
# nice looking recursive dsl definition
|
73
|
+
class AFile < Struct.new :name; @dsl = :file end
|
74
|
+
class ADir < Struct.new :name
|
75
|
+
@dsl = :dir
|
76
|
+
ADir = ADir
|
77
|
+
AFile = AFile
|
78
|
+
end
|
79
|
+
|
80
|
+
extend DefDSL
|
81
|
+
def_dsl ADir, AFile
|
82
|
+
|
83
|
+
file 'root.txt'
|
84
|
+
dir 'dir' do
|
85
|
+
dir 'inner' do
|
86
|
+
dir 'empty'
|
87
|
+
file 'any'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
so.should == {file: so1(:file), dir: so1(:dir)}
|
92
|
+
|
93
|
+
so1(:file).name.should == 'root.txt'
|
94
|
+
so1(:dir).name.should == 'dir'
|
95
|
+
(inner = so1(:dir).send(:so1,:dir)).name.should == 'inner'
|
96
|
+
inner.send(:so2,:dir).map(&:name).should == ['empty']
|
97
|
+
inner.send(:so2,:file).map(&:name).should == ['any']
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
example 'redefine feed_block' do
|
103
|
+
module My
|
104
|
+
# nice looking recursive dsl definition
|
105
|
+
class File < Struct.new :name
|
106
|
+
def feed_block &block
|
107
|
+
@block = block
|
108
|
+
end
|
109
|
+
end
|
110
|
+
class Dir < Struct.new :name
|
111
|
+
Dir = Dir
|
112
|
+
File = File
|
113
|
+
end
|
114
|
+
|
115
|
+
extend DefDSL
|
116
|
+
def_dsl Dir, File
|
117
|
+
|
118
|
+
file 'root.txt' do
|
119
|
+
this.block.should_be just stored.in_ivar
|
120
|
+
end
|
121
|
+
dir 'dir' do
|
122
|
+
dir 'inner' do
|
123
|
+
dir 'empty'
|
124
|
+
file 'any'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
so.should == {file: so1(:file), dir: so1(:dir)}
|
129
|
+
|
130
|
+
so1(:file).name.should == 'root.txt'
|
131
|
+
so1(:dir).name.should == 'dir'
|
132
|
+
(inner = so1(:dir).send(:so1,:dir)).name.should == 'inner'
|
133
|
+
inner.send(:so2,:dir).map(&:name).should == ['empty']
|
134
|
+
inner.send(:so2,:file).map(&:name).should == ['any']
|
135
|
+
|
136
|
+
so1(:file).instance_eval { @block }.nil?.should == false
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
68
140
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: def_dsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -94,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
94
|
version: '0'
|
95
95
|
segments:
|
96
96
|
- 0
|
97
|
-
hash: -
|
97
|
+
hash: -3785499367159931257
|
98
98
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
99
|
none: false
|
100
100
|
requirements:
|
@@ -103,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
103
|
version: '0'
|
104
104
|
segments:
|
105
105
|
- 0
|
106
|
-
hash: -
|
106
|
+
hash: -3785499367159931257
|
107
107
|
requirements: []
|
108
108
|
rubyforge_project:
|
109
109
|
rubygems_version: 1.8.25
|