ruby-nuggets 0.5.6 → 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  == VERSION
4
4
 
5
- This documentation refers to ruby-nuggets version 0.5.6
5
+ This documentation refers to ruby-nuggets version 0.5.7
6
6
 
7
7
 
8
8
  == DESCRIPTION
@@ -50,14 +50,28 @@ module Nuggets
50
50
  # hash[:foo][:bar][:b] = { :x => 0, :y => 3 }
51
51
  # hash
52
52
  # #=> {:foo=>{:bar=>{:b=>{:y=>3, :x=>0}, :a=>{:y=>2, :x=>1}}}}
53
- def nest(depth = 0, value = default = Object.new, &block)
54
- new { |hash, key|
55
- hash[key] = if depth.zero?
56
- default ? block ? block[key] : hash.default : value
53
+ def nest(depth = 0, value = default = Object.new)
54
+ if depth.zero?
55
+ if default
56
+ if block_given?
57
+ new { |hash, key| hash[key] = yield(key) }
58
+ else
59
+ new { |hash, key| hash[key] = hash.default }
60
+ end
57
61
  else
58
- default ? nest(depth - 1, &block) : nest(depth - 1, value)
62
+ new { |hash, key| hash[key] = value }
59
63
  end
60
- }
64
+ else
65
+ if default
66
+ if block_given?
67
+ new { |hash, key| hash[key] = nest(depth - 1, &::Proc.new) }
68
+ else
69
+ new { |hash, key| hash[key] = nest(depth - 1) }
70
+ end
71
+ else
72
+ new { |hash, key| hash[key] = nest(depth - 1, value) }
73
+ end
74
+ end
61
75
  end
62
76
 
63
77
  end
@@ -31,32 +31,47 @@ module Nuggets
31
31
 
32
32
  # call-seq:
33
33
  # hash.unroll(*value_keys) => anArray
34
- # hash.unroll(*value_keys) { |key, value| ... } => anArray
34
+ # hash.unroll(*value_keys, :sort_by => { |key, value| ... }) => anArray
35
+ # hash.unroll(*value_keys) { |value_hash| ... } => anArray
35
36
  #
36
37
  # "Unrolls" a nested hash, so that each path through +hash+ results in a
37
- # row that is, e.g., suitable for use with CSV. Note that from the final
38
- # hash only the values are used, namely, if +value_keys+ are given, the
39
- # values at those keys are returned. If a block is given, all hashes are
40
- # passed through that block for sorting before being put into the result
41
- # array.
38
+ # row that is, e.g., suitable for use with CSV.
39
+ #
40
+ # Note that from the final hash ("value hash") only the values are used,
41
+ # namely, if +value_keys+ are given, the values at those keys are returned.
42
+ # If a block is given, the +value_hash+ is passed to that block for any
43
+ # additional processing or sanitization.
44
+ #
45
+ # If +sort_by+ is given, all hashes are passed through that block for
46
+ # sorting before being put into the result array.
42
47
  #
43
48
  # Examples:
44
49
  #
45
50
  # { :foo => { :bar => { :a => { :x => 1, :y => 2 }, :b => { :x => 0, :y => 3 } } } }.unroll
46
51
  # #=> [[:foo, :bar, :b, 3, 0], [:foo, :bar, :a, 2, 1]]
47
52
  #
48
- # { :foo => { :bar => { :a => { :x => 1, :y => 2 }, :b => { :x => 0, :y => 3 } } } }.unroll(&:to_s)
53
+ # { :foo => { :bar => { :a => { :x => 1, :y => 2 }, :b => { :x => 0, :y => 3 } } } }.unroll(:sort_by => :to_s)
49
54
  # #=> [[:foo, :bar, :a, 1, 2], [:foo, :bar, :b, 0, 3]]
50
- def unroll(*value_keys, &sort_block)
55
+ #
56
+ # { :foo => { :bar => { :a => { :x => 1, :y => 2 }, :b => { :x => 0, :y => 3 } } } }.unroll { |data| data[:x] = nil; data[:y] *= 2 }
57
+ # #=> [[:foo, :bar, :b, 6, nil], [:foo, :bar, :a, 4, nil]]
58
+ def unroll(*value_keys, &block)
59
+ args = value_keys.dup
60
+
61
+ options = value_keys.last.is_a?(::Hash) ? value_keys.pop : {}
62
+ do_sort = options.has_key?(:sort_by)
63
+
51
64
  rows = []
52
65
 
53
66
  if values.first.is_a?(self.class) # if any is, then all are
54
- (sort_block ? sort_by(&sort_block) : self).each { |key, value|
55
- value.unroll(*value_keys, &sort_block).each { |row| rows << [key, *row] }
67
+ (do_sort ? sort_by(&options[:sort_by]) : self).each { |key, value|
68
+ value.unroll(*args, &block).each { |row| rows << [key, *row] }
56
69
  }
57
70
  else
71
+ block[self] if block
72
+
58
73
  rows << if value_keys.empty?
59
- sort_block ? sort_by(&sort_block).map(&:last) : values
74
+ do_sort ? sort_by(&options[:sort_by]).map { |key, value| value } : values
60
75
  else
61
76
  values_at(*value_keys)
62
77
  end
@@ -4,7 +4,7 @@ module Nuggets
4
4
 
5
5
  MAJOR = 0
6
6
  MINOR = 5
7
- TINY = 6
7
+ TINY = 7
8
8
 
9
9
  class << self
10
10
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-nuggets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Wille
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-24 00:00:00 +02:00
12
+ date: 2009-07-27 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15