dslh 0.1.0 → 0.1.1
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.
- checksums.yaml +8 -8
- data/lib/dslh.rb +59 -22
- data/lib/dslh/version.rb +1 -1
- data/spec/dslh_spec.rb +65 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
N2Q4NDNjNGQ5YWEzYzA4NDVmNTU5Mzg5OTdjODk0MmFiNGFiMThiYQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MTU3ZDFkYTNkNTM3ZjU1NjRmZTA2NzI5YWY3YjdhYjE4NDBlOWRiOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTJmYTEzZGI2NjViNmY0N2QwM2U4MmQ5Y2Q5ZDE5OTQ1MzAwOTdmNGYxYWRi
|
10
|
+
M2NlOTcyM2RjMmQ0MTFiMDExMjM5ZDFjMjM1NzY5ZTQwMDk1M2Y3YTJhNzMw
|
11
|
+
YzAxOTBhNGI4NGY5Y2RmYmYxNGUyYzJhOTFkM2QxNzVkM2NkMDk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NWZkOGU3MDM3MTY0M2U2OTQ1OTFmYTU4YjNhNTdjNDI0OWI0Yjg2YmNjNDcx
|
14
|
+
NTdjMzE0NjE5NDA2NjAxMzI5NTViNzY0ODM2ZGJkYjU5MDc3NDgyYTg2NmYw
|
15
|
+
MThlMjBmYjJiYjZmNGUwZTVlNDM2M2NlZTIzNzdiNDc0YmQ0Zjc=
|
data/lib/dslh.rb
CHANGED
@@ -1,40 +1,77 @@
|
|
1
1
|
require 'dslh/version'
|
2
2
|
|
3
3
|
class Dslh
|
4
|
-
def self.eval(options =
|
5
|
-
|
4
|
+
def self.eval(expr_or_options = nil, options = nil, &block)
|
5
|
+
if options and not options.kind_of?(Hash)
|
6
|
+
raise TypeError, "wrong argument type #{options.class} (expected Hash)"
|
7
|
+
end
|
8
|
+
|
9
|
+
expr = nil
|
10
|
+
options ||= {}
|
11
|
+
|
12
|
+
if expr_or_options
|
13
|
+
case expr_or_options
|
14
|
+
when String
|
15
|
+
expr = expr_or_options
|
16
|
+
when Hash
|
17
|
+
options.update(expr_or_options)
|
18
|
+
else
|
19
|
+
raise TypeError, "wrong argument type #{expr_or_options.class} (expected String or Hash)"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
self.new(options).eval(expr, &block)
|
6
24
|
end
|
7
25
|
|
8
26
|
def initialize(options = {})
|
9
|
-
@options = options
|
10
|
-
@hash = {}
|
27
|
+
@options = options.dup
|
11
28
|
end
|
12
29
|
|
13
|
-
def eval(&block)
|
14
|
-
|
15
|
-
|
16
|
-
|
30
|
+
def eval(expr = nil, &block)
|
31
|
+
retval = {}
|
32
|
+
scope = Scope.new
|
33
|
+
scope.instance_variable_set(:@__options__, @options)
|
34
|
+
scope.instance_variable_set(:@__hash__, retval)
|
17
35
|
|
18
|
-
|
19
|
-
|
20
|
-
value_conv = @options[:value_conv] || @options[:conv]
|
36
|
+
if expr
|
37
|
+
eval_args = [expr]
|
21
38
|
|
22
|
-
|
23
|
-
|
39
|
+
[:filename, :lineno].each do |k|
|
40
|
+
eval_args << @options[k] if @options[k]
|
41
|
+
end
|
24
42
|
|
25
|
-
|
26
|
-
@hash[method_name] = nested_hash
|
43
|
+
scope.instance_eval(*eval_args)
|
27
44
|
else
|
28
|
-
|
29
|
-
|
45
|
+
scope.instance_eval(&block)
|
46
|
+
end
|
30
47
|
|
31
|
-
|
32
|
-
|
48
|
+
return retval
|
49
|
+
end
|
50
|
+
|
51
|
+
class Scope
|
52
|
+
def method_missing(method_name, *args, &block)
|
53
|
+
key_conv = @__options__[:key_conv] || @__options__[:conv]
|
54
|
+
value_conv = @__options__[:value_conv] || @__options__[:conv]
|
55
|
+
|
56
|
+
nested_hash = block ? Dslh.eval(@__options__, &block) : nil
|
57
|
+
method_name = key_conv.call(method_name) if key_conv
|
58
|
+
|
59
|
+
if args.empty?
|
60
|
+
@__hash__[method_name] = nested_hash
|
61
|
+
else
|
62
|
+
value = args.length > 1 ? args : args[0]
|
63
|
+
value = value_conv.call(value) if value_conv
|
64
|
+
|
65
|
+
if nested_hash
|
66
|
+
@__hash__[method_name] = {
|
33
67
|
value => nested_hash
|
34
68
|
}
|
35
|
-
|
36
|
-
|
69
|
+
else
|
70
|
+
@__hash__[method_name] = value
|
71
|
+
end
|
72
|
+
|
73
|
+
return @__hash__
|
37
74
|
end
|
38
|
-
end
|
75
|
+
end # of Scope
|
39
76
|
end
|
40
77
|
end
|
data/lib/dslh/version.rb
CHANGED
data/spec/dslh_spec.rb
CHANGED
@@ -194,4 +194,69 @@ describe Dslh do
|
|
194
194
|
)
|
195
195
|
end
|
196
196
|
|
197
|
+
it 'should evalute string' do
|
198
|
+
expr = <<-EOS
|
199
|
+
key1 'value'
|
200
|
+
key2 100
|
201
|
+
|
202
|
+
key3 do
|
203
|
+
key31 "value31" do
|
204
|
+
key311 100
|
205
|
+
key312 '200'
|
206
|
+
end
|
207
|
+
|
208
|
+
key32 do
|
209
|
+
key321 "value321" do
|
210
|
+
key3211 'XXX'
|
211
|
+
key3212 :XXX
|
212
|
+
end
|
213
|
+
key322 300
|
214
|
+
end
|
215
|
+
end
|
216
|
+
EOS
|
217
|
+
|
218
|
+
h = Dslh.eval(expr)
|
219
|
+
|
220
|
+
expect(h).to eq(
|
221
|
+
{:key1=>"value",
|
222
|
+
:key2=>100,
|
223
|
+
:key3=>
|
224
|
+
{:key31=>{"value31"=>{:key311=>100, :key312=>"200"}},
|
225
|
+
:key32=>
|
226
|
+
{:key321=>{"value321"=>{:key3211=>"XXX", :key3212=>:XXX}}, :key322=>300}}}
|
227
|
+
)
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'should evalute string with filename/lineno' do
|
231
|
+
expr = <<-EOS
|
232
|
+
key1 'value'
|
233
|
+
key2 100
|
234
|
+
|
235
|
+
key3 do
|
236
|
+
key31 "value31" do
|
237
|
+
key311 100
|
238
|
+
key312 '200'
|
239
|
+
end
|
240
|
+
|
241
|
+
key32 do
|
242
|
+
key321 "value321" do
|
243
|
+
key3211 'XXX'
|
244
|
+
key3212 :XXX
|
245
|
+
end
|
246
|
+
key322 300
|
247
|
+
end
|
248
|
+
end
|
249
|
+
EOS
|
250
|
+
|
251
|
+
h = Dslh.eval(expr, :filename => 'my.rb', :lineno => 100)
|
252
|
+
|
253
|
+
expect(h).to eq(
|
254
|
+
{:key1=>"value",
|
255
|
+
:key2=>100,
|
256
|
+
:key3=>
|
257
|
+
{:key31=>{"value31"=>{:key311=>100, :key312=>"200"}},
|
258
|
+
:key32=>
|
259
|
+
{:key321=>{"value321"=>{:key3211=>"XXX", :key3212=>:XXX}}, :key322=>300}}}
|
260
|
+
)
|
261
|
+
end
|
197
262
|
end
|