lifeline 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/README.rdoc +12 -0
- data/VERSION +1 -1
- data/doc/Lifeline.html +473 -0
- data/doc/Lifeline/LifelineRakeTask.html +400 -0
- data/doc/_index.html +101 -0
- data/doc/class_list.html +36 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +50 -0
- data/doc/css/style.css +273 -0
- data/doc/file.README.html +159 -0
- data/doc/file_list.html +38 -0
- data/doc/frames.html +13 -0
- data/doc/index.html +159 -0
- data/doc/js/app.js +111 -0
- data/doc/js/full_list.js +117 -0
- data/doc/js/jquery.js +19 -0
- data/doc/method_list.html +75 -0
- data/doc/top-level-namespace.html +87 -0
- data/lifeline.gemspec +76 -0
- metadata +19 -2
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -40,6 +40,15 @@ More specifically, the lifeline method (and rake task that calls it) does the fo
|
|
40
40
|
* If there is another process with the same command string, return and exit
|
41
41
|
* Otherwise yield to run the passed block.
|
42
42
|
|
43
|
+
Note that you do not pass a command name to the lifeline, it uses the command
|
44
|
+
of the process invoking the Lifeline code. This means if you call lifeline
|
45
|
+
code simultaneously from a Rake task and a Rails process, it will be executed
|
46
|
+
in both cases (it's NOT a mutex or semaphore). Also, this mechanism uses a
|
47
|
+
global namespace. means you will want to give unique names to the processes
|
48
|
+
that ultimately invoke your lifeline code. If app1 and app2 both have a rake
|
49
|
+
task named "lifeline," they will interfere with each other ("app1:lifeline"
|
50
|
+
and "app2:lifeline" are much better).
|
51
|
+
|
43
52
|
== Examples
|
44
53
|
|
45
54
|
Lifeline.lifeline do
|
@@ -51,6 +60,9 @@ More specifically, the lifeline method (and rake task that calls it) does the fo
|
|
51
60
|
end
|
52
61
|
|
53
62
|
> rake -T appname
|
63
|
+
rake appname:lifeline # A lifeline task for executing only one process of twitter:daemon:run at a time
|
64
|
+
rake appname:run # Runs the twitter:daemon:run task
|
65
|
+
rake appname:terminate # Terminates any running twitter:daemon:lifeline tasks
|
54
66
|
|
55
67
|
== Note on Patches/Pull Requests
|
56
68
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/doc/Lifeline.html
ADDED
@@ -0,0 +1,473 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
6
|
+
<title>Module: Lifeline</title>
|
7
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
8
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
9
|
+
|
10
|
+
<script type="text/javascript" charset="utf-8">
|
11
|
+
relpath = '';
|
12
|
+
if (relpath != '') relpath += '/';
|
13
|
+
</script>
|
14
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
15
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
16
|
+
|
17
|
+
</head>
|
18
|
+
<body>
|
19
|
+
<script type="text/javascript" charset="utf-8">
|
20
|
+
if (window.top.frames.main) document.body.className = 'frames';
|
21
|
+
</script>
|
22
|
+
|
23
|
+
<div id="header">
|
24
|
+
<div id="menu">
|
25
|
+
|
26
|
+
<a href="_index.html">Index (L)</a> »
|
27
|
+
|
28
|
+
|
29
|
+
<span class="title">Lifeline</span>
|
30
|
+
|
31
|
+
|
32
|
+
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="search">
|
36
|
+
<a id="class_list_link" href="#">Class List</a>
|
37
|
+
<a id="method_list_link" href="#">Method List</a>
|
38
|
+
<a id ="file_list_link" href="#">File List</a>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<div class="clear"></div>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<iframe id="search_frame"></iframe>
|
45
|
+
|
46
|
+
<div id="content"><h1>Module: Lifeline
|
47
|
+
|
48
|
+
|
49
|
+
</h1>
|
50
|
+
|
51
|
+
<dl class="box">
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
<dt class="r1 last">Defined in:</dt>
|
61
|
+
<dd class="r1 last">lib/lifeline.rb</dd>
|
62
|
+
|
63
|
+
</dl>
|
64
|
+
<div class="clear"></div>
|
65
|
+
|
66
|
+
<h2>Defined Under Namespace</h2>
|
67
|
+
<p class="children">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
<strong class="classes">Classes:</strong> <a href="Lifeline/LifelineRakeTask.html" title="Lifeline::LifelineRakeTask (class)">LifelineRakeTask</a>
|
73
|
+
|
74
|
+
|
75
|
+
</p>
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
<h2>Instance Method Summary</h2>
|
81
|
+
|
82
|
+
<ul class="summary">
|
83
|
+
|
84
|
+
<li class="public ">
|
85
|
+
<span class="summary_signature">
|
86
|
+
|
87
|
+
<a href="#define_lifeline_tasks-instance_method" title="#define_lifeline_tasks (instance method)">- (Object) <strong>define_lifeline_tasks</strong>(namespace, &block) </a>
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
</span>
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
<span class="summary_desc"><div class='inline'><p>
|
100
|
+
A method that defines 3 rake tasks for doing lifelines:
|
101
|
+
</p>
|
102
|
+
<ul>
|
103
|
+
<li><tt>namespace:run</tt> runs the specified block
|
104
|
+
|
105
|
+
</li>
|
106
|
+
<li><tt>namespace:lifeline</tt> a lifeline for executing only a single copy of
|
107
|
+
<tt>namespace:run</tt> at a time
|
108
|
+
|
109
|
+
</li>
|
110
|
+
<li><tt>namespace:terminate</tt> a task for terminating the lifelines.
|
111
|
+
|
112
|
+
</li>
|
113
|
+
</ul>
|
114
|
+
</div></span>
|
115
|
+
|
116
|
+
</li>
|
117
|
+
|
118
|
+
|
119
|
+
<li class="public ">
|
120
|
+
<span class="summary_signature">
|
121
|
+
|
122
|
+
<a href="#get_process_list-instance_method" title="#get_process_list (instance method)">- (Object) <strong>get_process_list</strong> </a>
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
</span>
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
<span class="summary_desc"><div class='inline'></div></span>
|
135
|
+
|
136
|
+
</li>
|
137
|
+
|
138
|
+
|
139
|
+
<li class="public ">
|
140
|
+
<span class="summary_signature">
|
141
|
+
|
142
|
+
<a href="#lifeline-instance_method" title="#lifeline (instance method)">- (Object) <strong>lifeline</strong> </a>
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
</span>
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
<span class="summary_desc"><div class='inline'><p>
|
155
|
+
A method for executing a block of code only if there is no other process
|
156
|
+
with the same command running.
|
157
|
+
</p>
|
158
|
+
</div></span>
|
159
|
+
|
160
|
+
</li>
|
161
|
+
|
162
|
+
|
163
|
+
</ul>
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
|
168
|
+
<div id="instance_method_details" class="method_details_list">
|
169
|
+
<h2>Instance Method Details</h2>
|
170
|
+
|
171
|
+
|
172
|
+
<div class="method_details first">
|
173
|
+
<p class="signature first" id="define_lifeline_tasks-instance_method">
|
174
|
+
|
175
|
+
- (<tt>Object</tt>) <strong>define_lifeline_tasks</strong>(namespace, &block)
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
</p><div class="docstring">
|
180
|
+
<div class="discussion">
|
181
|
+
<p>
|
182
|
+
A method that defines 3 rake tasks for doing lifelines:
|
183
|
+
</p>
|
184
|
+
<ul>
|
185
|
+
<li><tt>namespace:run</tt> runs the specified block
|
186
|
+
|
187
|
+
</li>
|
188
|
+
<li><tt>namespace:lifeline</tt> a lifeline for executing only a single copy of
|
189
|
+
<tt>namespace:run</tt> at a time
|
190
|
+
|
191
|
+
</li>
|
192
|
+
<li><tt>namespace:terminate</tt> a task for terminating the lifelines
|
193
|
+
|
194
|
+
</li>
|
195
|
+
</ul>
|
196
|
+
|
197
|
+
|
198
|
+
</div>
|
199
|
+
</div>
|
200
|
+
<div class="tags">
|
201
|
+
<h3>Parameters:</h3>
|
202
|
+
<ul class="param">
|
203
|
+
|
204
|
+
<li>
|
205
|
+
|
206
|
+
<span class='type'>(<tt>String</tt>, <tt>Symbol</tt>)</span>
|
207
|
+
|
208
|
+
|
209
|
+
<span class='name'>namespace</span>
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
—
|
214
|
+
<div class='inline'><p>
|
215
|
+
the namespace to define the 3 tasks in
|
216
|
+
</p>
|
217
|
+
</div>
|
218
|
+
|
219
|
+
</li>
|
220
|
+
|
221
|
+
<li>
|
222
|
+
|
223
|
+
<span class='type'></span>
|
224
|
+
|
225
|
+
|
226
|
+
<span class='name'>&block</span>
|
227
|
+
|
228
|
+
|
229
|
+
|
230
|
+
—
|
231
|
+
<div class='inline'><p>
|
232
|
+
a block which defines the body of the namespace:run method
|
233
|
+
</p>
|
234
|
+
</div>
|
235
|
+
|
236
|
+
</li>
|
237
|
+
|
238
|
+
</ul>
|
239
|
+
<h3>Raises:</h3>
|
240
|
+
<ul class="raise">
|
241
|
+
|
242
|
+
<li>
|
243
|
+
|
244
|
+
<span class='type'>(<tt>ArgumentError</tt>)</span>
|
245
|
+
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
—
|
250
|
+
<div class='inline'><p>
|
251
|
+
if you do not pass in a block argument
|
252
|
+
</p>
|
253
|
+
</div>
|
254
|
+
|
255
|
+
</li>
|
256
|
+
|
257
|
+
</ul>
|
258
|
+
|
259
|
+
</div><table class="source_code">
|
260
|
+
<tr>
|
261
|
+
<td>
|
262
|
+
<pre class="lines">
|
263
|
+
|
264
|
+
|
265
|
+
129
|
266
|
+
130
|
267
|
+
131</pre>
|
268
|
+
</td>
|
269
|
+
<td>
|
270
|
+
<pre class="code"><span class="info file"># File 'lib/lifeline.rb', line 129</span>
|
271
|
+
|
272
|
+
<span class='def def kw'>def</span> <span class='define_lifeline_tasks identifier id'>define_lifeline_tasks</span><span class='lparen token'>(</span><span class='namespace identifier id'>namespace</span><span class='comma token'>,</span> <span class='bitand op'>&</span><span class='block identifier id'>block</span><span class='rparen token'>)</span>
|
273
|
+
<span class='LifelineRakeTask constant id'>LifelineRakeTask</span><span class='dot token'>.</span><span class='new identifier id'>new</span><span class='lparen token'>(</span><span class='namespace identifier id'>namespace</span><span class='comma token'>,</span> <span class='bitand op'>&</span><span class='block identifier id'>block</span><span class='rparen token'>)</span>
|
274
|
+
<span class='end end kw'>end</span>
|
275
|
+
</pre>
|
276
|
+
</td>
|
277
|
+
</tr>
|
278
|
+
</table>
|
279
|
+
</div>
|
280
|
+
|
281
|
+
<div class="method_details ">
|
282
|
+
<p class="signature " id="get_process_list-instance_method">
|
283
|
+
|
284
|
+
- (<tt>Object</tt>) <strong>get_process_list</strong>
|
285
|
+
|
286
|
+
|
287
|
+
|
288
|
+
</p><div class="docstring">
|
289
|
+
<div class="discussion">
|
290
|
+
|
291
|
+
|
292
|
+
</div>
|
293
|
+
</div>
|
294
|
+
<div class="tags">
|
295
|
+
|
296
|
+
</div><table class="source_code">
|
297
|
+
<tr>
|
298
|
+
<td>
|
299
|
+
<pre class="lines">
|
300
|
+
|
301
|
+
|
302
|
+
7
|
303
|
+
8
|
304
|
+
9
|
305
|
+
10
|
306
|
+
11
|
307
|
+
12
|
308
|
+
13
|
309
|
+
14
|
310
|
+
15
|
311
|
+
16
|
312
|
+
17</pre>
|
313
|
+
</td>
|
314
|
+
<td>
|
315
|
+
<pre class="code"><span class="info file"># File 'lib/lifeline.rb', line 7</span>
|
316
|
+
|
317
|
+
<span class='def def kw'>def</span> <span class='get_process_list identifier id'>get_process_list</span>
|
318
|
+
<span class='processes identifier id'>processes</span> <span class='assign token'>=</span> <span class='xstring val'>%x{ps ax -o pid,command}</span>
|
319
|
+
|
320
|
+
<span class='return return kw'>return</span> <span class='nil nil kw'>nil</span> <span class='if if_mod kw'>if</span> <span class='processes identifier id'>processes</span><span class='dot token'>.</span><span class='nil? fid id'>nil?</span>
|
321
|
+
|
322
|
+
<span class='processes identifier id'>processes</span><span class='dot token'>.</span><span class='split identifier id'>split</span><span class='lparen token'>(</span><span class='regexp val'>/\n/</span><span class='rparen token'>)</span><span class='dot token'>.</span><span class='map identifier id'>map</span> <span class='do do kw'>do</span> <span class='bitor op'>|</span><span class='p identifier id'>p</span><span class='bitor op'>|</span>
|
323
|
+
<span class='if if kw'>if</span> <span class='p identifier id'>p</span> <span class='match op'>=~</span> <span class='regexp val'>/^(\d+)\s(.+)$/</span>
|
324
|
+
<span class='lbrace token'>{</span><span class='symbol val'>:pid</span> <span class='assign token'>=</span><span class='gt op'>></span> <span class='$1 nth_ref id'>$1</span><span class='dot token'>.</span><span class='to_i identifier id'>to_i</span><span class='comma token'>,</span> <span class='symbol val'>:command</span> <span class='assign token'>=</span><span class='gt op'>></span> <span class='$2 nth_ref id'>$2</span><span class='dot token'>.</span><span class='strip identifier id'>strip</span><span class='rbrace token'>}</span>
|
325
|
+
<span class='end end kw'>end</span>
|
326
|
+
<span class='end end kw'>end</span><span class='dot token'>.</span><span class='compact identifier id'>compact</span>
|
327
|
+
<span class='end end kw'>end</span>
|
328
|
+
</pre>
|
329
|
+
</td>
|
330
|
+
</tr>
|
331
|
+
</table>
|
332
|
+
</div>
|
333
|
+
|
334
|
+
<div class="method_details ">
|
335
|
+
<p class="signature " id="lifeline-instance_method">
|
336
|
+
|
337
|
+
- (<tt>Object</tt>) <strong>lifeline</strong>
|
338
|
+
|
339
|
+
|
340
|
+
|
341
|
+
</p><div class="docstring">
|
342
|
+
<div class="discussion">
|
343
|
+
<p>
|
344
|
+
A method for executing a block of code only if there is no other process
|
345
|
+
with the same command running. This is useful if you want to have a
|
346
|
+
perpetually running daemon that only executes once at a time. It uses the
|
347
|
+
process name returned by ps ax to see if there is a process with the same
|
348
|
+
command name but a different PID already executing. If so, it terminates
|
349
|
+
without running the block. NOTE: since it uses the command name returned
|
350
|
+
from <tt>ps ax</tt>, it us up to to you to name the process containing this
|
351
|
+
code with a distinctly unique name. If two separate Rails projects both
|
352
|
+
have a <tt>rake lifeline</tt> task they WILL interfere with each other.
|
353
|
+
I’d suggest prefixing with the project name (ie,
|
354
|
+
<tt>doc_viewer:lifeline</tt>) to be sure
|
355
|
+
</p>
|
356
|
+
|
357
|
+
|
358
|
+
</div>
|
359
|
+
</div>
|
360
|
+
<div class="tags">
|
361
|
+
<h3>Parameters:</h3>
|
362
|
+
<ul class="param">
|
363
|
+
|
364
|
+
<li>
|
365
|
+
|
366
|
+
<span class='type'></span>
|
367
|
+
|
368
|
+
|
369
|
+
<span class='name'>&block</span>
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
—
|
374
|
+
<div class='inline'><p>
|
375
|
+
a block which is executed if there is not already a lifeline running.
|
376
|
+
</p>
|
377
|
+
</div>
|
378
|
+
|
379
|
+
</li>
|
380
|
+
|
381
|
+
</ul>
|
382
|
+
<h3>Raises:</h3>
|
383
|
+
<ul class="raise">
|
384
|
+
|
385
|
+
<li>
|
386
|
+
|
387
|
+
<span class='type'>(<tt>ArgumentError</tt>)</span>
|
388
|
+
|
389
|
+
|
390
|
+
|
391
|
+
|
392
|
+
—
|
393
|
+
<div class='inline'><p>
|
394
|
+
if you do not pass in a block argument
|
395
|
+
</p>
|
396
|
+
</div>
|
397
|
+
|
398
|
+
</li>
|
399
|
+
|
400
|
+
</ul>
|
401
|
+
|
402
|
+
</div><table class="source_code">
|
403
|
+
<tr>
|
404
|
+
<td>
|
405
|
+
<pre class="lines">
|
406
|
+
|
407
|
+
|
408
|
+
29
|
409
|
+
30
|
410
|
+
31
|
411
|
+
32
|
412
|
+
33
|
413
|
+
34
|
414
|
+
35
|
415
|
+
36
|
416
|
+
37
|
417
|
+
38
|
418
|
+
39
|
419
|
+
40
|
420
|
+
41
|
421
|
+
42
|
422
|
+
43
|
423
|
+
44
|
424
|
+
45
|
425
|
+
46
|
426
|
+
47
|
427
|
+
48
|
428
|
+
49
|
429
|
+
50</pre>
|
430
|
+
</td>
|
431
|
+
<td>
|
432
|
+
<pre class="code"><span class="info file"># File 'lib/lifeline.rb', line 29</span>
|
433
|
+
|
434
|
+
<span class='def def kw'>def</span> <span class='lifeline identifier id'>lifeline</span>
|
435
|
+
<span class='if if kw'>if</span> <span class='notop op'>!</span><span class='block_given? fid id'>block_given?</span>
|
436
|
+
<span class='raise identifier id'>raise</span> <span class='ArgumentError constant id'>ArgumentError</span><span class='comma token'>,</span> <span class='string val'>"You must pass in a block to be the body of the run rake task"</span>
|
437
|
+
<span class='end end kw'>end</span>
|
438
|
+
|
439
|
+
<span class='my_pid identifier id'>my_pid</span> <span class='assign token'>=</span> <span class='$$ gvar id'>$$</span>
|
440
|
+
<span class='processes identifier id'>processes</span> <span class='assign token'>=</span> <span class='get_process_list identifier id'>get_process_list</span>
|
441
|
+
|
442
|
+
<span class='if if kw'>if</span> <span class='processes identifier id'>processes</span><span class='dot token'>.</span><span class='nil? fid id'>nil?</span> <span class='orop op'>||</span> <span class='processes identifier id'>processes</span><span class='dot token'>.</span><span class='empty? fid id'>empty?</span>
|
443
|
+
<span class='raise identifier id'>raise</span> <span class='string val'>"No processes being returned by get_process_list. Aborting!"</span>
|
444
|
+
<span class='end end kw'>end</span>
|
445
|
+
|
446
|
+
<span class='myself identifier id'>myself</span> <span class='assign token'>=</span> <span class='processes identifier id'>processes</span><span class='dot token'>.</span><span class='detect identifier id'>detect</span> <span class='lbrace token'>{</span><span class='bitor op'>|</span><span class='p identifier id'>p</span><span class='bitor op'>|</span> <span class='p identifier id'>p</span><span class='lbrack token'>[</span><span class='symbol val'>:pid</span><span class='rbrack token'>]</span> <span class='eq op'>==</span> <span class='my_pid identifier id'>my_pid</span><span class='rbrace token'>}</span>
|
447
|
+
<span class='if if kw'>if</span> <span class='myself identifier id'>myself</span><span class='dot token'>.</span><span class='nil? fid id'>nil?</span>
|
448
|
+
<span class='raise identifier id'>raise</span> <span class='string val'>"Unable to find self in process list. This is bizarre to say the least. Exiting"</span>
|
449
|
+
<span class='end end kw'>end</span>
|
450
|
+
|
451
|
+
<span class='comment val'># there isn't already another process running with the same command</span>
|
452
|
+
<span class='if if kw'>if</span> <span class='notop op'>!</span><span class='processes identifier id'>processes</span><span class='dot token'>.</span><span class='any? fid id'>any?</span> <span class='lbrace token'>{</span><span class='bitor op'>|</span><span class='p identifier id'>p</span><span class='bitor op'>|</span> <span class='p identifier id'>p</span><span class='lbrack token'>[</span><span class='symbol val'>:pid</span><span class='rbrack token'>]</span> <span class='neq op'>!=</span> <span class='my_pid identifier id'>my_pid</span> <span class='andop op'>&&</span> <span class='p identifier id'>p</span><span class='lbrack token'>[</span><span class='symbol val'>:command</span><span class='rbrack token'>]</span> <span class='eq op'>==</span> <span class='myself identifier id'>myself</span><span class='lbrack token'>[</span><span class='symbol val'>:command</span><span class='rbrack token'>]</span><span class='rbrace token'>}</span>
|
453
|
+
<span class='yield yield kw'>yield</span>
|
454
|
+
<span class='end end kw'>end</span>
|
455
|
+
<span class='end end kw'>end</span>
|
456
|
+
</pre>
|
457
|
+
</td>
|
458
|
+
</tr>
|
459
|
+
</table>
|
460
|
+
</div>
|
461
|
+
|
462
|
+
</div>
|
463
|
+
|
464
|
+
</div>
|
465
|
+
|
466
|
+
<div id="footer">
|
467
|
+
Generated on Tue Apr 13 12:07:29 2010 by
|
468
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool">yard</a>
|
469
|
+
0.5.4 (ruby-1.8.7).
|
470
|
+
</div>
|
471
|
+
|
472
|
+
</body>
|
473
|
+
</html>
|