shenanigans 1.0.2 → 1.0.3

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.
data/doc/Hash.html CHANGED
@@ -48,6 +48,7 @@
48
48
  <h3 class="section-header">Defined In</h3>
49
49
  <ul>
50
50
  <li>lib/shenanigans/hash/has_shape_pred.rb
51
+ <li>lib/shenanigans/hash/to_ostruct.rb
51
52
  </ul>
52
53
  </nav>
53
54
 
@@ -72,6 +73,8 @@
72
73
 
73
74
  <li><a href="#method-i-has_shape-3F">#has_shape?</a>
74
75
 
76
+ <li><a href="#method-i-to_ostruct">#to_ostruct</a>
77
+
75
78
  </ul>
76
79
  </nav>
77
80
 
@@ -112,6 +115,27 @@
112
115
 
113
116
  <div id="description" class="description">
114
117
 
118
+ <p>Recursively converts a <code>Hash</code> and all nested <code>Hash</code>es
119
+ to <code>OpenStruct</code>s. Especially useful for parsing YAML.</p>
120
+
121
+ <pre class="ruby"><span class="ruby-identifier">yaml</span>=<span class="ruby-string">&quot;subject: Programming Languages
122
+ languages:
123
+ - name : Ruby
124
+ creator : Matz
125
+ - name : Python
126
+ creator : Guido van Rossum
127
+ - name : Perl
128
+ creator : Larry Wall
129
+ &quot;</span>
130
+ <span class="ruby-identifier">struct</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">yaml</span>).<span class="ruby-identifier">to_ostruct</span>
131
+ <span class="ruby-identifier">struct</span>.<span class="ruby-identifier">subject</span>
132
+ <span class="ruby-comment">#=&gt; &quot;Programming Languages&quot;</span>
133
+ <span class="ruby-identifier">struct</span>.<span class="ruby-identifier">languages</span>.<span class="ruby-identifier">first</span>
134
+ <span class="ruby-comment">#=&gt; #&lt;OpenStruct name=&quot;Ruby&quot;, creator=&quot;Matz&quot;&gt;</span>
135
+ <span class="ruby-identifier">struct</span>.<span class="ruby-identifier">languages</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">creator</span>
136
+ <span class="ruby-comment">#=&gt; &quot;Matz&quot;</span>
137
+ </pre>
138
+
115
139
  </div><!-- description -->
116
140
 
117
141
 
@@ -179,6 +203,46 @@
179
203
  </div><!-- has_shape-3F-method -->
180
204
 
181
205
 
206
+ <div id="method-i-to_ostruct" class="method-detail ">
207
+
208
+ <div class="method-heading">
209
+ <span class="method-name">to_ostruct</span><span
210
+ class="method-args">()</span>
211
+ <span class="method-click-advice">click to toggle source</span>
212
+ </div>
213
+
214
+
215
+ <div class="method-description">
216
+
217
+
218
+
219
+
220
+
221
+ <div class="method-source-code" id="to_ostruct-source">
222
+ <pre><span class="ruby-comment"># File lib/shenanigans/hash/to_ostruct.rb, line 24</span>
223
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">to_ostruct</span>
224
+ <span class="ruby-identifier">arr</span> = <span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
225
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">v</span>
226
+ <span class="ruby-keyword">when</span> <span class="ruby-constant">Hash</span>
227
+ [<span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span>.<span class="ruby-identifier">to_open_struct</span>]
228
+ <span class="ruby-keyword">when</span> <span class="ruby-constant">Array</span>
229
+ [<span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">el</span><span class="ruby-operator">|</span> <span class="ruby-constant">Hash</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">el</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">el</span>.<span class="ruby-identifier">to_ostruct</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">el</span> }]
230
+ <span class="ruby-keyword">else</span>
231
+ [<span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span>]
232
+ <span class="ruby-keyword">end</span>
233
+ <span class="ruby-keyword">end</span>
234
+ <span class="ruby-constant">OpenStruct</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">arr</span>)
235
+ <span class="ruby-keyword">end</span></pre>
236
+ </div><!-- to_ostruct-source -->
237
+
238
+ </div>
239
+
240
+
241
+
242
+
243
+ </div><!-- to_ostruct-method -->
244
+
245
+
182
246
  </section><!-- public-instance-method-details -->
183
247
 
184
248
  </section><!-- 5Buntitled-5D -->
data/doc/created.rid CHANGED
@@ -1,10 +1,11 @@
1
- Tue, 19 Jun 2012 21:25:09 +0200
1
+ Thu, 21 Jun 2012 19:19:16 +0200
2
2
  README.rdoc Thu, 17 May 2012 11:45:08 +0200
3
3
  lib/shenanigans/array/random_subarray.rb Thu, 17 May 2012 00:03:23 +0200
4
4
  lib/shenanigans/array/zip_with.rb Tue, 19 Jun 2012 21:23:27 +0200
5
5
  lib/shenanigans/array.rb Wed, 16 May 2012 20:09:21 +0200
6
6
  lib/shenanigans/hash/has_shape_pred.rb Tue, 19 Jun 2012 21:25:03 +0200
7
- lib/shenanigans/hash.rb Tue, 19 Jun 2012 21:04:00 +0200
7
+ lib/shenanigans/hash/to_ostruct.rb Thu, 21 Jun 2012 19:19:11 +0200
8
+ lib/shenanigans/hash.rb Thu, 21 Jun 2012 19:13:44 +0200
8
9
  lib/shenanigans/kernel/fn.rb Wed, 16 May 2012 23:57:36 +0200
9
10
  lib/shenanigans/kernel/prompt.rb Thu, 17 May 2012 00:10:42 +0200
10
11
  lib/shenanigans/kernel/with.rb Thu, 17 May 2012 00:00:08 +0200
@@ -1 +1 @@
1
- var search_data = {"index":{"searchIndex":["array","hash","kernel","object","d()","display()","fn()","has_shape?()","identity()","prompt()","random_subarray()","with()","zip_with()","readme"],"longSearchIndex":["array","hash","kernel","object","object#d()","object#display()","kernel#fn()","hash#has_shape?()","object#identity()","kernel#prompt()","array#random_subarray()","kernel#with()","array#zip_with()",""],"info":[["Array","","Array.html","",""],["Hash","","Hash.html","",""],["Kernel","","Kernel.html","",""],["Object","","Object.html","",""],["d","Object","Object.html#method-i-d","(new_line = true)",""],["display","Object","Object.html#method-i-display","(new_line = true)","<p>Outputs the object and also returns it. Will use <code>puts</code> if\n<code>new_line</code> is <code>true</code> and <code>print</code>\notherwise.\n\n<pre>&quot;foo&quot;.display ...</pre>\n"],["fn","Kernel","Kernel.html#method-i-fn","(*funs)","<p>Composes a list of functions. Functions can be specified as symbols or\nlambdas.\n\n<pre>[&quot;foo bar&quot;, &quot;baz qux&quot;].map ...</pre>\n"],["has_shape?","Hash","Hash.html#method-i-has_shape-3F","(shape)","<p>Checks if a hash has a certain structure.\n\n<pre>h = { k1: 1, k2: &quot;1&quot; }\nh.has_shape?(k1: Fixnum, k2: String) ...</pre>\n"],["identity","Object","Object.html#method-i-identity","()","<p>An identity method that provides access to an object’s <code>self</code>.\n\n<pre>[1,2,3,4,5,1,2,2,3].group_by(&amp;:identity) ...</pre>\n"],["prompt","Kernel","Kernel.html#method-i-prompt","(text='', conversion=nil)","<p>Displays a prompt and returns chomped input. Modelled after the Python\nmethod <code>raw_input</code>, but also can …\n"],["random_subarray","Array","Array.html#method-i-random_subarray","(n=1)","<p>Generates random subarrays. Uses random numbers and bit-fiddling to assure\nperformant uniform distributions …\n"],["with","Kernel","Kernel.html#method-i-with","(o, &blk)","<p>A Pascal/ActionScript like <code>with</code> method. Yields its argument to\nthe provided block and then returns it. …\n"],["zip_with","Array","Array.html#method-i-zip_with","(other, op=nil)","<p>Zip <code>self</code> with <code>other</code>, combining the elements with\nthe provided block or symbol. The resulting array will …\n"],["README","","README_rdoc.html","","<p>Shenanigans\n<p><strong>shenanigan</strong> (plural shenanigans):\n<p>Trickery, games; skulduggery. To “call”, “claim” …\n"]]}}
1
+ var search_data = {"index":{"searchIndex":["array","hash","kernel","object","d()","display()","fn()","has_shape?()","identity()","prompt()","random_subarray()","to_ostruct()","with()","zip_with()","readme"],"longSearchIndex":["array","hash","kernel","object","object#d()","object#display()","kernel#fn()","hash#has_shape?()","object#identity()","kernel#prompt()","array#random_subarray()","hash#to_ostruct()","kernel#with()","array#zip_with()",""],"info":[["Array","","Array.html","",""],["Hash","","Hash.html","","<p>Recursively converts a <code>Hash</code> and all nested <code>Hash</code>es\nto <code>OpenStruct</code>s. Especially useful for parsing YAML …\n"],["Kernel","","Kernel.html","",""],["Object","","Object.html","",""],["d","Object","Object.html#method-i-d","(new_line = true)",""],["display","Object","Object.html#method-i-display","(new_line = true)","<p>Outputs the object and also returns it. Will use <code>puts</code> if\n<code>new_line</code> is <code>true</code> and <code>print</code>\notherwise.\n\n<pre>&quot;foo&quot;.display ...</pre>\n"],["fn","Kernel","Kernel.html#method-i-fn","(*funs)","<p>Composes a list of functions. Functions can be specified as symbols or\nlambdas.\n\n<pre>[&quot;foo bar&quot;, &quot;baz qux&quot;].map ...</pre>\n"],["has_shape?","Hash","Hash.html#method-i-has_shape-3F","(shape)","<p>Checks if a hash has a certain structure.\n\n<pre>h = { k1: 1, k2: &quot;1&quot; }\nh.has_shape?(k1: Fixnum, k2: String) ...</pre>\n"],["identity","Object","Object.html#method-i-identity","()","<p>An identity method that provides access to an object’s <code>self</code>.\n\n<pre>[1,2,3,4,5,1,2,2,3].group_by(&amp;:identity) ...</pre>\n"],["prompt","Kernel","Kernel.html#method-i-prompt","(text='', conversion=nil)","<p>Displays a prompt and returns chomped input. Modelled after the Python\nmethod <code>raw_input</code>, but also can …\n"],["random_subarray","Array","Array.html#method-i-random_subarray","(n=1)","<p>Generates random subarrays. Uses random numbers and bit-fiddling to assure\nperformant uniform distributions …\n"],["to_ostruct","Hash","Hash.html#method-i-to_ostruct","()",""],["with","Kernel","Kernel.html#method-i-with","(o, &blk)","<p>A Pascal/ActionScript like <code>with</code> method. Yields its argument to\nthe provided block and then returns it. …\n"],["zip_with","Array","Array.html#method-i-zip_with","(other, op=nil)","<p>Zip <code>self</code> with <code>other</code>, combining the elements with\nthe provided block or symbol. The resulting array will …\n"],["README","","README_rdoc.html","","<p>Shenanigans\n<p><strong>shenanigan</strong> (plural shenanigans):\n<p>Trickery, games; skulduggery. To “call”, “claim” …\n"]]}}
@@ -76,6 +76,8 @@
76
76
 
77
77
  <li class="method"><a href="Array.html#method-i-random_subarray">#random_subarray &mdash; Array</a>
78
78
 
79
+ <li class="method"><a href="Hash.html#method-i-to_ostruct">#to_ostruct &mdash; Hash</a>
80
+
79
81
  <li class="method"><a href="Kernel.html#method-i-with">#with &mdash; Kernel</a>
80
82
 
81
83
  <li class="method"><a href="Array.html#method-i-zip_with">#zip_with &mdash; Array</a>
@@ -0,0 +1,37 @@
1
+ require 'ostruct'
2
+
3
+ # Recursively converts a <tt>Hash</tt> and all nested <tt>Hash</tt>es to
4
+ # <tt>OpenStruct</tt>s. Especially useful for parsing YAML.
5
+ # yaml=<<EOY
6
+ # subject: Programming Languages
7
+ # languages:
8
+ # - name : Ruby
9
+ # creator : Matz
10
+ # - name : Python
11
+ # creator : Guido van Rossum
12
+ # - name : Perl
13
+ # creator : Larry Wall
14
+ # EOY
15
+ # struct = YAML.load(yaml).to_ostruct
16
+ # struct.subject
17
+ # #=> "Programming Languages"
18
+ # struct.languages.first
19
+ # #=> #<OpenStruct name="Ruby", creator="Matz">
20
+ # struct.languages.first.creator
21
+ # #=> "Matz"
22
+
23
+ class Hash
24
+ def to_ostruct
25
+ arr = map do |k, v|
26
+ case v
27
+ when Hash
28
+ [k, v.to_ostruct]
29
+ when Array
30
+ [k, v.map { |el| Hash === el ? el.to_ostruct : el }]
31
+ else
32
+ [k, v]
33
+ end
34
+ end
35
+ OpenStruct.new(arr)
36
+ end
37
+ end
@@ -1 +1,2 @@
1
1
  require_relative 'hash/has_shape_pred'
2
+ require_relative 'hash/to_ostruct'
@@ -0,0 +1,19 @@
1
+ require 'minitest/autorun'
2
+ require 'shenanigans/hash/to_ostruct'
3
+
4
+ class ToOstruct < MiniTest::Unit::TestCase
5
+ def test_simple_hash
6
+ struct = {a: 1, b: 2}.to_ostruct
7
+ assert struct.b == 2
8
+ end
9
+
10
+ def test_nested_hash
11
+ struct = {a: 1, b: {c: 3}}.to_ostruct
12
+ assert struct.b.c == 3
13
+ end
14
+
15
+ def test_nested_array
16
+ struct = {a: 1, b: [{c: 2}]}.to_ostruct
17
+ assert struct.b.first.c == 2
18
+ end
19
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shenanigans
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-19 00:00:00.000000000 Z
12
+ date: 2012-06-21 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email: citizen428@gmail.com
@@ -63,6 +63,7 @@ files:
63
63
  - lib/shenanigans/array/zip_with.rb
64
64
  - lib/shenanigans/array.rb
65
65
  - lib/shenanigans/hash/has_shape_pred.rb
66
+ - lib/shenanigans/hash/to_ostruct.rb
66
67
  - lib/shenanigans/hash.rb
67
68
  - lib/shenanigans/kernel/fn.rb
68
69
  - lib/shenanigans/kernel/prompt.rb
@@ -77,6 +78,7 @@ files:
77
78
  - test/array/test_random_subarray.rb
78
79
  - test/array/test_zip_with.rb
79
80
  - test/hash/test_has_shape_pred.rb
81
+ - test/hash/test_to_ostruct.rb
80
82
  - test/kernel/test_fn.rb
81
83
  - test/kernel/test_prompt.rb
82
84
  - test/kernel/test_with.rb