doc/Bauxite/Context.html in bauxite-0.2.0 vs doc/Bauxite/Context.html in bauxite-0.3.0
- old
+ new
@@ -293,26 +293,32 @@
</dd><dt>:wait
<dd>
<p>if <code>true</code>, call <a href="Context.html#method-c-wait">::wait</a>
before stopping the test engine with <a
href="Context.html#method-i-stop">stop</a> (defaults to <code>false</code>)</p>
+</dd><dt>:extensions
+<dd>
+<p>an array of directories that contain extensions to be loaded</p>
</dd></dl>
<div class="method-source-code" id="new-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 69</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 70</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span>)
<span class="ruby-ivar">@options</span> = <span class="ruby-identifier">options</span>
<span class="ruby-ivar">@driver_name</span> = (<span class="ruby-identifier">options</span>[<span class="ruby-value">:driver</span>] <span class="ruby-operator">||</span> <span class="ruby-value">:firefox</span>).<span class="ruby-identifier">to_sym</span>
<span class="ruby-ivar">@variables</span> = {
- <span class="ruby-string">'__TIMEOUT__'</span> =<span class="ruby-operator">></span> (<span class="ruby-identifier">options</span>[<span class="ruby-value">:timeout</span>] <span class="ruby-operator">||</span> <span class="ruby-value">10</span>).<span class="ruby-identifier">to_i</span>
+ <span class="ruby-string">'__TIMEOUT__'</span> =<span class="ruby-operator">></span> (<span class="ruby-identifier">options</span>[<span class="ruby-value">:timeout</span>] <span class="ruby-operator">||</span> <span class="ruby-value">10</span>).<span class="ruby-identifier">to_i</span>,
+ <span class="ruby-string">'__DEBUG__'</span> =<span class="ruby-operator">></span> <span class="ruby-keyword">false</span>
}
<span class="ruby-ivar">@aliases</span> = {}
<span class="ruby-ivar">@tests</span> = []
+ <span class="ruby-identifier">_load_extensions</span>(<span class="ruby-identifier">options</span>[<span class="ruby-value">:extensions</span>] <span class="ruby-operator">||</span> [])
+
<span class="ruby-identifier">handle_errors</span> <span class="ruby-keyword">do</span>
<span class="ruby-ivar">@logger</span> = <span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">load_logger</span>(<span class="ruby-identifier">options</span>[<span class="ruby-value">:logger</span>], <span class="ruby-identifier">options</span>[<span class="ruby-value">:logger_opt</span>])
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
@@ -356,11 +362,11 @@
<div class="method-source-code" id="debug-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 171</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 175</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">debug</span>
<span class="ruby-identifier">exec_action</span>(<span class="ruby-string">'debug'</span>, <span class="ruby-keyword">false</span>)
<span class="ruby-keyword">end</span></pre>
</div>
@@ -413,11 +419,11 @@
<div class="method-source-code" id="find-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 160</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 164</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">find</span>(<span class="ruby-identifier">selector</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span>) <span class="ruby-comment"># yields: element</span>
<span class="ruby-identifier">with_timeout</span> <span class="ruby-constant">Selenium</span><span class="ruby-operator">::</span><span class="ruby-constant">WebDriver</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span><span class="ruby-operator">::</span><span class="ruby-constant">NoSuchElementError</span> <span class="ruby-keyword">do</span>
<span class="ruby-constant">Selector</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword">self</span>).<span class="ruby-identifier">find</span>(<span class="ruby-identifier">selector</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
@@ -463,11 +469,11 @@
<div class="method-source-code" id="get_value-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 190</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 194</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">get_value</span>(<span class="ruby-identifier">element</span>)
<span class="ruby-keyword">if</span> [<span class="ruby-string">'input'</span>,<span class="ruby-string">'select'</span>,<span class="ruby-string">'textarea'</span>].<span class="ruby-identifier">include?</span> <span class="ruby-identifier">element</span>.<span class="ruby-identifier">tag_name</span>.<span class="ruby-identifier">downcase</span>
<span class="ruby-identifier">element</span>.<span class="ruby-identifier">attribute</span>(<span class="ruby-string">'value'</span>)
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">element</span>.<span class="ruby-identifier">text</span>
@@ -506,11 +512,11 @@
<div class="method-source-code" id="reset_driver-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 115</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 119</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">reset_driver</span>
<span class="ruby-ivar">@driver</span>.<span class="ruby-identifier">quit</span>
<span class="ruby-identifier">_load_driver</span>
<span class="ruby-keyword">end</span></pre>
</div>
@@ -555,11 +561,11 @@
<div class="method-source-code" id="start-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 97</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 101</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">start</span>(<span class="ruby-identifier">actions</span> = [])
<span class="ruby-identifier">_load_driver</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">actions</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-keyword">begin</span>
<span class="ruby-identifier">actions</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">action</span><span class="ruby-operator">|</span>
@@ -614,11 +620,11 @@
<div class="method-source-code" id="stop-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 135</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 139</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">stop</span>
<span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">wait</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-value">:wait</span>]
<span class="ruby-ivar">@driver</span>.<span class="ruby-identifier">quit</span>
<span class="ruby-keyword">end</span></pre>
</div>
@@ -680,11 +686,11 @@
<div class="method-source-code" id="load_logger-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 365</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 371</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">load_logger</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">options</span>)
<span class="ruby-identifier">log_name</span> = (<span class="ruby-identifier">name</span> <span class="ruby-operator">||</span> <span class="ruby-string">'null'</span>).<span class="ruby-identifier">downcase</span>
<span class="ruby-identifier">class_name</span> = <span class="ruby-node">"#{log_name.capitalize}Logger"</span>
@@ -737,11 +743,11 @@
<div class="method-source-code" id="parse_args-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 267</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 271</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">parse_args</span>(<span class="ruby-identifier">line</span>)
<span class="ruby-comment"># col_sep must be a regex because String.split has a special case for</span>
<span class="ruby-comment"># a single space char (' ') that produced unexpected results (i.e.</span>
<span class="ruby-comment"># if line is '"a b"' the resulting array contains ["a b"]).</span>
<span class="ruby-comment">#</span>
@@ -789,11 +795,11 @@
<div class="method-source-code" id="wait-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 358</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 364</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">wait</span>
<span class="ruby-constant">Readline</span>.<span class="ruby-identifier">readline</span>(<span class="ruby-string">"Press ENTER to continue\n"</span>)
<span class="ruby-keyword">end</span></pre>
</div>
@@ -841,11 +847,11 @@
<div class="method-source-code" id="exec_action-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 212</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 216</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">exec_action</span>(<span class="ruby-identifier">action</span>, <span class="ruby-identifier">log</span> = <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">if</span> (<span class="ruby-identifier">action</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>)
<span class="ruby-identifier">action</span> = { <span class="ruby-value">:text</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">action</span>, <span class="ruby-value">:file</span> =<span class="ruby-operator">></span> <span class="ruby-string">'<unknown>'</span>, <span class="ruby-value">:line</span> =<span class="ruby-operator">></span> <span class="ruby-value">0</span> }
<span class="ruby-keyword">end</span>
@@ -917,11 +923,11 @@
<div class="method-source-code" id="handle_errors-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 303</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 307</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">handle_errors</span>(<span class="ruby-identifier">break_into_debug</span> = <span class="ruby-keyword">false</span>, <span class="ruby-identifier">exit_on_error</span> = <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">yield</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@logger</span>
<span class="ruby-ivar">@logger</span>.<span class="ruby-identifier">log</span> <span class="ruby-node">"#{e.message}\n"</span>, <span class="ruby-value">:error</span>
@@ -930,17 +936,19 @@
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-value">:verbose</span>]
<span class="ruby-identifier">p</span> <span class="ruby-identifier">e</span>
<span class="ruby-identifier">puts</span> <span class="ruby-identifier">e</span>.<span class="ruby-identifier">backtrace</span>
<span class="ruby-keyword">end</span>
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">break_into_debug</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@options</span>[<span class="ruby-value">:debug</span>]
- <span class="ruby-identifier">debug</span>
- <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">exit_on_error</span>
- <span class="ruby-keyword">if</span> <span class="ruby-ivar">@variables</span>[<span class="ruby-string">'__RAISE_ERROR__'</span>]
- <span class="ruby-identifier">raise</span>
- <span class="ruby-keyword">else</span>
- <span class="ruby-identifier">exit</span> <span class="ruby-keyword">false</span>
+ <span class="ruby-keyword">unless</span> <span class="ruby-ivar">@variables</span>[<span class="ruby-string">'__DEBUG__'</span>]
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">break_into_debug</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@options</span>[<span class="ruby-value">:debug</span>]
+ <span class="ruby-identifier">debug</span>
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">exit_on_error</span>
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@variables</span>[<span class="ruby-string">'__RAISE_ERROR__'</span>]
+ <span class="ruby-identifier">raise</span>
+ <span class="ruby-keyword">else</span>
+ <span class="ruby-identifier">exit</span> <span class="ruby-keyword">false</span>
+ <span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
@@ -977,11 +985,11 @@
<div class="method-source-code" id="parse_file-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 247</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 251</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">parse_file</span>(<span class="ruby-identifier">file</span>)
<span class="ruby-keyword">if</span> (<span class="ruby-identifier">file</span> <span class="ruby-operator">==</span> <span class="ruby-string">'stdin'</span>)
<span class="ruby-identifier">_parse_file</span>(<span class="ruby-identifier">$stdin</span>, <span class="ruby-identifier">file</span>)
<span class="ruby-keyword">else</span>
<span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">file</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">io</span><span class="ruby-operator">|</span> <span class="ruby-identifier">_parse_file</span>(<span class="ruby-identifier">io</span>, <span class="ruby-identifier">file</span>) }
@@ -1025,11 +1033,11 @@
<div class="method-source-code" id="with_timeout-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 337</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 343</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">with_timeout</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">error_types</span>)
<span class="ruby-identifier">stime</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>
<span class="ruby-identifier">timeout</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">stime</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@variables</span>[<span class="ruby-string">'__TIMEOUT__'</span>]
<span class="ruby-keyword">yield</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-operator">*</span><span class="ruby-identifier">error_types</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
@@ -1106,11 +1114,11 @@
<div class="method-source-code" id="action_args-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 398</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 404</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">action_args</span>(<span class="ruby-identifier">action</span>)
<span class="ruby-identifier">action</span> <span class="ruby-operator">+=</span> <span class="ruby-string">'_action'</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">_action_methods</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">action</span>
<span class="ruby-constant">Action</span>.<span class="ruby-identifier">public_instance_method</span>(<span class="ruby-identifier">action</span>).<span class="ruby-identifier">parameters</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">att</span>, <span class="ruby-identifier">name</span><span class="ruby-operator">|</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">to_s</span> }
<span class="ruby-keyword">end</span></pre>
</div>
@@ -1146,11 +1154,11 @@
<div class="method-source-code" id="actions-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 388</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 394</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">actions</span>
<span class="ruby-identifier">_action_methods</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">m</span><span class="ruby-operator">|</span> <span class="ruby-identifier">m</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp">/_action$/</span>, <span class="ruby-string">''</span>) }
<span class="ruby-keyword">end</span></pre>
</div>
@@ -1185,11 +1193,11 @@
<div class="method-source-code" id="loggers-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 427</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 433</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">loggers</span>
<span class="ruby-constant">Loggers</span>.<span class="ruby-identifier">constants</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">l</span><span class="ruby-operator">|</span> <span class="ruby-identifier">l</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">downcase</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp">/logger$/</span>, <span class="ruby-string">''</span>) }
<span class="ruby-keyword">end</span></pre>
</div>
@@ -1227,11 +1235,11 @@
<div class="method-source-code" id="max_action_name_size-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 439</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 445</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">max_action_name_size</span>
<span class="ruby-identifier">actions</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-value">0</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">s</span>,<span class="ruby-identifier">a</span><span class="ruby-operator">|</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-identifier">s</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">s</span> }
<span class="ruby-keyword">end</span></pre>
</div>
@@ -1270,11 +1278,11 @@
<div class="method-source-code" id="selectors-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 413</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 419</span>
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">selectors</span>(<span class="ruby-identifier">include_standard_selectors</span> = <span class="ruby-keyword">true</span>)
<span class="ruby-identifier">ret</span> = <span class="ruby-constant">Selector</span>.<span class="ruby-identifier">public_instance_methods</span>(<span class="ruby-keyword">false</span>).<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">a</span><span class="ruby-operator">|</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">sub</span>(<span class="ruby-regexp">/_selector$/</span>, <span class="ruby-string">''</span>) }
<span class="ruby-keyword">if</span> <span class="ruby-identifier">include_standard_selectors</span>
<span class="ruby-identifier">ret</span> <span class="ruby-operator">+=</span> <span class="ruby-constant">Selenium</span><span class="ruby-operator">::</span><span class="ruby-constant">WebDriver</span><span class="ruby-operator">::</span><span class="ruby-constant">SearchContext</span><span class="ruby-operator">::</span><span class="ruby-constant">FINDERS</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_s</span> }
<span class="ruby-keyword">end</span>
@@ -1352,11 +1360,11 @@
<div class="method-source-code" id="expand-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 460</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 466</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">expand</span>(<span class="ruby-identifier">s</span>)
<span class="ruby-identifier">result</span> = <span class="ruby-ivar">@variables</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-identifier">s</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">s</span>,<span class="ruby-identifier">kv</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">s</span> = <span class="ruby-identifier">s</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-node">/\$\{#{kv[0]}\}/</span>, <span class="ruby-identifier">kv</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">to_s</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">result</span> = <span class="ruby-identifier">expand</span>(<span class="ruby-identifier">result</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">result</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">s</span>
@@ -1405,10 +1413,10 @@
<div class="method-source-code" id="with_vars-source">
- <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 483</span>
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 489</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">with_vars</span>(<span class="ruby-identifier">vars</span>)
<span class="ruby-identifier">current</span> = <span class="ruby-ivar">@variables</span>
<span class="ruby-ivar">@variables</span> = <span class="ruby-ivar">@variables</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">vars</span>)
<span class="ruby-keyword">yield</span>
<span class="ruby-keyword">ensure</span>