miga-base 0.7.4.0 → 0.7.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/lib/miga/cli.rb +10 -8
  3. data/lib/miga/cli/action.rb +2 -3
  4. data/lib/miga/cli/action/about.rb +5 -6
  5. data/lib/miga/cli/action/add.rb +18 -12
  6. data/lib/miga/cli/action/add_result.rb +2 -3
  7. data/lib/miga/cli/action/archive.rb +1 -2
  8. data/lib/miga/cli/action/classify_wf.rb +8 -6
  9. data/lib/miga/cli/action/console.rb +0 -1
  10. data/lib/miga/cli/action/daemon.rb +7 -7
  11. data/lib/miga/cli/action/date.rb +0 -1
  12. data/lib/miga/cli/action/derep_wf.rb +5 -4
  13. data/lib/miga/cli/action/doctor.rb +28 -20
  14. data/lib/miga/cli/action/doctor/base.rb +29 -6
  15. data/lib/miga/cli/action/edit.rb +1 -2
  16. data/lib/miga/cli/action/files.rb +8 -8
  17. data/lib/miga/cli/action/find.rb +5 -6
  18. data/lib/miga/cli/action/generic.rb +7 -7
  19. data/lib/miga/cli/action/get.rb +20 -17
  20. data/lib/miga/cli/action/get_db.rb +8 -2
  21. data/lib/miga/cli/action/index_wf.rb +1 -1
  22. data/lib/miga/cli/action/init.rb +53 -41
  23. data/lib/miga/cli/action/init/daemon_helper.rb +65 -43
  24. data/lib/miga/cli/action/lair.rb +7 -7
  25. data/lib/miga/cli/action/ln.rb +6 -6
  26. data/lib/miga/cli/action/ls.rb +1 -2
  27. data/lib/miga/cli/action/ncbi_get.rb +11 -3
  28. data/lib/miga/cli/action/new.rb +4 -4
  29. data/lib/miga/cli/action/next_step.rb +0 -1
  30. data/lib/miga/cli/action/preproc_wf.rb +3 -3
  31. data/lib/miga/cli/action/quality_wf.rb +1 -1
  32. data/lib/miga/cli/action/rm.rb +2 -3
  33. data/lib/miga/cli/action/run.rb +8 -8
  34. data/lib/miga/cli/action/stats.rb +9 -5
  35. data/lib/miga/cli/action/summary.rb +13 -7
  36. data/lib/miga/cli/action/tax_dist.rb +8 -4
  37. data/lib/miga/cli/action/tax_index.rb +3 -4
  38. data/lib/miga/cli/action/tax_set.rb +7 -6
  39. data/lib/miga/cli/action/tax_test.rb +6 -5
  40. data/lib/miga/cli/action/wf.rb +25 -19
  41. data/lib/miga/cli/base.rb +34 -32
  42. data/lib/miga/cli/objects_helper.rb +27 -18
  43. data/lib/miga/cli/opt_helper.rb +3 -2
  44. data/lib/miga/common.rb +2 -5
  45. data/lib/miga/common/base.rb +15 -16
  46. data/lib/miga/common/format.rb +11 -6
  47. data/lib/miga/common/hooks.rb +1 -4
  48. data/lib/miga/common/path.rb +4 -9
  49. data/lib/miga/common/with_daemon.rb +5 -2
  50. data/lib/miga/common/with_daemon_class.rb +1 -1
  51. data/lib/miga/common/with_result.rb +2 -1
  52. data/lib/miga/daemon.rb +51 -35
  53. data/lib/miga/daemon/base.rb +0 -2
  54. data/lib/miga/dataset.rb +47 -37
  55. data/lib/miga/dataset/base.rb +52 -37
  56. data/lib/miga/dataset/hooks.rb +3 -4
  57. data/lib/miga/dataset/result.rb +17 -1
  58. data/lib/miga/json.rb +5 -7
  59. data/lib/miga/lair.rb +4 -0
  60. data/lib/miga/metadata.rb +4 -3
  61. data/lib/miga/project.rb +29 -20
  62. data/lib/miga/project/base.rb +52 -37
  63. data/lib/miga/project/dataset.rb +27 -13
  64. data/lib/miga/project/hooks.rb +0 -3
  65. data/lib/miga/project/result.rb +14 -5
  66. data/lib/miga/remote_dataset.rb +85 -72
  67. data/lib/miga/remote_dataset/base.rb +11 -13
  68. data/lib/miga/remote_dataset/download.rb +34 -12
  69. data/lib/miga/result.rb +48 -53
  70. data/lib/miga/result/base.rb +0 -2
  71. data/lib/miga/result/dates.rb +1 -3
  72. data/lib/miga/result/source.rb +15 -16
  73. data/lib/miga/result/stats.rb +37 -27
  74. data/lib/miga/tax_dist.rb +6 -3
  75. data/lib/miga/tax_index.rb +17 -17
  76. data/lib/miga/taxonomy.rb +6 -1
  77. data/lib/miga/taxonomy/base.rb +19 -15
  78. data/lib/miga/version.rb +19 -16
  79. data/scripts/project_stats.bash +3 -0
  80. data/scripts/stats.bash +1 -1
  81. data/test/common_test.rb +3 -11
  82. data/test/daemon_helper.rb +38 -0
  83. data/test/daemon_test.rb +73 -101
  84. data/test/dataset_test.rb +63 -59
  85. data/test/format_test.rb +3 -11
  86. data/test/hook_test.rb +50 -55
  87. data/test/json_test.rb +7 -8
  88. data/test/lair_test.rb +22 -28
  89. data/test/metadata_test.rb +6 -14
  90. data/test/project_test.rb +33 -39
  91. data/test/remote_dataset_test.rb +26 -32
  92. data/test/result_stats_test.rb +17 -27
  93. data/test/result_test.rb +41 -34
  94. data/test/tax_dist_test.rb +0 -2
  95. data/test/tax_index_test.rb +4 -10
  96. data/test/taxonomy_test.rb +7 -9
  97. data/test/test_helper.rb +42 -1
  98. data/test/with_daemon_test.rb +14 -22
  99. data/utils/adapters.fa +13 -0
  100. data/utils/cleanup-databases.rb +6 -5
  101. data/utils/distance/base.rb +0 -1
  102. data/utils/distance/commands.rb +19 -12
  103. data/utils/distance/database.rb +24 -21
  104. data/utils/distance/pipeline.rb +23 -10
  105. data/utils/distance/runner.rb +20 -16
  106. data/utils/distance/temporal.rb +1 -3
  107. data/utils/distances.rb +1 -1
  108. data/utils/domain-ess-genes.rb +7 -7
  109. data/utils/index_metadata.rb +4 -2
  110. data/utils/mytaxa_scan.rb +18 -16
  111. data/utils/representatives.rb +5 -4
  112. data/utils/requirements.txt +1 -1
  113. data/utils/subclade/base.rb +0 -1
  114. data/utils/subclade/pipeline.rb +7 -6
  115. data/utils/subclade/runner.rb +9 -9
  116. data/utils/subclade/temporal.rb +0 -2
  117. data/utils/subclades-compile.rb +39 -37
  118. data/utils/subclades.rb +1 -1
  119. metadata +5 -4
@@ -6,9 +6,7 @@ require 'json'
6
6
  ##
7
7
  # Taxonomic classifications in MiGA.
8
8
  class MiGA::Json < MiGA::MiGA
9
-
10
9
  class << self
11
-
12
10
  ##
13
11
  # Default parsing options. Supported +opts+ keys:
14
12
  # - +:contents+: If true, the input is assumed to be the contents to parse,
@@ -25,6 +23,7 @@ class MiGA::Json < MiGA::MiGA
25
23
  if opts[:additions] and opts[:symbolize]
26
24
  raise 'JSON additions are not supported with symbolized names'
27
25
  end
26
+
28
27
  opts
29
28
  end
30
29
 
@@ -37,12 +36,13 @@ class MiGA::Json < MiGA::MiGA
37
36
  opts = default_opts(opts)
38
37
  cont = opts[:contents] ? path : File.read(path)
39
38
  raise "Empty descriptor: #{opts[:contents] ? "''" : path}." if cont.empty?
39
+
40
40
  y = JSON.parse(cont,
41
- symbolize_names: opts[:symbolize],
42
- create_additions: opts[:additions])
41
+ symbolize_names: opts[:symbolize],
42
+ create_additions: opts[:additions])
43
43
  unless opts[:default].nil?
44
44
  opts[:default] = parse(opts[:default]) if opts[:default].is_a? String
45
- y.each{ |k, v| opts[:default][k] = v }
45
+ y.each { |k, v| opts[:default][k] = v }
46
46
  y = opts[:default]
47
47
  end
48
48
  y
@@ -56,7 +56,5 @@ class MiGA::Json < MiGA::MiGA
56
56
  File.open(path, 'w') { |fh| fh.print y } unless path.nil?
57
57
  y
58
58
  end
59
-
60
59
  end
61
-
62
60
  end
@@ -70,6 +70,7 @@ class MiGA::Lair < MiGA::MiGA
70
70
  def daemon_loop
71
71
  check_directories
72
72
  return false if options[:dry]
73
+
73
74
  sleep(options[:latency])
74
75
  true
75
76
  end
@@ -102,10 +103,12 @@ class MiGA::Lair < MiGA::MiGA
102
103
  def each_project(dir = path)
103
104
  Dir.entries(dir).each do |f|
104
105
  next if %w[. ..].include?(f) # Ruby <= 2.3 doesn't have Dir.children
106
+
105
107
  f = File.join(dir, f)
106
108
  if MiGA::Project.exist? f
107
109
  project = MiGA::Project.load(f)
108
110
  raise "Cannot load project: #{f}" if project.nil?
111
+
109
112
  yield(project)
110
113
  elsif Dir.exist? f
111
114
  each_project(f) { |project| yield(project) }
@@ -127,6 +130,7 @@ class MiGA::Lair < MiGA::MiGA
127
130
  each_project do |project|
128
131
  d = MiGA::Daemon.new(project)
129
132
  next if d.active?
133
+
130
134
  l_alive = d.last_alive
131
135
  unless l_alive.nil?
132
136
  next if options[:trust_timestamp] && project.metadata.updated < l_alive
@@ -16,6 +16,7 @@ class MiGA::Metadata < MiGA::MiGA
16
16
  # exists, or nil otherwise.
17
17
  def self.load(path)
18
18
  return nil unless Metadata.exist? path
19
+
19
20
  MiGA::Metadata.new(path)
20
21
  end
21
22
 
@@ -33,11 +34,11 @@ class MiGA::Metadata < MiGA::MiGA
33
34
  @path = File.absolute_path(path)
34
35
  unless File.exist? path
35
36
  @data = {}
36
- defaults.each { |k,v| self[k] = v }
37
+ defaults.each { |k, v| self[k] = v }
37
38
  create
38
39
  end
39
40
  end
40
-
41
+
41
42
  ##
42
43
  # Parsed data as a Hash
43
44
  def data
@@ -73,6 +74,7 @@ class MiGA::Metadata < MiGA::MiGA
73
74
  ofh.close
74
75
  raise "Lock-racing detected for #{path}" unless
75
76
  File.exist?("#{path}.tmp") and File.exist?(lock_file)
77
+
76
78
  File.rename("#{path}.tmp", path)
77
79
  File.unlink(lock_file)
78
80
  end
@@ -152,5 +154,4 @@ class MiGA::Metadata < MiGA::MiGA
152
154
  def to_json
153
155
  MiGA::Json.generate(data)
154
156
  end
155
-
156
157
  end
@@ -7,19 +7,18 @@ require 'miga/project/dataset'
7
7
  require 'miga/project/hooks'
8
8
 
9
9
  ##
10
- # MiGA representation of a project.
10
+ # MiGA representation of a project
11
11
  class MiGA::Project < MiGA::MiGA
12
-
13
12
  include MiGA::Project::Result
14
13
  include MiGA::Project::Dataset
15
14
  include MiGA::Project::Hooks
16
15
 
17
16
  ##
18
- # Absolute path to the project folder.
17
+ # Absolute path to the project folder
19
18
  attr_reader :path
20
19
 
21
20
  ##
22
- # Information about the project as MiGA::Metadata.
21
+ # Information about the project as MiGA::Metadata
23
22
  attr_reader :metadata
24
23
 
25
24
  ##
@@ -29,7 +28,7 @@ class MiGA::Project < MiGA::MiGA
29
28
  ##
30
29
  # Create a new MiGA::Project at +path+, if it doesn't exist and +update+ is
31
30
  # false, or load an existing one.
32
- def initialize(path, update=false)
31
+ def initialize(path, update = false)
33
32
  @datasets = {}
34
33
  @do_not_save = false
35
34
  @path = File.absolute_path(path)
@@ -40,17 +39,19 @@ class MiGA::Project < MiGA::MiGA
40
39
  end
41
40
 
42
41
  ##
43
- # Create an empty project.
42
+ # Create an empty project
44
43
  def create
45
44
  unless MiGA::MiGA.initialized?
46
45
  raise 'Impossible to create project in uninitialized MiGA.'
47
46
  end
48
- dirs = [path] + @@FOLDERS.map{|d| "#{path}/#{d}" } +
49
- @@DATA_FOLDERS.map{ |d| "#{path}/data/#{d}"}
50
- dirs.each{ |d| Dir.mkdir(d) unless Dir.exist? d }
47
+
48
+ dirs = [path] + @@FOLDERS.map { |d| "#{path}/#{d}" } +
49
+ @@DATA_FOLDERS.map { |d| "#{path}/data/#{d}" }
50
+ dirs.each { |d| Dir.mkdir(d) unless Dir.exist? d }
51
51
  @metadata = MiGA::Metadata.new(
52
52
  File.expand_path('miga.project.json', path),
53
- {datasets: [], name: File.basename(path)})
53
+ { datasets: [], name: File.basename(path) }
54
+ )
54
55
  d_path = File.expand_path('daemon/daemon.json', path)
55
56
  File.open(d_path, 'w') { |fh| fh.puts '{}' } unless File.exist? d_path
56
57
  pull_hook :on_create
@@ -58,13 +59,13 @@ class MiGA::Project < MiGA::MiGA
58
59
  end
59
60
 
60
61
  ##
61
- # Save any changes persistently. Do nothing if +do_not_save+ is true.
62
+ # Save any changes persistently. Do nothing if +do_not_save+ is true
62
63
  def save
63
64
  save! unless do_not_save
64
65
  end
65
66
 
66
67
  ##
67
- # Save any changes persistently, regardless of +do_not_save+.
68
+ # Save any changes persistently, regardless of +do_not_save+
68
69
  def save!
69
70
  metadata.save
70
71
  pull_hook :on_save
@@ -72,29 +73,37 @@ class MiGA::Project < MiGA::MiGA
72
73
  end
73
74
 
74
75
  ##
75
- # (Re-)load project data and metadata.
76
+ # (Re-)load project data and metadata
76
77
  def load
77
78
  @datasets = {}
78
79
  @dataset_names_hash = nil
79
80
  @metadata = MiGA::Metadata.load "#{path}/miga.project.json"
80
81
  raise "Couldn't find project metadata at #{path}" if metadata.nil?
82
+
81
83
  pull_hook :on_load
82
84
  end
83
85
 
84
86
  ##
85
- # Name of the project.
86
- def name ; metadata[:name] ; end
87
+ # Name of the project
88
+ def name
89
+ metadata[:name]
90
+ end
87
91
 
88
92
  ##
89
- # Type of project.
90
- def type ; metadata[:type] ; end
93
+ # Type of project
94
+ def type
95
+ metadata[:type]
96
+ end
91
97
 
92
98
  ##
93
99
  # Is this a clade project?
94
- def is_clade? ; type==:clade ; end
100
+ def is_clade?
101
+ type == :clade
102
+ end
95
103
 
96
104
  ##
97
105
  # Is this a project for multi-organism datasets?
98
- def is_multi? ; @@KNOWN_TYPES[type][:multi] ; end
99
-
106
+ def is_multi?
107
+ @@KNOWN_TYPES[type][:multi]
108
+ end
100
109
  end
@@ -2,7 +2,6 @@
2
2
  # @license Artistic-2.0
3
3
 
4
4
  class MiGA::Project < MiGA::MiGA
5
-
6
5
  class << self
7
6
  ##
8
7
  # Does the project at +path+ exist?
@@ -15,26 +14,35 @@ class MiGA::Project < MiGA::MiGA
15
14
  # otherwise.
16
15
  def load(path)
17
16
  return nil unless exist? path
17
+
18
18
  new path
19
19
  end
20
20
 
21
- def INCLADE_TASKS ; @@INCLADE_TASKS ; end
22
- def DISTANCE_TASKS ; @@DISTANCE_TASKS ; end
23
- def KNOWN_TYPES ; @@KNOWN_TYPES ; end
24
- def RESULT_DIRS ; @@RESULT_DIRS ; end
21
+ def INCLADE_TASKS
22
+ @@INCLADE_TASKS
23
+ end
25
24
 
26
- end
25
+ def DISTANCE_TASKS
26
+ @@DISTANCE_TASKS
27
+ end
28
+
29
+ def KNOWN_TYPES
30
+ @@KNOWN_TYPES
31
+ end
27
32
 
33
+ def RESULT_DIRS
34
+ @@RESULT_DIRS
35
+ end
36
+ end
28
37
  end
29
38
 
30
39
  module MiGA::Project::Base
31
-
32
40
  ##
33
- # Top-level folders inside a project.
41
+ # Top-level folders inside a project
34
42
  @@FOLDERS = %w[data metadata daemon]
35
43
 
36
44
  ##
37
- # Folders for results.
45
+ # Folders for results
38
46
  @@DATA_FOLDERS = %w[
39
47
  01.raw_reads 02.trimmed_reads 03.read_quality 04.trimmed_fasta
40
48
  05.assembly 06.cds
@@ -54,46 +62,53 @@ module MiGA::Project::Base
54
62
  ]
55
63
 
56
64
  ##
57
- # Directories containing the results from project-wide tasks.
65
+ # Directories containing the results from project-wide tasks
58
66
  @@RESULT_DIRS = {
59
- project_stats: "90.stats",
67
+ project_stats: '90.stats',
60
68
  # Distances
61
- haai_distances: "09.distances/01.haai",
62
- aai_distances: "09.distances/02.aai",
63
- ani_distances: "09.distances/03.ani",
64
- #ssu_distances: "09.distances/04.ssu",
69
+ haai_distances: '09.distances/01.haai',
70
+ aai_distances: '09.distances/02.aai',
71
+ ani_distances: '09.distances/03.ani',
72
+ # ssu_distances: '09.distances/04.ssu',
65
73
  # Clade identification
66
- clade_finding: "10.clades/01.find",
74
+ clade_finding: '10.clades/01.find',
67
75
  # Clade analysis
68
- subclades: "10.clades/02.ani",
69
- ogs: "10.clades/03.ogs"
70
- #ess_phylogeny: "10.clades/04.phylogeny/01.essential",
71
- #core_phylogeny: "10.clades/04.phylogeny/02.core",
72
- #clade_metadata: "10.clades/05.metadata"
76
+ subclades: '10.clades/02.ani',
77
+ ogs: '10.clades/03.ogs'
78
+ # ess_phylogeny: '10.clades/04.phylogeny/01.essential',
79
+ # core_phylogeny: '10.clades/04.phylogeny/02.core',
80
+ # clade_metadata: '10.clades/05.metadata'
73
81
  }
74
82
 
75
83
  ##
76
- # Supported types of projects.
84
+ # Supported types of projects
77
85
  @@KNOWN_TYPES = {
78
86
  mixed: {
79
- description: "Mixed collection of genomes, metagenomes, and viromes",
80
- single: true, multi: true},
81
- genomes: {description: "Collection of genomes",
82
- single: true, multi: false},
83
- clade: {description: "Collection of closely-related genomes (ANI >= 90%)",
84
- single: true, multi: false},
85
- metagenomes: {description: "Collection of metagenomes and/or viromes",
86
- single: false, multi: true}
87
+ description: 'Mixed collection of genomes, metagenomes, and viromes',
88
+ single: true, multi: true
89
+ },
90
+ genomes: {
91
+ description: 'Collection of genomes',
92
+ single: true, multi: false
93
+ },
94
+ clade: {
95
+ description: 'Collection of closely-related genomes (ANI >= 90%)',
96
+ single: true, multi: false
97
+ },
98
+ metagenomes: {
99
+ description: 'Collection of metagenomes and/or viromes',
100
+ single: false, multi: true
101
+ }
87
102
  }
88
103
 
89
104
  ##
90
- # Project-wide distance estimations.
91
- @@DISTANCE_TASKS = [:project_stats,
92
- :haai_distances, :aai_distances, :ani_distances, :clade_finding]
93
-
105
+ # Project-wide distance estimations
106
+ @@DISTANCE_TASKS = [
107
+ :project_stats, :haai_distances, :aai_distances, :ani_distances,
108
+ :clade_finding
109
+ ]
110
+
94
111
  ##
95
- # Project-wide tasks for :clade projects.
112
+ # Project-wide tasks for :clade projects
96
113
  @@INCLADE_TASKS = [:subclades, :ogs]
97
-
98
114
  end
99
-
@@ -4,11 +4,10 @@
4
4
  ##
5
5
  # Helper module including specific functions handle datasets.
6
6
  module MiGA::Project::Dataset
7
-
8
7
  ##
9
8
  # Returns Array of MiGA::Dataset.
10
9
  def datasets
11
- metadata[:datasets].map{ |name| dataset(name) }
10
+ metadata[:datasets].map { |name| dataset(name) }
12
11
  end
13
12
 
14
13
  ##
@@ -21,7 +20,7 @@ module MiGA::Project::Dataset
21
20
  # Returns Hash of Strings => true. Similar to +dataset_names+ but as
22
21
  # Hash for efficiency.
23
22
  def dataset_names_hash
24
- @dataset_names_hash ||= Hash[dataset_names.map{ |i| [i,true] }]
23
+ @dataset_names_hash ||= Hash[dataset_names.map { |i| [i, true] }]
25
24
  end
26
25
 
27
26
  ##
@@ -29,6 +28,7 @@ module MiGA::Project::Dataset
29
28
  def dataset(name)
30
29
  name = name.miga_name
31
30
  return nil unless MiGA::Dataset.exist?(self, name)
31
+
32
32
  @datasets ||= {}
33
33
  @datasets[name] ||= MiGA::Dataset.new(self, name)
34
34
  @datasets[name]
@@ -62,6 +62,7 @@ module MiGA::Project::Dataset
62
62
  def unlink_dataset(name)
63
63
  d = dataset(name)
64
64
  return nil if d.nil?
65
+
65
66
  self.metadata[:datasets].delete(name)
66
67
  save
67
68
  pull_hook(:on_unlink_dataset, name)
@@ -71,28 +72,40 @@ module MiGA::Project::Dataset
71
72
  ##
72
73
  # Import the dataset +ds+, a MiGA::Dataset, using +method+ which is any method
73
74
  # supported by File#generic_transfer.
74
- def import_dataset(ds, method=:hardlink)
75
+ def import_dataset(ds, method = :hardlink)
75
76
  raise "Impossible to import dataset, it already exists: #{ds.name}." if
76
77
  MiGA::Dataset.exist?(self, ds.name)
78
+
77
79
  # Import dataset results
78
80
  ds.each_result do |task, result|
79
81
  # import result files
80
82
  result.each_file do |file|
81
- File.generic_transfer("#{result.dir}/#{file}",
82
- "#{path}/data/#{MiGA::Dataset.RESULT_DIRS[task]}/#{file}", method)
83
+ File.generic_transfer(
84
+ File.join(result.dir, file),
85
+ File.join(path, 'data', MiGA::Dataset.RESULT_DIRS[task], file),
86
+ method
87
+ )
83
88
  end
84
89
  # import result metadata
85
90
  %w(json start done).each do |suffix|
86
- if File.exist? "#{result.dir}/#{ds.name}.#{suffix}"
87
- File.generic_transfer("#{result.dir}/#{ds.name}.#{suffix}",
88
- "#{path}/data/#{MiGA::Dataset.RESULT_DIRS[task]}/" +
89
- "#{ds.name}.#{suffix}", method)
91
+ if File.exist? File.join(result.dir, "#{ds.name}.#{suffix}")
92
+ File.generic_transfer(
93
+ File.join(result.dir, "#{ds.name}.#{suffix}"),
94
+ File.join(
95
+ path, 'data', MiGA::Dataset.RESULT_DIRS[task],
96
+ "#{ds.name}.#{suffix}"
97
+ ),
98
+ method
99
+ )
90
100
  end
91
101
  end
92
102
  end
93
103
  # Import dataset metadata
94
- File.generic_transfer("#{ds.project.path}/metadata/#{ds.name}.json",
95
- "#{self.path}/metadata/#{ds.name}.json", method)
104
+ File.generic_transfer(
105
+ File.join(ds.project.path, 'metadata', "#{ds.name}.json"),
106
+ File.join(self.path, 'metadata', "#{ds.name}.json"),
107
+ method
108
+ )
96
109
  # Save dataset
97
110
  self.add_dataset(ds.name)
98
111
  end
@@ -104,11 +117,13 @@ module MiGA::Project::Dataset
104
117
  MiGA::Dataset.RESULT_DIRS.values.each do |dir|
105
118
  dir_p = "#{path}/data/#{dir}"
106
119
  next unless Dir.exist? dir_p
120
+
107
121
  Dir.entries(dir_p).each do |file|
108
122
  next unless
109
123
  file =~ %r{
110
124
  \.(fa(a|sta|stqc?)?|fna|solexaqa|gff[23]?|done|ess)(\.gz)?$
111
125
  }x
126
+
112
127
  m = /([^\.]+)/.match(file)
113
128
  datasets << m[1] unless m.nil? or m[1] == "miga-project"
114
129
  end
@@ -146,5 +161,4 @@ module MiGA::Project::Dataset
146
161
  def each_dataset_profile_advance(&blk)
147
162
  each_dataset { |ds| blk.call(ds.profile_advance) }
148
163
  end
149
-
150
164
  end