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/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