From 413dbed1a1ab264e681ae42af55788933904c357 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Tue, 4 Jul 2017 19:58:36 -0400 Subject: [PATCH] Move the bulk of generated file rake things into lib/ --- Rakefile | 348 +---------------------------- lib/travis/build/rake_tasks.rb | 395 +++++++++++++++++++++++++++++++++ spec/build/rake_tasks_spec.rb | 228 +++++++++++++++++++ 3 files changed, 626 insertions(+), 345 deletions(-) create mode 100644 lib/travis/build/rake_tasks.rb create mode 100644 spec/build/rake_tasks_spec.rb diff --git a/Rakefile b/Rakefile index dca6f970b8..595e2a54a8 100644 --- a/Rakefile +++ b/Rakefile @@ -1,9 +1,3 @@ -require 'json' -require 'faraday' -require 'faraday_middleware' -require 'logger' -require 'rubygems' - begin require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) @@ -12,342 +6,6 @@ rescue LoadError task default: :update_static_files end -def logger - @logger ||= Logger.new STDOUT -end - -def version_for(version_str) - md = version_str.match(/\d+(\.\d+)*/) - if md - Gem::Version.new md[0] - else - Gem::Version.new nil - end -end - -def semver_sort(a, b) - Gem::Version.new(a.to_s) <=> Gem::Version.new(b.to_s) -end - -def fetch_githubusercontent_file(from, host: 'raw.githubusercontent.com', - to: nil, mode: 'a+rx') - conn = Faraday.new("https://#{host}") do |f| - f.response :raise_error - f.use FaradayMiddleware::FollowRedirects - f.adapter Faraday.default_adapter - end - - public_files_dir = "public/files" - to = File.basename(from) unless to - to = File.join("..", public_files_dir, to) unless to.start_with?('/') - - response = conn.get do |req| - logger.info "Fetching #{conn.url_prefix.to_s}#{from}" - req.url from - end - - dest = File.expand_path(to, __FILE__) - - logger.info "Writing to #{dest}" - File.write(dest, response.body) - logger.info "Setting mode '#{mode}' on #{dest}" - chmod mode, dest -rescue Exception => e - logger.info "Error: #{e.message}" -end - -def latest_release_for(repo) - conn = Faraday.new('https://api.github.com') - - response = conn.get do |req| - releases_url = "repos/#{repo}/releases" - logger.info "Fetching releases from #{conn.url_prefix.to_s}#{releases_url}" - req.url releases_url - oauth_token = ENV['GITHUB_OAUTH_TOKEN'] - if oauth_token - req.headers['Authorization'] = "token #{oauth_token}" - end - end - - if response.success? - json_data = JSON.parse(response.body) - fail "No releases found for #{repo}" if json_data.empty? - json_data.sort! do |a, b| - semver_sort(a['tag_name'].sub(/^v/, ''), b['tag_name'].sub(/^v/, '')) - end - json_data.last['tag_name'] - else - fail "Could not find releases for #{repo}" - end -end - -def sc_data - conn = Faraday.new("https://saucelabs.com") - response = conn.get('versions.json') - - unless response.success? - fail "Could not fetch sc metadata" - end - - JSON.parse(response.body) -end - -def write_sauce_connect_template - require 'erb' - - app_host = ENV.fetch('TRAVIS_BUILD_APP_HOST', '') - - template = File.read(File.expand_path(File.join("..", 'lib', 'travis', 'build', 'addons', 'sauce_connect', 'templates', 'sauce_connect.sh.erb'), __FILE__)) - - File.write(File.expand_path(File.join("..", 'lib', 'travis', 'build', 'addons', 'sauce_connect', 'templates', 'sauce_connect.sh'), __FILE__), - ERB.new(template).result(binding)) -end - -def fetch_sc(platform) - require 'digest/sha1' - - ext = platform == 'linux' ? 'tar.gz' : 'zip' - - download_url = URI.parse(sc_data["Sauce Connect"][platform]["download_url"]) - - conn = Faraday.new("#{download_url.scheme}://#{download_url.host}") - - logger.info "getting #{download_url.path}" - response = conn.get(download_url.path) - - dest = File.expand_path(File.join("..", 'public/files', "sc-#{platform}.#{ext}"), __FILE__) - - archive_content = response.body - - expected_checksum = sc_data["Sauce Connect"][platform]["sha1"] - received_checksum = Digest::SHA1.hexdigest(archive_content) - - unless received_checksum == expected_checksum - fail "Checksums did not match: expected #{expected_checksum} received #{received_checksum}" - end - - logger.info "writing to #{dest}" - File.write(dest, response.body) - chmod 'a+rx', dest -end - -def expand_semver_aliases(full_version) - fullparts = full_version.split('.') - major = fullparts.first - { - full_version => full_version, - major => full_version, - "#{major}.x" => full_version, - "#{major}.x.x" => full_version, - "#{fullparts[0]}.#{fullparts[1]}" => full_version, - "#{fullparts[0]}.#{fullparts[1]}.x" => full_version, - } -end - -task 'assets:precompile' => %i( - clean - update_sc - update_godep - update_static_files - ls_public_files -) - -directory 'public/files' -directory 'tmp' - -desc 'clean up static files in public/' -task :clean do - rm_rf('public/files') -end - -desc 'update casher' -file 'public/files/casher' => 'public/files' do - fetch_githubusercontent_file 'travis-ci/casher/production/bin/casher' -end - -desc 'update gimme' -file 'public/files/gimme' => 'public/files' do - latest_release = latest_release_for('travis-ci/gimme') - logger.info "Latest gimme release is #{latest_release}" - fetch_githubusercontent_file "travis-ci/gimme/#{latest_release}/gimme" -end - -desc "update godep for Darwin" -file 'public/files/godep_darwin_amd64' => 'public/files' do - latest_release = latest_release_for('tools/godep') - logger.info "Latest godep release is #{latest_release}" - fetch_githubusercontent_file( - "tools/godep/releases/download/#{latest_release}/godep_darwin_amd64", - host: 'github.com' - ) -end - -desc "update godep for Linux" -file 'public/files/godep_linux_amd64' => 'public/files' do - latest_release = latest_release_for('tools/godep') - logger.info "Latest godep release is #{latest_release}" - fetch_githubusercontent_file( - "tools/godep/releases/download/#{latest_release}/godep_linux_amd64", - host: 'github.com' - ) -end - -desc 'update nvm.sh' -file 'public/files/nvm.sh' => 'public/files' do - latest_release = latest_release_for('creationix/nvm') - logger.info "Latest nvm release is #{latest_release}" - fetch_githubusercontent_file "creationix/nvm/#{latest_release}/nvm.sh" - fetch_githubusercontent_file "creationix/nvm/#{latest_release}/nvm-exec" -end - -desc 'update sbt' -file 'public/files/sbt' => 'public/files' do - fetch_githubusercontent_file 'paulp/sbt-extras/master/sbt' -end - -desc 'update tmate' -file 'public/files/tmate-static-linux-amd64.tar.gz' => 'public/files' do - latest_release = latest_release_for('tmate-io/tmate') - logger.info "Latest tmate release is #{latest_release}" - fetch_githubusercontent_file( - File.join( - 'tmate-io/tmate/releases/download', - latest_release, - "tmate-#{latest_release}-static-linux-amd64.tar.gz", - ), - host: "github.com", to: 'tmate-static-linux-amd64.tar.gz' - ) -end - -desc 'update rustup' -file 'public/files/rustup-init.sh' => 'public/files' do - fetch_githubusercontent_file '', host: 'sh.rustup.rs', to: 'rustup-init.sh' -end - -desc 'update raw gimme versions' -file 'tmp/gimme-versions-binary-linux' => 'tmp' do - fetch_githubusercontent_file( - 'travis-ci/gimme/master/.testdata/sample-binary-linux', - to: File.expand_path('../tmp/gimme-versions-binary-linux', __FILE__), - mode: 0o644 - ) -end - -desc 'update gimme versions' -file 'public/version-aliases/go.json' => 'tmp/gimme-versions-binary-linux' do - raw = File.read('tmp/gimme-versions-binary-linux').split(/\n/).reject do |line| - line.strip.empty? || line.strip.start_with?('#') - end - - raw.sort!(&method(:semver_sort)) - - out = {} - raw.each { |full_version| out.merge!(expand_semver_aliases(full_version)) } - - raise StandardError, 'no go versions parsed' if out.empty? - - out.merge!( - '1.2' => '1.2.2', - 'go1' => 'go1' - ) - - File.write( - 'public/version-aliases/go.json', - JSON.pretty_generate(out) - ) -end - -desc 'update raw ghc versions' -file 'tmp/ghc-versions.html' => 'tmp' do - fetch_githubusercontent_file( - '~ghc', - host: 'downloads.haskell.org', - to: File.expand_path('../tmp/ghc-versions.html', __FILE__), - mode: 0o644 - ) -end - -desc 'update ghc versions' -file 'public/version-aliases/ghc.json' => 'tmp/ghc-versions.html' do - out = {} - File.read('tmp/ghc-versions.html') - .scan(%r[(?\d[^<>]+)/]i) - .to_a - .flatten - .reject { |v| v =~ /-(rc|latest)/ } - .sort(&method(:semver_sort)) - .each do |full_version| - fullparts = full_version.split('.') - major = fullparts.first - out.merge!( - full_version => full_version, - major => full_version, - "#{major}.x" => full_version, - "#{major}.x.x" => full_version, - "#{fullparts[0]}.#{fullparts[1]}" => full_version, - "#{fullparts[0]}.#{fullparts[1]}.x" => full_version, - ) - end - - raise StandardError, 'no ghc versions parsed' if out.empty? - File.write( - 'public/files/ghc-versions.json', - JSON.pretty_generate(out) - ) -end - -desc 'update sauce_connect.sh' -file 'lib/travis/build/addons/sauce_connect/sauce_connect.sh' do - write_sauce_connect_template -end - -desc 'update sc-linux' -file 'public/files/sc-linux.tar.gz' => 'public/files' do - fetch_sc('linux') -end - -desc 'update sc-mac' -file 'public/files/sc-osx.zip' => 'public/files' do - fetch_sc('osx') -end - -desc 'update sc' -multitask update_sc: Rake::FileList[ - 'lib/travis/build/addons/sauce_connect/sauce_connect.sh', - 'public/files/sc-linux.tar.gz', - 'public/files/sc-osx.zip' -] - -desc 'update godep' -multitask update_godep: Rake::FileList[ - 'public/files/godep_darwin_amd64', - 'public/files/godep_linux_amd64' -] - -desc 'update version aliases' -multitask update_version_aliases: Rake::FileList[ - 'public/version-aliases/ghc.json', - 'public/version-aliases/go.json' -] - -desc 'update static files' -multitask update_static_files: Rake::FileList[ - 'lib/travis/build/addons/sauce_connect/sauce_connect.sh', - 'public/files/casher', - 'public/files/gimme', - 'public/files/godep_darwin_amd64', - 'public/files/godep_linux_amd64', - 'public/files/nvm.sh', - 'public/files/rustup-init.sh', - 'public/files/sbt', - 'public/files/sc-linux.tar.gz', - 'public/files/sc-osx.zip', - 'public/files/tmate-static-linux-amd64.tar.gz' -] - -desc "show contents in public/files" -task 'ls_public_files' do - Rake::FileList['public/files/*'].each do |f| - puts f - end -end +$LOAD_PATH.unshift(File.expand_path('../lib', __FILE__)) +require 'travis/build/rake_tasks' +include Travis::Build::RakeTasks diff --git a/lib/travis/build/rake_tasks.rb b/lib/travis/build/rake_tasks.rb new file mode 100644 index 0000000000..74320a23fc --- /dev/null +++ b/lib/travis/build/rake_tasks.rb @@ -0,0 +1,395 @@ +require 'json' +require 'logger' +require 'pathname' + +require 'faraday' +require 'faraday_middleware' +require 'rake' +require 'rubygems' + +module Travis + module Build + module RakeTasks + def fetch_githubusercontent_file(from, host: 'raw.githubusercontent.com', + to: nil, mode: 0o755) + conn = build_faraday_conn(host: host) + to = if to + Pathname.new(to) + else + Pathname.new(from).basename + end + to = File.join(top, 'public/files', to) unless to.absolute? + + response = conn.get do |req| + logger.info "Fetching #{conn.url_prefix.to_s}#{from}" + req.url from + end + + dest = top + to + + dest.dirname.mkpath + logger.info "Writing to #{dest}" + dest.write(response.body) + logger.info "Setting mode '0o#{mode.to_s(8)}' on #{dest}" + dest.chmod(mode) + rescue Exception => e + logger.info "Error: #{e.message}" + end + + def latest_release_for(repo) + conn = build_faraday_conn(host: 'api.github.com') + + response = conn.get do |req| + releases_url = "repos/#{repo}/releases" + logger.info "Fetching releases from #{conn.url_prefix.to_s}#{releases_url}" + req.url releases_url + oauth_token = ENV['GITHUB_OAUTH_TOKEN'] + if oauth_token + req.headers['Authorization'] = "token #{oauth_token}" + end + end + + if response.success? + json_data = JSON.parse(response.body) + fail "No releases found for #{repo}" if json_data.empty? + json_data.sort! do |a, b| + semver_cmp(a['tag_name'].sub(/^v/, ''), b['tag_name'].sub(/^v/, '')) + end + json_data.last['tag_name'] + else + fail "Could not find releases for #{repo}" + end + end + + def sc_data + conn = build_faraday_conn(host: 'saucelabs.com') + response = conn.get('versions.json') + + fail 'Could not fetch sc metadata' unless response.success? + JSON.parse(response.body) + end + + def file_update_sauce_connect + require 'erb' + + dest = top + 'lib/travis/build/addons/sauce_connect/templates/sauce_connect.sh' + app_host = ENV.fetch('TRAVIS_BUILD_APP_HOST', '') + dest.dirname.mkpath + dest.write(ERB.new((top + "#{dest}.erb").read).result(binding)) + dest.chmod(0o644) + end + + def file_update_sc(platform) + require 'digest/sha1' + + ext = platform == 'linux' ? 'tar.gz' : 'zip' + + download_url = URI.parse(sc_data['Sauce Connect'][platform]['download_url']) + + conn = build_faraday_conn( + scheme: download_url.scheme, + host: download_url.host + ) + + logger.info "getting #{download_url.path}" + response = conn.get(download_url.path) + + dest = top + "public/files/sc-#{platform}.#{ext}" + + archive_content = response.body + + expected_checksum = sc_data['Sauce Connect'][platform]['sha1'] + received_checksum = Digest::SHA1.hexdigest(archive_content) + + unless received_checksum == expected_checksum + fail "Checksums did not match: expected #{expected_checksum} received #{received_checksum}" + end + + dest.dirname.mkpath + logger.info "writing to #{dest}" + dest.write(response.body) + dest.chmod(0o755) + end + + def expand_semver_aliases(full_version) + fullparts = full_version.split('.') + major = fullparts.first + { + full_version => full_version, + major => full_version, + "#{major}.x" => full_version, + "#{major}.x.x" => full_version, + "#{fullparts[0]}.#{fullparts[1]}" => full_version, + "#{fullparts[0]}.#{fullparts[1]}.x" => full_version, + } + end + + def build_faraday_conn(scheme: 'https', host: 'null.example.com') + Faraday.new("#{scheme}://#{host}") do |f| + f.response :raise_error + f.use FaradayMiddleware::FollowRedirects + f.adapter Faraday.default_adapter + end + end + + def logger + @logger ||= Logger.new($stdout) + end + + def top + @top ||= Pathname.new( + File.expand_path('../../../../', __FILE__) + ) + end + + def semver_cmp(a, b) + Gem::Version.new(a.to_s) <=> Gem::Version.new(b.to_s) + end + + def task_clean + rm_rf(top + 'public/files') + end + + def file_update_casher + fetch_githubusercontent_file 'travis-ci/casher/production/bin/casher' + end + + def file_update_gimme + latest_release = latest_release_for('travis-ci/gimme') + logger.info "Latest gimme release is #{latest_release}" + fetch_githubusercontent_file "travis-ci/gimme/#{latest_release}/gimme" + end + + def file_update_godep_for_darwin + latest_release = latest_release_for('tools/godep') + logger.info "Latest godep release is #{latest_release}" + fetch_githubusercontent_file( + "tools/godep/releases/download/#{latest_release}/godep_darwin_amd64", + host: 'github.com' + ) + end + + def file_update_godep_for_linux + latest_release = latest_release_for('tools/godep') + logger.info "Latest godep release is #{latest_release}" + fetch_githubusercontent_file( + "tools/godep/releases/download/#{latest_release}/godep_linux_amd64", + host: 'github.com' + ) + end + + def file_update_nvm + latest_release = latest_release_for('creationix/nvm') + logger.info "Latest nvm release is #{latest_release}" + fetch_githubusercontent_file "creationix/nvm/#{latest_release}/nvm.sh" + end + + def file_update_nvm_exec + latest_release = latest_release_for('creationix/nvm') + logger.info "Latest nvm release is #{latest_release}" + fetch_githubusercontent_file "creationix/nvm/#{latest_release}/nvm-exec" + end + + def file_update_sbt + fetch_githubusercontent_file 'paulp/sbt-extras/master/sbt' + end + + def file_update_tmate + latest_release = latest_release_for('tmate-io/tmate') + logger.info "Latest tmate release is #{latest_release}" + fetch_githubusercontent_file( + File.join( + 'tmate-io/tmate/releases/download', + latest_release, + "tmate-#{latest_release}-static-linux-amd64.tar.gz", + ), + host: 'github.com', to: 'tmate-static-linux-amd64.tar.gz' + ) + end + + def file_update_rustup + fetch_githubusercontent_file( + '', host: 'sh.rustup.rs', to: 'rustup-init.sh' + ) + end + + def file_update_raw_go_versions + fetch_githubusercontent_file( + 'travis-ci/gimme/master/.testdata/sample-binary-linux', + to: top + 'tmp/go-versions-binary-linux', + mode: 0o644 + ) + end + + def file_update_go_versions + raw = (top + 'tmp/go-versions-binary-linux').read + .split(/\n/) + .reject do |line| + line.strip.empty? || line.strip.start_with?('#') + end + + raw.sort!(&method(:semver_cmp)) + + out = {} + raw.each { |full_version| out.merge!(expand_semver_aliases(full_version)) } + + raise StandardError, 'no go versions parsed' if out.empty? + + out.merge!( + '1.2' => '1.2.2', + 'go1' => 'go1' + ) + + dest = top + 'public/version-aliases/go.json' + dest.dirname.mkpath + dest.write(JSON.pretty_generate(out)) + dest.chmod(0o644) + end + + def file_update_raw_ghc_versions + fetch_githubusercontent_file( + '~ghc', + host: 'downloads.haskell.org', + to: top + 'tmp/ghc-versions.html', + mode: 0o644 + ) + end + + def file_update_ghc_versions + out = {} + + raw = (top + 'tmp/ghc-versions.html').read + raw.scan(%r[(?\d[^<>]+)/]i) + .to_a + .flatten + .reject { |v| v =~ /-(rc|latest)/ } + .sort(&method(:semver_cmp)) + .each do |full_version| + out.merge!(expand_semver_aliases(full_version)) + end + + raise StandardError, 'no ghc versions parsed' if out.empty? + dest = top + 'public/version-aliases/ghc.json' + dest.dirname.mkpath + dest.write(JSON.pretty_generate(out)) + dest.chmod(0o644) + end + + extend self + extend Rake::DSL + + task 'assets:precompile' => %i( + clean + update_sc + update_godep + update_static_files + ls_public_files + ) + + desc 'clean up static files in public/' + task(:clean) { task_clean } + + desc 'update casher' + file('public/files/casher') { file_update_casher } + + desc 'update gimme' + file('public/files/gimme') { file_update_gimme } + + desc 'update godep for Darwin' + file('public/files/godep_darwin_amd64') { file_update_godep_for_darwin } + + desc 'update godep for Linux' + file('public/files/godep_linux_amd64') { file_update_godep_for_linux } + + desc 'update nvm.sh' + file('public/files/nvm.sh') { file_update_nvm } + + desc 'update nvm-exec' + file('public/files/nvm-exec') { file_update_nvm_exec } + + desc 'update sbt' + file('public/files/sbt') { file_update_sbt } + + desc 'update tmate' + file 'public/files/tmate-static-linux-amd64.tar.gz' do + file_update_tmate + end + + desc 'update rustup' + file('public/files/rustup-init.sh') { file_update_rustup } + + desc 'update raw go versions' + file 'tmp/go-versions-binary-linux' do + file_update_raw_go_versions + end + + desc 'update go versions' + file 'public/version-aliases/go.json' => 'tmp/go-versions-binary-linux' do + file_update_go_versions + end + + desc 'update raw ghc versions' + file('tmp/ghc-versions.html') { file_update_raw_ghc_versions } + + desc 'update ghc versions' + file 'public/version-aliases/ghc.json' => 'tmp/ghc-versions.html' do + file_update_ghc_versions + end + + desc 'update sauce_connect.sh' + file 'lib/travis/build/addons/sauce_connect/sauce_connect.sh' do + file_update_sauce_connect + end + + desc 'update sc-linux' + file 'public/files/sc-linux.tar.gz' do + file_update_sc('linux') + end + + desc 'update sc-mac' + file 'public/files/sc-osx.zip' do + file_update_sc('osx') + end + + desc 'update sc' + multitask update_sc: Rake::FileList[ + 'lib/travis/build/addons/sauce_connect/sauce_connect.sh', + 'public/files/sc-linux.tar.gz', + 'public/files/sc-osx.zip' + ] + + desc 'update godep' + multitask update_godep: Rake::FileList[ + 'public/files/godep_darwin_amd64', + 'public/files/godep_linux_amd64' + ] + + desc 'update version aliases' + multitask update_version_aliases: Rake::FileList[ + 'public/version-aliases/ghc.json', + 'public/version-aliases/go.json' + ] + + desc 'update static files' + multitask update_static_files: Rake::FileList[ + 'lib/travis/build/addons/sauce_connect/sauce_connect.sh', + 'public/files/casher', + 'public/files/gimme', + 'public/files/godep_darwin_amd64', + 'public/files/godep_linux_amd64', + 'public/files/nvm-exec', + 'public/files/nvm.sh', + 'public/files/rustup-init.sh', + 'public/files/sbt', + 'public/files/sc-linux.tar.gz', + 'public/files/sc-osx.zip', + 'public/files/tmate-static-linux-amd64.tar.gz' + ] + + desc 'show contents in public/files' + task 'ls_public_files' do + Rake::FileList['public/files/*'].each { |f| puts f } + end + end + end +end diff --git a/spec/build/rake_tasks_spec.rb b/spec/build/rake_tasks_spec.rb new file mode 100644 index 0000000000..f7fdeb4dca --- /dev/null +++ b/spec/build/rake_tasks_spec.rb @@ -0,0 +1,228 @@ +require 'pathname' + +def top + @top ||= Pathname.new(Dir.mktmpdir) +end + +Dir.chdir(top) do + require 'travis/build/rake_tasks' +end + +describe Travis::Build::RakeTasks do + subject { described_class } + + def releases_response(*versions) + [ + 200, + { 'Content-Type' => 'application/json' }, + JSON.dump( + versions.map { |v| { 'tag_name' => v } } + ) + ] + end + + let :request_stubs do + Faraday::Adapter::Test::Stubs.new do |stub| + %w[ + creationix/nvm + tmate-io/tmate + tools/godep + travis-ci/gimme + ].each do |repo_slug| + stub.get("/repos/#{repo_slug}/releases") do |*| + releases_response('v1.2.3', 'v1.2.5') + end + end + + [ + ['tmate-io/tmate', 'tmate-v1.2.5-static-linux-amd64.tar.gz'], + ['tools/godep', 'godep_darwin_amd64'], + ['tools/godep', 'godep_linux_amd64'] + ].each do |repo_slug, file_basename| + stub.get("/#{repo_slug}/releases/download/v1.2.5/#{file_basename}") do |*| + [200, { 'Content-Type' => 'application/octet-stream' }, "\xb1"] + end + end + + %w[ + / + /creationix/nvm/v1.2.5/nvm-exec + /creationix/nvm/v1.2.5/nvm.sh + /paulp/sbt-extras/master/sbt + /sc-linux.tar.gz + /sc-osx.zip + /travis-ci/casher/production/bin/casher + /travis-ci/gimme/v1.2.5/gimme + ].each do |filepath| + stub.get(filepath) do |*| + [200, { 'Content-Type' => 'application/octet-stream' }, "\xa1"] + end + end + + stub.get('/travis-ci/gimme/master/.testdata/sample-binary-linux') do |*| + [ + 200, + { 'Content-Type' => 'text/plain' }, + %w[ + #uhm + 1.4.0 + 1.2.3 + 1.9.1 + ].join("\n") + ] + end + + stub.get('/~ghc') do |*| + [ + 200, + { 'Content-Type' => 'text/html' }, + <<-EOF.gsub(/^\s+> ?/, '') + > + > wat + > + > 1.2.5/ + > 9.1.9/ + > 1.2.3/ + > + > + EOF + ] + end + + stub.get('/versions.json') do |*| + [ + 200, + { 'Content-Type' => 'application/json' }, + JSON.dump( + 'Sauce Connect' => { + 'linux' => { + 'download_url' => 'http://sc.example.com/sc-linux.tar.gz', + 'sha1' => Digest::SHA1.hexdigest("\xa1") + }, + 'osx' => { + 'download_url' => 'http://sc.example.com/sc-osx.zip', + 'sha1' => Digest::SHA1.hexdigest("\xa1") + } + } + ) + ] + end + end + end + + let :conn do + Faraday.new do |builder| + builder.adapter :test, request_stubs + end + end + + before :all do + FileUtils.mkdir_p(top) + end + + before :each do + subject.logger.level = Logger::WARN + subject.stubs(:build_faraday_conn).returns(conn) + subject.stubs(:top).returns(top) + Rake::FileUtilsExt.verbose(false) + FileUtils.rm_rf(top.join('*')) + Dir.chdir(top) + top.mkpath + end + + after :all do + Dir.chdir(File.expand_path('../../../', __FILE__)) + FileUtils.rm_rf(top) + end + + %w[ + clean + ls_public_files + update_godep + update_sc + update_static_files + update_version_aliases + ].each do |task_name| + it "defines task #{task_name.inspect}" do + expect(Rake.application.tasks.map(&:name)).to include(task_name) + end + end + + it 'can clean up static files in public/' do + files = top + 'public/files' + files.mkpath + thing = files + 'thing' + thing.write('wat') + Rake::Task[:clean].invoke + expect(thing).to_not be_exist + end + + %w[ + public/files/casher + public/files/gimme + public/files/godep_darwin_amd64 + public/files/godep_linux_amd64 + public/files/nvm.sh + public/files/rustup-init.sh + public/files/sbt + public/files/sc-linux.tar.gz + public/files/sc-osx.zip + public/files/tmate-static-linux-amd64.tar.gz + public/version-aliases/ghc.json + public/version-aliases/go.json + tmp/ghc-versions.html + tmp/go-versions-binary-linux + ].each do |filename| + it "can fetch #{filename}" do + Rake::Task[filename].reenable + Rake::Task[filename].invoke + expect(top + filename).to be_exist + end + end + + it 'expands available ghc versions into aliases' do + subject.file_update_raw_ghc_versions + subject.file_update_ghc_versions + aliases = JSON.parse( + (top + 'public/version-aliases/ghc.json').read + ) + expect(aliases).to eq( + '1' => '1.2.5', + '1.2' => '1.2.5', + '1.2.3' => '1.2.3', + '1.2.5' => '1.2.5', + '1.2.x' => '1.2.5', + '1.x' => '1.2.5', + '1.x.x' => '1.2.5', + '9' => '9.1.9', + '9.1' => '9.1.9', + '9.1.9' => '9.1.9', + '9.1.x' => '9.1.9', + '9.x' => '9.1.9', + '9.x.x' => '9.1.9' + ) + end + + it 'expands available go versions into aliases' do + subject.file_update_raw_go_versions + subject.file_update_go_versions + aliases = JSON.parse( + (top + 'public/version-aliases/go.json').read + ) + expect(aliases).to eq( + '1' => '1.9.1', + '1.2' => '1.2.2', + '1.2.3' => '1.2.3', + '1.2.x' => '1.2.3', + '1.4' => '1.4.0', + '1.4.0' => '1.4.0', + '1.4.x' => '1.4.0', + '1.9' => '1.9.1', + '1.9.1' => '1.9.1', + '1.9.x' => '1.9.1', + '1.x' => '1.9.1', + '1.x.x' => '1.9.1', + 'go1' => 'go1' + ) + end +end