jekyll-algolia/Rakefile

217 lines
6.3 KiB
Ruby

# frozen_string_literal: true
require 'rubygems'
require 'bundler'
begin
Bundler.setup(:default, :development)
rescue Bundler::BundlerError => e
warn e.message
warn 'Run `bundle install` to install missing gems'
exit e.status_code
end
require 'algoliasearch'
require 'rake'
require 'rspec/core'
require 'rspec/core/rake_task'
require 'rubocop/rake_task'
# LINT
desc 'Check files for linting issues'
RuboCop::RakeTask.new(:lint) do |task|
task.patterns = [
'lib/**/*.rb',
'spec/**/*.rb'
]
task.options = [
'--display-cop-names',
'--force-exclusion' # Some files are excluded in .rubocop.yml
]
end
# TEST
desc 'Run unit tests'
RSpec::Core::RakeTask.new(:test) do |task|
task.rspec_opts = '--color --format progress'
task.pattern = [
'spec/*.rb',
'spec/jekyll/**/*.rb'
]
end
namespace 'test' do
desc 'Run tests in all Ruby versions'
task :all_ruby_versions do
puts 'Please, run ./scripts/test_all_ruby_versions manually'
end
# Generate locally browsable coverage files
task :coverage do
ENV['COVERAGE'] = 'true'
Rake::Task['test'].execute
end
desc 'Live-reload unit tests'
task :watch do
# We specifically watch for ./lib and ./spec and not the whole dir because:
# 1. It's the only directories we are interested in
# 2. Listening to the whole parent dir might throw Guard errors if we have
# symlink
sh 'bundle exec guard --clear --watchdir lib spec'
end
# Integration tests need to run `bundle exec jekyll build/algolia`. Using
# bundle from inside a Rakefile does not seem to work, so the scripts have to
# be run manually. Each script run the needed commands to prepare the test
# site, then actually run the _run and _watch_run tasks below.
desc 'Run integration tests'
task :integration do
puts 'Please, run ./scripts/test_integration manually'
end
namespace 'integration' do
desc 'Live-reload integration tests'
task :watch do
puts 'Please, run ./scripts/test_integration_watch manually'
end
# Delete the test indices
task :_delete_indices do
Algolia.init(
application_id: ENV['ALGOLIA_APPLICATION_ID'],
api_key: ENV['ALGOLIA_API_KEY']
)
Algolia::Index.new(ENV['ALGOLIA_INDEX_NAME']).delete_index!
Algolia::Index
.new("#{ENV['ALGOLIA_INDEX_NAME']}_object_ids").delete_index!
end
# Run only the integration tests
desc ''
RSpec::Core::RakeTask.new(:_run) do |task|
task.rspec_opts = '--color --format progress'
task.pattern = [
# Check that the default build has the expected results
'spec/integration/main_spec.rb',
# Check various config and its impact on the settings
'spec/integration/settings_spec.rb',
# Check that object ids are stored in dedicated index
'spec/integration/object_ids_spec.rb'
]
end
# Live-reloading integration tests
# It will reload the tests whenever they are changed. It will not
# live-rebuild everything, you still have to run rake
# ./scripts/test_integration_prepare for that
task :_watch_run do
sh 'bundle exec guard '\
'--clear '\
'--watchdir lib spec/integration '\
'--guardfile Guardfile_integration'
end
end
end
task watch: 'test:watch'
# GEM RELEASE
desc 'Release a new version of the gem'
task release: %i[lint test] do
Rake::Task['release:update_develop_from_master'].invoke
Rake::Task['release:update_version'].invoke
Rake::Task['release:build'].invoke
Rake::Task['release:push'].invoke
Rake::Task['release:update_master_from_develop'].invoke
end
namespace 'release' do
# Getting up to date from master
task :update_develop_from_master do
sh 'git checkout master --quiet'
sh 'git pull --rebase origin master --quiet'
sh 'git checkout develop --quiet'
sh 'git rebase master --quiet'
end
# Update current version
task :update_version do
version_file_path = 'lib/jekyll/algolia/version.rb'
require_relative version_file_path
# Ask for new version
old_version = Jekyll::Algolia::VERSION.to_s
puts "Current version is #{old_version}"
puts 'Enter new version:'
new_version = STDIN.gets.strip
# Write it to file
version_file_content = File.open(version_file_path, 'rb').read
version_file_content.gsub!(old_version, new_version)
File.write(version_file_path, version_file_content)
# Commit it in git
sh "git commit -a -m 'release #{new_version}'"
# Create the git tag
last_tag = `git describe --tags --abbrev=0`.strip
changelog = `git log #{last_tag}..HEAD --format=%B`.gsub("\n\n", "\n")
tag_name = new_version
sh 'git tag '\
"-a #{tag_name} "\
"-m \"#{changelog}\""\
' 2>/dev/null'
sh "git tag #{tag_name} #{tag_name} -f -a"
end
# Build the gem
task :build do
sh 'bundle install'
sh 'gem build jekyll-algolia.gemspec'
end
# Push the gem to rubygems
task :push do
# This will throw a warning because we're redefining a constant. That's ok.
load 'lib/jekyll/algolia/version.rb'
current_version = Jekyll::Algolia::VERSION.to_s
sh "gem push jekyll-algolia-#{current_version}.gem"
sh "rm jekyll-algolia-#{current_version}.gem"
sh "git push origin #{current_version}"
end
# Update master
task :update_master_from_develop do
sh 'git checkout master --quiet'
sh 'git rebase develop --quiet'
sh 'git checkout develop --quiet'
end
end
# DOCUMENTATION
namespace 'docs' do
desc 'Rebuild documentation website'
task :build do
Dir.chdir('./docs-src') do
sh 'yarn'
sh 'yarn run build'
end
end
desc 'Rebuild and deploy documentation'
task :deploy do
# Make sure develop is up to date with master
sh 'git checkout master --quiet'
sh 'git pull --rebase origin master --quiet'
sh 'git checkout develop --quiet'
sh 'git rebase master --quiet'
Rake::Task['docs:build'].invoke
sh 'git add ./docs'
sh "git commit -m 'Updating documentation website' || true"
sh 'git checkout master --quiet'
sh 'git rebase develop --quiet'
sh 'git push origin master'
sh 'git checkout develop --quiet'
end
desc 'Serve the documentation locally'
task :serve do
Dir.chdir('./docs-src') do
sh 'yarn'
sh 'yarn run serve'
end
end
end
task default: :test