Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions lib/rake/error_page_assets_task.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
require 'rake'
require 'rake/tasklib'
require 'fileutils'

module Rake
class ErrorPageAssetsTask < Rake::TaskLib
attr_accessor :name

def initialize(name = :error_pages, task_dependencies = [])
self.name = name

yield self if block_given?

define
end

def log msg
# try to log like Sprockets even though their stuff is all private
STDERR.puts msg
Rails.logger.info(msg) if Rails.respond_to?(:logger) && Rails.logger
end

def process_error_files
config = Rails.configuration
pattern = File.join(config.paths['public'].first, config.assets.prefix, "[0-9][0-9][0-9]*.html")

groups = Dir[pattern].group_by { |s| File.basename(s)[0..2] }
groups.sort_by { |base,_| base }.each do |base, group|
src = group.sort_by { |f| File.mtime(f) }.last
dst = Rails.public_path.join("#{base}.html").to_s
yield src, dst
end
end

def define
namespace :assets do
namespace :precompile do
desc 'Copy the newest error page assets into /public'
task name do
process_error_files do |src, dst|
log "copy #{src} to #{dst}"
FileUtils.cp src, dst
end
end
end

namespace :clobber do
desc 'Remove the error page assets in /public'
task name do
process_error_files do |src,dst|
log "clobber #{dst}"
FileUtils.rm_f dst
end
end
end
end
end
end
end
47 changes: 3 additions & 44 deletions lib/tasks/error_page_assets.rake
Original file line number Diff line number Diff line change
@@ -1,53 +1,12 @@
require 'fileutils'
require 'rake/error_page_assets_task'

# Use the Asset Pipeline to generate static error pages.
# For example, /app/assets/html/404.html.erb will be compiled to /public/404.html

Rake::ErrorPageAssetsTask.new

Rake::Task['assets:precompile'].enhance do
Rake::Task['assets:precompile:error_pages'].invoke
end

Rake::Task['assets:clobber'].enhance ['assets:clobber:error_pages']


namespace :assets do
def log msg
# try to log like Sprockets even though their stuff is all private
STDERR.puts msg
Rails.logger.info(msg) if Rails.respond_to?(:logger) && Rails.logger
end

def process_error_files
config = Rails.configuration
pattern = File.join(config.paths['public'].first, config.assets.prefix, "[0-9][0-9][0-9]*.html")

groups = Dir[pattern].group_by { |s| File.basename(s)[0..2] }
groups.sort_by { |base,_| base }.each do |base, group|
src = group.sort_by { |f| File.mtime(f) }.last
dst = Rails.public_path.join("#{base}.html").to_s
yield src, dst
end
end

namespace :precompile do
desc 'Copy the newest error page assets into /public'
task :error_pages do
process_error_files do |src,dst|
log "copy #{src} to #{dst}"
FileUtils.cp src, dst
end
end
end

namespace :clobber do
desc 'Remove the error page assets in /public'
task :error_pages do
process_error_files do |src,dst|
log "clobber #{dst}"
FileUtils.rm_f dst
end
end
end
end

Rake::Task['assets:clobber'].enhance ['assets:clobber:error_pages']