Added foo:install:assets task that copies assets from plugins public directory to application's public directory

This is the most simple and naive approach: just copy every files from engine to app.
The only exception is when file has changed, in that case developer will be
asked if he wants to rename the field.

There is no need to make this task more sophisticated as 3.1 will be shipped
with better assets handling and it will be the default way to handle things.
This commit is contained in:
Piotr Sarnacki 2010-10-13 16:20:09 +03:00 committed by José Valim
parent f07cbec865
commit 959f8576f2
3 changed files with 47 additions and 5 deletions

@ -546,12 +546,12 @@ def load_seed
ENV["FROM"] = railtie_name
Rake::Task["railties:install:migrations"].invoke
end
end
desc "Copy assets from #{railtie_name} to application"
task :assets do
ENV["FROM"] = railtie_name
Rake::Task["railties:install:assets"].invoke
desc "Copy assets from #{railtie_name} to application"
task :assets do
ENV["FROM"] = railtie_name
Rake::Task["railties:install:assets"].invoke
end
end
end
end

@ -17,4 +17,32 @@ namespace :railties do
puts "Created symlink #{symlink_path} -> #{path}"
end
end
namespace :install do
desc "Copies missing assets from Railties (e.g. plugins, engines). You can specify Railties to use with FROM=railtie1,railtie2"
task :assets => :rails_env do
require 'rails/generators/base'
Rails.application.initialize!
to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map {|n| n.strip }
app_public_path = Rails.application.paths["public"].first
Rails.application.railties.all do |railtie|
next unless to_load == :all || to_load.include?(railtie.railtie_name)
if railtie.respond_to?(:paths) && (path = railtie.paths["public"].first) &&
(assets_dir = railtie.config.compiled_asset_path) && File.exist?(path)
Rails::Generators::Base.source_root(path)
copier = Rails::Generators::Base.new
Dir[File.join(path, "**/*")].each do |file|
relative = file.gsub(/^#{path}\//, '')
if File.file?(file)
copier.copy_file relative, File.join(app_public_path, assets_dir, relative)
end
end
end
end
end
end
end

@ -10,6 +10,20 @@ def app
@app ||= Rails.application
end
def test_copying_assets
@plugin.write "public/javascripts/foo.js", "doSomething()"
@plugin.write "public/stylesheets/foo.css", "h1 { font-size: 10000px }"
@plugin.write "public/images/img.png", ""
Dir.chdir(app_path) do
`rake bukkits:install:assets --trace`
assert File.exists?(app_path("public/bukkits/javascripts/foo.js"))
assert File.exists?(app_path("public/bukkits/stylesheets/foo.css"))
assert File.exists?(app_path("public/bukkits/images/img.png"))
end
end
def test_copying_migrations
@plugin.write "db/migrate/1_create_users.rb", <<-RUBY
class CreateUsers < ActiveRecord::Migration