class Hanami::Assets::Compiler

Assets compiler

It compiles assets that needs to be preprocessed (eg. Sass or ES6) into the destination directory.

Vanilla javascripts or stylesheets are just copied over.

@since 0.1.0 @api private

Constants

COMPILE_PATTERN

@since 0.1.0 @api private

DEFAULT_PERMISSIONS

@since 0.1.0 @api private

EXTENSIONS

@since 0.1.0 @api private

Public Class Methods

cache() click to toggle source

Assets cache

@since 0.1.0 @api private

@see Hanami::Assets::Cache

# File lib/hanami/assets/compiler.rb, line 102
def self.cache
  @@cache ||= Assets::Cache.new # rubocop:disable Style/ClassVars
end
compile(configuration, name) click to toggle source

Compile the given asset

@param configuration [Hanami::Assets::Configuration] the application

configuration associated with the given asset

@param name [String] the asset path

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 69
def self.compile(configuration, name)
  return unless configuration.compile

  require "tilt"
  require "hanami/assets/cache"
  require "hanami/assets/compilers/sass"
  require "hanami/assets/compilers/less"
  fabricate(configuration, name).compile
end
eligible?(_name) click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 92
def self.eligible?(_name)
  true
end
fabricate(configuration, name) click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 81
def self.fabricate(configuration, name)
  source = configuration.source(name)
  engine = (subclasses + [self]).find do |klass|
    klass.eligible?(source)
  end

  engine.new(configuration, name)
end
inherited(subclass) click to toggle source

@since 0.3.0 @api private

Calls superclass method
# File lib/hanami/assets/compiler.rb, line 55
def self.inherited(subclass)
  super
  subclasses.add(subclass)
end
new(configuration, name) click to toggle source

Return a new instance

@param configuration [Hanami::Assets::Configuration] the application

configuration associated with the given asset

@param name [String] the asset path

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

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 117
def initialize(configuration, name)
  @configuration = configuration
  @name          = Pathname.new(name)
end

Public Instance Methods

compile() click to toggle source

Compile the asset

@raise [Hanami::Assets::MissingAsset] if the asset can't be found in

sources

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 129
def compile
  raise MissingAsset.new(@name, @configuration.sources) unless exist?
  return unless modified?

  if compile?
    compile!
  else
    copy!
  end

  cache!
end

Private Instance Methods

absolute_destination_name() click to toggle source

@since 1.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 171
def absolute_destination_name
  result = ::File.basename(@name)
  @configuration.sources.each do |source|
    if @name.to_s.start_with?(source.to_s)
      result = @name.relative_path_from(source)
      break
    end
  end
  relative_destination_name(name: Pathname.new(result), add_prefix: false)
end
cache() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 256
def cache
  self.class.cache
end
cache!() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 241
def cache!
  cache.store(source, dependencies)
end
compile!() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 227
def compile!
  write { renderer.render }
rescue RuntimeError
  raise UnknownAssetEngine.new(source)
end
compile?() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 220
def compile?
  @compile ||= ::File.fnmatch(COMPILE_PATTERN, ::File.basename(source.to_s)) &&
               !EXTENSIONS[::File.extname(source.to_s)]
end
copy!() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 235
def copy!
  write { source.binread }
end
dependencies() click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 268
def dependencies
  nil
end
destination() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 152
def destination
  @destination ||= @configuration.destination_directory.join(destination_name)
end
destination_name() click to toggle source

@since 1.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 184
def destination_name
  result = destination_path

  if compile?
    result.scan(/\A[[[:alnum:]][\-\_]]*\.[[\w]]*/).first || result
  else
    result
  end
end
destination_path() click to toggle source

@since 1.3.1 @api private

# File lib/hanami/assets/compiler.rb, line 196
def destination_path
  if @configuration.nested
    @name.relative? ? relative_destination_name : absolute_destination_name
  else
    ::File.basename(@name)
  end.to_s
end
exist?() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 206
def exist?
  !source.nil? &&
    source.exist?
end
load_paths() click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 274
def load_paths
  result = []

  @configuration.sources.each do |source|
    Find.find(source) do |path|
      result << path if File.directory?(path)
    end
  end

  result
end
modified?() click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 213
def modified?
  !destination.exist? ||
    cache.modified?(source)
end
relative_destination_name(name: @name, add_prefix: true) click to toggle source

@since 1.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 158
def relative_destination_name(name: @name, add_prefix: true)
  result = name.to_s
  base_dir = @configuration.base_directories.detect { |dir| result.start_with?(dir) }
  if base_dir
    prefix = @configuration.prefix
    base_dir = prefix.join(base_dir) if add_prefix
    result = name.relative_path_from(Pathname.new(base_dir))
  end
  result
end
renderer() click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/compiler.rb, line 262
def renderer
  Tilt.new(source)
end
source() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 146
def source
  @source ||= @configuration.source(@name)
end
write() { || ... } click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/compiler.rb, line 247
def write
  destination.dirname.mkpath
  destination.open(File::WRONLY | File::TRUNC | File::CREAT | File::BINARY, DEFAULT_PERMISSIONS) do |file|
    file.write(yield)
  end
end