scout-gear 7.3.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.vimproject +20 -9
  3. data/VERSION +1 -1
  4. data/bin/scout +6 -3
  5. data/lib/rbbt-scout.rb +1 -0
  6. data/lib/scout/cmd.rb +1 -1
  7. data/lib/scout/concurrent_stream.rb +26 -23
  8. data/lib/scout/config.rb +1 -1
  9. data/lib/scout/log/color.rb +4 -1
  10. data/lib/scout/log/progress/report.rb +1 -1
  11. data/lib/scout/log/progress/util.rb +58 -54
  12. data/lib/scout/log/progress.rb +1 -1
  13. data/lib/scout/log/trap.rb +107 -0
  14. data/lib/scout/log.rb +56 -21
  15. data/lib/scout/meta_extension.rb +13 -6
  16. data/lib/scout/misc/digest.rb +1 -1
  17. data/lib/scout/misc/format.rb +12 -0
  18. data/lib/scout/misc/insist.rb +1 -1
  19. data/lib/scout/misc/monitor.rb +11 -0
  20. data/lib/scout/misc/system.rb +10 -0
  21. data/lib/scout/named_array.rb +65 -3
  22. data/lib/scout/open/lock/lockfile.rb +587 -0
  23. data/lib/scout/open/lock.rb +28 -2
  24. data/lib/scout/open/remote.rb +4 -0
  25. data/lib/scout/open/stream.rb +90 -15
  26. data/lib/scout/open/util.rb +13 -3
  27. data/lib/scout/path/find.rb +9 -1
  28. data/lib/scout/path/util.rb +35 -0
  29. data/lib/scout/persist/serialize.rb +18 -5
  30. data/lib/scout/persist.rb +28 -12
  31. data/lib/scout/resource/path.rb +53 -0
  32. data/lib/scout/resource/produce.rb +0 -8
  33. data/lib/scout/resource/util.rb +2 -1
  34. data/lib/scout/tmpfile.rb +7 -8
  35. data/lib/scout/tsv/attach.rb +177 -0
  36. data/lib/scout/tsv/change_id.rb +40 -0
  37. data/lib/scout/tsv/dumper.rb +72 -46
  38. data/lib/scout/tsv/index.rb +69 -13
  39. data/lib/scout/tsv/open.rb +138 -84
  40. data/lib/scout/tsv/parser.rb +135 -80
  41. data/lib/scout/tsv/path.rb +1 -2
  42. data/lib/scout/tsv/persist/adapter.rb +15 -45
  43. data/lib/scout/tsv/persist/fix_width_table.rb +3 -0
  44. data/lib/scout/tsv/persist/tokyocabinet.rb +4 -1
  45. data/lib/scout/tsv/persist.rb +4 -0
  46. data/lib/scout/tsv/transformer.rb +141 -0
  47. data/lib/scout/tsv/traverse.rb +96 -92
  48. data/lib/scout/tsv/util/filter.rb +9 -0
  49. data/lib/scout/tsv/util/reorder.rb +81 -0
  50. data/lib/scout/tsv/util/select.rb +78 -33
  51. data/lib/scout/tsv/util/unzip.rb +86 -0
  52. data/lib/scout/tsv/util.rb +60 -11
  53. data/lib/scout/tsv.rb +26 -3
  54. data/lib/scout/work_queue/socket.rb +6 -1
  55. data/lib/scout/work_queue/worker.rb +5 -2
  56. data/lib/scout/work_queue.rb +15 -8
  57. data/lib/scout/workflow/definition.rb +21 -2
  58. data/lib/scout/workflow/step/dependencies.rb +24 -4
  59. data/lib/scout/workflow/step/info.rb +36 -5
  60. data/lib/scout/workflow/step/provenance.rb +8 -7
  61. data/lib/scout/workflow/step/status.rb +45 -0
  62. data/lib/scout/workflow/step.rb +100 -34
  63. data/lib/scout/workflow/task/inputs.rb +14 -20
  64. data/lib/scout/workflow/task.rb +81 -46
  65. data/lib/scout/workflow/usage.rb +8 -6
  66. data/scout-gear.gemspec +24 -20
  67. data/scout_commands/workflow/task +34 -7
  68. data/test/scout/open/test_stream.rb +60 -58
  69. data/test/scout/path/test_find.rb +10 -1
  70. data/test/scout/resource/test_produce.rb +15 -0
  71. data/test/scout/test_meta_extension.rb +25 -0
  72. data/test/scout/test_named_array.rb +18 -0
  73. data/test/scout/test_persist.rb +6 -0
  74. data/test/scout/test_tsv.rb +212 -2
  75. data/test/scout/test_work_queue.rb +21 -19
  76. data/test/scout/tsv/persist/test_adapter.rb +1 -1
  77. data/test/scout/tsv/persist/test_tokyocabinet.rb +29 -1
  78. data/test/scout/tsv/test_attach.rb +227 -0
  79. data/test/scout/tsv/test_change_id.rb +98 -0
  80. data/test/scout/tsv/test_dumper.rb +1 -1
  81. data/test/scout/tsv/test_index.rb +35 -3
  82. data/test/scout/tsv/test_open.rb +160 -2
  83. data/test/scout/tsv/test_parser.rb +19 -2
  84. data/test/scout/tsv/test_persist.rb +2 -0
  85. data/test/scout/tsv/test_transformer.rb +108 -0
  86. data/test/scout/tsv/test_traverse.rb +88 -3
  87. data/test/scout/tsv/test_util.rb +1 -0
  88. data/test/scout/tsv/util/test_reorder.rb +94 -0
  89. data/test/scout/tsv/util/test_select.rb +25 -11
  90. data/test/scout/tsv/util/test_unzip.rb +112 -0
  91. data/test/scout/work_queue/test_socket.rb +0 -1
  92. data/test/scout/workflow/step/test_status.rb +31 -0
  93. data/test/scout/workflow/task/test_inputs.rb +14 -14
  94. data/test/scout/workflow/test_step.rb +3 -3
  95. data/test/scout/workflow/test_task.rb +168 -32
  96. data/test/scout/workflow/test_usage.rb +33 -6
  97. metadata +20 -6
data/scout-gear.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: scout-gear 7.3.0 ruby lib
5
+ # stub: scout-gear 8.0.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "scout-gear".freeze
9
- s.version = "7.3.0"
9
+ s.version = "8.0.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Miguel Vazquez".freeze]
14
- s.date = "2023-05-12"
14
+ s.date = "2023-05-23"
15
15
  s.description = "Temporary files, logs, etc.".freeze
16
16
  s.email = "mikisvaz@gmail.com".freeze
17
17
  s.executables = ["scout".freeze]
@@ -45,6 +45,7 @@ Gem::Specification.new do |s|
45
45
  "lib/scout/log/progress.rb",
46
46
  "lib/scout/log/progress/report.rb",
47
47
  "lib/scout/log/progress/util.rb",
48
+ "lib/scout/log/trap.rb",
48
49
  "lib/scout/meta_extension.rb",
49
50
  "lib/scout/misc.rb",
50
51
  "lib/scout/misc/digest.rb",
@@ -57,6 +58,7 @@ Gem::Specification.new do |s|
57
58
  "lib/scout/named_array.rb",
58
59
  "lib/scout/open.rb",
59
60
  "lib/scout/open/lock.rb",
61
+ "lib/scout/open/lock/lockfile.rb",
60
62
  "lib/scout/open/remote.rb",
61
63
  "lib/scout/open/stream.rb",
62
64
  "lib/scout/open/util.rb",
@@ -84,6 +86,8 @@ Gem::Specification.new do |s|
84
86
  "lib/scout/simple_opt/setup.rb",
85
87
  "lib/scout/tmpfile.rb",
86
88
  "lib/scout/tsv.rb",
89
+ "lib/scout/tsv/attach.rb",
90
+ "lib/scout/tsv/change_id.rb",
87
91
  "lib/scout/tsv/dumper.rb",
88
92
  "lib/scout/tsv/index.rb",
89
93
  "lib/scout/tsv/open.rb",
@@ -94,11 +98,14 @@ Gem::Specification.new do |s|
94
98
  "lib/scout/tsv/persist/fix_width_table.rb",
95
99
  "lib/scout/tsv/persist/serialize.rb",
96
100
  "lib/scout/tsv/persist/tokyocabinet.rb",
101
+ "lib/scout/tsv/transformer.rb",
97
102
  "lib/scout/tsv/traverse.rb",
98
103
  "lib/scout/tsv/util.rb",
99
104
  "lib/scout/tsv/util/filter.rb",
100
105
  "lib/scout/tsv/util/process.rb",
106
+ "lib/scout/tsv/util/reorder.rb",
101
107
  "lib/scout/tsv/util/select.rb",
108
+ "lib/scout/tsv/util/unzip.rb",
102
109
  "lib/scout/work_queue.rb",
103
110
  "lib/scout/work_queue/socket.rb",
104
111
  "lib/scout/work_queue/worker.rb",
@@ -113,6 +120,7 @@ Gem::Specification.new do |s|
113
120
  "lib/scout/workflow/step/load.rb",
114
121
  "lib/scout/workflow/step/progress.rb",
115
122
  "lib/scout/workflow/step/provenance.rb",
123
+ "lib/scout/workflow/step/status.rb",
116
124
  "lib/scout/workflow/task.rb",
117
125
  "lib/scout/workflow/task/inputs.rb",
118
126
  "lib/scout/workflow/usage.rb",
@@ -175,22 +183,28 @@ Gem::Specification.new do |s|
175
183
  "test/scout/tsv/persist/test_adapter.rb",
176
184
  "test/scout/tsv/persist/test_fix_width_table.rb",
177
185
  "test/scout/tsv/persist/test_tokyocabinet.rb",
186
+ "test/scout/tsv/test_attach.rb",
187
+ "test/scout/tsv/test_change_id.rb",
178
188
  "test/scout/tsv/test_dumper.rb",
179
189
  "test/scout/tsv/test_index.rb",
180
190
  "test/scout/tsv/test_open.rb",
181
191
  "test/scout/tsv/test_parser.rb",
182
192
  "test/scout/tsv/test_persist.rb",
193
+ "test/scout/tsv/test_transformer.rb",
183
194
  "test/scout/tsv/test_traverse.rb",
184
195
  "test/scout/tsv/test_util.rb",
185
196
  "test/scout/tsv/util/test_filter.rb",
186
197
  "test/scout/tsv/util/test_process.rb",
198
+ "test/scout/tsv/util/test_reorder.rb",
187
199
  "test/scout/tsv/util/test_select.rb",
200
+ "test/scout/tsv/util/test_unzip.rb",
188
201
  "test/scout/work_queue/test_socket.rb",
189
202
  "test/scout/work_queue/test_worker.rb",
190
203
  "test/scout/workflow/step/test_dependencies.rb",
191
204
  "test/scout/workflow/step/test_info.rb",
192
205
  "test/scout/workflow/step/test_load.rb",
193
206
  "test/scout/workflow/step/test_provenance.rb",
207
+ "test/scout/workflow/step/test_status.rb",
194
208
  "test/scout/workflow/task/test_inputs.rb",
195
209
  "test/scout/workflow/test_definition.rb",
196
210
  "test/scout/workflow/test_documentation.rb",
@@ -203,25 +217,15 @@ Gem::Specification.new do |s|
203
217
  ]
204
218
  s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
205
219
  s.licenses = ["MIT".freeze]
206
- s.rubygems_version = "3.2.15".freeze
220
+ s.rubygems_version = "3.4.11".freeze
207
221
  s.summary = "basic gear for scouts".freeze
208
222
 
209
- if s.respond_to? :specification_version then
210
- s.specification_version = 4
211
- end
223
+ s.specification_version = 4
212
224
 
213
- if s.respond_to? :add_runtime_dependency then
214
- s.add_runtime_dependency(%q<term-ansicolor>.freeze, [">= 0"])
215
- s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
216
- s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
217
- s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
218
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
219
- else
220
- s.add_dependency(%q<term-ansicolor>.freeze, [">= 0"])
221
- s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
222
- s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
223
- s.add_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
224
- s.add_dependency(%q<simplecov>.freeze, [">= 0"])
225
- end
225
+ s.add_runtime_dependency(%q<term-ansicolor>.freeze, [">= 0"])
226
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
227
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
228
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
229
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
226
230
  end
227
231
 
@@ -4,6 +4,9 @@ require 'scout'
4
4
 
5
5
  $0 = "scout #{$previous_commands.any? ? $previous_commands*" " + " " : "" }#{ File.basename(__FILE__) }" if $previous_commands
6
6
 
7
+ ENV["SCOUT_NO_STREAM"] = "true" if ARGV.include? "--nostream"
8
+ ENV["SCOUT_UPDATE"] = "true" if ARGV.include? "--update"
9
+
7
10
  options = SOPT.setup <<EOF
8
11
 
9
12
  Run a workflow job
@@ -11,11 +14,14 @@ Run a workflow job
11
14
  $ #{$0} [<options>] <workflow> <task>
12
15
 
13
16
  -h--help Print this help
17
+ --nostream Disable job streaming
18
+ --update Update jobs with newer dependencies
14
19
  -jn--job_name* Name to use as job identifier
15
20
  -pf--print_filepath Print the file path
16
21
  -prov--provenance Print the step provenance
17
22
  -cl--clean Clean the last step
18
23
  -rcl--recursive_clean Clean all steps
24
+ -ct--clean_task* Clean a particular task
19
25
  EOF
20
26
 
21
27
  workflow_name, task_name = ARGV
@@ -28,7 +34,10 @@ task = workflow.tasks[task_name.to_sym] if task_name
28
34
 
29
35
  options[:help] = true if task.nil?
30
36
 
31
- if options[:help]
37
+ help, provenance, clean, recursive_clean, clean_task, jobname, print_filepath = IndiferentHash.process_options options,
38
+ :help, :provenance, :clean, :recursive_clean, :clean_task, :job_name, :print_filepath
39
+
40
+ if help
32
41
  if defined? scout_usage
33
42
  scout_usage
34
43
  else
@@ -40,17 +49,35 @@ if options[:help]
40
49
  end
41
50
 
42
51
  job_options = task.get_SOPT(task)
43
- job = workflow.job(task_name, options[:job_name], job_options)
52
+ job = workflow.job(task_name, jobname, job_options)
53
+
54
+ job.recursive_clean if recursive_clean
55
+ job.clean if clean
56
+
57
+ if clean_task
58
+ ENV["SCOUT_UPDATE"] = 'true'
59
+ clean_task.split(",").each do |clean_task|
60
+ if clean_task.include? "#"
61
+ clean_workflow, clean_task = clean_task.split("#")
62
+ end
44
63
 
45
- job.recursive_clean if options[:recursive_clean]
46
- job.clean if options[:clean]
64
+ job.rec_dependencies.each do |dep|
65
+ next unless dep.task_name.to_s == clean_task.to_s
66
+ next unless clean_workflow.nil? || clean_workflow == dep.workflow.to_s
67
+ dep.clean
68
+ dep.set_info :status, :cleaned
69
+ end
70
+
71
+ job.clean if job.task_name.to_s == clean_task.to_s
72
+ end
73
+ end
47
74
 
48
- if options[:provenance]
75
+ if provenance
49
76
  puts Step.prov_report(job)
50
77
  else
51
- job.run unless job.done?
78
+ job.run(true) unless job.done?
52
79
 
53
- if options[:print_filepath]
80
+ if print_filepath
54
81
  job.join
55
82
  path = job.path
56
83
  path = path.find if Path === path
@@ -334,63 +334,65 @@ row1 A B C
334
334
  assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
335
335
  end
336
336
 
337
- # def test_collapse_stream
338
- # text=<<-EOF
339
- #row1 A B C
340
- #row1 a b c
341
- #row2 AA BB CC
342
- #row2 aa bb cc
343
- # EOF
344
- #
345
- # s = StringIO.new text
346
- # tsv = TSV.open Misc.collapse_stream(s,nil, " "), :sep => " "
347
- # assert_equal ["A", "a"], tsv["row1"][0]
348
- # assert_equal ["BB", "bb"], tsv["row2"][1]
349
- # end
350
- #
351
- # def test_collapse_sum
352
- # text=<<-EOF
353
- #row1 12
354
- #row1 4
355
- #row2 10
356
- #row2 6
357
- # EOF
358
- #
359
- # s = StringIO.new text
360
- # stream = Misc.collapse_stream(s,nil, " ") do |parts|
361
- # next nil if parts.empty?
362
- # parts.first.split("|").collect{|p| p.to_f}.inject(0){|acc,e| acc += e}.to_s
363
- # end
364
- # tsv = TSV.open stream, :sep => " "
365
- # ppp tsv.to_s
366
- # end
367
- #
368
- # def test_collapse_stream_gap
369
- # text=<<-EOF
370
- #row2 AA BB
371
- #row2 aa bb cc
372
- # EOF
373
- #
374
- # s = StringIO.new text
375
- # assert Misc.collapse_stream(s, nil, " ").read =~ /\|cc$/
376
- #
377
- # text=<<-EOF
378
- #row2 aa bb cc
379
- #row2 AA BB
380
- # EOF
381
- #
382
- # s = StringIO.new text
383
- # assert Misc.collapse_stream(s, nil, " ").read =~ /cc\|$/
384
- #
385
- # text=<<-EOF
386
- #row2 AA BB
387
- #row2 aa bb cc
388
- # EOF
389
- #
390
- # s = StringIO.new text
391
- # assert Misc.collapse_stream(s, nil, " ").read =~ /\|cc$/
392
- #
393
- # end
337
+ def test_collapse_stream
338
+ text=<<-EOF
339
+ row1 A B C
340
+ row1 a b c
341
+ row2 AA BB CC
342
+ row2 aa bb cc
343
+ EOF
344
+
345
+ s = StringIO.new text
346
+ stream = Open.collapse_stream(s, sep: " ")
347
+ txt = stream.read
348
+ assert_include txt, "A|a"
349
+ assert_include txt, "B|b"
350
+ assert_include txt, "C|c"
351
+ end
352
+
353
+
354
+ def test_collapse_sum
355
+ text=<<-EOF
356
+ row1 12
357
+ row1 4
358
+ row2 10
359
+ row2 6
360
+ EOF
361
+
362
+ s = StringIO.new text
363
+ stream = Open.collapse_stream(s, sep: " ") do |parts|
364
+ next nil if parts.empty?
365
+ parts.first.split("|").collect{|p| p.to_f}.inject(0){|acc,e| acc += e}.to_s
366
+ end
367
+ assert_include stream.read, "row1 16"
368
+ end
369
+
370
+
371
+ def test_collapse_stream_gap
372
+ text=<<-EOF
373
+ row2 AA BB
374
+ row2 aa bb cc
375
+ EOF
376
+
377
+ s = StringIO.new text
378
+ assert Open.collapse_stream(s, sep: " ").read =~ /\|cc$/
379
+
380
+ text=<<-EOF
381
+ row2 aa bb cc
382
+ row2 AA BB
383
+ EOF
384
+
385
+ s = StringIO.new text
386
+ assert Open.collapse_stream(s, sep: " ").read =~ /cc\|$/
387
+
388
+ text=<<-EOF
389
+ row2 AA BB
390
+ row2 aa bb cc
391
+ EOF
392
+
393
+ s = StringIO.new text
394
+ assert Open.collapse_stream(s, sep: " ").read =~ /\|cc$/
395
+ end
394
396
  #
395
397
  #
396
398
  # def test_paste_stream
@@ -433,7 +435,7 @@ row1 A B C
433
435
  # s = StringIO.new text
434
436
  # sorted = Misc.sort_stream(s)
435
437
  # assert_equal %w(## ## ## #Row row2 row3 row1), text.split("\n").collect{|l| l.split(" ").first}
436
- # assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
438
+ # assert_equal %w(## ## ## #Row row1 row2 row3), sorted.read.split("\n").collect{|l| l.split(" ").first}
437
439
  # end
438
440
  #
439
441
  # def test_sort_long_stream
@@ -68,7 +68,6 @@ class TestPathFind < Test::Unit::TestCase
68
68
  p = Path.setup("/tmp/foo/bar")
69
69
  assert p.located?
70
70
  assert_equal_path p, p.find
71
-
72
71
  end
73
72
 
74
73
  def test_custom
@@ -106,5 +105,15 @@ class TestPathFind < Test::Unit::TestCase
106
105
  assert Open.exist?(tmpdir.somefile)
107
106
  end
108
107
  end
108
+
109
+ def test_with_extension
110
+ dir = tmpdir.directory[__method__]
111
+ list = %w(a b)
112
+ Misc.in_dir(dir) do
113
+ file = dir.foo
114
+ Open.write(file.set_extension('list'), list * "\n")
115
+ assert_equal list, file.list
116
+ end
117
+ end
109
118
  end
110
119
 
@@ -59,4 +59,19 @@ end
59
59
  assert_include File.open(TestResource.tmp.test.work.footest.bar.find).read, "OTHER"
60
60
  assert_include File.open(TestResource.tmp.test.work.footest.foo_bar.find).read, "OTHER"
61
61
  end
62
+
63
+ def test_produce_with_extension
64
+ dir = tmpdir.directory[__method__]
65
+ dir.pkgdir = Scout
66
+ list = %w(a b)
67
+
68
+ Scout.claim dir["foo.list"], :proc do
69
+ list
70
+ end
71
+
72
+ Misc.in_dir(dir) do
73
+ file = dir.foo
74
+ assert_equal list, file.list
75
+ end
76
+ end
62
77
  end
@@ -8,6 +8,13 @@ class TestMetaExtension < Test::Unit::TestCase
8
8
  extension_attr :code, :code2
9
9
  end
10
10
 
11
+ module ExtensionClass2
12
+ extend MetaExtension
13
+
14
+ extension_attr :code3, :code4
15
+ end
16
+
17
+
11
18
  def test_setup_annotate
12
19
  str = "String"
13
20
  ExtensionClass.setup(str, :code)
@@ -51,5 +58,23 @@ class TestMetaExtension < Test::Unit::TestCase
51
58
  assert o.extension_attr_hash.include?(:code)
52
59
  assert o.extension_attr_hash.include?(:code2)
53
60
  end
61
+
62
+ def test_twice
63
+ str = "String"
64
+
65
+ ExtensionClass.setup(str, :code2 => :code)
66
+ assert_equal :code, str.code2
67
+ assert_include str.instance_variable_get(:@extension_attrs), :code
68
+
69
+ str.extend ExtensionClass2
70
+ str.code3 = :code_alt
71
+ assert_equal :code, str.code2
72
+ assert_equal :code_alt, str.code3
73
+ assert_include str.instance_variable_get(:@extension_attrs), :code
74
+ assert_include str.instance_variable_get(:@extension_attrs), :code3
75
+
76
+ assert_include str.extension_attr_hash, :code
77
+ assert_include str.extension_attr_hash, :code3
78
+ end
54
79
  end
55
80
 
@@ -15,5 +15,23 @@ ValueB (Entity type)
15
15
  assert_equal 1, NamedArray.identify_name(names, "ValueB")
16
16
  assert_equal 1, NamedArray.identify_name(names, 1)
17
17
  end
18
+
19
+ def test_missing_field
20
+ a = NamedArray.setup([1,2], [:a, :b])
21
+ assert_equal 1, a[:a]
22
+ assert_equal nil, a[:c]
23
+ end
24
+
25
+ def test_zip_fields
26
+ a = [%w(a b), %w(1 1)]
27
+ assert_equal [%w(a 1), %w(b 1)], NamedArray.zip_fields(a)
28
+ end
29
+
30
+ def test_add_zipped
31
+ a = [%w(a b), %w(1 1)]
32
+ NamedArray.add_zipped a, [%w(c), %w(1)]
33
+ NamedArray.add_zipped a, [%w(d), %w(1)]
34
+ assert_equal [%w(a b c d), %w(1 1 1 1)], a
35
+ end
18
36
  end
19
37
 
@@ -156,6 +156,12 @@ class TestPersist < Test::Unit::TestCase
156
156
  end
157
157
  end
158
158
 
159
+ def test_path_prefix
160
+ Persist.persist('foo', :tsv, :prefix => "TSV") do |filename|
161
+ assert File.basename(filename).start_with? "TSV"
162
+ end
163
+ end
164
+
159
165
  def __test_speed
160
166
  times = 100_000
161
167
  TmpFile.with_file do |tmpfile|