rakelib/sdkdocs.rake (66 lines of code) (raw):
require 'erb'
require 'pathname'
require 'link_checker' if ENV.has_key?('BUNDLER_VERSION')
dir = Pathname.new("#{__dir__}/..").cleanpath
relative_dir = dir.relative_path_from(Pathname.new(Dir.pwd))
@root_dir = dir.to_s
@relative_dir = relative_dir.to_s
task :default do
system('rake -T')
end
desc 'Bootstraps the build environment with bundler. Only needed to run once.'
task :bootstrap do
RakeFileUtils.cp 'sdkdocs-template/bundler/Gemfile.template', 'Gemfile' unless File.exists?('Gemfile')
# On Mac, `brew install ruby` installs a version of bundler, that isn't the latest version and isn't
# listed as a gem (I don't know if this is part of ruby, part of rubygems, or a quirk of the Homebrew
# installer for ruby). This `gem install` command might prompt to replace the binaries for the existing
# version
puts 'If on Mac, select yes to override existing binaries. This is bundler being updated from a default Homebrew install'
sh "gem install bundler && bundle install --path ~/.bundles/sdkdocs-template/_vendor/bundle"
end
task :prepare_config_defaults do
# Set up env var for the config template. Allows us to specify the location
# of the jekyll files in the sdkdocs-template folder relative to the base folder
ENV['_sdkdocs_template_dir'] = @root_dir
ENV['_sdkdocs_static_files_dir'] = relative_dir.join('webhelp').to_s
template = ERB.new File.new("#{@relative_dir}/jekyll/config-defaults.yml.erb").read
File.open("#{@relative_dir}/jekyll/_config-defaults.yml", 'w') do |f|
f.write template.result(binding)
end
end
directory '_includes'
file '_includes/page.html' => [ '_includes', "#{@relative_dir}/jekyll/templates/page.html" ] do |t|
cp t.prerequisites[1], t.name, :verbose => true
end
task :prepare_jekyll_includes => '_includes/page.html'
desc 'Ensure assets are in the right place for a build'
task :prepare_assets => [:prepare_config_defaults, :prepare_webhelp, :prepare_jekyll_includes]
desc 'Build the site, without starting the server.'
task :build, [:configyml] => :prepare_assets do |t, args|
args.with_defaults(:configyml => '_config.yml')
dest = ENV['dest'] || CONFIG[:build_destination]
sh "bundle exec jekyll build --trace --config #{@relative_dir}/jekyll/_config-defaults.yml,#{args[:configyml]} --destination=#{dest}"
end
desc 'Builds and hosts the site.'
task :preview => :prepare_assets do
host = ENV['host'] || CONFIG[:preview_host]
port = ENV['port'] || CONFIG[:preview_port]
dest = ENV['dest'] || CONFIG[:build_destination]
# Are we running inside docker?
docker = ENV['DOCKER'] == 'true'
# Force polling is more CPU intensive, but more accurate on Windows
# It's also required if we're running in docker, since we're sharing the app folder
# Note that the TC build calls rake build, so this won't affect a build
force_polling = '--force_polling ' if RUBY_PLATFORM =~ /win32/ or docker
sh "bundle exec jekyll serve --trace --incremental --config #{@relative_dir}/jekyll/_config-defaults.yml,_config.yml --host=#{host} --port=#{port} #{force_polling} --destination=#{dest}"
end
# This is lazy. We should really be calling `bundle exec rake ...` at all times,
# but that's a bit inconvenient. The only time we actually need to do this is
# for link checking, because we're using a gem that bundle brings in for us
task :requires_bundle_exec_rake do
raise "Run 'bundle exec rake {args}'" unless ENV.has_key?('BUNDLER_VERSION')
end
desc 'Check all links'
task :links => [:requires_bundle_exec_rake, :build] do
dest = ENV['dest'] || CONFIG[:build_destination]
success = LinkChecker.new(:options => {
:no_warnings => true,
:exclusions => [
%r!^https?://github.com/[^/]+/[^/]+/edit/!,
%r!^https?://plugins.jetbrains.com/plugins/list!,
%r!^https?://plugins.jetbrains.com/plugin/developers!,
%r!^https?://plugins.jetbrains.com/plugin/download!,
%r!^https?://plugins.jetbrains.com/author/me!,
%r!^https?://localhost:4000/intellij/sdk/docs/$!,
],
:no_info => true
}, :target => dest).check_uris
raise "Errors found in links" if success > 0
end