miga-base 0.2.0.6 → 0.2.0.7

Sign up to get free protection for your applications and to get access to all the features.
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/metadata.rb CHANGED
@@ -1,74 +1,118 @@
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-06-2015
6
- #
2
+ # @license Artistic-2.0
7
3
 
8
- module MiGA
9
- class Metadata
10
- # Class
11
- def self.exist?(path) File.size? path end
12
- def self.load path
13
- return nil unless Metadata.exist? path
14
- Metadata.new path
15
- end
16
- # Instance
17
- attr_reader :path, :data
18
- def initialize(path, defaults={})
19
- @path = File.absolute_path(path)
20
- @data = {}
21
- defaults.each_pair{ |k,v| self[k]=v }
22
- self.create unless File.size? self.path
23
- self.load
24
- end
25
- def create
26
- @data[:created] = Time.now.to_s
27
- self.save
28
- end
29
- def save
30
- MiGA.DEBUG "Metadata.save #{self.path}"
31
- self.data[:updated] = Time.now.to_s
32
- json = JSON.pretty_generate(self.data)
33
- sleeper = 0.0
34
- while File.exist? self.path + ".lock"
35
- sleeper += 0.1 if sleeper <= 10.0
36
- sleep(sleeper.to_i)
37
- end
38
- FileUtils.touch self.path + ".lock"
39
- ofh = File.open(self.path + ".tmp", "w")
40
- ofh.puts json
41
- ofh.close
42
- raise "Lock-racing detected for #{self.path}." unless File.exist? self.path + ".tmp" and File.exist? self.path + ".lock"
43
- File.rename self.path + ".tmp", self.path
44
- File.unlink self.path + ".lock"
45
- end
46
- def load
47
- sleeper = 0.0
48
- while File.exist? self.path + ".lock"
49
- sleeper += 0.1 if sleeper <= 10.0
50
- sleep(sleeper.to_i)
51
- end
52
- # :symbolize_names does not play nicely with :create_additions
53
- tmp = JSON.parse File.read(self.path), {:symbolize_names=>false, :create_additions=>true}
54
- @data = {}
55
- tmp.each_pair{ |k,v| self[k] = v }
56
- end
57
- def remove!
58
- MiGA.DEBUG "Metadata.remove! #{self.path}"
59
- File.unlink self.path
60
- end
61
- def [](k) self.data[k.to_sym] end
62
- def []=(k,v)
63
- k = k.to_sym
64
- # Protect the special field :name
65
- v=v.miga_name if k==:name
66
- # Symbolize the special field :type
67
- v=v.to_sym if k==:type
68
- # Register and return
69
- self.data[k]=v
70
- end
71
- def each(&blk) self.data.each{ |k,v| blk.call(k,v) } ; end
72
- end
73
- end
4
+ ##
5
+ # Metadata associated to objects like MiGA::Project, MiGA::Dataset, and
6
+ # MiGA::Result.
7
+ class MiGA::Metadata < MiGA::MiGA
8
+ # Class-level
9
+
10
+ ##
11
+ # Does the metadata described in +path+ already exist?
12
+ def self.exist?(path) File.size? path end
13
+
14
+ ##
15
+ # Load the metadata described in +path+ and return MiGA::Metadata if it
16
+ # exists, or nil otherwise.
17
+ def self.load(path)
18
+ return nil unless Metadata.exist? path
19
+ MiGA::Metadata.new(path)
20
+ end
21
+
22
+ # Instance-level
23
+
24
+ ##
25
+ # Path to the JSON file describing the metadata.
26
+ attr_reader :path
27
+
28
+ ##
29
+ # Parsed data as a Hash.
30
+ attr_reader :data
31
+
32
+ ##
33
+ # Initiate a MiGA::Metadata object with description in +path+. It will create
34
+ # it if it doesn't exist.
35
+ def initialize(path, defaults={})
36
+ @path = File.absolute_path(path)
37
+ @data = {}
38
+ defaults.each_pair{ |k,v| self[k]=v }
39
+ self.create unless File.size? self.path
40
+ self.load
41
+ end
42
+
43
+ ##
44
+ # Reset :created field and save the current data.
45
+ def create
46
+ @data[:created] = Time.now.to_s
47
+ self.save
48
+ end
49
+
50
+ ##
51
+ # Save the metadata into #path.
52
+ def save
53
+ MiGA.DEBUG "Metadata.save #{path}"
54
+ @data[:updated] = Time.now.to_s
55
+ json = JSON.pretty_generate(data)
56
+ sleeper = 0.0
57
+ while File.exist?(lock_file)
58
+ sleeper += 0.1 if sleeper <= 10.0
59
+ sleep(sleeper.to_i)
60
+ end
61
+ FileUtils.touch lock_file
62
+ ofh = File.open(path + ".tmp", "w")
63
+ ofh.puts json
64
+ ofh.close
65
+ raise "Lock-racing detected for #{path}." unless
66
+ File.exist?(path + ".tmp") and File.exist?(lock_file)
67
+ File.rename(path + ".tmp", path)
68
+ File.unlink(lock_file)
69
+ end
74
70
 
71
+ ##
72
+ # (Re-)load metadata stored in #path.
73
+ def load
74
+ sleeper = 0.0
75
+ while File.exist? lock_file
76
+ sleeper += 0.1 if sleeper <= 10.0
77
+ sleep(sleeper.to_i)
78
+ end
79
+ # :symbolize_names does not play nicely with :create_additions
80
+ tmp = JSON.parse(File.read(path),
81
+ {:symbolize_names=>false, :create_additions=>true})
82
+ @data = {}
83
+ tmp.each_pair{ |k,v| self[k] = v }
84
+ end
85
+
86
+ ##
87
+ # Delete file at #path.
88
+ def remove!
89
+ MiGA.DEBUG "Metadata.remove! #{self.path}"
90
+ File.unlink(self.path)
91
+ nil
92
+ end
93
+
94
+ ##
95
+ # Lock file for the metadata.
96
+ def lock_file ; path + ".lock" ; end
97
+
98
+ ##
99
+ # Return the value of +k+ in #data.
100
+ def [](k) data[k.to_sym] end
101
+
102
+ ##
103
+ # Set the value of +k+ to +v+.
104
+ def []=(k,v)
105
+ k = k.to_sym
106
+ # Protect the special field :name
107
+ v=v.miga_name if k==:name
108
+ # Symbolize the special field :type
109
+ v=v.to_sym if k==:type
110
+ # Register and return
111
+ @data[k]=v
112
+ end
113
+
114
+ ##
115
+ # Iterate +blk+ for each data with 2 arguments key and value.
116
+ def each(&blk) data.each{ |k,v| blk.call(k,v) } ; end
117
+
118
+ end