obfusk-util 0.5.0 → 0.5.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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5bf7375bb3b37224db96e59696194cd81e6a1abc
4
- data.tar.gz: d9c148f1ba2b5fefd2e93012ee18a1126a0db3a8
3
+ metadata.gz: 965ed408e2dc3fda80936c94b7ae17c89c4a5bfe
4
+ data.tar.gz: 794f55bedb6c351327c5e163cd22af9f4653eeb8
5
5
  SHA512:
6
- metadata.gz: 8ee94a5abc89f7cfb162210ea6336cf9dbdc227ef52fb65075a1a126fd5b9bdbda777085a02766d01d551aa09ea8ee26066c1969534098d533c37c59fad4c928
7
- data.tar.gz: dfc6216044f4b197ef8c527df107c2743b87f5145c450d46ccc08c0419ab6c2b5f6c71bce3b557058128f937e732855ee223eb9fa344dd2bdaf4d9c84c5d4b8f
6
+ metadata.gz: 9d9b1bec69b6340241e94a92b11c62ed3ef24d35c2b6497f858bd28e68cfbe7ff9b5c16f4e5fd8e73c06db187bcc07cf5464ab70eb6bee0be6a8645605c89bb3
7
+ data.tar.gz: c8b1c572997fb721fd67d17c5cb891d4c386bde6314fd77f0ad260a12805faf9acfa85e9b9b50b798e8f78736c933b07895a227179c260bfeb5c2a1c66cf8bfa
data/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  File : README.md
4
4
  Maintainer : Felix C. Stegerman <flx@obfusk.net>
5
- Date : 2014-02-20
5
+ Date : 2014-03-03
6
6
 
7
7
  Copyright : Copyright (C) 2014 Felix C. Stegerman
8
- Version : v0.5.0
8
+ Version : v0.5.1
9
9
 
10
10
  []: }}}1
11
11
 
@@ -54,8 +54,22 @@ require 'obfusk/util/data'
54
54
 
55
55
  x = { x: { y: 0 }, z: [1,2,3] }
56
56
  Obfusk::Util.assoc(x, [:x,:y] => 1, [:z,1] => 99)
57
- x[:x][:y] == 1 # => true
58
- x[:z] == [1,99,3] # => true
57
+ x[:x][:y] # => 1
58
+ x[:z] # => [1,99,3]
59
+
60
+ Obfusk::Util.get_in({ x: { y: 1 } }, :x, :y)
61
+ # => 1
62
+
63
+ Obfusk::Util.symbolize_keys({ 'x' => 1, 'y' => 99 })
64
+ # => { x: 1, y: 99 }
65
+
66
+ Obfusk::Util.deep_stringify_keys({ x: { 2 => 99 } })
67
+ # => { 'x' => { '2' => 99 } }
68
+
69
+ h1 = { x: { y: 42 }, z: 11 }
70
+ h2 = { x: { y: 1, q: 1 }, z: 1 }
71
+ Obfusk::Util.deep_merge(h1, h2) { |k,o,n| o + n }
72
+ # => { x: { y: 43, q: 1 }, z: 12 }
59
73
 
60
74
  y = Obfusk::Util.deepdup x
61
75
  Obfusk::Util.empty_as_nil(ENV['FOO']) || default
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # File : obfusk/util/data.rb
4
4
  # Maintainer : Felix C. Stegerman <flx@obfusk.net>
5
- # Date : 2014-02-19
5
+ # Date : 2014-03-03
6
6
  #
7
7
  # Copyright : Copyright (C) 2014 Felix C. Stegerman
8
8
  # Licence : LGPLv3+
@@ -33,6 +33,77 @@ module Obfusk; module Util
33
33
  x
34
34
  end # }}}1
35
35
 
36
+ # get the value in a nested associative structure; returns the value
37
+ # (if found), the result of the block (if passed), or nil.
38
+ #
39
+ # ```
40
+ # get_in({ x: { y: 1 } }, :x, :y)
41
+ # # => 1
42
+ # ```
43
+ def self.get_in(x, *ks, &b) # {{{1
44
+ if ks.length == 0
45
+ x
46
+ else
47
+ v = x.fetch(ks.first) { return b && b[] }
48
+ get_in v, *ks.drop(1), &b
49
+ end
50
+ end # }}}1
51
+
52
+ # --
53
+
54
+ # convert hash keys to strings
55
+ def self.stringify_keys(h)
56
+ transform_keys(h, &:to_s)
57
+ end
58
+
59
+ # convert hash keys to symbols
60
+ # @param always [Boolean] whether to always convert or ignore errors
61
+ def self.symbolize_keys(h, always = true)
62
+ transform_keys(h, &(always ? :to_sym : -> k { k.to_sym rescue k }))
63
+ end
64
+
65
+ # convert hash keys using block
66
+ def self.transform_keys(h, &b)
67
+ Hash[h.map { |k,v| [b[k],v] }]
68
+ end
69
+
70
+ # --
71
+
72
+ # convert nested hash keys to strings
73
+ def self.deep_stringify_keys(h)
74
+ deep_transform_keys(h, &:to_s)
75
+ end
76
+
77
+ # convert nested hash keys to symbols
78
+ # @param always [Boolean] whether to always convert or ignore errors
79
+ def self.deep_symbolize_keys(h, always = true)
80
+ deep_transform_keys(h, &(always ? :to_sym : -> k { k.to_sym rescue k }))
81
+ end
82
+
83
+ # convert nested hash keys using block
84
+ def self.deep_transform_keys(h, &b)
85
+ Hash[h.map { |k,v| [b[k], v.is_a?(Hash) ? deep_transform_keys(v,&b) : v] }]
86
+ end
87
+
88
+ # --
89
+
90
+ # merge hashes recursively
91
+ def self.deep_merge(h1, h2, &b) # {{{1
92
+ h1.merge(Hash[h2.map do |k,v2|
93
+ if h1.has_key?(k)
94
+ if (v1 = h1[k]).is_a?(Hash) && v2.is_a?(Hash)
95
+ [k, deep_merge(v1, v2, &b)]
96
+ else
97
+ [k, b ? b[k,h1[k],v2] : v2]
98
+ end
99
+ else
100
+ [k, v2]
101
+ end
102
+ end])
103
+ end # }}}1
104
+
105
+ # --
106
+
36
107
  # deep copy using Marshal
37
108
  def self.deepdup(obj)
38
109
  Marshal.load Marshal.dump obj
@@ -110,36 +110,36 @@ module Obfusk; module Util
110
110
 
111
111
  # --
112
112
 
113
- # ohai + sh; requires `obfusk/util/message`
113
+ # onow + sh; requires `obfusk/util/message`
114
114
  def self.osh(*args)
115
- ::Obfusk::Util.ohai _spawn_rm_opts(args)*' '; sh(*args)
115
+ ::Obfusk::Util.onow 'sh', *_spawn_rm_opts(args); sh(*args)
116
116
  end
117
117
 
118
- # ohai + sh?; requires `obfusk/util/message`
118
+ # onow + sh?; requires `obfusk/util/message`
119
119
  def self.osh?(*args)
120
- ::Obfusk::Util.ohai _spawn_rm_opts(args)*' '; sh?(*args)
120
+ ::Obfusk::Util.onow 'sh', *_spawn_rm_opts(args); sh?(*args)
121
121
  end
122
122
 
123
- # ohai + sh!; requires `obfusk/util/message`
123
+ # onow + sh!; requires `obfusk/util/message`
124
124
  def self.osh!(*args)
125
- ::Obfusk::Util.ohai _spawn_rm_opts(args)*' '; sh!(*args)
125
+ ::Obfusk::Util.onow 'sh', *_spawn_rm_opts(args); sh!(*args)
126
126
  end
127
127
 
128
128
  # --
129
129
 
130
- # ohai + shc; requires `obfusk/util/message`
130
+ # onow + shc; requires `obfusk/util/message`
131
131
  def self.oshc(*args)
132
- ::Obfusk::Util.ohai _spawn_rm_opts(args)*' '; shc(*args)
132
+ ::Obfusk::Util.onow 'sh', *_spawn_rm_opts(args); shc(*args)
133
133
  end
134
134
 
135
- # ohai + shc?; requires `obfusk/util/message`
135
+ # onow + shc?; requires `obfusk/util/message`
136
136
  def self.oshc?(*args)
137
- ::Obfusk::Util.ohai _spawn_rm_opts(args)*' '; shc?(*args)
137
+ ::Obfusk::Util.onow 'sh', *_spawn_rm_opts(args); shc?(*args)
138
138
  end
139
139
 
140
- # ohai + shc!; requires `obfusk/util/message`
140
+ # onow + shc!; requires `obfusk/util/message`
141
141
  def self.oshc!(*args)
142
- ::Obfusk::Util.ohai _spawn_rm_opts(args)*' '; shc!(*args)
142
+ ::Obfusk::Util.onow 'sh', *_spawn_rm_opts(args); shc!(*args)
143
143
  end
144
144
 
145
145
  # --
@@ -1,5 +1,5 @@
1
1
  # my namespace
2
2
  module Obfusk; module Util
3
- VERSION = '0.5.0'
4
- DATE = '2014-02-20'
3
+ VERSION = '0.5.1'
4
+ DATE = '2014-03-03'
5
5
  end; end
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # File : obfusk/util/data_spec.rb
4
4
  # Maintainer : Felix C. Stegerman <flx@obfusk.net>
5
- # Date : 2014-02-19
5
+ # Date : 2014-03-03
6
6
  #
7
7
  # Copyright : Copyright (C) 2014 Felix C. Stegerman
8
8
  # Licence : LGPLv3+
@@ -29,6 +29,82 @@ describe 'obfusk/util/data' do
29
29
  end
30
30
  end # }}}1
31
31
 
32
+ context 'get_in' do # {{{1
33
+ it 'returns nested key' do
34
+ x = { x: { y: 0 }, z: [1,2,3] }
35
+ expect(ou.get_in(x, :x, :y)).to eq(0)
36
+ expect(ou.get_in(x, :z, 1)).to eq(2)
37
+ end
38
+ it 'returns nil when not found' do
39
+ expect(ou.get_in({}, :x, :y)).to eq(nil)
40
+ end
41
+ it 'returns block result when not found and block given' do
42
+ expect(ou.get_in({}, :x, :y) { 42 }).to eq(42)
43
+ end
44
+ end # }}}1
45
+
46
+ context 'stringify_keys' do # {{{1
47
+ it 'transforms keys to strings' do
48
+ expect(ou.stringify_keys({ x: 1, 2 => 99 })).to \
49
+ eq({ 'x' => 1, '2' => 99 })
50
+ end
51
+ end # }}}1
52
+
53
+ context 'symbolize_keys' do # {{{1
54
+ it 'transforms keys to symbols' do
55
+ expect(ou.symbolize_keys({ 'x' => 1, 'y' => 99 })).to \
56
+ eq({ x: 1, y: 99 })
57
+ end
58
+ it 'ignores errors w/ always = false' do
59
+ expect(ou.symbolize_keys({ 'x' => 1, 2 => 99 }, false)).to \
60
+ eq({ x: 1, 2 => 99 })
61
+ end
62
+ end # }}}1
63
+
64
+ context 'transform_keys' do # {{{1
65
+ it 'transforms keys' do
66
+ h = { 'x' => 1, 2 => 99 }
67
+ expect(ou.transform_keys(h) { |k| k.to_sym rescue k }).to \
68
+ eq({ x: 1, 2 => 99 })
69
+ end
70
+ end # }}}1
71
+
72
+ context 'deep_stringify_keys' do # {{{1
73
+ it 'transforms nested keys to strings' do
74
+ expect(ou.deep_stringify_keys({ x: { 2 => 99 } })).to \
75
+ eq({ 'x' => { '2' => 99 } })
76
+ end
77
+ end # }}}1
78
+
79
+ context 'deep_symbolize_keys' do # {{{1
80
+ it 'transforms nested keys to symbols' do
81
+ expect(ou.deep_symbolize_keys({ 'x' => { 'y' => 99 } })).to \
82
+ eq({ x: { y: 99 } })
83
+ end
84
+ end # }}}1
85
+
86
+ context 'deep_transform_keys' do # {{{1
87
+ it 'transforms nested keys' do
88
+ h = { 'x' => { 'y' => 42 }, 2 => 99 }
89
+ expect(ou.deep_transform_keys(h) { |k| k.to_sym rescue k }).to \
90
+ eq({ x: { y: 42 }, 2 => 99 })
91
+ end
92
+ end # }}}1
93
+
94
+ context 'deep_merge' do # {{{1
95
+ it 'merges hashes recursively' do
96
+ h1 = { x: { y: 42 }, z: 11 }
97
+ h2 = { x: { y: 1 , q: 1 }, z: 1 }
98
+ h3 = { x: { y: 1 , q: 1 }, z: 1 }
99
+ h4 = { x: { y: 42, q: 1 }, z: 11 }
100
+ h5 = { x: { y: 43, q: 1 }, z: 12 }
101
+ f = -> k,o,n { o + n }
102
+ expect(ou.deep_merge(h1, h2 )).to eq(h3)
103
+ expect(ou.deep_merge(h2, h1 )).to eq(h4)
104
+ expect(ou.deep_merge(h1, h2, &f)).to eq(h5)
105
+ end
106
+ end # }}}1
107
+
32
108
  context 'deepdup' do # {{{1
33
109
  it 'equal' do
34
110
  x = { x: { y: 0 }, z: [1,2,3], s: ds::S.new(1,2) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: obfusk-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix C. Stegerman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-20 00:00:00.000000000 Z
11
+ date: 2014-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake