rbbt-util 5.28.9 → 5.28.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/entity.rb +1 -1
  3. data/lib/rbbt/fix_width_table.rb +5 -4
  4. data/lib/rbbt/persist.rb +1 -1
  5. data/lib/rbbt/persist/tsv/adapter.rb +0 -1
  6. data/lib/rbbt/persist/tsv/fix_width_table.rb +5 -3
  7. data/lib/rbbt/tsv/dumper.rb +6 -2
  8. data/lib/rbbt/util/cmd.rb +1 -0
  9. data/lib/rbbt/util/misc/bgzf.rb +1 -1
  10. data/lib/rbbt/util/named_array.rb +1 -1
  11. data/lib/rbbt/util/open.rb +17 -16
  12. data/lib/rbbt/workflow/definition.rb +2 -1
  13. data/lib/rbbt/workflow/integration/ansible.rb +53 -0
  14. data/lib/rbbt/workflow/integration/ansible/workflow.rb +60 -0
  15. data/lib/rbbt/workflow/step.rb +5 -0
  16. data/lib/rbbt/workflow/step/accessor.rb +1 -1
  17. data/lib/rbbt/workflow/util/archive.rb +2 -0
  18. data/lib/rbbt/workflow/util/orchestrator.rb +22 -9
  19. data/share/rbbt_commands/ansible +55 -0
  20. data/share/rbbt_commands/purge_job +0 -1
  21. data/share/rbbt_commands/workflow/forget_deps +9 -0
  22. data/test/rbbt/association/test_index.rb +6 -6
  23. data/test/rbbt/knowledge_base/test_query.rb +3 -3
  24. data/test/rbbt/knowledge_base/test_registry.rb +1 -1
  25. data/test/rbbt/persist/tsv/test_cdb.rb +0 -7
  26. data/test/rbbt/persist/tsv/test_kyotocabinet.rb +2 -8
  27. data/test/rbbt/persist/tsv/test_leveldb.rb +0 -6
  28. data/test/rbbt/persist/tsv/test_lmdb.rb +0 -6
  29. data/test/rbbt/persist/tsv/test_tokyocabinet.rb +15 -14
  30. data/test/rbbt/test_entity.rb +0 -1
  31. data/test/rbbt/test_knowledge_base.rb +3 -4
  32. data/test/rbbt/test_persist.rb +10 -6
  33. data/test/rbbt/test_workflow.rb +17 -16
  34. data/test/rbbt/tsv/test_accessor.rb +11 -0
  35. data/test/rbbt/tsv/test_attach.rb +0 -2
  36. data/test/rbbt/tsv/test_index.rb +6 -7
  37. data/test/rbbt/tsv/test_manipulate.rb +2 -3
  38. data/test/rbbt/util/R/test_model.rb +2 -1
  39. data/test/rbbt/util/R/test_plot.rb +0 -2
  40. data/test/rbbt/util/concurrency/test_processes.rb +1 -1
  41. data/test/rbbt/util/misc/test_bgzf.rb +11 -7
  42. data/test/rbbt/util/misc/test_lock.rb +0 -1
  43. data/test/rbbt/util/misc/test_multipart_payload.rb +1 -1
  44. data/test/rbbt/util/misc/test_pipes.rb +0 -5
  45. data/test/rbbt/util/test_R.rb +1 -0
  46. data/test/rbbt/util/test_log.rb +4 -6
  47. data/test/rbbt/util/test_misc.rb +0 -2
  48. data/test/rbbt/util/test_open.rb +0 -1
  49. data/test/rbbt/util/test_python.rb +17 -1
  50. data/test/rbbt/workflow/test_remote_workflow.rb +1 -1
  51. data/test/rbbt/workflow/test_step.rb +8 -3
  52. data/test/rbbt/workflow/util/test_orchestrator.rb +50 -0
  53. metadata +5 -4
  54. data/test/rbbt/workflow/remote/test_client.rb +0 -56
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt-util'
4
+ require 'rbbt/util/simpleopt'
5
+
6
+ $0 = "rbbt #{$previous_commands*" "} #{ File.basename(__FILE__) }" if $previous_commands
7
+
8
+ options = SOPT.setup <<EOF
9
+
10
+ Run ansible
11
+
12
+ $ #{$0} [options] <rules.yml|->
13
+
14
+ Use - to read from STDIN
15
+
16
+ -h--help Print this help
17
+ -dr--dry_run Only print the playbook
18
+ -H--hosts* hosts to run it on
19
+ EOF
20
+ if options[:help]
21
+ if defined? rbbt_usage
22
+ rbbt_usage
23
+ else
24
+ puts SOPT.doc
25
+ end
26
+ exit 0
27
+ end
28
+
29
+ require 'rbbt/workflow/integration/ansible'
30
+
31
+ playbook, task = ARGV
32
+ playbook_file = Rbbt.share.ansible["test.yaml"].find if playbook.nil?
33
+
34
+ dry_run = options.delete :dry_run
35
+
36
+ if ! Misc.filename?(playbook_file)
37
+ playbook_file = Rbbt.share.ansible.glob(playbook + ".*").first
38
+ end
39
+
40
+ if ! Misc.filename?(playbook_file)
41
+ recipe = Rbbt.share.recipes.glob(playbook + ".*").first
42
+ playbook_file = Ansible.playbook recipe, task, options
43
+ end
44
+
45
+
46
+ if dry_run
47
+ if Hash === playbook_file
48
+ ppp playbook_file.to_yaml
49
+ else
50
+ ppp Log.color :magenta, playbook_file
51
+ ppp Open.read(playbook_file)
52
+ end
53
+ else
54
+ Ansible.play playbook_file
55
+ end
@@ -14,7 +14,6 @@ $ rbbt purge [options] <job_path>
14
14
 
15
15
  -h--help Print this help
16
16
  -r--recursive Remove recursively
17
-
18
17
  EOF
19
18
  if options[:help]
20
19
  if defined? rbbt_usage
@@ -13,6 +13,8 @@ Make a job forget all its dependencies and archive their meta-data
13
13
  $ #{$0} [options] <job_path>
14
14
 
15
15
  -h--help Print this help
16
+ -p--purge Purge dependencies
17
+ -r--recursive_purge Purge dependencies recursively
16
18
 
17
19
  EOF
18
20
  if options[:help]
@@ -31,4 +33,11 @@ step = Workflow.load_step path
31
33
 
32
34
  step.archive_deps
33
35
  step.copy_files_dir
36
+ dependencies = step.dependencies
34
37
  step.set_info :dependencies, []
38
+
39
+ if options[:purge]
40
+ dependencies.each do |dependency|
41
+ Step.purge(dependency.path, options[:recursive_purge])
42
+ end
43
+ end
@@ -73,21 +73,21 @@ TP53 NFKB1|GLI1 activation|activation true|true
73
73
 
74
74
  def test_index_flat
75
75
  require 'rbbt/sources/tfacts'
76
- file = TFacts.regulators
76
+ file = TFactS.regulators
77
77
  tsv = Association.index(file, :type => :flat, :source => "Transcription Factor Associated Gene Name=~Associated Gene Name", :merge => true)
78
78
  assert tsv.match("TP53").length > 10
79
79
  end
80
80
 
81
81
  def test_index_flat_to_matrix
82
82
  require 'rbbt/sources/tfacts'
83
- file = TFacts.regulators
83
+ file = TFactS.regulators
84
84
  tsv = Association.index(file, :type => :flat, :source => "Transcription Factor Associated Gene Name=~Associated Gene Name", :merge => true)
85
85
  assert(tsv.to_matrix(false))
86
86
  end
87
87
 
88
88
  def test_filter_no_block
89
89
  require 'rbbt/sources/tfacts'
90
- file = TFacts.regulators
90
+ file = TFactS.regulators
91
91
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
92
92
  tsv.unnamed = false
93
93
  matches = tsv.filter :directed?
@@ -96,7 +96,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
96
96
 
97
97
  def test_filter_no_block_value
98
98
  require 'rbbt/sources/tfacts'
99
- file = TFacts.regulators
99
+ file = TFactS.regulators
100
100
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
101
101
  tsv.unnamed = false
102
102
  matches = tsv.filter :Effect, "inhibition"
@@ -105,7 +105,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
105
105
 
106
106
  def test_filter_block_value_field
107
107
  require 'rbbt/sources/tfacts'
108
- file = TFacts.regulators
108
+ file = TFactS.regulators
109
109
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
110
110
  tsv.unnamed = false
111
111
  matches = tsv.filter :Effect do |value|
@@ -116,7 +116,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
116
116
 
117
117
  def test_filter_block_no_value_field
118
118
  require 'rbbt/sources/tfacts'
119
- file = TFacts.regulators
119
+ file = TFactS.regulators
120
120
  tsv = Association.index(EFFECT, EFFECT_OPTIONS.merge(:undirected => false, :source => "SG=~Associated Gene Name", :target => "TG=~Associated Gene Name"), :persist => true)
121
121
  tsv.unnamed = false
122
122
  matches = tsv.filter do |key,values|
@@ -22,7 +22,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
22
22
  :namespace => "Hsa"
23
23
  }
24
24
 
25
- EFFECT_TSV = TSV.open EFFECT, EFFECT_OPTIONS.dup
25
+ EFFECT_TSV = TSV.open EFFECT, EFFECT_OPTIONS.dup
26
26
 
27
27
  KNOWLEDGE_BASE = KnowledgeBase.new Rbbt.tmp.test.kb_foo2, "Hsa"
28
28
  KNOWLEDGE_BASE.format = {"Gene" => "Ensembl Gene ID"}
@@ -34,11 +34,11 @@ TP53 NFKB1|GLI1 activation|activation true|true
34
34
  assert_equal 6, KNOWLEDGE_BASE.subset(:effects, :all).length
35
35
 
36
36
  assert_equal 4, KNOWLEDGE_BASE.subset(:effects, :all).target_entity.uniq.length
37
- assert_equal %w(Effect), KNOWLEDGE_BASE.subset(:effects, :all).info.first.keys
37
+ assert_equal %w(Effect), KNOWLEDGE_BASE.subset(:effects, :all).info.first.keys
38
38
  end
39
39
  end
40
40
 
41
- def test_subset_all_persist_format
41
+ def _test_subset_all_persist_format
42
42
  assert KNOWLEDGE_BASE.subset(:effects, :all).target_entity.reject{|e| e =~ /^ENS/}.empty?
43
43
  end
44
44
 
@@ -45,7 +45,7 @@ TP53 NFKB1|GLI1 activation|activation true|true
45
45
 
46
46
  def test_index_flat
47
47
  require 'rbbt/sources/tfacts'
48
- file = TFacts.regulators
48
+ file = TFactS.regulators
49
49
  KNOWLEDGE_BASE.register :tfacts, file, :type => :flat, :source => "Transcription Factor Associated Gene Name=~Associated Gene Name", :merge => true
50
50
  assert KNOWLEDGE_BASE.subset(:tfacts, :source => ["TP53"], :target => :all).length > 10
51
51
  end
@@ -4,19 +4,12 @@ require 'rbbt/annotations'
4
4
  require 'rbbt/util/tmpfile'
5
5
  require 'test/unit'
6
6
 
7
- module TestAnnotation
8
- extend Annotation
9
-
10
- self.annotation :test_annotation
11
- end
12
-
13
7
  class TestPersistTSVCDB < Test::Unit::TestCase
14
8
 
15
9
  if Persist.respond_to? :open_cbd
16
10
  def test_organism
17
11
  require 'rbbt/sources/organism'
18
12
  TmpFile.with_file nil do |tmp_file|
19
- file = CMD.cmd("head -n 1000000", :in => Organism.identifiers("Hsa").open, :pipe => true)
20
13
  tsv = Organism.identifiers("Hsa").tsv(:key_field => "Associated Gene Name", :fields => ["Ensembl Gene ID"], :type => :single, :persist => true, :persist_engine => "CDB", :persist_dir => tmp_file)
21
14
  assert_equal "ENSG00000141510", tsv["TP53"]
22
15
  end
@@ -5,15 +5,9 @@ require 'rbbt/annotations'
5
5
  require 'rbbt/util/tmpfile'
6
6
  require 'test/unit'
7
7
 
8
- module TestAnnotation
9
- extend Annotation
10
-
11
- self.annotation :test_annotation
12
- end
13
-
14
8
  class TestPersistTSVKC < Test::Unit::TestCase
15
9
  if Persist.respond_to? :open_kyotocabinet
16
- def _test_organism_kch
10
+ def test_organism_kch
17
11
  require 'rbbt/sources/organism'
18
12
  TmpFile.with_file do |tmp_file|
19
13
  tsv = Organism.identifiers("Hsa").tsv :key_field => "Associated Gene Name", :fields => ["Ensembl Gene ID"], :type => :single, :persist => true, :persist_engine => "kch", :persist_dir => tmp_file
@@ -22,7 +16,7 @@ class TestPersistTSVKC < Test::Unit::TestCase
22
16
  end
23
17
 
24
18
 
25
- def _test_organism_kct
19
+ def test_organism_kct
26
20
  require 'rbbt/sources/organism'
27
21
  TmpFile.with_file do |tmp_file|
28
22
  tsv = Organism.identifiers("Hsa").tsv :key_field => "Associated Gene Name", :fields => ["Ensembl Gene ID"], :type => :single, :persist => true, :persist_engine => "kct", :persist_dir => tmp_file
@@ -4,12 +4,6 @@ require 'rbbt/annotations'
4
4
  require 'rbbt/util/tmpfile'
5
5
  require 'test/unit'
6
6
 
7
- module TestAnnotation
8
- extend Annotation
9
-
10
- self.annotation :test_annotation
11
- end
12
-
13
7
  class TestPersistTSVLevelDB < Test::Unit::TestCase
14
8
 
15
9
  if Persist.respond_to? :open_leveldb
@@ -4,12 +4,6 @@ require 'rbbt/annotations'
4
4
  require 'rbbt/util/tmpfile'
5
5
  require 'test/unit'
6
6
 
7
- module TestAnnotation
8
- extend Annotation
9
-
10
- self.annotation :test_annotation
11
- end
12
-
13
7
  class TestPersistTSVLMDB < Test::Unit::TestCase
14
8
 
15
9
  def test_organism
@@ -4,7 +4,8 @@ require 'rbbt/annotations'
4
4
  require 'rbbt/util/tmpfile'
5
5
  require 'test/unit'
6
6
 
7
- module TestAnnotation
7
+
8
+ module TestAnnotationModule
8
9
  extend Annotation
9
10
 
10
11
  self.annotation :test_annotation
@@ -25,8 +26,8 @@ class TestPersistTSVTC < Test::Unit::TestCase
25
26
  entity1 = "Entity 1"
26
27
  entity2 = "Entity 2"
27
28
 
28
- TestAnnotation.setup(entity1, :test_annotation => "1")
29
- TestAnnotation.setup(entity2, :test_annotation => "2")
29
+ TestAnnotationModule.setup(entity1, :test_annotation => "1")
30
+ TestAnnotationModule.setup(entity2, :test_annotation => "2")
30
31
 
31
32
  annotations = [entity1, entity2]
32
33
 
@@ -56,9 +57,9 @@ class TestPersistTSVTC < Test::Unit::TestCase
56
57
  entity2 = "Entity 2"
57
58
  entity2bis = "Entity 2"
58
59
 
59
- TestAnnotation.setup(entity1, :test_annotation => "1")
60
- TestAnnotation.setup(entity2, :test_annotation => "2")
61
- TestAnnotation.setup(entity2bis, :test_annotation => "2")
60
+ TestAnnotationModule.setup(entity1, :test_annotation => "1")
61
+ TestAnnotationModule.setup(entity2, :test_annotation => "2")
62
+ TestAnnotationModule.setup(entity2bis, :test_annotation => "2")
62
63
 
63
64
  annotations = [entity1, entity2, entity2bis]
64
65
 
@@ -105,8 +106,8 @@ class TestPersistTSVTC < Test::Unit::TestCase
105
106
  entity1 = "Entity 1"
106
107
  entity2 = "Entity 2"
107
108
 
108
- TestAnnotation.setup(entity1, :test_annotation => "1")
109
- TestAnnotation.setup(entity2, :test_annotation => "2")
109
+ TestAnnotationModule.setup(entity1, :test_annotation => "1")
110
+ TestAnnotationModule.setup(entity2, :test_annotation => "2")
110
111
 
111
112
  annotations = [entity1, entity2]
112
113
 
@@ -138,7 +139,7 @@ class TestPersistTSVTC < Test::Unit::TestCase
138
139
  entity2 = "Entity 2"
139
140
 
140
141
  annotations = [entity1, entity2]
141
- TestAnnotation.setup(annotations, :test_annotation => "1")
142
+ TestAnnotationModule.setup(annotations, :test_annotation => "1")
142
143
  annotations.extend AnnotatedArray
143
144
 
144
145
  persisted_annotations = Persist.persist("Test", :annotations, :annotation_repo => repo) do
@@ -171,11 +172,11 @@ class TestPersistTSVTC < Test::Unit::TestCase
171
172
  entity2 = "Entity 2"
172
173
 
173
174
  annotations = [entity1, entity2]
174
- TestAnnotation.setup(annotations, :test_annotation => "1")
175
+ TestAnnotationModule.setup(annotations, :test_annotation => "1")
175
176
  annotations.extend AnnotatedArray
176
177
 
177
178
  annotations_ary = [annotations]
178
- TestAnnotation.setup(annotations_ary, :test_annotation => "1")
179
+ TestAnnotationModule.setup(annotations_ary, :test_annotation => "1")
179
180
  annotations_ary.extend AnnotatedArray
180
181
 
181
182
  persisted_annotations = Persist.persist("Test", :annotations, :annotation_repo => repo) do
@@ -210,9 +211,9 @@ class TestPersistTSVTC < Test::Unit::TestCase
210
211
  entity2 = "Entity 2"
211
212
  entity2bis = "Entity 2"
212
213
 
213
- TestAnnotation.setup(entity1, :test_annotation => "1")
214
- TestAnnotation.setup(entity2, :test_annotation => "2")
215
- TestAnnotation.setup(entity2bis, :test_annotation => "2")
214
+ TestAnnotationModule.setup(entity1, :test_annotation => "1")
215
+ TestAnnotationModule.setup(entity2, :test_annotation => "2")
216
+ TestAnnotationModule.setup(entity2bis, :test_annotation => "2")
216
217
 
217
218
  annotations = [entity1, entity2, entity2bis]
218
219
 
@@ -199,7 +199,6 @@ class TestEntity < Test::Unit::TestCase
199
199
 
200
200
 
201
201
  $processed_multiple = []
202
- Log.severity = 0
203
202
 
204
203
  array = ReversableString.setup([string1, string2])
205
204
  assert_equal [string1, string2].collect{|s| s.chars}, array.multiple_annotation_list
@@ -62,7 +62,7 @@ class TestKnowledgeBase < Test::Unit::TestCase
62
62
  kb = KnowledgeBase.new tmpdir, Organism.default_code("Hsa")
63
63
  kb.format = {"Gene" => "Ensembl Gene ID"}
64
64
 
65
- kb.register :tfacts, TFacts.regulators, :source =>"=~Associated Gene Name"
65
+ kb.register :tfacts, TFactS.regulators, :source =>"=~Associated Gene Name"
66
66
 
67
67
  kb.get_index(:tfacts).reverse
68
68
  end
@@ -74,7 +74,7 @@ class TestKnowledgeBase < Test::Unit::TestCase
74
74
  kb = KnowledgeBase.new tmpdir, Organism.default_code("Hsa")
75
75
  kb.format = {"Gene" => "Ensembl Gene ID"}
76
76
 
77
- kb.register :tfacts, TFacts.regulators, :source =>"=~Associated Gene Name"
77
+ kb.register :tfacts, TFactS.regulators, :source =>"=~Associated Gene Name"
78
78
 
79
79
  assert_equal "Ensembl Gene ID", kb.get_database(:tfacts).key_field
80
80
 
@@ -113,10 +113,9 @@ class TestKnowledgeBase < Test::Unit::TestCase
113
113
 
114
114
  def test_knowledge_base_reuse
115
115
  organism = Organism.default_code("Hsa")
116
- Log.severity = 0
117
116
  TmpFile.with_file do |tmpdir|
118
117
  Path.setup(tmpdir)
119
- Association.index(TFacts.regulators, :persist_file => tmpdir.tfacts, :format => {"Gene" => "Ensembl Gene ID"}, :namespace => Organism.default_code("Hsa"))
118
+ Association.index(TFactS.regulators, :persist_file => tmpdir.tfacts, :format => {"Gene" => "Ensembl Gene ID"}, :namespace => Organism.default_code("Hsa"))
120
119
 
121
120
  kb = KnowledgeBase.load(tmpdir)
122
121
  assert kb.identify_source('tfacts', "TP53") =~ /ENSG/
@@ -4,12 +4,6 @@ require 'rbbt/annotations'
4
4
  require 'rbbt/util/tmpfile'
5
5
  require 'test/unit'
6
6
 
7
- module TestAnnotation
8
- extend Annotation
9
-
10
- self.annotation :test_annotation
11
- end
12
-
13
7
  class TestPersist < Test::Unit::TestCase
14
8
 
15
9
  def test_array_persist
@@ -78,4 +72,14 @@ class TestPersist < Test::Unit::TestCase
78
72
  stream.join
79
73
  end
80
74
  end
75
+
76
+ def test_newer
77
+ TmpFile.with_file("Test1") do |tmp1|
78
+ sleep 1
79
+ TmpFile.with_file("Test1") do |tmp2|
80
+ assert Persist.newer?(tmp1, tmp2)
81
+ assert ! Persist.newer?(tmp2, tmp1)
82
+ end
83
+ end
84
+ end
81
85
  end
@@ -204,7 +204,6 @@ class TestWorkflow < Test::Unit::TestCase
204
204
 
205
205
  def test_update_on_input_dependency_update
206
206
  Open.repository_dirs << File.join(ENV["HOME"],".rbbt/tmp/test/workflow")
207
- Log.severity = 0
208
207
  Misc.with_env "RBBT_UPDATE", "true" do
209
208
  send_input_dep_to_reverse_job = TestWF.job(:send_input_dep_to_reverse, nil, :name => "Miguel")
210
209
  send_input_dep_to_reverse_job.clean
@@ -376,21 +375,23 @@ class TestWorkflow < Test::Unit::TestCase
376
375
  def test_delete_dep
377
376
  job = TestWF.job(:t3).recursive_clean
378
377
  job.run
379
- assert job.checks.select{|d| d.task_name.to_s == "t1" }.any?
380
- job = TestWF.job(:t3)
381
- job.step(:t1).clean
382
- assert job.checks.select{|d| d.task_name.to_s == "t1" }.empty?
383
- job = TestWF.job(:t3).recursive_clean
384
- job.run
385
- assert job.checks.select{|d| d.task_name.to_s == "t1" }.any?
386
- job = TestWF.job(:t3)
387
- sleep 1
388
- Open.touch job.step(:t1).path
389
- Misc.with_env "RBBT_UPDATE", "false" do
390
- assert job.updated?
391
- end
392
- Misc.with_env "RBBT_UPDATE", "true" do
393
- assert ! job.updated?
378
+ Misc.with_env "RBBT_UPDATE", 'true' do
379
+ assert job.checks.select{|d| d.task_name.to_s == "t1" }.any?
380
+ job = TestWF.job(:t3)
381
+ job.step(:t1).clean
382
+ assert job.checks.select{|d| d.task_name.to_s == "t1" }.empty?
383
+ job = TestWF.job(:t3).recursive_clean
384
+ job.run
385
+ assert job.checks.select{|d| d.task_name.to_s == "t1" }.any?
386
+ job = TestWF.job(:t3)
387
+ sleep 1
388
+ Open.touch job.step(:t1).path
389
+ Misc.with_env "RBBT_UPDATE", "false" do
390
+ assert job.updated?
391
+ end
392
+ Misc.with_env "RBBT_UPDATE", "true" do
393
+ assert ! job.updated?
394
+ end
394
395
  end
395
396
  end
396
397
 
@@ -222,6 +222,17 @@ row2 aa|aa|AA|AA b1|b2|B1|B2 Id1|Id1|Id2|Id2
222
222
  end
223
223
  end
224
224
 
225
+ def test_to_s_no_fields
226
+ file1 =<<-EOF
227
+ row6 dd dd ee
228
+ row1 a b c
229
+ row2 A B C
230
+ row3 1 2 3
231
+ EOF
232
+ tsv1 = TSV.open StringIO.new(file1), :sep => " "
233
+ assert tsv1.to_s(:sort, true).include?('dd')
234
+ end
235
+
225
236
  def test_to_s_unmerge_expand
226
237
  content =<<-EOF
227
238
  #Id ValueA ValueB OtherID