qo 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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</p>
66
+ <p>Short for Query Object, my play at Ruby pattern matching and fluent querying, <a href="img/whoa_lemur.png">pronounced &quot;Q-whoah&quot;</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'>&#39;</span><span class='tstring_content'>Foo</span><span class='tstring_end'>&#39;</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='symbol'>:*</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'>&#39;</span><span class='tstring_content'>Truly the one answer</span><span class='tstring_end'>&#39;</span></span>
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'>&#39;</span><span class='tstring_content'>Truly the one answer</span><span class='tstring_end'>&#39;</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'>&amp;</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 &quot;right-hand assignment&quot; pattern matching
114
+ <pre class="code ruby"><code class="ruby"><span class='comment'># How about some &quot;right-hand assignment&quot; 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'>-&gt;</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'>&gt;</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'>&amp;</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='symbol'>:*</span><span class='rparen'>)</span> <span class='comment'># Identity function, catch-all
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'>&quot;</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&#39;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'>&quot;</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='symbol'>:*</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'>&quot;</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'>&quot;</span></span> <span class='rbrace'>}</span>
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'>&quot;</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'>&quot;</span></span> <span class='rbrace'>}</span>
113
125
  <span class='rparen'>)</span>
114
126
  </code></pre>
115
127
 
116
- <p>Get a lot more expressiveness in your queries and transformations. Read on for the full details.</p>
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'>-&gt;</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'>&gt;</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'>&amp;</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'>&amp;</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'>&quot;</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&#39;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'>&quot;</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'>&quot;</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'>&quot;</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&#39;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>:*</code>, which will match against any value</p>
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='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'>&#39;</span><span class='tstring_content'>Robert</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span> <span class='comment'># true
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'>&#39;</span><span class='tstring_content'>Robert</span><span class='tstring_end'>&#39;</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='symbol'>:*</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='symbol'>:literally_anything_here</span>
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&#39;s shorter? Not so much.</p>
190
218
 
191
- <h5>2.1.1 - Wildcard provided</h5>
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'>&#39;</span><span class='tstring_content'>Robert</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span>
196
- <span class='comment'># =&gt; 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'>&#39;</span><span class='tstring_content'>Roberta</span><span class='tstring_end'>&#39;</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'>&#39;</span><span class='tstring_content'>it matched</span><span class='tstring_end'>&#39;</span></span>
202
- <span class='kw'>else</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>will not ever be reached</span><span class='tstring_end'>&#39;</span></span>
203
- <span class='kw'>end</span>
204
- <span class='comment'># =&gt; &#39;it matched&#39;
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'>&amp;</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'># =&gt; [[&#39;Robert&#39;, 22], [&#39;Roberta&#39;, 22], [&#39;Foo&#39;, 42], [&#39;Bar&#39;, 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&#39;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='symbol'>:*</span><span class='rbracket'>]</span> <span class='op'>===</span> <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Robert</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span>
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'>&#39;</span><span class='tstring_content'>Robert</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='int'>22</span><span class='rbracket'>]</span>
219
226
  <span class='comment'># =&gt; 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'>&#39;</span><span class='tstring_content'>Roberta</span><span class='tstring_end'>&#39;</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='symbol'>:*</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'>&#39;</span><span class='tstring_content'>child</span><span class='tstring_end'>&#39;</span></span>
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='symbol'>:*</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'>&#39;</span><span class='tstring_content'>teen</span><span class='tstring_end'>&#39;</span></span>
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='symbol'>:*</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'>&#39;</span><span class='tstring_content'>adult</span><span class='tstring_end'>&#39;</span></span>
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'>&#39;</span><span class='tstring_content'>child</span><span class='tstring_end'>&#39;</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'>&#39;</span><span class='tstring_content'>teen</span><span class='tstring_end'>&#39;</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'>&#39;</span><span class='tstring_content'>adult</span><span class='tstring_end'>&#39;</span></span>
227
234
  <span class='kw'>else</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>not sure</span><span class='tstring_end'>&#39;</span></span>
228
235
  <span class='kw'>end</span>
229
236
  <span class='comment'># =&gt; &#39;adult&#39;
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'>&amp;</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='int'>10</span><span class='op'>..</span><span class='int'>19</span><span class='rbracket'>]</span><span class='rparen'>)</span>
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'>&amp;</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'># =&gt; [[&#39;Bar&#39;, 18]]
235
242
  </span></code></pre>
236
243
 
237
- <h5>2.1.3 - Predicate Method matched</h5>
244
+ <h5>2.1.2 - Predicate Method matched</h5>
238
245
 
239
- <p>If no wildcard or 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>
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'>&#39;</span><span class='tstring_end'>&#39;</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'>&#39;</span><span class='tstring_content'>Roberta</span><span class='tstring_end'>&#39;</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='symbol'>:*</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'>&#39;</span><span class='tstring_content'>no age</span><span class='tstring_end'>&#39;</span></span>
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'>&#39;</span><span class='tstring_content'>no age</span><span class='tstring_end'>&#39;</span></span>
252
259
  <span class='kw'>else</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>not sure</span><span class='tstring_end'>&#39;</span></span>
253
260
  <span class='kw'>end</span>
254
261
  <span class='comment'># =&gt; &#39;no age&#39;
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'>&amp;</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'>:even?</span><span class='rbracket'>]</span><span class='rparen'>)</span>
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'>&amp;</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'># =&gt; [[&quot;Robert&quot;, 22], [&quot;Roberta&quot;, 22], [&quot;Foo&quot;, 42], [&quot;Bar&quot;, 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 - Wildcard provided</h5>
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'># =&gt; [10, &quot;string&quot;]
294
293
  </span></code></pre>
295
294
 
296
- <h5>2.2.3 - Predicate Method matched</h5>
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&#39;s value case match against the match value?</li>
330
328
  <li>Does the target object&#39;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&#39;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 - Wildcard provided</h5>
379
-
380
- <p>As with other wildcards, if the value matched against is a wildcard it&#39;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'>&#39;</span><span class='tstring_content'>Foo</span><span class='tstring_end'>&#39;</span></span><span class='rbrace'>}</span>
383
- <span class='comment'># =&gt; 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&#39;ll try and compare:</p>
389
379
 
@@ -407,7 +397,7 @@
407
397
  <span class='comment'># =&gt; [{:name=&gt;&quot;Robert&quot;, :age=&gt;22}, {:name=&gt;&quot;Roberta&quot;, :age=&gt;22}, {:name=&gt;&quot;Bar&quot;, :age=&gt;18}]
408
398
  </span></code></pre>
409
399
 
410
- <h5>3.1.5 - Predicate match present</h5>
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&#39;ll work</p>
413
403
 
@@ -433,7 +423,7 @@
433
423
 
434
424
  <p>Careful though, if the key doesn&#39;t exist that won&#39;t match. I&#39;ll have to consider this one later.</p>
435
425
 
436
- <h5>3.1.6 - String variant present</h5>
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&#39;t know how to deal with it, false out.</p>
452
441
 
453
- <h5>3.2.2 - Wildcard provided</h5>
454
-
455
- <p>Same as other wildcards, but if the object doesn&#39;t respond to the method you specify it&#39;ll have false&#39;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'># =&gt; [Person(Robert, 22), Person(Roberta, 22)]
478
463
  </span></code></pre>
479
464
 
480
- <h5>3.2.4 - Predicate match present</h5>
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&#39;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'>&#39;</span><span class='tstring_content'>Robert</span><span class='tstring_end'>&#39;</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='symbol'>:*</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'>&quot;</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'>&quot;</span></span> <span class='rbrace'>}</span><span class='comma'>,</span>
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='symbol'>:*</span><span class='rparen'>)</span>
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'>&quot;</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'>&quot;</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'># =&gt; &quot;Robert is an adult that is 22 years old&quot;
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='symbol'>:*</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'>&quot;</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'>&quot;</span></span> <span class='rbrace'>}</span><span class='comma'>,</span>
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='symbol'>:*</span><span class='rparen'>)</span>
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'>&quot;</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'>&quot;</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='symbol'>:*</span><span class='rparen'>)</span>
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'># =&gt; [Person(age: 22, name: &quot;Rob&quot;), Person(age: 22, name: &quot;Rob&quot;), Person(age: 42, name: &quot;Foo&quot;), Person(age: 17, name: &quot;Bar&quot;)]
@@ -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&#39;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'>&amp;</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'>&#39;</span><span class='tstring_content'>https://github.com/baweaver/qo</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
629
+ <span class='comment'># =&gt; 142387
630
+ </span><span class='id identifier rubyid_get_url'>get_url</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>https://github.com/baweaver/qo/does_not_exist</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
631
+ <span class='comment'># =&gt; 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(&amp;Qo[IPAddr.new(&#39;192.168.1.1/8&#39;)])
691
705
  </div></div>
692
706
 
693
707
  <div id="footer">
694
- Generated on Sun Apr 15 20:29:44 2018 by
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.4.4).
710
+ 0.9.12 (ruby-2.5.1).
697
711
  </div>
698
712
 
699
713
  </div>
@@ -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/HashMatcher.html#call-instance_method" title="Qo::Matchers::HashMatcher#call (method)">#call</a></span>
58
- <small>Qo::Matchers::HashMatcher</small>
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/ArrayMatcher.html#call-instance_method" title="Qo::Matchers::ArrayMatcher#call (method)">#call</a></span>
66
- <small>Qo::Matchers::ArrayMatcher</small>
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/BaseMatcher.html#call-instance_method" title="Qo::Matchers::BaseMatcher#call (method)">#call</a></span>
74
- <small>Qo::Matchers::BaseMatcher</small>
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/PatternMatch.html#call-instance_method" title="Qo::Matchers::PatternMatch#call (method)">#call</a></span>
82
- <small>Qo::Matchers::PatternMatch</small>
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/Helpers.html#count_by-instance_method" title="Qo::Helpers#count_by (method)">#count_by</a></span>
90
- <small>Qo::Helpers</small>
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#dig-instance_method" title="Qo::Helpers#dig (method)">#dig</a></span>
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/Matchers/BaseMatcher.html#initialize-instance_method" title="Qo::Matchers::BaseMatcher#initialize (method)">#initialize</a></span>
106
- <small>Qo::Matchers::BaseMatcher</small>
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="odd ">
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="even ">
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="odd ">
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="even ">
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/GuardBlockMatcher.html#to_proc-instance_method" title="Qo::Matchers::GuardBlockMatcher#to_proc (method)">#to_proc</a></span>
162
- <small>Qo::Matchers::GuardBlockMatcher</small>
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/BaseMatcher.html#to_proc-instance_method" title="Qo::Matchers::BaseMatcher#to_proc (method)">#to_proc</a></span>
170
- <small>Qo::Matchers::BaseMatcher</small>
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/HashMatcher.html#to_proc-instance_method" title="Qo::Matchers::HashMatcher#to_proc (method)">#to_proc</a></span>
178
- <small>Qo::Matchers::HashMatcher</small>
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/ArrayMatcher.html#to_proc-instance_method" title="Qo::Matchers::ArrayMatcher#to_proc (method)">#to_proc</a></span>
186
- <small>Qo::Matchers::ArrayMatcher</small>
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/PatternMatch.html#to_proc-instance_method" title="Qo::Matchers::PatternMatch#to_proc (method)">#to_proc</a></span>
194
- <small>Qo::Matchers::PatternMatch</small>
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="odd ">
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="even ">
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>