subhash 0.1.4 → 0.1.5

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a161a49d26b78d215a5ef94c7ca05b92373c0fe
4
- data.tar.gz: c7cf728906dd3e8e6cab205d6fa1f7bb0e1d99ed
3
+ metadata.gz: ab2eaf62ffb511de3bde759e27863e8adf2e4d34
4
+ data.tar.gz: 8c8af07f2bd0244bd9f47a25b2a970ba36dae20f
5
5
  SHA512:
6
- metadata.gz: 60cbfa81b9b2a3982be86173968c9d3492400b030ef088fb3c57e16c28ccf665b77a6cc4aca9b50933ba5a4cc22dfef111ecdb249f8101805be0eb6d2de2c5df
7
- data.tar.gz: 4c7671998004b493195fb7f81976177b774cd1d1baf1cb791335a0f97104f350f815b7b44fdfafe8bfa1b43f621687723261d1da9ef6a4f07674565cb64ce54e
6
+ metadata.gz: 056c952bb3951d66fc6fe4ba9593497dea6ae3470bc181055fb4be6f0aeef0945f40d8e183a33cedd6f306e2a86b15a375bc665713dd69d027da4d13e60a4ac5
7
+ data.tar.gz: 2e87da440eb15a7cd2d539dfa9bb12643675082329dd5184d48c9917a36deaf633d5b3af0b7c87eb76530b6256ec04bebdc992aeae0c893b6e9fdf819700d6be
@@ -206,9 +206,8 @@ class Array
206
206
 
207
207
  ret = _loop_array(sp)
208
208
 
209
- return ret[extract] unless extract.nil?
210
- return ret if ret.length > 0
211
- nil
209
+ return ret[extract] if ret.is_a?(Array) && !extract.nil?
210
+ ret
212
211
  end
213
212
 
214
213
  def _loop_array(sp)
@@ -223,9 +222,26 @@ class Array
223
222
  found = e.rh_get(*sp)
224
223
  ret << found unless found.nil?
225
224
  end
226
- ret
225
+ _loop_array_result(ret, sp)
226
+ end
227
+
228
+ def _loop_array_result(ret, sp)
229
+ return _array_result(ret) if sp.length == 0
230
+
231
+ found = _erb_select_found(sp[0])
232
+ if found && !found[2].nil?
233
+ return ret[0] if found[2].include?('0') && ret.length == 1
234
+ return ret if found[2].include?('e')
235
+ end
236
+ _array_result(ret)
227
237
  end
228
- # Index provided. return the value of the index.
238
+
239
+ def _array_result(ret)
240
+ return ret if ret.length > 0
241
+ nil
242
+ end
243
+
244
+ # I ndex provided. return the value of the index.
229
245
  def _get_array(sp, key)
230
246
  return self[key] if sp.length == 0
231
247
 
@@ -269,14 +285,15 @@ class Array
269
285
  end
270
286
 
271
287
  def _keys_match(re, res, sp, opts)
272
- empty = false
273
- empty = opts.include?('e') if opts
288
+ empty, one = _key_options(opts)
274
289
 
275
290
  each do |e|
276
291
  next unless e.is_a?(Hash)
277
292
 
278
293
  _keys_match_hash(re, res, sp, e)
279
294
  end
295
+
296
+ return res[0] if one && res.length == 1
280
297
  return res if empty || res.length > 0
281
298
  nil
282
299
  end
@@ -308,11 +325,11 @@ class Array
308
325
  next unless re.match(k_re)
309
326
 
310
327
  if sp.length == 0
311
- _update_res(res, k, e[k])
328
+ _update_res(res, k, e[k], false)
312
329
  else
313
330
  v = e[k].rh_get(sp) if e[k].structured?
314
331
 
315
- _update_res(res, k, v) unless v.nil?
332
+ _update_res(res, k, v, false) unless v.nil?
316
333
  end
317
334
  end
318
335
  res
@@ -155,30 +155,149 @@ class Hash
155
155
  # - +p+ : Array of String/Symbol or Regexp. It contains the list of keys
156
156
  # tree to follow and check existence in self.
157
157
  #
158
- # In the subhash structure, each hierachie tree level is a Hash or an
158
+ # In the subhash structure, each hierachy tree level is a Hash or an
159
159
  # Array.
160
160
  #
161
161
  # At a given level the top key will be interpreted as follow and used as
162
162
  # data selection if the object is:
163
163
  # - Hash:
164
- # You can define key matching with Regexp or with a structured string:
165
- # - Regexp or '/<Regexp>/' or '[<Regexp>]' :
166
- # For each key in self tree, matching <Regexp>, the value associated
167
- # to the key will be added as a new item in an array.
168
- #
169
- # - '{<regexp>}' :
170
- # For each key in self tree, matching <Regexp>, the value and the key
171
- # will be added as a new item (key => value) in a Hash
164
+ # - RegExp match: (Version 0.1.2)
165
+ # You can define key matching with Regexp or with a structured string:
166
+ # - Regexp or '/<Regexp>/<opts>' or '[<Regexp>]' :
167
+ # For each key in self tree, matching <Regexp>, the value associated
168
+ # to the key will be added as a new item in an ARRAY.
169
+ #
170
+ # - '{/<Regexp>/<opts>}' :
171
+ # For each key in self tree, matching <Regexp>, the value and the
172
+ # key will be added as a new item (key => value) in a Hash
173
+ #
174
+ # '<Regexp' is a string representing the Regexp to use.
175
+ # Please note that :
176
+ # data.rh_get(/test/) is equivalent to data.rh_get('/test/'). This
177
+ # second syntax provide additional feature, with <opts>
178
+ #
179
+ # '<opts>' is an optional string representing a list of characters
180
+ # to set options for matching results.
181
+ # Options supported are:
182
+ # - 'e' : If nothing match, the selection will return an empty Array
183
+ # By default, it return nil, Usually, it is eliminated in the
184
+ # final result. (Version 0.1.3)
185
+ # - '0' : If only one match, the selection will return the value
186
+ # of that alone matching RegExp. (Version 0.1.5)
187
+ #
188
+ # - ERB can be used to select a subhash or extract a key.
189
+ # (Version 0.1.3)
190
+ # - ERB Selection
191
+ # The ERB selection is detected by a string containing
192
+ # '<%= ... %>opts|something'
193
+ # The ERB code must return a boolean or 'true' to consider the
194
+ # current data context as queriable with a key.
195
+ # - 'something' can be any key (string, symbol or even an ERB
196
+ # extraction)
197
+ # '<opts>' is an optional string representing a list of characters
198
+ # to set options for matching results. (Version 0.1.5)
199
+ # Options supported are:
200
+ # - 'e' : If nothing match, the selection will return an empty Array
201
+ # By default, it return nil, Usually, it is eliminated in the
202
+ # final result.
203
+ # - '0' : If only one match, the selection will return the value
204
+ # of that alone matching RegExp.
205
+ # - ERB Extraction
206
+ # The ERB selection is detected by a string containing simply
207
+ # '<%= ... %>'
208
+ # The result of that ERB call should return a string which will
209
+ # become a key to extract data from the current data context.
210
+ #
211
+ # NOTE! ERB convert any symbol using to_s. If you need to get a key
212
+ # as a symbol, you will to add : in front of the context string:
213
+ #
214
+ # Ex:
215
+ # RhContext.context = :test
216
+ # data.rh_get('<%= context =>') # is equivalent to
217
+ # # data.rh_get('test')
218
+ #
219
+ # RhContext.context = ':test'
220
+ # data.rh_get('<%= context =>') # is equivalent to
221
+ # # data.rh_get(:test)
222
+ #
223
+ # The ERB context by default contains:
224
+ # - at least a 'data' attribute. It contains the current Hash/Array
225
+ # level data in the data structure hierarchy.
226
+ # - optionally a 'context' attribute. Contains any kind of data.
227
+ # This is typically set before any call to rh_* functions.
228
+ #
229
+ # you can introduce more data in the context, by creating a derived
230
+ # class from RhContext.ERBConfig. This will ensure attribute
231
+ # data/context exist in the context.
232
+ # Ex:
233
+ #
234
+ # class MyContext < RhContext::ERBConfig
235
+ # attr_accessor :config # Added config in context
236
+ # end
237
+ #
238
+ # RhContext.erb = MyContext.new
239
+ # RhContext.erb.config = my_config
240
+ # data.rh_get(...)
241
+ #
242
+ # data = YAML.parse("---
243
+ # :test:
244
+ # :test2: value1
245
+ # :test3: value2
246
+ # :test4: value3
247
+ # :arr1: [ 4, value4]
248
+ # :arr2:
249
+ # - :test5: value5
250
+ # :test6: value6
251
+ # - :test7: value7
252
+ # :test8
253
+ # :test5: value8
254
+ # - :test5: value9")
255
+ #
256
+ # # Default context:
257
+ # RhContext.erb = nil
258
+ # # Filtering using |
259
+ # data.rh_get(:arr2, '<%= data.key?(:test8) %>|:test5')
260
+ # # => ['value8']
261
+ # RhContext.context = :test6
262
+ # data.rh_get(:arr2, '<%= context %>')
263
+ # # => ['value6']
172
264
  #
173
265
  # - Array:
174
- # If the top key type is:
266
+ # *Data selection :* If the top key type is:
175
267
  # - Fixnum : The key is considered as the Array index.
176
- # it will get in self[p[0]]
177
- #
178
- # - String/Symbol : loop in array to find in Hash, the key to get value
179
- # and go on in the tree if possible. it must return an array of result
180
- # In case of symbol matching, the symbol is converted in string with a
181
- # ':' at pos 0 in the string, then start match process.
268
+ # it will get in self[p[0]] (Version 0.1.3)
269
+ #
270
+ # # Data selection:
271
+ # data.rh_get(:arr2, 1, :test5) # => 'value8'
272
+ #
273
+ # - Range : Range extract only some element from the Array.
274
+ # (Version 0.1.3)
275
+ #
276
+ # # Data selection:
277
+ # data.rh_get(:arr2, 0..1, :test5) # => ['value5', 'value8']
278
+ # data.rh_get(:arr2, 1..2, :test5) # => ['value8', 'value9']
279
+ #
280
+ # *Data extraction :* If the top key type is:
281
+ # - '=[<Fixnum|Range>]' where
282
+ # - Fixnum : From found result, return the content of result[<Fixnum>]
283
+ # => subhash data found. It can return nil (Version 0.1.3)
284
+ # - Range : From found result, return the Range context of
285
+ # result[<Range>]
286
+ # => Array of (subhash data found) (Version 0.1.3)
287
+ #
288
+ # # data extraction. By default:
289
+ # # data.rh_get(:arr2, :test5) return ['value5','value8','value9']
290
+ # # then
291
+ # data.rh_get(:arr2, '=[0]', :test5) # => 'value5'
292
+ # data.rh_get(:arr2, '=[0..1]', :test5)
293
+ # # => ['value5', 'value8']
294
+ # data.rh_get(:arr2, '=[0..3]', :test5)
295
+ # # => ['value5', 'value8','value9']
296
+ #
297
+ # - String/Symbol : loop in array to find in elements an Hash to apply.
298
+ # So, for each Hash elements, it follows the Hash rule.
299
+ # The result will be stored in an Array of matching elements.
300
+ # (Version 0.1.3)
182
301
  #
183
302
  # * *Returns* :
184
303
  # - +value+ : Represents the data found in the tree. Can be of any type.
@@ -188,147 +307,69 @@ class Hash
188
307
  #
189
308
  # Example:(implemented in spec)
190
309
  #
191
- # data =
192
- # :test:
193
- # :test2 = 'value1'
194
- # :test3 => 'value2'
195
- # :test4 = 'value3'
196
- # :arr1: [ 4, 'value4']
197
- # :arr2:
198
- # - :test5 = 'value5'
199
- # :test6 = 'value6'
200
- # - :test7 = 'value7'
201
- # :test8
202
- # :test5 = 'value8'
310
+ # data = {
311
+ # :test => {
312
+ # :test2 = 'value1'
313
+ # :test3 => 'value2' },
314
+ # :test4 => 'value3'
315
+ # :arr1 => [ 4, 'value4']
316
+ # :arr2 => [{ :test5 = 'value5', :test6 = 'value6'},
317
+ # { :test7 = 'value7'},
318
+ # :test8,
319
+ # { :test5 = 'value8' }
320
+ # ]
321
+ # }
203
322
  #
204
323
  # so:
205
- # data.rh_get(:test) => {:test2 => 'value1', :test3 => 'value2'}
206
- # data.rh_get(:test5) => nil
207
- # data.rh_get(:test, :test2) => 'value1'
208
- # data.rh_get(:test, :test2, :test5) => nil
209
- # data.rh_get(:test, :test5 ) => nil
210
- # data.rh_get => { :test => {:test2 => 'value1', :test3 => 'value2'},
324
+ # data.rh_get(:test) => {:test2 => 'value1', :test3 => 'value2'}
325
+ # data.rh_get(:test5) => nil
326
+ # data.rh_get(:test, :test2) => 'value1'
327
+ # data.rh_get(:test, :test2, :test5) => nil
328
+ # data.rh_get(:test, :test5 ) => nil
329
+ # data.rh_get => { :test => {:test2 => 'value1', :test3 => 'value2'},
211
330
  # :test4 => 'value3'}
212
331
  #
213
332
  # New features: 0.1.2
214
- # data.rh_get(:test, /^test/) # => []
215
- # data.rh_get(:test, /^:test/) # => ['value1', 'value2']
216
- # data.rh_get(:test, /^:test.*/) # => ['value1', 'value2']
217
- # data.rh_get(:test, '/:test.*/') # => ['value1', 'value2']
218
- # data.rh_get(:test, '/:test.*/') # => ['value1', 'value2']
219
- # data.rh_get(:test, '[/:test.*/]') # => ['value1', 'value2']
220
- # data.rh_get(:test, '{/:test2/}') # => {:test2 => 'value1'}
221
- # data.rh_get(:test, '{/test/}')
222
- # # => {:test2 => 'value1', :test3 => 'value2'}
223
- # data.rh_get(:test, '{:test2}') # => {:test2 => 'value1'}
224
- # data.rh_get(:test, '{:test2}') # => {:test2 => 'value1'}
225
- #
226
- # data.rh_get(:arr2, :test6) # => ['value6']
227
- # data.rh_get(:arr2, :test8) # => nil
228
- # data.rh_get(:arr2, :test5) # => ['value5', 'value8']
229
- # data.rh_get(/arr/, :test5) # => [['value5', 'value8']]
230
- # data.rh_get('{/arr/}', :test5) # => { :arr2 => ['value5', 'value8']}
231
- # data.rh_get('{/arr/}', '{:test5}')
232
- # # => { :arr2 => {:test5 => ['value5', 'value8']}}
233
- #
234
- # data.rh_get(:arr2, 2) # => nil
235
- # data.rh_get(:arr2, 0) # => { :test5 = 'value5',
236
- # # :test6 = 'value6'}
237
- # data.rh_get(:arr2, 1) # => { :test7 = 'value7',
238
- # # :test8
239
- # # :test5 = 'value8' }
240
- # data.rh_get(:arr2, 1, :test7) # => 'value7'
241
- # data.rh_get(:arr2, 0, :test7) # => nil
333
+ # data.rh_get(:test, /^test/) # => []
334
+ # data.rh_get(:test, /^:test/) # => ['value1', 'value2']
335
+ # data.rh_get(:test, /^:test.*/) # => ['value1', 'value2']
336
+ # data.rh_get(:test, '/:test.*/') # => ['value1', 'value2']
337
+ # data.rh_get(:test, '/:test.*/') # => ['value1', 'value2']
338
+ # data.rh_get(:test, '[/:test.*/]') # => ['value1', 'value2']
339
+ # data.rh_get(:test, '{/:test2/}') # => {:test2 => 'value1'}
340
+ # data.rh_get(:test, '{/test/}')
341
+ # # => {:test2 => 'value1', :test3 => 'value2'}
342
+ # data.rh_get(:test, '{:test2}') # => {:test2 => 'value1'}
343
+ # data.rh_get(:test, '{:test2}') # => {:test2 => 'value1'}
344
+ #
345
+ # data.rh_get(:arr2, :test6) # => ['value6']
346
+ # data.rh_get(:arr2, :test8) # => nil
347
+ # data.rh_get(:arr2, :test5) # => ['value5', 'value8']
348
+ # data.rh_get(/arr/, :test5) # => [['value5', 'value8']]
349
+ # data.rh_get('{/arr/}', :test5) # => { :arr2 => ['value5', 'value8']}
350
+ # data.rh_get('{/arr/}', '{:test5}')
351
+ # # => { :arr2 => {:test5 => ['value5', 'value8']}}
352
+ #
353
+ # data.rh_get(:arr2, 2) # => nil
354
+ # data.rh_get(:arr2, 0) # => { :test5 = 'value5',
355
+ # # :test6 = 'value6'}
356
+ # data.rh_get(:arr2, 1) # => { :test7 = 'value7',
357
+ # # :test8
358
+ # # :test5 = 'value8' }
359
+ # data.rh_get(:arr2, 1, :test7) # => 'value7'
360
+ # data.rh_get(:arr2, 0, :test7) # => nil
242
361
  #
243
362
  # New features: 0.1.3
244
363
  #
245
- # Introduce ERB context rh_get/exist?/lexist? functions:
246
- # ERB can be used to select a subhash or extract a key.
247
- #
248
- # - ERB Selection
249
- # The ERB selection is detected by a string containing
250
- # '<%= ... %>|something'
251
- # The ERB code must return a boolean or 'true' to consider the current
252
- # data context as queriable with a key.
253
- # 'something' can be any key (string, symbol or even an ERB extraction)
254
- # - ERB Extraction
255
- # The ERB selection is detected by a string containing simply
256
- # '<%= ... %>'
257
- # The result of that ERB call should return a string which will become a
258
- # key to extract data from the current data context.
259
- #
260
- # NOTE! ERB convert any symbol using to_s. If you need to get a key as a
261
- # symbol, you will to add : in front of the context string:
262
- #
263
- # Ex:
264
- # RhContext.context = :test
265
- # data.rh_get('<%= context =>') # is equivalent to data.rh_get('test')
266
- #
267
- # RhContext.context = ':test'
268
- # data.rh_get('<%= context =>') # is equivalent to data.rh_get(:test)
269
- #
270
- # The ERB context by default contains:
271
- # - at least a 'data' attribute. It contains the current Hash/Array
272
- # level data in the data structure hierarchy.
273
- # - optionally a 'context' attribute. Contains any kind of data.
274
- # This is typically set before any call to rh_* functions.
275
- #
276
- # you can introduce more data in the context, by creating a derived class
277
- # from RhContext.ERBConfig. This will ensure attribute data/context exist
278
- # in the context.
279
- # Ex:
280
- #
281
- # class MyContext < RhContext::ERBConfig
282
- # attr_accessor :config # Added config in context
283
- # end
284
- #
285
- # RhContext.erb = MyContext.new
286
- # RhContext.erb.config = my_config
287
- # data.rh_get(...)
288
- #
289
- # data = YAML.parse("---
290
- # :test:
291
- # :test2: value1
292
- # :test3: value2
293
- # :test4: value3
294
- # :arr1: [ 4, value4]
295
- # :arr2:
296
- # - :test5: value5
297
- # :test6: value6
298
- # - :test7: value7
299
- # :test8
300
- # :test5: value8
301
- # - :test5: value9")
302
- #
303
- # # Default context:
304
- # RhContext.erb = nil
305
- # # Filtering using |
306
- # data.rh_get(:arr2, '<%= data.key?(:test8) %>|:test5')
307
- # # => ['value8']
308
- # RhContext.context = :test6
309
- # data.rh_get(:arr2, '<%= context %>')
310
- # # => ['value6']
311
- #
312
- # Introduce Array extraction (Fixnum and Range)
313
- # When a data at a current level is an Array, get/exist?/lexist? interpret
314
- # - the string '=[<Fixnum|Range>]' where
315
- # - Fixnum : From found result, return the content of result[<Fixnum>]
316
- # => subhash data found. It can return nil
317
- # - Range : From found result, return the Range context of result[<Range>]
318
- # => Array of (subhash data found)
319
- # - the Range. complete the Array index selection.
320
- # ex: [:test1, {:test2 => :value1}].rh_get(0..1, :test2)
321
- #
322
- # # data extraction. By default:
323
- # # data.rh_get(:arr2, :test5) return ['value5', 'value8', 'value9']
324
- # # then
325
- # data.rh_get(:arr2, '=[0]', :test5) # => 'value5'
326
- # data.rh_get(:arr2, '=[0..1]', :test5) # => ['value5', 'value8']
327
- # data.rh_get(:arr2, '=[0..3]', :test5) # => ['value5', 'value8','value9']
328
- #
329
- # # Data selection:
330
- # data.rh_get(:arr2, 0..1, :test5) # => ['value5', 'value8']
331
- # data.rh_get(:arr2, 1..2, :test5) # => ['value8', 'value9']
364
+ # - Introduce ERB context rh_get/exist?/lexist? functions:
365
+ # - Introduce Array extraction (Fixnum and Range)
366
+ #
367
+ # New features: 0.1.5
368
+ #
369
+ # A new option '0' has been added to the RegExp match
370
+ # It permits to return the value of element 0 of the array built by the
371
+ # matching result.
372
+ #
332
373
  def rh_get(*p)
333
374
  p = p.flatten
334
375
  return self if p.length == 0
@@ -632,26 +673,28 @@ class Hash
632
673
  end
633
674
 
634
675
  def _keys_match(re, res, sp, opts)
635
- empty = false
636
- empty = opts.include?('e') if opts
676
+ empty, one = _key_options(opts)
637
677
 
638
- _keys_match_loop(re, res, sp)
678
+ _keys_match_loop(re, res, sp, opts)
639
679
 
680
+ return res[0] if one && res.is_a?(Array) && res.length == 1
640
681
  return res if empty || res.length > 0
641
682
  nil
642
683
  end
643
684
 
644
- def _keys_match_loop(re, res, sp)
685
+ def _keys_match_loop(re, res, sp, opts)
686
+ _, one = _key_options(opts)
687
+
645
688
  keys.sort.each do |k|
646
689
  k_re = _key_to_s(k)
647
690
  next unless re.match(k_re)
648
691
 
649
692
  if sp.length == 0
650
- _update_res(res, k, self[k])
693
+ _update_res(res, k, self[k], one)
651
694
  else
652
695
  v = self[k].rh_get(sp) if [Array, Hash].include?(self[k].class)
653
696
 
654
- _update_res(res, k, v) unless v.nil?
697
+ _update_res(res, k, v, one) unless v.nil?
655
698
  end
656
699
  end
657
700
  end
data/lib/rh.rb CHANGED
@@ -77,15 +77,22 @@ module Rh
77
77
  # Return the erb call return
78
78
  # true otherwise ie Selected by default.
79
79
  def _erb_select(key)
80
- return true, key unless key.is_a?(String) && key =~ /^<%=.*%>\|/
80
+ found = _erb_select_found(key)
81
+ return true, key unless found
82
+
81
83
  RhContext.data = self
82
84
 
83
- found = /^(<%=.*%>)\|/.match(key)
84
85
  key = key.clone
85
86
  key[found[0]] = ''
86
87
  [RhContext.get(found[1]) == 'true', _convert_key(key)]
87
88
  end
88
89
 
90
+ def _erb_select_found(key)
91
+ return false unless key.is_a?(String) && key =~ /^<%=.*%>([0-9a-z]*)?\|/
92
+
93
+ /^(<%=.*%>)([0-9a-z]*)?\|/.match(key)
94
+ end
95
+
89
96
  def _erb_extract(key)
90
97
  return key unless key.is_a?(String) && key =~ /^<%=.*%>[^|]?/
91
98
  RhContext.data = self
@@ -202,13 +209,21 @@ module RhGet
202
209
  return [nil, nil, nil] unless key.is_a?(String)
203
210
 
204
211
  regs = []
205
- regs << [%r{^/(.*)/(e)?$}, []]
206
- regs << [%r{^\[/(.*)/(e)?\]$}, []]
207
- regs << [%r{^\{/(.*)/(e)?\}$}, {}]
212
+ regs << [%r{^/(.*)/([e0])*$}, []]
213
+ regs << [%r{^\[/(.*)/([e0])*\]$}, []]
214
+ regs << [%r{^\{/(.*)/([e0])*\}$}, {}]
208
215
 
209
216
  _loop_on_regs(regs, key)
210
217
  end
211
218
 
219
+ def _key_options(opts)
220
+ empty = false
221
+ empty = opts.include?('e') if opts
222
+ one = false
223
+ one = opts.include?('0') if opts
224
+ [empty, one]
225
+ end
226
+
212
227
  def _loop_on_regs(regs, key)
213
228
  regs.each do |r|
214
229
  init = r[1]
@@ -223,9 +238,14 @@ module RhGet
223
238
  k
224
239
  end
225
240
 
226
- def _update_res(res, k, v)
241
+ def _update_res(res, k, v, one)
227
242
  res << v if res.is_a?(Array)
228
- res[k] = v if res.is_a?(Hash)
243
+ return unless res.is_a?(Hash)
244
+ if one && v.is_a?(Array) && v.length == 1
245
+ res[k] = v[0]
246
+ else
247
+ res[k] = v
248
+ end
229
249
  end
230
250
  end
231
251
 
@@ -1,5 +1,5 @@
1
1
  # Recursive Hash
2
2
  module SubHash
3
- VERSION = '0.1.4'
4
- DATE = '2015-06-26'
3
+ VERSION = '0.1.5'
4
+ DATE = '2015-07-09'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: subhash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christophe Larsonneur
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-06-26 00:00:00.000000000 Z
11
+ date: 2015-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler