miga-base 0.2.0.6 → 0.2.0.7

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE +201 -0
  4. data/README.md +17 -335
  5. data/Rakefile +31 -0
  6. data/actions/add_result +2 -5
  7. data/actions/add_taxonomy +4 -7
  8. data/actions/create_dataset +5 -6
  9. data/actions/create_project +2 -5
  10. data/actions/daemon +2 -5
  11. data/actions/download_dataset +88 -58
  12. data/actions/find_datasets +36 -38
  13. data/actions/import_datasets +2 -5
  14. data/actions/index_taxonomy +2 -5
  15. data/actions/list_datasets +47 -49
  16. data/actions/list_files +7 -11
  17. data/actions/unlink_dataset +2 -5
  18. data/bin/miga +1 -1
  19. data/lib/miga/common.rb +132 -0
  20. data/lib/miga/daemon.rb +229 -168
  21. data/lib/miga/dataset.rb +354 -277
  22. data/lib/miga/gui.rb +346 -269
  23. data/lib/miga/metadata.rb +115 -71
  24. data/lib/miga/project.rb +361 -259
  25. data/lib/miga/remote_dataset.rb +200 -148
  26. data/lib/miga/result.rb +150 -99
  27. data/lib/miga/tax_index.rb +124 -67
  28. data/lib/miga/taxonomy.rb +129 -100
  29. data/lib/miga/version.rb +57 -0
  30. data/lib/miga.rb +2 -77
  31. data/scripts/_distances_noref_nomulti.bash +2 -0
  32. data/scripts/_distances_ref_nomulti.bash +2 -0
  33. data/scripts/aai_distances.bash +1 -0
  34. data/scripts/ani_distances.bash +1 -0
  35. data/scripts/assembly.bash +1 -0
  36. data/scripts/cds.bash +1 -0
  37. data/scripts/clade_finding.bash +17 -1
  38. data/scripts/distances.bash +1 -0
  39. data/scripts/essential_genes.bash +1 -0
  40. data/scripts/haai_distances.bash +1 -0
  41. data/scripts/init.bash +2 -0
  42. data/scripts/mytaxa.bash +1 -0
  43. data/scripts/mytaxa_scan.bash +1 -0
  44. data/scripts/ogs.bash +1 -0
  45. data/scripts/read_quality.bash +1 -0
  46. data/scripts/ssu.bash +1 -0
  47. data/scripts/subclades.bash +1 -0
  48. data/scripts/trimmed_fasta.bash +1 -0
  49. data/scripts/trimmed_reads.bash +1 -0
  50. data/test/common_test.rb +82 -0
  51. data/test/daemon_test.rb +53 -0
  52. data/test/dataset_test.rb +156 -0
  53. data/test/jruby_gui_test.rb +20 -0
  54. data/test/metadata_test.rb +48 -0
  55. data/test/project_test.rb +54 -0
  56. data/test/remote_dataset_test.rb +41 -0
  57. data/test/tax_index_test.rb +44 -0
  58. data/test/taxonomy_test.rb +36 -0
  59. data/test/test_helper.rb +32 -0
  60. metadata +53 -38
data/lib/miga/gui.rb CHANGED
@@ -1,289 +1,366 @@
1
- #
2
1
  # @package MiGA
3
- # @author Luis M. Rodriguez-R <lmrodriguezr at gmail dot com>
4
- # @license artistic license 2.0
5
- # @update Jul-11-2015
6
- #
2
+ # @license Artistic-2.0
7
3
 
8
- require 'miga/project'
9
- require 'shoes'
10
- require 'shoes/swt'
4
+ require "miga/common"
5
+ require "miga/project"
6
+ require "shoes"
7
+ require "shoes/swt"
11
8
 
12
9
  Shoes::Swt.initialize_backend
13
10
 
14
- module MiGA
15
- class MiGA
16
- @@STATUS = "Initializing MiGA..."
17
- def self.STATUS=(status) @@STATUS = status ; end
18
- def self.STATUS() @@STATUS; end
19
- def self.RESET_STATUS() @@STATUS="MiGA is ready to go!" ; end
20
- end
21
- class GUI < Shoes
22
- url '/', :index
23
- url '/project', :project
24
- url '/datasets', :datasets
25
- url '/dataset-(.*)', :dataset
26
- url '/report', :report
27
- $miga_path = File.expand_path(File.dirname(__FILE__) + "/../../")
11
+ ##
12
+ # Graphical User Interface for MiGA using Shoes.
13
+ class MiGA::GUI < Shoes
14
+
15
+ # Class-level
16
+
17
+ ##
18
+ # Set system status for MiGA::GUI.
19
+ def self.status=(status) @@STATUS = status ; end
28
20
 
29
- def self.init (&block)
30
- Shoes.app title: "MiGA | Microbial Genomes Atlas", width: 750, height: 400, &block
21
+ ##
22
+ # System status for MiGA::GUI.
23
+ def self.status() @@STATUS; end
24
+ @@STATUS = "Initializing MiGA..."
25
+
26
+ ##
27
+ # Reset the system status for MiGA::GUI.
28
+ def self.reset_status() @@STATUS="MiGA is ready to go!" ; end
29
+
30
+ url "/", :index
31
+ url "/project", :project
32
+ url "/datasets", :datasets
33
+ url "/dataset-(.*)", :dataset
34
+ url "/report", :report
35
+ $miga_gui_path = File.expand_path("../../../gui", __FILE__)
36
+
37
+ ##
38
+ # Initialize GUI.
39
+ def self.init (&block)
40
+ Shoes.app title: "MiGA | Microbial Genomes Atlas",
41
+ width: 750, height: 400, &block
42
+ end
43
+
44
+ # =====================[ View : Windows ]
45
+
46
+ ##
47
+ # Main window.
48
+ def index
49
+ header("Microbial Genomes Atlas")
50
+ stack(margin:40) do
51
+ menu_bar [:open_project, :new_project, :help]
52
+ box alpha: 0.0 do
53
+ para "Welcome to the MiGA GUI. If you use MiGA in your research, ",
54
+ "please consider citing:\n", MiGA::MiGA.CITATION
31
55
  end
32
-
33
- # =====================[ View : Windows ]
34
- # Main window
35
- def index
36
- status_bar
37
- stack(margin:40) do
38
- title "Welcome to MiGA!", align:"center"
39
- para ""
40
- flow{ menu_bar [:open_project, :new_project, :help] }
41
- para ""
42
- stack do
43
- image $miga_path + "/gui/img/MiGA.png", width:150, height:50
44
- para ""
45
- para "If you use MiGA in your research, please consider citing:"
46
- para MiGA.CITATION
47
- para ""
48
- end
49
- end
50
- MiGA.RESET_STATUS
51
- keypress do |key|
52
- if [:control_o, "o"].include? key
53
- MiGA.STATUS = "Calling open_project..."
54
- open_project
55
- elsif [:control_n, "n"].include? key
56
- MiGA.STATUS = "Calling new_project..."
57
- new_project
58
- end
59
- end
56
+ end
57
+ MiGA::GUI.reset_status
58
+ status_bar
59
+ end
60
+
61
+ ##
62
+ # Project window.
63
+ def project
64
+ header("» " + $project.name.unmiga_name)
65
+ stack(margin:40) do
66
+ menu_bar [:list_datasets, :new_dataset, :progress_report, :help]
67
+ stack(margin_top:10) do
68
+ para strong("Path"), ": ", $project.path
69
+ para strong("Datasets"), ": ", $project.metadata[:datasets].size
70
+ $project.metadata.each do |k,v|
71
+ para(strong(k.to_s.capitalize), ": ", v) unless k==:datasets
72
+ end
60
73
  end
74
+ end
75
+ MiGA::GUI.reset_status
76
+ end
61
77
 
62
- # Project window
63
- def project
64
- stack(margin:40) do
65
- title $project.name.unmiga_name, align:"center"
66
- caption $project.path, align:"center"
67
- para ""
68
- stack{ menu_bar [:list_datasets, :new_dataset, :progress_report, :help] }
69
- para ""
70
- stack do
71
- para strong("Datasets"), ": ", $project.metadata[:datasets].size
72
- $project.metadata.each { |k,v| para(strong(k), ": ", v) unless k==:datasets }
73
- end
74
- para ""
75
- end
76
- MiGA.RESET_STATUS
77
- keypress do |key|
78
- if [:control_r, "r"].include? key
79
- MiGA.STATUS = "Calling progress_report..."
80
- progress_report
81
- elsif [:control_d, "d"].include? key
82
- MiGA.STATUS = "Calling list_datasets..."
83
- list_datasets
84
- end
85
- end
78
+ ##
79
+ # Datasets list window.
80
+ def datasets
81
+ header("» " + $project.name.unmiga_name)
82
+ stack(margin:40) do
83
+ para "#{$project.metadata[:datasets].size} datasets:"
84
+ para ""
85
+ flow(width: 1.0) do
86
+ $project.metadata[:datasets].each do |name|
87
+ stack(width:150) do
88
+ para "> ", link(name.unmiga_name){ show_dataset(name) }
89
+ end
90
+ end
86
91
  end
92
+ end
93
+ MiGA::GUI.reset_status
94
+ end
87
95
 
88
- # Datasets list window
89
- def datasets
90
- stack(margin:40) do
91
- title $project.name.unmiga_name, align:"center"
92
- caption $project.path, align:"center"
93
- para ""
94
- stack do
95
- para "Displaying #{$project.metadata[:datasets].size} datasets:"
96
- para ""
97
- $project.metadata[:datasets].each do |name|
98
- para link(name, :click=>"/dataset-#{name}")
99
- end
100
- end
101
- para ""
102
- MiGA.RESET_STATUS
103
- end
96
+ ##
97
+ # Dataset details window.
98
+ def dataset(name)
99
+ header("» " + $project.name.unmiga_name + " » " + name.unmiga_name)
100
+ stack(margin:40) do
101
+ ds = $project.dataset(name)
102
+ stack do
103
+ ds.metadata.each { |k,v| para strong(k.to_s.capitalize), ": ", v }
104
+ end
105
+ flow(margin_top:10) do
106
+ w = 40+30*MiGA::Dataset.PREPROCESSING_TASKS.size
107
+ stack(width:w) do
108
+ subtitle "Advance"
109
+ done = graphic_advance(ds)
110
+ para sprintf("%.1f%% Complete", done*100)
111
+ end
112
+ stack(width:-w) do
113
+ subtitle "Task"
114
+ $task_name_field = stack { para "" }
115
+ animate do
116
+ $task_name_field.clear{ para $task }
117
+ end
118
+ end
104
119
  end
120
+ MiGA::GUI.reset_status
121
+ end
122
+ end
105
123
 
106
- # Dataset details window
107
- def dataset(name)
108
- stack(margin:40) do
109
- ds = $project.dataset(name)
110
- title ds.name.unmiga_name, align:"center"
111
- caption "A dataset in ", strong(link($project.name.unmiga_name, :click=>"/datasets")), align:"center"
112
- para ""
113
- stack{ ds.metadata.each { |k,v| para strong(k), ": ", v } }
114
- para ""
115
- flow do
116
- w = 40+30*Dataset.PREPROCESSING_TASKS.size
117
- stack(width:w) do
118
- subtitle "Advance"
119
- done = self.graphic_advance(ds)
120
- para sprintf("%.1f%% Complete", done*100)
121
- end
122
- stack(width:-w) do
123
- subtitle "Task"
124
- $task_name_field = stack { para "" }
125
- animate do
126
- $task_name_field.clear{ para $task }
127
- end
128
- end
129
- end
130
- para ""
131
- MiGA.RESET_STATUS
132
- end
124
+ ##
125
+ # Project report window.
126
+ def report
127
+ header("» " + $project.name.unmiga_name)
128
+ stack(margin:40) do
129
+ $done_para = subtitle "Dataset tasks advance: "
130
+ $done = 0.0
131
+ w = 40+30*MiGA::Dataset.PREPROCESSING_TASKS.size
132
+ stack(width:w) do
133
+ stack(margin_top:10) do
134
+ $done = $project.datasets.map{ |ds| graphic_advance(ds, 7) }.inject(:+)
135
+ motion { |_,y| show_report_hover(w, y) }
136
+ click { show_dataset($dataset) }
137
+ end
138
+ $done /= $project.metadata[:datasets].size
139
+ $done_para.text += sprintf("%.1f%% Complete.", $done*100)
133
140
  end
141
+ $task_ds_box = stack(width:-w)
142
+ stack(margin_top:10) do
143
+ subtitle "Project-wide tasks:"
144
+ tasks = MiGA::Project.DISTANCE_TASKS
145
+ tasks += MiGA::Project.INCLADE_TASK if $project.metadata[:type]==:clade
146
+ tasks.each do |t|
147
+ para strong(t), ": ",
148
+ ($project.add_result(t, false).nil? ? "Pending" : "Done")
149
+ end
150
+ end if $done==1.0
151
+ end
152
+ end
153
+
154
+ private
155
+
156
+ ##
157
+ # The MiGA GUI's blue.
158
+ def miga_blue(alpha=1.0)
159
+ rgb(0,121,166,alpha)
160
+ end
134
161
 
135
- # Project report window
136
- def report
137
- stack(margin:40) do
138
- title $project.name.unmiga_name, align:"center"
139
- $done = 0.0
140
- $me = self
141
- flow do
142
- para ""
143
- w = 40+30*Dataset.PREPROCESSING_TASKS.size
144
- stack(width:w) do
145
- para ""
146
- subtitle "Dataset tasks advance:"
147
- caption link("toggle"){ $adv_logo.toggle }
148
- para ""
149
- $adv_logo = stack do
150
- $project.each_dataset do |ds|
151
- $done += $me.graphic_advance(ds, 1)
152
- end
153
- motion do |x,y|
154
- unless $task.nil?
155
- $task_ds_box.clear do
156
- subtitle "Task"
157
- para $task
158
- subtitle "Dataset"
159
- para $dataset
160
- end
161
- $task_ds_box.show
162
- $task_ds_box.move(w,y-150)
163
- end
164
- end
165
- click do
166
- GUI.init{ visit "/dataset-#{$dataset}" } unless $dataset.nil?
167
- end
168
- leave do
169
- $task = nil
170
- $dataset = nil
171
- $task_ds_box.hide
172
- end
173
- end
174
- $done /= $project.metadata[:datasets].size
175
- para sprintf("%.1f%% Complete", $done*100)
176
- end
177
- $task_ds_box = stack(width:-w)
178
- end
179
- if $done==1.0
180
- para ""
181
- stack do
182
- subtitle "Project-wide tasks:"
183
- Project.DISTANCE_TASKS.each { |t| para strong(t), ": ", ($project.add_result(t).nil? ? "Pending" : "Done") }
184
- if $project.metadata[:type]==:clade
185
- Project.INCLADE_TASKS.each { |t| para strong(t), ": ", ($project.add_result(t).nil? ? "Pending" : "Done") }
186
- end
187
- end
188
- end
189
- para ""
190
- MiGA.RESET_STATUS
191
- end
162
+ ##
163
+ # The MIGA GUI's red.
164
+ def miga_red(alpha=1.0)
165
+ rgb(179,0,3,alpha)
166
+ end
167
+
168
+ # =====================[ View : Elements ]
169
+
170
+ ##
171
+ # Header in all windows
172
+ def header(msg="")
173
+ # workaround to shoes/shoes4#1212:
174
+ $clicky ||= []
175
+ $clicky.each{ |i| i.hide }
176
+ $clicky = []
177
+ # Keyboard support
178
+ key_shortcuts = {
179
+ :control_o => :open_project, :super_o => :open_project,
180
+ :control_n => :new_project, :super_n => :new_project,
181
+ :control_l => :list_datasets, :super_l => :list_datasets,
182
+ :control_r => :progress_report, :super_r => :progress_report
183
+ }
184
+ keypress do |key|
185
+ funct = key_shortcuts[key]
186
+ send(funct) unless funct.nil?
192
187
  end
188
+ # Graphical header
189
+ flow(margin:[40,10,40,0]) do
190
+ image $miga_gui_path + "/img/MiGA-sm.png", width: 120, height: 50
191
+ title msg, margin_top: 5, margin_left: 5
192
+ end
193
+ end
194
+
195
+ ##
196
+ # General-purpose box
197
+ def box(opts={}, &blk)
198
+ flow(margin_bottom:5) do
199
+ opts[:alpha] ||= 0.2
200
+ opts[:side_line] ||= miga_blue
201
+ opts[:background] ||= miga_blue(opts[:alpha])
202
+ stack(width: 5, height: 1.0) do
203
+ background opts[:side_line]
204
+ end unless opts[:right]
205
+ stack(width: -5) do
206
+ background opts[:background]
207
+ stack{ background rgb(0,0,0,1.0) } # workaround to shoes/shoes4#1190
208
+ s = stack(margin:5, &blk)
209
+ unless opts[:click].nil?
210
+ s.click{ visit opts[:click] }
211
+ end
212
+ end
213
+ stack(width: 5, height: 1.0) do
214
+ background opts[:side_line]
215
+ end if opts[:right]
216
+ end
217
+ end
218
+
219
+ ##
220
+ # Menu bar.
221
+ def menu_bar actions
222
+ box do
223
+ flow do
224
+ img = {
225
+ open_project: "iconmonstr-archive-5-icon-40",
226
+ new_project: "iconmonstr-plus-5-icon-40",
227
+ list_datasets: "iconmonstr-note-10-icon-40",
228
+ new_dataset: "iconmonstr-note-25-icon-40",
229
+ progress_report: "iconmonstr-bar-chart-2-icon-40",
230
+ help: "iconmonstr-help-3-icon-40"}
231
+ actions.each do |k|
232
+ flow(margin:0, width:200) do
233
+ image $miga_gui_path + "/img/#{img[k]}.png", margin: 2
234
+ button(k.to_s.unmiga_name.capitalize, top:5){ send(k) }
235
+ end
236
+ end
237
+ end
238
+ end
239
+ end
193
240
 
194
- # =====================[ View : Elements ]
195
- # Menu bar
196
- def menu_bar actions
197
- flow do
198
- b = {
199
- open_project:["Open project", "iconmonstr-archive-5-icon-256"],
200
- new_project:["New project","iconmonstr-plus-5-icon-256"],
201
- list_datasets:["List datasets", "iconmonstr-note-10-icon-256"],
202
- new_dataset:["New dataset", "iconmonstr-note-25-icon-256"],
203
- progress_report:["Progress report", "iconmonstr-bar-chart-2-icon-256"],
204
- help:["Help", "iconmonstr-help-3-icon-256"]
205
- }
206
- actions.each do |k|
207
- v = b[k]
208
- flow(margin:0, width:200) do
209
- image $miga_path + "/gui/img/#{v[1]}.png", width:40, height:40, margin:2
210
- button v[0], top:5 do
211
- MiGA.STATUS = "Calling #{k}..."
212
- eval k.to_s
213
- end
214
- end
215
- end
216
- end
217
- end # menu_bar
218
-
219
- # Status bar
220
- def status_bar
221
- stack(bottom:0) do
222
- flow bottom:0, height:20, margin:0 do
223
- background "#CCC"
224
- stack(width:50)
225
- $status_cont = stack(width:-300, height:1.0)
226
- every do |i|
227
- $status_cont.clear { inscription MiGA.STATUS, margin:5 }
228
- end
229
- stack(width:250, height:1.0) do
230
- inscription MiGA.LONG_VERSION, align:"right", margin:5
231
- end
232
- end
233
- image $miga_path + "/gui/img/MiGA-sq.png", left:0, bottom:0, width:30, height:32
234
- end
235
- end # status_bar
241
+ ##
242
+ # Status bar.
243
+ def status_bar
244
+ stack(bottom:0) do
245
+ flow bottom:0, height:20, margin:0 do
246
+ background "#CCC"
247
+ $status_cont = stack(width:-300, height:1.0, margin_left:45)
248
+ every do
249
+ $status_cont.clear { inscription MiGA::GUI.status, margin:5 }
250
+ end
251
+ stack(width:250, height:1.0, right: 5) do
252
+ inscription MiGA::MiGA.LONG_VERSION, align:"right", margin:5
253
+ end
254
+ end
255
+ image "#{$miga_gui_path}/img/MiGA-sq.png",
256
+ left:10, bottom:5, width:30, height:32
257
+ end
258
+ end
236
259
 
237
- def graphic_advance(ds, h=10)
238
- ds_adv = ds.profile_advance
239
- flow(width:30*Dataset.PREPROCESSING_TASKS.size) do
240
- nostroke
241
- i = 0
242
- col = ["#CCC", rgb(119,130,61), rgb(160,41,50)]
243
- ds_adv.each do |j|
244
- stack(width:28,margin:0,top:0,left:i*30,height:h) do
245
- background col[j]
246
- t = Dataset.PREPROCESSING_TASKS[i]
247
- hover do
248
- $task = t
249
- $dataset = ds.name.unmiga_name
250
- end
251
- end
252
- i += 1
253
- end
254
- nofill
255
- end
256
- return 0.0 if ds_adv.count{|i| i>0} <= 1
257
- (ds_adv.count{|i| i==1}.to_f - 1.0)/(ds_adv.count{|i| i>0}.to_f - 1.0)
258
- end # graphic_advance
260
+ ##
261
+ # Display processing status of a dataset as a horizontal bar, as reported
262
+ # by MiGA::Dataset#profile_advance.
263
+ def graphic_advance(ds, h=10)
264
+ ds_adv = ds.profile_advance
265
+ flow(width:30*MiGA::Dataset.PREPROCESSING_TASKS.size) do
266
+ nostroke
267
+ col = ["#CCC", rgb(119,130,61), rgb(160,41,50)]
268
+ ds_adv.each_index do |i|
269
+ stack(width:28,margin:0,top:0,left:i*30,height:h) do
270
+ background col[ ds_adv[i] ]
271
+ t = MiGA::Dataset.PREPROCESSING_TASKS[i]
272
+ hover do
273
+ $task = t
274
+ $dataset = ds.name.unmiga_name
275
+ end
276
+ leave do
277
+ $task = nil
278
+ $dataset = nil
279
+ $task_ds_box.hide unless $task_ds_box.nil?
280
+ end
281
+ end
282
+ end
283
+ nofill
284
+ end
285
+ return 0.0 if ds_adv.count{|i| i>0} <= 1
286
+ (ds_adv.count{|i| i==1}.to_f - 1.0)/(ds_adv.count{|i| i>0}.to_f - 1.0)
287
+ end
259
288
 
260
- # =====================[ Controller : Projects ]
261
- def open_project
262
- GUI.init do
263
- folder = ask_open_folder
264
- if folder.nil? or not Project.exist? folder
265
- alert "Cannot find a MiGA project at #{folder}!" unless folder.nil?
266
- return
267
- else
268
- $project = Project.new folder
269
- visit '/project'
270
- end
271
- end
272
- end # open_project
273
- def new_project
274
- GUI.init do
275
- folder = ask_save_folder
276
- if folder.nil? or Project.exist? folder
277
- alert "Cannot overwrite existent MiGA project at #{folder}!" unless folder.nil?
278
- return
279
- else
280
- $project = Project.new folder
281
- visit "/project"
282
- end
283
- end
284
- end # new_project
285
- def list_datasets ; GUI.init{ visit "/datasets" } ; end # list_datasets
286
- def progress_report ; GUI.init{ visit "/report" } ; end # progress_report
287
- end
288
- end
289
+ ##
290
+ # Show floating window with additional information on report cells.
291
+ def show_report_hover(w, y)
292
+ unless $task.nil?
293
+ $task_ds_box.clear do
294
+ para strong("Task: "), $task, "\n", strong("Dataset: "), $dataset
295
+ end
296
+ $task_ds_box.show
297
+ $task_ds_box.move(w-20, y-115)
298
+ end
299
+ end
300
+
301
+ # =====================[ Controller : Projects ]
302
+
303
+ ##
304
+ # Load a project.
305
+ def open_project
306
+ open_window("Opening project...") do
307
+ folder = ask_open_folder
308
+ if folder.nil? or not MiGA::Project.exist?(folder)
309
+ alert "Cannot find a MiGA project at #{folder}!" unless folder.nil?
310
+ else
311
+ $project = MiGA::Project.new(folder)
312
+ visit "/project"
313
+ end
314
+ end
315
+ end
316
+
317
+ ##
318
+ # Create a project.
319
+ def new_project
320
+ open_window("Creating project...") do
321
+ if MiGA::MiGA.initialized?
322
+ folder = ask_save_folder
323
+ if folder.nil? or MiGA::Project.exist?(folder)
324
+ alert "Cannot overwrite existent MiGA project at #{folder}!" unless
325
+ folder.nil?
326
+ else
327
+ $project = MiGA::Project.new(folder)
328
+ visit "/project"
329
+ end
330
+ else
331
+ # FIXME Add a way to initialize MiGA from the GUI
332
+ alert "MiGA is currently uninitialized, no projects can be created."
333
+ end
334
+ end
335
+ end
336
+
337
+ ##
338
+ # Open a window on #datasets.
339
+ def list_datasets
340
+ open_window("Listing all datasets..."){
341
+ visit "/datasets" } unless $project.nil?
342
+ end
343
+
344
+ ##
345
+ # Open a window on #dataset +name+.
346
+ def show_dataset(name)
347
+ open_window("Showing dataset details..."){
348
+ visit "/dataset-#{name}" } unless name.nil?
349
+ end
289
350
 
351
+ ##
352
+ # Open a window on #report.
353
+ def progress_report
354
+ open_window("Creating progress report..."){
355
+ visit "/report" } unless $project.nil?
356
+ end
357
+
358
+ ##
359
+ # Open a window sending +msg+ to the status, the yields +blk+.
360
+ def open_window(msg, &blk)
361
+ MiGA::GUI.status = msg
362
+ MiGA::GUI.init(&blk)
363
+ MiGA::GUI.reset_status
364
+ end
365
+
366
+ end