scout-gear 7.1.0 → 7.2.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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +29 -0
  3. data/VERSION +1 -1
  4. data/bin/scout +5 -1
  5. data/lib/rbbt-scout.rb +5 -0
  6. data/lib/scout/concurrent_stream.rb +6 -2
  7. data/lib/scout/config.rb +168 -0
  8. data/lib/scout/exceptions.rb +4 -3
  9. data/lib/scout/indiferent_hash/options.rb +1 -0
  10. data/lib/scout/indiferent_hash.rb +4 -2
  11. data/lib/scout/log/color.rb +3 -1
  12. data/lib/scout/log/progress/report.rb +1 -0
  13. data/lib/scout/log/progress/util.rb +1 -1
  14. data/lib/scout/log/progress.rb +5 -3
  15. data/lib/scout/log.rb +3 -2
  16. data/lib/scout/misc/monitor.rb +3 -0
  17. data/lib/scout/misc/system.rb +15 -0
  18. data/lib/scout/misc.rb +1 -0
  19. data/lib/scout/named_array.rb +68 -0
  20. data/lib/scout/open/stream.rb +38 -7
  21. data/lib/scout/path/find.rb +27 -3
  22. data/lib/scout/path/util.rb +7 -4
  23. data/lib/scout/persist/serialize.rb +7 -14
  24. data/lib/scout/persist.rb +21 -1
  25. data/lib/scout/resource/produce.rb +7 -94
  26. data/lib/scout/resource/software.rb +176 -0
  27. data/lib/scout/tsv/dumper.rb +107 -0
  28. data/lib/scout/tsv/index.rb +49 -0
  29. data/lib/scout/tsv/parser.rb +203 -30
  30. data/lib/scout/tsv/path.rb +13 -0
  31. data/lib/scout/tsv/persist/adapter.rb +348 -0
  32. data/lib/scout/tsv/persist/tokyocabinet.rb +113 -0
  33. data/lib/scout/tsv/persist.rb +15 -0
  34. data/lib/scout/tsv/traverse.rb +48 -0
  35. data/lib/scout/tsv/util.rb +24 -0
  36. data/lib/scout/tsv.rb +16 -3
  37. data/lib/scout/work_queue/worker.rb +3 -3
  38. data/lib/scout/work_queue.rb +22 -7
  39. data/lib/scout/workflow/definition.rb +93 -4
  40. data/lib/scout/workflow/step/config.rb +18 -0
  41. data/lib/scout/workflow/step/dependencies.rb +40 -0
  42. data/lib/scout/workflow/step/file.rb +15 -0
  43. data/lib/scout/workflow/step/info.rb +31 -4
  44. data/lib/scout/workflow/step/provenance.rb +148 -0
  45. data/lib/scout/workflow/step.rb +68 -19
  46. data/lib/scout/workflow/task.rb +3 -2
  47. data/lib/scout/workflow/usage.rb +1 -1
  48. data/lib/scout/workflow.rb +11 -3
  49. data/lib/scout-gear.rb +1 -0
  50. data/lib/scout.rb +1 -0
  51. data/scout-gear.gemspec +34 -3
  52. data/scout_commands/find +1 -1
  53. data/scout_commands/workflow/task +16 -10
  54. data/share/software/install_helpers +523 -0
  55. data/test/scout/log/test_progress.rb +0 -2
  56. data/test/scout/misc/test_system.rb +21 -0
  57. data/test/scout/open/test_stream.rb +159 -0
  58. data/test/scout/path/test_find.rb +14 -7
  59. data/test/scout/resource/test_software.rb +24 -0
  60. data/test/scout/test_config.rb +66 -0
  61. data/test/scout/test_meta_extension.rb +10 -0
  62. data/test/scout/test_named_array.rb +19 -0
  63. data/test/scout/test_persist.rb +35 -0
  64. data/test/scout/test_tmpfile.rb +2 -2
  65. data/test/scout/test_tsv.rb +41 -1
  66. data/test/scout/test_work_queue.rb +40 -13
  67. data/test/scout/tsv/persist/test_adapter.rb +34 -0
  68. data/test/scout/tsv/persist/test_tokyocabinet.rb +92 -0
  69. data/test/scout/tsv/test_dumper.rb +44 -0
  70. data/test/scout/tsv/test_index.rb +64 -0
  71. data/test/scout/tsv/test_parser.rb +86 -0
  72. data/test/scout/tsv/test_persist.rb +36 -0
  73. data/test/scout/tsv/test_traverse.rb +9 -0
  74. data/test/scout/tsv/test_util.rb +0 -0
  75. data/test/scout/work_queue/test_worker.rb +3 -3
  76. data/test/scout/workflow/step/test_dependencies.rb +25 -0
  77. data/test/scout/workflow/step/test_info.rb +15 -17
  78. data/test/scout/workflow/step/test_load.rb +16 -18
  79. data/test/scout/workflow/step/test_provenance.rb +25 -0
  80. data/test/scout/workflow/test_step.rb +206 -10
  81. data/test/scout/workflow/test_task.rb +0 -3
  82. data/test/test_helper.rb +6 -0
  83. metadata +33 -2
@@ -0,0 +1,523 @@
1
+ #vim: ft=sh
2
+
3
+ [[ -z $SOFTWARE_DIR ]] && SOFTWARE_DIR="$HOME/software"
4
+ OPT_DIR="$SOFTWARE_DIR/opt"; [ -d $OPT_SRC_DIR ] || mkdir -p $OPT_SRC_DIR
5
+ OPT_BIN_DIR="$OPT_DIR/bin"; [ -d $OPT_BIN_DIR ] || mkdir -p $OPT_BIN_DIR
6
+ OPT_SRC_DIR="$SOFTWARE_DIR/src"; [ -d $OPT_SRC_DIR ] || mkdir -p $OPT_SRC_DIR
7
+ OPT_SCM_DIR="$SOFTWARE_DIR/scm"; [ -d $OPT_SCM_DIR ] || mkdir -p $OPT_SCM_DIR
8
+ OPT_JAR_DIR="$OPT_DIR/jars"; [ -d $OPT_JAR_DIR ] || mkdir -p $OPT_JAR_DIR
9
+ OPT_BUILD_DIR="$SOFTWARE_DIR/.build"; [ -d $OPT_BUILD_DIR ] || mkdir -p $OPT_BUILD_DIR
10
+
11
+ if (false && command -v realpath && realpath --help | grep relative) > /dev/null; then
12
+ function relative_path(){
13
+ local basedir=$1
14
+ local path=$2
15
+ echo $(realpath --relative-to="$basedir" "$path")
16
+ }
17
+ else
18
+ realpath(){
19
+ OURPWD=$PWD
20
+ cd "$(dirname "$1")"
21
+ LINK=$(readlink "$(basename "$1")")
22
+ while [ "$LINK" ]; do
23
+ cd "$(dirname "$LINK")" 2> /dev/null
24
+ LINK=$(readlink "$(basename "$1")")
25
+ done
26
+ REALPATH="$PWD/$(basename "$1")"
27
+ cd "$OURPWD"
28
+ echo "$REALPATH"
29
+ }
30
+
31
+ function relative_path(){
32
+ local basedir="$(realpath $1)"
33
+ local path="$(realpath "$2")"
34
+ local pre=""
35
+ while [[ ! $path = $basedir* ]]; do
36
+ pre=${pre}../
37
+ basedir=$(dirname $basedir)
38
+ done
39
+ echo ${pre}${path/$basedir\/} |tr -s '/' '/'
40
+ }
41
+ fi
42
+
43
+ function link(){
44
+ local source="$1"
45
+ local target="$2"
46
+ local rel_source=$(relative_path "$(dirname $target)" "$source")
47
+
48
+ [ -h "$target" ] && rm "$target"
49
+ echo ln -s "$rel_source" "$target" 1>&2
50
+ [ -h "$target" ] || ln -s "$rel_source" "$target"
51
+ }
52
+
53
+ function expand_path(){
54
+ name=$(basename $1)
55
+ dir=$(dirname $1)
56
+
57
+ echo "$(cd $dir && pwd)/$name"
58
+ }
59
+
60
+ function add2file(){
61
+ file=$1
62
+ line=$2
63
+
64
+ local rel=$(relative_path "$OPT_DIR" "$line")
65
+ grep "$rel" "$file" || echo "$rel" >> "$file"
66
+ }
67
+
68
+ #{{{ GET PKG OPT_BUILD_DIR
69
+
70
+ # From SRC
71
+ get_pkg(){
72
+ local name="$1"
73
+ local url="$2"
74
+
75
+ if [ ! -f "$OPT_SRC_DIR/$name.pkg" ]; then
76
+ wget "$url" -O "$OPT_SRC_DIR/$name.pkg" || wget "$url" -O "$OPT_SRC_DIR/$name.pkg" --no-check-certificate || (rm -f "$OPT_SRC_DIR/$name.pkg"; echo "Error downloading"; exit -1)
77
+ fi
78
+ }
79
+
80
+ uncompress_pkg(){
81
+ local name="$1"
82
+ local pkg="$OPT_SRC_DIR/$name.pkg"
83
+
84
+ local old_pwd="`expand_path $(pwd)`"
85
+ clean_build
86
+
87
+ mkdir -p "$OPT_BUILD_DIR"
88
+ cd "$OPT_BUILD_DIR"
89
+
90
+ (tar xvfz $pkg || tar xvfJ $pkg || tar xvfj $pkg || unzip $pkg || (echo "Error decompressing" & cd & exit -1 ) ) 2> /dev/null
91
+
92
+ cd "$old_pwd"
93
+ }
94
+
95
+ get_src(){
96
+ local name="$1"
97
+ local url="$2"
98
+
99
+ get_pkg "$name" "$url"
100
+ uncompress_pkg "$name"
101
+ }
102
+
103
+ # From SNV
104
+ get_svn(){
105
+ local name="$1"
106
+ local url="$2"
107
+
108
+ local old_pwd="`expand_path $(pwd)`"
109
+
110
+ cd $OPT_SCM_DIR
111
+ if [ -d "$name" ]; then
112
+ cd "$name"
113
+ svn update
114
+ else
115
+ echo svn checkout "$url" "$name"
116
+ svn checkout "$url" "$name"
117
+ fi
118
+
119
+ clean_build
120
+
121
+ cd $OPT_BUILD_DIR
122
+ link "$OPT_SCM_DIR/$name" "$name"
123
+
124
+ cd "$old_pwd"
125
+
126
+ }
127
+
128
+ # From GIT
129
+ get_git(){
130
+ local name="$1"
131
+ local url="$2"
132
+
133
+ if [[ "$url" == *" "* ]]; then
134
+ version="${url/* /}"
135
+ url="${url/ */}"
136
+ echo "Using version $version of repo $url"
137
+ else
138
+ version='none'
139
+ fi
140
+
141
+ local old_pwd="`expand_path $(pwd)`"
142
+
143
+ cd $OPT_SCM_DIR
144
+ if [ -d "$name" ]; then
145
+ cd "$name"
146
+
147
+ if [ ! "$NOWEB" == "true" -a $version == 'none' ]; then
148
+ git stash
149
+ git pull origin master
150
+ git rebase master
151
+ git stash apply
152
+ git submodule init
153
+ git submodule update
154
+ fi
155
+ else
156
+ if [ $version == 'none' ];then
157
+ git clone --recursive "$url" "$name"
158
+ else
159
+ git clone --recursive "$url" "$name" -b $version
160
+ fi
161
+
162
+ cd "$name"
163
+ git submodule init
164
+ git submodule update
165
+ fi
166
+
167
+ clean_build
168
+
169
+ cd $OPT_BUILD_DIR
170
+ link "$OPT_SCM_DIR/$name" "$name"
171
+
172
+ cd "$old_pwd"
173
+ }
174
+
175
+
176
+ #{{{ BUILD PKG in OPT_BUILD_DIR
177
+
178
+ clean_build(){
179
+ rm -Rf $OPT_BUILD_DIR/*
180
+ }
181
+
182
+ build_dir(){
183
+ echo $OPT_BUILD_DIR/$(ls $OPT_BUILD_DIR |head -n 1)
184
+ }
185
+
186
+ compile(){
187
+ local name=$1; shift
188
+ local extra="$@"
189
+
190
+ if [ -f bootstrap ]; then
191
+ ./bootstrap
192
+ fi
193
+
194
+ if [ -f Makefile -o -f makefile ]; then
195
+ make -j 4 || exit -1
196
+ make install || echo "No install"
197
+ fi
198
+
199
+ [ -f build.xml ] && (ant || exit -1)
200
+
201
+ [ -f setup.rb ] && (ruby -Ilib/ setup.rb --prefix="$(opt_dir "$name")" $extra || exit -1)
202
+
203
+ [ -f install.rb ] && ruby -Ilib/ install.rb config --prefix="$(opt_dir "$name")" $extra && ruby -Ilib/ install.rb install
204
+
205
+ if [ -f setup.py ]; then
206
+ python setup.py build && python setup.py install --user || exit -1
207
+ clean_build
208
+ fi
209
+ }
210
+
211
+ prepare_make(){
212
+ local name=$1; shift
213
+ local extra="$@"
214
+
215
+ local old_pwd="`expand_path $(pwd)`"
216
+
217
+ cd "`build_dir`"
218
+
219
+ [ -f bootstrap ] && (./bootstrap || exit -1)
220
+
221
+ [ -d src -a ! -e CMakeLists.txt -a ! -e Makefile -a ! -e configure ] && cd src
222
+
223
+ [ -f bootstrap ] && (./bootstrap || exit -1)
224
+
225
+ if [ -f config/m4 ]; then
226
+ libtoolize --force
227
+ aclocal
228
+ autoheader
229
+ fi
230
+
231
+ if [ -f Makefile.am -a ! -f configure ]; then
232
+ autoreconf
233
+ fi
234
+
235
+ if [ -f aclocal.m4 ]; then
236
+ autoconf
237
+ fi
238
+
239
+ if [ -f autogen.sh ]; then
240
+ ./autogen.sh
241
+ fi
242
+
243
+ if [ -f aclocal.m4 ]; then
244
+ autoreconf -i
245
+ autoconf
246
+ automake --add-missing
247
+ else
248
+ autoconf
249
+ automake --add-missing
250
+ fi
251
+
252
+ if [ -f config ]; then
253
+ ln -s config configure
254
+ fi
255
+
256
+ cd "$old_pwd"
257
+ }
258
+
259
+ build_make(){
260
+ local name=$1; shift
261
+ local extra="$@"
262
+
263
+ local old_pwd="`expand_path $(pwd)`"
264
+ cd "`build_dir`"
265
+ echo PWD: `pwd`
266
+ ls
267
+
268
+
269
+ [ -d src -a ! -e CMakeLists.txt -a ! -e Makefile -a ! -e configure ] && cd src
270
+ [ -d source -a ! -e CMakeLists.txt -a ! -e Makefile -a ! -e configure ] && cd source
271
+
272
+ echo "Building with configure $name"
273
+ if [ "x$extra" != "x" ]; then
274
+ echo "Extra params: $extra"
275
+ fi
276
+
277
+ if [ ! -f configure ]; then
278
+ prepare_make $name
279
+ fi
280
+
281
+ if [ -f configure ]; then
282
+ ./configure --prefix="$(opt_dir "$name")" $extra
283
+ compile "$name" $extra
284
+ [ -d "$(opt_dir "$name")" ] || move_opt "$name"
285
+ setup "$name"
286
+ clean_build
287
+ else
288
+ compile "$name" $extra
289
+ move_opt "$name"
290
+ setup "$name"
291
+ clean_build
292
+ fi
293
+
294
+ cd "$old_pwd"
295
+ }
296
+
297
+ buid_cmake(){
298
+ local name=$1; shift
299
+ local extra="$@"
300
+
301
+ local old_pwd="`expand_path $(pwd)`"
302
+ cd "`build_dir`"
303
+ echo PWD: `pwd`
304
+ ls
305
+
306
+
307
+ [ -d src -a ! -e CMakeLists.txt -a ! -e Makefile -a ! -e configure ] && cd src
308
+ [ -d source -a ! -e CMakeLists.txt -a ! -e Makefile -a ! -e configure ] && cd source
309
+
310
+ echo "Building with cmake $name"
311
+ if [ "x$extra" != "x" ]; then
312
+ echo "Extra params: $extra"
313
+ fi
314
+
315
+ echo "Using cmake"
316
+ [ -d build ] || mkdir build
317
+
318
+ cd build
319
+ cmake -DMAKE_INSTALL_PREFIX=/ $extra ..
320
+ if [ ! -f Makefile -a -f ../configure ]; then
321
+ ../configure --prefix="$(opt_dir "$name")" $extra
322
+ make -j 4
323
+ make install || (cd .. ; mv build "$(opt_dir "$name")")
324
+ else
325
+ make DESTDIR="$(opt_dir "$name")" -j 4 && make DESTDIR="$(opt_dir "$name")" install
326
+ fi
327
+ cd ..
328
+
329
+ if [ ! -d "$(opt_dir "$name")" ]; then
330
+ mkdir -p "$(opt_dir "$name")"
331
+ for subd in bin lib lib64 include pkgdir; do
332
+ [ -d $subd ] && mv $subd "$(opt_dir "$name")"/$subd
333
+ done
334
+ fi
335
+
336
+ setup "$name"
337
+ clean_build
338
+
339
+ cd "$old_pwd"
340
+ }
341
+
342
+ build(){
343
+ local name=$1; shift
344
+ local extra="$@"
345
+
346
+ echo "Building $name"
347
+ if [ "x$extra" != "x" ]; then
348
+ echo "Extra params: $extra"
349
+ fi
350
+
351
+ local old_pwd="`expand_path $(pwd)`"
352
+ cd "`build_dir`"
353
+
354
+ [ -d src -a ! -e CMakeLists.txt -a ! -e Makefile -a ! -e configure ] && cd src
355
+
356
+ if [ -f CMakeLists.txt ]; then
357
+ buid_cmake "$name" $extra
358
+ else
359
+ build_make "$name" $extra
360
+ fi
361
+
362
+ cd "$old_pwd"
363
+ }
364
+
365
+ #{{{ SETUP
366
+
367
+ is_versioned(){
368
+ local name="$1"
369
+ [[ $name =~ : ]]
370
+ }
371
+
372
+ opt_dir(){
373
+ local name="$1"
374
+ if is_versioned "$name"; then
375
+ local real_name=`echo $1 | sed 's/:.*//'`
376
+ local version=`echo $1 | sed 's/.*://'`
377
+ echo "$OPT_DIR/$real_name/$version"
378
+ else
379
+ echo "$OPT_DIR/$name"
380
+ fi
381
+ }
382
+
383
+ move_opt(){
384
+ local name="$1"
385
+ local pkg_dir=$(opt_dir "$name")
386
+ local source=$(build_dir)
387
+
388
+ mkdir -p $(dirname "$pkg_dir")
389
+ if [ -h "$source" ]; then
390
+ local real_source=$(realpath "$source")
391
+ echo link "$real_source" "$pkg_dir"
392
+ link "$real_source" "$pkg_dir"
393
+ else
394
+ mv "$source" "$pkg_dir"
395
+ fi
396
+ }
397
+
398
+ setup(){
399
+ local name="$1"
400
+ local pkg_dir="`opt_dir \"$name\"`"
401
+
402
+ if is_versioned "$name"; then
403
+ rm -f "$(dirname $pkg_dir)/current"
404
+ link "$pkg_dir" "$(dirname $pkg_dir)/current"
405
+ pkg_dir="$(dirname $pkg_dir)/current"
406
+ fi
407
+
408
+ if [ -d "$pkg_dir/bin/" -o -d "$pkg_dir/usr/local/bin/" ]; then
409
+
410
+ for exe in ` find "$pkg_dir/bin/" -maxdepth 1 -type f -executable`; do
411
+ exe=$(basename $exe)
412
+ rm -f "$OPT_DIR/bin/$exe"
413
+ link "$pkg_dir/bin/$exe" "$OPT_DIR/bin/$exe" 2>/dev/null
414
+ done
415
+
416
+ for exe in ` find "$pkg_dir/usr/local/bin/" -maxdepth 1 -type f -executable`; do
417
+ exe=$(basename $exe)
418
+ rm -f "$OPT_DIR/usr/local/bin/$exe"
419
+ link "$pkg_dir/usr/local/bin/$exe" "$OPT_DIR/bin/$exe" 2>/dev/null
420
+ done
421
+
422
+
423
+ else
424
+ local old_pwd="`expand_path $(pwd)`"
425
+
426
+ for exe in ` find "$pkg_dir/" "$pkg_dir/build" "$pkg_dir/source/" "$pkg_dir/src/" -maxdepth 1 -type f -executable`; do
427
+ orig=$exe
428
+ exe=$(basename $exe)
429
+ echo "EXE $exe"
430
+ rm -f "$OPT_DIR/bin/$exe"
431
+ link "$orig" "$OPT_DIR/bin/$exe" 2>/dev/null
432
+ done
433
+ fi
434
+
435
+ ([ -d "$pkg_dir/include" ] && add2file "$OPT_DIR/.c-paths" "$pkg_dir/include")
436
+ ([ -d "$pkg_dir/lib" ] && add2file "$OPT_DIR/.ld-paths" "$pkg_dir/lib")
437
+ ([ -d "$pkg_dir/lib64" ] && add2file "$OPT_DIR/.ld-paths" "$pkg_dir/lib64")
438
+ ([ -d "$pkg_dir/lib/pkgconfig" ] && add2file "$OPT_DIR/.pkgconfig-paths" "$pkg_dir/lib/pkgconfig")
439
+ echo $name setup
440
+ }
441
+
442
+ #{{{ HELPERS
443
+
444
+ prepare_pkg(){
445
+ local name="$1"
446
+ local url="$2"
447
+ shift;shift;
448
+
449
+ get_pkg "$name" "$url"
450
+ uncompress_pkg "$name"
451
+ }
452
+
453
+ install_src(){
454
+ local name="$1"
455
+ local url="$2"
456
+ shift;shift;
457
+ local extra="$@"
458
+
459
+ prepare_pkg "$name" "$url"
460
+ build "$name" "$extra"
461
+ }
462
+
463
+ install_svn(){
464
+ local name="$1"
465
+ local url="$2"
466
+ shift;shift;
467
+ local extra="$@"
468
+
469
+ get_svn "$name" "$url"
470
+ build "$name" $extra
471
+ }
472
+
473
+ custom_build(){
474
+ local name="$1"
475
+ shift;
476
+ local cmd="$@"
477
+
478
+ echo "Building $name"
479
+
480
+ local old_pwd="`expand_path $(pwd)`"
481
+ cd "`build_dir`"
482
+ echo `pwd`
483
+ ls
484
+
485
+ eval $cmd
486
+
487
+ move_opt "$name"
488
+ setup "$name"
489
+ clean_build
490
+
491
+ cd "$old_pwd"
492
+ }
493
+
494
+ install_git(){
495
+ local name="$1"
496
+ local url="$2"
497
+ shift;shift;
498
+ local extra="$@"
499
+
500
+ get_git "$name" "$url"
501
+ build "$name" $extra
502
+ }
503
+
504
+ install_jar(){
505
+ local name="$1"
506
+ local url="$2"
507
+
508
+ [ -d "$OPT_DIR/$name/" ] || mkdir -p "$OPT_DIR/$name/"
509
+ wget "$url" -O "$OPT_DIR/$name/$name.jar" || wget "$url" -O "$OPT_DIR/$name/$name.jar" --no-check-certificate || (rm "$OPT_DIR/$name/$name.jar"; exit -1)
510
+ link "$OPT_DIR/$name/$name.jar" "$OPT_JAR_DIR/$name.jar"
511
+ }
512
+
513
+ jar2bin(){
514
+ local name="$1";shift
515
+ local extra="$@"
516
+
517
+ echo "#!/bin/bash" > $OPT_DIR/bin/$name
518
+ echo "java $extra -jar '$OPT_JAR_DIR/$name.jar'" >> $OPT_DIR/bin/$name
519
+
520
+ chmod +x $OPT_DIR/bin/$name
521
+ }
522
+
523
+ # vim: ft=sh
@@ -105,6 +105,4 @@ class TestProgress < Test::Unit::TestCase
105
105
  end
106
106
  end
107
107
  end
108
-
109
108
  end
110
-
@@ -0,0 +1,21 @@
1
+ require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
+
4
+ class TestMiscSystem < Test::Unit::TestCase
5
+ setup do
6
+ ENV.delete "TEST_VAR"
7
+ end
8
+
9
+ def test_env_add
10
+ Misc.env_add "TEST_VAR", "test_value1"
11
+ Misc.env_add "TEST_VAR", "test_value2"
12
+ assert_equal "test_value2:test_value1", ENV["TEST_VAR"]
13
+ end
14
+
15
+ def test_env_add_prepend
16
+ Misc.env_add "TEST_VAR", "test_value1", ":", false
17
+ Misc.env_add "TEST_VAR", "test_value2", ":", false
18
+ assert_equal "test_value1:test_value2", ENV["TEST_VAR"]
19
+ end
20
+ end
21
+