Rakefile in genevalidator-1.6.12 vs Rakefile in genevalidator-2.1.3

- old
+ new

@@ -1,28 +1,400 @@ require 'rake/testtask' +GEMSPEC = Gem::Specification.load('genevalidator.gemspec') task default: [:build] desc 'Builds and installs' task install: [:build] do - require_relative 'lib/genevalidator/version' - sh "gem install ./genevalidator-#{GeneValidator::VERSION}.gem" + sh "gem install #{Rake.original_dir}/genevalidator-#{GEMSPEC.version}.gem" end desc 'Runs tests, generates documentation, builds gem (default)' -task build: [:test, :doc] do - sh 'gem build genevalidator.gemspec' +task build: %i[test doc] do + sh "gem build #{Rake.original_dir}/genevalidator.gemspec" end desc 'Runs tests' task :test do Rake::TestTask.new do |t| t.libs.push 'lib' t.test_files = FileList['test/test_*.rb'] - t.verbose = true + t.verbose = false + t.warning = false end end +desc 'Build Assets' +task :assets do + # Requires uglifycss and uglifyjs + # npm install uglifycss -g + # npm install uglify-js -g + assets_dir = File.expand_path('aux/html_files', __dir__) + `rm #{assets_dir}/css/gv.compiled.min.css` + `rm #{assets_dir}/js/gv.compiled.min.js` + sh "uglifycss --output '#{assets_dir}/css/gv.compiled.min.css'" \ + " '#{assets_dir}/css/src/font-awesome.min.css'" \ + " '#{assets_dir}/css/src/bootstrap.min.css'" \ + " '#{assets_dir}/css/src/style.css'" + + sh "uglifyjs '#{assets_dir}/js/src/jquery-2.1.1.min.js'" \ + " '#{assets_dir}/js/src/bootstrap.min.js'" \ + " '#{assets_dir}/js/src/jquery.tablesorter.min.js'" \ + " '#{assets_dir}/js/src/d3.v3.min.js'" \ + " '#{assets_dir}/js/src/plots.js' '#{assets_dir}/js/src/script.js'" \ + " -m -c -o '#{assets_dir}/js/gv.compiled.min.js'" +end + desc 'Generates documentation' task :doc do sh "yardoc 'lib/**/*.rb'" +end + +## +#### TRAVELLING RUBY +## + +# For Bundler.with_clean_env +require 'bundler/setup' + +TMP_DIR = "#{Rake.original_dir}/tmp".freeze +APP_NAME = "#{GEMSPEC.name}-#{GEMSPEC.version}".freeze +PLATFORMS = %w[linux-x86 linux-x86_64 osx].freeze +TRAVELING_RUBY_VERSION = 'traveling-ruby-20150715-2.2.2'.freeze +TRAVELING_RUBYGEMS_VERSION = 'traveling-ruby-gems-20150715-2.2.2'.freeze +NOKOGIRI_VERSION = 'nokogiri-1.6.6.2'.freeze +MAFFT = { + version: '7.397', + 'linux-x86': 'https://mafft.cbrc.jp/alignment/software/mafft-7.397-linux.tgz', + 'linux-x86_64': 'https://mafft.cbrc.jp/alignment/software/mafft-7.397-linux.tgz', + osx: 'https://mafft.cbrc.jp/alignment/software/mafft-7.397-mac.zip' +}.freeze +BLAST = { + version: '2.7.1+', + 'linux-x86': 'https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.7.1/ncbi-blast-2.7.1+-x64-linux.tar.gz', + 'linux-x86_64': 'https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.7.1/ncbi-blast-2.7.1+-x64-linux.tar.gz', + osx: 'https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.7.1/ncbi-blast-2.7.1+-x64-macosx.tar.gz' +}.freeze +JQ = { + version: '1.5', + 'linux-x86': 'https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32', + 'linux-x86_64': 'https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64', + osx: 'https://github.com/stedolan/jq/releases/download/jq-1.5/jq-osx-amd64' +}.freeze +CSVTK = { + version: '0.14.0', + 'linux-x86': 'https://github.com/shenwei356/csvtk/releases/download/v0.14.0/csvtk_linux_386.tar.gz', + 'linux-x86_64': 'https://github.com/shenwei356/csvtk/releases/download/v0.14.0/csvtk_linux_amd64.tar.gz', + osx: 'https://github.com/shenwei356/csvtk/releases/download/v0.14.0/csvtk_darwin_amd64.tar.gz' +}.freeze + +desc 'Create standalone GeneValidator packages' +task :package do + rm_rf TMP_DIR + mkdir TMP_DIR + task('package:build' => ['package:linux-x86', 'package:linux-x86_64', 'package:osx']).invoke + rm_rf TMP_DIR +end + +# Usage: +# - Complete run +# rake package +# - Just create directories and don't compress +# rake package DIR_ONLY=1 +namespace :package do + PLATFORMS.each do |platform| + task platform => [ + :bundle_install, :reduce_bundle_size, + "#{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}.tar.gz", + "#{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}-#{NOKOGIRI_VERSION}.tar.gz" + ] do + package_dir = "#{Rake.original_dir}/#{APP_NAME}-#{platform}" + lib_dir = "#{package_dir}/lib/" + bin_dir = "#{package_dir}/bin/" + exemplar_dir = "#{package_dir}/exemplar_data/" + blast_db_dir = "#{package_dir}/blast_db" + app_dir = "#{lib_dir}/app/" + vendor_dir = "#{lib_dir}/vendor/" + ruby_dir = "#{lib_dir}/ruby/" + pack_dir = "#{lib_dir}/packages/" + nokogiri_path = "#{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}-" \ + "#{NOKOGIRI_VERSION}.tar.gz" + ruby_path = "#{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}.tar.gz" + + # set up dir structure + rm_rf package_dir + mkdir_p app_dir + mkdir bin_dir + mkdir exemplar_dir + mkdir vendor_dir + mkdir ruby_dir + mkdir pack_dir + + cp_r "#{Rake.original_dir}/bin", app_dir + cp_r "#{TMP_DIR}/vendor", lib_dir + + cp "#{Rake.original_dir}/exemplar_data/mrna_data.fa", exemplar_dir + cp "#{Rake.original_dir}/exemplar_data/protein_data.fa", exemplar_dir + + cd vendor_dir do + File.write('Gemfile', GEMFILE_CONTENTS) + mkdir '.bundle' + File.write('.bundle/config', BUNDLER_CONFIG) + + sh "tar -xzf #{nokogiri_path} -C ruby" + end + + cd lib_dir do + sh "tar -xzf #{ruby_path} -C ruby" + end + + cd pack_dir do + process_package(MAFFT[platform.to_sym], 'mafft') + process_package(BLAST[platform.to_sym], 'blast') + end + + cd package_dir do + File.write(GEMSPEC.name, SCRIPT_CONTENTS) + sh "chmod +x #{GEMSPEC.name}" + File.write('Readme.txt', readme_contents(platform)) + end + + cd bin_dir do + Dir['../lib/packages/blast/bin/*'].each do |bin| + ln_s bin, File.basename(bin) + end + + # Copy a version of GV script into the bin directory + sh "sed 's|SELFDIR}/|SELFDIR}/../|g' #{package_dir}/#{GEMSPEC.name} > #{GEMSPEC.name}" + sh "chmod +x #{GEMSPEC.name}" + + # Install JQ + sh "curl -L #{JQ[platform.to_sym]} -o jq" + sh 'chmod +x jq' + + # Install CSVTK + sh "curl -L #{CSVTK[platform.to_sym]} | tar zxf -" + end + + cp_r "#{TMP_DIR}/blast_db", blast_db_dir + + unless ENV['DIR_ONLY'] + cd Rake.original_dir do + sh "tar -czf #{APP_NAME}-#{platform}.tar.gz #{APP_NAME}-#{platform}" + rm_rf package_dir + end + end + end + end + + desc 'Install gems to local directory' + task :bundle_install do + if RUBY_VERSION !~ /^2\.2\./ + abort "You can only 'bundle install' using Ruby 2.2, because that's " \ + 'what Traveling Ruby uses.' + end + + cd Rake.original_dir do + cp 'Gemfile', TMP_DIR + File.write("#{TMP_DIR}/#{GEMSPEC.name}.gemspec", edited_gemspec_content) + end + + cd TMP_DIR do + Bundler.with_clean_env do + sh 'env BUNDLE_IGNORE_CONFIG=1 bundle install --path vendor ' \ + '--without development test' + end + + cd 'vendor/ruby/2.2.0' do + cd 'gems' do + mkdir APP_NAME + %w[aux lib].each { |d| cp_r "#{Rake.original_dir}/#{d}", APP_NAME } + end + + cd 'specifications' do + cp "#{TMP_DIR}/#{GEMSPEC.name}.gemspec", "#{APP_NAME}.gemspec" + end + end + + mkdir 'blast_db' + cd 'blast_db' do + sh 'update_blastdb.pl --decompress swissprot' do |_, e| + abort 'update_blastdb.pl failed to run.' if e.exitstatus == 2 + # This script returns 0 on successful operations that result in no + # downloads, 1 on successful operations that downloaded files, + # and 2 on errors. + end + end + end + end + + desc 'Reduce Vendor size' + task :reduce_bundle_size do + cd "#{TMP_DIR}/vendor" do + sh 'rm -f */*/cache/*' + sh 'rm -rf ruby/*/extensions' + sh "find ruby/2.2.0/gems -name '*.so' | xargs rm -f" + sh "find ruby/2.2.0/gems -name '*.bundle' | xargs rm -f" + sh "find ruby/2.2.0/gems -name '*.o' | xargs rm -f" + + # Remove tests + %w[test tests spec features benchmark].each do |dir| + sh "rm -rf ruby/*/gems/*/#{dir}" + end + + # Remove documentation + %w[README* CHANGE* Change* COPYING* LICENSE* MIT-LICENSE* TODO *.txt *.md *.rdoc].each do |file| + sh "rm -f ruby/*/gems/*/#{file}" + end + %w[doc docs example examples sample doc-api].each do |dir| + sh "rm -rf ruby/*/gems/*/#{dir}" + end + sh "find ruby -name '*.md' | xargs rm -f" + + # Remove misc unnecessary files + sh 'rm -rf ruby/*/gems/*/.gitignore' + sh 'rm -rf ruby/*/gems/*/.travis.yml' + + # Remove leftover native extension sources and compilation objects + sh 'rm -f ruby/*/gems/*/ext/Makefile' + sh 'rm -f ruby/*/gems/*/ext/*/Makefile' + sh 'rm -f ruby/*/gems/*/ext/*/tmp' + sh "find ruby -name '*.c' | xargs rm -f" + sh "find ruby -name '*.cpp' | xargs rm -f" + sh "find ruby -name '*.h' | xargs rm -f" + sh "find ruby -name '*.rl' | xargs rm -f" + sh "find ruby -name 'extconf.rb' | xargs rm -f" + sh "find ruby/2.2.0/gems -name '*.o' | xargs rm -f" + sh "find ruby/2.2.0/gems -name '*.so' | xargs rm -f" + sh "find ruby/2.2.0/gems -name '*.bundle' | xargs rm -f" + + # Remove Java files. They're only used for JRuby support + sh "find ruby -name '*.java' | xargs rm -f" + sh "find ruby -name '*.class' | xargs rm -f" + end + end +end + +PLATFORMS.each do |platform| + file "#{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}.tar.gz" do + download_runtime(platform) + end + file "#{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}-#{NOKOGIRI_VERSION}.tar.gz" do + download_native_extension(platform, NOKOGIRI_VERSION) + end +end + +def download_runtime(platform) + sh "curl -L --fail -o #{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}.tar.gz " \ + "https://d6r77u77i8pq3.cloudfront.net/releases/#{TRAVELING_RUBY_VERSION}-#{platform}.tar.gz" +end + +def download_native_extension(platform, gem_name_and_version) + sh "curl -L --fail -o #{TMP_DIR}/#{TRAVELING_RUBY_VERSION}-#{platform}-#{gem_name_and_version}.tar.gz " \ + "https://d6r77u77i8pq3.cloudfront.net/releases/#{TRAVELING_RUBYGEMS_VERSION}-#{platform}/#{gem_name_and_version}.tar.gz" +end + +def process_package(url, package_name) + if url.end_with?('.tar.gz', '.tgz') + mkdir package_name + cd package_name do + sh "curl -L --fail #{url} | tar -xzf - --strip-components=1" + end + elsif url.end_with?('.zip') + sh "curl -L --fail #{url} -o #{package_name}.zip" + sh "unzip #{package_name}.zip" + mv 'mafft-mac', package_name + rm "#{package_name}.zip" + end +end + +def edited_gemspec_content + file_list = Dir['lib/**/**'] + Dir['aux/**/**'] + edited_gemspec = [] + File.readlines('genevalidator.gemspec').each_with_index do |l, index| + next if index < 4 # skip first four lines + l = "s.version = '#{GEMSPEC.version}'\n" if l =~ /^\s+s.version/ + l = "s.files = ['#{file_list.join("','")}']\n" if l =~ /^\s+s.files/ + l = "s.add_dependency 'nokogiri', '1.6.6.2'\nend" if l =~ /^end/ + edited_gemspec << l + end + edited_gemspec.join +end + +GEMFILE_CONTENTS = <<-GEMFILE.freeze +source 'http://rubygems.org' + +gem 'bio', '~> 1.4' +gem 'bio-blastxmlparser', '~> 2.0' +gem '#{GEMSPEC.name}', '#{GEMSPEC.version}' +gem 'nokogiri', '1.6.6.2' +gem 'statsample', '2.1.0' +GEMFILE + +SCRIPT_CONTENTS = <<-SCRIPT.freeze +#!/bin/bash +set -e + +# Figure out where this script is located. +SELFDIR="$(dirname "$0")" +SELFDIR="$(cd "$SELFDIR" && pwd)" + +# Tell Bundler where the Gemfile and gems are. +export BUNDLE_GEMFILE="${SELFDIR}/lib/vendor/Gemfile" +unset BUNDLE_IGNORE_CONFIG + +MAFFT_DIR="${SELFDIR}/lib/packages/mafft/mafftdir" +BLAST_BIN="${SELFDIR}/lib/packages/blast/bin" +GV_BLAST_DB_DIR="${SELFDIR}/blast_db"; export GV_BLAST_DB_DIR + +MAFFT_BINARIES="${MAFFT_DIR}/libexec"; export MAFFT_BINARIES; + +# Run the actual app using the bundled Ruby interpreter, with Bundler activated. +PATH=${MAFFT_DIR}/bin:${BLAST_BIN}:$PATH exec "${SELFDIR}/lib/ruby/bin/ruby" -rbundler/setup "${SELFDIR}/lib/app/bin/genevalidator" --db "${GV_BLAST_DB_DIR}/swissprot" "$@" + +SCRIPT + +BUNDLER_CONFIG = <<-CONFIG.freeze +BUNDLE_PATH: . +BUNDLE_WITHOUT: "development:test" +BUNDLE_DISABLE_SHARED_GEMS: '1' +CONFIG + +def readme_contents(platform) + <<-README + +-------------------------------------------------------------------------------- +GeneValidator (v#{GEMSPEC.version}) +Website: https://wurmlab.github.io/tools/genevalidator/ +Paper: https://doi.org/10.1093/bioinformatics/btw015 + +Standalone Package for #{platform}. +This package includes BLAST+ (v#{BLAST[:version]}), MAFFT (v#{MAFFT[:version]}), JQ (v#{JQ[:version]}), CSVTK (v#{CSVTK[:version]}) and the Swissprot BLAST database. + +Please cite as follows: +Dragan M‡, Moghul MI‡, Priyam A, Bustos C & Wurm Y. 2015. +GeneValidator: identify problems with protein-coding gene predictions". +Bioinformatics, doi: 10.1093/bioinformatics/btw015. +------------------------------------------------------------------------------- + +Running GeneValidator with Exemplar Data: + + cd /path/to/genevalidator/package/ + genevalidator -d blast_db/swissprot exemplar_data/protein_data.fa + +Run the following to see all options available. + + genevalidator -h + +See https://github.com/wurmlab/genevalidator for more usage information. + +Please contact us if you require any further information. + +------------------------------------------------------------------------------- +Genevalidator is licensed under the AGPL-3.0 License. + +Dependencies packaged with GeneValidator are licensed under their respective licenses: +BLAST+ (Public Domain), Mafft (BSD), JQ (MIT), CSVTK (MIT) and SwissProt BLAST DB (CC BY-ND 3.0). +------------------------------------------------------------------------------- + +README end