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 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