otoroshi 0.0.2 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,290 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.9.25
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "README";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="file_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+ <span class="title">File: README</span>
41
+
42
+ </div>
43
+
44
+ <div id="search">
45
+
46
+ <a class="full_list_link" id="class_list_link"
47
+ href="class_list.html">
48
+
49
+ <svg width="24" height="24">
50
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
51
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
52
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
53
+ </svg>
54
+ </a>
55
+
56
+ </div>
57
+ <div class="clear"></div>
58
+ </div>
59
+
60
+ <div id="content"><div id='filecontents'><h1 id="otoroshi">Otoroshi</h1>
61
+
62
+ <p><img src="https://upload.wikimedia.org/wikipedia/commons/4/41/Suushi_Otoroshi.jpg" alt="otoroshi" title="Sawaki Suushi"></p>
63
+
64
+ <blockquote>
65
+ <p>-- <cite>Illustration from Sawaki Suushi, 1737</cite></p>
66
+ </blockquote>
67
+
68
+ <p>Otoroshis are legendary creatures in Japanese folklore and mythology. They act as guardian of holy temples.</p>
69
+
70
+ <p>The <code>otoroshi</code> gem helps you defining and validating class properties.</p>
71
+
72
+ <p>See <a href="#refactor-example">an example of refactor</a> with Otoroshi.</p>
73
+
74
+ <h2 id="installation">Installation</h2>
75
+
76
+ <p>Add this line to your application&#39;s Gemfile:</p>
77
+
78
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>otoroshi</span><span class='tstring_end'>&#39;</span></span>
79
+ </code></pre>
80
+
81
+ <p>And then execute:</p>
82
+
83
+ <pre class="code ruby"><code class="ruby">$ bundle
84
+ </code></pre>
85
+
86
+ <h2 id="usage">Usage</h2>
87
+
88
+ <p>Include <code>Otoroshi::Sanctuary</code> in a class to easily define arguments validation.</p>
89
+
90
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>MyClass</span>
91
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
92
+ <span class='kw'>end</span>
93
+ </code></pre>
94
+
95
+ <h3 id="define-classs-properties">Define class&#39;s properties</h3>
96
+
97
+ <p>Use the <code>::property(name, type, options)</code> method to add a property.</p>
98
+
99
+ <ul>
100
+ <li><code>name</code>: name of the property (symbol or string)</li>
101
+ <li><code>type</code>: the class the future value should belongs to (class or array of classes, <code>Object</code> by default)</li>
102
+ <li>options:
103
+
104
+ <ul>
105
+ <li><code>validate</code>: a custom validation to apply to the future value (lambda, <code>-&gt;(_) { true }</code> by default)</li>
106
+ <li><code>allow_nil</code>: define if the future value can be set to nil (boolean, <code>false</code> by default)</li>
107
+ <li><code>default</code>: the default value for this property (should match the required type, <code>nil</code> by default)</li>
108
+ </ul></li>
109
+ </ul>
110
+
111
+ <p>Getters and a setters are automatically set:</p>
112
+
113
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
114
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
115
+
116
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span>
117
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:bar</span><span class='comma'>,</span> <span class='const'>String</span>
118
+ <span class='kw'>end</span>
119
+
120
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='int'>42</span><span class='comma'>,</span> <span class='label'>bar:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>hello</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
121
+
122
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># 42
123
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_bar'>bar</span> <span class='comment'># hello
124
+ </span>
125
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='int'>7</span>
126
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_bar'>bar</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>world</span><span class='tstring_end'>&#39;</span></span>
127
+
128
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># 7
129
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_bar'>bar</span> <span class='comment'># world
130
+ </span></code></pre>
131
+
132
+ <p>Type validations run on initialization and assignment:</p>
133
+
134
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
135
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
136
+
137
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span>
138
+ <span class='kw'>end</span>
139
+
140
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
141
+ </span><span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='float'>1.5</span><span class='rparen'>)</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
142
+ </span>
143
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
144
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='float'>1.5</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
145
+ </span></code></pre>
146
+
147
+ <p>You can provide multiple authorized types:</p>
148
+
149
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
150
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
151
+
152
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='const'>Symbol</span><span class='comma'>,</span> <span class='const'>String</span><span class='rbracket'>]</span>
153
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:bar</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='const'>TrueClass</span><span class='comma'>,</span> <span class='const'>FalseClass</span><span class='rbracket'>]</span>
154
+ <span class='kw'>end</span>
155
+
156
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='symbol'>:hello</span><span class='comma'>,</span> <span class='label'>bar:</span> <span class='kw'>true</span><span class='rparen'>)</span>
157
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>hello</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>bar:</span> <span class='kw'>false</span><span class='rparen'>)</span>
158
+ </code></pre>
159
+
160
+ <p>You can avoid the second argument so any <code>Object</code> can be passed:</p>
161
+
162
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
163
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
164
+
165
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span>
166
+ <span class='kw'>end</span>
167
+
168
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>hello</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
169
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='int'>42</span><span class='rparen'>)</span>
170
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='const'>User</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='int'>1</span><span class='rparen'>)</span><span class='rparen'>)</span>
171
+ </code></pre>
172
+
173
+ <p>You can add custom validations with the <code>validate:</code> option.</p>
174
+
175
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
176
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
177
+
178
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span><span class='comma'>,</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='rbrace'>}</span>
179
+ <span class='kw'>end</span>
180
+
181
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='op'>-</span><span class='int'>1</span><span class='rparen'>)</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match validation&quot;
182
+ </span>
183
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='op'>-</span><span class='int'>1</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match validation&quot;
184
+ </span></code></pre>
185
+
186
+ <p>Set <code>allow_nil:</code> option to <code>true</code> if <code>nil</code> is authorized:</p>
187
+
188
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
189
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
190
+
191
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span><span class='comma'>,</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>allow_nil:</span> <span class='kw'>true</span>
192
+ <span class='kw'>end</span>
193
+
194
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
195
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
196
+ </span>
197
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='int'>42</span>
198
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='kw'>nil</span>
199
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
200
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='op'>-</span><span class='int'>1</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match validation&quot;
201
+ </span></code></pre>
202
+
203
+ <p>Set <code>default:</code> option to the default value. You can always set the value to <code>nil</code> if <code>allow_nil</code> is <code>true</code>.</p>
204
+
205
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
206
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
207
+
208
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span><span class='comma'>,</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>default:</span> <span class='int'>1</span><span class='comma'>,</span> <span class='label'>allow_nil:</span> <span class='kw'>true</span>
209
+ <span class='kw'>end</span>
210
+
211
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='comment'># no error
212
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># 1
213
+ </span>
214
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='kw'>nil</span><span class='rparen'>)</span> <span class='comment'># no error
215
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
216
+ </span>
217
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='comment'># no error
218
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
219
+ </span></code></pre>
220
+
221
+ <h2 id="refactor-example">Refactor Example</h2>
222
+
223
+ <h3 id="before-refactor-23-lines-765-characters-dedicated-to-properties">Before refactor (23 lines / 765 characters dedicated to properties)</h3>
224
+
225
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Importer</span>
226
+ <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:file_path</span><span class='comma'>,</span> <span class='symbol'>:headers</span><span class='comma'>,</span> <span class='symbol'>:col_sep</span><span class='comma'>,</span> <span class='symbol'>:converters</span>
227
+
228
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span><span class='label'>file_path:</span><span class='comma'>,</span> <span class='label'>headers:</span> <span class='kw'>false</span><span class='comma'>,</span> <span class='label'>col_sep:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>converters:</span> <span class='kw'>nil</span><span class='rparen'>)</span>
229
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_file_path'>file_path</span> <span class='op'>=</span> <span class='id identifier rubyid_file_path'>file_path</span>
230
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span> <span class='op'>=</span> <span class='id identifier rubyid_headers'>headers</span>
231
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_col_sep'>col_sep</span> <span class='op'>=</span> <span class='id identifier rubyid_col_sep'>col_sep</span>
232
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_converters'>converters</span> <span class='op'>=</span> <span class='id identifier rubyid_converters'>converters</span>
233
+ <span class='kw'>end</span>
234
+
235
+ <span class='id identifier rubyid_private'>private</span>
236
+
237
+ <span class='comment'># private business methods...
238
+ </span>
239
+ <span class='kw'>def</span> <span class='id identifier rubyid_file_path='>file_path=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
240
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_is_?'>is_?</span><span class='lparen'>(</span><span class='const'>String</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_match?'>match?</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>.+\.csv</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span>
241
+
242
+ <span class='ivar'>@file_path</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
243
+ <span class='kw'>end</span>
244
+
245
+ <span class='kw'>def</span> <span class='id identifier rubyid_headers='>headers=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
246
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='lbracket'>[</span><span class='kw'>true</span><span class='comma'>,</span> <span class='kw'>false</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
247
+
248
+ <span class='ivar'>@headers</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
249
+ <span class='kw'>end</span>
250
+
251
+ <span class='kw'>def</span> <span class='id identifier rubyid_col_sep='>col_sep=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
252
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_is_?'>is_?</span><span class='lparen'>(</span><span class='const'>String</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\t</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>|</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
253
+
254
+ <span class='ivar'>@col_sep</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
255
+ <span class='kw'>end</span>
256
+
257
+ <span class='kw'>def</span> <span class='id identifier rubyid_converters='>converters=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
258
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_is_?'>is_?</span><span class='lparen'>(</span><span class='const'>Symbol</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span><span class='lparen'>(</span><span class='qsymbols_beg'>%i[</span><span class='tstring_content'>integer</span><span class='words_sep'> </span><span class='tstring_content'>float</span><span class='words_sep'> </span><span class='tstring_content'>date</span><span class='tstring_end'>]</span></span><span class='rparen'>)</span>
259
+
260
+ <span class='ivar'>@converters</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
261
+ <span class='kw'>end</span>
262
+ <span class='kw'>end</span>
263
+ </code></pre>
264
+
265
+ <h3 id="after-refactor-with-otoroshi-5-lines-351-characters-dedicated-to-properties">After refactor with Otoroshi (5 lines / 351 characters dedicated to properties)</h3>
266
+
267
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Importer</span>
268
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
269
+
270
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:file_path</span><span class='comma'>,</span> <span class='const'>String</span><span class='comma'>,</span> <span class='label'>validate:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span><span class='period'>.</span><span class='id identifier rubyid_match?'>match?</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>.+\.csv</span><span class='regexp_end'>/</span></span> <span class='rbrace'>}</span>
271
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:headers</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='const'>TrueClass</span><span class='comma'>,</span> <span class='const'>FalseClass</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='label'>default:</span> <span class='kw'>false</span>
272
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:col_sep</span><span class='comma'>,</span> <span class='const'>String</span><span class='comma'>,</span> <span class='label'>validate:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\t</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>|</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>default:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span>
273
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:converters</span><span class='comma'>,</span> <span class='const'>Symbol</span><span class='comma'>,</span> <span class='label'>validate:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span> <span class='qsymbols_beg'>%i[</span><span class='tstring_content'>integer</span><span class='words_sep'> </span><span class='tstring_content'>float</span><span class='words_sep'> </span><span class='tstring_content'>date</span><span class='tstring_end'>]</span></span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>allow_nil:</span> <span class='kw'>true</span>
274
+
275
+ <span class='id identifier rubyid_private'>private</span>
276
+
277
+ <span class='comment'># private business methods...
278
+ </span><span class='kw'>end</span>
279
+ </code></pre>
280
+ </div></div>
281
+
282
+ <div id="footer">
283
+ Generated on Wed Oct 14 00:24:01 2020 by
284
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
285
+ 0.9.25 (ruby-2.6.6).
286
+ </div>
287
+
288
+ </div>
289
+ </body>
290
+ </html>
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
5
+ <meta charset="utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <title>File List</title>
19
+ <base id="base_target" target="_parent" />
20
+ </head>
21
+ <body>
22
+ <div id="content">
23
+ <div class="fixed_header">
24
+ <h1 id="full_list_header">File List</h1>
25
+ <div id="full_list_nav">
26
+
27
+ <span><a target="_self" href="class_list.html">
28
+ Classes
29
+ </a></span>
30
+
31
+ <span><a target="_self" href="method_list.html">
32
+ Methods
33
+ </a></span>
34
+
35
+ <span><a target="_self" href="file_list.html">
36
+ Files
37
+ </a></span>
38
+
39
+ </div>
40
+
41
+ <div id="search">Search: <input type="text" /></div>
42
+ </div>
43
+
44
+ <ul id="full_list" class="file">
45
+
46
+
47
+ <li id="object_README" class="odd">
48
+ <div class="item"><span class="object_link"><a href="index.html" title="README">README</a></span></div>
49
+ </li>
50
+
51
+
52
+
53
+ </ul>
54
+ </div>
55
+ </body>
56
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Documentation by YARD 0.9.25</title>
6
+ </head>
7
+ <script type="text/javascript">
8
+ var match = unescape(window.location.hash).match(/^#!(.+)/);
9
+ var name = match ? match[1] : 'index.html';
10
+ name = name.replace(/^(\w+):\/\//, '').replace(/^\/\//, '');
11
+ window.top.location = name;
12
+ </script>
13
+ <noscript>
14
+ <h1>Oops!</h1>
15
+ <h2>YARD requires JavaScript!</h2>
16
+ </noscript>
17
+ </html>
@@ -0,0 +1,290 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.9.25
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "README";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+ <span class="title">File: README</span>
41
+
42
+ </div>
43
+
44
+ <div id="search">
45
+
46
+ <a class="full_list_link" id="class_list_link"
47
+ href="class_list.html">
48
+
49
+ <svg width="24" height="24">
50
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
51
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
52
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
53
+ </svg>
54
+ </a>
55
+
56
+ </div>
57
+ <div class="clear"></div>
58
+ </div>
59
+
60
+ <div id="content"><div id='filecontents'><h1 id="otoroshi">Otoroshi</h1>
61
+
62
+ <p><img src="https://upload.wikimedia.org/wikipedia/commons/4/41/Suushi_Otoroshi.jpg" alt="otoroshi" title="Sawaki Suushi"></p>
63
+
64
+ <blockquote>
65
+ <p>-- <cite>Illustration from Sawaki Suushi, 1737</cite></p>
66
+ </blockquote>
67
+
68
+ <p>Otoroshis are legendary creatures in Japanese folklore and mythology. They act as guardian of holy temples.</p>
69
+
70
+ <p>The <code>otoroshi</code> gem helps you defining and validating class properties.</p>
71
+
72
+ <p>See <a href="#refactor-example">an example of refactor</a> with Otoroshi.</p>
73
+
74
+ <h2 id="installation">Installation</h2>
75
+
76
+ <p>Add this line to your application&#39;s Gemfile:</p>
77
+
78
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>otoroshi</span><span class='tstring_end'>&#39;</span></span>
79
+ </code></pre>
80
+
81
+ <p>And then execute:</p>
82
+
83
+ <pre class="code ruby"><code class="ruby">$ bundle
84
+ </code></pre>
85
+
86
+ <h2 id="usage">Usage</h2>
87
+
88
+ <p>Include <code>Otoroshi::Sanctuary</code> in a class to easily define arguments validation.</p>
89
+
90
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>MyClass</span>
91
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
92
+ <span class='kw'>end</span>
93
+ </code></pre>
94
+
95
+ <h3 id="define-classs-properties">Define class&#39;s properties</h3>
96
+
97
+ <p>Use the <code>::property(name, type, options)</code> method to add a property.</p>
98
+
99
+ <ul>
100
+ <li><code>name</code>: name of the property (symbol or string)</li>
101
+ <li><code>type</code>: the class the future value should belongs to (class or array of classes, <code>Object</code> by default)</li>
102
+ <li>options:
103
+
104
+ <ul>
105
+ <li><code>validate</code>: a custom validation to apply to the future value (lambda, <code>-&gt;(_) { true }</code> by default)</li>
106
+ <li><code>allow_nil</code>: define if the future value can be set to nil (boolean, <code>false</code> by default)</li>
107
+ <li><code>default</code>: the default value for this property (should match the required type, <code>nil</code> by default)</li>
108
+ </ul></li>
109
+ </ul>
110
+
111
+ <p>Getters and a setters are automatically set:</p>
112
+
113
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
114
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
115
+
116
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span>
117
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:bar</span><span class='comma'>,</span> <span class='const'>String</span>
118
+ <span class='kw'>end</span>
119
+
120
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='int'>42</span><span class='comma'>,</span> <span class='label'>bar:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>hello</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
121
+
122
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># 42
123
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_bar'>bar</span> <span class='comment'># hello
124
+ </span>
125
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='int'>7</span>
126
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_bar'>bar</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>world</span><span class='tstring_end'>&#39;</span></span>
127
+
128
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># 7
129
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_bar'>bar</span> <span class='comment'># world
130
+ </span></code></pre>
131
+
132
+ <p>Type validations run on initialization and assignment:</p>
133
+
134
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
135
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
136
+
137
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span>
138
+ <span class='kw'>end</span>
139
+
140
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
141
+ </span><span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='float'>1.5</span><span class='rparen'>)</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
142
+ </span>
143
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
144
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='float'>1.5</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match required type&quot;
145
+ </span></code></pre>
146
+
147
+ <p>You can provide multiple authorized types:</p>
148
+
149
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
150
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
151
+
152
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='const'>Symbol</span><span class='comma'>,</span> <span class='const'>String</span><span class='rbracket'>]</span>
153
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:bar</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='const'>TrueClass</span><span class='comma'>,</span> <span class='const'>FalseClass</span><span class='rbracket'>]</span>
154
+ <span class='kw'>end</span>
155
+
156
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='symbol'>:hello</span><span class='comma'>,</span> <span class='label'>bar:</span> <span class='kw'>true</span><span class='rparen'>)</span>
157
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>hello</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>bar:</span> <span class='kw'>false</span><span class='rparen'>)</span>
158
+ </code></pre>
159
+
160
+ <p>You can avoid the second argument so any <code>Object</code> can be passed:</p>
161
+
162
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
163
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
164
+
165
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span>
166
+ <span class='kw'>end</span>
167
+
168
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>hello</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
169
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='int'>42</span><span class='rparen'>)</span>
170
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='const'>User</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='int'>1</span><span class='rparen'>)</span><span class='rparen'>)</span>
171
+ </code></pre>
172
+
173
+ <p>You can add custom validations with the <code>validate:</code> option.</p>
174
+
175
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
176
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
177
+
178
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span><span class='comma'>,</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='rbrace'>}</span>
179
+ <span class='kw'>end</span>
180
+
181
+ <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='op'>-</span><span class='int'>1</span><span class='rparen'>)</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match validation&quot;
182
+ </span>
183
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='op'>-</span><span class='int'>1</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match validation&quot;
184
+ </span></code></pre>
185
+
186
+ <p>Set <code>allow_nil:</code> option to <code>true</code> if <code>nil</code> is authorized:</p>
187
+
188
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
189
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
190
+
191
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span><span class='comma'>,</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>allow_nil:</span> <span class='kw'>true</span>
192
+ <span class='kw'>end</span>
193
+
194
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
195
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
196
+ </span>
197
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='int'>42</span>
198
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='kw'>nil</span>
199
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
200
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='op'>-</span><span class='int'>1</span> <span class='comment'># =&gt; ArgumentError, &quot;foo does not match validation&quot;
201
+ </span></code></pre>
202
+
203
+ <p>Set <code>default:</code> option to the default value. You can always set the value to <code>nil</code> if <code>allow_nil</code> is <code>true</code>.</p>
204
+
205
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Example</span>
206
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
207
+
208
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:foo</span><span class='comma'>,</span> <span class='const'>Integer</span><span class='comma'>,</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>default:</span> <span class='int'>1</span><span class='comma'>,</span> <span class='label'>allow_nil:</span> <span class='kw'>true</span>
209
+ <span class='kw'>end</span>
210
+
211
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='comment'># no error
212
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># 1
213
+ </span>
214
+ <span class='id identifier rubyid_instance'>instance</span> <span class='op'>=</span> <span class='const'>Example</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>foo:</span> <span class='kw'>nil</span><span class='rparen'>)</span> <span class='comment'># no error
215
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
216
+ </span>
217
+ <span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='comment'># no error
218
+ </span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_foo'>foo</span> <span class='comment'># nil
219
+ </span></code></pre>
220
+
221
+ <h2 id="refactor-example">Refactor Example</h2>
222
+
223
+ <h3 id="before-refactor-23-lines-765-characters-dedicated-to-properties">Before refactor (23 lines / 765 characters dedicated to properties)</h3>
224
+
225
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Importer</span>
226
+ <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:file_path</span><span class='comma'>,</span> <span class='symbol'>:headers</span><span class='comma'>,</span> <span class='symbol'>:col_sep</span><span class='comma'>,</span> <span class='symbol'>:converters</span>
227
+
228
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span><span class='label'>file_path:</span><span class='comma'>,</span> <span class='label'>headers:</span> <span class='kw'>false</span><span class='comma'>,</span> <span class='label'>col_sep:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>converters:</span> <span class='kw'>nil</span><span class='rparen'>)</span>
229
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_file_path'>file_path</span> <span class='op'>=</span> <span class='id identifier rubyid_file_path'>file_path</span>
230
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span> <span class='op'>=</span> <span class='id identifier rubyid_headers'>headers</span>
231
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_col_sep'>col_sep</span> <span class='op'>=</span> <span class='id identifier rubyid_col_sep'>col_sep</span>
232
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_converters'>converters</span> <span class='op'>=</span> <span class='id identifier rubyid_converters'>converters</span>
233
+ <span class='kw'>end</span>
234
+
235
+ <span class='id identifier rubyid_private'>private</span>
236
+
237
+ <span class='comment'># private business methods...
238
+ </span>
239
+ <span class='kw'>def</span> <span class='id identifier rubyid_file_path='>file_path=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
240
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_is_?'>is_?</span><span class='lparen'>(</span><span class='const'>String</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_match?'>match?</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>.+\.csv</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span>
241
+
242
+ <span class='ivar'>@file_path</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
243
+ <span class='kw'>end</span>
244
+
245
+ <span class='kw'>def</span> <span class='id identifier rubyid_headers='>headers=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
246
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='lbracket'>[</span><span class='kw'>true</span><span class='comma'>,</span> <span class='kw'>false</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
247
+
248
+ <span class='ivar'>@headers</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
249
+ <span class='kw'>end</span>
250
+
251
+ <span class='kw'>def</span> <span class='id identifier rubyid_col_sep='>col_sep=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
252
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_is_?'>is_?</span><span class='lparen'>(</span><span class='const'>String</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\t</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>|</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
253
+
254
+ <span class='ivar'>@col_sep</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
255
+ <span class='kw'>end</span>
256
+
257
+ <span class='kw'>def</span> <span class='id identifier rubyid_converters='>converters=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
258
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_is_?'>is_?</span><span class='lparen'>(</span><span class='const'>Symbol</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span><span class='lparen'>(</span><span class='qsymbols_beg'>%i[</span><span class='tstring_content'>integer</span><span class='words_sep'> </span><span class='tstring_content'>float</span><span class='words_sep'> </span><span class='tstring_content'>date</span><span class='tstring_end'>]</span></span><span class='rparen'>)</span>
259
+
260
+ <span class='ivar'>@converters</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
261
+ <span class='kw'>end</span>
262
+ <span class='kw'>end</span>
263
+ </code></pre>
264
+
265
+ <h3 id="after-refactor-with-otoroshi-5-lines-351-characters-dedicated-to-properties">After refactor with Otoroshi (5 lines / 351 characters dedicated to properties)</h3>
266
+
267
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Importer</span>
268
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Otoroshi.html" title="Otoroshi (module)">Otoroshi</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Otoroshi/Sanctuary.html" title="Otoroshi::Sanctuary (module)">Sanctuary</a></span></span>
269
+
270
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:file_path</span><span class='comma'>,</span> <span class='const'>String</span><span class='comma'>,</span> <span class='label'>validate:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span><span class='period'>.</span><span class='id identifier rubyid_match?'>match?</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>.+\.csv</span><span class='regexp_end'>/</span></span> <span class='rbrace'>}</span>
271
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:headers</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='const'>TrueClass</span><span class='comma'>,</span> <span class='const'>FalseClass</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='label'>default:</span> <span class='kw'>false</span>
272
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:col_sep</span><span class='comma'>,</span> <span class='const'>String</span><span class='comma'>,</span> <span class='label'>validate:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>;</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>\t</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>|</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>default:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span>
273
+ <span class='id identifier rubyid_property'>property</span> <span class='symbol'>:converters</span><span class='comma'>,</span> <span class='const'>Symbol</span><span class='comma'>,</span> <span class='label'>validate:</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_v'>v</span><span class='period'>.</span><span class='id identifier rubyid_in?'>in?</span> <span class='qsymbols_beg'>%i[</span><span class='tstring_content'>integer</span><span class='words_sep'> </span><span class='tstring_content'>float</span><span class='words_sep'> </span><span class='tstring_content'>date</span><span class='tstring_end'>]</span></span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='label'>allow_nil:</span> <span class='kw'>true</span>
274
+
275
+ <span class='id identifier rubyid_private'>private</span>
276
+
277
+ <span class='comment'># private business methods...
278
+ </span><span class='kw'>end</span>
279
+ </code></pre>
280
+ </div></div>
281
+
282
+ <div id="footer">
283
+ Generated on Wed Oct 14 00:24:01 2020 by
284
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
285
+ 0.9.25 (ruby-2.6.6).
286
+ </div>
287
+
288
+ </div>
289
+ </body>
290
+ </html>