lib/tasks/bower.rake in bower-rails-0.5.0 vs lib/tasks/bower.rake in bower-rails-0.6.0

- old
+ new

@@ -28,22 +28,32 @@ desc "List bower components" task :list do perform false do sh 'bower list' end - end + end namespace :update do desc "Update existing components and uninstalls extraneous components" task :prune do perform do sh 'bower update && bower prune' end end end + + desc "Resolve assets paths in bower components" + task :resolve do + perform false do + resolve_asset_paths + end + end end +# Install bower assets before precompile +Rake::Task['assets:precompile'].enhance ['bower:install', 'bower:resolve'] + def perform remove_components = true, &block entries = Dir.entries(get_bower_root_path) if entries.include?('Bowerfile') dsl_perform_command remove_components, &block @@ -53,15 +63,11 @@ raise LoadError, "No Bowerfile or bower.json file found. Make sure you have it at the root of your project" end end def get_bower_root_path - if defined?(Rails) - return Rails.root - else - return Dir.pwd - end + Dir.pwd end def dsl_perform_command remove_components = true, &block dsl = BowerRails::Dsl.evalute("Bowerfile") @@ -85,14 +91,30 @@ bower_root = get_bower_root_path #load in bower json file txt = File.read(File.join(bower_root, "bower.json")) json = JSON.parse(txt) - ["lib", "vendor"].each do |dir| + #load and merge root .bowerrc + dot_bowerrc = JSON.parse(File.read(File.join(bower_root, '.bowerrc'))) rescue {} + dot_bowerrc["directory"] = "bower_components" + + if json.except('lib', 'vendor').empty? + folders = json.keys + else + raise "Assuming a standard bower package but cannot find the required 'name' key" unless !!json['name'] + folders = ['vendor'] + end + + folders.each do |dir| + puts "\nInstalling dependencies into #{dir}" + data = json[dir] + # assume using standard bower.json if folder name is not found + data = json if data.nil? + #check folder existence and create? dir = File.join(bower_root, dir, "assets") FileUtils.mkdir_p dir unless File.directory? dir #go in to dir to act Dir.chdir(dir) do @@ -105,11 +127,11 @@ f.write(data.to_json) end #create .bowerrc File.open(".bowerrc", "w") do |f| - f.write(JSON.pretty_generate({:directory => "bower_components"})) + f.write(JSON.pretty_generate(dot_bowerrc)) end #run command yield if block_given? @@ -117,7 +139,35 @@ FileUtils.rm("bower.json") #remove .bowerrc FileUtils.rm(".bowerrc") end if data && !data["dependencies"].empty? + end +end + +def resolve_asset_paths + # Resolve relative paths in CSS + Dir['bower_components/**/*.css'].each do |filename| + contents = File.read(filename) + # http://www.w3.org/TR/CSS2/syndata.html#uri + url_regex = /url\(\s*['"]?(?![a-z]+:)([^'"\)]*)['"]?\s*\)/ + + # Resolve paths in CSS file if it contains a url + if contents =~ url_regex + directory_path = Pathname.new(File.dirname(filename)) + .relative_path_from(Pathname.new('bower_components')) + + # Replace relative paths in URLs with Rails asset_path helper + new_contents = contents.gsub(url_regex) do |match| + relative_path = $1 + image_path = directory_path.join(relative_path).cleanpath + puts "#{match} => #{image_path}" + + "url(<%= asset_path '#{image_path}' %>)" + end + + # Replace CSS with ERB CSS file with resolved asset paths + FileUtils.rm(filename) + File.write(filename + '.erb', new_contents) + end end end