immunoscore_results_aggregator 0.0.3

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.
@@ -0,0 +1,485 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <title>immunoscore_results_loader.rb</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
7
+ <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
8
+ <link rel="stylesheet" media="all" href="docco.css" />
9
+ </head>
10
+ <body>
11
+ <div id="container">
12
+ <div id="background"></div>
13
+
14
+ <ul id="jump_to">
15
+ <li>
16
+ <a class="large" href="javascript:void(0);">Jump To &hellip;</a>
17
+ <a class="small" href="javascript:void(0);">+</a>
18
+ <div id="jump_wrapper">
19
+ <div id="jump_page">
20
+
21
+
22
+ <a class="source" href="analyzer.html">
23
+ analyzer.rb
24
+ </a>
25
+
26
+
27
+ <a class="source" href="cli.html">
28
+ cli.rb
29
+ </a>
30
+
31
+
32
+ <a class="source" href="data_struct.html">
33
+ data_struct.rb
34
+ </a>
35
+
36
+
37
+ <a class="source" href="database_connection.html">
38
+ database_connection.rb
39
+ </a>
40
+
41
+
42
+ <a class="source" href="exporter.html">
43
+ exporter.rb
44
+ </a>
45
+
46
+
47
+ <a class="source" href="immunoscore_results_loader.html">
48
+ immunoscore_results_loader.rb
49
+ </a>
50
+
51
+
52
+ <a class="source" href="mongo_aggregator.html">
53
+ mongo_aggregator.rb
54
+ </a>
55
+
56
+
57
+ <a class="source" href="semicolon_cleaner.html">
58
+ semicolon_cleaner.rb
59
+ </a>
60
+
61
+ </div>
62
+ </li>
63
+ </ul>
64
+
65
+ <ul class="sections">
66
+
67
+ <li id="title">
68
+ <div class="annotation">
69
+ <h1>immunoscore_results_loader.rb</h1>
70
+ </div>
71
+ </li>
72
+
73
+
74
+
75
+ <li id="section-1">
76
+ <div class="annotation">
77
+
78
+ <div class="pilwrap ">
79
+ <a class="pilcrow" href="#section-1">&#182;</a>
80
+ </div>
81
+ <p>Copyright (c) 2014, Carlo B. Bifulco. All rights reserved.</p>
82
+
83
+ </div>
84
+
85
+ <div class="content"><div class='highlight'><pre>
86
+ <span class="hljs-keyword">require</span> <span class="hljs-string">"csv"</span>
87
+ <span class="hljs-keyword">require</span> <span class="hljs-string">"yaml"</span>
88
+ <span class="hljs-keyword">require</span> <span class="hljs-string">"mongo_mapper"</span>
89
+ require_relative <span class="hljs-string">"database_connection"</span>
90
+ require_relative <span class="hljs-string">"analyzer"</span>
91
+ require_relative <span class="hljs-string">"data_struct"</span></pre></div></div>
92
+
93
+ </li>
94
+
95
+
96
+ <li id="section-2">
97
+ <div class="annotation">
98
+
99
+ <div class="pilwrap ">
100
+ <a class="pilcrow" href="#section-2">&#182;</a>
101
+ </div>
102
+ <h2 id="pull-info-from-definiens-immunoscore-directories">Pull info from Definiens Immunoscore Directories</h2>
103
+ <p>pattern matching based</p>
104
+
105
+ </div>
106
+
107
+ </li>
108
+
109
+
110
+ <li id="section-3">
111
+ <div class="annotation">
112
+
113
+ <div class="pilwrap ">
114
+ <a class="pilcrow" href="#section-3">&#182;</a>
115
+ </div>
116
+ <p>filename convetions
117
+ RS_SP02-15779-A8__CD3_2013…
118
+ no underscores in the file name after the RS prefix
119
+ they are required before and after case number for pattern matching</p>
120
+
121
+ </div>
122
+
123
+ </li>
124
+
125
+
126
+ <li id="section-4">
127
+ <div class="annotation">
128
+
129
+ <div class="pilwrap ">
130
+ <a class="pilcrow" href="#section-4">&#182;</a>
131
+ </div>
132
+ <h3 id="a-few-examples-of-what-we-are-looking-for">A few examples of what we are looking for</h3>
133
+ <p>image_0000006499_Classification.jpg
134
+ image_0000006504_Original.jpg
135
+ .image_0000006506_densitymap_new.jpg
136
+ .image_0000006506_histogram.jpg
137
+ image_0000006506_CT1.jpg. CT2, CT3
138
+ IM1, IM2, IM3</p>
139
+
140
+ </div>
141
+
142
+ </li>
143
+
144
+
145
+ <li id="section-5">
146
+ <div class="annotation">
147
+
148
+ <div class="pilwrap ">
149
+ <a class="pilcrow" href="#section-5">&#182;</a>
150
+ </div>
151
+ <h2 id="where-all-the-definies-stuff-resides">Where all the Definies stuff resides</h2>
152
+
153
+ </div>
154
+
155
+ <div class="content"><div class='highlight'><pre><span class="hljs-constant">BASE_DIR</span>=<span class="hljs-constant">YAML</span>.load_file(<span class="hljs-string">"./config.yaml"</span>)[<span class="hljs-string">"base_dir"</span>] <span class="hljs-keyword">or</span> <span class="hljs-string">"/Volumes/cbb_transfer"</span></pre></div></div>
156
+
157
+ </li>
158
+
159
+
160
+ <li id="section-6">
161
+ <div class="annotation">
162
+
163
+ <div class="pilwrap ">
164
+ <a class="pilcrow" href="#section-6">&#182;</a>
165
+ </div>
166
+ <p>BASE_DIR=”/Volumes/I\$/Christopher\ Paustian/Colon\ Immunoscore”</p>
167
+
168
+ </div>
169
+
170
+ </li>
171
+
172
+
173
+ <li id="section-7">
174
+ <div class="annotation">
175
+
176
+ <div class="pilwrap ">
177
+ <a class="pilcrow" href="#section-7">&#182;</a>
178
+ </div>
179
+ <h2 id="regex-utilities">regex utilities</h2>
180
+
181
+ </div>
182
+
183
+ <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">def</span> </span>pull_cd path
184
+ path.match(<span class="hljs-regexp">/.*(CD[8|3]).*/</span>)[<span class="hljs-number">1</span>] <span class="hljs-keyword">if</span> path.match(<span class="hljs-regexp">/.*(CD[8|3]).*/</span>)
185
+ <span class="hljs-keyword">end</span>
186
+
187
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>pull_ct path
188
+ pattern=<span class="hljs-regexp">/.*(CT[1|2|3|4|5|6|7|8])\.jpg/</span>
189
+ path.match(pattern)[<span class="hljs-number">1</span>] <span class="hljs-keyword">if</span> path.match(pattern)
190
+ <span class="hljs-keyword">end</span>
191
+
192
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>pull_im path
193
+ pattern=<span class="hljs-regexp">/.*(IM[1|2|3|4|5|6|7|8])\.jpg/</span>
194
+ path.match(pattern)[<span class="hljs-number">1</span>] <span class="hljs-keyword">if</span> path.match(pattern)
195
+ <span class="hljs-keyword">end</span></pre></div></div>
196
+
197
+ </li>
198
+
199
+
200
+ <li id="section-8">
201
+ <div class="annotation">
202
+
203
+ <div class="pilwrap ">
204
+ <a class="pilcrow" href="#section-8">&#182;</a>
205
+ </div>
206
+ <h3 id="case-identification">Case identification</h3>
207
+ <p>matched file names staring with RS follow by either - or <em> followed by SP03
208
+ followed by either - or </em> followed by case number. Matching of teh block
209
+ number is not included </p>
210
+
211
+ </div>
212
+
213
+ <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">def</span> </span>get_case_n path
214
+ match=path.match(<span class="hljs-regexp">/(RS[_-].?.?.?.?.[-_]\d*)/i</span>)
215
+ match[<span class="hljs-number">0</span>] <span class="hljs-keyword">if</span> match
216
+ <span class="hljs-keyword">end</span></pre></div></div>
217
+
218
+ </li>
219
+
220
+
221
+ <li id="section-9">
222
+ <div class="annotation">
223
+
224
+ <div class="pilwrap ">
225
+ <a class="pilcrow" href="#section-9">&#182;</a>
226
+ </div>
227
+ <h2 id="core-function">core function</h2>
228
+
229
+ </div>
230
+
231
+ <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_files file_name_ending=<span class="hljs-string">"*Classification.jpg"</span>, base_dir=<span class="hljs-constant">BASE_DIR</span>
232
+ results=[]
233
+ <span class="hljs-constant">Dir</span>.glob(<span class="hljs-string">"<span class="hljs-subst">#{base_dir}</span>/**/<span class="hljs-subst">#{file_name_ending}</span>"</span>).each <span class="hljs-keyword">do</span> |full_path|
234
+ puts <span class="hljs-string">"am working on <span class="hljs-subst">#{full_path}</span>"</span>
235
+ directory_name=full_path.split(<span class="hljs-string">"\/"</span>)[-<span class="hljs-number">4</span>]
236
+ case_name=get_case_n full_path
237
+ cd=directory_name.split(<span class="hljs-string">"_"</span>)[<span class="hljs-number">2</span>]
238
+ results &lt;&lt; {<span class="hljs-symbol">:case_n=&gt;case_name</span>,
239
+ <span class="hljs-symbol">:cd_type</span> =&gt;cd,
240
+ <span class="hljs-symbol">:path=&gt;full_path</span>}
241
+ <span class="hljs-keyword">end</span>
242
+ results
243
+ <span class="hljs-keyword">end</span></pre></div></div>
244
+
245
+ </li>
246
+
247
+
248
+ <li id="section-10">
249
+ <div class="annotation">
250
+
251
+ <div class="pilwrap ">
252
+ <a class="pilcrow" href="#section-10">&#182;</a>
253
+ </div>
254
+ <h3 id="special-functions">special functions</h3>
255
+
256
+ </div>
257
+
258
+ <div class="content"><div class='highlight'><pre>
259
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_ct
260
+ find_files(file_name_ending=<span class="hljs-string">"*image*CT*.jpg"</span>).map{|x| x[<span class="hljs-symbol">:path</span>]}.map <span class="hljs-keyword">do</span> |path|
261
+ case_n=get_case_n path
262
+ cd =pull_cd(path)
263
+ tile=pull_ct path
264
+ {<span class="hljs-symbol">:cd_type=&gt;cd</span>, <span class="hljs-symbol">:path=&gt;path</span>, <span class="hljs-symbol">:tile=&gt;tile</span>, <span class="hljs-symbol">:case_n=&gt;case_n</span>, <span class="hljs-symbol">:type=&gt;</span><span class="hljs-symbol">:ct_tile</span>}
265
+ <span class="hljs-keyword">end</span>
266
+ <span class="hljs-keyword">end</span>
267
+
268
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_im
269
+ find_files(file_name_ending=<span class="hljs-string">"*image*IM*.jpg"</span>).map{|x| x[<span class="hljs-symbol">:path</span>]}.map <span class="hljs-keyword">do</span> |path|
270
+ case_n=get_case_n path
271
+ cd =pull_cd(path)
272
+ tile=pull_im path
273
+ {<span class="hljs-symbol">:cd_type=&gt;cd</span>, <span class="hljs-symbol">:path=&gt;path</span>, <span class="hljs-symbol">:tile=&gt;tile</span>, <span class="hljs-symbol">:case_n=&gt;case_n</span>,<span class="hljs-symbol">:type=&gt;</span><span class="hljs-symbol">:im_tile</span>}
274
+ <span class="hljs-keyword">end</span>
275
+ <span class="hljs-keyword">end</span>
276
+
277
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_classification
278
+ find_files(file_name_ending=<span class="hljs-string">"*Classification.jpg"</span>).map <span class="hljs-keyword">do</span> |x|
279
+ x.merge({<span class="hljs-symbol">:type</span> =&gt; <span class="hljs-symbol">:classification</span>})
280
+ <span class="hljs-keyword">end</span>
281
+ <span class="hljs-keyword">end</span>
282
+
283
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_original
284
+ find_files(file_name_ending=<span class="hljs-string">"*Original.jpg"</span>).map <span class="hljs-keyword">do</span> |x|
285
+ x.merge({<span class="hljs-symbol">:type</span> =&gt; <span class="hljs-symbol">:original</span>})
286
+ <span class="hljs-keyword">end</span>
287
+ <span class="hljs-keyword">end</span>
288
+
289
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_statistics
290
+ find_files(file_name_ending=<span class="hljs-string">"*Statistics.csv"</span>).map <span class="hljs-keyword">do</span> |x|
291
+ puts x
292
+ {<span class="hljs-symbol">:case_n=&gt;</span> x[<span class="hljs-symbol">:case_n</span>],
293
+ <span class="hljs-symbol">:path=&gt;</span> x[<span class="hljs-symbol">:path</span>],
294
+ <span class="hljs-symbol">:cd_type=&gt;pull_cd</span>(x[<span class="hljs-symbol">:path</span>]),
295
+ <span class="hljs-symbol">:type=&gt;</span> <span class="hljs-symbol">:statistic</span>}
296
+ <span class="hljs-keyword">end</span>
297
+ <span class="hljs-keyword">end</span>
298
+
299
+
300
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_density
301
+ find_files(file_name_ending=<span class="hljs-string">"*densitymap*.jpg"</span>).map <span class="hljs-keyword">do</span> |x|
302
+ path=x[<span class="hljs-symbol">:path</span>]
303
+ case_n=get_case_n path
304
+ new_old=path.gsub(<span class="hljs-string">".jpg"</span>,<span class="hljs-string">""</span>)[-<span class="hljs-number">3</span>..-<span class="hljs-number">1</span>]
305
+ {<span class="hljs-symbol">:path=&gt;path</span>, <span class="hljs-symbol">:case_n=&gt;case_n</span>, <span class="hljs-symbol">:new_old=&gt;new_old</span>,
306
+ <span class="hljs-symbol">:cd_type=&gt;pull_cd</span>(path),<span class="hljs-symbol">:type=&gt;</span><span class="hljs-symbol">:density</span>}
307
+ <span class="hljs-keyword">end</span>
308
+ <span class="hljs-keyword">end</span>
309
+
310
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>find_histogram
311
+ find_files(file_name_ending=<span class="hljs-string">"*histogram.jpg"</span>).map <span class="hljs-keyword">do</span> |x|
312
+ path=x[<span class="hljs-symbol">:path</span>]
313
+ case_n=get_case_n path
314
+ cd=pull_cd(path)
315
+ {<span class="hljs-symbol">:path=&gt;path</span>, <span class="hljs-symbol">:case_n=&gt;case_n</span>,<span class="hljs-symbol">:type=&gt;</span><span class="hljs-symbol">:histogram</span>, <span class="hljs-symbol">:cd_type=&gt;cd</span>}
316
+ <span class="hljs-keyword">end</span>
317
+ <span class="hljs-keyword">end</span></pre></div></div>
318
+
319
+ </li>
320
+
321
+
322
+ <li id="section-11">
323
+ <div class="annotation">
324
+
325
+ <div class="pilwrap ">
326
+ <a class="pilcrow" href="#section-11">&#182;</a>
327
+ </div>
328
+ <h3 id="merges-all-the-json-structures-coming-from-the-search-functions">merges all the JSON structures coming from the search functions</h3>
329
+ <p>some metaprogramming: calls all find functions listed above</p>
330
+
331
+ </div>
332
+
333
+ <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">def</span> </span>search_all
334
+ r=[]
335
+ [<span class="hljs-symbol">:find_histogram</span>,<span class="hljs-symbol">:find_density</span>,<span class="hljs-symbol">:find_statistics</span>,<span class="hljs-symbol">:find_original</span>, <span class="hljs-symbol">:find_classification</span>, <span class="hljs-symbol">:find_im</span>,<span class="hljs-symbol">:find_ct</span>].each <span class="hljs-keyword">do</span> |m|
336
+ r &lt;&lt; <span class="hljs-keyword">self</span>.send(m)
337
+ puts <span class="hljs-string">"Done with <span class="hljs-subst">#{m}</span>"</span>
338
+ <span class="hljs-keyword">end</span>
339
+ r.flatten
340
+ <span class="hljs-keyword">end</span>
341
+
342
+
343
+ <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NilClass</span></span>
344
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span> to_sym
345
+ <span class="hljs-keyword">false</span>
346
+ <span class="hljs-keyword">end</span>
347
+ <span class="hljs-keyword">end</span></pre></div></div>
348
+
349
+ </li>
350
+
351
+
352
+ <li id="section-12">
353
+ <div class="annotation">
354
+
355
+ <div class="pilwrap ">
356
+ <a class="pilcrow" href="#section-12">&#182;</a>
357
+ </div>
358
+ <h2 id="query-to-ensure-that-entries-are-not-recreated-in-teh-database-but-only-paths-and-blobs-are-updated">query to ensure that entries are not recreated in teh database, but only paths and blobs are updated</h2>
359
+
360
+ </div>
361
+
362
+ <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">def</span> </span>make_query data_set
363
+ <span class="hljs-keyword">if</span> data_set.has_key?(<span class="hljs-symbol">:new_old</span>)
364
+ query={<span class="hljs-symbol">:case_n</span> =&gt; data_set[<span class="hljs-symbol">:case_n</span>],<span class="hljs-symbol">:cd_type=&gt;data_set</span>[<span class="hljs-symbol">:cd_type</span>], <span class="hljs-symbol">:new_old=&gt;data_set</span>[<span class="hljs-symbol">:new_old</span>]}
365
+ <span class="hljs-keyword">elsif</span> data_set.has_key?(<span class="hljs-symbol">:tile</span>)
366
+ query={<span class="hljs-symbol">:case_n</span> =&gt; data_set[<span class="hljs-symbol">:case_n</span>],<span class="hljs-symbol">:cd_type=&gt;data_set</span>[<span class="hljs-symbol">:cd_type</span>], <span class="hljs-symbol">:tile=&gt;data_set</span>[<span class="hljs-symbol">:tile</span>]}
367
+ <span class="hljs-keyword">else</span>
368
+ query={<span class="hljs-symbol">:case_n</span> =&gt; data_set[<span class="hljs-symbol">:case_n</span>],<span class="hljs-symbol">:cd_type=&gt;data_set</span>[<span class="hljs-symbol">:cd_type</span>]}
369
+ <span class="hljs-keyword">end</span>
370
+ query
371
+ <span class="hljs-keyword">end</span></pre></div></div>
372
+
373
+ </li>
374
+
375
+
376
+ <li id="section-13">
377
+ <div class="annotation">
378
+
379
+ <div class="pilwrap ">
380
+ <a class="pilcrow" href="#section-13">&#182;</a>
381
+ </div>
382
+ <h3 id="load-datasets-in-their-mongo-classes">load datasets in their mongo classes</h3>
383
+ <p>if entry preexisting updates results</p>
384
+
385
+ </div>
386
+
387
+ <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">def</span> </span>mongo_load_all search_results=search_all(), json_class_mapper=<span class="hljs-constant">JSON_CLASS_MAPPER</span>
388
+ search_results.each_with_index <span class="hljs-keyword">do</span> |data_set,i|
389
+ puts <span class="hljs-string">"<span class="hljs-subst">#{i}</span>: <span class="hljs-subst">#{data_set}</span>"</span>
390
+ puts data_set[<span class="hljs-string">"type"</span>]
391
+ mm_class=( json_class_mapper[data_set[<span class="hljs-string">"type"</span>]].to_sym <span class="hljs-keyword">or</span> json_class_mapper[data_set[<span class="hljs-symbol">:type</span>]])
392
+ puts <span class="hljs-string">"mm_class=<span class="hljs-subst">#{mm_class}</span>"</span></pre></div></div>
393
+
394
+ </li>
395
+
396
+
397
+ <li id="section-14">
398
+ <div class="annotation">
399
+
400
+ <div class="pilwrap ">
401
+ <a class="pilcrow" href="#section-14">&#182;</a>
402
+ </div>
403
+ <p>puts “data set type=#{data_set[:type]}”</p>
404
+
405
+ </div>
406
+
407
+ <div class="content"><div class='highlight'><pre> puts <span class="hljs-string">"class =<span class="hljs-subst">#{mm_class}</span>"</span>
408
+ query=make_query data_set
409
+ puts <span class="hljs-string">"query= <span class="hljs-subst">#{query}</span>"</span></pre></div></div>
410
+
411
+ </li>
412
+
413
+
414
+ <li id="section-15">
415
+ <div class="annotation">
416
+
417
+ <div class="pilwrap ">
418
+ <a class="pilcrow" href="#section-15">&#182;</a>
419
+ </div>
420
+ <p>query= {:case_n=&gt;”RS-SV-05-16335”, :cd_type=&gt;”CD8”, :tile=&gt;”CT4”}</p>
421
+
422
+ </div>
423
+
424
+ <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> mm_class.where(query).all.empty?
425
+ mm_object=mm_class.create data_set
426
+ puts <span class="hljs-string">"mm created <span class="hljs-subst">#{mm_object}</span>"</span>
427
+ <span class="hljs-keyword">else</span></pre></div></div>
428
+
429
+ </li>
430
+
431
+
432
+ <li id="section-16">
433
+ <div class="annotation">
434
+
435
+ <div class="pilwrap ">
436
+ <a class="pilcrow" href="#section-16">&#182;</a>
437
+ </div>
438
+ <p>upserts if entry pre-existing</p>
439
+
440
+ </div>
441
+
442
+ <div class="content"><div class='highlight'><pre> mm_class.set(query, data_set, <span class="hljs-symbol">:upsert</span> =&gt; <span class="hljs-keyword">true</span> )
443
+ puts <span class="hljs-string">"uspsert created <span class="hljs-subst">#{mm_object}</span>"</span>
444
+ mm_object=mm_class.where(data_set).find_one
445
+ <span class="hljs-keyword">end</span></pre></div></div>
446
+
447
+ </li>
448
+
449
+
450
+ <li id="section-17">
451
+ <div class="annotation">
452
+
453
+ <div class="pilwrap ">
454
+ <a class="pilcrow" href="#section-17">&#182;</a>
455
+ </div>
456
+ <p>binding.pry</p>
457
+
458
+ </div>
459
+
460
+ <div class="content"><div class='highlight'><pre> mm_object.get_cd
461
+ mm_object.save
462
+
463
+ <span class="hljs-keyword">end</span>
464
+ puts <span class="hljs-string">"\n\n\n"</span>
465
+ puts <span class="hljs-string">"finished uploading to databes"</span>
466
+ <span class="hljs-keyword">end</span>
467
+
468
+ <span class="hljs-function"><span class="hljs-keyword">def</span> </span>show graphic_data
469
+ tf=<span class="hljs-constant">Tempfile</span>.new [<span class="hljs-string">"temp"</span>,<span class="hljs-string">".jpg"</span>]
470
+ tf.write graphic_data
471
+ tf.close
472
+ puts <span class="hljs-string">"<span class="hljs-subst">#{tf.path}</span>"</span>
473
+ fork <span class="hljs-keyword">do</span>
474
+ `open <span class="hljs-comment">#{tf.path}`</span>
475
+ <span class="hljs-keyword">end</span>
476
+ <span class="hljs-constant">Process</span>.wait
477
+ tf.unlink
478
+ <span class="hljs-keyword">end</span></pre></div></div>
479
+
480
+ </li>
481
+
482
+ </ul>
483
+ </div>
484
+ </body>
485
+ </html>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file