class Hanami::Assets::Bundler

Bundle assets from a single application.

@since 0.1.0 @api private

Bundle assets from a single application.

@since 0.1.0 @api private

Constants

DEFAULT_PERMISSIONS

@since 0.1.0 @api private

URL_REPLACEMENT

@since 0.1.0 @api private

URL_SEPARATOR

@since 0.1.0 @api private

Public Class Methods

new(configuration, duplicates) click to toggle source

Return a new instance

@param configuration [Hanami::Assets::Configuration] a single application configuration

@param duplicates [Array<Hanami::Assets>] the duplicated frameworks

(one for each application)

@return [Hanami::Assets::Bundler] a new instance

@since 0.1.0 @api private

# File lib/hanami/assets/bundler.rb, line 40
def initialize(configuration, duplicates)
  @manifest       = Hash[]
  @configuration  = configuration
  @duplicates     = duplicates
end

Public Instance Methods

run() click to toggle source

Start the process.

For each asset contained in the sources and third party gems, it will:

* Compress
* Create a fingerprinted version of the file
* Generate a subresource integrity digest

At the end it will generate a manifest

@see Hanami::Assets::Configuration#fingerprint @see Hanami::Assets::Configuration#manifest @see Hanami::Assets::Configuration#manifest_path

# File lib/hanami/assets/bundler.rb, line 59
def run
  assets.each do |path|
    unless File.directory?(path)
      configuration = _configuration_for(path)
      process(Asset.new(path, configuration))
    end
  end

  write_manifest_file
end

Private Instance Methods

_configuration_for(asset) click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/bundler.rb, line 130
def _configuration_for(asset)
  url = _convert_to_url(asset)

  configurations.find { |config| url.start_with?(config.prefix) } ||
    @configuration
end
_convert_to_url(path) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/bundler.rb, line 108
def _convert_to_url(path)
  path.sub(public_directory.to_s, URL_REPLACEMENT)
    .gsub(File::SEPARATOR, URL_SEPARATOR)
end
_set_permissions(path) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/bundler.rb, line 124
def _set_permissions(path)
  ::File.chmod(DEFAULT_PERMISSIONS, path)
end
_write(path, content) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/bundler.rb, line 115
def _write(path, content)
  Pathname.new(path).dirname.mkpath
  ::File.write(path, content)

  _set_permissions(path)
end
assets() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/bundler.rb, line 102
def assets
  Dir.glob("#{@configuration.destination_directory}#{::File::SEPARATOR}**#{::File::SEPARATOR}*")
end
compress_in_place!(asset) click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/bundler.rb, line 89
def compress_in_place!(asset)
  compressed = Compressor.new(asset.path, asset.configuration).compress
  _write(asset.path, compressed) unless compressed.nil?
end
configurations() click to toggle source

@since 0.4.0 @api private

# File lib/hanami/assets/bundler.rb, line 145
def configurations
  if @duplicates.empty?
    [@configuration]
  else
    @duplicates.map { |dup| dup.respond_to?(:configuration) ? dup.configuration : dup }
  end
end
copy_to_fingerprinted_location!(asset) click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/bundler.rb, line 82
def copy_to_fingerprinted_location!(asset)
  FileUtils.cp(asset.path, asset.fingerprinted_target)
  _set_permissions(asset.fingerprinted_target)
end
process(asset) click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/bundler.rb, line 74
def process(asset)
  compress_in_place!(asset)
  copy_to_fingerprinted_location!(asset)
  @manifest.merge!(ManifestEntry.new(asset).entry)
end
public_directory() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/bundler.rb, line 139
def public_directory
  @configuration.public_directory
end
write_manifest_file() click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/bundler.rb, line 96
def write_manifest_file
  _write(@configuration.manifest_path, JSON.dump(@manifest))
end