bauxite 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/Rakefile +69 -0
  4. data/bin/bauxite +27 -0
  5. data/doc/Bauxite/Action.html +1463 -0
  6. data/doc/Bauxite/ActionModule.html +342 -0
  7. data/doc/Bauxite/Context.html +1439 -0
  8. data/doc/Bauxite/Errors/AssertionError.html +107 -0
  9. data/doc/Bauxite/Errors/FileNotFoundError.html +107 -0
  10. data/doc/Bauxite/Errors.html +100 -0
  11. data/doc/Bauxite/Loggers/CompositeLogger.html +325 -0
  12. data/doc/Bauxite/Loggers/EchoLogger.html +164 -0
  13. data/doc/Bauxite/Loggers/FileLogger.html +215 -0
  14. data/doc/Bauxite/Loggers/NullLogger.html +334 -0
  15. data/doc/Bauxite/Loggers/TerminalLogger.html +586 -0
  16. data/doc/Bauxite/Loggers/XtermLogger.html +287 -0
  17. data/doc/Bauxite/Loggers.html +103 -0
  18. data/doc/Bauxite/Selector.html +422 -0
  19. data/doc/Bauxite/SelectorModule.html +283 -0
  20. data/doc/Bauxite.html +98 -0
  21. data/doc/created.rid +37 -0
  22. data/doc/fonts/Lato-Light.ttf +0 -0
  23. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  24. data/doc/fonts/Lato-Regular.ttf +0 -0
  25. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  26. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  27. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  28. data/doc/fonts.css +167 -0
  29. data/doc/images/add.png +0 -0
  30. data/doc/images/arrow_up.png +0 -0
  31. data/doc/images/brick.png +0 -0
  32. data/doc/images/brick_link.png +0 -0
  33. data/doc/images/bug.png +0 -0
  34. data/doc/images/bullet_black.png +0 -0
  35. data/doc/images/bullet_toggle_minus.png +0 -0
  36. data/doc/images/bullet_toggle_plus.png +0 -0
  37. data/doc/images/date.png +0 -0
  38. data/doc/images/delete.png +0 -0
  39. data/doc/images/find.png +0 -0
  40. data/doc/images/loadingAnimation.gif +0 -0
  41. data/doc/images/macFFBgHack.png +0 -0
  42. data/doc/images/package.png +0 -0
  43. data/doc/images/page_green.png +0 -0
  44. data/doc/images/page_white_text.png +0 -0
  45. data/doc/images/page_white_width.png +0 -0
  46. data/doc/images/plugin.png +0 -0
  47. data/doc/images/ruby.png +0 -0
  48. data/doc/images/tag_blue.png +0 -0
  49. data/doc/images/tag_green.png +0 -0
  50. data/doc/images/transparent.png +0 -0
  51. data/doc/images/wrench.png +0 -0
  52. data/doc/images/wrench_orange.png +0 -0
  53. data/doc/images/zoom.png +0 -0
  54. data/doc/index.html +111 -0
  55. data/doc/js/darkfish.js +140 -0
  56. data/doc/js/jquery.js +18 -0
  57. data/doc/js/navigation.js +142 -0
  58. data/doc/js/search.js +109 -0
  59. data/doc/js/search_index.js +1 -0
  60. data/doc/js/searcher.js +228 -0
  61. data/doc/rdoc.css +580 -0
  62. data/doc/table_of_contents.html +510 -0
  63. data/lib/bauxite/actions/alias.rb +51 -0
  64. data/lib/bauxite/actions/assert.rb +49 -0
  65. data/lib/bauxite/actions/assertv.rb +40 -0
  66. data/lib/bauxite/actions/break.rb +39 -0
  67. data/lib/bauxite/actions/click.rb +35 -0
  68. data/lib/bauxite/actions/debug.rb +99 -0
  69. data/lib/bauxite/actions/echo.rb +36 -0
  70. data/lib/bauxite/actions/exec.rb +46 -0
  71. data/lib/bauxite/actions/js.rb +41 -0
  72. data/lib/bauxite/actions/load.rb +49 -0
  73. data/lib/bauxite/actions/open.rb +34 -0
  74. data/lib/bauxite/actions/params.rb +40 -0
  75. data/lib/bauxite/actions/replace.rb +37 -0
  76. data/lib/bauxite/actions/reset.rb +37 -0
  77. data/lib/bauxite/actions/return.rb +62 -0
  78. data/lib/bauxite/actions/ruby.rb +58 -0
  79. data/lib/bauxite/actions/set.rb +39 -0
  80. data/lib/bauxite/actions/source.rb +44 -0
  81. data/lib/bauxite/actions/store.rb +38 -0
  82. data/lib/bauxite/actions/test.rb +61 -0
  83. data/lib/bauxite/actions/tryload.rb +79 -0
  84. data/lib/bauxite/actions/wait.rb +38 -0
  85. data/lib/bauxite/actions/write.rb +40 -0
  86. data/lib/bauxite/application.rb +150 -0
  87. data/lib/bauxite/core/Action.rb +205 -0
  88. data/lib/bauxite/core/Context.rb +575 -0
  89. data/lib/bauxite/core/Errors.rb +36 -0
  90. data/lib/bauxite/core/Logger.rb +86 -0
  91. data/lib/bauxite/core/Selector.rb +156 -0
  92. data/lib/bauxite/loggers/composite.rb +70 -0
  93. data/lib/bauxite/loggers/echo.rb +36 -0
  94. data/lib/bauxite/loggers/file.rb +45 -0
  95. data/lib/bauxite/loggers/terminal.rb +130 -0
  96. data/lib/bauxite/loggers/xterm.rb +79 -0
  97. data/lib/bauxite/selectors/attr.rb +39 -0
  98. data/lib/bauxite/selectors/default.rb +38 -0
  99. data/lib/bauxite/selectors/frame.rb +60 -0
  100. data/lib/bauxite.rb +29 -0
  101. data/test/alias.bxt +6 -0
  102. data/test/assertv.bxt +2 -0
  103. data/test/delay/page.html +5 -0
  104. data/test/delay.bxt +2 -0
  105. data/test/exec.bxt +6 -0
  106. data/test/format/page.html +7 -0
  107. data/test/format.bxt +17 -0
  108. data/test/frame/child_frame.html +7 -0
  109. data/test/frame/grandchild_frame.html +5 -0
  110. data/test/frame/page.html +5 -0
  111. data/test/frame.bxt +6 -0
  112. data/test/js.bxt +5 -0
  113. data/test/load/child.bxt +13 -0
  114. data/test/load.bxt +17 -0
  115. data/test/ruby/custom.rb +5 -0
  116. data/test/ruby.bxt +2 -0
  117. data/test/selectors/page.html +7 -0
  118. data/test/selectors.bxt +7 -0
  119. data/test/stdin.bxt +1 -0
  120. data/test/test/test1.bxt +2 -0
  121. data/test/test/test2.bxt +3 -0
  122. data/test/test/test3.bxt +2 -0
  123. data/test/test.bxt.manual +4 -0
  124. metadata +194 -0
@@ -0,0 +1,1439 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+
7
+ <title>class Bauxite::Context - RDoc Documentation</title>
8
+
9
+ <link href="../fonts.css" rel="stylesheet">
10
+ <link href="../rdoc.css" rel="stylesheet">
11
+
12
+ <script type="text/javascript">
13
+ var rdoc_rel_prefix = "../";
14
+ </script>
15
+
16
+ <script src="../js/jquery.js"></script>
17
+ <script src="../js/navigation.js"></script>
18
+ <script src="../js/search_index.js"></script>
19
+ <script src="../js/search.js"></script>
20
+ <script src="../js/searcher.js"></script>
21
+ <script src="../js/darkfish.js"></script>
22
+
23
+
24
+ <body id="top" role="document" class="class">
25
+ <nav role="navigation">
26
+ <div id="project-navigation">
27
+ <div id="home-section" role="region" title="Quick navigation" class="nav-section">
28
+ <h2>
29
+ <a href="../index.html" rel="home">Home</a>
30
+ </h2>
31
+
32
+ <div id="table-of-contents-navigation">
33
+ <a href="../table_of_contents.html#pages">Pages</a>
34
+ <a href="../table_of_contents.html#classes">Classes</a>
35
+ <a href="../table_of_contents.html#methods">Methods</a>
36
+ </div>
37
+ </div>
38
+
39
+ <div id="search-section" role="search" class="project-section initially-hidden">
40
+ <form action="#" method="get" accept-charset="utf-8">
41
+ <div id="search-field-wrapper">
42
+ <input id="search-field" role="combobox" aria-label="Search"
43
+ aria-autocomplete="list" aria-controls="search-results"
44
+ type="text" name="search" placeholder="Search" spellcheck="false"
45
+ title="Type to search, Up and Down to navigate, Enter to load">
46
+ </div>
47
+
48
+ <ul id="search-results" aria-label="Search Results"
49
+ aria-busy="false" aria-expanded="false"
50
+ aria-atomic="false" class="initially-hidden"></ul>
51
+ </form>
52
+ </div>
53
+
54
+ </div>
55
+
56
+
57
+
58
+ <div id="class-metadata">
59
+ <div id="sections-section" class="nav-section">
60
+ <h3>Sections</h3>
61
+
62
+ <ul class="link-list" role="directory">
63
+
64
+ <li><a href="#5Buntitled-5D"></a></li>
65
+
66
+ <li><a href="#Advanced+Helpers">Advanced Helpers</a></li>
67
+
68
+ <li><a href="#Metadata">Metadata</a></li>
69
+
70
+ <li><a href="#Variable+manipulation+methods">Variable manipulation methods</a></li>
71
+
72
+ </ul>
73
+ </div>
74
+
75
+ <div id="parent-class-section" class="nav-section">
76
+ <h3>Parent</h3>
77
+
78
+
79
+ <p class="link">Object
80
+
81
+ </div>
82
+
83
+
84
+
85
+ <!-- Method Quickref -->
86
+ <div id="method-list-section" class="nav-section">
87
+ <h3>Methods</h3>
88
+
89
+ <ul class="link-list" role="directory">
90
+
91
+ <li ><a href="#method-c-action_args">::action_args</a>
92
+
93
+ <li ><a href="#method-c-actions">::actions</a>
94
+
95
+ <li ><a href="#method-c-load_logger">::load_logger</a>
96
+
97
+ <li ><a href="#method-c-loggers">::loggers</a>
98
+
99
+ <li ><a href="#method-c-max_action_name_size">::max_action_name_size</a>
100
+
101
+ <li ><a href="#method-c-new">::new</a>
102
+
103
+ <li ><a href="#method-c-parse_args">::parse_args</a>
104
+
105
+ <li ><a href="#method-c-selectors">::selectors</a>
106
+
107
+ <li ><a href="#method-c-wait">::wait</a>
108
+
109
+ <li ><a href="#method-i-debug">#debug</a>
110
+
111
+ <li ><a href="#method-i-exec_action">#exec_action</a>
112
+
113
+ <li ><a href="#method-i-expand">#expand</a>
114
+
115
+ <li ><a href="#method-i-find">#find</a>
116
+
117
+ <li ><a href="#method-i-get_value">#get_value</a>
118
+
119
+ <li ><a href="#method-i-handle_errors">#handle_errors</a>
120
+
121
+ <li ><a href="#method-i-parse_file">#parse_file</a>
122
+
123
+ <li ><a href="#method-i-reset_driver">#reset_driver</a>
124
+
125
+ <li ><a href="#method-i-start">#start</a>
126
+
127
+ <li ><a href="#method-i-stop">#stop</a>
128
+
129
+ <li ><a href="#method-i-with_timeout">#with_timeout</a>
130
+
131
+ <li ><a href="#method-i-with_vars">#with_vars</a>
132
+
133
+ </ul>
134
+ </div>
135
+
136
+ </div>
137
+ </nav>
138
+
139
+ <main role="main" aria-labelledby="class-Bauxite::Context">
140
+ <h1 id="class-Bauxite::Context" class="class">
141
+ class Bauxite::Context
142
+ </h1>
143
+
144
+ <section class="description">
145
+
146
+ <p>The Main test context. This class includes state and helper functions used
147
+ by clients execute tests and by actions and selectors to interact with the
148
+ test engine (i.e. Selenium WebDriver).</p>
149
+
150
+ </section>
151
+
152
+
153
+
154
+
155
+ <section id="5Buntitled-5D" class="documentation-section">
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+ <section class="attribute-method-details" class="method-section">
164
+ <header>
165
+ <h3>Attributes</h3>
166
+ </header>
167
+
168
+
169
+ <div id="attribute-i-aliases" class="method-detail">
170
+ <div class="method-heading attribute-method-heading">
171
+ <span class="method-name">aliases</span><span
172
+ class="attribute-access-type">[RW]</span>
173
+ </div>
174
+
175
+ <div class="method-description">
176
+
177
+ <p><a href="Action.html">Action</a> aliases.</p>
178
+
179
+ </div>
180
+ </div>
181
+
182
+ <div id="attribute-i-driver" class="method-detail">
183
+ <div class="method-heading attribute-method-heading">
184
+ <span class="method-name">driver</span><span
185
+ class="attribute-access-type">[R]</span>
186
+ </div>
187
+
188
+ <div class="method-description">
189
+
190
+ <p>Test engine driver instance (Selenium WebDriver).</p>
191
+
192
+ </div>
193
+ </div>
194
+
195
+ <div id="attribute-i-logger" class="method-detail">
196
+ <div class="method-heading attribute-method-heading">
197
+ <span class="method-name">logger</span><span
198
+ class="attribute-access-type">[R]</span>
199
+ </div>
200
+
201
+ <div class="method-description">
202
+
203
+ <p>Logger instance.</p>
204
+
205
+ </div>
206
+ </div>
207
+
208
+ <div id="attribute-i-options" class="method-detail">
209
+ <div class="method-heading attribute-method-heading">
210
+ <span class="method-name">options</span><span
211
+ class="attribute-access-type">[R]</span>
212
+ </div>
213
+
214
+ <div class="method-description">
215
+
216
+ <p>Test options.</p>
217
+
218
+ </div>
219
+ </div>
220
+
221
+ <div id="attribute-i-tests" class="method-detail">
222
+ <div class="method-heading attribute-method-heading">
223
+ <span class="method-name">tests</span><span
224
+ class="attribute-access-type">[RW]</span>
225
+ </div>
226
+
227
+ <div class="method-description">
228
+
229
+ <p>Test containers.</p>
230
+
231
+ </div>
232
+ </div>
233
+
234
+ <div id="attribute-i-variables" class="method-detail">
235
+ <div class="method-heading attribute-method-heading">
236
+ <span class="method-name">variables</span><span
237
+ class="attribute-access-type">[RW]</span>
238
+ </div>
239
+
240
+ <div class="method-description">
241
+
242
+ <p><a href="Context.html">Context</a> variables.</p>
243
+
244
+ </div>
245
+ </div>
246
+
247
+ </section>
248
+
249
+
250
+
251
+ <section id="public-class-5Buntitled-5D-method-details" class="method-section">
252
+ <header>
253
+ <h3>Public Class Methods</h3>
254
+ </header>
255
+
256
+
257
+ <div id="method-c-new" class="method-detail ">
258
+
259
+ <div class="method-heading">
260
+ <span class="method-name">new</span><span
261
+ class="method-args">(options)</span>
262
+
263
+ <span class="method-click-advice">click to toggle source</span>
264
+
265
+ </div>
266
+
267
+
268
+ <div class="method-description">
269
+
270
+ <p>Constructs a new test context instance.</p>
271
+
272
+ <p><code>options</code> is a hash with the following values:</p>
273
+ <dl class="rdoc-list label-list"><dt>:driver
274
+ <dd>
275
+ <p>selenium driver symbol (defaults to <code>:firefox</code>)</p>
276
+ </dd><dt>:timeout
277
+ <dd>
278
+ <p>selector timeout in seconds (defaults to <code>10s</code>)</p>
279
+ </dd><dt>:logger
280
+ <dd>
281
+ <p>logger implementation name without the &#39;Logger&#39; suffix (defaults to
282
+ &#39;null&#39; for <a
283
+ href="Loggers/NullLogger.html">Loggers::NullLogger</a>).</p>
284
+ </dd><dt>:verbose
285
+ <dd>
286
+ <p>if <code>true</code>, show verbose error information (e.g. backtraces) if
287
+ an error occurs (defaults to <code>false</code>)</p>
288
+ </dd><dt>:debug
289
+ <dd>
290
+ <p>if <code>true</code>, break into the <a
291
+ href="Context.html#method-i-debug">debug</a> console if an error occurs
292
+ (defaults to <code>false</code>)</p>
293
+ </dd><dt>:wait
294
+ <dd>
295
+ <p>if <code>true</code>, call <a href="Context.html#method-c-wait">::wait</a>
296
+ before stopping the test engine with <a
297
+ href="Context.html#method-i-stop">stop</a> (defaults to <code>false</code>)</p>
298
+ </dd></dl>
299
+
300
+
301
+
302
+
303
+ <div class="method-source-code" id="new-source">
304
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 69</span>
305
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span>)
306
+ <span class="ruby-ivar">@options</span> = <span class="ruby-identifier">options</span>
307
+ <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>
308
+ <span class="ruby-ivar">@variables</span> = {
309
+ <span class="ruby-string">&#39;__TIMEOUT__&#39;</span> =<span class="ruby-operator">&gt;</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>
310
+ }
311
+ <span class="ruby-ivar">@aliases</span> = {}
312
+ <span class="ruby-ivar">@tests</span> = []
313
+
314
+ <span class="ruby-identifier">handle_errors</span> <span class="ruby-keyword">do</span>
315
+ <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>])
316
+ <span class="ruby-keyword">end</span>
317
+ <span class="ruby-keyword">end</span></pre>
318
+ </div>
319
+
320
+ </div>
321
+
322
+
323
+
324
+
325
+ </div>
326
+
327
+
328
+ </section>
329
+
330
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
331
+ <header>
332
+ <h3>Public Instance Methods</h3>
333
+ </header>
334
+
335
+
336
+ <div id="method-i-debug" class="method-detail ">
337
+
338
+ <div class="method-heading">
339
+ <span class="method-name">debug</span><span
340
+ class="method-args">()</span>
341
+
342
+ <span class="method-click-advice">click to toggle source</span>
343
+
344
+ </div>
345
+
346
+
347
+ <div class="method-description">
348
+
349
+ <p>Breaks into the debug console.</p>
350
+
351
+ <p>For example:</p>
352
+
353
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">debug</span>
354
+ <span class="ruby-comment"># =&gt; this breaks into the debug console</span>
355
+ </pre>
356
+
357
+
358
+
359
+
360
+ <div class="method-source-code" id="debug-source">
361
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 171</span>
362
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">debug</span>
363
+ <span class="ruby-identifier">exec_action</span>(<span class="ruby-string">&#39;debug&#39;</span>, <span class="ruby-keyword">false</span>)
364
+ <span class="ruby-keyword">end</span></pre>
365
+ </div>
366
+
367
+ </div>
368
+
369
+
370
+
371
+
372
+ </div>
373
+
374
+
375
+ <div id="method-i-find" class="method-detail ">
376
+
377
+ <div class="method-heading">
378
+ <span class="method-name">find</span><span
379
+ class="method-args">(selector) { |element| ... }</span>
380
+
381
+ <span class="method-click-advice">click to toggle source</span>
382
+
383
+ </div>
384
+
385
+
386
+ <div class="method-description">
387
+
388
+ <p>Finds an element by <code>selector</code>.</p>
389
+
390
+ <p>The element found is yielded to the given <code>block</code> (if any) and
391
+ returned.</p>
392
+
393
+ <p>Note that the recommeneded way to call this method is by passing a
394
+ <code>block</code>. This is because the method ensures that the element
395
+ context is maintained for the duration of the <code>block</code> but it
396
+ makes no guarantees after the <code>block</code> completes (the same
397
+ applies if no <code>block</code> was given).</p>
398
+
399
+ <p>For example:</p>
400
+
401
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">find</span>(<span class="ruby-string">&#39;css=.my_button&#39;</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">element</span><span class="ruby-operator">|</span> <span class="ruby-identifier">element</span>.<span class="ruby-identifier">click</span> }
402
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">find</span>(<span class="ruby-string">&#39;css=.my_button&#39;</span>).<span class="ruby-identifier">click</span>
403
+ </pre>
404
+
405
+ <p>For example (where using a <code>block</code> is mandatory):</p>
406
+
407
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">find</span>(<span class="ruby-string">&#39;frame=|myframe|css=.my_button&#39;</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">element</span><span class="ruby-operator">|</span> <span class="ruby-identifier">element</span>.<span class="ruby-identifier">click</span> }
408
+ <span class="ruby-comment"># =&gt; .my_button clicked</span>
409
+
410
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">find</span>(<span class="ruby-string">&#39;frame=|myframe|css=.my_button&#39;</span>).<span class="ruby-identifier">click</span>
411
+ <span class="ruby-comment"># =&gt; error, cannot click .my_button (no longer in myframe scope)</span>
412
+ </pre>
413
+
414
+
415
+
416
+
417
+ <div class="method-source-code" id="find-source">
418
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 160</span>
419
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">find</span>(<span class="ruby-identifier">selector</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>) <span class="ruby-comment"># yields: element</span>
420
+ <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>
421
+ <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">&amp;</span><span class="ruby-identifier">block</span>)
422
+ <span class="ruby-keyword">end</span>
423
+ <span class="ruby-keyword">end</span></pre>
424
+ </div>
425
+
426
+ </div>
427
+
428
+
429
+
430
+
431
+ </div>
432
+
433
+
434
+ <div id="method-i-get_value" class="method-detail ">
435
+
436
+ <div class="method-heading">
437
+ <span class="method-name">get_value</span><span
438
+ class="method-args">(element)</span>
439
+
440
+ <span class="method-click-advice">click to toggle source</span>
441
+
442
+ </div>
443
+
444
+
445
+ <div class="method-description">
446
+
447
+ <p>Returns the value of the specified <code>element</code>.</p>
448
+
449
+ <p>This method takes into account the type of element and selectively returns
450
+ the inner text or the value of the <code>value</code> attribute.</p>
451
+
452
+ <p>For example:</p>
453
+
454
+ <pre class="ruby"><span class="ruby-comment"># assuming &lt;input type=&#39;text&#39; value=&#39;Hello&#39; /&gt;</span>
455
+ <span class="ruby-comment"># &lt;span id=&#39;label&#39;&gt;World!&lt;/span&gt;</span>
456
+
457
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">get_value</span>(<span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">find</span>(<span class="ruby-string">&#39;css=input[type=text]&#39;</span>))
458
+ <span class="ruby-comment"># =&gt; returns &#39;Hello&#39;</span>
459
+
460
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">get_value</span>(<span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">find</span>(<span class="ruby-string">&#39;label&#39;</span>))
461
+ <span class="ruby-comment"># =&gt; returns &#39;World!&#39;</span>
462
+ </pre>
463
+
464
+
465
+
466
+
467
+ <div class="method-source-code" id="get_value-source">
468
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 190</span>
469
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">get_value</span>(<span class="ruby-identifier">element</span>)
470
+ <span class="ruby-keyword">if</span> [<span class="ruby-string">&#39;input&#39;</span>,<span class="ruby-string">&#39;select&#39;</span>,<span class="ruby-string">&#39;textarea&#39;</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>
471
+ <span class="ruby-identifier">element</span>.<span class="ruby-identifier">attribute</span>(<span class="ruby-string">&#39;value&#39;</span>)
472
+ <span class="ruby-keyword">else</span>
473
+ <span class="ruby-identifier">element</span>.<span class="ruby-identifier">text</span>
474
+ <span class="ruby-keyword">end</span>
475
+ <span class="ruby-keyword">end</span></pre>
476
+ </div>
477
+
478
+ </div>
479
+
480
+
481
+
482
+
483
+ </div>
484
+
485
+
486
+ <div id="method-i-reset_driver" class="method-detail ">
487
+
488
+ <div class="method-heading">
489
+ <span class="method-name">reset_driver</span><span
490
+ class="method-args">()</span>
491
+
492
+ <span class="method-click-advice">click to toggle source</span>
493
+
494
+ </div>
495
+
496
+
497
+ <div class="method-description">
498
+
499
+ <p>Stops the test engine and starts a new engine with the same provider.</p>
500
+
501
+ <p>For example:</p>
502
+
503
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">reset_driver</span>
504
+ =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">closes</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">browser</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">opens</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">new</span> <span class="ruby-identifier">one</span>
505
+ </pre>
506
+
507
+
508
+
509
+
510
+ <div class="method-source-code" id="reset_driver-source">
511
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 115</span>
512
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">reset_driver</span>
513
+ <span class="ruby-ivar">@driver</span>.<span class="ruby-identifier">quit</span>
514
+ <span class="ruby-identifier">_load_driver</span>
515
+ <span class="ruby-keyword">end</span></pre>
516
+ </div>
517
+
518
+ </div>
519
+
520
+
521
+
522
+
523
+ </div>
524
+
525
+
526
+ <div id="method-i-start" class="method-detail ">
527
+
528
+ <div class="method-heading">
529
+ <span class="method-name">start</span><span
530
+ class="method-args">(actions = [])</span>
531
+
532
+ <span class="method-click-advice">click to toggle source</span>
533
+
534
+ </div>
535
+
536
+
537
+ <div class="method-description">
538
+
539
+ <p>Starts the test engine and executes the actions specified. If no action was
540
+ specified, returns without stopping the test engine (see <a
541
+ href="Context.html#method-i-stop">stop</a>).</p>
542
+
543
+ <p>For example:</p>
544
+
545
+ <pre class="ruby"><span class="ruby-identifier">lines</span> = [
546
+ <span class="ruby-string">&#39;open &quot;http://www.ruby-lang.org&quot;&#39;</span>,
547
+ <span class="ruby-string">&#39;write &quot;name=q&quot; &quot;ljust&quot;&#39;</span>,
548
+ <span class="ruby-string">&#39;click &quot;name=sa&quot;&#39;</span>,
549
+ <span class="ruby-string">&#39;break&#39;</span>
550
+ ]
551
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">start</span>(<span class="ruby-identifier">lines</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">ctx</span>.<span class="ruby-identifier">parse_action</span>(<span class="ruby-identifier">l</span>) })
552
+ <span class="ruby-comment"># =&gt; navigates to www.ruby-lang.org, types ljust in the search box</span>
553
+ <span class="ruby-comment"># and clicks the &quot;Search&quot; button.</span>
554
+ </pre>
555
+
556
+
557
+
558
+
559
+ <div class="method-source-code" id="start-source">
560
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 97</span>
561
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">start</span>(<span class="ruby-identifier">actions</span> = [])
562
+ <span class="ruby-identifier">_load_driver</span>
563
+ <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">&gt;</span> <span class="ruby-value">0</span>
564
+ <span class="ruby-keyword">begin</span>
565
+ <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>
566
+ <span class="ruby-identifier">exec_action</span>(<span class="ruby-identifier">action</span>)
567
+ <span class="ruby-keyword">end</span>
568
+ <span class="ruby-keyword">ensure</span>
569
+ <span class="ruby-identifier">stop</span>
570
+ <span class="ruby-keyword">end</span>
571
+ <span class="ruby-keyword">end</span></pre>
572
+ </div>
573
+
574
+ </div>
575
+
576
+
577
+
578
+
579
+ </div>
580
+
581
+
582
+ <div id="method-i-stop" class="method-detail ">
583
+
584
+ <div class="method-heading">
585
+ <span class="method-name">stop</span><span
586
+ class="method-args">()</span>
587
+
588
+ <span class="method-click-advice">click to toggle source</span>
589
+
590
+ </div>
591
+
592
+
593
+ <div class="method-description">
594
+
595
+ <p>Stops the test engine.</p>
596
+
597
+ <p>Calling this method at the end of the test is mandatory if <a
598
+ href="Context.html#method-i-start">start</a> was called without
599
+ <code>actions</code>.</p>
600
+
601
+ <p>Note that the recommeneded way of executing tests is by passing a list of
602
+ <code>actions</code> to <a href="Context.html#method-i-start">start</a>
603
+ instead of using the <a href="Context.html#method-i-start">start</a> / <a
604
+ href="Context.html#method-i-stop">stop</a> pattern.</p>
605
+
606
+ <p>For example:</p>
607
+
608
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">start</span>(:<span class="ruby-identifier">firefox</span>) <span class="ruby-comment"># =&gt; opens firefox</span>
609
+
610
+ <span class="ruby-comment"># test stuff goes here</span>
611
+
612
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">stop</span> <span class="ruby-comment"># =&gt; closes firefox</span>
613
+ </pre>
614
+
615
+
616
+
617
+
618
+ <div class="method-source-code" id="stop-source">
619
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 135</span>
620
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">stop</span>
621
+ <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>]
622
+ <span class="ruby-ivar">@driver</span>.<span class="ruby-identifier">quit</span>
623
+ <span class="ruby-keyword">end</span></pre>
624
+ </div>
625
+
626
+ </div>
627
+
628
+
629
+
630
+
631
+ </div>
632
+
633
+
634
+ </section>
635
+
636
+ </section>
637
+
638
+
639
+
640
+ <section id="Advanced+Helpers" class="documentation-section">
641
+
642
+ <header class="documentation-section-title">
643
+ <h2>
644
+ Advanced Helpers
645
+ </h2>
646
+ <span class="section-click-top">
647
+ <a href="#top">&uarr; top</a>
648
+ </span>
649
+ </header>
650
+
651
+
652
+
653
+
654
+
655
+
656
+
657
+
658
+
659
+ <section id="public-class-Advanced+Helpers-method-details" class="method-section">
660
+ <header>
661
+ <h3>Public Class Methods</h3>
662
+ </header>
663
+
664
+
665
+ <div id="method-c-load_logger" class="method-detail ">
666
+
667
+ <div class="method-heading">
668
+ <span class="method-name">load_logger</span><span
669
+ class="method-args">(name, options)</span>
670
+
671
+ <span class="method-click-advice">click to toggle source</span>
672
+
673
+ </div>
674
+
675
+
676
+ <div class="method-description">
677
+
678
+ <p>Constructs a Logger instance using <code>name</code> as a hint for the
679
+ logger type.</p>
680
+
681
+
682
+
683
+
684
+ <div class="method-source-code" id="load_logger-source">
685
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 365</span>
686
+ <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>)
687
+ <span class="ruby-identifier">log_name</span> = (<span class="ruby-identifier">name</span> <span class="ruby-operator">||</span> <span class="ruby-string">&#39;null&#39;</span>).<span class="ruby-identifier">downcase</span>
688
+
689
+ <span class="ruby-identifier">class_name</span> = <span class="ruby-node">&quot;#{log_name.capitalize}Logger&quot;</span>
690
+
691
+ <span class="ruby-keyword">unless</span> <span class="ruby-constant">Loggers</span>.<span class="ruby-identifier">const_defined?</span> <span class="ruby-identifier">class_name</span>.<span class="ruby-identifier">to_sym</span>
692
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">NameError</span>,
693
+ <span class="ruby-node">&quot;Invalid logger &#39;#{log_name}&#39;&quot;</span>
694
+ <span class="ruby-keyword">end</span>
695
+
696
+ <span class="ruby-constant">Loggers</span>.<span class="ruby-identifier">const_get</span>(<span class="ruby-identifier">class_name</span>).<span class="ruby-identifier">new</span>(<span class="ruby-identifier">options</span>)
697
+ <span class="ruby-keyword">end</span></pre>
698
+ </div>
699
+
700
+ </div>
701
+
702
+
703
+
704
+
705
+ </div>
706
+
707
+
708
+ <div id="method-c-parse_args" class="method-detail ">
709
+
710
+ <div class="method-heading">
711
+ <span class="method-name">parse_args</span><span
712
+ class="method-args">(line)</span>
713
+
714
+ <span class="method-click-advice">click to toggle source</span>
715
+
716
+ </div>
717
+
718
+
719
+ <div class="method-description">
720
+
721
+ <p>Parses a line of action text into an array. The input <code>line</code>
722
+ should be a space-separated list of values, surrounded by optional quotes
723
+ (“).</p>
724
+
725
+ <p>The first element in <code>line</code> will be interpreted as an action
726
+ name. Valid action names are retuned by <a
727
+ href="Context.html#method-c-actions">::actions</a>.</p>
728
+
729
+ <p>The other elements in <code>line</code> will be interpreted as action
730
+ arguments.</p>
731
+
732
+ <p>For example:</p>
733
+
734
+ <pre class="ruby"><span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">parse_args</span>(<span class="ruby-string">&#39;echo &quot;Hello World!&quot;&#39;</span>)
735
+ <span class="ruby-comment"># =&gt; &#39; [&quot;echo&quot;, &quot;Hello World!&quot;]</span>
736
+ </pre>
737
+
738
+
739
+
740
+
741
+ <div class="method-source-code" id="parse_args-source">
742
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 267</span>
743
+ <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>)
744
+ <span class="ruby-comment"># col_sep must be a regex because String.split has a special case for</span>
745
+ <span class="ruby-comment"># a single space char (&#39; &#39;) that produced unexpected results (i.e.</span>
746
+ <span class="ruby-comment"># if line is &#39;&quot;a b&quot;&#39; the resulting array contains [&quot;a b&quot;]).</span>
747
+ <span class="ruby-comment">#</span>
748
+ <span class="ruby-comment"># ...but... </span>
749
+ <span class="ruby-comment">#</span>
750
+ <span class="ruby-comment"># CSV expects col_sep to be a string so we need to work some dark magic</span>
751
+ <span class="ruby-comment"># here. Basically we proxy the StringIO received by CSV to returns</span>
752
+ <span class="ruby-comment"># strings for which the split method does not fold the whitespaces.</span>
753
+ <span class="ruby-comment">#</span>
754
+ <span class="ruby-keyword">return</span> [] <span class="ruby-keyword">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">strip</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;&#39;</span>
755
+ <span class="ruby-constant">CSV</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">StringIOProxy</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">line</span>), { <span class="ruby-value">:col_sep</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39; &#39;</span> })
756
+ .<span class="ruby-identifier">shift</span>
757
+ .<span class="ruby-identifier">select</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-operator">!=</span> <span class="ruby-keyword">nil</span> }
758
+ <span class="ruby-keyword">end</span></pre>
759
+ </div>
760
+
761
+ </div>
762
+
763
+
764
+
765
+
766
+ </div>
767
+
768
+
769
+ <div id="method-c-wait" class="method-detail ">
770
+
771
+ <div class="method-heading">
772
+ <span class="method-name">wait</span><span
773
+ class="method-args">()</span>
774
+
775
+ <span class="method-click-advice">click to toggle source</span>
776
+
777
+ </div>
778
+
779
+
780
+ <div class="method-description">
781
+
782
+ <p>Prompts the user to press ENTER before resuming execution.</p>
783
+
784
+ <p>For example:</p>
785
+
786
+ <pre class="ruby"><span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">wait</span>
787
+ <span class="ruby-comment"># =&gt; echoes &quot;Press ENTER to continue&quot; and waits for user input</span>
788
+ </pre>
789
+
790
+
791
+
792
+
793
+ <div class="method-source-code" id="wait-source">
794
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 358</span>
795
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">wait</span>
796
+ <span class="ruby-constant">Readline</span>.<span class="ruby-identifier">readline</span>(<span class="ruby-string">&quot;Press ENTER to continue\n&quot;</span>)
797
+ <span class="ruby-keyword">end</span></pre>
798
+ </div>
799
+
800
+ </div>
801
+
802
+
803
+
804
+
805
+ </div>
806
+
807
+
808
+ </section>
809
+
810
+ <section id="public-instance-Advanced+Helpers-method-details" class="method-section">
811
+ <header>
812
+ <h3>Public Instance Methods</h3>
813
+ </header>
814
+
815
+
816
+ <div id="method-i-exec_action" class="method-detail ">
817
+
818
+ <div class="method-heading">
819
+ <span class="method-name">exec_action</span><span
820
+ class="method-args">(action, log = true)</span>
821
+
822
+ <span class="method-click-advice">click to toggle source</span>
823
+
824
+ </div>
825
+
826
+
827
+ <div class="method-description">
828
+
829
+ <p>Executes the specified action handling errors, logging and debug history.
830
+ Actions can be obtained by calling parse_action.</p>
831
+
832
+ <p>If <code>log</code> is <code>true</code>, log the action execution (default
833
+ behavior).</p>
834
+
835
+ <p>For example:</p>
836
+
837
+ <pre class="ruby"><span class="ruby-identifier">action</span> = <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">parse_action</span>(<span class="ruby-string">&#39;open &quot;http://www.ruby-lang.org&quot;&#39;</span>)
838
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">exec_action</span> <span class="ruby-identifier">action</span>
839
+ <span class="ruby-comment"># =&gt; navigates to www.ruby-lang.org</span>
840
+ </pre>
841
+
842
+
843
+
844
+
845
+ <div class="method-source-code" id="exec_action-source">
846
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 212</span>
847
+ <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>)
848
+ <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>)
849
+ <span class="ruby-identifier">action</span> = { <span class="ruby-value">:text</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">action</span>, <span class="ruby-value">:file</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;&lt;unknown&gt;&#39;</span>, <span class="ruby-value">:line</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> }
850
+ <span class="ruby-keyword">end</span>
851
+
852
+ <span class="ruby-identifier">ret</span> = <span class="ruby-identifier">handle_errors</span>(<span class="ruby-keyword">true</span>) <span class="ruby-keyword">do</span>
853
+
854
+ <span class="ruby-identifier">action</span> = <span class="ruby-identifier">_load_action</span>(<span class="ruby-identifier">action</span>)
855
+
856
+ <span class="ruby-comment"># Inject built-in variables</span>
857
+ <span class="ruby-identifier">file</span> = <span class="ruby-identifier">action</span>.<span class="ruby-identifier">file</span>
858
+ <span class="ruby-identifier">dir</span> = (<span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span> <span class="ruby-identifier">file</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">dirname</span>(<span class="ruby-identifier">file</span>) <span class="ruby-operator">:</span> <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">pwd</span>
859
+ <span class="ruby-ivar">@variables</span>[<span class="ruby-string">&#39;__FILE__&#39;</span>] = <span class="ruby-identifier">file</span>
860
+ <span class="ruby-ivar">@variables</span>[<span class="ruby-string">&#39;__DIR__&#39;</span>] = <span class="ruby-constant">File</span>.<span class="ruby-identifier">absolute_path</span>(<span class="ruby-identifier">dir</span>)
861
+
862
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">log</span>
863
+ <span class="ruby-ivar">@logger</span>.<span class="ruby-identifier">log_cmd</span>(<span class="ruby-identifier">action</span>) <span class="ruby-keyword">do</span>
864
+ <span class="ruby-constant">Readline</span><span class="ruby-operator">::</span><span class="ruby-constant">HISTORY</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">action</span>.<span class="ruby-identifier">text</span>
865
+ <span class="ruby-identifier">action</span>.<span class="ruby-identifier">execute</span>
866
+ <span class="ruby-keyword">end</span>
867
+ <span class="ruby-keyword">else</span>
868
+ <span class="ruby-identifier">action</span>.<span class="ruby-identifier">execute</span>
869
+ <span class="ruby-keyword">end</span>
870
+ <span class="ruby-keyword">end</span>
871
+ <span class="ruby-identifier">ret</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ret</span>.<span class="ruby-identifier">respond_to?</span> <span class="ruby-value">:call</span> <span class="ruby-comment"># delayed actions (after log_cmd)</span>
872
+ <span class="ruby-keyword">end</span></pre>
873
+ </div>
874
+
875
+ </div>
876
+
877
+
878
+
879
+
880
+ </div>
881
+
882
+
883
+ <div id="method-i-handle_errors" class="method-detail ">
884
+
885
+ <div class="method-heading">
886
+ <span class="method-name">handle_errors</span><span
887
+ class="method-args">(break_into_debug = false, exit_on_error = true) { || ... }</span>
888
+
889
+ <span class="method-click-advice">click to toggle source</span>
890
+
891
+ </div>
892
+
893
+
894
+ <div class="method-description">
895
+
896
+ <p>Executes the <code>block</code> inside a rescue block applying standard
897
+ criteria of error handling.</p>
898
+
899
+ <p>The default behavior is to print the exception message and exit.</p>
900
+
901
+ <p>If the <code>:verbose</code> option is set, the exception backtrace will
902
+ also be printed.</p>
903
+
904
+ <p>If the <code>break_into_debug</code> argument is <code>true</code> and the
905
+ <code>:debug</code> option is set, the handler will break into the debug
906
+ console instead of exiting.</p>
907
+
908
+ <p>If the <code>exit_on_error</code> argument is <code>false</code> the
909
+ handler will not exit after printing the error message.</p>
910
+
911
+ <p>For example:</p>
912
+
913
+ <pre class="ruby"><span class="ruby-identifier">ctx</span> = <span class="ruby-constant">Context</span>.<span class="ruby-identifier">new</span>({ :<span class="ruby-identifier">debug</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span> })
914
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">handle_errors</span>(<span class="ruby-keyword">true</span>) { <span class="ruby-identifier">raise</span> <span class="ruby-string">&#39;break into debug now!&#39;</span> }
915
+ <span class="ruby-comment"># =&gt; this breaks into the debug console</span>
916
+ </pre>
917
+
918
+
919
+
920
+
921
+ <div class="method-source-code" id="handle_errors-source">
922
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 303</span>
923
+ <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>)
924
+ <span class="ruby-keyword">yield</span>
925
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
926
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@logger</span>
927
+ <span class="ruby-ivar">@logger</span>.<span class="ruby-identifier">log</span> <span class="ruby-node">&quot;#{e.message}\n&quot;</span>, <span class="ruby-value">:error</span>
928
+ <span class="ruby-keyword">else</span>
929
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">e</span>.<span class="ruby-identifier">message</span>
930
+ <span class="ruby-keyword">end</span>
931
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-value">:verbose</span>]
932
+ <span class="ruby-identifier">p</span> <span class="ruby-identifier">e</span>
933
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">e</span>.<span class="ruby-identifier">backtrace</span>
934
+ <span class="ruby-keyword">end</span>
935
+ <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>]
936
+ <span class="ruby-identifier">debug</span>
937
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">exit_on_error</span>
938
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@variables</span>[<span class="ruby-string">&#39;__RAISE_ERROR__&#39;</span>]
939
+ <span class="ruby-identifier">raise</span>
940
+ <span class="ruby-keyword">else</span>
941
+ <span class="ruby-identifier">exit</span> <span class="ruby-keyword">false</span>
942
+ <span class="ruby-keyword">end</span>
943
+ <span class="ruby-keyword">end</span>
944
+ <span class="ruby-keyword">end</span></pre>
945
+ </div>
946
+
947
+ </div>
948
+
949
+
950
+
951
+
952
+ </div>
953
+
954
+
955
+ <div id="method-i-parse_file" class="method-detail ">
956
+
957
+ <div class="method-heading">
958
+ <span class="method-name">parse_file</span><span
959
+ class="method-args">(file)</span>
960
+
961
+ <span class="method-click-advice">click to toggle source</span>
962
+
963
+ </div>
964
+
965
+
966
+ <div class="method-description">
967
+
968
+ <p>Parses the specified text into a test action array.</p>
969
+
970
+ <p>See parse_action for more details.</p>
971
+
972
+ <p>For example:</p>
973
+
974
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">parse_file</span>(<span class="ruby-string">&#39;file&#39;</span>)
975
+ <span class="ruby-comment"># =&gt; [ { :cmd =&gt; &#39;echo&#39;, ... } ]</span>
976
+ </pre>
977
+
978
+
979
+
980
+
981
+ <div class="method-source-code" id="parse_file-source">
982
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 247</span>
983
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">parse_file</span>(<span class="ruby-identifier">file</span>)
984
+ <span class="ruby-keyword">if</span> (<span class="ruby-identifier">file</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;stdin&#39;</span>)
985
+ <span class="ruby-identifier">_parse_file</span>(<span class="ruby-identifier">$stdin</span>, <span class="ruby-identifier">file</span>)
986
+ <span class="ruby-keyword">else</span>
987
+ <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>) }
988
+ <span class="ruby-keyword">end</span>
989
+ <span class="ruby-keyword">end</span></pre>
990
+ </div>
991
+
992
+ </div>
993
+
994
+
995
+
996
+
997
+ </div>
998
+
999
+
1000
+ <div id="method-i-with_timeout" class="method-detail ">
1001
+
1002
+ <div class="method-heading">
1003
+ <span class="method-name">with_timeout</span><span
1004
+ class="method-args">(*error_types) { || ... }</span>
1005
+
1006
+ <span class="method-click-advice">click to toggle source</span>
1007
+
1008
+ </div>
1009
+
1010
+
1011
+ <div class="method-description">
1012
+
1013
+ <p>Executes the given block retrying for at most <code>${__TIMEOUT__}</code>
1014
+ seconds. Note that this method does not take into account the time it takes
1015
+ to execute the block itself.</p>
1016
+
1017
+ <p>For example</p>
1018
+
1019
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">with_timeout</span> <span class="ruby-constant">StandardError</span> <span class="ruby-keyword">do</span>
1020
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">find</span> (<span class="ruby-string">&#39;element_with_delay&#39;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">e</span><span class="ruby-operator">|</span>
1021
+ <span class="ruby-comment"># do something with e</span>
1022
+ <span class="ruby-keyword">end</span>
1023
+ <span class="ruby-keyword">end</span>
1024
+ </pre>
1025
+
1026
+
1027
+
1028
+
1029
+ <div class="method-source-code" id="with_timeout-source">
1030
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 337</span>
1031
+ <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>)
1032
+ <span class="ruby-identifier">stime</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>
1033
+ <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">&#39;__TIMEOUT__&#39;</span>]
1034
+ <span class="ruby-keyword">yield</span>
1035
+ <span class="ruby-keyword">rescue</span> <span class="ruby-operator">*</span><span class="ruby-identifier">error_types</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
1036
+ <span class="ruby-identifier">t</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>
1037
+ <span class="ruby-identifier">rem</span> = <span class="ruby-identifier">timeout</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">t</span>
1038
+ <span class="ruby-identifier">raise</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">rem</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>
1039
+
1040
+ <span class="ruby-ivar">@logger</span>.<span class="ruby-identifier">progress</span>(<span class="ruby-identifier">rem</span>.<span class="ruby-identifier">round</span>)
1041
+
1042
+ <span class="ruby-identifier">sleep</span>(<span class="ruby-value">1.0</span><span class="ruby-operator">/</span><span class="ruby-value">10.0</span>) <span class="ruby-keyword">if</span> (<span class="ruby-identifier">t</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">stime</span>).<span class="ruby-identifier">to_i</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">1</span>
1043
+ <span class="ruby-keyword">retry</span>
1044
+ <span class="ruby-keyword">end</span></pre>
1045
+ </div>
1046
+
1047
+ </div>
1048
+
1049
+
1050
+
1051
+
1052
+ </div>
1053
+
1054
+
1055
+ </section>
1056
+
1057
+ </section>
1058
+
1059
+
1060
+
1061
+ <section id="Metadata" class="documentation-section">
1062
+
1063
+ <header class="documentation-section-title">
1064
+ <h2>
1065
+ Metadata
1066
+ </h2>
1067
+ <span class="section-click-top">
1068
+ <a href="#top">&uarr; top</a>
1069
+ </span>
1070
+ </header>
1071
+
1072
+
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+ <section id="public-class-Metadata-method-details" class="method-section">
1081
+ <header>
1082
+ <h3>Public Class Methods</h3>
1083
+ </header>
1084
+
1085
+
1086
+ <div id="method-c-action_args" class="method-detail ">
1087
+
1088
+ <div class="method-heading">
1089
+ <span class="method-name">action_args</span><span
1090
+ class="method-args">(action)</span>
1091
+
1092
+ <span class="method-click-advice">click to toggle source</span>
1093
+
1094
+ </div>
1095
+
1096
+
1097
+ <div class="method-description">
1098
+
1099
+ <p>Returns an array with the names of the arguments of the specified action.</p>
1100
+
1101
+ <p>For example:</p>
1102
+
1103
+ <pre class="ruby"><span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">action_args</span> <span class="ruby-string">&#39;assert&#39;</span>
1104
+ <span class="ruby-comment"># =&gt; [ &quot;selector&quot;, &quot;text&quot; ]</span>
1105
+ </pre>
1106
+
1107
+
1108
+
1109
+
1110
+ <div class="method-source-code" id="action_args-source">
1111
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 398</span>
1112
+ <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>)
1113
+ <span class="ruby-identifier">action</span> <span class="ruby-operator">+=</span> <span class="ruby-string">&#39;_action&#39;</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>
1114
+ <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> }
1115
+ <span class="ruby-keyword">end</span></pre>
1116
+ </div>
1117
+
1118
+ </div>
1119
+
1120
+
1121
+
1122
+
1123
+ </div>
1124
+
1125
+
1126
+ <div id="method-c-actions" class="method-detail ">
1127
+
1128
+ <div class="method-heading">
1129
+ <span class="method-name">actions</span><span
1130
+ class="method-args">()</span>
1131
+
1132
+ <span class="method-click-advice">click to toggle source</span>
1133
+
1134
+ </div>
1135
+
1136
+
1137
+ <div class="method-description">
1138
+
1139
+ <p>Returns an array with the names of every action available.</p>
1140
+
1141
+ <p>For example:</p>
1142
+
1143
+ <pre class="ruby"><span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">actions</span>
1144
+ <span class="ruby-comment"># =&gt; [ &quot;assert&quot;, &quot;break&quot;, ... ]</span>
1145
+ </pre>
1146
+
1147
+
1148
+
1149
+
1150
+ <div class="method-source-code" id="actions-source">
1151
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 388</span>
1152
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">actions</span>
1153
+ <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">&#39;&#39;</span>) }
1154
+ <span class="ruby-keyword">end</span></pre>
1155
+ </div>
1156
+
1157
+ </div>
1158
+
1159
+
1160
+
1161
+
1162
+ </div>
1163
+
1164
+
1165
+ <div id="method-c-loggers" class="method-detail ">
1166
+
1167
+ <div class="method-heading">
1168
+ <span class="method-name">loggers</span><span
1169
+ class="method-args">()</span>
1170
+
1171
+ <span class="method-click-advice">click to toggle source</span>
1172
+
1173
+ </div>
1174
+
1175
+
1176
+ <div class="method-description">
1177
+
1178
+ <p>Returns an array with the names of every logger available.</p>
1179
+
1180
+ <p>For example:</p>
1181
+
1182
+ <pre class="ruby"><span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">loggers</span>
1183
+ <span class="ruby-comment"># =&gt; [ &quot;null&quot;, &quot;bash&quot;, ... ]</span>
1184
+ </pre>
1185
+
1186
+
1187
+
1188
+
1189
+ <div class="method-source-code" id="loggers-source">
1190
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 427</span>
1191
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">loggers</span>
1192
+ <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">&#39;&#39;</span>) }
1193
+ <span class="ruby-keyword">end</span></pre>
1194
+ </div>
1195
+
1196
+ </div>
1197
+
1198
+
1199
+
1200
+
1201
+ </div>
1202
+
1203
+
1204
+ <div id="method-c-max_action_name_size" class="method-detail ">
1205
+
1206
+ <div class="method-heading">
1207
+ <span class="method-name">max_action_name_size</span><span
1208
+ class="method-args">()</span>
1209
+
1210
+ <span class="method-click-advice">click to toggle source</span>
1211
+
1212
+ </div>
1213
+
1214
+
1215
+ <div class="method-description">
1216
+
1217
+ <p>Returns the maximum size in characters of an action name.</p>
1218
+
1219
+ <p>This method is useful to pretty print lists of actions</p>
1220
+
1221
+ <p>For example:</p>
1222
+
1223
+ <pre class="ruby"><span class="ruby-comment"># assuming actions = [ &quot;echo&quot;, &quot;assert&quot;, &quot;tryload&quot; ]</span>
1224
+ <span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">max_action_name_size</span>
1225
+ <span class="ruby-comment"># =&gt; 7</span>
1226
+ </pre>
1227
+
1228
+
1229
+
1230
+
1231
+ <div class="method-source-code" id="max_action_name_size-source">
1232
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 439</span>
1233
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">max_action_name_size</span>
1234
+ <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">&gt;</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> }
1235
+ <span class="ruby-keyword">end</span></pre>
1236
+ </div>
1237
+
1238
+ </div>
1239
+
1240
+
1241
+
1242
+
1243
+ </div>
1244
+
1245
+
1246
+ <div id="method-c-selectors" class="method-detail ">
1247
+
1248
+ <div class="method-heading">
1249
+ <span class="method-name">selectors</span><span
1250
+ class="method-args">(include_standard_selectors = true)</span>
1251
+
1252
+ <span class="method-click-advice">click to toggle source</span>
1253
+
1254
+ </div>
1255
+
1256
+
1257
+ <div class="method-description">
1258
+
1259
+ <p>Returns an array with the names of every selector available.</p>
1260
+
1261
+ <p>If <code>include_standard_selectors</code> is <code>true</code> (default
1262
+ behavior) both standard and custom selector are returned, otherwise only
1263
+ custom selectors are returned.</p>
1264
+
1265
+ <p>For example:</p>
1266
+
1267
+ <pre class="ruby"><span class="ruby-constant">Context</span><span class="ruby-operator">::</span><span class="ruby-identifier">selectors</span>
1268
+ <span class="ruby-comment"># =&gt; [ &quot;class&quot;, &quot;id&quot;, ... ]</span>
1269
+ </pre>
1270
+
1271
+
1272
+
1273
+
1274
+ <div class="method-source-code" id="selectors-source">
1275
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 413</span>
1276
+ <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>)
1277
+ <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">&#39;&#39;</span>) }
1278
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">include_standard_selectors</span>
1279
+ <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> }
1280
+ <span class="ruby-keyword">end</span>
1281
+ <span class="ruby-identifier">ret</span>
1282
+ <span class="ruby-keyword">end</span></pre>
1283
+ </div>
1284
+
1285
+ </div>
1286
+
1287
+
1288
+
1289
+
1290
+ </div>
1291
+
1292
+
1293
+ </section>
1294
+
1295
+ </section>
1296
+
1297
+
1298
+
1299
+ <section id="Variable+manipulation+methods" class="documentation-section">
1300
+
1301
+ <header class="documentation-section-title">
1302
+ <h2>
1303
+ Variable manipulation methods
1304
+ </h2>
1305
+ <span class="section-click-top">
1306
+ <a href="#top">&uarr; top</a>
1307
+ </span>
1308
+ </header>
1309
+
1310
+
1311
+
1312
+
1313
+
1314
+
1315
+
1316
+
1317
+
1318
+ <section id="public-instance-Variable+manipulation+methods-method-details" class="method-section">
1319
+ <header>
1320
+ <h3>Public Instance Methods</h3>
1321
+ </header>
1322
+
1323
+
1324
+ <div id="method-i-expand" class="method-detail ">
1325
+
1326
+ <div class="method-heading">
1327
+ <span class="method-name">expand</span><span
1328
+ class="method-args">(s)</span>
1329
+
1330
+ <span class="method-click-advice">click to toggle source</span>
1331
+
1332
+ </div>
1333
+
1334
+
1335
+ <div class="method-description">
1336
+
1337
+ <p>Recursively replaces occurencies of variable expansions in <code>s</code>
1338
+ with the corresponding variable value.</p>
1339
+
1340
+ <p>The variable expansion expression format is:</p>
1341
+
1342
+ <pre>&#39;${variable_name}&#39;</pre>
1343
+
1344
+ <p>For example:</p>
1345
+
1346
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">variables</span> = { <span class="ruby-string">&#39;a&#39;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;1&#39;</span>, <span class="ruby-string">&#39;b&#39;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;2&#39;</span>, <span class="ruby-string">&#39;c&#39;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;a&#39;</span> }
1347
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">expand</span> <span class="ruby-string">&#39;${a}&#39;</span> <span class="ruby-comment"># =&gt; &#39;1&#39;</span>
1348
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">expand</span> <span class="ruby-string">&#39;${b}&#39;</span> <span class="ruby-comment"># =&gt; &#39;2&#39;</span>
1349
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">expand</span> <span class="ruby-string">&#39;${c}&#39;</span> <span class="ruby-comment"># =&gt; &#39;a&#39;</span>
1350
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">expand</span> <span class="ruby-string">&#39;${${c}}&#39;</span> <span class="ruby-comment"># =&gt; &#39;1&#39;</span>
1351
+ </pre>
1352
+
1353
+
1354
+
1355
+
1356
+ <div class="method-source-code" id="expand-source">
1357
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 460</span>
1358
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">expand</span>(<span class="ruby-identifier">s</span>)
1359
+ <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>
1360
+ <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>)
1361
+ <span class="ruby-keyword">end</span>
1362
+ <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>
1363
+ <span class="ruby-identifier">result</span>
1364
+ <span class="ruby-keyword">end</span></pre>
1365
+ </div>
1366
+
1367
+ </div>
1368
+
1369
+
1370
+
1371
+
1372
+ </div>
1373
+
1374
+
1375
+ <div id="method-i-with_vars" class="method-detail ">
1376
+
1377
+ <div class="method-heading">
1378
+ <span class="method-name">with_vars</span><span
1379
+ class="method-args">(vars) { || ... }</span>
1380
+
1381
+ <span class="method-click-advice">click to toggle source</span>
1382
+
1383
+ </div>
1384
+
1385
+
1386
+ <div class="method-description">
1387
+
1388
+ <p>Temporarily alter the value of context variables.</p>
1389
+
1390
+ <p>This method alters the value of the variables specified in the
1391
+ <code>vars</code> hash for the duration of the given <code>block</code>.
1392
+ When the <code>block</code> completes, the original value of the context
1393
+ variables is restored.</p>
1394
+
1395
+ <p>For example:</p>
1396
+
1397
+ <pre class="ruby"><span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">variables</span> = { <span class="ruby-string">&#39;a&#39;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;1&#39;</span>, <span class="ruby-string">&#39;b&#39;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;2&#39;</span>, <span class="ruby-identifier">c</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;a&#39;</span> }
1398
+ <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">with_vars</span>({ <span class="ruby-string">&#39;a&#39;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;10&#39;</span>, <span class="ruby-identifier">d</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&#39;20&#39;</span> }) <span class="ruby-keyword">do</span>
1399
+ <span class="ruby-identifier">p</span> <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">variables</span>
1400
+ <span class="ruby-comment"># =&gt; {&quot;a&quot;=&gt;&quot;10&quot;, &quot;b&quot;=&gt;&quot;2&quot;, &quot;c&quot;=&gt;&quot;a&quot;, &quot;d&quot;=&gt;&quot;20&quot;}</span>
1401
+ <span class="ruby-keyword">end</span>
1402
+ <span class="ruby-identifier">p</span> <span class="ruby-identifier">ctx</span>.<span class="ruby-identifier">variables</span>
1403
+ <span class="ruby-comment"># =&gt; {&quot;a&quot;=&gt;&quot;1&quot;, &quot;b&quot;=&gt;&quot;2&quot;, &quot;c&quot;=&gt;&quot;a&quot;}</span>
1404
+ </pre>
1405
+
1406
+
1407
+
1408
+
1409
+ <div class="method-source-code" id="with_vars-source">
1410
+ <pre><span class="ruby-comment"># File lib/bauxite/core/Context.rb, line 483</span>
1411
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">with_vars</span>(<span class="ruby-identifier">vars</span>)
1412
+ <span class="ruby-identifier">current</span> = <span class="ruby-ivar">@variables</span>
1413
+ <span class="ruby-ivar">@variables</span> = <span class="ruby-ivar">@variables</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">vars</span>)
1414
+ <span class="ruby-keyword">yield</span>
1415
+ <span class="ruby-keyword">ensure</span>
1416
+ <span class="ruby-ivar">@variables</span> = <span class="ruby-identifier">current</span>
1417
+ <span class="ruby-keyword">end</span></pre>
1418
+ </div>
1419
+
1420
+ </div>
1421
+
1422
+
1423
+
1424
+
1425
+ </div>
1426
+
1427
+
1428
+ </section>
1429
+
1430
+ </section>
1431
+ </main>
1432
+
1433
+
1434
+ <footer id="validator-badges" role="contentinfo">
1435
+ <p><a href="http://validator.w3.org/check/referer">Validate</a>
1436
+ <p>Generated by <a href="http://rdoc.rubyforge.org">RDoc</a> 4.1.1.
1437
+ <p>Based on <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
1438
+ </footer>
1439
+