tasks/generate.rake
def rails_version
if (version = ENV['BUNDLE_GEMFILE'].to_s.match(/rails_([\d\.]+).gemfile/)&.to_a&.last)
Gem::Version.new(version)
end
end
if rails_version
EXAMPLE_APP = "tmp/lurker_app_rails_#{rails_version}"
TEMPLATE_TASK = rails_version >= Gem::Version.new('5.0') ? 'app:template' : 'rails:template'
TASK_RUNNER = rails_version >= Gem::Version.new('5.0') ? 'bin/rails' : 'bin/rake'
else
raise "Export BUNDLE_GEMFILE=gemfiles/rails_... explicitly"
end
EXAMPLE_PATH = File.expand_path("../../#{EXAMPLE_APP}", __FILE__)
namespace :clobber do
desc "clobber coverage"
task :coverage do
rm_rf File.expand_path('../coverage', __FILE__)
end
desc "clobber the generated app"
task :app do
FileUtils.mkdir_p EXAMPLE_PATH
in_lurker_app "bin/spring stop" rescue nil
Dir.chdir EXAMPLE_PATH do
Dir.glob("*", File::FNM_DOTMATCH).each do |fname|
next if fname == '.' || fname == '..' || fname == '.git' || fname == '.bundle'
FileUtils.rm_rf fname
end
end
end
end
namespace :generate do
desc "generate a fresh app with rspec installed"
task :app do |t|
if needs_generation?
sh "bundle exec rails new #{EXAMPLE_APP} -d postgresql -m #{File.expand_path '../../templates/lurker_app.rb', __FILE__} --skip-javascript --skip-git --skip-test-unit --skip-keeps --skip-bundle --quiet"
in_lurker_app "bundle config --local local.lurker $PWD/../.." unless ENV['CI']
in_lurker_app "bundle config --local set without 'development'"
in_lurker_app "bundle install"
%w[rake rspec-core spring bundler].each do |gem|
in_lurker_app "bundle binstubs #{gem} --force"
end
end
end
desc "generate a bunch of stuff with generators"
task :stuff do
in_lurker_app "LOCATION='../../templates/generate_stuff.rb' #{TASK_RUNNER} #{TEMPLATE_TASK}"
if ENV['CI']
in_lurker_app "#{TASK_RUNNER} RAILS_ENV=test db:setup "
else
in_lurker_app "#{TASK_RUNNER} db:setup"
in_lurker_app "#{TASK_RUNNER} db:import"
end
end
end
def in_lurker_app(command)
FileUtils.mkdir_p(EXAMPLE_PATH)
Dir.chdir(EXAMPLE_PATH) do
bundler_method = Bundler.respond_to?(:with_unbundled_env) ? :with_unbundled_env : :with_clean_env
Bundler.send(bundler_method) do
sh command
end
end
end
def needs_generation?
!File.exists?("#{EXAMPLE_PATH}/Gemfile")
end
def place_github_badge(fname)
full_fname = "#{EXAMPLE_PATH}/#{fname}"
content = File.read(full_fname).gsub("</header>", <<-EOF
</header>
<a href='https://github.com/razum2um/lurker'>
<img style='position: absolute; top: 0; right: 0; border: 0; z-index: 1000'
src="https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67"
data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"
alt='Fork me on GitHub'>
</a>
EOF
)
File.open(full_fname, 'w') { |f| f.write content }
end
desc 'destroys & recreates new test app'
task :regenerate => ["clobber:coverage", "clobber:app", "assets:precompile", "generate:app", "generate:stuff"]
desc 'run cucumber in a fresh env'
task :features => [:regenerate, :cucumber]
desc 'convert docs for example app, prepages gh-pages, having schemas in /lurker'
task :convert_example_docs do
in_lurker_app "bin/lurker init_docs"
if File.exists?(readme = File.expand_path('../../README.md', __FILE__))
in_lurker_app "bin/lurker convert -c #{readme}"
else
in_lurker_app "bin/lurker convert"
end
place_github_badge 'public/lurker/index.html'
# in_lurker_app "bin/lurker convert -f pdf"
end
task :build_example_docs => [:features, :convert_example_docs]