miga-base 0.4.1.0 → 0.4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/bin/miga +2 -244
  3. data/lib/miga/cli/action/about.rb +44 -0
  4. data/lib/miga/cli/action/add.rb +139 -0
  5. data/lib/miga/cli/action/add_result.rb +26 -0
  6. data/lib/miga/cli/action/console.rb +19 -0
  7. data/lib/miga/cli/action/daemon.rb +74 -0
  8. data/lib/miga/cli/action/date.rb +18 -0
  9. data/lib/miga/cli/action/doctor.rb +210 -0
  10. data/lib/miga/cli/action/edit.rb +24 -0
  11. data/lib/miga/cli/action/files.rb +31 -0
  12. data/lib/miga/cli/action/find.rb +48 -0
  13. data/lib/miga/cli/action/generic.rb +44 -0
  14. data/lib/miga/cli/action/get.rb +132 -0
  15. data/lib/miga/cli/action/init.rb +343 -0
  16. data/lib/miga/cli/action/ln.rb +42 -0
  17. data/lib/miga/cli/action/ls.rb +55 -0
  18. data/lib/miga/cli/action/ncbi_get.rb +218 -0
  19. data/lib/miga/cli/action/new.rb +45 -0
  20. data/lib/miga/cli/action/next_step.rb +27 -0
  21. data/lib/miga/cli/action/plugins.rb +28 -0
  22. data/lib/miga/cli/action/rm.rb +25 -0
  23. data/lib/miga/cli/action/run.rb +39 -0
  24. data/lib/miga/cli/action/stats.rb +140 -0
  25. data/lib/miga/cli/action/summary.rb +49 -0
  26. data/lib/miga/cli/action/tax_dist.rb +102 -0
  27. data/lib/miga/cli/action/tax_index.rb +47 -0
  28. data/lib/miga/cli/action/tax_set.rb +59 -0
  29. data/lib/miga/cli/action/tax_test.rb +77 -0
  30. data/lib/miga/cli/action.rb +66 -0
  31. data/lib/miga/cli/base.rb +90 -0
  32. data/lib/miga/cli.rb +426 -0
  33. data/lib/miga/project/result.rb +14 -6
  34. data/lib/miga/remote_dataset.rb +1 -1
  35. data/lib/miga/tax_index.rb +5 -4
  36. data/lib/miga/taxonomy/base.rb +63 -0
  37. data/lib/miga/taxonomy.rb +87 -92
  38. data/lib/miga/version.rb +6 -6
  39. data/test/taxonomy_test.rb +49 -9
  40. data/utils/distance/commands.rb +11 -11
  41. data/utils/distance/pipeline.rb +5 -5
  42. metadata +43 -49
  43. data/actions/about.rb +0 -43
  44. data/actions/add.rb +0 -129
  45. data/actions/add_result.rb +0 -30
  46. data/actions/daemon.rb +0 -55
  47. data/actions/date.rb +0 -14
  48. data/actions/doctor.rb +0 -201
  49. data/actions/edit.rb +0 -33
  50. data/actions/files.rb +0 -43
  51. data/actions/find.rb +0 -41
  52. data/actions/get.rb +0 -105
  53. data/actions/init.rb +0 -301
  54. data/actions/ln.rb +0 -47
  55. data/actions/ls.rb +0 -61
  56. data/actions/ncbi_get.rb +0 -192
  57. data/actions/new.rb +0 -44
  58. data/actions/next_step.rb +0 -33
  59. data/actions/plugins.rb +0 -25
  60. data/actions/rm.rb +0 -29
  61. data/actions/run.rb +0 -45
  62. data/actions/stats.rb +0 -149
  63. data/actions/summary.rb +0 -57
  64. data/actions/tax_dist.rb +0 -106
  65. data/actions/tax_index.rb +0 -46
  66. data/actions/tax_set.rb +0 -63
  67. data/actions/tax_test.rb +0 -80
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3c339de89529e19ad52d1d3522fbe25206045d3db3b030e4ee8c7ddf7d3c1db
4
- data.tar.gz: d220804d9a9bc722496f271135da3c4415a77c84d40e49db5d39d015e13d9865
3
+ metadata.gz: 8d83a4e140647fdcfdd062c0f503e8ad5fefacef870fe5c8c3528e4edeb1e44f
4
+ data.tar.gz: f8248690dde4d6441658ab6f75181c4786ca7ad6d8d26fa83f195ebdef801c26
5
5
  SHA512:
6
- metadata.gz: 27b5d98711e579c077eda211387457578e70183a30459dc6c6e917b5fc20cdbc730d649dfd58b0a2477ea019e0577c1c4993fc6d29eaee9bbdeb77a753ddb107
7
- data.tar.gz: 8a391e9090bdf8dbf555fcdd456c1ae7c909a69b1f59cf5eac039d6f18ffbd0b9caf04bdcad406485f914c1c14681105d086e2b36f82039102df4d6b29baace0
6
+ metadata.gz: 36bd4f0122601175a09f3e61ef81618f8db323b41acda67c927bc9578b86ca1d9da4d714a0a02b91541a320cccbbb5b396da7ebe03c6b7f03b5ccd0880ea5953
7
+ data.tar.gz: 4874ebeabbebdcd0661ec8b7de879f075fd9847c921319192f3272861ed9f41c5a9954000ef60542164240d2dee8a01a2c752256d32323dc7ded0a5b50b2f099
data/bin/miga CHANGED
@@ -4,249 +4,7 @@
4
4
  # @license Artistic-2.0
5
5
 
6
6
  $:.push File.expand_path('../../lib', __FILE__)
7
-
8
- require 'optparse'
9
7
  require 'miga'
8
+ require 'miga/cli'
10
9
 
11
- ##=> Global variables <=
12
-
13
- $task_desc = {
14
- # Projects
15
- new: 'Creates an empty MiGA project',
16
- about: 'Displays information about a MiGA project',
17
- plugins: 'Lists or (un)installs plugins in a MiGA project',
18
- doctor: 'Performs consistency checks on a MiGA project',
19
- # Datasets
20
- add: 'Creates a dataset in a MiGA project',
21
- get: 'Downloads a dataset from public databases into a MiGA project',
22
- ncbi_get: 'Downloads all genomes in a taxon from NCBI into a MiGA project',
23
- rm: 'Removes a dataset from an MiGA project',
24
- find: 'Finds unregistered datasets based on result files',
25
- ln: 'Link datasets (including results) from one project to another',
26
- ls: 'Lists all registered datasets in an MiGA project',
27
- # Results
28
- add_result: 'Registers a result',
29
- stats: 'Extracts statistics for the given result',
30
- files: 'Lists registered files from the results of a dataset or project',
31
- run: 'Executes locally one step analysis producing the given result',
32
- summary: 'Generates a summary table for the statistics of all datasets',
33
- next_step: 'Returns the next task to run in a dataset or project',
34
- # Objects (Datasets or Projects)
35
- edit: 'Edits the metadata of a dataset or project',
36
- # System
37
- init: 'Initialize MiGA to process new projects',
38
- daemon: 'Controls the daemon of a MiGA project',
39
- date: 'Returns the current date in standard MiGA format',
40
- console: 'Opens an IRB console with MiGA',
41
- # Taxonomy
42
- tax_set: 'Registers taxonomic information for datasets',
43
- tax_test: 'Returns test of taxonomic distributions for query datasets',
44
- tax_index: 'Creates a taxonomy-indexed list of the datasets',
45
- tax_dist: 'Estimates distributions of distance by taxonomy',
46
- }
47
-
48
- $task_alias = {
49
- # Projects
50
- create_project: :new,
51
- project_info: :about,
52
- # Datasets
53
- create_dataset: :add,
54
- download_dataset: :get,
55
- unlink_dataset: :rm,
56
- find_datasets: :find,
57
- import_datasets: :ln,
58
- list_datasets: :ls,
59
- # Results
60
- result_stats: :stats,
61
- list_files: :files,
62
- run_local: :run,
63
- sum_stats: :summary,
64
- next_task: :next_step,
65
- # Objects
66
- update_metadata: :edit,
67
- # System
68
- c: :console,
69
- # Taxonomy
70
- add_taxonomy: :tax_set,
71
- test_taxonomy: :tax_test,
72
- index_taxonomy: :tax_index,
73
- tax_distributions: :tax_dist,
74
- }
75
-
76
- $task_alias.each do |nick, task|
77
- $task_desc[task] = (
78
- ($task_desc[task] =~ /\(alias: .*\)\./) ?
79
- $task_desc[task].sub(/\)\.$/, ", #{nick}).") :
80
- $task_desc[task].sub(/\.$/, " (alias: #{nick}).")
81
- )
82
- end
83
-
84
- ##=> Functions <=
85
-
86
- # OptParse banner
87
- def opt_banner(opt, files = false)
88
- opt.banner = <<BAN
89
- #{$task_desc[$task]}
90
-
91
- Usage: #{$0} #{$task} [options]#{ ' FILES...' if files}
92
- BAN
93
- opt.separator ""
94
- end
95
-
96
- # OptParse flags that determine the object to load
97
- def opt_object(opt, o, what = [:project, :dataset])
98
- opt.on('-P', '--project PATH', '(Mandatory) Path to the project.'
99
- ){ |v| o[:project]=v } if what.include? :project
100
- opt.on('-D', '--dataset STRING',
101
- (what.include?(:dataset) ? '(Mandatory) ' : '') +
102
- 'Name of the dataset.'){ |v| o[:dataset]=v } if what.include? :dataset or
103
- what.include? :dataset_opt
104
- opt.on('-D', '--dataset STRING', 'Name of the dataset.'
105
- ){ |v| o[:dataset]=v } if what.include? :dataset_opt
106
- opt.on('-t', '--type STRING',
107
- (what.include?(:dataset_type_req) ? '(Mandatory) ' : '')+
108
- 'Type of dataset. Recognized types include:',
109
- *MiGA::Dataset.KNOWN_TYPES.map{ |k,v| "~ #{k}: #{v[:description]}" }
110
- ){ |v| o[:type]=v.to_sym } if what.include? :dataset_type or
111
- what.include? :dataset_type_req
112
- opt.on('-t', '--type STRING',
113
- (what.include?(:project_type_req) ? '(Mandatory) ' : '') +
114
- 'Type of project. Recognized types include:',
115
- *MiGA::Project.KNOWN_TYPES.map{ |k,v| "~ #{k}: #{v[:description]}"}
116
- ){ |v| o[:type]=v.to_sym } if what.include? :project_type or
117
- what.include? :project_type_req
118
- opt.on('-r', '--result STRING',
119
- '(Mandatory) Name of the result.',
120
- 'Recognized names for dataset-specific results include:',
121
- *MiGA::Dataset.RESULT_DIRS.keys.map{|n| " ~ #{n}"},
122
- 'Recognized names for project-wide results include:',
123
- *MiGA::Project.RESULT_DIRS.keys.map{|n| " ~ #{n}"}
124
- ){ |v| o[:name]=v.downcase.to_sym } if what.include? :result
125
- opt.on('-r', '--result STRING',
126
- '(Mandatory) Name of the result. One of:',
127
- *MiGA::Dataset.RESULT_DIRS.keys.map{|n| " ~ #{n}"}
128
- ){ |v| o[:name]=v.downcase.to_sym } if what.include? :result_dataset
129
- end
130
-
131
- # OptParse flags common to all actions.
132
- def opt_common(opt, o)
133
- opt.on('-v', '--verbose',
134
- 'Print additional information to STDERR.'){ o[:q]=false }
135
- opt.on('-d', '--debug INT',
136
- 'Print debugging information to STDERR (1: debug, 2: trace).') do |v|
137
- v.to_i>1 ? MiGA::MiGA.DEBUG_TRACE_ON : MiGA::MiGA.DEBUG_ON
138
- end
139
- opt.on('-h', '--help', 'Display this screen.') do
140
- puts opt
141
- exit
142
- end
143
- opt.separator ''
144
- end
145
-
146
- # OptParse flags to filter lists of datasets.
147
- def opt_filter_datasets(opt, o, what = [:ref, :multi, :active, :taxonomy])
148
- opt.on('--[no-]ref',
149
- 'If set, uses only reference (or only non-reference) datasets.'
150
- ){ |v| o[:ref]=v } if what.include? :ref
151
- opt.on('--[no-]multi',
152
- 'If set, uses only multi-species (or only single-species) datasets.'
153
- ){ |v| o[:multi]=v } if what.include? :multi
154
- opt.on('--[no-]active',
155
- 'If set, uses only active (or inactive) datasets.'
156
- ){ |v| o[:active]=v } if what.include? :active
157
- opt.on('-t', '--taxonomy RANK:TAXON', 'Filter by taxonomy.'
158
- ){ |v| o[:taxonomy]=MiGA::Taxonomy.new v } if what.include? :taxonomy
159
- opt.on('-k', '--key INTEGER',
160
- 'Returns only the k-th dataset in the list.'){ |v| o[:key]=v.to_i }
161
- end
162
-
163
- def opt_require(o, req = {project: '-P', dataset: '-D'})
164
- req.each do |k,v|
165
- raise "#{v} is mandatory: please provide #{k}." if o[k].nil?
166
- end
167
- end
168
-
169
- def opt_require_type(o, klass)
170
- opt_require(o, type: '-t')
171
- raise "Unrecognized type: #{o[:type]}." if klass.KNOWN_TYPES[o[:type]].nil?
172
- end
173
-
174
- # Filters datasets by keys set in +opt_filter_datasets+.
175
- def filter_datasets!(ds, o)
176
- ds.select! { |d| d.is_ref? == o[:ref] } unless o[:ref].nil?
177
- ds.select! { |d| d.is_active? == o[:active] } unless o[:active].nil?
178
- ds.select! do |d|
179
- o[:multi] ? d.is_multi? : d.is_nonmulti?
180
- end unless o[:multi].nil?
181
- ds.select! do |d|
182
- (not d.metadata[:tax].nil?) and d.metadata[:tax].is_in?(o[:taxonomy])
183
- end unless o[:taxonomy].nil?
184
- o[:key].nil? ? ds : ds.values_at(o[:key]-1)
185
- end
186
-
187
- def add_metadata(o, obj)
188
- o[:metadata].split(',').each do |pair|
189
- (k,v) = pair.split('=')
190
- case v
191
- when 'true'; v = true
192
- when 'false'; v = false
193
- when 'nil'; v = nil
194
- end
195
- if k == '_step'
196
- obj.metadata["_try_#{v}"] ||= 0
197
- obj.metadata["_try_#{v}"] += 1
198
- end
199
- obj.metadata[k] = v
200
- end unless o[:metadata].nil?
201
- [:type, :name, :user, :description, :comments].each do |k|
202
- obj.metadata[k] = o[k] unless o[k].nil?
203
- end
204
- obj
205
- end
206
-
207
- ##=> Main <=
208
-
209
- execs = $task_desc.keys.map{ |k| k.to_s }
210
-
211
- ARGV[0] = $task_alias[ARGV[0].to_sym] unless
212
- ARGV[0].nil? or $task_alias[ARGV[0].to_sym].nil?
213
-
214
- case ARGV[0].to_s
215
- when '-v', '--version'
216
- puts MiGA::MiGA.VERSION
217
- when '-V', '--long-version'
218
- puts MiGA::MiGA.LONG_VERSION
219
- when '-C', '--citation'
220
- puts MiGA::MiGA.CITATION
221
- when 'console'
222
- require 'irb'
223
- require 'irb/completion'
224
- ARGV.shift
225
- IRB.start
226
- when *execs
227
- $task = ARGV.shift.to_sym
228
- ARGV << '-h' if ARGV.empty? and not [:date, :init].include? $task
229
- begin
230
- load File.expand_path("../actions/#{$task}.rb", File.dirname(__FILE__))
231
- rescue => err
232
- $stderr.puts "Exception: #{err}\n\n"
233
- err.backtrace.each { |l| $stderr.puts l + "\n" }
234
- err
235
- end
236
- else
237
- print <<HELP
238
-
239
- Microbial Genomes Atlas.
240
-
241
- Usage: #{$0} {action} [options]
242
-
243
- #{ MiGA::MiGA.tabulate([:action, :description], $task_desc.to_a).join("\n") }
244
-
245
- generic options:
246
- -h, --help Display this screen.
247
- -v, --version Show MiGA version.
248
- -V, --long-version Show complete MiGA version.
249
- -C, --citation How to cite MiGA.
250
-
251
- HELP
252
- end
10
+ MiGA::Cli.new(ARGV).launch
@@ -0,0 +1,44 @@
1
+ # @package MiGA
2
+ # @license Artistic-2.0
3
+
4
+ require 'miga/cli/action'
5
+
6
+ class MiGA::Cli::Action::About < MiGA::Cli::Action
7
+
8
+ def parse_cli
9
+ cli.defaults = {info: false, processing: false, tabular: false}
10
+ cli.parse do |opt|
11
+ cli.opt_object(opt, [:project])
12
+ opt.on(
13
+ '-p', '--processing',
14
+ 'Print information on processing advance'
15
+ ){ |v| cli[:processing] = v }
16
+ opt.on(
17
+ '-m', '--metadata STRING',
18
+ 'Print name and metadata field only'
19
+ ){ |v| cli[:datum] = v }
20
+ opt.on(
21
+ '--tab',
22
+ 'Return a tab-delimited table'
23
+ ){ |v| cli[:tabular] = v }
24
+ end
25
+ end
26
+
27
+ def perform
28
+ p = cli.load_project
29
+ if not cli[:datum].nil?
30
+ v = p.metadata[cli[:datum]]
31
+ cli.puts v.nil? ? '?' : v
32
+ elsif cli[:processing]
33
+ keys = Project.DISTANCE_TASKS + Project.INCLADE_TASKS
34
+ cli.puts MiGA.tabulate([:task, :status], keys.map do |k|
35
+ [k, p.add_result(k, false).nil? ? 'queued' : 'done']
36
+ end, cli[:tabular])
37
+ else
38
+ cli.puts MiGA.tabulate([:key, :value], p.metadata.data.keys.map do |k|
39
+ v = p.metadata[k]
40
+ [k, k==:datasets ? v.size : v]
41
+ end, cli[:tabular])
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,139 @@
1
+ # @package MiGA
2
+ # @license Artistic-2.0
3
+
4
+ require 'miga/cli/action'
5
+
6
+ class MiGA::Cli::Action::Add < MiGA::Cli::Action
7
+
8
+ def parse_cli
9
+ cli.expect_files = true
10
+ cli.defaults = {ref: true, ignore_dups: false,
11
+ regexp: /^(?:.*\/)?(.+?)(?:\..*(?:[12]|Reads|Contigs))?(?i:\.f[nastq]+)?$/}
12
+ cli.parse do |opt|
13
+ opt.separator 'You can create multiple datasets with a single command; ' \
14
+ 'simply pass all the files at the end: {FILES...}'
15
+ opt.separator 'If -D is passed, only one dataset will be added. ' \
16
+ 'Otherwise, dataset names will be determined by the file paths (see -R)'
17
+ opt.separator ''
18
+ cli.opt_object(opt, [:project, :dataset_opt, :dataset_type_req])
19
+ opt.on(
20
+ '-q', '--query',
21
+ 'Register the dataset as a query, not a reference dataset'
22
+ ){ |v| cli[:ref] = !v }
23
+ opt.on(
24
+ '-d', '--description STRING',
25
+ 'Description of the dataset'
26
+ ){ |v| cli[:description] = v }
27
+ opt.on('-c', '--comments STRING',
28
+ 'Comments on the dataset'
29
+ ){ |v| cli[:comments] = v }
30
+ opt.on('-m', '--metadata STRING',
31
+ 'Metadata as key-value pairs separated by = and delimited by comma',
32
+ 'Values are saved as strings except for booleans (true / false) or nil'
33
+ ){ |v| cli[:metadata] = v }
34
+ opt.on(
35
+ '-R', '--name-regexp REGEXP', Regexp,
36
+ 'Regular expression indicating how to extract the name from the path',
37
+ "By default: '#{cli[:regexp]}'"
38
+ ){ |v| cli[:regexp] = v }
39
+ opt.on(
40
+ '-i', '--input-type STRING',
41
+ 'Type of input data, one of the following:',
42
+ *self.class.INPUT_TYPES.map{ |k,v| "~ #{k}: #{v[0]}." }
43
+ ){ |v| cli[:input_type] = v.downcase.to_sym }
44
+ opt.on(
45
+ '--ignore-dups',
46
+ 'Continue with a warning if a dataset already exists'
47
+ ){ |v| cli[:ignore_dups] = v }
48
+ end
49
+ end
50
+
51
+ def perform
52
+ p = cli.load_project
53
+ files = cli.files
54
+ file_type = nil
55
+ if files.empty?
56
+ cli.ensure_par({dataset: '-D'},
57
+ 'dataset is mandatory (-D) unless files are provided')
58
+ cli.ensure_type(Dataset)
59
+ files = [nil]
60
+ else
61
+ raise 'Please specify input type (-i).' if cli[:input_type].nil?
62
+ file_type = self.class.INPUT_TYPES[cli[:input_type]]
63
+ raise "Unrecognized input type: #{cli[:input_type]}." if file_type.nil?
64
+ raise 'Some files are duplicated, files must be unique.' if
65
+ files.size != files.uniq.size
66
+ if cli[:input_type].to_s =~ /_paired$/
67
+ raise 'Odd number of files incompatible with input type.' if files.size.odd?
68
+ files = Hash[*files].to_a
69
+ else
70
+ files = files.map{ |i| [i] }
71
+ end
72
+ raise 'The dataset name (-D) can only be specified with one input file.' if
73
+ files.size > 1 && !cli[:dataset].nil?
74
+ end
75
+
76
+ cli.say 'Creating datasets:'
77
+ files.each do |file|
78
+ name = cli[:dataset]
79
+ if name.nil?
80
+ ref_file = file.is_a?(Array) ? file.first : file
81
+ m = cli[:regexp].match(ref_file)
82
+ raise "Cannot extract name from file: #{ref_file}" if m.nil? or m[1].nil?
83
+ name = m[1].miga_name
84
+ end
85
+ if Dataset.exist?(p, name)
86
+ msg = "Dataset already exists: #{name}."
87
+ cli[:ignore_dups] ? (warn(msg); next) : raise(msg)
88
+ end
89
+
90
+ cli.say "o #{name}"
91
+ d = Dataset.new(p, name, cli[:ref])
92
+ raise "Unexpected: Couldn't create dataset: #{name}." if d.nil?
93
+
94
+ unless file.nil?
95
+ r_dir = Dataset.RESULT_DIRS[ file_type[1] ]
96
+ r_path = File.expand_path("data/#{r_dir}/#{d.name}", p.path)
97
+ file_type[2].each_with_index do |ext, i|
98
+ gz = file[i] =~ /\.gz/ ? '.gz' : ''
99
+ FileUtils.cp(file[i], "#{r_path}#{ext}#{gz}")
100
+ cli.say " file: #{file[i]}"
101
+ end
102
+ File.open("#{r_path}.done", 'w') { |f| f.print Time.now.to_s }
103
+ end
104
+
105
+ d = cli.add_metadata(d)
106
+ d.save
107
+ p.add_dataset(name)
108
+ res = d.first_preprocessing(true)
109
+ cli.say " result: #{res}"
110
+ end
111
+ end
112
+
113
+ @@INPUT_TYPES = {
114
+ raw_reads_single:
115
+ ['Single raw reads in a single FastQ file',
116
+ :raw_reads, %w[.1.fastq]],
117
+ raw_reads_paired:
118
+ ['Paired raw reads in two FastQ files',
119
+ :raw_reads, %w[.1.fastq .2.fastq]],
120
+ trimmed_reads_single:
121
+ ['Single trimmed reads in a single FastA file',
122
+ :trimmed_fasta, %w[.SingleReads.fa]],
123
+ trimmed_reads_paired:
124
+ ['Paired trimmed reads in two FastA files',
125
+ :trimmed_fasta, %w[.1.fasta .2.fasta]],
126
+ trimmed_reads_interleaved:
127
+ ['Paired trimmed reads in a single FastA file',
128
+ :trimmed_fasta, %w[.CoupledReads.fa]],
129
+ assembly:
130
+ ['Assembled contigs or scaffolds in FastA format',
131
+ :assembly, %w[.LargeContigs.fna]]
132
+ }
133
+
134
+ class << self
135
+ def INPUT_TYPES
136
+ @@INPUT_TYPES
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,26 @@
1
+ # @package MiGA
2
+ # @license Artistic-2.0
3
+
4
+ require 'miga/cli/action'
5
+
6
+ class MiGA::Cli::Action::AddResult < MiGA::Cli::Action
7
+
8
+ def parse_cli
9
+ cli.defaults = {force: false}
10
+ cli.parse do |opt|
11
+ cli.opt_object(opt, [:project, :dataset_opt, :result])
12
+ opt.on(
13
+ '-f', '--force',
14
+ 'Force re-indexing of the result even if it\'s already registered'
15
+ ){ |v| cli[:force] = v }
16
+ end
17
+ end
18
+
19
+ def perform
20
+ cli.ensure_par(result: '-r')
21
+ obj = cli.load_project_or_dataset
22
+ cli.say "Registering result: #{cli[:result]}"
23
+ r = obj.add_result(cli[:result], true, force: cli[:force])
24
+ raise "Cannot add result, incomplete expected files." if r.nil?
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ # @package MiGA
2
+ # @license Artistic-2.0
3
+
4
+ require 'miga/cli/action'
5
+
6
+ class MiGA::Cli::Action::Console < MiGA::Cli::Action
7
+
8
+ def parse_cli
9
+ end
10
+
11
+ def perform
12
+ require 'irb'
13
+ require 'irb/completion'
14
+ IRB.start
15
+ end
16
+
17
+ def empty_action
18
+ end
19
+ end
@@ -0,0 +1,74 @@
1
+ # @package MiGA
2
+ # @license Artistic-2.0
3
+
4
+ require 'miga/cli/action'
5
+ require 'miga/daemon'
6
+
7
+ class MiGA::Cli::Action::Daemon < MiGA::Cli::Action
8
+
9
+ def parse_cli
10
+ cli.defaults = {daemon_opts: []}
11
+ cli.expect_operation = true
12
+ cli.parse do |opt|
13
+ opt.separator 'Available operations:'
14
+ { start: 'Start an instance of the application.',
15
+ stop: 'Start an instance of the application.',
16
+ restart: 'Stop all instances and restart them afterwards.',
17
+ reload: 'Send a SIGHUP to all instances of the application.',
18
+ run: 'Start the application and stay on top.',
19
+ zap: 'Set the application to a stopped state.',
20
+ status: 'Show status (PID) of application instances.'
21
+ }.each{ |k,v| opt.separator sprintf ' %*s%s', -33, k, v }
22
+ opt.separator ''
23
+
24
+ opt.separator 'MiGA options:'
25
+ cli.opt_object(opt, [:project])
26
+ opt.on(
27
+ '--shutdown-when-done',
28
+ 'Exit the daemon when all processing is done',
29
+ 'Otherwise, it will stay idle awaiting for new data (default)'
30
+ ){ |v| cli[:shutdown_when_done] = v }
31
+ opt.on(
32
+ '--latency INT',
33
+ 'Number of seconds the daemon will be sleeping'
34
+ ){ |v| cli[:latency]=v.to_i }
35
+ opt.on(
36
+ '--max-jobs INT',
37
+ 'Maximum number of jobs to use simultaneously'
38
+ ){ |v| cli[:maxjobs]=v.to_i }
39
+ opt.on(
40
+ '--ppn INT',
41
+ 'Maximum number of cores to use in a single job'
42
+ ){ |v| cli[:ppn]=v.to_i }
43
+ cli.opt_common(opt)
44
+
45
+ opt.separator 'Daemon options:'
46
+ opt.on(
47
+ '-t', '--ontop',
48
+ 'Stay on top (does not daemonize)'
49
+ ){ cli[:daemon_opts] << '-t' }
50
+ opt.on(
51
+ '-f', '--force',
52
+ 'Force operation'
53
+ ){ cli[:daemon_opts] << '-f' }
54
+ opt.on(
55
+ '-n', '--no_wait',
56
+ 'Do not wait for processes to stop'
57
+ ){ cli[:daemon_opts] << '-n' }
58
+ opt.on(
59
+ '--shush',
60
+ 'Silence the daemon'
61
+ ){ cli[:daemon_opts] << '--shush' }
62
+ opt.separator ''
63
+ end
64
+ end
65
+
66
+ def perform
67
+ p = cli.load_project
68
+ d = MiGA::Daemon.new(p)
69
+ [:latency, :maxjobs, :ppn, :shutdown_when_done].each do |k|
70
+ d.runopts(k, cli[k]) unless cli[k].nil?
71
+ end
72
+ d.daemon(cli.operation, cli[:daemon_opts])
73
+ end
74
+ end
@@ -0,0 +1,18 @@
1
+ # @package MiGA
2
+ # @license Artistic-2.0
3
+
4
+ require 'miga/cli/action'
5
+
6
+ class MiGA::Cli::Action::Date < MiGA::Cli::Action
7
+
8
+ def parse_cli
9
+ cli.parse { |_| }
10
+ end
11
+
12
+ def perform
13
+ puts Time.now.to_s
14
+ end
15
+
16
+ def empty_action
17
+ end
18
+ end