miga-base 0.7.9.0 → 0.7.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/lib/miga/cli/action/browse.rb +213 -0
  4. data/lib/miga/cli/action/browse/about.html +31 -0
  5. data/lib/miga/cli/action/browse/dataset.html +5 -0
  6. data/lib/miga/cli/action/browse/dataset_menu_item.html +3 -0
  7. data/lib/miga/cli/action/browse/datasets.html +4 -0
  8. data/lib/miga/cli/action/browse/favicon-32.png +0 -0
  9. data/lib/miga/cli/action/browse/index.html +8 -0
  10. data/lib/miga/cli/action/browse/layout.html +57 -0
  11. data/lib/miga/cli/action/browse/redirect.html +11 -0
  12. data/lib/miga/cli/action/browse/style.css +97 -0
  13. data/lib/miga/cli/action/classify_wf.rb +3 -1
  14. data/lib/miga/cli/action/derep_wf.rb +4 -0
  15. data/lib/miga/cli/action/edit.rb +9 -6
  16. data/lib/miga/cli/action/quality_wf.rb +4 -1
  17. data/lib/miga/cli/action/stats.rb +1 -1
  18. data/lib/miga/cli/action/wf.rb +11 -3
  19. data/lib/miga/cli/base.rb +27 -26
  20. data/lib/miga/common/format.rb +26 -6
  21. data/lib/miga/daemon.rb +6 -4
  22. data/lib/miga/dataset.rb +5 -1
  23. data/lib/miga/dataset/base.rb +3 -3
  24. data/lib/miga/dataset/hooks.rb +4 -4
  25. data/lib/miga/dataset/result.rb +18 -14
  26. data/lib/miga/lair.rb +1 -1
  27. data/lib/miga/project/dataset.rb +3 -5
  28. data/lib/miga/project/hooks.rb +4 -3
  29. data/lib/miga/remote_dataset/download.rb +2 -1
  30. data/lib/miga/result.rb +3 -1
  31. data/lib/miga/result/stats.rb +55 -23
  32. data/lib/miga/version.rb +2 -2
  33. data/scripts/cds.bash +0 -1
  34. data/scripts/distances.bash +6 -1
  35. data/test/daemon_test.rb +1 -1
  36. data/test/dataset_test.rb +3 -1
  37. data/test/project_test.rb +1 -1
  38. data/test/remote_dataset_test.rb +1 -1
  39. metadata +16 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d699b0ec0f4b7097439d64083fec6f3187662f9bcfa5d9921aebb27cdfd1c263
4
- data.tar.gz: 7ebffb85482969f3304e643a638fdc6f45439da8d2f11d9b8cffe27713c6e286
3
+ metadata.gz: 881c30021a8c7e8219dd2fad710bc3049eb56ce1307c0507607b3dd2c83ab296
4
+ data.tar.gz: 34b47f66564a02413b79e12fa19cf181c639c50ae28030cef624634485c8af9b
5
5
  SHA512:
6
- metadata.gz: d6517ec344ff45a1ec79db56250ad0c15423b6eac0bf4cad07def7e17dde238c3c7064a70df9f50a2411ec3b2dae27756483ba92c192553cf8fdcc9104acf730
7
- data.tar.gz: 8858ed1fed6861deff6137950c42c6f8a872c9406dc6ef3969676642f3c945de21395c4c5975e6885ede2059f9ea9c11620ec3c764774dc0f5deeb9ac058bb7f
6
+ metadata.gz: fb36047b431765f2227e991d7adb5a2899801018a067227e581d8e0b63999082099c8f41138395ce83c86e7664284a9cb9267c280138d62656a8b671ffda2bee
7
+ data.tar.gz: ec59a539424db91f6744799ea022c1aa56c39123b4c43e19f1ce20b01954c16c90e481a4e062d3ed01d912f57eda4c29123047399041889ba1997a4eb839f94d
data/README.md CHANGED
@@ -41,6 +41,7 @@ Developed and maintained by [Luis M. Rodriguez-R][lrr]. MiGA is the result of a
41
41
  collaboration between [Kostas Lab][kostas] at the Georgia Institute of
42
42
  Technology and [RDP][rdp] at Michigan State University.
43
43
 
44
+ See also the [complete list of contributors](manual/part1/contributors.md).
44
45
 
45
46
  # License
46
47
 
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'miga/cli/action'
4
+
5
+ # Action: miga browse
6
+ class MiGA::Cli::Action::Browse < MiGA::Cli::Action
7
+ def parse_cli
8
+ cli.parse do |opt|
9
+ cli.defaults = { open: true }
10
+ cli.opt_object(opt, [:project])
11
+ end
12
+ end
13
+
14
+ def perform
15
+ p = cli.load_project
16
+ create_empty_page(p)
17
+ generate_project_page(p)
18
+ say 'Creating dataset pages'
19
+ cli.load_project.each_dataset do |d|
20
+ generate_dataset_page(p, d)
21
+ end
22
+ generate_datasets_index(p)
23
+ say "Open in your browser: #{File.join(p.path, 'index.html')}"
24
+ end
25
+
26
+ private
27
+
28
+ ##
29
+ # Create an empty page with necessary assets for project +p+
30
+ def create_empty_page(p)
31
+ say 'Creating project page'
32
+ FileUtils.mkdir_p(browse_file(p, '.'))
33
+ %w[favicon-32.png style.css].each do |i|
34
+ FileUtils.cp(template_file(i), browse_file(p, i))
35
+ end
36
+ write_file(p, 'about.html') do
37
+ build_from_template('about.html', citation: MiGA::MiGA.CITATION)
38
+ end
39
+ end
40
+
41
+ ##
42
+ # Create landing page for project +p+
43
+ def generate_project_page(p)
44
+ # Redirect page
45
+ write_file(p, '../index.html') { build_from_template('redirect.html') }
46
+
47
+ # Summaries
48
+ summaries = Dir["#{p.path}/*.tsv"].map do |i|
49
+ "<li><a href='file://#{i}'>#{File.basename(i)}</a></li>"
50
+ end.join('')
51
+
52
+ # Project index page
53
+ data = {
54
+ project_active: 'active',
55
+ information: format_metadata(p),
56
+ summaries: summaries.empty? ? 'None' : "<ul>#{summaries}</ul>",
57
+ results: format_results(p)
58
+ }
59
+ write_file(p, 'index.html') { build_from_template('index.html', data) }
60
+ end
61
+
62
+ ##
63
+ # Create page for dataset +d+ within project +p+
64
+ def generate_dataset_page(p, d)
65
+ data = {
66
+ unmiga_name: d.name.unmiga_name,
67
+ information: format_metadata(d),
68
+ results: format_results(d)
69
+ }
70
+ write_file(p, "d_#{d.name}.html") do
71
+ build_from_template('dataset.html', data)
72
+ end
73
+ end
74
+
75
+ ##
76
+ # Create pages for reference and query dataset indexes
77
+ def generate_datasets_index(p)
78
+ say 'Creating index pages'
79
+ data = format_dataset_index(p)
80
+ data.each do |k, v|
81
+ write_file(p, "#{k}_datasets.html") do
82
+ v[:list] = 'None' if v[:list] == ''
83
+ build_from_template(
84
+ 'datasets.html',
85
+ v.merge(:"#{k}_datasets_active" => 'active')
86
+ )
87
+ end
88
+ end
89
+ end
90
+
91
+ def format_dataset_index(p)
92
+ data = {
93
+ ref: { type_name: 'Reference', list: '' },
94
+ qry: { type_name: 'Query', list: '' }
95
+ }
96
+ p.each_dataset do |d|
97
+ data[d.ref? ? :ref : :qry][:list] +=
98
+ "<li><a href='d_#{d.name}.html'>#{d.name.unmiga_name}</a></li>"
99
+ end
100
+ data
101
+ end
102
+
103
+ ##
104
+ # Format +obj+ metadata as a table
105
+ def format_metadata(obj)
106
+ '<table class="table table-sm table-responsive">' +
107
+ obj.metadata.data.map do |k, v|
108
+ case k
109
+ when /^run_/, :plugins, :user
110
+ next
111
+ when :web_assembly_gz
112
+ v = "<a href='#{v}'>#{v[0..50]}...</a>"
113
+ when :datasets
114
+ v = v.size
115
+ end
116
+ "<tr><td class='text-right pr-4'><b>#{format_name(k)}</b></td>" \
117
+ "<td>#{v}</td></tr>"
118
+ end.compact.join('') +
119
+ '</table>'
120
+ end
121
+
122
+ ##
123
+ # Format +obj+ results as cards
124
+ def format_results(obj)
125
+ o = ''
126
+ obj.each_result do |key, res|
127
+ links = format_result_links(res)
128
+ stats = format_result_stats(res)
129
+ next unless links || stats
130
+ name = format_name(key)
131
+ url_doc =
132
+ 'http://manual.microbial-genomes.org/part5/workflow#' +
133
+ key.to_s.tr('_', '-')
134
+ o += <<~CARD
135
+ <div class="col-md-6 mb-4">
136
+ <h3>#{name}</h3>
137
+ <div class='border-left p-3'>
138
+ #{stats}
139
+ #{links}
140
+ </div>
141
+ <div class='border-top p-2 bg-light'>
142
+ <a target=_blank href="#{url_doc}" class='p-2'>Learn more</a>
143
+ </div>
144
+ </div>
145
+ CARD
146
+ end
147
+ "<div class='row'>#{o}</div>"
148
+ end
149
+
150
+ def format_name(str)
151
+ str
152
+ .to_s.unmiga_name
153
+ .sub(/^./, &:upcase)
154
+ .gsub(/(Aai|Ani|Ogs|Cds|Ssu| db$| ssu )/, &:upcase)
155
+ .sub(/Haai/, 'hAAI')
156
+ .sub(/Mytaxa/, 'MyTaxa')
157
+ .sub(/ pvalue$/, ' p-value')
158
+ .sub(/contigs$/, 'Contigs')
159
+ end
160
+
161
+ def format_result_links(res)
162
+ links = []
163
+ res.each_file do |key, _|
164
+ name = format_name(key)
165
+ links << "<a href='file://#{res.file_path(key)}'>#{name}</a><br/>"
166
+ end
167
+ links.empty? ? nil : links.join('')
168
+ end
169
+
170
+ def format_result_stats(res)
171
+ res.stats.map do |k, v|
172
+ v = [v, ''] unless v.is_a? Array
173
+ v[0] = ('%.3g' % v[0]) if v[0].is_a? Float
174
+ "<b>#{format_name(k)}:</b> #{v[0]}#{v[1]}<br/>"
175
+ end.join('') + '<br/>' unless res.stats.empty?
176
+ end
177
+
178
+ ##
179
+ # Write +file+ within the browse folder of project +p+ using the passed
180
+ # block output as content
181
+ def write_file(p, file)
182
+ File.open(browse_file(p, file), 'w') { |fh| fh.print yield }
183
+ end
184
+
185
+ ##
186
+ # Use a +template+ file to generate content with a hash of +data+ over the
187
+ # layout page if +layout+ is true
188
+ def build_from_template(template, data = {}, layout = true)
189
+ cont = File.read(template_file(template)).miga_variables(data)
190
+ return cont unless layout
191
+
192
+ build_from_template(
193
+ 'layout.html',
194
+ data.merge(content: cont, project_name: cli.load_project.name),
195
+ false
196
+ )
197
+ end
198
+
199
+ ##
200
+ # Path to the template browse file
201
+ def template_file(file)
202
+ File.join(
203
+ MiGA::MiGA.root_path,
204
+ 'lib', 'miga', 'cli', 'action', 'browse', file
205
+ )
206
+ end
207
+
208
+ ##
209
+ # Path to the browse file in the project
210
+ def browse_file(p, file)
211
+ File.join(p.path, 'browse', file)
212
+ end
213
+ end
@@ -0,0 +1,31 @@
1
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">About MiGA</h1>
2
+ <p>
3
+ MiGA is developed and maintained by
4
+ <a href='https://rodriguez-r.com/'>Luis M. Rodriguez-R</a>.
5
+
6
+ The MiGA codebase is
7
+ <a href='http://code.microbial-genomes.org/miga'>freely available</a> under the
8
+ terms of the terms of the
9
+ <a href='http://code.microbial-genomes.org/miga/blob/master/LICENSE'>Artistic License 2.0</a>.
10
+ </p>
11
+
12
+ <p>
13
+ MiGA is the result of a collaboration between the
14
+ <a href='http://enve-omics.gatech.edu/'>Kostas Lab</a>
15
+ (<a href='http://www.gatech.edu/'>Georgia Institute of Technology</a>) and the
16
+ <a href='http://rdp.cme.msu.edu/'>RDP team</a>
17
+ (<a href='http://cme.msu.edu/'>Center for Microbial Ecology</a>,
18
+ <a href='https://msu.edu/'>Michigan State University</a>).
19
+ The MiGA project is funded by the
20
+ <a href='http://nsf.gov/'>US National Science Foundation</a>
21
+ (Awards <a href='http://nsf.gov/awardsearch/showAward?AWD_ID=1356288'>#1356288</a> &amp;
22
+ <a href='https://xras.xsede.org/public/requests/31162-XSEDE-MCB190042-1190572'>#MCB190042</a>).
23
+ </p>
24
+
25
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">Citation</h1>
26
+ If you use MiGA in your work, consider citing:
27
+ <blockquote class='border-left p-3'>
28
+ {{citation}}
29
+ </blockquote>
30
+
31
+
@@ -0,0 +1,5 @@
1
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">{{unmiga_name}}</h1>
2
+ {{information}}
3
+
4
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">Results</h1>
5
+ {{results}}
@@ -0,0 +1,3 @@
1
+ <li class="nav-item">
2
+ <a class="nav-link" href="ds_{{name}}.html">{{unmiga_name}}</a>
3
+ </li>
@@ -0,0 +1,4 @@
1
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">{{type_name}} Datasets</h1>
2
+ <ul>
3
+ {{list}}
4
+ </ul>
@@ -0,0 +1,8 @@
1
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">Project Information</h1>
2
+ {{information}}
3
+
4
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">Summaries</h1>
5
+ {{summaries}}
6
+
7
+ <h1 class="h2 border-bottom pt-3 pb-2 mb-3">Project Results</h1>
8
+ {{results}}
@@ -0,0 +1,57 @@
1
+ <!doctype html>
2
+ <head>
3
+ <meta charset="utf-8">
4
+ <title>MiGA | {{project_name}}</title>
5
+
6
+ <!-- Remote assets -->
7
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
8
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
10
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
11
+
12
+ <!-- Local assets -->
13
+ <link href="style.css" rel="stylesheet">
14
+ <link rel="icon" href="favicon-32.png" sizes="32x32" type="image/png">
15
+ </head>
16
+ <body>
17
+ <nav class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
18
+ <a class="navbar-brand col-md-12 col-lg-12 mr-0 px-3"
19
+ href="index.html">MiGA | {{project_name}}</a>
20
+ <button class="navbar-toggler position-absolute d-md-none collapsed"
21
+ type="button" data-toggle="collapse" data-target="#sidebarMenu"
22
+ aria-controls="sidebarMenu" aria-expanded="false"
23
+ aria-label="Toggle navigation">
24
+ <span class="navbar-toggler-icon"></span>
25
+ </button>
26
+ </nav>
27
+ <div class="container-fluid">
28
+ <div class="row">
29
+ <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
30
+ <div class="sidebar-sticky pt-3">
31
+ <ul class="nav flex-column">
32
+ <li class="nav-item">
33
+ <a class="nav-link {{project_active}}" href="index.html">Project</a>
34
+ </li>
35
+ <li class="nav-item">
36
+ <a class="nav-link {{ref_datasets_active}}"
37
+ href="ref_datasets.html">Reference datasets</a>
38
+ </li>
39
+ <li class="nav-item">
40
+ <a class="nav-link {{qry_datasets_active}}"
41
+ href="qry_datasets.html">Query datasets</a>
42
+ </li>
43
+ <li class="nav-item border-top mt-4">
44
+ <a class="nav-link {{about_miga_active}}"
45
+ href="about.html">About MiGA</a>
46
+ </li>
47
+ </ul>
48
+ </div>
49
+ </nav>
50
+
51
+ <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-md-4">
52
+ {{content}}
53
+ </main>
54
+ </div>
55
+ </div>
56
+ </body>
57
+
@@ -0,0 +1,11 @@
1
+ <!doctype html>
2
+ <head>
3
+ <title>MiGA Project</title>
4
+ <meta http-equiv = "refresh" content = "1; url = browse/index.html" />
5
+ </head>
6
+ <body>
7
+ <div style='font-size:200%; margin-top: 5em; text-align: center;'>
8
+ Redirecting to <a href='browse/index.html'>Project page</a>...
9
+ </div>
10
+ </body>
11
+
@@ -0,0 +1,97 @@
1
+ body {
2
+ font-size: .875rem;
3
+ }
4
+
5
+ /*
6
+ * Sidebar
7
+ */
8
+
9
+ .sidebar {
10
+ position: fixed;
11
+ top: 0;
12
+ bottom: 0;
13
+ left: 0;
14
+ z-index: 100; /* Behind the navbar */
15
+ padding: 48px 0 0; /* Height of navbar */
16
+ box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
17
+ }
18
+
19
+ @media (max-width: 767.98px) {
20
+ .sidebar {
21
+ top: 3rem;
22
+ }
23
+ }
24
+
25
+ .sidebar-sticky {
26
+ position: relative;
27
+ top: 0;
28
+ height: calc(100vh - 48px);
29
+ padding-top: .5rem;
30
+ overflow-x: hidden;
31
+ overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
32
+ }
33
+
34
+ @supports ((position: -webkit-sticky) or (position: sticky)) {
35
+ .sidebar-sticky {
36
+ position: -webkit-sticky;
37
+ position: sticky;
38
+ }
39
+ }
40
+
41
+ .sidebar .nav-link {
42
+ font-weight: 500;
43
+ color: #333;
44
+ }
45
+
46
+ .sidebar .nav-link .feather {
47
+ margin-right: 4px;
48
+ color: #999;
49
+ }
50
+
51
+ .sidebar .nav-link.active {
52
+ color: #007bff;
53
+ }
54
+
55
+ .sidebar .nav-link:hover .feather,
56
+ .sidebar .nav-link.active .feather {
57
+ color: inherit;
58
+ }
59
+
60
+ .sidebar-heading {
61
+ font-size: .75rem;
62
+ text-transform: uppercase;
63
+ }
64
+
65
+ /*
66
+ * Navbar
67
+ */
68
+
69
+ .navbar-brand {
70
+ padding-top: .75rem;
71
+ padding-bottom: .75rem;
72
+ font-size: 1rem;
73
+ background-color: rgba(0, 0, 0, .25);
74
+ box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25);
75
+ }
76
+
77
+ .navbar .navbar-toggler {
78
+ top: .25rem;
79
+ right: 1rem;
80
+ }
81
+
82
+ .navbar .form-control {
83
+ padding: .75rem 1rem;
84
+ border-width: 0;
85
+ border-radius: 0;
86
+ }
87
+
88
+ .form-control-dark {
89
+ color: #fff;
90
+ background-color: rgba(255, 255, 255, .1);
91
+ border-color: rgba(255, 255, 255, .1);
92
+ }
93
+
94
+ .form-control-dark:focus {
95
+ border-color: transparent;
96
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, .25);
97
+ }