# frozen_string_literal: true require 'rubygems' require 'rake' require 'date' require 'test/unit/testsuite' module Test module Unit class TestSuite def run(result, &progress_block) yield(STARTED, name) run_startup(result) @tests.each do |test| test.run(result, &progress_block) break unless result.passed? end run_shutdown(result) yield(FINISHED, name) end end end end ############################################################################# # # Helper functions # ############################################################################# def name @name ||= Dir['*.gemspec'].first.split('.').first end def version line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/] line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1] end def date Date.today.to_s end def gemspec_file "#{name}.gemspec" end def gem_file "#{name}-#{version}.gem" end def replace_header(head, header_name) head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{Regexp.last_match(1)}#{send(header_name)}'" } end ############################################################################# # # Standard tasks # ############################################################################# require 'rake/testtask' Rake::TestTask.new do |t| t.libs << 'test/' << 'lib/' t.test_files = FileList['test/test*.rb'] t.verbose = true end task default: :test ############################################################################# # # Custom tasks (add your own tasks here) # ############################################################################# begin require 'yard' YARD::Rake::YardocTask.new rescue LoadError task :yardoc do abort 'YARD is not available. In order to run yardoc, you must: sudo gem install yard' end end ############################################################################# # # Packaging tasks # ############################################################################# task release: :build do unless `git branch` =~ /^\* main$/ puts 'You must be on the main branch to release!' exit! end sh "git commit --allow-empty -a -m 'Release #{version}'" sh "git tag v#{version}" sh 'git push origin main' sh 'git push --tags' sh "gem push pkg/#{name}-#{version}.gem" end task build: %i[gemspec reference] do sh 'mkdir -p pkg' sh "gem build #{gemspec_file}" sh "mv #{gem_file} pkg" end task gemspec: :validate do # read spec file and split out manifest section spec = File.read(gemspec_file) head, manifest, tail = spec.split(" # = MANIFEST =\n") # replace name version and date replace_header(head, :name) replace_header(head, :version) replace_header(head, :date) # determine file list from git ls-files files = `git ls-files` .split("\n") .sort .reject { |file| file =~ /^\./ } .reject { |file| file =~ /^(rdoc|pkg)/ } .map { |file| " #{file}" } .join("\n") # piece file back together and write manifest = " s.files = %w[\n#{files}\n ]\n" spec = [head, manifest, tail].join(" # = MANIFEST =\n") File.open(gemspec_file, 'w') { |io| io.write(spec) } puts "Updated #{gemspec_file}" end task :validate do libfiles = Dir['lib/*'] - ["lib/#{name}.rb", "lib/#{name}"] unless libfiles.empty? puts "Directory `lib` should only contain a `#{name}.rb` file and `#{name}` dir." exit! end unless Dir['VERSION*'].empty? puts 'A `VERSION` file at root level violates Gem best practices.' exit! end end desc 'Creates REFERENCE.md' task :reference do system 'ruby ./scripts/reference.rb > REFERENCE.md' end