sequenceserver 2.0.0.rc3 → 2.0.0.rc8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/chromedriver +0 -0
- data/bin/geckodriver +0 -0
- data/bin/sequenceserver +39 -29
- data/lib/sequenceserver.rb +48 -22
- data/lib/sequenceserver/blast/job.rb +11 -1
- data/lib/sequenceserver/database.rb +7 -168
- data/lib/sequenceserver/exceptions.rb +14 -0
- data/lib/sequenceserver/makeblastdb.rb +323 -0
- data/lib/sequenceserver/routes.rb +6 -1
- data/lib/sequenceserver/sequence.rb +1 -1
- data/lib/sequenceserver/version.rb +1 -1
- data/public/css/sequenceserver.css +10 -3
- data/public/css/sequenceserver.min.css +1 -1
- data/public/js/error_modal.js +27 -29
- data/public/js/hit.js +14 -5
- data/public/js/jquery_world.js +1 -1
- data/public/js/query.js +31 -15
- data/public/js/report.js +13 -6
- data/public/js/search.js +44 -24
- data/public/js/sequence_modal.js +10 -5
- data/public/js/sidebar.js +52 -28
- data/public/sequenceserver-report.min.js +17 -17
- data/public/sequenceserver-search.min.js +2 -2
- data/views/layout.erb +5 -1
- data/views/report.erb +1 -1
- data/views/search.erb +1 -1
- metadata +9 -450
- data/.bootstrap/config.json +0 -433
- data/.codeclimate.yml +0 -31
- data/.csslintrc +0 -2
- data/.eslintignore +0 -1
- data/.eslintrc.json +0 -36
- data/.gitignore +0 -56
- data/.mailmap +0 -5
- data/.rspec +0 -3
- data/.rubocop.yml +0 -61
- data/.travis.yml +0 -74
- data/AppImage/recipe.yml +0 -15
- data/AppImage/sequenceserver.desktop +0 -8
- data/AppImage/sequenceserver.png +0 -0
- data/AppImage/sequenceserver.sh +0 -16
- data/Dockerfile +0 -23
- data/LICENSE.txt +0 -661
- data/LICENSE/Apache.txt +0 -176
- data/LICENSE/d3.txt +0 -26
- data/README.md +0 -161
- data/package.json +0 -48
- data/public/vendor/.dependencies.json +0 -18
- data/public/vendor/.loaderversions +0 -1
- data/public/vendor/github/components/jquery@2.1.4/.gitignore +0 -1
- data/public/vendor/github/components/jquery@2.1.4/.jspm-hash +0 -1
- data/public/vendor/github/components/jquery@2.1.4/.jspm.json +0 -37
- data/public/vendor/github/components/jqueryui@1.11.4/.gitignore +0 -4
- data/public/vendor/github/components/jqueryui@1.11.4/.jspm-hash +0 -1
- data/public/vendor/github/components/jqueryui@1.11.4/.jspm.json +0 -136
- data/public/vendor/github/components/jqueryui@1.11.4/ui/.jshintrc +0 -24
- data/public/vendor/github/jspm/nodelibs-buffer@0.1.0/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-buffer@0.1.0/.jspm.json +0 -10
- data/public/vendor/github/jspm/nodelibs-events@0.1.1/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-events@0.1.1/.jspm.json +0 -10
- data/public/vendor/github/jspm/nodelibs-fs@0.1.2/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-module@0.1.0/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-module@0.1.0/.jspm.json +0 -3
- data/public/vendor/github/jspm/nodelibs-path@0.1.0/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-path@0.1.0/.jspm.json +0 -10
- data/public/vendor/github/jspm/nodelibs-process@0.1.1/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-stream@0.1.0/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-stream@0.1.0/.jspm.json +0 -10
- data/public/vendor/github/jspm/nodelibs-util@0.1.0/.jspm-hash +0 -1
- data/public/vendor/github/jspm/nodelibs-util@0.1.0/.jspm.json +0 -10
- data/public/vendor/github/mbostock/d3@3.5.6/.jspm-hash +0 -1
- data/public/vendor/github/mbostock/d3@3.5.6/.jspm.json +0 -76
- data/public/vendor/github/nicgirault/circosJs@1.7.0/.gitignore +0 -10
- data/public/vendor/github/nicgirault/circosJs@1.7.0/.jspm-hash +0 -1
- data/public/vendor/github/systemjs/plugin-css@0.1.15/.gitignore +0 -1
- data/public/vendor/github/systemjs/plugin-css@0.1.15/.jspm-hash +0 -1
- data/public/vendor/github/systemjs/plugin-css@0.1.15/.jspm.json +0 -4
- data/public/vendor/github/systemjs/plugin-json@0.1.0/.jspm-hash +0 -1
- data/public/vendor/github/twbs/bootstrap@3.3.5/.jspm-hash +0 -1
- data/public/vendor/github/twbs/bootstrap@3.3.5/.jspm.json +0 -100
- data/public/vendor/npm/amdefine@1.0.0/.jspm-hash +0 -1
- data/public/vendor/npm/amdefine@1.0.0/.jspm.json +0 -55
- data/public/vendor/npm/babel-core@5.8.23/.jspm-hash +0 -1
- data/public/vendor/npm/babel-runtime@5.8.20/.jspm-hash +0 -1
- data/public/vendor/npm/babel-runtime@5.8.20/.npmignore +0 -2
- data/public/vendor/npm/base62@0.1.1/.jspm-hash +0 -1
- data/public/vendor/npm/base62@0.1.1/.jspm.json +0 -49
- data/public/vendor/npm/base62@0.1.1/.travis.yml +0 -4
- data/public/vendor/npm/base64-js@0.0.8/.jspm-hash +0 -1
- data/public/vendor/npm/base64-js@0.0.8/.jspm.json +0 -77
- data/public/vendor/npm/base64-js@0.0.8/.travis.yml +0 -5
- data/public/vendor/npm/buffer@3.4.3/.jspm-hash +0 -1
- data/public/vendor/npm/buffer@3.4.3/.jspm.json +0 -105
- data/public/vendor/npm/buffer@3.4.3/.npmignore +0 -1
- data/public/vendor/npm/buffer@3.4.3/.travis.yml +0 -8
- data/public/vendor/npm/buffer@3.4.3/.zuul.yml +0 -20
- data/public/vendor/npm/core-js@1.1.2/.eslintrc +0 -36
- data/public/vendor/npm/core-js@1.1.2/.gitattributes +0 -1
- data/public/vendor/npm/core-js@1.1.2/.jspm-hash +0 -1
- data/public/vendor/npm/core-js@1.1.2/.npmignore +0 -10
- data/public/vendor/npm/core-js@1.1.2/.travis.yml +0 -3
- data/public/vendor/npm/core-util-is@1.0.1/.jspm-hash +0 -1
- data/public/vendor/npm/core-util-is@1.0.1/.jspm.json +0 -58
- data/public/vendor/npm/envify@3.4.0/.jspm-hash +0 -1
- data/public/vendor/npm/envify@3.4.0/.jspm.json +0 -72
- data/public/vendor/npm/envify@3.4.0/.npmignore +0 -2
- data/public/vendor/npm/esprima-fb@13001.1001.0-dev-harmony-fb/.jspm-hash +0 -1
- data/public/vendor/npm/esprima-fb@13001.1001.0-dev-harmony-fb/.jspm.json +0 -102
- data/public/vendor/npm/events@1.0.2/.jspm-hash +0 -1
- data/public/vendor/npm/events@1.0.2/.jspm.json +0 -67
- data/public/vendor/npm/events@1.0.2/.npmignore +0 -1
- data/public/vendor/npm/events@1.0.2/.travis.yml +0 -7
- data/public/vendor/npm/events@1.0.2/.zuul.yml +0 -12
- data/public/vendor/npm/font-awesome@4.4.0/.jspm-hash +0 -1
- data/public/vendor/npm/font-awesome@4.4.0/.jspm.json +0 -81
- data/public/vendor/npm/font-awesome@4.4.0/.npmignore +0 -42
- data/public/vendor/npm/ieee754@1.1.6/.jspm-hash +0 -1
- data/public/vendor/npm/ieee754@1.1.6/.jspm.json +0 -70
- data/public/vendor/npm/ieee754@1.1.6/.travis.yml +0 -7
- data/public/vendor/npm/ieee754@1.1.6/.zuul.yml +0 -20
- data/public/vendor/npm/inherits@2.0.1/.jspm-hash +0 -1
- data/public/vendor/npm/inherits@2.0.1/.jspm.json +0 -60
- data/public/vendor/npm/is-array@1.0.1/.jepso-ci.json +0 -3
- data/public/vendor/npm/is-array@1.0.1/.jspm-hash +0 -1
- data/public/vendor/npm/is-array@1.0.1/.jspm.json +0 -42
- data/public/vendor/npm/is-array@1.0.1/.npmignore +0 -0
- data/public/vendor/npm/isarray@0.0.1/.jspm-hash +0 -1
- data/public/vendor/npm/isarray@0.0.1/.jspm.json +0 -51
- data/public/vendor/npm/jstransform@10.1.0/.jshintrc +0 -28
- data/public/vendor/npm/jstransform@10.1.0/.jspm-hash +0 -1
- data/public/vendor/npm/jstransform@10.1.0/.jspm.json +0 -95
- data/public/vendor/npm/jstransform@10.1.0/.npmignore +0 -4
- data/public/vendor/npm/jstransform@10.1.0/.travis.yml +0 -8
- data/public/vendor/npm/path-browserify@0.0.0/.jspm-hash +0 -1
- data/public/vendor/npm/path-browserify@0.0.0/.jspm.json +0 -56
- data/public/vendor/npm/process@0.10.1/.jspm-hash +0 -1
- data/public/vendor/npm/react@0.13.3/.jspm-hash +0 -1
- data/public/vendor/npm/react@0.13.3/.jspm.json +0 -77
- data/public/vendor/npm/readable-stream@1.1.13/.jspm-hash +0 -1
- data/public/vendor/npm/readable-stream@1.1.13/.jspm.json +0 -95
- data/public/vendor/npm/readable-stream@1.1.13/.npmignore +0 -5
- data/public/vendor/npm/source-map@0.1.31/.jspm-hash +0 -1
- data/public/vendor/npm/source-map@0.1.31/.jspm.json +0 -133
- data/public/vendor/npm/source-map@0.1.31/.npmignore +0 -2
- data/public/vendor/npm/source-map@0.1.31/.travis.yml +0 -4
- data/public/vendor/npm/stream-browserify@1.0.0/.jspm-hash +0 -1
- data/public/vendor/npm/stream-browserify@1.0.0/.jspm.json +0 -77
- data/public/vendor/npm/stream-browserify@1.0.0/.travis.yml +0 -4
- data/public/vendor/npm/string_decoder@0.10.31/.jspm-hash +0 -1
- data/public/vendor/npm/string_decoder@0.10.31/.jspm.json +0 -58
- data/public/vendor/npm/string_decoder@0.10.31/.npmignore +0 -2
- data/public/vendor/npm/through@2.3.8/.jspm-hash +0 -1
- data/public/vendor/npm/through@2.3.8/.jspm.json +0 -72
- data/public/vendor/npm/through@2.3.8/.travis.yml +0 -5
- data/public/vendor/npm/underscore@1.8.3/.jspm-hash +0 -1
- data/public/vendor/npm/underscore@1.8.3/.jspm.json +0 -74
- data/public/vendor/npm/util@0.10.3/.jspm-hash +0 -1
- data/public/vendor/npm/util@0.10.3/.jspm.json +0 -58
- data/public/vendor/npm/util@0.10.3/.npmignore +0 -1
- data/public/vendor/npm/util@0.10.3/.travis.yml +0 -8
- data/public/vendor/npm/util@0.10.3/.zuul.yml +0 -10
- data/public/vendor/npm/webshim@1.15.8/.gitattributes +0 -12
- data/public/vendor/npm/webshim@1.15.8/.jspm-hash +0 -1
- data/public/vendor/npm/webshim@1.15.8/.jspm.json +0 -92
- data/public/vendor/npm/webshim@1.15.8/.npmignore +0 -16
- data/public/vendor/npm/webshim@1.15.8/.project +0 -12
- data/public/vendor/npm/webshim@1.15.8/demos/demos/filereader/upload/.keep +0 -0
- data/sequenceserver.gemspec +0 -55
- data/spec/blast_versions/blast_2.2.30/blast_2.2.30_spec.rb +0 -228
- data/spec/blast_versions/blast_2.2.30/import_spec_capybara_local_2.2.30.rb +0 -583
- data/spec/blast_versions/blast_2.2.31/blast_2.2.31_spec.rb +0 -228
- data/spec/blast_versions/blast_2.2.31/import_spec_capybara_local_2.2.31.rb +0 -587
- data/spec/blast_versions/blast_2.3.0/blast_2.3.0_spec.rb +0 -229
- data/spec/blast_versions/blast_2.3.0/import_spec_capybara_local_2.3.0.rb +0 -587
- data/spec/blast_versions/blast_2.4.0/blast_2.4.0_spec.rb +0 -228
- data/spec/blast_versions/blast_2.4.0/import_spec_capybara_local_2.4.0.rb +0 -588
- data/spec/blast_versions/blast_2.5.0/blast_2.5.0_spec.rb +0 -228
- data/spec/blast_versions/blast_2.5.0/import_spec_capybara_local_2.5.0.rb +0 -587
- data/spec/blast_versions/blast_2.6.0/blast_2.6.0_spec.rb +0 -228
- data/spec/blast_versions/blast_2.6.0/import_spec_capybara_local_2.6.0.rb +0 -587
- data/spec/blast_versions/blast_2.7.1/blast_2.7.1_spec.rb +0 -228
- data/spec/blast_versions/blast_2.7.1/import_spec_capybara_local_2.7.1.rb +0 -587
- data/spec/blast_versions/blast_2.8.1/blast_2.8.1_spec.rb +0 -228
- data/spec/blast_versions/blast_2.8.1/import_spec_capybara_local_2.8.1.rb +0 -587
- data/spec/blast_versions/blast_2.9.0/blast_2.9.0_spec.rb +0 -228
- data/spec/blast_versions/blast_2.9.0/import_spec_capybara_local_2.9.0.rb +0 -585
- data/spec/blast_versions/diamond_0.9.24/diamond_0.9.24_spec.rb +0 -176
- data/spec/blast_versions/diamond_0.9.24/import_spec_capybara_local_0.9.24.rb +0 -237
- data/spec/capybara_spec.rb +0 -334
- data/spec/config_spec.rb +0 -87
- data/spec/database/funky_ids/funky_ids.fa +0 -16
- data/spec/database/funky_ids/funky_ids.fa.nhd +0 -8
- data/spec/database/funky_ids/funky_ids.fa.nhi +0 -0
- data/spec/database/funky_ids/funky_ids.fa.nhr +0 -0
- data/spec/database/funky_ids/funky_ids.fa.nin +0 -0
- data/spec/database/funky_ids/funky_ids.fa.nog +0 -0
- data/spec/database/funky_ids/funky_ids.fa.nsd +0 -15
- data/spec/database/funky_ids/funky_ids.fa.nsi +0 -0
- data/spec/database/funky_ids/funky_ids.fa.nsq +0 -0
- data/spec/database/funky_sequences/README.md +0 -14
- data/spec/database/funky_sequences/funky_aa_sequences.fa +0 -7
- data/spec/database/funky_sequences/funky_aa_sequences.fa.phd +0 -3
- data/spec/database/funky_sequences/funky_aa_sequences.fa.phi +0 -0
- data/spec/database/funky_sequences/funky_aa_sequences.fa.phr +0 -0
- data/spec/database/funky_sequences/funky_aa_sequences.fa.pin +0 -0
- data/spec/database/funky_sequences/funky_aa_sequences.fa.pog +0 -0
- data/spec/database/funky_sequences/funky_aa_sequences.fa.psd +0 -6
- data/spec/database/funky_sequences/funky_aa_sequences.fa.psi +0 -0
- data/spec/database/funky_sequences/funky_aa_sequences.fa.psq +0 -0
- data/spec/database/funky_sequences/funky_na_sequences.fa +0 -2
- data/spec/database/funky_sequences/funky_na_sequences.fa.nhr +0 -0
- data/spec/database/funky_sequences/funky_na_sequences.fa.nin +0 -0
- data/spec/database/funky_sequences/funky_na_sequences.fa.nog +0 -0
- data/spec/database/funky_sequences/funky_na_sequences.fa.nsd +0 -2
- data/spec/database/funky_sequences/funky_na_sequences.fa.nsi +0 -0
- data/spec/database/funky_sequences/funky_na_sequences.fa.nsq +0 -0
- data/spec/database/ox_parse_error/query.fa +0 -1
- data/spec/database/ox_parse_error/rand1.fa +0 -2
- data/spec/database/ox_parse_error/rand1.fa.nhd +0 -1
- data/spec/database/ox_parse_error/rand1.fa.nhi +0 -0
- data/spec/database/ox_parse_error/rand1.fa.nhr +0 -0
- data/spec/database/ox_parse_error/rand1.fa.nin +0 -0
- data/spec/database/ox_parse_error/rand1.fa.nog +0 -0
- data/spec/database/ox_parse_error/rand1.fa.nsd +0 -2
- data/spec/database/ox_parse_error/rand1.fa.nsi +0 -0
- data/spec/database/ox_parse_error/rand1.fa.nsq +0 -0
- data/spec/database/ox_parse_error/rand2.fa +0 -2
- data/spec/database/ox_parse_error/rand2.fa.nhd +0 -1
- data/spec/database/ox_parse_error/rand2.fa.nhi +0 -0
- data/spec/database/ox_parse_error/rand2.fa.nhr +0 -0
- data/spec/database/ox_parse_error/rand2.fa.nin +0 -0
- data/spec/database/ox_parse_error/rand2.fa.nog +0 -0
- data/spec/database/ox_parse_error/rand2.fa.nsd +0 -2
- data/spec/database/ox_parse_error/rand2.fa.nsi +0 -0
- data/spec/database/ox_parse_error/rand2.fa.nsq +0 -0
- data/spec/database/ox_parse_error_unique_ids/query.fa +0 -1
- data/spec/database/ox_parse_error_unique_ids/rand1.fa +0 -2
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nhd +0 -1
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nhi +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nhr +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nin +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nog +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nsd +0 -2
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nsi +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand1.fa.nsq +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand2.fa +0 -2
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nhd +0 -1
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nhi +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nhr +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nin +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nog +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nsd +0 -2
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nsi +0 -0
- data/spec/database/ox_parse_error_unique_ids/rand2.fa.nsq +0 -0
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa +0 -6
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nhd +0 -1
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nhi +0 -0
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nhr +0 -0
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nin +0 -0
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nog +0 -0
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nsd +0 -2
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nsi +0 -0
- data/spec/database/pipe_in_seqid/pipe_in_seqid.fa.nsq +0 -0
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nhd +0 -8
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nhi +0 -0
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nhr +0 -0
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nin +0 -0
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nog +0 -0
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nsd +0 -16
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nsi +0 -0
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.fasta.nsq +0 -0
- data/spec/database/sample/genome/Solenopsis_invicta/Solenopsis_invicta_gnG_subset.txt +0 -8
- data/spec/database/sample/links.rb +0 -23
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta +0 -6449
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.phd +0 -1189
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.phi +0 -0
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.phr +0 -0
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.pin +0 -0
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.pog +0 -0
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.psd +0 -2378
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.psi +0 -0
- data/spec/database/sample/proteins/Solenopsis_invicta/Sinvicta2-2-3.prot.subset.fasta.psq +0 -0
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.phd +0 -9140
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.phi +0 -0
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.phr +0 -0
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.pin +0 -0
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.pog +0 -0
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.psd +0 -18280
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.psi +0 -0
- data/spec/database/sample/proteins/uniprot/2018-04-Swiss-Prot_insecta.fasta.psq +0 -0
- data/spec/database/sample/proteins/uniprot/URL +0 -1
- data/spec/database/sample/si_uniprot_idmap.yml +0 -14180
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta +0 -5486
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nhd +0 -473
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nhi +0 -0
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nhr +0 -0
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nin +0 -0
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nog +0 -0
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nsd +0 -946
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nsi +0 -0
- data/spec/database/sample/transcripts/Solenopsis_invicta/Sinvicta2-2-3.cdna.subset.fasta.nsq +0 -0
- data/spec/database/unformatted/Cardiocondyla_obscurior/Cobs1.4.proteins.fa +0 -148303
- data/spec/database/without_parse_seqids/without_parse_seqids.fa +0 -10
- data/spec/database/without_parse_seqids/without_parse_seqids.fa.phr +0 -0
- data/spec/database/without_parse_seqids/without_parse_seqids.fa.pin +0 -0
- data/spec/database/without_parse_seqids/without_parse_seqids.fa.psq +0 -0
- data/spec/database_spec.rb +0 -127
- data/spec/doctor_spec.disabled.rb +0 -107
- data/spec/dotdir/blast_2.2.30/blastn/BLASTN_XML_2.2.30.xml +0 -1201
- data/spec/dotdir/blast_2.2.30/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.30/blastn_nohits/BLASTN_NO_HITS_XML_2.2.30.xml +0 -866
- data/spec/dotdir/blast_2.2.30/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.30/blastp/BLASTP_XML_2.2.30.xml +0 -1181
- data/spec/dotdir/blast_2.2.30/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.30/blastx/BLASTX_XML_2.2.30.xml +0 -1181
- data/spec/dotdir/blast_2.2.30/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.30/tblastn/TBLASTN_XML_2.2.30.xml +0 -1181
- data/spec/dotdir/blast_2.2.30/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.30/tblastx/TBLASTX_XML_2.2.30.xml +0 -8857
- data/spec/dotdir/blast_2.2.30/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.31/blastn/BLASTN_XML_2.2.31.xml +0 -1201
- data/spec/dotdir/blast_2.2.31/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.31/blastn_nohits/BLASTN_NO_HITS_XML_2.2.31.xml +0 -866
- data/spec/dotdir/blast_2.2.31/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.31/blastp/BLASTP_XML_2.2.31.xml +0 -1181
- data/spec/dotdir/blast_2.2.31/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.31/blastx/BLASTX_XML_2.2.31.xml +0 -1181
- data/spec/dotdir/blast_2.2.31/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.31/tblastn/TBLASTN_XML_2.2.31.xml +0 -1181
- data/spec/dotdir/blast_2.2.31/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.2.31/tblastx/TBLASTX_XML_2.2.31.xml +0 -8857
- data/spec/dotdir/blast_2.2.31/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.3.0/blastn/BLASTN_XML_2.3.0.xml +0 -1201
- data/spec/dotdir/blast_2.3.0/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.3.0/blastn_nohits/BLASTN_NO_HITS_XML_2.3.0.xml +0 -866
- data/spec/dotdir/blast_2.3.0/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.3.0/blastp/BLASTP_XML_2.3.0.xml +0 -1181
- data/spec/dotdir/blast_2.3.0/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.3.0/blastx/BLASTX_XML_2.3.0.xml +0 -1181
- data/spec/dotdir/blast_2.3.0/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.3.0/tblastn/TBLASTN_XML_2.3.0.xml +0 -1181
- data/spec/dotdir/blast_2.3.0/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.3.0/tblastx/TBLASTX_XML_2.3.0.xml +0 -8857
- data/spec/dotdir/blast_2.3.0/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.4.0/blastn/BLASTN_XML_2.4.0.xml +0 -1201
- data/spec/dotdir/blast_2.4.0/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.4.0/blastn_nohits/BLASTN_NO_HITS_XML_2.4.0.xml +0 -866
- data/spec/dotdir/blast_2.4.0/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.4.0/blastp/BLASTP_XML_2.4.0.xml +0 -1181
- data/spec/dotdir/blast_2.4.0/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.4.0/blastx/BLASTX_XML_2.4.0.xml +0 -1181
- data/spec/dotdir/blast_2.4.0/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.4.0/tblastn/TBLASTN_XML_2.4.0.xml +0 -1181
- data/spec/dotdir/blast_2.4.0/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.4.0/tblastx/TBLASTX_XML_2.4.0.xml +0 -8857
- data/spec/dotdir/blast_2.4.0/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.5.0/blastn/BLASTN_XML_2.5.0.xml +0 -1201
- data/spec/dotdir/blast_2.5.0/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.5.0/blastn_nohits/BLASTN_NO_HITS_XML_2.5.0.xml +0 -866
- data/spec/dotdir/blast_2.5.0/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.5.0/blastp/BLASTP +0 -2161
- data/spec/dotdir/blast_2.5.0/blastp/BLASTP_XML_2.5.0.xml +0 -1181
- data/spec/dotdir/blast_2.5.0/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.5.0/blastx/BLASTX +0 -28080
- data/spec/dotdir/blast_2.5.0/blastx/BLASTX_XML_2.5.0.xml +0 -1181
- data/spec/dotdir/blast_2.5.0/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.5.0/tblastn/TBLASTN +0 -29486
- data/spec/dotdir/blast_2.5.0/tblastn/TBLASTN_XML_2.5.0.xml +0 -1181
- data/spec/dotdir/blast_2.5.0/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.5.0/tblastx/TBLASTX +0 -180859
- data/spec/dotdir/blast_2.5.0/tblastx/TBLASTX_XML_2.5.0.xml +0 -8857
- data/spec/dotdir/blast_2.5.0/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.6.0/blastn/BLASTN_XML_2.6.0.xml +0 -1201
- data/spec/dotdir/blast_2.6.0/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.6.0/blastn_nohits/BLASTN_NO_HITS_XML_2.6.0.xml +0 -866
- data/spec/dotdir/blast_2.6.0/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.6.0/blastp/BLASTP_XML_2.6.0.xml +0 -1181
- data/spec/dotdir/blast_2.6.0/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.6.0/blastx/BLASTX_XML_2.6.0.xml +0 -1181
- data/spec/dotdir/blast_2.6.0/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.6.0/tblastn/TBLASTN_XML_2.6.0.xml +0 -1181
- data/spec/dotdir/blast_2.6.0/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.6.0/tblastx/TBLASTX_XML_2.6.0.xml +0 -8857
- data/spec/dotdir/blast_2.6.0/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.7.1/blastn/BLASTN_XML_2.7.1.xml +0 -1201
- data/spec/dotdir/blast_2.7.1/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.7.1/blastn_nohits/BLASTN_NO_HITS_XML_2.7.1.xml +0 -866
- data/spec/dotdir/blast_2.7.1/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.7.1/blastp/BLASTP_XML_2.7.1.xml +0 -1181
- data/spec/dotdir/blast_2.7.1/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.7.1/blastx/BLASTX_XML_2.7.1.xml +0 -1181
- data/spec/dotdir/blast_2.7.1/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.7.1/tblastn/TBLASTN_XML_2.7.1.xml +0 -1181
- data/spec/dotdir/blast_2.7.1/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.7.1/tblastx/TBLASTX_XML_2.7.1.xml +0 -8857
- data/spec/dotdir/blast_2.7.1/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.8.1/blastn/BLASTN_XML_2.8.1.xml +0 -1201
- data/spec/dotdir/blast_2.8.1/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.8.1/blastn_nohits/BLASTN_NO_HITS_XML_2.8.1.xml +0 -866
- data/spec/dotdir/blast_2.8.1/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.8.1/blastp/BLASTP_XML_2.8.1.xml +0 -1181
- data/spec/dotdir/blast_2.8.1/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.8.1/blastx/BLASTX_XML_2.8.1.xml +0 -1181
- data/spec/dotdir/blast_2.8.1/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.8.1/tblastn/TBLASTN_XML_2.8.1.xml +0 -1181
- data/spec/dotdir/blast_2.8.1/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.8.1/tblastx/TBLASTX_XML_2.8.1.xml +0 -8857
- data/spec/dotdir/blast_2.8.1/tblastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.9.0/blastn/BLASTN_XML_2.9.0.xml +0 -1201
- data/spec/dotdir/blast_2.9.0/blastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.9.0/blastn_nohits/BLASTN_NO_HITS_XML_2.9.0.xml +0 -866
- data/spec/dotdir/blast_2.9.0/blastn_nohits/job.yaml +0 -8
- data/spec/dotdir/blast_2.9.0/blastp/BLASTP_XML_2.9.0.xml +0 -1181
- data/spec/dotdir/blast_2.9.0/blastp/job.yaml +0 -8
- data/spec/dotdir/blast_2.9.0/blastx/BLASTX_XML_2.9.0.xml +0 -1181
- data/spec/dotdir/blast_2.9.0/blastx/job.yaml +0 -8
- data/spec/dotdir/blast_2.9.0/tblastn/TBLASTN_XML_2.9.0.xml +0 -1181
- data/spec/dotdir/blast_2.9.0/tblastn/job.yaml +0 -8
- data/spec/dotdir/blast_2.9.0/tblastx/TBLASTX_XML_2.9.0.xml +0 -8857
- data/spec/dotdir/blast_2.9.0/tblastx/job.yaml +0 -8
- data/spec/dotdir/diamond_0.9.24/blastp/DIAMOND_BLASTP_0.9.24.xml +0 -1040
- data/spec/dotdir/diamond_0.9.24/blastp/job.yaml +0 -8
- data/spec/dotdir/diamond_0.9.24/blastx/DIAMOND_BLASTX_0.9.24.xml +0 -1040
- data/spec/dotdir/diamond_0.9.24/blastx/job.yaml +0 -8
- data/spec/dotdir/diamond_0.9.24/blastx_nohits/DIAMOND_BLASTX_NOHITS_0.9.24.xml +0 -41
- data/spec/dotdir/diamond_0.9.24/blastx_nohits/job.yaml +0 -8
- data/spec/download_helper.rb +0 -35
- data/spec/empty_config.yml +0 -0
- data/spec/routes_spec.rb +0 -93
- data/spec/sample.conf +0 -2
- data/spec/sequence_spec.rb +0 -100
- data/spec/sequences/MH011443_1_gi_1486783306_gb_MH011443_1.txt +0 -6
- data/spec/sequences/MH011443_1_gi_1486783307_gb_AYF55702_1.txt +0 -6
- data/spec/sequences/MH011443_1_gi_1528997474_gb_MH447967_1.txt +0 -30
- data/spec/sequences/MH011443_1_sp_P04637_P53_HUMAN.txt +0 -6
- data/spec/sequences/Nucleotide_TP53_COX41.fasta +0 -15
- data/spec/sequences/Protein_TP53_COX41.fasta +0 -12
- data/spec/sequences/Query_1_SI2_2_0_06267.txt +0 -6
- data/spec/sequences/alignment-2_hits.txt +0 -12
- data/spec/sequences/alignment-35_hits_diamond_blastp.txt +0 -210
- data/spec/sequences/alignment-35_hits_diamond_blastx.txt +0 -210
- data/spec/sequences/alignment-3_hits.txt +0 -18
- data/spec/sequences/alignment-40_hits_blastn.txt +0 -246
- data/spec/sequences/alignment-40_hits_blastp.txt +0 -240
- data/spec/sequences/alignment-40_hits_blastp_2.2.30.txt +0 -240
- data/spec/sequences/alignment-40_hits_blastx.txt +0 -240
- data/spec/sequences/alignment-40_hits_tblastn.txt +0 -240
- data/spec/sequences/alignment-40_hits_tblastn_2.2.30.txt +0 -240
- data/spec/sequences/alignment-40_hits_tblastx.txt +0 -2664
- data/spec/sequences/alignment-4_hits.txt +0 -24
- data/spec/sequences/alignment-4_hits_blastn.txt +0 -24
- data/spec/sequences/alignment-4_hits_blastp.txt +0 -24
- data/spec/sequences/alignment-4_hits_blastp_2.2.30.txt +0 -24
- data/spec/sequences/alignment-4_hits_blastx.txt +0 -24
- data/spec/sequences/alignment-4_hits_diamond_blastp.txt +0 -24
- data/spec/sequences/alignment-4_hits_diamond_blastx.txt +0 -24
- data/spec/sequences/alignment-4_hits_tblastn.txt +0 -24
- data/spec/sequences/alignment-4_hits_tblastn_2.2.30.txt +0 -24
- data/spec/sequences/alignment-4_hits_tblastx.txt +0 -318
- data/spec/sequences/nucleotide_query.fa +0 -21
- data/spec/sequences/problematic_query.fa +0 -5
- data/spec/sequences/protein_query.fa +0 -9
- data/spec/sequences/sample_query_fire_ant_obps.fa +0 -44
- data/spec/sequences/sequenceserver-2_hits.fa +0 -10
- data/spec/sequences/sequenceserver-SI2.2.0_06267.fa +0 -5
- data/spec/sequences/sp_P04637_P53_HUMAN_gi_1099170394_ref_XP_018868681_1.txt +0 -6
- data/spec/sequences/sp_P04637_P53_HUMAN_gi_120407068_ref_NP_000537_3.txt +0 -6
- data/spec/sequences/sp_P04637_P53_HUMAN_gi_1484127324_gb_MG595988_1.txt +0 -6
- data/spec/sequences/sp_P04637_P53_HUMAN_gi_395440626_gb_JQ694049_1.txt +0 -6
- data/spec/sequences/sp_P04637_P53_HUMAN_sp_P04637_P53_HUMAN.txt +0 -6
- data/spec/sequenceserver_spec.rb +0 -90
- data/spec/spec_helper.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 449efaa2619fd2c83a4116480c78ae6b892804f2f9bc23c3d074b8b0493985c5
|
4
|
+
data.tar.gz: 393f9da8bd3df53bff3ed3a137a5d9484ad5ec9cfa1de3c7b15c3f1a6833f092
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de2fdcef61a8fcdbe8907935a1f0b545219698fe9d37fcad6cd40aaa50e779010b7e91a9158eb76590baed78ce3743cdc173b664ff5d0969dfaca42eb6bd621c
|
7
|
+
data.tar.gz: a65c243d19435021b00a360ddfa8f617fa58e5944dd55117a8865f11dec4554a86e577cdfee3013a82638dc45de697a33156da1ba0a2fedd8e2936a7d760d5d9
|
data/bin/chromedriver
ADDED
Binary file
|
data/bin/geckodriver
ADDED
Binary file
|
data/bin/sequenceserver
CHANGED
@@ -40,7 +40,7 @@ def ask_to_join
|
|
40
40
|
"-d ifq -d emailAddress=#{response} -d submit=Submit > /dev/null 2> /dev/null"
|
41
41
|
system post_email_cmd
|
42
42
|
end
|
43
|
-
system "touch #{asked_to_join}"
|
43
|
+
system "mkdir -p #{SequenceServer::DOTDIR} && touch #{asked_to_join}"
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -68,10 +68,6 @@ begin
|
|
68
68
|
# of threads to use in config file.
|
69
69
|
$ sequenceserver -s -n 16
|
70
70
|
|
71
|
-
# See if you have FASTA files in database dir that haven't
|
72
|
-
# been converted into BLAST database.
|
73
|
-
$ sequenceserver -u
|
74
|
-
|
75
71
|
# Search for FASTA files in database dir that haven't been
|
76
72
|
# converted into BLAST database yet, and convert them.
|
77
73
|
$ sequenceserver -m
|
@@ -135,9 +131,6 @@ begin
|
|
135
131
|
on 'l', 'list_databases',
|
136
132
|
'List BLAST databases'
|
137
133
|
|
138
|
-
on 'u', 'list-unformatted-fastas',
|
139
|
-
'List unformatted FASTA files'
|
140
|
-
|
141
134
|
on 'i', 'interactive',
|
142
135
|
'Run SequenceServer in interactive mode'
|
143
136
|
|
@@ -285,9 +278,7 @@ begin
|
|
285
278
|
fetch_option(:database_dir).value = response
|
286
279
|
redo
|
287
280
|
rescue SequenceServer::NO_BLAST_DATABASE_FOUND => e
|
288
|
-
unless list_databases? ||
|
289
|
-
make_blast_databases?
|
290
|
-
|
281
|
+
unless list_databases? || make_blast_databases?
|
291
282
|
# Print error raised.
|
292
283
|
puts
|
293
284
|
puts e
|
@@ -305,18 +296,46 @@ begin
|
|
305
296
|
unless response =~ /^[n]$/i
|
306
297
|
puts
|
307
298
|
puts 'Searching ...'
|
308
|
-
if SequenceServer
|
309
|
-
|
310
|
-
exit!
|
311
|
-
else
|
312
|
-
formatted = SequenceServer::Database.make_blast_databases
|
299
|
+
if SequenceServer.makeblastdb.any_unformatted?
|
300
|
+
formatted = SequenceServer.makeblastdb.format
|
313
301
|
exit! if formatted.empty? && !set?
|
314
302
|
redo unless set?
|
303
|
+
else
|
304
|
+
puts "Couldn't find any FASTA files."
|
305
|
+
exit!
|
315
306
|
end
|
316
307
|
else
|
317
308
|
exit! unless set?
|
318
309
|
end
|
319
310
|
end
|
311
|
+
rescue SequenceServer::INCOMPATIBLE_BLAST_DATABASES => e
|
312
|
+
unless list_databases? || make_blast_databases?
|
313
|
+
# Print error raised.
|
314
|
+
puts
|
315
|
+
puts e
|
316
|
+
|
317
|
+
# Offer user to format the FASTA files.
|
318
|
+
database_dir = SequenceServer.config[:database_dir]
|
319
|
+
puts
|
320
|
+
puts <<~MSG
|
321
|
+
Incompatible databases can cause BLAST searches and other features of
|
322
|
+
SequenceServer to fail unexpectedly.
|
323
|
+
You can view incompatible databases and choose to reformat them below.
|
324
|
+
Alternatively, please remove them from databases directory.
|
325
|
+
|
326
|
+
View incompatible databases? [y/n] (Default: y).
|
327
|
+
MSG
|
328
|
+
puts
|
329
|
+
print '>> '
|
330
|
+
response = STDIN.gets.to_s.strip
|
331
|
+
unless response =~ /^[n]$/i
|
332
|
+
reformatted = SequenceServer.makeblastdb.reformat
|
333
|
+
exit! if reformatted.empty? && !set?
|
334
|
+
redo unless set?
|
335
|
+
else
|
336
|
+
exit! unless set?
|
337
|
+
end
|
338
|
+
end
|
320
339
|
rescue SequenceServer::ENOENT,
|
321
340
|
SequenceServer::CONFIG_FILE_ERROR,
|
322
341
|
SequenceServer::BLAST_DATABASE_ERROR,
|
@@ -361,22 +380,13 @@ begin
|
|
361
380
|
exit
|
362
381
|
end
|
363
382
|
|
364
|
-
if
|
365
|
-
|
366
|
-
|
383
|
+
if make_blast_databases?
|
384
|
+
if SequenceServer.makeblastdb.scan
|
385
|
+
SequenceServer.makeblastdb.run
|
386
|
+
else
|
367
387
|
puts "All FASTA files in #{SequenceServer.config[:database_dir]} " \
|
368
388
|
'are formatted.'
|
369
|
-
exit
|
370
389
|
end
|
371
|
-
end
|
372
|
-
|
373
|
-
if list_unformatted_fastas?
|
374
|
-
puts unformatted_fastas
|
375
|
-
exit
|
376
|
-
end
|
377
|
-
|
378
|
-
if make_blast_databases?
|
379
|
-
SequenceServer::Database.make_blast_databases
|
380
390
|
exit
|
381
391
|
end
|
382
392
|
|
data/lib/sequenceserver.rb
CHANGED
@@ -4,8 +4,12 @@ require 'resolv'
|
|
4
4
|
|
5
5
|
# Top level module / namespace.
|
6
6
|
module SequenceServer
|
7
|
-
#
|
7
|
+
# The default version of BLAST that will be downloaded and configured for use.
|
8
8
|
BLAST_VERSION = '2.10.0+'.freeze
|
9
|
+
# The minimum version of BLAST that SequenceServer is happy to run with. This
|
10
|
+
# is for compatiblity with older database formats. Users will download BLAST
|
11
|
+
# themselves.
|
12
|
+
MIN_BLAST_VERSION = '2.9.0+'.freeze
|
9
13
|
|
10
14
|
# Default location of configuration file.
|
11
15
|
DEFAULT_CONFIG_FILE = '~/.sequenceserver.conf'.freeze
|
@@ -20,6 +24,7 @@ module SequenceServer
|
|
20
24
|
require 'sequenceserver/config'
|
21
25
|
require 'sequenceserver/server'
|
22
26
|
require 'sequenceserver/routes'
|
27
|
+
require 'sequenceserver/makeblastdb'
|
23
28
|
require 'sequenceserver/job_remover'
|
24
29
|
require 'sequenceserver/exceptions'
|
25
30
|
require 'sequenceserver/sys'
|
@@ -53,6 +58,11 @@ module SequenceServer
|
|
53
58
|
end
|
54
59
|
end
|
55
60
|
|
61
|
+
# MAKEBLASTDB service object.
|
62
|
+
def makeblastdb
|
63
|
+
@makeblastdb ||= MAKEBLASTDB.new(config[:database_dir])
|
64
|
+
end
|
65
|
+
|
56
66
|
# SequenceServer initialisation routine.
|
57
67
|
def init(config = {})
|
58
68
|
# Use default config file if caller didn't specify one.
|
@@ -106,7 +116,6 @@ module SequenceServer
|
|
106
116
|
|
107
117
|
# Run SequenceServer using WEBrick.
|
108
118
|
def run
|
109
|
-
check_host
|
110
119
|
Server.run(self)
|
111
120
|
rescue Errno::EADDRINUSE
|
112
121
|
puts "** Could not bind to port #{config[:port]}."
|
@@ -126,10 +135,17 @@ module SequenceServer
|
|
126
135
|
def on_start
|
127
136
|
puts '** SequenceServer is ready.'
|
128
137
|
puts " Go to #{server_url} in your browser and start BLASTing!"
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
138
|
+
if ip_address
|
139
|
+
puts ' To share your setup, try one of the following addresses. These'
|
140
|
+
puts ' may only work within your home, office, or university network.'
|
141
|
+
puts " - http://#{ip_address}:#{config[:port]}"
|
142
|
+
puts " - http://#{hostname}:#{config[:port]}" if hostname
|
143
|
+
puts ' To share your setup with anyone in the world, ask your IT team'
|
144
|
+
puts ' for a public IP address.'
|
145
|
+
puts ' To disable sharing, set :host: key in config file to 127.0.0.1'
|
146
|
+
puts ' and restart server.'
|
147
|
+
end
|
148
|
+
puts ' To terminate server, press CTRL+C'
|
133
149
|
open_in_browser(server_url)
|
134
150
|
end
|
135
151
|
|
@@ -186,7 +202,12 @@ module SequenceServer
|
|
186
202
|
end
|
187
203
|
|
188
204
|
logger.debug("Will look for BLAST+ databases in: #{config[:database_dir]}")
|
189
|
-
|
205
|
+
|
206
|
+
makeblastdb.scan
|
207
|
+
fail NO_BLAST_DATABASE_FOUND, config[:database_dir] if !makeblastdb.any_formatted?
|
208
|
+
fail INCOMPATIBLE_BLAST_DATABASES, config[:database_dir] if makeblastdb.any_incompatible?
|
209
|
+
|
210
|
+
Database.collection = makeblastdb.formatted_fastas
|
190
211
|
Database.each do |database|
|
191
212
|
logger.debug("Found #{database.type} database '#{database.title}'" \
|
192
213
|
" at '#{database.name}'")
|
@@ -204,16 +225,6 @@ module SequenceServer
|
|
204
225
|
raise NUM_THREADS_INCORRECT
|
205
226
|
end
|
206
227
|
|
207
|
-
# Check and warn user if host is 0.0.0.0 (default).
|
208
|
-
def check_host
|
209
|
-
# rubocop:disable Style/GuardClause
|
210
|
-
if config[:host] == '0.0.0.0'
|
211
|
-
logger.warn 'Will listen on all interfaces (0.0.0.0).' \
|
212
|
-
' Consider using 127.0.0.1 (--host option).'
|
213
|
-
end
|
214
|
-
# rubocop:enable Style/GuardClause
|
215
|
-
end
|
216
|
-
|
217
228
|
def load_extension
|
218
229
|
return unless config[:require]
|
219
230
|
|
@@ -234,7 +245,7 @@ module SequenceServer
|
|
234
245
|
end
|
235
246
|
version = out.split[1]
|
236
247
|
fail BLAST_NOT_INSTALLED_OR_NOT_EXECUTABLE if version.empty?
|
237
|
-
fail BLAST_NOT_COMPATIBLE, version unless version
|
248
|
+
fail BLAST_NOT_COMPATIBLE, version unless is_compatible(version, MIN_BLAST_VERSION)
|
238
249
|
end
|
239
250
|
|
240
251
|
def server_url
|
@@ -243,13 +254,14 @@ module SequenceServer
|
|
243
254
|
"http://#{host}:#{config[:port]}"
|
244
255
|
end
|
245
256
|
|
246
|
-
# Returns a local ip adress
|
257
|
+
# Returns a local ip adress.
|
247
258
|
def ip_address
|
248
|
-
Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }
|
259
|
+
addrinfo = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }
|
260
|
+
addrinfo.ip_address if addrinfo
|
249
261
|
end
|
250
262
|
|
251
|
-
# Returns machine's hostname based on the local ip
|
252
|
-
#
|
263
|
+
# Returns machine's hostname based on the local ip. If hostname cannot be
|
264
|
+
# determined returns nil.
|
253
265
|
def hostname
|
254
266
|
Resolv.getname(ip_address) rescue nil
|
255
267
|
end
|
@@ -285,5 +297,19 @@ module SequenceServer
|
|
285
297
|
def command?(command)
|
286
298
|
system("which #{command} > /dev/null 2>&1")
|
287
299
|
end
|
300
|
+
|
301
|
+
# Returns true if the given version is higher than the minimum expected
|
302
|
+
# version string.
|
303
|
+
def is_compatible(given, expected)
|
304
|
+
# The speceship operator (<=>) below returns -1, 0, 1 depending on
|
305
|
+
# on whether the left operand is lower, same, or higher than the
|
306
|
+
# right operand. We want the left operand to be the same or higher.
|
307
|
+
(parse_version(given) <=> parse_version(expected)) >= 0
|
308
|
+
end
|
309
|
+
|
310
|
+
# Turn version string into an arrary of its component numbers.
|
311
|
+
def parse_version(version_string)
|
312
|
+
version_string.split('.').map(&:to_i)
|
313
|
+
end
|
288
314
|
end
|
289
315
|
end
|
@@ -65,6 +65,16 @@ module SequenceServer
|
|
65
65
|
error = IO.foreach(stderr).grep(ERROR_LINE).join
|
66
66
|
error = File.read(stderr) if error.empty?
|
67
67
|
fail InputError, error
|
68
|
+
when 2
|
69
|
+
fail InputError, <<~MSG
|
70
|
+
BLAST signalled a problem with the databases that you searched.
|
71
|
+
|
72
|
+
Most likely one or more of your databases were created using an
|
73
|
+
older version of BLAST. Please consider recreating the databases
|
74
|
+
using BLAST #{BLAST_VERSION}.
|
75
|
+
|
76
|
+
As a temporary solution, you can try searching one database at a time.
|
77
|
+
MSG
|
68
78
|
when 4
|
69
79
|
# Out of memory. User can retry with a shorter search, so raising
|
70
80
|
# InputError here instead of SystemError.
|
@@ -79,7 +89,7 @@ module SequenceServer
|
|
79
89
|
# the job. This is a SystemError.
|
80
90
|
fail SystemError, 'Ran out of disk space.'
|
81
91
|
else
|
82
|
-
# I am not sure what the exit codes
|
92
|
+
# I am not sure what the exit codes 3 means and we should not
|
83
93
|
# encounter exit code 5. The only other error that I know can happen
|
84
94
|
# but is not yet handled is when BLAST+ binaries break such as after
|
85
95
|
# macOS updates. So raise SystemError, include the exit status in the
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'find'
|
2
1
|
require 'open3'
|
3
2
|
require 'digest/md5'
|
4
3
|
require 'forwardable'
|
@@ -81,12 +80,15 @@ module SequenceServer
|
|
81
80
|
@collection ||= {}
|
82
81
|
end
|
83
82
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
def collection=(databases_attrs)
|
84
|
+
databases_attrs.each do |db_attrs|
|
85
|
+
db = Database.new(*db_attrs)
|
86
|
+
collection[db.id] = db
|
87
|
+
end
|
88
88
|
end
|
89
89
|
|
90
|
+
private :collection
|
91
|
+
|
90
92
|
def [](ids)
|
91
93
|
ids = Array ids
|
92
94
|
collection.values_at(*ids)
|
@@ -183,169 +185,6 @@ module SequenceServer
|
|
183
185
|
def clear
|
184
186
|
collection.clear
|
185
187
|
end
|
186
|
-
|
187
|
-
# Recurisvely scan `database_dir` for blast databases.
|
188
|
-
#
|
189
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
190
|
-
def blastdbcmd
|
191
|
-
cmd = "blastdbcmd -recursive -list #{config[:database_dir]}" \
|
192
|
-
' -list_outfmt "%f %t %p %n %l %d"'
|
193
|
-
out, err = sys(cmd, path: config[:bin])
|
194
|
-
errpat = /BLAST Database error/
|
195
|
-
fail BLAST_DATABASE_ERROR.new(cmd, err) if err.match(errpat)
|
196
|
-
return out
|
197
|
-
rescue CommandFailed => e
|
198
|
-
fail BLAST_DATABASE_ERROR.new(cmd, e.stderr)
|
199
|
-
end
|
200
|
-
|
201
|
-
def scan_databases_dir
|
202
|
-
out = blastdbcmd
|
203
|
-
fail NO_BLAST_DATABASE_FOUND, config[:database_dir] if out.empty?
|
204
|
-
out.each_line do |line|
|
205
|
-
name = line.split(' ')[0]
|
206
|
-
next if multipart_database_name?(name)
|
207
|
-
self << Database.new(*line.split(' '))
|
208
|
-
end
|
209
|
-
end
|
210
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
211
|
-
|
212
|
-
# Recursively scan `database_dir` for un-formatted FASTA and format them
|
213
|
-
# for use with BLAST+.
|
214
|
-
def make_blast_databases
|
215
|
-
unformatted_fastas.select do |file, sequence_type|
|
216
|
-
make_blast_database(file, sequence_type)
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
# Returns an Array of FASTA files that may require formatting, and the
|
221
|
-
# type of sequence contained in each FASTA.
|
222
|
-
#
|
223
|
-
# > unformatted_fastas
|
224
|
-
# => [['/foo/bar.fasta', :nulceotide], ...]
|
225
|
-
def unformatted_fastas
|
226
|
-
list = []
|
227
|
-
database_dir = config[:database_dir]
|
228
|
-
Find.find database_dir do |file|
|
229
|
-
next if File.directory? file
|
230
|
-
next if Database.include? file
|
231
|
-
next unless probably_fasta? file
|
232
|
-
sequence_type = guess_sequence_type_in_fasta file
|
233
|
-
if %i[protein nucleotide].include?(sequence_type)
|
234
|
-
list << [file, sequence_type]
|
235
|
-
end
|
236
|
-
end
|
237
|
-
list
|
238
|
-
end
|
239
|
-
|
240
|
-
# Create BLAST database, given FASTA file and sequence type in FASTA file.
|
241
|
-
def make_blast_database(file, type)
|
242
|
-
return unless make_blast_database? file, type
|
243
|
-
title = get_database_title(file)
|
244
|
-
taxid = fetch_tax_id
|
245
|
-
_make_blast_database(file, type, title, taxid)
|
246
|
-
end
|
247
|
-
|
248
|
-
def _make_blast_database(file, type, title, taxid, quiet = false)
|
249
|
-
cmd = 'makeblastdb -parse_seqids -hash_index ' \
|
250
|
-
"-in #{file} -dbtype #{type.to_s.slice(0, 4)} -title '#{title}'" \
|
251
|
-
" -taxid #{taxid}"
|
252
|
-
out, err = sys(cmd, path: config[:bin])
|
253
|
-
puts out, err unless quiet
|
254
|
-
end
|
255
|
-
|
256
|
-
# Show file path and guessed sequence type to the user and obtain a y/n
|
257
|
-
# response.
|
258
|
-
#
|
259
|
-
# Returns true if the user entered anything but 'n' or 'N'.
|
260
|
-
def make_blast_database?(file, type)
|
261
|
-
puts
|
262
|
-
puts
|
263
|
-
puts "FASTA file: #{file}"
|
264
|
-
puts "FASTA type: #{type}"
|
265
|
-
print 'Proceed? [y/n] (Default: y): '
|
266
|
-
response = STDIN.gets.to_s.strip
|
267
|
-
!response.match(/n/i)
|
268
|
-
end
|
269
|
-
|
270
|
-
# Generate a title for the given database and show it to the user for
|
271
|
-
# confirmation.
|
272
|
-
#
|
273
|
-
# Returns user input if any. Auto-generated title otherwise.
|
274
|
-
def get_database_title(path)
|
275
|
-
default = make_db_title(File.basename(path))
|
276
|
-
print "Enter a database title or will use '#{default}': "
|
277
|
-
from_user = STDIN.gets.to_s.strip
|
278
|
-
from_user.empty? && default || from_user
|
279
|
-
end
|
280
|
-
|
281
|
-
# Get taxid from the user. Returns user input or 0.
|
282
|
-
#
|
283
|
-
# Using 0 as taxid is equivalent to not setting taxid for the database
|
284
|
-
# that will be created.
|
285
|
-
def fetch_tax_id
|
286
|
-
default = 0
|
287
|
-
print 'Enter taxid (optional): '
|
288
|
-
user_response = STDIN.gets.strip
|
289
|
-
user_response.empty? && default || Integer(user_response)
|
290
|
-
rescue
|
291
|
-
puts 'taxid should be a number'
|
292
|
-
retry
|
293
|
-
end
|
294
|
-
|
295
|
-
# Returns true if the database name appears to be a multi-part database
|
296
|
-
# name.
|
297
|
-
#
|
298
|
-
# e.g.
|
299
|
-
# /home/ben/pd.ben/sequenceserver/db/nr.00 => yes
|
300
|
-
# /home/ben/pd.ben/sequenceserver/db/nr => no
|
301
|
-
# /home/ben/pd.ben/sequenceserver/db/img3.5.finished.faa.01 => yes
|
302
|
-
# /home/ben/pd.ben/sequenceserver/db/nr00 => no
|
303
|
-
# /mnt/blast-db/refseq_genomic.100 => yes
|
304
|
-
def multipart_database_name?(db_name)
|
305
|
-
!(db_name.match(%r{.+/\S+\.\d{2,3}$}).nil?)
|
306
|
-
end
|
307
|
-
|
308
|
-
# Returns true if first character of the file is '>'.
|
309
|
-
def probably_fasta?(file)
|
310
|
-
File.read(file, 1) == '>'
|
311
|
-
end
|
312
|
-
|
313
|
-
# Suggests improved titles when generating database names from files
|
314
|
-
# for improved apperance and readability in web interface.
|
315
|
-
# For example:
|
316
|
-
# Cobs1.4.proteins.fasta -> Cobs 1.4 proteins
|
317
|
-
# S_invicta.xx.2.5.small.nucl.fa -> S invicta xx 2.5 small nucl
|
318
|
-
def make_db_title(db_name)
|
319
|
-
db_name.tr!('"', "'")
|
320
|
-
# removes .fasta like extension names
|
321
|
-
db_name.gsub!(File.extname(db_name), '')
|
322
|
-
# replaces _ with ' ',
|
323
|
-
db_name.gsub!(/(_)/, ' ')
|
324
|
-
# replaces '.' with ' ' when no numbers are on either side,
|
325
|
-
db_name.gsub!(/(\D)\.(?=\D)/, '\1 ')
|
326
|
-
# preserves version numbers
|
327
|
-
db_name.gsub!(/\W*(\d+([.-]\d+)+)\W*/, ' \1 ')
|
328
|
-
db_name
|
329
|
-
end
|
330
|
-
|
331
|
-
# Guess whether FASTA file contains protein or nucleotide sequences by
|
332
|
-
# sampling a few few characters of the file.
|
333
|
-
def guess_sequence_type_in_fasta(file)
|
334
|
-
sequences = sample_sequences(file)
|
335
|
-
sequence_types = sequences.map { |seq| Sequence.guess_type(seq) }
|
336
|
-
sequence_types = sequence_types.uniq.compact
|
337
|
-
(sequence_types.length == 1) && sequence_types.first
|
338
|
-
end
|
339
|
-
|
340
|
-
# Read first 1,048,576 characters of the file, split the read text on
|
341
|
-
# fasta def line pattern and return.
|
342
|
-
#
|
343
|
-
# If the given file is FASTA, returns Array of as many different
|
344
|
-
# sequences in the portion of the file read. Returns the portion
|
345
|
-
# of the file read wrapped in an Array otherwise.
|
346
|
-
def sample_sequences(file)
|
347
|
-
File.read(file, 1_048_576).split(/^>.+$/).delete_if(&:empty?)
|
348
|
-
end
|
349
188
|
end
|
350
189
|
end
|
351
190
|
end
|