module AssetSymlink

Constants

VERSION

Public Class Methods

execute(config) click to toggle source
# File lib/asset_symlink.rb, line 5
def self.execute config
  normalize_configuration(config).each do |private_name, public_name|
    asset = if !Rails.application.assets.nil?
      Rails.application.assets.find_asset(private_name).digest_path
    else
      manifest = if Sprockets::Railtie.respond_to?(:build_manifest)
        Sprockets::Railtie.build_manifest(Rails.application)
      else
        Rails.application.assets_manifest
      end
      manifest.assets[private_name]
    end
    digested_location = Rails.root.join('public','assets', asset)
    public_location = Rails.root.join('public','assets',public_name)
    if File.dirname(public_name) != '.'
      FileUtils.mkdir_p(File.dirname(public_location))
    end
    digested_location = digested_location.relative_path_from(public_location.dirname)
    FileUtils.ln_sf(digested_location, Rails.root.join('public','assets',public_name))
  end
end
normalize_configuration(config) click to toggle source
# File lib/asset_symlink.rb, line 28
def self.normalize_configuration config
  case config
  when :all
    result = {}
    manifest_file = Rails.application.config.assets.manifest
    if manifest_file.nil?
      raise ArgumentError, "please set config.assets.manifest = 'path/to/your/manifest.json'"
    end
    JSON.parse(File.read(manifest_file))["files"].map do |digested_name, value|
      [value['logical_path'], value['logical_path']]
    end.to_h
  when Hash
    config
  when String
    {config => config}
  when Array
    config.inject({}) do |result, element|
      result.merge(normalize_configuration(element))
    end
  when NilClass
    {}
  else
    raise ArgumentError, "unexpected item #{config} in config.asset_symlink"
  end
end