qo 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +40 -84
- data/docs/Qo.html +4 -9
- data/docs/Qo/Exceptions.html +3 -3
- data/docs/Qo/Exceptions/MultipleElseClauses.html +257 -0
- data/docs/Qo/Exceptions/MultipleMatchersProvided.html +2 -2
- data/docs/Qo/Exceptions/NoMatchersProvided.html +2 -2
- data/docs/Qo/Exceptions/NotAllGuardMatchersProvided.html +2 -2
- data/docs/Qo/Helpers.html +2 -2
- data/docs/Qo/Matchers.html +4 -4
- data/docs/Qo/Matchers/ArrayMatcher.html +2 -2
- data/docs/Qo/Matchers/BaseMatcher.html +2 -2
- data/docs/Qo/Matchers/GuardBlockMatcher.html +2 -2
- data/docs/Qo/Matchers/HashMatcher.html +2 -2
- data/docs/Qo/Matchers/PatternMatch.html +2 -2
- data/docs/Qo/Matchers/PatternMatchBlock.html +832 -0
- data/docs/Qo/PublicApi.html +77 -19
- data/docs/_index.html +16 -2
- data/docs/class_list.html +1 -1
- data/docs/file.README.html +92 -78
- data/docs/img/qo_logo.png +0 -0
- data/docs/img/whoa_lemur.png +0 -0
- data/docs/index.html +92 -78
- data/docs/method_list.html +77 -29
- data/docs/top-level-namespace.html +2 -2
- data/img/qo_logo.png +0 -0
- data/lib/qo.rb +3 -2
- data/lib/qo/matchers/array_matcher.rb +0 -1
- data/lib/qo/matchers/base_matcher.rb +0 -12
- data/lib/qo/matchers/hash_matcher.rb +0 -2
- data/lib/qo/version.rb +1 -1
- data/performance_report.txt +37 -37
- data/qo.gemspec +2 -0
- metadata +19 -2
data/docs/img/qo_logo.png
CHANGED
Binary file
|
Binary file
|
data/docs/index.html
CHANGED
@@ -63,10 +63,12 @@
|
|
63
63
|
<a href="https://codeclimate.com/github/baweaver/qo/maintainability"><img src="https://api.codeclimate.com/v1/badges/186e9cbb7003842acaf0/maintainability" alt="Maintainability"></a>
|
64
64
|
<a href="https://badge.fury.io/rb/qo"><img src="https://badge.fury.io/rb/qo.svg" alt="Gem Version"></a></p>
|
65
65
|
|
66
|
-
<p>Short for Query Object, my play at Ruby pattern matching and fluent querying
|
66
|
+
<p>Short for Query Object, my play at Ruby pattern matching and fluent querying, <a href="img/whoa_lemur.png">pronounced "Q-whoah"</a>.</p>
|
67
67
|
|
68
68
|
<p><img src="img/qo_logo.png" alt="Qo Lemur logo"></p>
|
69
69
|
|
70
|
+
<p><a href="https://baweaver.github.io/qo/">Read the Docs for more detailed information</a></p>
|
71
|
+
|
70
72
|
<h2>How does it work?</h2>
|
71
73
|
|
72
74
|
<p>Mostly by using Ruby language features like <code>to_proc</code> and <code>===</code>.</p>
|
@@ -87,33 +89,60 @@
|
|
87
89
|
|
88
90
|
<h2>Usage</h2>
|
89
91
|
|
92
|
+
<p>Note that Qo uses the <a href="https://www.github.com/baweaver/any">Any</a> gem for wildcard matching. Any will respond true to any <code>==</code> or <code>===</code> query against it,
|
93
|
+
and is included in the gem.</p>
|
94
|
+
|
90
95
|
<h3>Quick Start</h3>
|
91
96
|
|
92
97
|
<p>Qo is used for pattern matching in Ruby. All Qo matchers respond to <code>===</code> and <code>to_proc</code> meaning they can be used with <code>case</code> and Enumerable functions alike:</p>
|
93
98
|
|
94
99
|
<pre class="code ruby"><code class="ruby"><span class='kw'>case</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Foo</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>42</span><span class='rbracket'>]</span>
|
95
|
-
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
100
|
+
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='int'>42</span><span class='rbracket'>]</span> <span class='kw'>then</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Truly the one answer</span><span class='tstring_end'>'</span></span>
|
96
101
|
<span class='kw'>else</span> <span class='kw'>nil</span>
|
97
102
|
<span class='kw'>end</span>
|
98
103
|
|
99
104
|
<span class='comment'># Run a select like an AR query, getting the age attribute against a range
|
100
105
|
</span><span class='id identifier rubyid_people'>people</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='label'>age:</span> <span class='int'>18</span><span class='op'>..</span><span class='int'>30</span><span class='rbracket'>]</span><span class='rparen'>)</span>
|
106
|
+
</code></pre>
|
107
|
+
|
108
|
+
<p>How about some pattern matching? There are two styles:</p>
|
109
|
+
|
110
|
+
<h4>Pattern Match</h4>
|
111
|
+
|
112
|
+
<p>The original style</p>
|
101
113
|
|
102
|
-
<span class='comment'># How about some "right-hand assignment" pattern matching
|
114
|
+
<pre class="code ruby"><code class="ruby"><span class='comment'># How about some "right-hand assignment" pattern matching
|
103
115
|
</span><span class='id identifier rubyid_name_longer_than_three'>name_longer_than_three</span> <span class='op'>=</span> <span class='tlambda'>-></span> <span class='id identifier rubyid_person'>person</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span> <span class='op'>></span> <span class='int'>3</span> <span class='rbrace'>}</span>
|
104
116
|
<span class='id identifier rubyid_people_with_truncated_names'>people_with_truncated_names</span> <span class='op'>=</span> <span class='id identifier rubyid_people'>people</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_match'><span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">match</a></span></span><span class='lparen'>(</span>
|
105
117
|
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='id identifier rubyid_name_longer_than_three'>name_longer_than_three</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_person'>person</span><span class='op'>|</span> <span class='const'>Person</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='int'>2</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_age'>age</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='comma'>,</span>
|
106
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='
|
118
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Any</span><span class='rparen'>)</span> <span class='comment'># Identity function, catch-all
|
107
119
|
</span><span class='rparen'>)</span><span class='rparen'>)</span>
|
108
120
|
|
109
121
|
<span class='comment'># And standalone like a case:
|
110
122
|
</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_match'><span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">match</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_people'>people</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='comma'>,</span>
|
111
123
|
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='label'>age:</span> <span class='int'>10</span><span class='op'>..</span><span class='int'>19</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_person'>person</span><span class='op'>|</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'> is a teen that's </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_age'>age</span><span class='embexpr_end'>}</span><span class='tstring_content'> years old</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span><span class='comma'>,</span>
|
112
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='
|
124
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Any</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_person'>person</span><span class='op'>|</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'> is </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_age'>age</span><span class='embexpr_end'>}</span><span class='tstring_content'> years old</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span>
|
113
125
|
<span class='rparen'>)</span>
|
114
126
|
</code></pre>
|
115
127
|
|
116
|
-
<
|
128
|
+
<h4>Pattern Match Block</h4>
|
129
|
+
|
130
|
+
<p>The new style, likely to take over in <code>v1.0.0</code> after testing:</p>
|
131
|
+
|
132
|
+
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_name_longer_than_three'>name_longer_than_three</span> <span class='op'>=</span> <span class='tlambda'>-></span> <span class='id identifier rubyid_person'>person</span> <span class='tlambeg'>{</span> <span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span> <span class='op'>></span> <span class='int'>3</span> <span class='rbrace'>}</span>
|
133
|
+
<span class='id identifier rubyid_people_with_truncated_names'>people_with_truncated_names</span> <span class='op'>=</span> <span class='id identifier rubyid_people'>people</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_match'><span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">match</a></span></span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_m'>m</span><span class='op'>|</span>
|
134
|
+
<span class='id identifier rubyid_m'>m</span><span class='period'>.</span><span class='id identifier rubyid_when'>when</span><span class='lparen'>(</span><span class='id identifier rubyid_name_longer_than_three'>name_longer_than_three</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_person'>person</span><span class='op'>|</span> <span class='const'>Person</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='int'>2</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_age'>age</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
|
135
|
+
<span class='id identifier rubyid_m'>m</span><span class='period'>.</span><span class='id identifier rubyid_else'>else</span><span class='lparen'>(</span><span class='op'>&</span><span class='symbol'>:itself</span><span class='rparen'>)</span>
|
136
|
+
<span class='rbrace'>}</span><span class='rparen'>)</span>
|
137
|
+
|
138
|
+
<span class='comment'># And standalone like a case:
|
139
|
+
</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_match'><span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">match</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_people'>people</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_m'>m</span><span class='op'>|</span>
|
140
|
+
<span class='id identifier rubyid_m'>m</span><span class='period'>.</span><span class='id identifier rubyid_when'>when</span><span class='lparen'>(</span><span class='label'>age:</span> <span class='int'>10</span><span class='op'>..</span><span class='int'>19</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_person'>person</span><span class='op'>|</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'> is a teen that's </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_age'>age</span><span class='embexpr_end'>}</span><span class='tstring_content'> years old</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span>
|
141
|
+
<span class='id identifier rubyid_m'>m</span><span class='period'>.</span><span class='id identifier rubyid_else'>else</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_person'>person</span><span class='op'>|</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'> is </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_age'>age</span><span class='embexpr_end'>}</span><span class='tstring_content'> years old</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span>
|
142
|
+
<span class='rbrace'>}</span>
|
143
|
+
</code></pre>
|
144
|
+
|
145
|
+
<p>(More details coming on the difference and planned 1.0.0 APIs)</p>
|
117
146
|
|
118
147
|
<h3>Qo'isms</h3>
|
119
148
|
|
@@ -157,14 +186,14 @@
|
|
157
186
|
|
158
187
|
<h3>1 - Wildcard Matching</h3>
|
159
188
|
|
160
|
-
<p>Qo has a concept of a Wildcard, <code
|
189
|
+
<p>Qo has a concept of a Wildcard, <code>Any</code>, which will match against any value</p>
|
161
190
|
|
162
|
-
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
191
|
+
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='const'>Any</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Robert</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span> <span class='comment'># true
|
163
192
|
</span></code></pre>
|
164
193
|
|
165
194
|
<p>A single wildcard will match anything, and can frequently be used as an always true:</p>
|
166
195
|
|
167
|
-
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
196
|
+
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='symbol'>:literally_anything_here</span>
|
168
197
|
</code></pre>
|
169
198
|
|
170
199
|
<h3>2 - Array Matching</h3>
|
@@ -181,62 +210,40 @@
|
|
181
210
|
<p>When an Array matcher is run against an Array, it will compare elements by index in the following priority:</p>
|
182
211
|
|
183
212
|
<ol>
|
184
|
-
<li>Was a wildcard provided?</li>
|
185
213
|
<li>Does it case match (<code>===</code>)?</li>
|
186
214
|
<li>Does it have a predicate method by that name that matches?</li>
|
187
215
|
</ol>
|
188
216
|
|
189
217
|
<p>This functionality is left biased and permissive, meaning that if the right side of the argument is longer it will ignore those items in the match. If it's shorter? Not so much.</p>
|
190
218
|
|
191
|
-
<h5>2.1.1 -
|
192
|
-
|
193
|
-
<pre class="code ruby"><code class="ruby"><span class='comment'># Standalone
|
194
|
-
</span>
|
195
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='symbol'>:*</span><span class='comma'>,</span> <span class='symbol'>:*</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Robert</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span>
|
196
|
-
<span class='comment'># => true
|
197
|
-
</span>
|
198
|
-
<span class='comment'># Case statement
|
199
|
-
</span>
|
200
|
-
<span class='kw'>case</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Roberta</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span>
|
201
|
-
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='symbol'>:*</span><span class='comma'>,</span> <span class='symbol'>:*</span><span class='rbracket'>]</span> <span class='kw'>then</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>it matched</span><span class='tstring_end'>'</span></span>
|
202
|
-
<span class='kw'>else</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>will not ever be reached</span><span class='tstring_end'>'</span></span>
|
203
|
-
<span class='kw'>end</span>
|
204
|
-
<span class='comment'># => 'it matched'
|
205
|
-
</span>
|
206
|
-
<span class='comment'># Select
|
207
|
-
</span>
|
208
|
-
<span class='id identifier rubyid_people_arrays'>people_arrays</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='symbol'>:*</span><span class='comma'>,</span> <span class='symbol'>:*</span><span class='rbracket'>]</span><span class='rparen'>)</span>
|
209
|
-
<span class='comment'># => [['Robert', 22], ['Roberta', 22], ['Foo', 42], ['Bar', 18]]
|
210
|
-
</span></code></pre>
|
211
|
-
|
212
|
-
<h5>2.1.2 - Case Match present</h5>
|
219
|
+
<h5>2.1.1 - Case Match present</h5>
|
213
220
|
|
214
221
|
<p>We've seen some case matching so far with <code>Range</code> and <code>Regex</code>:</p>
|
215
222
|
|
216
223
|
<pre class="code ruby"><code class="ruby"><span class='comment'># Standalone
|
217
224
|
</span>
|
218
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>Rob</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='
|
225
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>Rob</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='const'>Any</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Robert</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span>
|
219
226
|
<span class='comment'># => true
|
220
227
|
</span>
|
221
228
|
<span class='comment'># Case statement
|
222
229
|
</span>
|
223
230
|
<span class='kw'>case</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Roberta</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span>
|
224
|
-
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
225
|
-
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
226
|
-
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
231
|
+
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='int'>0</span><span class='op'>..</span><span class='int'>9</span><span class='rbracket'>]</span> <span class='kw'>then</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>child</span><span class='tstring_end'>'</span></span>
|
232
|
+
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='int'>10</span><span class='op'>..</span><span class='int'>19</span><span class='rbracket'>]</span> <span class='kw'>then</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>teen</span><span class='tstring_end'>'</span></span>
|
233
|
+
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='int'>20</span><span class='op'>..</span><span class='int'>99</span><span class='rbracket'>]</span> <span class='kw'>then</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>adult</span><span class='tstring_end'>'</span></span>
|
227
234
|
<span class='kw'>else</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>not sure</span><span class='tstring_end'>'</span></span>
|
228
235
|
<span class='kw'>end</span>
|
229
236
|
<span class='comment'># => 'adult'
|
230
237
|
</span>
|
231
238
|
<span class='comment'># Select
|
232
239
|
</span>
|
233
|
-
<span class='id identifier rubyid_people_arrays'>people_arrays</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
240
|
+
<span class='id identifier rubyid_people_arrays'>people_arrays</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='int'>10</span><span class='op'>..</span><span class='int'>19</span><span class='rbracket'>]</span><span class='rparen'>)</span>
|
234
241
|
<span class='comment'># => [['Bar', 18]]
|
235
242
|
</span></code></pre>
|
236
243
|
|
237
|
-
<h5>2.1.
|
244
|
+
<h5>2.1.2 - Predicate Method matched</h5>
|
238
245
|
|
239
|
-
<p>If no
|
246
|
+
<p>If no case match is found, it will attempt to see if a predicate method by the same name exists, call it, and check the result:</p>
|
240
247
|
|
241
248
|
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_dirty_values'>dirty_values</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='kw'>nil</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='kw'>true</span><span class='rbracket'>]</span>
|
242
249
|
|
@@ -248,14 +255,14 @@
|
|
248
255
|
<span class='comment'># Case statement
|
249
256
|
</span>
|
250
257
|
<span class='kw'>case</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Roberta</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='kw'>nil</span><span class='rbracket'>]</span>
|
251
|
-
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
258
|
+
<span class='kw'>when</span> <span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='symbol'>:nil?</span><span class='rbracket'>]</span> <span class='kw'>then</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>no age</span><span class='tstring_end'>'</span></span>
|
252
259
|
<span class='kw'>else</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>not sure</span><span class='tstring_end'>'</span></span>
|
253
260
|
<span class='kw'>end</span>
|
254
261
|
<span class='comment'># => 'no age'
|
255
262
|
</span>
|
256
263
|
<span class='comment'># Select
|
257
264
|
</span>
|
258
|
-
<span class='id identifier rubyid_people_arrays'>people_arrays</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='
|
265
|
+
<span class='id identifier rubyid_people_arrays'>people_arrays</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='const'>Any</span><span class='comma'>,</span> <span class='symbol'>:even?</span><span class='rbracket'>]</span><span class='rparen'>)</span>
|
259
266
|
<span class='comment'># => [["Robert", 22], ["Roberta", 22], ["Foo", 42], ["Bar", 18]]
|
260
267
|
</span></code></pre>
|
261
268
|
|
@@ -264,21 +271,13 @@
|
|
264
271
|
<p>When an Array matcher is matched against anything other than an Array it will follow the priority:</p>
|
265
272
|
|
266
273
|
<ol>
|
267
|
-
<li>Was a wildcard provided?</li>
|
268
274
|
<li>Does it case match (<code>===</code>)?</li>
|
269
275
|
<li>Does it have a predicate method by that name that matches?</li>
|
270
276
|
</ol>
|
271
277
|
|
272
278
|
<p>Every argument provided will be run against the target object.</p>
|
273
279
|
|
274
|
-
<h5>2.2.1 -
|
275
|
-
|
276
|
-
<p>A wildcard in an Array to Object match is functionally an always true, but can be used as such:</p>
|
277
|
-
|
278
|
-
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='symbol'>:*</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='symbol'>:literally_anything_here</span>
|
279
|
-
</code></pre>
|
280
|
-
|
281
|
-
<h5>2.2.2 - Case Match present</h5>
|
280
|
+
<h5>2.2.1 - Case Match present</h5>
|
282
281
|
|
283
282
|
<pre class="code ruby"><code class="ruby"><span class='comment'># Standalone
|
284
283
|
</span>
|
@@ -293,7 +292,7 @@
|
|
293
292
|
<span class='comment'># => [10, "string"]
|
294
293
|
</span></code></pre>
|
295
294
|
|
296
|
-
<h5>2.2.
|
295
|
+
<h5>2.2.2 - Predicate Method matched</h5>
|
297
296
|
|
298
297
|
<p>Now this is where some of the fun starts in</p>
|
299
298
|
|
@@ -325,7 +324,6 @@
|
|
325
324
|
<ol>
|
326
325
|
<li>Does the key exist on the other hash?</li>
|
327
326
|
<li>Are the match value and match target hashes?</li>
|
328
|
-
<li>Was a wildcard value provided?</li>
|
329
327
|
<li>Does the target object's value case match against the match value?</li>
|
330
328
|
<li>Does the target object's value predicate match against the match value?</li>
|
331
329
|
<li>What about the String version of the match key? Abort if it can't coerce.</li>
|
@@ -375,15 +373,7 @@
|
|
375
373
|
<span class='rbrace'>}</span><span class='rparen'>)</span>
|
376
374
|
</code></pre>
|
377
375
|
|
378
|
-
<h5>3.1.3 -
|
379
|
-
|
380
|
-
<p>As with other wildcards, if the value matched against is a wildcard it'll always get through:</p>
|
381
|
-
|
382
|
-
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='lbracket'>[</span><span class='label'>name:</span> <span class='symbol'>:*</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='lbrace'>{</span><span class='label'>name:</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Foo</span><span class='tstring_end'>'</span></span><span class='rbrace'>}</span>
|
383
|
-
<span class='comment'># => true
|
384
|
-
</span></code></pre>
|
385
|
-
|
386
|
-
<h5>3.1.4 - Case match present</h5>
|
376
|
+
<h5>3.1.3 - Case match present</h5>
|
387
377
|
|
388
378
|
<p>If a case match is present for the key, it'll try and compare:</p>
|
389
379
|
|
@@ -407,7 +397,7 @@
|
|
407
397
|
<span class='comment'># => [{:name=>"Robert", :age=>22}, {:name=>"Roberta", :age=>22}, {:name=>"Bar", :age=>18}]
|
408
398
|
</span></code></pre>
|
409
399
|
|
410
|
-
<h5>3.1.
|
400
|
+
<h5>3.1.4 - Predicate match present</h5>
|
411
401
|
|
412
402
|
<p>Much like our array friend above, if a predicate style method is present see if it'll work</p>
|
413
403
|
|
@@ -433,7 +423,7 @@
|
|
433
423
|
|
434
424
|
<p>Careful though, if the key doesn't exist that won't match. I'll have to consider this one later.</p>
|
435
425
|
|
436
|
-
<h5>3.1.
|
426
|
+
<h5>3.1.5 - String variant present</h5>
|
437
427
|
|
438
428
|
<p>Coerces the key into a string if possible, and sees if that can provide a valid case match</p>
|
439
429
|
|
@@ -441,7 +431,6 @@
|
|
441
431
|
|
442
432
|
<ol>
|
443
433
|
<li>Does the object respond to the match key?</li>
|
444
|
-
<li>Was a wildcard value provided?</li>
|
445
434
|
<li>Does the result of sending the match key as a method case match the provided value?</li>
|
446
435
|
<li>Does a predicate method exist for it?</li>
|
447
436
|
</ol>
|
@@ -450,11 +439,7 @@
|
|
450
439
|
|
451
440
|
<p>If it doesn't know how to deal with it, false out.</p>
|
452
441
|
|
453
|
-
<h5>3.2.2 -
|
454
|
-
|
455
|
-
<p>Same as other wildcards, but if the object doesn't respond to the method you specify it'll have false'd out before it reaches here.</p>
|
456
|
-
|
457
|
-
<h5>3.2.3 - Case match present</h5>
|
442
|
+
<h5>3.2.2 - Case match present</h5>
|
458
443
|
|
459
444
|
<p>This is where we can get into some interesting code, much like the hash selections above</p>
|
460
445
|
|
@@ -477,7 +462,7 @@
|
|
477
462
|
<span class='comment'># => [Person(Robert, 22), Person(Roberta, 22)]
|
478
463
|
</span></code></pre>
|
479
464
|
|
480
|
-
<h5>3.2.
|
465
|
+
<h5>3.2.3 - Predicate match present</h5>
|
481
466
|
|
482
467
|
<pre class="code ruby"><code class="ruby"><span class='comment'># Standalone
|
483
468
|
</span>
|
@@ -503,15 +488,15 @@
|
|
503
488
|
<p>This is where I start going a bit off into the weeds. We're going to try and get RHA style pattern matching in Ruby.</p>
|
504
489
|
|
505
490
|
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_match'><span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">match</a></span></span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Robert</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span><span class='comma'>,</span>
|
506
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='
|
507
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='
|
491
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Any</span><span class='comma'>,</span> <span class='int'>20</span><span class='op'>..</span><span class='int'>99</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_n'>n</span><span class='comma'>,</span> <span class='id identifier rubyid_a'>a</span><span class='op'>|</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_n'>n</span><span class='embexpr_end'>}</span><span class='tstring_content'> is an adult that is </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_a'>a</span><span class='embexpr_end'>}</span><span class='tstring_content'> years old</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span><span class='comma'>,</span>
|
492
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Any</span><span class='rparen'>)</span>
|
508
493
|
<span class='rparen'>)</span>
|
509
494
|
<span class='comment'># => "Robert is an adult that is 22 years old"
|
510
495
|
</span></code></pre>
|
511
496
|
|
512
497
|
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_match'><span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">match</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_people_objects'>people_objects</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='comma'>,</span>
|
513
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='label'>name:</span> <span class='
|
514
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='
|
498
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='label'>name:</span> <span class='const'>Any</span><span class='comma'>,</span> <span class='label'>age:</span> <span class='int'>20</span><span class='op'>..</span><span class='int'>99</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_person'>person</span><span class='op'>|</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'> is an adult that is </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_age'>age</span><span class='embexpr_end'>}</span><span class='tstring_content'> years old</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span><span class='comma'>,</span>
|
499
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Any</span><span class='rparen'>)</span>
|
515
500
|
<span class='rparen'>)</span>
|
516
501
|
</code></pre>
|
517
502
|
|
@@ -533,7 +518,7 @@
|
|
533
518
|
<span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='op'>=</span> <span class='id identifier rubyid_person'>person</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='int'>2</span><span class='rbracket'>]</span>
|
534
519
|
<span class='id identifier rubyid_person'>person</span>
|
535
520
|
<span class='rbrace'>}</span><span class='comma'>,</span>
|
536
|
-
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='
|
521
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Any</span><span class='rparen'>)</span>
|
537
522
|
<span class='rparen'>)</span><span class='rparen'>)</span>
|
538
523
|
|
539
524
|
<span class='comment'># => [Person(age: 22, name: "Rob"), Person(age: 22, name: "Rob"), Person(age: 42, name: "Foo"), Person(age: 17, name: "Bar")]
|
@@ -582,7 +567,7 @@
|
|
582
567
|
|
583
568
|
<p>These examples will grow over the next few weeks as I think of more fun things to do with Qo. PRs welcome if you find fun uses!</p>
|
584
569
|
|
585
|
-
<h4>5.1 - JSON</h4>
|
570
|
+
<h4>5.1 - JSON and HTTP</h4>
|
586
571
|
|
587
572
|
<blockquote>
|
588
573
|
<p>Note that Qo does not support deep querying of hashes (yet)</p>
|
@@ -627,6 +612,35 @@
|
|
627
612
|
|
628
613
|
<p>Nifty!</p>
|
629
614
|
|
615
|
+
<h5>Yield Self HTTP status matching</h5>
|
616
|
+
|
617
|
+
<p>You can even use <code>#yield_self</code> to pipe values into a pattern matching block. In
|
618
|
+
this particular case it'll let you check against the type signatures of the
|
619
|
+
HTTP responses.</p>
|
620
|
+
|
621
|
+
<pre class="code ruby"><code class="ruby"><span class='kw'>def</span> <span class='id identifier rubyid_get_url'>get_url</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span>
|
622
|
+
<span class='const'>Net</span><span class='op'>::</span><span class='const'>HTTP</span><span class='period'>.</span><span class='id identifier rubyid_get_response'>get_response</span><span class='lparen'>(</span><span class='const'>URI</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_yield_self'>yield_self</span><span class='lparen'>(</span><span class='op'>&</span><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_match'><span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">match</a></span></span><span class='lparen'>(</span>
|
623
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Net</span><span class='op'>::</span><span class='const'>HTTPSuccess</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_response'>response</span><span class='op'>|</span> <span class='id identifier rubyid_response'>response</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span> <span class='rbrace'>}</span><span class='comma'>,</span>
|
624
|
+
<span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Any</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_response'>response</span><span class='op'>|</span> <span class='id identifier rubyid_raise'>raise</span> <span class='id identifier rubyid_response'>response</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span> <span class='rbrace'>}</span>
|
625
|
+
<span class='rparen'>)</span><span class='rparen'>)</span>
|
626
|
+
<span class='kw'>end</span>
|
627
|
+
|
628
|
+
<span class='id identifier rubyid_get_url'>get_url</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>https://github.com/baweaver/qo</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span>
|
629
|
+
<span class='comment'># => 142387
|
630
|
+
</span><span class='id identifier rubyid_get_url'>get_url</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>https://github.com/baweaver/qo/does_not_exist</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span>
|
631
|
+
<span class='comment'># => RuntimeError: Not Found
|
632
|
+
</span></code></pre>
|
633
|
+
|
634
|
+
<p>The difference between this and case? Well, the first is you can pass this to
|
635
|
+
<code>yield_self</code> for a more inline solution. The second is that any Qo matcher can
|
636
|
+
be used in there, including predicate and content checks on the body:</p>
|
637
|
+
|
638
|
+
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Qo.html" title="Qo (module)">Qo</a></span></span><span class='period'>.</span><span class='id identifier rubyid_m'>m</span><span class='lparen'>(</span><span class='const'>Net</span><span class='op'>::</span><span class='const'>HTTPSuccess</span><span class='comma'>,</span> <span class='label'>body:</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>Qo</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span>
|
639
|
+
</code></pre>
|
640
|
+
|
641
|
+
<p>You could put as many checks as you want in there, or use different Qo matchers
|
642
|
+
nested to get even further in.</p>
|
643
|
+
|
630
644
|
<h4>5.2 - Opsy Stuff</h4>
|
631
645
|
|
632
646
|
<h5>5.2.1 - NMap</h5>
|
@@ -691,9 +705,9 @@ hosts.select(&Qo[IPAddr.new('192.168.1.1/8')])
|
|
691
705
|
</div></div>
|
692
706
|
|
693
707
|
<div id="footer">
|
694
|
-
Generated on Sun
|
708
|
+
Generated on Sun Aug 5 20:52:09 2018 by
|
695
709
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
696
|
-
0.9.12 (ruby-2.
|
710
|
+
0.9.12 (ruby-2.5.1).
|
697
711
|
</div>
|
698
712
|
|
699
713
|
</div>
|
data/docs/method_list.html
CHANGED
@@ -54,47 +54,47 @@
|
|
54
54
|
|
55
55
|
<li class="even ">
|
56
56
|
<div class="item">
|
57
|
-
<span class='object_link'><a href="Qo/Matchers/
|
58
|
-
<small>Qo::Matchers::
|
57
|
+
<span class='object_link'><a href="Qo/Matchers/BaseMatcher.html#call-instance_method" title="Qo::Matchers::BaseMatcher#call (method)">#call</a></span>
|
58
|
+
<small>Qo::Matchers::BaseMatcher</small>
|
59
59
|
</div>
|
60
60
|
</li>
|
61
61
|
|
62
62
|
|
63
63
|
<li class="odd ">
|
64
64
|
<div class="item">
|
65
|
-
<span class='object_link'><a href="Qo/Matchers/
|
66
|
-
<small>Qo::Matchers::
|
65
|
+
<span class='object_link'><a href="Qo/Matchers/PatternMatchBlock.html#call-instance_method" title="Qo::Matchers::PatternMatchBlock#call (method)">#call</a></span>
|
66
|
+
<small>Qo::Matchers::PatternMatchBlock</small>
|
67
67
|
</div>
|
68
68
|
</li>
|
69
69
|
|
70
70
|
|
71
71
|
<li class="even ">
|
72
72
|
<div class="item">
|
73
|
-
<span class='object_link'><a href="Qo/Matchers/
|
74
|
-
<small>Qo::Matchers::
|
73
|
+
<span class='object_link'><a href="Qo/Matchers/PatternMatch.html#call-instance_method" title="Qo::Matchers::PatternMatch#call (method)">#call</a></span>
|
74
|
+
<small>Qo::Matchers::PatternMatch</small>
|
75
75
|
</div>
|
76
76
|
</li>
|
77
77
|
|
78
78
|
|
79
79
|
<li class="odd ">
|
80
80
|
<div class="item">
|
81
|
-
<span class='object_link'><a href="Qo/Matchers/
|
82
|
-
<small>Qo::Matchers::
|
81
|
+
<span class='object_link'><a href="Qo/Matchers/ArrayMatcher.html#call-instance_method" title="Qo::Matchers::ArrayMatcher#call (method)">#call</a></span>
|
82
|
+
<small>Qo::Matchers::ArrayMatcher</small>
|
83
83
|
</div>
|
84
84
|
</li>
|
85
85
|
|
86
86
|
|
87
87
|
<li class="even ">
|
88
88
|
<div class="item">
|
89
|
-
<span class='object_link'><a href="Qo/
|
90
|
-
<small>Qo::
|
89
|
+
<span class='object_link'><a href="Qo/Matchers/HashMatcher.html#call-instance_method" title="Qo::Matchers::HashMatcher#call (method)">#call</a></span>
|
90
|
+
<small>Qo::Matchers::HashMatcher</small>
|
91
91
|
</div>
|
92
92
|
</li>
|
93
93
|
|
94
94
|
|
95
95
|
<li class="odd ">
|
96
96
|
<div class="item">
|
97
|
-
<span class='object_link'><a href="Qo/Helpers.html#
|
97
|
+
<span class='object_link'><a href="Qo/Helpers.html#count_by-instance_method" title="Qo::Helpers#count_by (method)">#count_by</a></span>
|
98
98
|
<small>Qo::Helpers</small>
|
99
99
|
</div>
|
100
100
|
</li>
|
@@ -102,13 +102,21 @@
|
|
102
102
|
|
103
103
|
<li class="even ">
|
104
104
|
<div class="item">
|
105
|
-
<span class='object_link'><a href="Qo/
|
106
|
-
<small>Qo::
|
105
|
+
<span class='object_link'><a href="Qo/Helpers.html#dig-instance_method" title="Qo::Helpers#dig (method)">#dig</a></span>
|
106
|
+
<small>Qo::Helpers</small>
|
107
107
|
</div>
|
108
108
|
</li>
|
109
109
|
|
110
110
|
|
111
111
|
<li class="odd ">
|
112
|
+
<div class="item">
|
113
|
+
<span class='object_link'><a href="Qo/Matchers/PatternMatchBlock.html#else-instance_method" title="Qo::Matchers::PatternMatchBlock#else (method)">#else</a></span>
|
114
|
+
<small>Qo::Matchers::PatternMatchBlock</small>
|
115
|
+
</div>
|
116
|
+
</li>
|
117
|
+
|
118
|
+
|
119
|
+
<li class="even ">
|
112
120
|
<div class="item">
|
113
121
|
<span class='object_link'><a href="Qo/Matchers/PatternMatch.html#initialize-instance_method" title="Qo::Matchers::PatternMatch#initialize (method)">#initialize</a></span>
|
114
122
|
<small>Qo::Matchers::PatternMatch</small>
|
@@ -116,7 +124,23 @@
|
|
116
124
|
</li>
|
117
125
|
|
118
126
|
|
127
|
+
<li class="odd ">
|
128
|
+
<div class="item">
|
129
|
+
<span class='object_link'><a href="Qo/Matchers/BaseMatcher.html#initialize-instance_method" title="Qo::Matchers::BaseMatcher#initialize (method)">#initialize</a></span>
|
130
|
+
<small>Qo::Matchers::BaseMatcher</small>
|
131
|
+
</div>
|
132
|
+
</li>
|
133
|
+
|
134
|
+
|
119
135
|
<li class="even ">
|
136
|
+
<div class="item">
|
137
|
+
<span class='object_link'><a href="Qo/Matchers/PatternMatchBlock.html#initialize-instance_method" title="Qo::Matchers::PatternMatchBlock#initialize (method)">#initialize</a></span>
|
138
|
+
<small>Qo::Matchers::PatternMatchBlock</small>
|
139
|
+
</div>
|
140
|
+
</li>
|
141
|
+
|
142
|
+
|
143
|
+
<li class="odd ">
|
120
144
|
<div class="item">
|
121
145
|
<span class='object_link'><a href="Qo/Matchers/GuardBlockMatcher.html#initialize-instance_method" title="Qo::Matchers::GuardBlockMatcher#initialize (method)">#initialize</a></span>
|
122
146
|
<small>Qo::Matchers::GuardBlockMatcher</small>
|
@@ -124,7 +148,7 @@
|
|
124
148
|
</li>
|
125
149
|
|
126
150
|
|
127
|
-
<li class="
|
151
|
+
<li class="even ">
|
128
152
|
<div class="item">
|
129
153
|
<span class='object_link'><a href="Qo/PublicApi.html#match-instance_method" title="Qo::PublicApi#match (method)">#match</a></span>
|
130
154
|
<small>Qo::PublicApi</small>
|
@@ -132,7 +156,7 @@
|
|
132
156
|
</li>
|
133
157
|
|
134
158
|
|
135
|
-
<li class="
|
159
|
+
<li class="odd ">
|
136
160
|
<div class="item">
|
137
161
|
<span class='object_link'><a href="Qo/PublicApi.html#matcher-instance_method" title="Qo::PublicApi#matcher (method)">#matcher</a></span>
|
138
162
|
<small>Qo::PublicApi</small>
|
@@ -140,7 +164,7 @@
|
|
140
164
|
</li>
|
141
165
|
|
142
166
|
|
143
|
-
<li class="
|
167
|
+
<li class="even ">
|
144
168
|
<div class="item">
|
145
169
|
<span class='object_link'><a href="Qo/PublicApi.html#not-instance_method" title="Qo::PublicApi#not (method)">#not</a></span>
|
146
170
|
<small>Qo::PublicApi</small>
|
@@ -148,7 +172,7 @@
|
|
148
172
|
</li>
|
149
173
|
|
150
174
|
|
151
|
-
<li class="
|
175
|
+
<li class="odd ">
|
152
176
|
<div class="item">
|
153
177
|
<span class='object_link'><a href="Qo/PublicApi.html#or-instance_method" title="Qo::PublicApi#or (method)">#or</a></span>
|
154
178
|
<small>Qo::PublicApi</small>
|
@@ -156,47 +180,63 @@
|
|
156
180
|
</li>
|
157
181
|
|
158
182
|
|
183
|
+
<li class="even ">
|
184
|
+
<div class="item">
|
185
|
+
<span class='object_link'><a href="Qo/Matchers/ArrayMatcher.html#to_proc-instance_method" title="Qo::Matchers::ArrayMatcher#to_proc (method)">#to_proc</a></span>
|
186
|
+
<small>Qo::Matchers::ArrayMatcher</small>
|
187
|
+
</div>
|
188
|
+
</li>
|
189
|
+
|
190
|
+
|
159
191
|
<li class="odd ">
|
160
192
|
<div class="item">
|
161
|
-
<span class='object_link'><a href="Qo/Matchers/
|
162
|
-
<small>Qo::Matchers::
|
193
|
+
<span class='object_link'><a href="Qo/Matchers/PatternMatch.html#to_proc-instance_method" title="Qo::Matchers::PatternMatch#to_proc (method)">#to_proc</a></span>
|
194
|
+
<small>Qo::Matchers::PatternMatch</small>
|
163
195
|
</div>
|
164
196
|
</li>
|
165
197
|
|
166
198
|
|
167
199
|
<li class="even ">
|
168
200
|
<div class="item">
|
169
|
-
<span class='object_link'><a href="Qo/Matchers/
|
170
|
-
<small>Qo::Matchers::
|
201
|
+
<span class='object_link'><a href="Qo/Matchers/HashMatcher.html#to_proc-instance_method" title="Qo::Matchers::HashMatcher#to_proc (method)">#to_proc</a></span>
|
202
|
+
<small>Qo::Matchers::HashMatcher</small>
|
171
203
|
</div>
|
172
204
|
</li>
|
173
205
|
|
174
206
|
|
175
207
|
<li class="odd ">
|
176
208
|
<div class="item">
|
177
|
-
<span class='object_link'><a href="Qo/Matchers/
|
178
|
-
<small>Qo::Matchers::
|
209
|
+
<span class='object_link'><a href="Qo/Matchers/GuardBlockMatcher.html#to_proc-instance_method" title="Qo::Matchers::GuardBlockMatcher#to_proc (method)">#to_proc</a></span>
|
210
|
+
<small>Qo::Matchers::GuardBlockMatcher</small>
|
179
211
|
</div>
|
180
212
|
</li>
|
181
213
|
|
182
214
|
|
183
215
|
<li class="even ">
|
184
216
|
<div class="item">
|
185
|
-
<span class='object_link'><a href="Qo/Matchers/
|
186
|
-
<small>Qo::Matchers::
|
217
|
+
<span class='object_link'><a href="Qo/Matchers/BaseMatcher.html#to_proc-instance_method" title="Qo::Matchers::BaseMatcher#to_proc (method)">#to_proc</a></span>
|
218
|
+
<small>Qo::Matchers::BaseMatcher</small>
|
187
219
|
</div>
|
188
220
|
</li>
|
189
221
|
|
190
222
|
|
191
223
|
<li class="odd ">
|
192
224
|
<div class="item">
|
193
|
-
<span class='object_link'><a href="Qo/Matchers/
|
194
|
-
<small>Qo::Matchers::
|
225
|
+
<span class='object_link'><a href="Qo/Matchers/PatternMatchBlock.html#to_proc-instance_method" title="Qo::Matchers::PatternMatchBlock#to_proc (method)">#to_proc</a></span>
|
226
|
+
<small>Qo::Matchers::PatternMatchBlock</small>
|
195
227
|
</div>
|
196
228
|
</li>
|
197
229
|
|
198
230
|
|
199
231
|
<li class="even ">
|
232
|
+
<div class="item">
|
233
|
+
<span class='object_link'><a href="Qo/Exceptions/MultipleElseClauses.html#to_s-instance_method" title="Qo::Exceptions::MultipleElseClauses#to_s (method)">#to_s</a></span>
|
234
|
+
<small>Qo::Exceptions::MultipleElseClauses</small>
|
235
|
+
</div>
|
236
|
+
</li>
|
237
|
+
|
238
|
+
|
239
|
+
<li class="odd ">
|
200
240
|
<div class="item">
|
201
241
|
<span class='object_link'><a href="Qo/Exceptions/NotAllGuardMatchersProvided.html#to_s-instance_method" title="Qo::Exceptions::NotAllGuardMatchersProvided#to_s (method)">#to_s</a></span>
|
202
242
|
<small>Qo::Exceptions::NotAllGuardMatchersProvided</small>
|
@@ -204,7 +244,7 @@
|
|
204
244
|
</li>
|
205
245
|
|
206
246
|
|
207
|
-
<li class="
|
247
|
+
<li class="even ">
|
208
248
|
<div class="item">
|
209
249
|
<span class='object_link'><a href="Qo/Exceptions/MultipleMatchersProvided.html#to_s-instance_method" title="Qo::Exceptions::MultipleMatchersProvided#to_s (method)">#to_s</a></span>
|
210
250
|
<small>Qo::Exceptions::MultipleMatchersProvided</small>
|
@@ -212,7 +252,7 @@
|
|
212
252
|
</li>
|
213
253
|
|
214
254
|
|
215
|
-
<li class="
|
255
|
+
<li class="odd ">
|
216
256
|
<div class="item">
|
217
257
|
<span class='object_link'><a href="Qo/Exceptions/NoMatchersProvided.html#to_s-instance_method" title="Qo::Exceptions::NoMatchersProvided#to_s (method)">#to_s</a></span>
|
218
258
|
<small>Qo::Exceptions::NoMatchersProvided</small>
|
@@ -220,6 +260,14 @@
|
|
220
260
|
</li>
|
221
261
|
|
222
262
|
|
263
|
+
<li class="even ">
|
264
|
+
<div class="item">
|
265
|
+
<span class='object_link'><a href="Qo/Matchers/PatternMatchBlock.html#when-instance_method" title="Qo::Matchers::PatternMatchBlock#when (method)">#when</a></span>
|
266
|
+
<small>Qo::Matchers::PatternMatchBlock</small>
|
267
|
+
</div>
|
268
|
+
</li>
|
269
|
+
|
270
|
+
|
223
271
|
|
224
272
|
</ul>
|
225
273
|
</div>
|