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
Assets
cache
@since 0.1.0 @api private
# File lib/hanami/assets/compiler.rb, line 102 def self.cache @@cache ||= Assets::Cache.new # rubocop:disable Style/ClassVars end
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
@since 0.3.0 @api private
# File lib/hanami/assets/compiler.rb, line 92 def self.eligible?(_name) true end
@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
@since 0.3.0 @api private
# File lib/hanami/assets/compiler.rb, line 55 def self.inherited(subclass) super subclasses.add(subclass) end
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 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
@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
@since 0.1.0 @api private
# File lib/hanami/assets/compiler.rb, line 256 def cache self.class.cache end
@since 0.1.0 @api private
# File lib/hanami/assets/compiler.rb, line 241 def cache! cache.store(source, dependencies) end
@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
@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
@since 0.1.0 @api private
# File lib/hanami/assets/compiler.rb, line 235 def copy! write { source.binread } end
@since 0.3.0 @api private
# File lib/hanami/assets/compiler.rb, line 268 def dependencies nil end
@since 0.1.0 @api private
# File lib/hanami/assets/compiler.rb, line 152 def destination @destination ||= @configuration.destination_directory.join(destination_name) end
@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
@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
@since 0.1.0 @api private
# File lib/hanami/assets/compiler.rb, line 206 def exist? !source.nil? && source.exist? end
@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
@since 0.3.0 @api private
# File lib/hanami/assets/compiler.rb, line 213 def modified? !destination.exist? || cache.modified?(source) end
@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
@since 0.3.0 @api private
# File lib/hanami/assets/compiler.rb, line 262 def renderer Tilt.new(source) end
@since 0.1.0 @api private
# File lib/hanami/assets/compiler.rb, line 146 def source @source ||= @configuration.source(@name) end
@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