dslh 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NzE1YzAxOTU1N2I1NTE1NGZmMjhlZGZiZWViM2QzNTMzZGNiNWZkNg==
4
+ N2Q4NDNjNGQ5YWEzYzA4NDVmNTU5Mzg5OTdjODk0MmFiNGFiMThiYQ==
5
5
  data.tar.gz: !binary |-
6
- ODdlYWE3NGZlZjQ3NDVkYjBjYzQyZGFjMzdiMGYwMDdmMGJhZDY0OQ==
6
+ MTU3ZDFkYTNkNTM3ZjU1NjRmZTA2NzI5YWY3YjdhYjE4NDBlOWRiOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZjUzMzgwNzAxZGVhNzIxYjEyOWI4ZmUwNzdmZmEyOWMyMWE0ZmU3OGQxMzI4
10
- Y2EzMGMxMjc5MmQwOWFjNTdmZGZkM2ZmMzZkMmRkNmQxNTI3NDkzNzRiOTY5
11
- YjRiNDJhNGI0ODdhNjc1OGNjNGYwNjlhODExMjg2ODBkZTFiMmI=
9
+ MTJmYTEzZGI2NjViNmY0N2QwM2U4MmQ5Y2Q5ZDE5OTQ1MzAwOTdmNGYxYWRi
10
+ M2NlOTcyM2RjMmQ0MTFiMDExMjM5ZDFjMjM1NzY5ZTQwMDk1M2Y3YTJhNzMw
11
+ YzAxOTBhNGI4NGY5Y2RmYmYxNGUyYzJhOTFkM2QxNzVkM2NkMDk=
12
12
  data.tar.gz: !binary |-
13
- Y2I2NTcxMTdkZmY3NmMyM2RiMDViM2YzNDFhYTM5YTIyYmNjMzczMTY4M2Ew
14
- NzVlN2M2Njk3OWYzYmJhZDg2N2ZjMWQ3NDlkN2U5MDc2MGQzMWIxZWNmNzVi
15
- YWM1YjZlNzRlMTcxYzY1MzFmNDEwMjYyYmEzNmIxYWM4NDQxZTc=
13
+ NWZkOGU3MDM3MTY0M2U2OTQ1OTFmYTU4YjNhNTdjNDI0OWI0Yjg2YmNjNDcx
14
+ NTdjMzE0NjE5NDA2NjAxMzI5NTViNzY0ODM2ZGJkYjU5MDc3NDgyYTg2NmYw
15
+ MThlMjBmYjJiYjZmNGUwZTVlNDM2M2NlZTIzNzdiNDc0YmQ0Zjc=
@@ -1,40 +1,77 @@
1
1
  require 'dslh/version'
2
2
 
3
3
  class Dslh
4
- def self.eval(options = {}, &block)
5
- self.new(options).eval(&block)
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
- self.instance_eval(&block)
15
- return @hash
16
- end
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
- def method_missing(method_name, *args, &block)
19
- key_conv = @options[:key_conv] || @options[:conv]
20
- value_conv = @options[:value_conv] || @options[:conv]
36
+ if expr
37
+ eval_args = [expr]
21
38
 
22
- nested_hash = block ? self.class.eval(@options, &block) : nil
23
- method_name = key_conv.call(method_name) if key_conv
39
+ [:filename, :lineno].each do |k|
40
+ eval_args << @options[k] if @options[k]
41
+ end
24
42
 
25
- if args.empty?
26
- @hash[method_name] = nested_hash
43
+ scope.instance_eval(*eval_args)
27
44
  else
28
- value = args.length > 1 ? args : args[0]
29
- value = value_conv.call(value) if value_conv
45
+ scope.instance_eval(&block)
46
+ end
30
47
 
31
- if nested_hash
32
- @hash[method_name] = {
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
- else
36
- @hash[method_name] = value
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
@@ -1,3 +1,3 @@
1
1
  class Dslh
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dslh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara