hash_params 0.0.2 → 2.0.0

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +8 -8
  3. data/README.md +167 -109
  4. data/coverage/assets/0.9.0/application.css +799 -0
  5. data/coverage/assets/0.9.0/application.js +1707 -0
  6. data/coverage/assets/0.9.0/colorbox/border.png +0 -0
  7. data/coverage/assets/0.9.0/colorbox/controls.png +0 -0
  8. data/coverage/assets/0.9.0/colorbox/loading.gif +0 -0
  9. data/coverage/assets/0.9.0/colorbox/loading_background.png +0 -0
  10. data/coverage/assets/0.9.0/favicon_green.png +0 -0
  11. data/coverage/assets/0.9.0/favicon_red.png +0 -0
  12. data/coverage/assets/0.9.0/favicon_yellow.png +0 -0
  13. data/coverage/assets/0.9.0/loading.gif +0 -0
  14. data/coverage/assets/0.9.0/magnify.png +0 -0
  15. data/coverage/assets/0.9.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  16. data/coverage/assets/0.9.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  17. data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  18. data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  19. data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  20. data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  21. data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  22. data/coverage/assets/0.9.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  23. data/coverage/assets/0.9.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  24. data/coverage/assets/0.9.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  25. data/coverage/assets/0.9.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  26. data/coverage/assets/0.9.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  27. data/coverage/assets/0.9.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  28. data/coverage/index.html +1597 -369
  29. data/hash_params.gemspec +14 -5
  30. data/lib/hash_params/binding_validator.rb +26 -0
  31. data/lib/hash_params/hash_validator.rb +71 -0
  32. data/lib/hash_params/validator.rb +119 -0
  33. data/lib/hash_params/yaml_params.rb +93 -0
  34. data/lib/hash_params.rb +15 -142
  35. data/spec/hash_params_spec.rb +100 -63
  36. data/spec/spec_helper.rb +0 -11
  37. data/tmp/hash_params.rb +181 -0
  38. data/tmp/hash_params_spec.rb +102 -0
  39. data/tmp/module_spec.rb +27 -0
  40. data/tmp/var_spec.rb +9 -0
  41. data/tmp/yaml_params.rb +109 -0
  42. metadata +36 -3
data/coverage/index.html CHANGED
@@ -3,38 +3,38 @@
3
3
  <head>
4
4
  <title>Code coverage for Hash param</title>
5
5
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
- <script src='./assets/0.8.0/application.js' type='text/javascript'></script>
7
- <link href='./assets/0.8.0/application.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
8
- <link rel="shortcut icon" type="image/png" href="./assets/0.8.0/favicon_green.png" />
9
- <link rel="icon" type="image/png" href="./assets/0.8.0/favicon.png" />
6
+ <script src='./assets/0.9.0/application.js' type='text/javascript'></script>
7
+ <link href='./assets/0.9.0/application.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
8
+ <link rel="shortcut icon" type="image/png" href="./assets/0.9.0/favicon_red.png" />
9
+ <link rel="icon" type="image/png" href="./assets/0.9.0/favicon.png" />
10
10
  </head>
11
11
 
12
12
  <body>
13
13
  <div id="loading">
14
- <img src="./assets/0.8.0/loading.gif" alt="loading"/>
14
+ <img src="./assets/0.9.0/loading.gif" alt="loading"/>
15
15
  </div>
16
16
  <div id="wrapper" style="display:none;">
17
- <div class="timestamp">Generated <abbr class="timeago" title="2014-07-23T16:04:30+12:00">2014-07-23T16:04:30+12:00</abbr></div>
17
+ <div class="timestamp">Generated <abbr class="timeago" title="2015-05-19T14:23:50+12:00">2015-05-19T14:23:50+12:00</abbr></div>
18
18
  <ul class="group_tabs"></ul>
19
19
 
20
20
  <div id="content">
21
21
  <div class="file_list_container" id="AllFiles">
22
22
  <h2>
23
23
  <span class="group_name">All Files</span>
24
- (<span class="covered_percent"><span class="green">90.41%</span></span>
24
+ (<span class="covered_percent"><span class="red">75.16%</span></span>
25
25
  covered at
26
26
  <span class="covered_strength">
27
27
  <span class="green">
28
- 5.1
28
+ 4.61
29
29
  </span>
30
30
  </span> hits/line)
31
31
  </h2>
32
32
  <a name="AllFiles"></a>
33
33
  <div>
34
- <b>1</b> files in total.
35
- <b>73</b> relevant lines.
36
- <span class="green"><b>66</b> lines covered</span> and
37
- <span class="red"><b>7</b> lines missed </span>
34
+ <b>5</b> files in total.
35
+ <b>161</b> relevant lines.
36
+ <span class="green"><b>121</b> lines covered</span> and
37
+ <span class="red"><b>40</b> lines missed </span>
38
38
  </div>
39
39
  <table class="file_list">
40
40
  <thead>
@@ -51,13 +51,53 @@
51
51
  <tbody>
52
52
 
53
53
  <tr>
54
- <td class="strong"><a href="#cd179921d0f6beb52ad4857e1e0facafefb4d8a3" class="src_link" title="lib/hash_params.rb">lib/hash_params.rb</a></td>
55
- <td class="green strong">90.41 %</td>
56
- <td>144</td>
57
- <td>73</td>
58
- <td>66</td>
59
- <td>7</td>
60
- <td>5.1</td>
54
+ <td class="strong"><a href="#32ada782cad1cca43940fc5c8a722f32fd765f14" class="src_link" title="lib/hash_params.rb">lib/hash_params.rb</a></td>
55
+ <td class="green strong">100.0 %</td>
56
+ <td>21</td>
57
+ <td>12</td>
58
+ <td>12</td>
59
+ <td>0</td>
60
+ <td>1.0</td>
61
+ </tr>
62
+
63
+ <tr>
64
+ <td class="strong"><a href="#b1c546b2a036367cd6714d1a3d80305afff21484" class="src_link" title="lib/hash_params/binding_validator.rb">lib/hash_params/binding_validator.rb</a></td>
65
+ <td class="green strong">92.86 %</td>
66
+ <td>26</td>
67
+ <td>14</td>
68
+ <td>13</td>
69
+ <td>1</td>
70
+ <td>1.9</td>
71
+ </tr>
72
+
73
+ <tr>
74
+ <td class="strong"><a href="#f3376cb3f02016b662bfae7b7507dfdf1e033e63" class="src_link" title="lib/hash_params/hash_validator.rb">lib/hash_params/hash_validator.rb</a></td>
75
+ <td class="green strong">97.37 %</td>
76
+ <td>71</td>
77
+ <td>38</td>
78
+ <td>37</td>
79
+ <td>1</td>
80
+ <td>2.8</td>
81
+ </tr>
82
+
83
+ <tr>
84
+ <td class="strong"><a href="#f39507e800e8d660c679f1092f4a3b699ac789cb" class="src_link" title="lib/hash_params/validator.rb">lib/hash_params/validator.rb</a></td>
85
+ <td class="green strong">94.74 %</td>
86
+ <td>119</td>
87
+ <td>57</td>
88
+ <td>54</td>
89
+ <td>3</td>
90
+ <td>10.4</td>
91
+ </tr>
92
+
93
+ <tr>
94
+ <td class="strong"><a href="#abb09c4ec783968d5f7a1a3adac854712f21ee1e" class="src_link" title="lib/hash_params/yaml_params.rb">lib/hash_params/yaml_params.rb</a></td>
95
+ <td class="red strong">12.5 %</td>
96
+ <td>93</td>
97
+ <td>40</td>
98
+ <td>5</td>
99
+ <td>35</td>
100
+ <td>0.1</td>
61
101
  </tr>
62
102
 
63
103
  </tbody>
@@ -69,21 +109,21 @@
69
109
  </div>
70
110
 
71
111
  <div id="footer">
72
- Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.9.0
73
- and simplecov-html v0.8.0<br/>
112
+ Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.9.2
113
+ and simplecov-html v0.9.0<br/>
74
114
  using RSpec
75
115
  </div>
76
116
 
77
117
  <div class="source_files">
78
118
 
79
- <div class="source_table" id="cd179921d0f6beb52ad4857e1e0facafefb4d8a3">
119
+ <div class="source_table" id="32ada782cad1cca43940fc5c8a722f32fd765f14">
80
120
  <div class="header">
81
121
  <h3>lib/hash_params.rb</h3>
82
- <h4><span class="green">90.41 %</span> covered</h4>
122
+ <h4><span class="green">100.0 %</span> covered</h4>
83
123
  <div>
84
- <b>73</b> relevant lines.
85
- <span class="green"><b>66</b> lines covered</span> and
86
- <span class="red"><b>7</b> lines missed.</span>
124
+ <b>12</b> relevant lines.
125
+ <span class="green"><b>12</b> lines covered</span> and
126
+ <span class="red"><b>0</b> lines missed.</span>
87
127
  </div>
88
128
  </div>
89
129
 
@@ -93,19 +133,19 @@
93
133
  <li class="covered" data-hits="1" data-linenumber="1">
94
134
  <span class="hits">1</span>
95
135
 
96
- <code class="ruby">class HashParams &lt; Hash</code>
136
+ <code class="ruby">require &#39;yaml&#39;</code>
97
137
  </li>
98
138
 
99
139
  <li class="covered" data-hits="1" data-linenumber="2">
100
140
  <span class="hits">1</span>
101
141
 
102
- <code class="ruby"> VERSION = &#39;0.0.1&#39;</code>
142
+ <code class="ruby">require &#39;erb&#39;</code>
103
143
  </li>
104
144
 
105
145
  <li class="covered" data-hits="1" data-linenumber="3">
106
146
  <span class="hits">1</span>
107
147
 
108
- <code class="ruby"> attr :valid, :errors</code>
148
+ <code class="ruby">require &#39;socket&#39;</code>
109
149
  </li>
110
150
 
111
151
  <li class="never" data-hits="" data-linenumber="4">
@@ -114,841 +154,2029 @@
114
154
  <code class="ruby"></code>
115
155
  </li>
116
156
 
157
+ <li class="never" data-hits="" data-linenumber="5">
158
+
159
+
160
+ <code class="ruby"></code>
161
+ </li>
162
+
163
+ <li class="covered" data-hits="1" data-linenumber="6">
164
+ <span class="hits">1</span>
165
+
166
+ <code class="ruby">require_relative &#39;hash_params/hash_validator&#39;</code>
167
+ </li>
168
+
169
+ <li class="covered" data-hits="1" data-linenumber="7">
170
+ <span class="hits">1</span>
171
+
172
+ <code class="ruby">require_relative &#39;hash_params/validator&#39;</code>
173
+ </li>
174
+
175
+ <li class="covered" data-hits="1" data-linenumber="8">
176
+ <span class="hits">1</span>
177
+
178
+ <code class="ruby">require_relative &#39;hash_params/binding_validator&#39;</code>
179
+ </li>
180
+
181
+ <li class="covered" data-hits="1" data-linenumber="9">
182
+ <span class="hits">1</span>
183
+
184
+ <code class="ruby">module HashParams</code>
185
+ </li>
186
+
187
+ <li class="covered" data-hits="1" data-linenumber="10">
188
+ <span class="hits">1</span>
189
+
190
+ <code class="ruby"> ENVIRONMENT = ENV[&#39;HASH_PARAMS_ENV&#39;] || (defined?(Rails) &amp;&amp; Rails.env) || ENV[&#39;RAILS_ENV&#39;] || ENV[&#39;RACK_ENV&#39;] || &#39;development&#39;</code>
191
+ </li>
192
+
193
+ <li class="covered" data-hits="1" data-linenumber="11">
194
+ <span class="hits">1</span>
195
+
196
+ <code class="ruby"> VERSION = &#39;2.0.0&#39;</code>
197
+ </li>
198
+
199
+ <li class="covered" data-hits="1" data-linenumber="12">
200
+ <span class="hits">1</span>
201
+
202
+ <code class="ruby"> extend HashParams::Validator</code>
203
+ </li>
204
+
205
+ <li class="never" data-hits="" data-linenumber="13">
206
+
207
+
208
+ <code class="ruby">end</code>
209
+ </li>
210
+
211
+ <li class="never" data-hits="" data-linenumber="14">
212
+
213
+
214
+ <code class="ruby"></code>
215
+ </li>
216
+
217
+ <li class="covered" data-hits="1" data-linenumber="15">
218
+ <span class="hits">1</span>
219
+
220
+ <code class="ruby">require_relative &#39;hash_params/yaml_params&#39;</code>
221
+ </li>
222
+
223
+ <li class="covered" data-hits="1" data-linenumber="16">
224
+ <span class="hits">1</span>
225
+
226
+ <code class="ruby">require &#39;pry&#39; if HashParams::ENVIRONMENT == &#39;development&#39;</code>
227
+ </li>
228
+
229
+ <li class="never" data-hits="" data-linenumber="17">
230
+
231
+
232
+ <code class="ruby"></code>
233
+ </li>
234
+
235
+ <li class="never" data-hits="" data-linenumber="18">
236
+
237
+
238
+ <code class="ruby"></code>
239
+ </li>
240
+
241
+ <li class="never" data-hits="" data-linenumber="19">
242
+
243
+
244
+ <code class="ruby"></code>
245
+ </li>
246
+
247
+ <li class="never" data-hits="" data-linenumber="20">
248
+
249
+
250
+ <code class="ruby"></code>
251
+ </li>
252
+
253
+ <li class="never" data-hits="" data-linenumber="21">
254
+
255
+
256
+ <code class="ruby"></code>
257
+ </li>
258
+
259
+ </ol>
260
+ </pre>
261
+ </div>
262
+
263
+ <div class="source_table" id="b1c546b2a036367cd6714d1a3d80305afff21484">
264
+ <div class="header">
265
+ <h3>lib/hash_params/binding_validator.rb</h3>
266
+ <h4><span class="green">92.86 %</span> covered</h4>
267
+ <div>
268
+ <b>14</b> relevant lines.
269
+ <span class="green"><b>13</b> lines covered</span> and
270
+ <span class="red"><b>1</b> lines missed.</span>
271
+ </div>
272
+ </div>
273
+
274
+ <pre>
275
+ <ol>
276
+
277
+ <li class="covered" data-hits="1" data-linenumber="1">
278
+ <span class="hits">1</span>
279
+
280
+ <code class="ruby">module HashParams</code>
281
+ </li>
282
+
283
+ <li class="covered" data-hits="1" data-linenumber="2">
284
+ <span class="hits">1</span>
285
+
286
+ <code class="ruby"> class BindingValidator</code>
287
+ </li>
288
+
289
+ <li class="never" data-hits="" data-linenumber="3">
290
+
291
+
292
+ <code class="ruby"></code>
293
+ </li>
294
+
295
+ <li class="covered" data-hits="1" data-linenumber="4">
296
+ <span class="hits">1</span>
297
+
298
+ <code class="ruby"> def with_binding (&amp;code)</code>
299
+ </li>
300
+
117
301
  <li class="covered" data-hits="1" data-linenumber="5">
118
302
  <span class="hits">1</span>
119
303
 
120
- <code class="ruby"> def initialize(opts={}, injection_target =nil, &amp;code)</code>
304
+ <code class="ruby"> @binding = code.binding</code>
121
305
  </li>
122
306
 
123
- <li class="covered" data-hits="2" data-linenumber="6">
124
- <span class="hits">2</span>
307
+ <li class="covered" data-hits="1" data-linenumber="6">
308
+ <span class="hits">1</span>
125
309
 
126
- <code class="ruby"> @incoming_hash = opts</code>
310
+ <code class="ruby"> instance_eval(&amp;code)</code>
127
311
  </li>
128
312
 
129
- <li class="covered" data-hits="2" data-linenumber="7">
130
- <span class="hits">2</span>
313
+ <li class="never" data-hits="" data-linenumber="7">
314
+
131
315
 
132
- <code class="ruby"> @errors =[]</code>
316
+ <code class="ruby"> end</code>
133
317
  </li>
134
318
 
135
319
  <li class="never" data-hits="" data-linenumber="8">
136
320
 
137
321
 
138
- <code class="ruby"> # @parent = code.binding.eval &#39;self&#39;</code>
322
+ <code class="ruby"></code>
323
+ </li>
324
+
325
+ <li class="never" data-hits="" data-linenumber="9">
326
+
327
+
328
+ <code class="ruby"></code>
139
329
  </li>
140
330
 
141
- <li class="covered" data-hits="2" data-linenumber="9">
142
- <span class="hits">2</span>
331
+ <li class="covered" data-hits="1" data-linenumber="10">
332
+ <span class="hits">1</span>
143
333
 
144
- <code class="ruby"> @target =injection_target</code>
334
+ <code class="ruby"> def var(var_name, type, opts={})</code>
145
335
  </li>
146
336
 
147
- <li class="covered" data-hits="2" data-linenumber="10">
148
- <span class="hits">2</span>
337
+ <li class="covered" data-hits="4" data-linenumber="11">
338
+ <span class="hits">4</span>
149
339
 
150
- <code class="ruby"> instance_eval(&amp;code)</code>
340
+ <code class="ruby"> raise &#39;Variable name must be a string or symbol&#39; unless (var_name.is_a?(String) || var_name.is_a?(Symbol))</code>
151
341
  </li>
152
342
 
153
- <li class="covered" data-hits="2" data-linenumber="11">
154
- <span class="hits">2</span>
343
+ <li class="covered" data-hits="4" data-linenumber="12">
344
+ <span class="hits">4</span>
155
345
 
156
- <code class="ruby"> @valid = (@errors.size == 0)</code>
346
+ <code class="ruby"> value = @binding.local_variable_get var_name</code>
157
347
  </li>
158
348
 
159
- <li class="never" data-hits="" data-linenumber="12">
349
+ <li class="covered" data-hits="4" data-linenumber="13">
350
+ <span class="hits">4</span>
351
+
352
+ <code class="ruby"> new_value = if value.is_a?(Hash)</code>
353
+ </li>
354
+
355
+ <li class="covered" data-hits="1" data-linenumber="14">
356
+ <span class="hits">1</span>
357
+
358
+ <code class="ruby"> if block_given?</code>
359
+ </li>
360
+
361
+ <li class="never" data-hits="" data-linenumber="15">
362
+
363
+
364
+ <code class="ruby"> #if the param is a hash then the validations are actually options</code>
365
+ </li>
366
+
367
+ <li class="covered" data-hits="1" data-linenumber="16">
368
+ <span class="hits">1</span>
369
+
370
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(value, opts, &amp;Proc.new)</code>
371
+ </li>
372
+
373
+ <li class="never" data-hits="" data-linenumber="17">
374
+
375
+
376
+ <code class="ruby"> else</code>
377
+ </li>
378
+
379
+ <li class="missed" data-hits="0" data-linenumber="18">
380
+
381
+
382
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(value, opts)</code>
383
+ </li>
384
+
385
+ <li class="never" data-hits="" data-linenumber="19">
386
+
387
+
388
+ <code class="ruby"> end</code>
389
+ </li>
390
+
391
+ <li class="never" data-hits="" data-linenumber="20">
392
+
393
+
394
+ <code class="ruby"> else</code>
395
+ </li>
396
+
397
+ <li class="covered" data-hits="3" data-linenumber="21">
398
+ <span class="hits">3</span>
399
+
400
+ <code class="ruby"> HashParams.validate value, type, opts</code>
401
+ </li>
402
+
403
+ <li class="never" data-hits="" data-linenumber="22">
404
+
405
+
406
+ <code class="ruby"> end</code>
407
+ </li>
408
+
409
+ <li class="covered" data-hits="4" data-linenumber="23">
410
+ <span class="hits">4</span>
411
+
412
+ <code class="ruby"> @binding.local_variable_set var_name, new_value</code>
413
+ </li>
414
+
415
+ <li class="never" data-hits="" data-linenumber="24">
416
+
417
+
418
+ <code class="ruby"> end</code>
419
+ </li>
420
+
421
+ <li class="never" data-hits="" data-linenumber="25">
160
422
 
161
423
 
162
424
  <code class="ruby"> end</code>
163
425
  </li>
164
426
 
165
- <li class="never" data-hits="" data-linenumber="13">
427
+ <li class="never" data-hits="" data-linenumber="26">
428
+
429
+
430
+ <code class="ruby">end</code>
431
+ </li>
432
+
433
+ </ol>
434
+ </pre>
435
+ </div>
436
+
437
+ <div class="source_table" id="f3376cb3f02016b662bfae7b7507dfdf1e033e63">
438
+ <div class="header">
439
+ <h3>lib/hash_params/hash_validator.rb</h3>
440
+ <h4><span class="green">97.37 %</span> covered</h4>
441
+ <div>
442
+ <b>38</b> relevant lines.
443
+ <span class="green"><b>37</b> lines covered</span> and
444
+ <span class="red"><b>1</b> lines missed.</span>
445
+ </div>
446
+ </div>
447
+
448
+ <pre>
449
+ <ol>
450
+
451
+ <li class="covered" data-hits="1" data-linenumber="1">
452
+ <span class="hits">1</span>
453
+
454
+ <code class="ruby">module HashParams</code>
455
+ </li>
456
+
457
+ <li class="never" data-hits="" data-linenumber="2">
166
458
 
167
459
 
168
460
  <code class="ruby"></code>
169
461
  </li>
170
462
 
171
- <li class="covered" data-hits="1" data-linenumber="14">
463
+ <li class="never" data-hits="" data-linenumber="3">
464
+
465
+
466
+ <code class="ruby"></code>
467
+ </li>
468
+
469
+ <li class="covered" data-hits="1" data-linenumber="4">
172
470
  <span class="hits">1</span>
173
471
 
174
- <code class="ruby"> def param(key, h = {})</code>
472
+ <code class="ruby"> class HPHash &lt; Hash</code>
473
+ </li>
474
+
475
+ <li class="covered" data-hits="1" data-linenumber="5">
476
+ <span class="hits">1</span>
477
+
478
+ <code class="ruby"> attr_accessor :validation_errors</code>
479
+ </li>
480
+
481
+ <li class="never" data-hits="" data-linenumber="6">
482
+
483
+
484
+ <code class="ruby"></code>
485
+ </li>
486
+
487
+ <li class="covered" data-hits="1" data-linenumber="7">
488
+ <span class="hits">1</span>
489
+
490
+ <code class="ruby"> def initialize(args=nil)</code>
491
+ </li>
492
+
493
+ <li class="covered" data-hits="4" data-linenumber="8">
494
+ <span class="hits">4</span>
495
+
496
+ <code class="ruby"> @validation_errors=[]</code>
497
+ </li>
498
+
499
+ <li class="covered" data-hits="4" data-linenumber="9">
500
+ <span class="hits">4</span>
501
+
502
+ <code class="ruby"> super(args)</code>
503
+ </li>
504
+
505
+ <li class="never" data-hits="" data-linenumber="10">
506
+
507
+
508
+ <code class="ruby"> end</code>
509
+ </li>
510
+
511
+ <li class="never" data-hits="" data-linenumber="11">
512
+
513
+
514
+ <code class="ruby"></code>
515
+ </li>
516
+
517
+ <li class="covered" data-hits="1" data-linenumber="12">
518
+ <span class="hits">1</span>
519
+
520
+ <code class="ruby"> def valid?</code>
521
+ </li>
522
+
523
+ <li class="covered" data-hits="1" data-linenumber="13">
524
+ <span class="hits">1</span>
525
+
526
+ <code class="ruby"> @validation_errors.empty?</code>
527
+ </li>
528
+
529
+ <li class="never" data-hits="" data-linenumber="14">
530
+
531
+
532
+ <code class="ruby"> end</code>
533
+ </li>
534
+
535
+ <li class="never" data-hits="" data-linenumber="15">
536
+
537
+
538
+ <code class="ruby"></code>
539
+ </li>
540
+
541
+ <li class="covered" data-hits="1" data-linenumber="16">
542
+ <span class="hits">1</span>
543
+
544
+ <code class="ruby"> def set_key_value(key, value, symbolize_key, make_method)</code>
545
+ </li>
546
+
547
+ <li class="covered" data-hits="6" data-linenumber="17">
548
+ <span class="hits">6</span>
549
+
550
+ <code class="ruby"> key = key.to_s.to_sym if symbolize_key</code>
551
+ </li>
552
+
553
+ <li class="covered" data-hits="6" data-linenumber="18">
554
+ <span class="hits">6</span>
555
+
556
+ <code class="ruby"> if make_method</code>
557
+ </li>
558
+
559
+ <li class="covered" data-hits="1" data-linenumber="19">
560
+ <span class="hits">1</span>
561
+
562
+ <code class="ruby"> singleton_class.module_eval do</code>
563
+ </li>
564
+
565
+ <li class="covered" data-hits="1" data-linenumber="20">
566
+ <span class="hits">1</span>
567
+
568
+ <code class="ruby"> define_method key.to_s.to_sym do</code>
569
+ </li>
570
+
571
+ <li class="covered" data-hits="1" data-linenumber="21">
572
+ <span class="hits">1</span>
573
+
574
+ <code class="ruby"> value</code>
575
+ </li>
576
+
577
+ <li class="never" data-hits="" data-linenumber="22">
578
+
579
+
580
+ <code class="ruby"> end</code>
581
+ </li>
582
+
583
+ <li class="never" data-hits="" data-linenumber="23">
584
+
585
+
586
+ <code class="ruby"> end</code>
587
+ </li>
588
+
589
+ <li class="never" data-hits="" data-linenumber="24">
590
+
591
+
592
+ <code class="ruby"> end</code>
593
+ </li>
594
+
595
+ <li class="covered" data-hits="6" data-linenumber="25">
596
+ <span class="hits">6</span>
597
+
598
+ <code class="ruby"> self[key]=value</code>
599
+ </li>
600
+
601
+ <li class="never" data-hits="" data-linenumber="26">
602
+
603
+
604
+ <code class="ruby"> end</code>
605
+ </li>
606
+
607
+ <li class="never" data-hits="" data-linenumber="27">
608
+
609
+
610
+ <code class="ruby"> end</code>
611
+ </li>
612
+
613
+ <li class="never" data-hits="" data-linenumber="28">
614
+
615
+
616
+ <code class="ruby"></code>
617
+ </li>
618
+
619
+ <li class="covered" data-hits="1" data-linenumber="29">
620
+ <span class="hits">1</span>
621
+
622
+ <code class="ruby"> class HashValidator</code>
623
+ </li>
624
+
625
+ <li class="never" data-hits="" data-linenumber="30">
626
+
627
+
628
+ <code class="ruby"></code>
629
+ </li>
630
+
631
+ <li class="covered" data-hits="1" data-linenumber="31">
632
+ <span class="hits">1</span>
633
+
634
+ <code class="ruby"> def validate_hash(h, options={})</code>
635
+ </li>
636
+
637
+ <li class="never" data-hits="" data-linenumber="32">
638
+
639
+
640
+ <code class="ruby"> #Hash Validation has to be stateful</code>
641
+ </li>
642
+
643
+ <li class="never" data-hits="" data-linenumber="33">
644
+
645
+
646
+ <code class="ruby"></code>
647
+ </li>
648
+
649
+ <li class="covered" data-hits="4" data-linenumber="34">
650
+ <span class="hits">4</span>
651
+
652
+ <code class="ruby"> @incoming = h</code>
653
+ </li>
654
+
655
+ <li class="covered" data-hits="4" data-linenumber="35">
656
+ <span class="hits">4</span>
657
+
658
+ <code class="ruby"> @outgoing = HPHash.new</code>
659
+ </li>
660
+
661
+ <li class="covered" data-hits="4" data-linenumber="36">
662
+ <span class="hits">4</span>
663
+
664
+ <code class="ruby"> @options = options</code>
665
+ </li>
666
+
667
+ <li class="never" data-hits="" data-linenumber="37">
668
+
669
+
670
+ <code class="ruby"></code>
671
+ </li>
672
+
673
+ <li class="covered" data-hits="4" data-linenumber="38">
674
+ <span class="hits">4</span>
675
+
676
+ <code class="ruby"> if block_given?</code>
677
+ </li>
678
+
679
+ <li class="covered" data-hits="3" data-linenumber="39">
680
+ <span class="hits">3</span>
681
+
682
+ <code class="ruby"> instance_eval(&amp;Proc.new)</code>
683
+ </li>
684
+
685
+ <li class="never" data-hits="" data-linenumber="40">
686
+
687
+
688
+ <code class="ruby"> else</code>
689
+ </li>
690
+
691
+ <li class="never" data-hits="" data-linenumber="41">
692
+
693
+
694
+ <code class="ruby"> #no proc was given this means just pass the hash back as is</code>
695
+ </li>
696
+
697
+ <li class="covered" data-hits="1" data-linenumber="42">
698
+ <span class="hits">1</span>
699
+
700
+ <code class="ruby"> @outgoing = @incoming</code>
701
+ </li>
702
+
703
+ <li class="never" data-hits="" data-linenumber="43">
704
+
705
+
706
+ <code class="ruby"> end</code>
707
+ </li>
708
+
709
+ <li class="covered" data-hits="4" data-linenumber="44">
710
+ <span class="hits">4</span>
711
+
712
+ <code class="ruby"> @outgoing</code>
713
+ </li>
714
+
715
+ <li class="never" data-hits="" data-linenumber="45">
716
+
717
+
718
+ <code class="ruby"> end</code>
719
+ </li>
720
+
721
+ <li class="never" data-hits="" data-linenumber="46">
722
+
723
+
724
+ <code class="ruby"></code>
725
+ </li>
726
+
727
+ <li class="covered" data-hits="1" data-linenumber="47">
728
+ <span class="hits">1</span>
729
+
730
+ <code class="ruby"> def key(hash_key, type, opts={})</code>
731
+ </li>
732
+
733
+ <li class="covered" data-hits="7" data-linenumber="48">
734
+ <span class="hits">7</span>
735
+
736
+ <code class="ruby"> value = @incoming[hash_key] || @incoming[hash_key.to_s]</code>
737
+ </li>
738
+
739
+ <li class="never" data-hits="" data-linenumber="49">
740
+
741
+
742
+ <code class="ruby"> # if a block is given to the param then it&#39;s a recursive call</code>
743
+ </li>
744
+
745
+ <li class="never" data-hits="" data-linenumber="50">
746
+
747
+
748
+ <code class="ruby"> # recursive calls can only be done with a hash</code>
749
+ </li>
750
+
751
+ <li class="covered" data-hits="7" data-linenumber="51">
752
+ <span class="hits">7</span>
753
+
754
+ <code class="ruby"> new_value = if value.is_a?(Hash)</code>
755
+ </li>
756
+
757
+ <li class="covered" data-hits="1" data-linenumber="52">
758
+ <span class="hits">1</span>
759
+
760
+ <code class="ruby"> if block_given?</code>
761
+ </li>
762
+
763
+ <li class="never" data-hits="" data-linenumber="53">
764
+
765
+
766
+ <code class="ruby"> #if the param is a hash then the validations are actually options</code>
767
+ </li>
768
+
769
+ <li class="covered" data-hits="1" data-linenumber="54">
770
+ <span class="hits">1</span>
771
+
772
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(value, @options, &amp;Proc.new)</code>
773
+ </li>
774
+
775
+ <li class="never" data-hits="" data-linenumber="55">
776
+
777
+
778
+ <code class="ruby"> else</code>
779
+ </li>
780
+
781
+ <li class="missed" data-hits="0" data-linenumber="56">
782
+
783
+
784
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(value, opts)</code>
785
+ </li>
786
+
787
+ <li class="never" data-hits="" data-linenumber="57">
788
+
789
+
790
+ <code class="ruby"> end</code>
791
+ </li>
792
+
793
+ <li class="never" data-hits="" data-linenumber="58">
794
+
795
+
796
+ <code class="ruby"> else</code>
797
+ </li>
798
+
799
+ <li class="covered" data-hits="6" data-linenumber="59">
800
+ <span class="hits">6</span>
801
+
802
+ <code class="ruby"> HashParams.validate value, type, opts</code>
803
+ </li>
804
+
805
+ <li class="never" data-hits="" data-linenumber="60">
806
+
807
+
808
+ <code class="ruby"> end</code>
809
+ </li>
810
+
811
+ <li class="covered" data-hits="6" data-linenumber="61">
812
+ <span class="hits">6</span>
813
+
814
+ <code class="ruby"> hash_key = opts[:as] if opts[:as]</code>
815
+ </li>
816
+
817
+ <li class="covered" data-hits="6" data-linenumber="62">
818
+ <span class="hits">6</span>
819
+
820
+ <code class="ruby"> @outgoing.set_key_value(hash_key, new_value, @options[:symbolize_keys], @options[:make_methods])</code>
821
+ </li>
822
+
823
+ <li class="covered" data-hits="6" data-linenumber="63">
824
+ <span class="hits">6</span>
825
+
826
+ <code class="ruby"> new_value</code>
827
+ </li>
828
+
829
+ <li class="never" data-hits="" data-linenumber="64">
830
+
831
+
832
+ <code class="ruby"> rescue =&gt; e</code>
833
+ </li>
834
+
835
+ <li class="covered" data-hits="1" data-linenumber="65">
836
+ <span class="hits">1</span>
837
+
838
+ <code class="ruby"> @outgoing.validation_errors &lt;&lt; &quot;Error processing key &#39;#{hash_key}&#39;: #{e}&quot; # [e.to_s, e.backtrace].join(&quot;\n&quot;)</code>
839
+ </li>
840
+
841
+ <li class="covered" data-hits="1" data-linenumber="66">
842
+ <span class="hits">1</span>
843
+
844
+ <code class="ruby"> raise e if @options[:raise_errors]</code>
845
+ </li>
846
+
847
+ <li class="covered" data-hits="1" data-linenumber="67">
848
+ <span class="hits">1</span>
849
+
850
+ <code class="ruby"> nil</code>
851
+ </li>
852
+
853
+ <li class="never" data-hits="" data-linenumber="68">
854
+
855
+
856
+ <code class="ruby"> end</code>
857
+ </li>
858
+
859
+ <li class="covered" data-hits="1" data-linenumber="69">
860
+ <span class="hits">1</span>
861
+
862
+ <code class="ruby"> alias_method :param, :key</code>
863
+ </li>
864
+
865
+ <li class="never" data-hits="" data-linenumber="70">
866
+
867
+
868
+ <code class="ruby"> end</code>
869
+ </li>
870
+
871
+ <li class="never" data-hits="" data-linenumber="71">
872
+
873
+
874
+ <code class="ruby">end</code>
875
+ </li>
876
+
877
+ </ol>
878
+ </pre>
879
+ </div>
880
+
881
+ <div class="source_table" id="f39507e800e8d660c679f1092f4a3b699ac789cb">
882
+ <div class="header">
883
+ <h3>lib/hash_params/validator.rb</h3>
884
+ <h4><span class="green">94.74 %</span> covered</h4>
885
+ <div>
886
+ <b>57</b> relevant lines.
887
+ <span class="green"><b>54</b> lines covered</span> and
888
+ <span class="red"><b>3</b> lines missed.</span>
889
+ </div>
890
+ </div>
891
+
892
+ <pre>
893
+ <ol>
894
+
895
+ <li class="covered" data-hits="1" data-linenumber="1">
896
+ <span class="hits">1</span>
897
+
898
+ <code class="ruby">module HashParams</code>
899
+ </li>
900
+
901
+ <li class="covered" data-hits="1" data-linenumber="2">
902
+ <span class="hits">1</span>
903
+
904
+ <code class="ruby"> module Validator</code>
905
+ </li>
906
+
907
+ <li class="never" data-hits="" data-linenumber="3">
908
+
909
+
910
+ <code class="ruby"></code>
911
+ </li>
912
+
913
+ <li class="covered" data-hits="1" data-linenumber="4">
914
+ <span class="hits">1</span>
915
+
916
+ <code class="ruby"> class ValidationError &lt; StandardError</code>
917
+ </li>
918
+
919
+ <li class="never" data-hits="" data-linenumber="5">
920
+
921
+
922
+ <code class="ruby"> end</code>
923
+ </li>
924
+
925
+ <li class="never" data-hits="" data-linenumber="6">
926
+
927
+
928
+ <code class="ruby"></code>
929
+ </li>
930
+
931
+ <li class="covered" data-hits="1" data-linenumber="7">
932
+ <span class="hits">1</span>
933
+
934
+ <code class="ruby"> class CoercionError &lt; StandardError</code>
935
+ </li>
936
+
937
+ <li class="never" data-hits="" data-linenumber="8">
938
+
939
+
940
+ <code class="ruby"> end</code>
941
+ </li>
942
+
943
+ <li class="never" data-hits="" data-linenumber="9">
944
+
945
+
946
+ <code class="ruby"></code>
947
+ </li>
948
+
949
+ <li class="covered" data-hits="1" data-linenumber="10">
950
+ <span class="hits">1</span>
951
+
952
+ <code class="ruby"> def with_binding(&amp;code)</code>
953
+ </li>
954
+
955
+ <li class="covered" data-hits="1" data-linenumber="11">
956
+ <span class="hits">1</span>
957
+
958
+ <code class="ruby"> BindingValidator.new.with_binding(&amp;code)</code>
959
+ </li>
960
+
961
+ <li class="never" data-hits="" data-linenumber="12">
962
+
963
+
964
+ <code class="ruby"> end</code>
965
+ </li>
966
+
967
+ <li class="never" data-hits="" data-linenumber="13">
968
+
969
+
970
+ <code class="ruby"></code>
971
+ </li>
972
+
973
+ <li class="covered" data-hits="1" data-linenumber="14">
974
+ <span class="hits">1</span>
975
+
976
+ <code class="ruby"> def validate(param, type, validations={})</code>
977
+ </li>
978
+
979
+ <li class="never" data-hits="" data-linenumber="15">
980
+
981
+
982
+ <code class="ruby"></code>
983
+ </li>
984
+
985
+ <li class="covered" data-hits="30" data-linenumber="16">
986
+ <span class="hits">30</span>
987
+
988
+ <code class="ruby"> coercions = Array(validations[:coerce]) &lt;&lt; type</code>
989
+ </li>
990
+
991
+ <li class="never" data-hits="" data-linenumber="17">
992
+
993
+
994
+ <code class="ruby"></code>
995
+ </li>
996
+
997
+ <li class="covered" data-hits="30" data-linenumber="18">
998
+ <span class="hits">30</span>
999
+
1000
+ <code class="ruby"> if param.nil? &amp;&amp; validations[:default]</code>
1001
+ </li>
1002
+
1003
+ <li class="covered" data-hits="5" data-linenumber="19">
1004
+ <span class="hits">5</span>
1005
+
1006
+ <code class="ruby"> param = validations[:default].respond_to?(:call) ? validations[:default].call() : validations[:default]</code>
1007
+ </li>
1008
+
1009
+ <li class="never" data-hits="" data-linenumber="20">
1010
+
1011
+
1012
+ <code class="ruby"> end</code>
1013
+ </li>
1014
+
1015
+ <li class="never" data-hits="" data-linenumber="21">
1016
+
1017
+
1018
+ <code class="ruby"></code>
1019
+ </li>
1020
+
1021
+ <li class="never" data-hits="" data-linenumber="22">
1022
+
1023
+
1024
+ <code class="ruby"> #if there is a :validate lambda run that too</code>
1025
+ </li>
1026
+
1027
+ <li class="covered" data-hits="30" data-linenumber="23">
1028
+ <span class="hits">30</span>
1029
+
1030
+ <code class="ruby"> if validations[:validate] &amp;&amp; validations[:validate].respond_to?(:call)</code>
1031
+ </li>
1032
+
1033
+ <li class="covered" data-hits="2" data-linenumber="24">
1034
+ <span class="hits">2</span>
1035
+
1036
+ <code class="ruby"> param = validations.delete(:validate).call(param)</code>
1037
+ </li>
1038
+
1039
+ <li class="never" data-hits="" data-linenumber="25">
1040
+
1041
+
1042
+ <code class="ruby"> end</code>
1043
+ </li>
1044
+
1045
+ <li class="never" data-hits="" data-linenumber="26">
1046
+
1047
+
1048
+ <code class="ruby"></code>
1049
+ </li>
1050
+
1051
+ <li class="covered" data-hits="30" data-linenumber="27">
1052
+ <span class="hits">30</span>
1053
+
1054
+ <code class="ruby"> if block_given? &amp;&amp; !param.is_a?(Hash)</code>
1055
+ </li>
1056
+
1057
+ <li class="covered" data-hits="1" data-linenumber="28">
1058
+ <span class="hits">1</span>
1059
+
1060
+ <code class="ruby"> param = yield(param, validations)</code>
1061
+ </li>
1062
+
1063
+ <li class="never" data-hits="" data-linenumber="29">
1064
+
1065
+
1066
+ <code class="ruby"> end</code>
1067
+ </li>
1068
+
1069
+ <li class="never" data-hits="" data-linenumber="30">
1070
+
1071
+
1072
+ <code class="ruby"></code>
1073
+ </li>
1074
+
1075
+ <li class="never" data-hits="" data-linenumber="31">
1076
+
1077
+
1078
+ <code class="ruby"> # do all coercion and transformation first there could be an array of coersions they will be run in order</code>
1079
+ </li>
1080
+
1081
+ <li class="covered" data-hits="30" data-linenumber="32">
1082
+ <span class="hits">30</span>
1083
+
1084
+ <code class="ruby"> coercions.each do |c|</code>
1085
+ </li>
1086
+
1087
+ <li class="covered" data-hits="32" data-linenumber="33">
1088
+ <span class="hits">32</span>
1089
+
1090
+ <code class="ruby"> param = coerce(param, c, validations)</code>
1091
+ </li>
1092
+
1093
+ <li class="never" data-hits="" data-linenumber="34">
1094
+
1095
+
1096
+ <code class="ruby"> end</code>
1097
+ </li>
1098
+
1099
+ <li class="never" data-hits="" data-linenumber="35">
1100
+
1101
+
1102
+ <code class="ruby"></code>
1103
+ </li>
1104
+
1105
+ <li class="covered" data-hits="30" data-linenumber="36">
1106
+ <span class="hits">30</span>
1107
+
1108
+ <code class="ruby"> if param.is_a?(Hash)</code>
1109
+ </li>
1110
+
1111
+ <li class="covered" data-hits="2" data-linenumber="37">
1112
+ <span class="hits">2</span>
1113
+
1114
+ <code class="ruby"> param = if block_given?</code>
1115
+ </li>
1116
+
1117
+ <li class="covered" data-hits="1" data-linenumber="38">
1118
+ <span class="hits">1</span>
1119
+
1120
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(param, validations, &amp;Proc.new)</code>
1121
+ </li>
1122
+
1123
+ <li class="never" data-hits="" data-linenumber="39">
1124
+
1125
+
1126
+ <code class="ruby"> else</code>
1127
+ </li>
1128
+
1129
+ <li class="covered" data-hits="1" data-linenumber="40">
1130
+ <span class="hits">1</span>
1131
+
1132
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(param, validations)</code>
1133
+ </li>
1134
+
1135
+ <li class="never" data-hits="" data-linenumber="41">
1136
+
1137
+
1138
+ <code class="ruby"> end</code>
1139
+ </li>
1140
+
1141
+ <li class="never" data-hits="" data-linenumber="42">
1142
+
1143
+
1144
+ <code class="ruby"> end</code>
1145
+ </li>
1146
+
1147
+ <li class="never" data-hits="" data-linenumber="43">
1148
+
1149
+
1150
+ <code class="ruby"></code>
1151
+ </li>
1152
+
1153
+ <li class="never" data-hits="" data-linenumber="44">
1154
+
1155
+
1156
+ <code class="ruby"> #don&#39;t bother with the rest if required parameter is missing</code>
1157
+ </li>
1158
+
1159
+ <li class="covered" data-hits="30" data-linenumber="45">
1160
+ <span class="hits">30</span>
1161
+
1162
+ <code class="ruby"> if validations[:required] &amp;&amp; param.nil?</code>
1163
+ </li>
1164
+
1165
+ <li class="covered" data-hits="2" data-linenumber="46">
1166
+ <span class="hits">2</span>
1167
+
1168
+ <code class="ruby"> raise ValidationError.new(&#39;Required Parameter missing and has no default specified&#39;)</code>
1169
+ </li>
1170
+
1171
+ <li class="never" data-hits="" data-linenumber="47">
1172
+
1173
+
1174
+ <code class="ruby"> end</code>
1175
+ </li>
1176
+
1177
+ <li class="never" data-hits="" data-linenumber="48">
1178
+
1179
+
1180
+ <code class="ruby"></code>
1181
+ </li>
1182
+
1183
+ <li class="covered" data-hits="28" data-linenumber="49">
1184
+ <span class="hits">28</span>
1185
+
1186
+ <code class="ruby"> error = nil</code>
1187
+ </li>
1188
+
1189
+ <li class="covered" data-hits="28" data-linenumber="50">
1190
+ <span class="hits">28</span>
1191
+
1192
+ <code class="ruby"> validations.each do |key, value|</code>
1193
+ </li>
1194
+
1195
+ <li class="covered" data-hits="23" data-linenumber="51">
1196
+ <span class="hits">23</span>
1197
+
1198
+ <code class="ruby"> error = case key</code>
1199
+ </li>
1200
+
1201
+ <li class="never" data-hits="" data-linenumber="52">
1202
+
1203
+
1204
+ <code class="ruby"> when :blank</code>
1205
+ </li>
1206
+
1207
+ <li class="missed" data-hits="0" data-linenumber="53">
1208
+
1209
+
1210
+ <code class="ruby"> &#39;Parameter cannot be blank&#39; if !value &amp;&amp; (param.nil? || (param.respond_to?(:empty) &amp;&amp; param.empty)) #)!value &amp;&amp; blank?(value)</code>
1211
+ </li>
1212
+
1213
+ <li class="never" data-hits="" data-linenumber="54">
1214
+
1215
+
1216
+ <code class="ruby"> when :format</code>
1217
+ </li>
1218
+
1219
+ <li class="covered" data-hits="2" data-linenumber="55">
1220
+ <span class="hits">2</span>
1221
+
1222
+ <code class="ruby"> &quot;#{param} must be a string if using the format validation&quot; &amp;&amp; next unless param.kind_of?(String)</code>
1223
+ </li>
1224
+
1225
+ <li class="covered" data-hits="2" data-linenumber="56">
1226
+ <span class="hits">2</span>
1227
+
1228
+ <code class="ruby"> &quot;#{param} must match format #{value}&quot; unless param =~ value</code>
1229
+ </li>
1230
+
1231
+ <li class="never" data-hits="" data-linenumber="57">
1232
+
1233
+
1234
+ <code class="ruby"> when :is</code>
1235
+ </li>
1236
+
1237
+ <li class="covered" data-hits="1" data-linenumber="58">
1238
+ <span class="hits">1</span>
1239
+
1240
+ <code class="ruby"> &quot;#{param} must be #{value}&quot; unless param === value</code>
1241
+ </li>
1242
+
1243
+ <li class="never" data-hits="" data-linenumber="59">
1244
+
1245
+
1246
+ <code class="ruby"> when :in, :within, :range</code>
1247
+ </li>
1248
+
1249
+ <li class="covered" data-hits="1" data-linenumber="60">
1250
+ <span class="hits">1</span>
1251
+
1252
+ <code class="ruby"> &quot;#{param} must be within #{value}&quot; unless value.respond_to?(:include) ? value.include?(param) : Array(value).include?(param)</code>
1253
+ </li>
1254
+
1255
+ <li class="never" data-hits="" data-linenumber="61">
1256
+
1257
+
1258
+ <code class="ruby"> when :min</code>
1259
+ </li>
1260
+
1261
+ <li class="covered" data-hits="2" data-linenumber="62">
1262
+ <span class="hits">2</span>
1263
+
1264
+ <code class="ruby"> &quot;#{param} cannot be less than #{value}&quot; unless value &lt;= param</code>
1265
+ </li>
1266
+
1267
+ <li class="never" data-hits="" data-linenumber="63">
1268
+
1269
+
1270
+ <code class="ruby"> when :max</code>
1271
+ </li>
1272
+
1273
+ <li class="covered" data-hits="2" data-linenumber="64">
1274
+ <span class="hits">2</span>
1275
+
1276
+ <code class="ruby"> &quot;#{param} cannot be greater than #{value}&quot; unless value &gt;= param</code>
1277
+ </li>
1278
+
1279
+ <li class="never" data-hits="" data-linenumber="65">
1280
+
1281
+
1282
+ <code class="ruby"> when :min_length</code>
1283
+ </li>
1284
+
1285
+ <li class="covered" data-hits="2" data-linenumber="66">
1286
+ <span class="hits">2</span>
1287
+
1288
+ <code class="ruby"> &quot;#{param} cannot have length less than #{value}&quot; unless value &lt;= param.length</code>
1289
+ </li>
1290
+
1291
+ <li class="never" data-hits="" data-linenumber="67">
1292
+
1293
+
1294
+ <code class="ruby"> when :max_length</code>
1295
+ </li>
1296
+
1297
+ <li class="covered" data-hits="2" data-linenumber="68">
1298
+ <span class="hits">2</span>
1299
+
1300
+ <code class="ruby"> &quot;#{param} cannot have length greater than #{value}&quot; unless value &gt;= param.length</code>
1301
+ </li>
1302
+
1303
+ <li class="never" data-hits="" data-linenumber="69">
1304
+
1305
+
1306
+ <code class="ruby"> else</code>
1307
+ </li>
1308
+
1309
+ <li class="covered" data-hits="11" data-linenumber="70">
1310
+ <span class="hits">11</span>
1311
+
1312
+ <code class="ruby"> nil</code>
1313
+ </li>
1314
+
1315
+ <li class="never" data-hits="" data-linenumber="71">
1316
+
1317
+
1318
+ <code class="ruby"> end</code>
1319
+ </li>
1320
+
1321
+ <li class="never" data-hits="" data-linenumber="72">
1322
+
1323
+
1324
+ <code class="ruby"> end</code>
1325
+ </li>
1326
+
1327
+ <li class="never" data-hits="" data-linenumber="73">
1328
+
1329
+
1330
+ <code class="ruby"></code>
1331
+ </li>
1332
+
1333
+ <li class="covered" data-hits="28" data-linenumber="74">
1334
+ <span class="hits">28</span>
1335
+
1336
+ <code class="ruby"> raise ValidationError.new(error) if error</code>
1337
+ </li>
1338
+
1339
+ <li class="covered" data-hits="28" data-linenumber="75">
1340
+ <span class="hits">28</span>
1341
+
1342
+ <code class="ruby"> param</code>
1343
+ </li>
1344
+
1345
+ <li class="never" data-hits="" data-linenumber="76">
1346
+
1347
+
1348
+ <code class="ruby"> end</code>
1349
+ </li>
1350
+
1351
+ <li class="never" data-hits="" data-linenumber="77">
1352
+
1353
+
1354
+ <code class="ruby"></code>
1355
+ </li>
1356
+
1357
+ <li class="covered" data-hits="1" data-linenumber="78">
1358
+ <span class="hits">1</span>
1359
+
1360
+ <code class="ruby"> private</code>
1361
+ </li>
1362
+
1363
+ <li class="never" data-hits="" data-linenumber="79">
1364
+
1365
+
1366
+ <code class="ruby"></code>
1367
+ </li>
1368
+
1369
+ <li class="covered" data-hits="1" data-linenumber="80">
1370
+ <span class="hits">1</span>
1371
+
1372
+ <code class="ruby"> def coerce(val, type, opts={})</code>
1373
+ </li>
1374
+
1375
+ <li class="never" data-hits="" data-linenumber="81">
1376
+
1377
+
1378
+ <code class="ruby"></code>
1379
+ </li>
1380
+
1381
+ <li class="never" data-hits="" data-linenumber="82">
1382
+
1383
+
1384
+ <code class="ruby"> # exceptions bubble up</code>
1385
+ </li>
1386
+
1387
+ <li class="never" data-hits="" data-linenumber="83">
1388
+
1389
+
1390
+ <code class="ruby"> #order is important</code>
1391
+ </li>
1392
+
1393
+ <li class="never" data-hits="" data-linenumber="84">
1394
+
1395
+
1396
+ <code class="ruby"></code>
1397
+ </li>
1398
+
1399
+ <li class="never" data-hits="" data-linenumber="85">
1400
+
1401
+
1402
+ <code class="ruby"> #if type is nil just return the object</code>
1403
+ </li>
1404
+
1405
+ <li class="covered" data-hits="32" data-linenumber="86">
1406
+ <span class="hits">32</span>
1407
+
1408
+ <code class="ruby"> return val if type.nil?</code>
175
1409
  </li>
176
1410
 
177
- <li class="never" data-hits="" data-linenumber="15">
1411
+ <li class="never" data-hits="" data-linenumber="87">
178
1412
 
179
1413
 
180
1414
  <code class="ruby"></code>
181
1415
  </li>
182
1416
 
183
- <li class="never" data-hits="" data-linenumber="16">
1417
+ <li class="never" data-hits="" data-linenumber="88">
184
1418
 
185
1419
 
186
- <code class="ruby"> #What happens if value is FalseClass ? Need something a little better</code>
1420
+ <code class="ruby"> #two special types of transforms</code>
187
1421
  </li>
188
1422
 
189
- <li class="never" data-hits="" data-linenumber="17">
1423
+ <li class="never" data-hits="" data-linenumber="89">
190
1424
 
191
1425
 
192
- <code class="ruby"></code>
1426
+ <code class="ruby"> #There is no Boolean type so we handle them special</code>
193
1427
  </li>
194
1428
 
195
- <li class="covered" data-hits="15" data-linenumber="18">
196
- <span class="hits">15</span>
1429
+ <li class="covered" data-hits="30" data-linenumber="90">
1430
+ <span class="hits">30</span>
197
1431
 
198
- <code class="ruby"> val = @incoming_hash[key] || @incoming_hash[key.to_sym] || @incoming_hash[key.to_s]</code>
1432
+ <code class="ruby"> if type.to_s == &#39;boolean&#39;</code>
199
1433
  </li>
200
1434
 
201
- <li class="covered" data-hits="15" data-linenumber="19">
202
- <span class="hits">15</span>
1435
+ <li class="covered" data-hits="11" data-linenumber="91">
1436
+ <span class="hits">11</span>
203
1437
 
204
- <code class="ruby"> if val.nil? &amp;&amp; h[:default]</code>
1438
+ <code class="ruby"> return val if (val == true || val == false)</code>
205
1439
  </li>
206
1440
 
207
- <li class="covered" data-hits="3" data-linenumber="20">
208
- <span class="hits">3</span>
1441
+ <li class="covered" data-hits="10" data-linenumber="92">
1442
+ <span class="hits">10</span>
209
1443
 
210
- <code class="ruby"> val = h[:default].respond_to?(:call) ? h[:default].call(self) : h[:default]</code>
1444
+ <code class="ruby"> return false if /(false|f|no|n|0)$/i === val.to_s.downcase</code>
211
1445
  </li>
212
1446
 
213
- <li class="never" data-hits="" data-linenumber="21">
214
-
1447
+ <li class="covered" data-hits="5" data-linenumber="93">
1448
+ <span class="hits">5</span>
215
1449
 
216
- <code class="ruby"> end</code>
1450
+ <code class="ruby"> return true if /(true|t|yes|y|1)$/i === val.to_s.downcase</code>
217
1451
  </li>
218
1452
 
219
- <li class="never" data-hits="" data-linenumber="22">
1453
+ <li class="never" data-hits="" data-linenumber="94">
220
1454
 
221
1455
 
222
1456
  <code class="ruby"></code>
223
1457
  </li>
224
1458
 
225
- <li class="never" data-hits="" data-linenumber="23">
1459
+ <li class="never" data-hits="" data-linenumber="95">
226
1460
 
227
1461
 
228
- <code class="ruby"> #don&#39;t bother with the rest if required parameter is missing</code>
1462
+ <code class="ruby"> # if we can&#39;t parse we return a nil</code>
229
1463
  </li>
230
1464
 
231
- <li class="covered" data-hits="15" data-linenumber="24">
232
- <span class="hits">15</span>
1465
+ <li class="never" data-hits="" data-linenumber="96">
233
1466
 
234
- <code class="ruby"> return @errors &lt;&lt; &quot;Parameter #{key} is required and missing&quot; if h[:required] &amp;&amp; val.nil?</code>
1467
+
1468
+ <code class="ruby"> # maybe !!val is a better return?</code>
235
1469
  </li>
236
1470
 
237
- <li class="never" data-hits="" data-linenumber="25">
1471
+ <li class="missed" data-hits="0" data-linenumber="97">
238
1472
 
239
1473
 
240
- <code class="ruby"> #do all coercion and transformation first there could be an array of coersions they will be run in order</code>
1474
+ <code class="ruby"> raise CoercionError.new(&quot;Unable to coerce #{val} to boolean&quot;)</code>
241
1475
  </li>
242
1476
 
243
- <li class="never" data-hits="" data-linenumber="26">
1477
+ <li class="never" data-hits="" data-linenumber="98">
244
1478
 
245
1479
 
246
- <code class="ruby"></code>
1480
+ <code class="ruby"> end</code>
247
1481
  </li>
248
1482
 
249
- <li class="covered" data-hits="14" data-linenumber="27">
250
- <span class="hits">14</span>
1483
+ <li class="never" data-hits="" data-linenumber="99">
251
1484
 
252
- <code class="ruby"> Array(h[:coerce]).each do |c|</code>
253
- </li>
254
-
255
- <li class="covered" data-hits="9" data-linenumber="28">
256
- <span class="hits">9</span>
257
1485
 
258
- <code class="ruby"> val = coerce(val, c, h)</code>
1486
+ <code class="ruby"> #they have given us a coercion which is a string or symbol which is not &quot;boolean&quot;, we are going to cast this into a proc and run it</code>
259
1487
  </li>
260
1488
 
261
- <li class="never" data-hits="" data-linenumber="29">
1489
+ <li class="never" data-hits="" data-linenumber="100">
262
1490
 
263
1491
 
264
- <code class="ruby"> end</code>
1492
+ <code class="ruby"></code>
265
1493
  </li>
266
1494
 
267
- <li class="never" data-hits="" data-linenumber="30">
268
-
1495
+ <li class="covered" data-hits="19" data-linenumber="101">
1496
+ <span class="hits">19</span>
269
1497
 
270
- <code class="ruby"></code>
1498
+ <code class="ruby"> return type.to_proc.call(val) if type.is_a?(Symbol) || type.is_a?(String)</code>
271
1499
  </li>
272
1500
 
273
- <li class="never" data-hits="" data-linenumber="31">
1501
+ <li class="never" data-hits="" data-linenumber="102">
274
1502
 
275
1503
 
276
- <code class="ruby"></code>
1504
+ <code class="ruby"> #could be a proc</code>
277
1505
  </li>
278
1506
 
279
- <li class="never" data-hits="" data-linenumber="32">
1507
+ <li class="never" data-hits="" data-linenumber="103">
280
1508
 
281
1509
 
282
- <code class="ruby"> #coersion could return a nil which won&#39;t validate, it could return a false which will attempt to validate</code>
1510
+ <code class="ruby"></code>
283
1511
  </li>
284
1512
 
285
- <li class="covered" data-hits="14" data-linenumber="33">
286
- <span class="hits">14</span>
1513
+ <li class="covered" data-hits="17" data-linenumber="104">
1514
+ <span class="hits">17</span>
287
1515
 
288
- <code class="ruby"> if validate!(val, h)</code>
1516
+ <code class="ruby"> return type.call(val) if type.respond_to?(:call)</code>
289
1517
  </li>
290
1518
 
291
- <li class="never" data-hits="" data-linenumber="34">
1519
+ <li class="never" data-hits="" data-linenumber="105">
292
1520
 
293
1521
 
294
- <code class="ruby"> #The value is valid add it</code>
1522
+ <code class="ruby"> #nothing but simple types left</code>
295
1523
  </li>
296
1524
 
297
- <li class="covered" data-hits="13" data-linenumber="35">
298
- <span class="hits">13</span>
1525
+ <li class="covered" data-hits="16" data-linenumber="106">
1526
+ <span class="hits">16</span>
299
1527
 
300
- <code class="ruby"> var_name = h[:as] ? h[:as] : key</code>
1528
+ <code class="ruby"> return val if val.is_a?(type)</code>
301
1529
  </li>
302
1530
 
303
- <li class="covered" data-hits="13" data-linenumber="36">
304
- <span class="hits">13</span>
1531
+ <li class="covered" data-hits="5" data-linenumber="107">
1532
+ <span class="hits">5</span>
305
1533
 
306
- <code class="ruby"> self[var_name]=val</code>
1534
+ <code class="ruby"> return Integer(val) if type == Integer</code>
307
1535
  </li>
308
1536
 
309
- <li class="covered" data-hits="13" data-linenumber="37">
310
- <span class="hits">13</span>
1537
+ <li class="covered" data-hits="4" data-linenumber="108">
1538
+ <span class="hits">4</span>
311
1539
 
312
- <code class="ruby"> inject_into_target(@target, var_name, val)</code>
1540
+ <code class="ruby"> return Float(val) if type == Float</code>
313
1541
  </li>
314
1542
 
315
- <li class="never" data-hits="" data-linenumber="38">
316
-
1543
+ <li class="covered" data-hits="3" data-linenumber="109">
1544
+ <span class="hits">3</span>
317
1545
 
318
- <code class="ruby"> end</code>
1546
+ <code class="ruby"> return String(val) if type == String</code>
319
1547
  </li>
320
1548
 
321
- <li class="covered" data-hits="14" data-linenumber="39">
322
- <span class="hits">14</span>
1549
+ <li class="covered" data-hits="2" data-linenumber="110">
1550
+ <span class="hits">2</span>
323
1551
 
324
- <code class="ruby"> val</code>
1552
+ <code class="ruby"> return Date.parse(val) if type == Date</code>
325
1553
  </li>
326
1554
 
327
- <li class="never" data-hits="" data-linenumber="40">
328
-
1555
+ <li class="covered" data-hits="2" data-linenumber="111">
1556
+ <span class="hits">2</span>
329
1557
 
330
- <code class="ruby"> rescue =&gt; e</code>
1558
+ <code class="ruby"> return Time.parse(val) if type == Time</code>
331
1559
  </li>
332
1560
 
333
- <li class="missed" data-hits="0" data-linenumber="41">
334
-
1561
+ <li class="covered" data-hits="2" data-linenumber="112">
1562
+ <span class="hits">2</span>
335
1563
 
336
- <code class="ruby"> @errors &lt;&lt; e.to_s</code>
1564
+ <code class="ruby"> return DateTime.parse(val) if type == DateTime</code>
337
1565
  </li>
338
1566
 
339
- <li class="never" data-hits="" data-linenumber="42">
1567
+ <li class="covered" data-hits="2" data-linenumber="113">
1568
+ <span class="hits">2</span>
340
1569
 
1570
+ <code class="ruby"> return Array(val.split(opts[:delimiter] || &#39;,&#39;)) if type == Array</code>
1571
+ </li>
1572
+
1573
+ <li class="covered" data-hits="10" data-linenumber="114">
1574
+ <span class="hits">10</span>
341
1575
 
342
- <code class="ruby"> end</code>
1576
+ <code class="ruby"> return Hash[val.gsub(/[{}]/, &#39;&#39;).gsub(&#39;}&#39;, &#39;&#39;).split(opts[:delimiter] || &#39;,&#39;).map { |c| c.split(opts[:separator] ||&#39;:&#39;).map { |i| i.strip } }] if type == Hash</code>
343
1577
  </li>
344
1578
 
345
- <li class="never" data-hits="" data-linenumber="43">
1579
+ <li class="never" data-hits="" data-linenumber="115">
346
1580
 
347
1581
 
348
1582
  <code class="ruby"></code>
349
1583
  </li>
350
1584
 
351
- <li class="covered" data-hits="1" data-linenumber="44">
352
- <span class="hits">1</span>
1585
+ <li class="missed" data-hits="0" data-linenumber="116">
1586
+
353
1587
 
354
- <code class="ruby"> def inject_into_target(target, var_name, val)</code>
1588
+ <code class="ruby"> raise CoercionError(&quot;Unable to coerce #{val} to #{type}&quot;)</code>
355
1589
  </li>
356
1590
 
357
- <li class="covered" data-hits="13" data-linenumber="45">
358
- <span class="hits">13</span>
1591
+ <li class="never" data-hits="" data-linenumber="117">
1592
+
359
1593
 
360
- <code class="ruby"> if target</code>
1594
+ <code class="ruby"> end</code>
361
1595
  </li>
362
1596
 
363
- <li class="never" data-hits="" data-linenumber="46">
1597
+ <li class="never" data-hits="" data-linenumber="118">
364
1598
 
365
1599
 
366
- <code class="ruby"> #for read write methods</code>
1600
+ <code class="ruby"> end</code>
367
1601
  </li>
368
1602
 
369
- <li class="covered" data-hits="1" data-linenumber="47">
370
- <span class="hits">1</span>
1603
+ <li class="never" data-hits="" data-linenumber="119">
1604
+
371
1605
 
372
- <code class="ruby"> target.singleton_class.class_eval do</code>
1606
+ <code class="ruby">end</code>
373
1607
  </li>
374
1608
 
375
- <li class="covered" data-hits="1" data-linenumber="48">
1609
+ </ol>
1610
+ </pre>
1611
+ </div>
1612
+
1613
+ <div class="source_table" id="abb09c4ec783968d5f7a1a3adac854712f21ee1e">
1614
+ <div class="header">
1615
+ <h3>lib/hash_params/yaml_params.rb</h3>
1616
+ <h4><span class="red">12.5 %</span> covered</h4>
1617
+ <div>
1618
+ <b>40</b> relevant lines.
1619
+ <span class="green"><b>5</b> lines covered</span> and
1620
+ <span class="red"><b>35</b> lines missed.</span>
1621
+ </div>
1622
+ </div>
1623
+
1624
+ <pre>
1625
+ <ol>
1626
+
1627
+ <li class="covered" data-hits="1" data-linenumber="1">
376
1628
  <span class="hits">1</span>
377
1629
 
378
- <code class="ruby"> attr_accessor var_name;</code>
1630
+ <code class="ruby">module YamlParams</code>
379
1631
  </li>
380
1632
 
381
- <li class="never" data-hits="" data-linenumber="49">
1633
+ <li class="never" data-hits="" data-linenumber="2">
382
1634
 
383
1635
 
384
- <code class="ruby"> end</code>
1636
+ <code class="ruby"></code>
385
1637
  </li>
386
1638
 
387
- <li class="covered" data-hits="1" data-linenumber="50">
1639
+ <li class="covered" data-hits="1" data-linenumber="3">
388
1640
  <span class="hits">1</span>
389
1641
 
390
- <code class="ruby"> target.send(&quot;#{var_name}=&quot;, val)</code>
1642
+ <code class="ruby"> ENVIRONMENT = ENV[&#39;YAML_PARAMS_ENV&#39;] || (defined?(HashParams) &amp;&amp; HashParams::ENVIRONMENT) || &#39;development&#39;</code>
391
1643
  </li>
392
1644
 
393
- <li class="never" data-hits="" data-linenumber="51">
1645
+ <li class="never" data-hits="" data-linenumber="4">
394
1646
 
395
1647
 
396
- <code class="ruby"> end</code>
1648
+ <code class="ruby"></code>
397
1649
  </li>
398
1650
 
399
- <li class="never" data-hits="" data-linenumber="52">
400
-
1651
+ <li class="covered" data-hits="1" data-linenumber="5">
1652
+ <span class="hits">1</span>
401
1653
 
402
- <code class="ruby"> end</code>
1654
+ <code class="ruby"> def self.autoconfig(opts={})</code>
403
1655
  </li>
404
1656
 
405
- <li class="never" data-hits="" data-linenumber="53">
1657
+ <li class="never" data-hits="" data-linenumber="6">
406
1658
 
407
1659
 
408
1660
  <code class="ruby"></code>
409
1661
  </li>
410
1662
 
411
- <li class="covered" data-hits="1" data-linenumber="54">
412
- <span class="hits">1</span>
1663
+ <li class="missed" data-hits="0" data-linenumber="7">
413
1664
 
414
- <code class="ruby"> def validate!(param, options ={})</code>
1665
+
1666
+ <code class="ruby"> script_name = File.basename($0)</code>
415
1667
  </li>
416
1668
 
417
- <li class="covered" data-hits="14" data-linenumber="55">
418
- <span class="hits">14</span>
1669
+ <li class="missed" data-hits="0" data-linenumber="8">
1670
+
419
1671
 
420
- <code class="ruby"> return false if param.nil?</code>
1672
+ <code class="ruby"> script_dir = File.dirname($0)</code>
421
1673
  </li>
422
1674
 
423
- <li class="covered" data-hits="14" data-linenumber="56">
424
- <span class="hits">14</span>
1675
+ <li class="missed" data-hits="0" data-linenumber="9">
425
1676
 
426
- <code class="ruby"> is_valid = true</code>
1677
+
1678
+ <code class="ruby"> home_dir = File.expand_path(&#39;~&#39;)</code>
427
1679
  </li>
428
1680
 
429
- <li class="never" data-hits="" data-linenumber="57">
1681
+ <li class="missed" data-hits="0" data-linenumber="10">
430
1682
 
431
1683
 
432
- <code class="ruby"></code>
1684
+ <code class="ruby"> host_name = Socket.gethostname</code>
433
1685
  </li>
434
1686
 
435
- <li class="covered" data-hits="14" data-linenumber="58">
436
- <span class="hits">14</span>
1687
+ <li class="missed" data-hits="0" data-linenumber="11">
1688
+
437
1689
 
438
- <code class="ruby"> options.each do |key, value|</code>
1690
+ <code class="ruby"> special_file_names = opts.delete(:files)</code>
439
1691
  </li>
440
1692
 
441
- <li class="never" data-hits="" data-linenumber="59">
1693
+ <li class="missed" data-hits="0" data-linenumber="12">
442
1694
 
443
1695
 
444
- <code class="ruby"></code>
1696
+ <code class="ruby"> special_file_names = Array(special_file_names &amp;&amp; special_file_names.is_a?(String) &amp;&amp; special_file_names.split(&#39;,&#39;))</code>
445
1697
  </li>
446
1698
 
447
- <li class="covered" data-hits="23" data-linenumber="60">
448
- <span class="hits">23</span>
1699
+ <li class="missed" data-hits="0" data-linenumber="13">
1700
+
449
1701
 
450
- <code class="ruby"> error = case key</code>
1702
+ <code class="ruby"> special_roots = opts.delete(:roots)</code>
451
1703
  </li>
452
1704
 
453
- <li class="never" data-hits="" data-linenumber="61">
1705
+ <li class="missed" data-hits="0" data-linenumber="14">
454
1706
 
455
1707
 
456
- <code class="ruby"> when :validate</code>
1708
+ <code class="ruby"> special_roots = Array(special_roots &amp;&amp; special_roots.is_a?(String) &amp;&amp; special_roots.split(&#39;,&#39;))</code>
457
1709
  </li>
458
1710
 
459
- <li class="covered" data-hits="2" data-linenumber="62">
460
- <span class="hits">2</span>
1711
+ <li class="missed" data-hits="0" data-linenumber="15">
1712
+
461
1713
 
462
- <code class="ruby"> &quot;#{param.to_s} failed validation using proc&quot; if value.respond_to?(:call) &amp;&amp; !value.call(param)</code>
1714
+ <code class="ruby"> app_name = opts.delete(:app_name) || script_name</code>
463
1715
  </li>
464
1716
 
465
- <li class="never" data-hits="" data-linenumber="63">
1717
+ <li class="missed" data-hits="0" data-linenumber="16">
466
1718
 
467
1719
 
468
- <code class="ruby"> when :blank</code>
1720
+ <code class="ruby"> env = opts.delete(:env) || opts.delete(:environment) || ENVIRONMENT</code>
469
1721
  </li>
470
1722
 
471
- <li class="missed" data-hits="0" data-linenumber="64">
1723
+ <li class="missed" data-hits="0" data-linenumber="17">
472
1724
 
473
1725
 
474
- <code class="ruby"> &#39;Parameter cannot be blank&#39; if !value &amp;&amp; blank?(param)</code>
1726
+ <code class="ruby"> generated_hash = {}</code>
475
1727
  </li>
476
1728
 
477
- <li class="never" data-hits="" data-linenumber="65">
1729
+ <li class="missed" data-hits="0" data-linenumber="18">
478
1730
 
479
1731
 
480
- <code class="ruby"> when :format</code>
1732
+ <code class="ruby"> all_file_names = []</code>
481
1733
  </li>
482
1734
 
483
- <li class="covered" data-hits="1" data-linenumber="66">
484
- <span class="hits">1</span>
1735
+ <li class="never" data-hits="" data-linenumber="19">
485
1736
 
486
- <code class="ruby"> &#39;Parameter must be a string if using the format validation&#39; &amp;&amp; next unless param.kind_of?(String)</code>
1737
+
1738
+ <code class="ruby"></code>
487
1739
  </li>
488
1740
 
489
- <li class="covered" data-hits="1" data-linenumber="67">
490
- <span class="hits">1</span>
1741
+ <li class="never" data-hits="" data-linenumber="20">
491
1742
 
492
- <code class="ruby"> &quot;Parameter must match format #{value}&quot; unless param =~ value</code>
1743
+
1744
+ <code class="ruby"></code>
493
1745
  </li>
494
1746
 
495
- <li class="never" data-hits="" data-linenumber="68">
1747
+ <li class="never" data-hits="" data-linenumber="21">
496
1748
 
497
1749
 
498
- <code class="ruby"> when :is</code>
1750
+ <code class="ruby"> #Sequence is important when constructing this list as later files will override the earlier ones</code>
499
1751
  </li>
500
1752
 
501
- <li class="covered" data-hits="1" data-linenumber="69">
502
- <span class="hits">1</span>
1753
+ <li class="missed" data-hits="0" data-linenumber="22">
503
1754
 
504
- <code class="ruby"> &quot;Parameter must be #{value}&quot; unless param === value</code>
1755
+
1756
+ <code class="ruby"> generic_file_names = %W(</code>
505
1757
  </li>
506
1758
 
507
- <li class="never" data-hits="" data-linenumber="70">
1759
+ <li class="never" data-hits="" data-linenumber="23">
508
1760
 
509
1761
 
510
- <code class="ruby"> when :in, :within, :range</code>
1762
+ <code class="ruby"> settings.yml</code>
511
1763
  </li>
512
1764
 
513
- <li class="covered" data-hits="1" data-linenumber="71">
514
- <span class="hits">1</span>
1765
+ <li class="never" data-hits="" data-linenumber="24">
515
1766
 
516
- <code class="ruby"> &quot;Parameter must be within #{value}&quot; unless value.respond_to?(:include) ? value.include?(param) : Array(value).include?(param)</code>
1767
+
1768
+ <code class="ruby"> config.yml</code>
517
1769
  </li>
518
1770
 
519
- <li class="never" data-hits="" data-linenumber="72">
1771
+ <li class="never" data-hits="" data-linenumber="25">
520
1772
 
521
1773
 
522
- <code class="ruby"> when :min</code>
1774
+ <code class="ruby"> default.yml</code>
523
1775
  </li>
524
1776
 
525
- <li class="covered" data-hits="1" data-linenumber="73">
526
- <span class="hits">1</span>
1777
+ <li class="never" data-hits="" data-linenumber="26">
1778
+
527
1779
 
528
- <code class="ruby"> &quot;Parameter cannot be less than #{value}&quot; unless value &lt;= param</code>
1780
+ <code class="ruby"> #{env}.yml</code>
529
1781
  </li>
530
1782
 
531
- <li class="never" data-hits="" data-linenumber="74">
1783
+ <li class="never" data-hits="" data-linenumber="27">
532
1784
 
533
1785
 
534
- <code class="ruby"> when :max</code>
1786
+ <code class="ruby"> #{host_name}.yml</code>
535
1787
  </li>
536
1788
 
537
- <li class="covered" data-hits="1" data-linenumber="75">
538
- <span class="hits">1</span>
1789
+ <li class="never" data-hits="" data-linenumber="28">
539
1790
 
540
- <code class="ruby"> &quot;Parameter cannot be greater than #{value}&quot; unless value &gt;= param</code>
1791
+
1792
+ <code class="ruby"> #{host_name}_#{env}.yml</code>
541
1793
  </li>
542
1794
 
543
- <li class="never" data-hits="" data-linenumber="76">
1795
+ <li class="never" data-hits="" data-linenumber="29">
544
1796
 
545
1797
 
546
- <code class="ruby"> when :min_length</code>
1798
+ <code class="ruby"> local.yml</code>
547
1799
  </li>
548
1800
 
549
- <li class="covered" data-hits="1" data-linenumber="77">
550
- <span class="hits">1</span>
1801
+ <li class="never" data-hits="" data-linenumber="30">
1802
+
551
1803
 
552
- <code class="ruby"> &quot;Parameter cannot have length less than #{value}&quot; unless value &lt;= param.length</code>
1804
+ <code class="ruby"> local_#{env}.yml</code>
553
1805
  </li>
554
1806
 
555
- <li class="never" data-hits="" data-linenumber="78">
1807
+ <li class="never" data-hits="" data-linenumber="31">
556
1808
 
557
1809
 
558
- <code class="ruby"> when :max_length</code>
1810
+ <code class="ruby"> settings.local.yml</code>
559
1811
  </li>
560
1812
 
561
- <li class="covered" data-hits="1" data-linenumber="79">
562
- <span class="hits">1</span>
1813
+ <li class="never" data-hits="" data-linenumber="32">
1814
+
563
1815
 
564
- <code class="ruby"> &quot;Parameter cannot have length greater than #{value}&quot; unless value &gt;= param.length</code>
1816
+ <code class="ruby"> settings.local_#{env}.yml</code>
565
1817
  </li>
566
1818
 
567
- <li class="never" data-hits="" data-linenumber="80">
1819
+ <li class="never" data-hits="" data-linenumber="33">
568
1820
 
569
1821
 
570
- <code class="ruby"> else</code>
1822
+ <code class="ruby"> config.local.yml</code>
571
1823
  </li>
572
1824
 
573
- <li class="covered" data-hits="14" data-linenumber="81">
574
- <span class="hits">14</span>
1825
+ <li class="never" data-hits="" data-linenumber="34">
1826
+
575
1827
 
576
- <code class="ruby"> nil</code>
1828
+ <code class="ruby"> config.local_#{env}.yml</code>
577
1829
  </li>
578
1830
 
579
- <li class="never" data-hits="" data-linenumber="82">
1831
+ <li class="never" data-hits="" data-linenumber="35">
580
1832
 
581
1833
 
582
- <code class="ruby"> end</code>
1834
+ <code class="ruby"> )</code>
583
1835
  </li>
584
1836
 
585
- <li class="covered" data-hits="23" data-linenumber="83">
586
- <span class="hits">23</span>
1837
+ <li class="never" data-hits="" data-linenumber="36">
587
1838
 
588
- <code class="ruby"> if error</code>
1839
+
1840
+ <code class="ruby"> #prepend the app name to the default file names</code>
589
1841
  </li>
590
1842
 
591
- <li class="covered" data-hits="1" data-linenumber="84">
592
- <span class="hits">1</span>
1843
+ <li class="missed" data-hits="0" data-linenumber="37">
593
1844
 
594
- <code class="ruby"> @errors &lt;&lt; error</code>
1845
+
1846
+ <code class="ruby"> app_file_names = generic_file_names.map { |f| &quot;#{app_name}_#{f}&quot; }</code>
595
1847
  </li>
596
1848
 
597
- <li class="covered" data-hits="1" data-linenumber="85">
598
- <span class="hits">1</span>
1849
+ <li class="never" data-hits="" data-linenumber="38">
1850
+
599
1851
 
600
- <code class="ruby"> is_valid = false</code>
1852
+ <code class="ruby"></code>
601
1853
  </li>
602
1854
 
603
- <li class="never" data-hits="" data-linenumber="86">
1855
+ <li class="missed" data-hits="0" data-linenumber="39">
604
1856
 
605
1857
 
606
- <code class="ruby"> end</code>
1858
+ <code class="ruby"> default_roots = [</code>
607
1859
  </li>
608
1860
 
609
- <li class="never" data-hits="" data-linenumber="87">
1861
+ <li class="never" data-hits="" data-linenumber="40">
610
1862
 
611
1863
 
612
- <code class="ruby"> end</code>
1864
+ <code class="ruby"> script_dir,</code>
613
1865
  </li>
614
1866
 
615
- <li class="never" data-hits="" data-linenumber="88">
1867
+ <li class="never" data-hits="" data-linenumber="41">
616
1868
 
617
1869
 
618
- <code class="ruby"></code>
1870
+ <code class="ruby"> File.join(&#39;/etc&#39;, app_name.to_s),</code>
619
1871
  </li>
620
1872
 
621
- <li class="never" data-hits="" data-linenumber="89">
1873
+ <li class="never" data-hits="" data-linenumber="42">
622
1874
 
623
1875
 
624
- <code class="ruby"> #return true or false depending on if it validated</code>
1876
+ <code class="ruby"> File.join(&#39;/usr&#39;, &#39;local&#39;, &#39;etc&#39;, app_name.to_s),</code>
625
1877
  </li>
626
1878
 
627
- <li class="covered" data-hits="14" data-linenumber="90">
628
- <span class="hits">14</span>
1879
+ <li class="never" data-hits="" data-linenumber="43">
1880
+
629
1881
 
630
- <code class="ruby"> is_valid</code>
1882
+ <code class="ruby"> File.join(home_dir, &#39;etc&#39;, app_name.to_s),</code>
631
1883
  </li>
632
1884
 
633
- <li class="never" data-hits="" data-linenumber="91">
1885
+ <li class="never" data-hits="" data-linenumber="44">
634
1886
 
635
1887
 
636
- <code class="ruby"> end</code>
1888
+ <code class="ruby"> File.join(home_dir, &quot;.#{app_name}&quot;),</code>
637
1889
  </li>
638
1890
 
639
- <li class="never" data-hits="" data-linenumber="92">
1891
+ <li class="never" data-hits="" data-linenumber="45">
640
1892
 
641
1893
 
642
- <code class="ruby"></code>
1894
+ <code class="ruby"> File.join(home_dir, &#39;.hash_params&#39;, app_name.to_s),</code>
643
1895
  </li>
644
1896
 
645
- <li class="never" data-hits="" data-linenumber="93">
1897
+ <li class="never" data-hits="" data-linenumber="46">
646
1898
 
647
1899
 
648
- <code class="ruby"></code>
1900
+ <code class="ruby"> File.join(script_dir, &#39;config&#39;),</code>
649
1901
  </li>
650
1902
 
651
- <li class="covered" data-hits="1" data-linenumber="94">
652
- <span class="hits">1</span>
1903
+ <li class="never" data-hits="" data-linenumber="47">
653
1904
 
654
- <code class="ruby"> def coerce(val, type, h)</code>
1905
+
1906
+ <code class="ruby"> File.join(script_dir, &#39;settings&#39;)</code>
655
1907
  </li>
656
1908
 
657
- <li class="never" data-hits="" data-linenumber="95">
1909
+ <li class="never" data-hits="" data-linenumber="48">
658
1910
 
659
1911
 
660
- <code class="ruby"></code>
1912
+ <code class="ruby"> ]</code>
661
1913
  </li>
662
1914
 
663
- <li class="never" data-hits="" data-linenumber="96">
1915
+ <li class="missed" data-hits="0" data-linenumber="49">
664
1916
 
665
1917
 
666
- <code class="ruby"> # exceptions bubble up</code>
1918
+ <code class="ruby"> if defined?(Rails)</code>
667
1919
  </li>
668
1920
 
669
- <li class="never" data-hits="" data-linenumber="97">
1921
+ <li class="missed" data-hits="0" data-linenumber="50">
670
1922
 
671
1923
 
672
- <code class="ruby"> #order is important</code>
1924
+ <code class="ruby"> default_roots &lt;&lt; Rails.root.join(&#39;config&#39;)</code>
673
1925
  </li>
674
1926
 
675
- <li class="covered" data-hits="9" data-linenumber="98">
676
- <span class="hits">9</span>
1927
+ <li class="never" data-hits="" data-linenumber="51">
1928
+
677
1929
 
678
- <code class="ruby"> return val if type.nil? || val.nil?</code>
1930
+ <code class="ruby"> end</code>
679
1931
  </li>
680
1932
 
681
- <li class="never" data-hits="" data-linenumber="99">
1933
+ <li class="never" data-hits="" data-linenumber="52">
682
1934
 
683
1935
 
684
1936
  <code class="ruby"></code>
685
1937
  </li>
686
1938
 
687
- <li class="never" data-hits="" data-linenumber="100">
1939
+ <li class="never" data-hits="" data-linenumber="53">
688
1940
 
689
1941
 
690
- <code class="ruby"> #two special types of transforms</code>
1942
+ <code class="ruby"></code>
691
1943
  </li>
692
1944
 
693
- <li class="never" data-hits="" data-linenumber="101">
1945
+ <li class="never" data-hits="" data-linenumber="54">
694
1946
 
695
1947
 
696
- <code class="ruby"> #There is no Boolean type so we handle them special</code>
1948
+ <code class="ruby"> #process the /etc/app_name* files</code>
697
1949
  </li>
698
1950
 
699
- <li class="covered" data-hits="9" data-linenumber="102">
700
- <span class="hits">9</span>
1951
+ <li class="missed" data-hits="0" data-linenumber="55">
701
1952
 
702
- <code class="ruby"> if type == :boolean || type ==&#39;boolean&#39;</code>
1953
+
1954
+ <code class="ruby"> app_file_names.each do |fname|</code>
703
1955
  </li>
704
1956
 
705
- <li class="covered" data-hits="2" data-linenumber="103">
706
- <span class="hits">2</span>
1957
+ <li class="missed" data-hits="0" data-linenumber="56">
707
1958
 
708
- <code class="ruby"> return val if (val == true || val == false)</code>
1959
+
1960
+ <code class="ruby"> all_file_names &lt;&lt; File.join(&#39;/etc&#39;, fname)</code>
709
1961
  </li>
710
1962
 
711
- <li class="covered" data-hits="2" data-linenumber="104">
712
- <span class="hits">2</span>
1963
+ <li class="never" data-hits="" data-linenumber="57">
1964
+
713
1965
 
714
- <code class="ruby"> return false if /(false|f|no|n|0)$/i === val.to_s</code>
1966
+ <code class="ruby"> end</code>
715
1967
  </li>
716
1968
 
717
- <li class="covered" data-hits="1" data-linenumber="105">
718
- <span class="hits">1</span>
1969
+ <li class="never" data-hits="" data-linenumber="58">
719
1970
 
720
- <code class="ruby"> return true if /(true|t|yes|y|1)$/i === val.to_s</code>
1971
+
1972
+ <code class="ruby"> #now process the default roots which will override the above</code>
721
1973
  </li>
722
1974
 
723
- <li class="never" data-hits="" data-linenumber="106">
1975
+ <li class="missed" data-hits="0" data-linenumber="59">
724
1976
 
725
1977
 
726
- <code class="ruby"></code>
1978
+ <code class="ruby"> (default_roots + special_roots).each do |root|</code>
727
1979
  </li>
728
1980
 
729
- <li class="never" data-hits="" data-linenumber="107">
1981
+ <li class="missed" data-hits="0" data-linenumber="60">
730
1982
 
731
1983
 
732
- <code class="ruby"> # if we can&#39;t parse we return a nil</code>
1984
+ <code class="ruby"> (generic_file_names + app_file_names + special_file_names).each do |fname|</code>
733
1985
  </li>
734
1986
 
735
- <li class="never" data-hits="" data-linenumber="108">
1987
+ <li class="missed" data-hits="0" data-linenumber="61">
736
1988
 
737
1989
 
738
- <code class="ruby"> # maybe !!val is a better return?</code>
1990
+ <code class="ruby"> all_file_names &lt;&lt; File.join(root, fname)</code>
739
1991
  </li>
740
1992
 
741
- <li class="missed" data-hits="0" data-linenumber="109">
1993
+ <li class="never" data-hits="" data-linenumber="62">
742
1994
 
743
1995
 
744
- <code class="ruby"> return nil</code>
1996
+ <code class="ruby"> end</code>
745
1997
  </li>
746
1998
 
747
- <li class="never" data-hits="" data-linenumber="110">
1999
+ <li class="never" data-hits="" data-linenumber="63">
748
2000
 
749
2001
 
750
2002
  <code class="ruby"> end</code>
751
2003
  </li>
752
2004
 
753
- <li class="never" data-hits="" data-linenumber="111">
2005
+ <li class="never" data-hits="" data-linenumber="64">
754
2006
 
755
2007
 
756
- <code class="ruby"> #they have given us a coercion which is a string or symbol which is not &quot;boolean&quot;, we are going to cast this into a proc and run it</code>
2008
+ <code class="ruby"></code>
757
2009
  </li>
758
2010
 
759
- <li class="never" data-hits="" data-linenumber="112">
2011
+ <li class="missed" data-hits="0" data-linenumber="65">
760
2012
 
761
2013
 
762
- <code class="ruby"></code>
2014
+ <code class="ruby"> all_file_names.each do |file|</code>
763
2015
  </li>
764
2016
 
765
- <li class="covered" data-hits="7" data-linenumber="113">
766
- <span class="hits">7</span>
2017
+ <li class="missed" data-hits="0" data-linenumber="66">
2018
+
767
2019
 
768
- <code class="ruby"> return type.to_proc.call(val) if type.is_a?(Symbol) || type.is_a?(String)</code>
2020
+ <code class="ruby"> generated_hash = deep_merge(generated_hash, hash_from_yaml_file(file)) if File.exists?(file)</code>
769
2021
  </li>
770
2022
 
771
- <li class="never" data-hits="" data-linenumber="114">
2023
+ <li class="never" data-hits="" data-linenumber="67">
772
2024
 
773
2025
 
774
- <code class="ruby"> #could be a proc</code>
2026
+ <code class="ruby"> end</code>
775
2027
  </li>
776
2028
 
777
- <li class="never" data-hits="" data-linenumber="115">
2029
+ <li class="never" data-hits="" data-linenumber="68">
778
2030
 
779
2031
 
780
2032
  <code class="ruby"></code>
781
2033
  </li>
782
2034
 
783
- <li class="covered" data-hits="6" data-linenumber="116">
784
- <span class="hits">6</span>
2035
+ <li class="missed" data-hits="0" data-linenumber="69">
785
2036
 
786
- <code class="ruby"> return type.call(val) if type.respond_to?(:call)</code>
2037
+
2038
+ <code class="ruby"> if block_given?</code>
787
2039
  </li>
788
2040
 
789
- <li class="never" data-hits="" data-linenumber="117">
2041
+ <li class="missed" data-hits="0" data-linenumber="70">
790
2042
 
791
2043
 
792
- <code class="ruby"> #nothing but simple types left</code>
2044
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(generated_hash, opts, &amp;Proc.new)</code>
793
2045
  </li>
794
2046
 
795
- <li class="covered" data-hits="5" data-linenumber="118">
796
- <span class="hits">5</span>
2047
+ <li class="never" data-hits="" data-linenumber="71">
797
2048
 
798
- <code class="ruby"> return val if val.is_a?(type)</code>
799
- </li>
800
-
801
- <li class="covered" data-hits="4" data-linenumber="119">
802
- <span class="hits">4</span>
803
2049
 
804
- <code class="ruby"> return Integer(val) if type == Integer</code>
2050
+ <code class="ruby"> else</code>
805
2051
  </li>
806
2052
 
807
- <li class="covered" data-hits="3" data-linenumber="120">
808
- <span class="hits">3</span>
2053
+ <li class="missed" data-hits="0" data-linenumber="72">
809
2054
 
810
- <code class="ruby"> return Float(val) if type == Float</code>
811
- </li>
812
-
813
- <li class="covered" data-hits="2" data-linenumber="121">
814
- <span class="hits">2</span>
815
2055
 
816
- <code class="ruby"> return String(val) if type == String</code>
2056
+ <code class="ruby"> HashParams::HashValidator.new.validate_hash(generated_hash, opts)</code>
817
2057
  </li>
818
2058
 
819
- <li class="covered" data-hits="2" data-linenumber="122">
820
- <span class="hits">2</span>
2059
+ <li class="never" data-hits="" data-linenumber="73">
2060
+
821
2061
 
822
- <code class="ruby"> return Date.parse(val) if type == Date</code>
2062
+ <code class="ruby"> end</code>
823
2063
  </li>
824
2064
 
825
- <li class="covered" data-hits="2" data-linenumber="123">
826
- <span class="hits">2</span>
2065
+ <li class="never" data-hits="" data-linenumber="74">
2066
+
827
2067
 
828
- <code class="ruby"> return Time.parse(val) if type == Time</code>
2068
+ <code class="ruby"> end</code>
829
2069
  </li>
830
2070
 
831
- <li class="covered" data-hits="2" data-linenumber="124">
832
- <span class="hits">2</span>
2071
+ <li class="never" data-hits="" data-linenumber="75">
833
2072
 
834
- <code class="ruby"> return DateTime.parse(val) if type == DateTime</code>
2073
+
2074
+ <code class="ruby"></code>
835
2075
  </li>
836
2076
 
837
- <li class="covered" data-hits="2" data-linenumber="125">
838
- <span class="hits">2</span>
2077
+ <li class="covered" data-hits="1" data-linenumber="76">
2078
+ <span class="hits">1</span>
839
2079
 
840
- <code class="ruby"> return Array(val.split(h[:delimiter] || &#39;,&#39;)) if type == Array</code>
2080
+ <code class="ruby"> def self.hash_from_yaml_file(filename, env=nil)</code>
841
2081
  </li>
842
2082
 
843
- <li class="covered" data-hits="10" data-linenumber="126">
844
- <span class="hits">10</span>
2083
+ <li class="missed" data-hits="0" data-linenumber="77">
2084
+
845
2085
 
846
- <code class="ruby"> return Hash[val.gsub(/[{}]/,&#39;&#39;).gsub(&#39;}&#39;,&#39;&#39;).split(h[:delimiter] || &#39;,&#39;).map { |c| c.split(h[:separator] ||&#39;:&#39;).map{|i| i.strip} }] if type == Hash</code>
2086
+ <code class="ruby"> env ||= ENVIRONMENT</code>
847
2087
  </li>
848
2088
 
849
- <li class="never" data-hits="" data-linenumber="127">
2089
+ <li class="missed" data-hits="0" data-linenumber="78">
850
2090
 
851
2091
 
852
- <code class="ruby"></code>
2092
+ <code class="ruby"> r = File.exists?(filename) ? YAML::load(ERB.new(File.read(filename)).result) : {}</code>
853
2093
  </li>
854
2094
 
855
- <li class="never" data-hits="" data-linenumber="128">
2095
+ <li class="missed" data-hits="0" data-linenumber="79">
856
2096
 
857
2097
 
858
- <code class="ruby"> nil</code>
2098
+ <code class="ruby"> r[env] || r</code>
859
2099
  </li>
860
2100
 
861
- <li class="never" data-hits="" data-linenumber="129">
2101
+ <li class="never" data-hits="" data-linenumber="80">
862
2102
 
863
2103
 
864
2104
  <code class="ruby"> end</code>
865
2105
  </li>
866
2106
 
867
- <li class="never" data-hits="" data-linenumber="130">
2107
+ <li class="never" data-hits="" data-linenumber="81">
868
2108
 
869
2109
 
870
2110
  <code class="ruby"></code>
871
2111
  </li>
872
2112
 
873
- <li class="covered" data-hits="1" data-linenumber="131">
874
- <span class="hits">1</span>
875
-
876
- <code class="ruby"> def valid?</code>
877
- </li>
878
-
879
- <li class="covered" data-hits="1" data-linenumber="132">
2113
+ <li class="covered" data-hits="1" data-linenumber="82">
880
2114
  <span class="hits">1</span>
881
2115
 
882
- <code class="ruby"> @valid</code>
2116
+ <code class="ruby"> def self.deep_merge(hash, other_hash)</code>
883
2117
  </li>
884
2118
 
885
- <li class="never" data-hits="" data-linenumber="133">
2119
+ <li class="missed" data-hits="0" data-linenumber="83">
886
2120
 
887
2121
 
888
- <code class="ruby"> end</code>
889
- </li>
890
-
891
- <li class="covered" data-hits="1" data-linenumber="134">
892
- <span class="hits">1</span>
893
-
894
- <code class="ruby"> def present?(object)</code>
2122
+ <code class="ruby"> if other_hash.is_a?(::Hash) &amp;&amp; hash.is_a?(::Hash)</code>
895
2123
  </li>
896
2124
 
897
- <li class="missed" data-hits="0" data-linenumber="135">
2125
+ <li class="missed" data-hits="0" data-linenumber="84">
898
2126
 
899
2127
 
900
- <code class="ruby"> !blank?(object)</code>
2128
+ <code class="ruby"> other_hash.each do |k, v|</code>
901
2129
  </li>
902
2130
 
903
- <li class="never" data-hits="" data-linenumber="136">
2131
+ <li class="missed" data-hits="0" data-linenumber="85">
904
2132
 
905
2133
 
906
- <code class="ruby"> end</code>
2134
+ <code class="ruby"> hash[k] = hash.key?(k) ? deep_merge(hash[k], v) : v</code>
907
2135
  </li>
908
2136
 
909
- <li class="never" data-hits="" data-linenumber="137">
2137
+ <li class="never" data-hits="" data-linenumber="86">
910
2138
 
911
2139
 
912
- <code class="ruby"></code>
2140
+ <code class="ruby"> end</code>
913
2141
  </li>
914
2142
 
915
- <li class="covered" data-hits="1" data-linenumber="138">
916
- <span class="hits">1</span>
2143
+ <li class="missed" data-hits="0" data-linenumber="87">
917
2144
 
918
- <code class="ruby"> def blank?(object)</code>
2145
+
2146
+ <code class="ruby"> hash</code>
919
2147
  </li>
920
2148
 
921
- <li class="missed" data-hits="0" data-linenumber="139">
2149
+ <li class="never" data-hits="" data-linenumber="88">
922
2150
 
923
2151
 
924
- <code class="ruby"> return true if object.nil?</code>
2152
+ <code class="ruby"> else</code>
925
2153
  </li>
926
2154
 
927
- <li class="missed" data-hits="0" data-linenumber="140">
2155
+ <li class="missed" data-hits="0" data-linenumber="89">
928
2156
 
929
2157
 
930
- <code class="ruby"> return true if object.respond_to?(:empty) &amp;&amp; object.empty</code>
2158
+ <code class="ruby"> other_hash</code>
931
2159
  </li>
932
2160
 
933
- <li class="missed" data-hits="0" data-linenumber="141">
2161
+ <li class="never" data-hits="" data-linenumber="90">
934
2162
 
935
2163
 
936
- <code class="ruby"> return false</code>
2164
+ <code class="ruby"> end</code>
937
2165
  </li>
938
2166
 
939
- <li class="never" data-hits="" data-linenumber="142">
2167
+ <li class="never" data-hits="" data-linenumber="91">
940
2168
 
941
2169
 
942
2170
  <code class="ruby"> end</code>
943
2171
  </li>
944
2172
 
945
- <li class="never" data-hits="" data-linenumber="143">
2173
+ <li class="never" data-hits="" data-linenumber="92">
946
2174
 
947
2175
 
948
2176
  <code class="ruby"></code>
949
2177
  </li>
950
2178
 
951
- <li class="never" data-hits="" data-linenumber="144">
2179
+ <li class="never" data-hits="" data-linenumber="93">
952
2180
 
953
2181
 
954
2182
  <code class="ruby">end</code>