hash_params 0.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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>