class Hanami::Assets::Configuration

Framework configuration

@since 0.1.0

Constants

DEFAULT_HOST

@since 0.1.0 @api private

DEFAULT_MANIFEST

@since 0.1.0 @api private

DEFAULT_PORT

@since 0.1.0 @api private

DEFAULT_PREFIX

@since 0.1.0 @api private

DEFAULT_PUBLIC_DIRECTORY

@since 0.1.0 @api private

DEFAULT_SCHEME

@since 0.1.0 @api private

DEFAULT_SUBRESOURCE_INTEGRITY_ALGORITHM

@since 0.3.0 @api private

HTTPS_PORT

@since 0.1.0 @api private

HTTPS_SCHEME

@since 0.1.0 @api private

HTTP_PORT

@since 0.1.0 @api private

HTTP_SCHEME

@since 0.1.0 @api private

SUBRESOURCE_INTEGRITY_SEPARATOR

@since 0.3.0 @api private

URL_SEPARATOR

@since 0.1.0 @api private

Attributes

cdn[W]

@since 0.1.0 @api private

compile[W]

@since 0.1.0 @api private

host[W]

@since 0.1.0 @api private

javascript_compressor[W]

@since 0.1.0 @api private

manifest[W]

@since 0.1.0 @api private

nested[W]

@since 1.3.1 @api private

port[W]

@since 0.1.0 @api private

prefix[W]

@since 0.1.0 @api private

public_directory[W]

@since 0.1.0 @api private

public_manifest[R]

@since 0.4.0 @api private

root[W]

@since 0.1.0 @api private

scheme[W]

@since 0.1.0 @api private

sources[W]

@since 0.1.0 @api private

stylesheet_compressor[W]

@since 0.1.0 @api private

subresource_integrity[W]

@since 0.3.0 @api private

Public Class Methods

for(base) click to toggle source

Return a copy of the configuration of the framework instance associated with the given class.

When multiple instances of Hanami::Assets are used in the same application, we want to make sure that a controller or an action will receive the expected configuration.

@param base [Class, Module] a controller or an action

@return [Hanami::Assets::Configuration] the configuration associated

to the given class.

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 84
def self.for(base)
  # TODO: this implementation is similar to Hanami::Controller::Configuration
  # consider to extract it into Hanami::Utils
  namespace = Utils::String.namespace(base)
  framework = Utils::Class.load("#{namespace}::Assets") || Utils::Class.load!("Hanami::Assets")
  framework.configuration
end
new(&blk) click to toggle source

Return a new instance

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

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 102
def initialize(&blk)
  reset!
  instance_eval(&blk) if block_given?
end

Public Instance Methods

asset_path(source) click to toggle source

Relative URL

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 425
def asset_path(source)
  if cdn
    asset_url(source)
  else
    compile_path(source)
  end
end
asset_url(source) click to toggle source

Absolute URL

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 437
def asset_url(source)
  "#{@base_url}#{compile_path(source)}"
end
base_directories() click to toggle source

@since 1.3.0

# File lib/hanami/assets/configuration.rb, line 404
def base_directories
  @base_directories ||= %w[
    stylesheets
    javascripts
    images
    fonts
  ]
end
cdn(value = nil) click to toggle source

CDN mode

Determine if the helpers should always generate absolute URL. This is useful in production mode.

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 168
def cdn(value = nil)
  if value.nil?
    @cdn
  else
    @cdn = !!value
  end
end
compile(value = nil) click to toggle source

Compile mode

Determine if compile assets from sources to destination. Usually this is turned off in production mode.

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 113
def compile(value = nil)
  if value.nil?
    @compile
  else
    @compile = value
  end
end
crossorigin?(source) click to toggle source

Check if the given source is linked via Cross-Origin policy. In other words, the given source, doesn't satisfy the Same-Origin policy.

@see en.wikipedia.org/wiki/Same-origin_policy#Origin_determination_rules @see en.wikipedia.org/wiki/Same-origin_policy#document.domain_property

@since 1.2.0 @api private

# File lib/hanami/assets/configuration.rb, line 449
def crossorigin?(source)
  !source.start_with?(@base_url)
end
css_compressor() click to toggle source

Load Stylesheet compressor

@return [Hanami::Assets::Compressors::Stylesheet] a compressor

@raise [Hanami::Assets::Compressors::UnknownCompressorError] when the

given name refers to an unknown compressor engine

@since 0.1.0 @api private

@see Hanami::Assets::Configuration#stylesheet_compressor @see Hanami::Assets::Compressors::Stylesheet#for

# File lib/hanami/assets/configuration.rb, line 508
def css_compressor
  require "hanami/assets/compressors/stylesheet"
  Hanami::Assets::Compressors::Stylesheet.for(stylesheet_compressor)
end
destination_directory() click to toggle source

Destination directory

It's the combination of public_directory and prefix.

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 357
def destination_directory
  @destination_directory ||= public_directory.join(*prefix.split(URL_SEPARATOR))
end
duplicate() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 515
def duplicate
  Configuration.new.tap do |c|
    c.root                  = root
    c.scheme                = scheme
    c.host                  = host
    c.port                  = port
    c.prefix                = prefix
    c.subresource_integrity = subresource_integrity
    c.cdn                   = cdn
    c.compile               = compile
    c.nested                = nested
    c.public_directory      = public_directory
    c.manifest              = manifest
    c.sources               = sources.dup
    c.javascript_compressor = javascript_compressor
    c.stylesheet_compressor = stylesheet_compressor
  end
end
files() click to toggle source

Application's assets

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 392
def files
  sources.files
end
find(file) click to toggle source

Find a file from sources

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 417
def find(file)
  @sources.find(file)
end
fingerprint(value = nil) click to toggle source

Fingerprint mode

Determine if the helpers should generate the fingerprinted path for an asset. Usually this is turned on in production mode.

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 127
def fingerprint(value = nil)
  if value.nil?
    @fingerprint
  else
    @fingerprint = value
  end
end
host(value = nil) click to toggle source

URL host for the application

This is used to generate absolute URL from helpers.

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 294
def host(value = nil)
  if value.nil?
    @host
  else
    @host = value
  end
end
javascript_compressor(value = nil) click to toggle source

JavaScript compressor

Determine which compressor to use for JavaScript files during deploy.

By default it's nil, that means it doesn't compress JavaScripts at deploy time.

It accepts a Symbol or an object that respond to #compress(file).

The following symbols are accepted:

* <tt>:builtin</tt> - Ruby based implementation of jsmin. It doesn't require any external gem.
* <tt>:yui</tt> - YUI Compressor, it depends on <tt>yui-compressor</tt> gem and it requires Java 1.4+
* <tt>:uglifier</tt> - UglifyJS, it depends on <tt>uglifier</tt> gem and it requires Node.js
* <tt>:closure</tt> - Google Closure Compiler, it depends on <tt>closure-compiler</tt> gem
                      and it requires Java

@param value [Symbol,#compress] the compressor

@since 0.1.0

@see yui.github.io/yuicompressor @see rubygems.org/gems/yui-compressor

@see lisperator.net/uglifyjs @see rubygems.org/gems/uglifier

@see developers.google.com/closure/compiler @see rubygems.org/gems/closure-compiler

@example YUI Compressor

require 'hanami/assets'

Hanami::Assets.configure do
  # ...
  javascript_compressor :yui
end.load!

@example Custom Compressor

require 'hanami/assets'

Hanami::Assets.configure do
  # ...
  javascript_compressor MyCustomJavascriptCompressor.new
end.load!
# File lib/hanami/assets/configuration.rb, line 220
def javascript_compressor(value = nil)
  if value.nil?
    @javascript_compressor
  else
    @javascript_compressor = value
  end
end
js_compressor() click to toggle source

Load Javascript compressor

@return [Hanami::Assets::Compressors::Javascript] a compressor

@raise [Hanami::Assets::Compressors::UnknownCompressorError] when the

given name refers to an unknown compressor engine

@since 0.1.0 @api private

@see Hanami::Assets::Configuration#javascript_compressor @see Hanami::Assets::Compressors::Javascript#for

# File lib/hanami/assets/configuration.rb, line 491
def js_compressor
  require "hanami/assets/compressors/javascript"
  Hanami::Assets::Compressors::Javascript.for(javascript_compressor)
end
load!() click to toggle source

Load the configuration

This MUST be executed before to accept the first HTTP request

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 565
def load!
  if (fingerprint || subresource_integrity) && manifest_path.exist?
    @public_manifest = Config::Manifest.new(
      JSON.parse(manifest_path.read),
      manifest_path
    )
  end

  @base_url = URI::Generic.build(scheme: scheme, host: host, port: url_port).to_s
end
manifest(value = nil) click to toggle source

Manifest path from public directory

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 364
def manifest(value = nil)
  if value.nil?
    @manifest
  else
    @manifest = value.to_s
  end
end
manifest_path() click to toggle source

Absolute manifest path

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 376
def manifest_path
  public_directory.join(manifest)
end
nested(value = nil) click to toggle source

Support for nested path

@since 1.3.1

# File lib/hanami/assets/configuration.rb, line 138
def nested(value = nil)
  if value.nil?
    @nested
  else
    @nested = !!value
  end
end
port(value = nil) click to toggle source

URL port for the application

This is used to generate absolute URL from helpers.

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 307
def port(value = nil)
  if value.nil?
    @port
  else
    @port = value.to_s
  end
end
prefix(value = nil) click to toggle source

URL port for the application

This is used to generate absolute or relative URL from helpers.

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 320
def prefix(value = nil)
  if value.nil?
    @prefix
  else
    @prefix = Utils::PathPrefix.new(value)
  end
end
public_directory(value = nil) click to toggle source

Application public directory

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 343
def public_directory(value = nil)
  if value.nil?
    @public_directory
  else
    @public_directory = Pathname.new(::File.expand_path(value))
  end
end
reset!() click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 536
def reset!
  @scheme                = DEFAULT_SCHEME
  @host                  = DEFAULT_HOST
  @port                  = DEFAULT_PORT

  @prefix                = Utils::PathPrefix.new(DEFAULT_PREFIX)
  @subresource_integrity = false
  @cdn                   = false
  @fingerprint           = false
  @compile               = false
  @nested                = false
  @base_url              = nil
  @destination_directory = nil
  @public_manifest       = Config::NullManifest.new(self)

  @javascript_compressor = nil
  @stylesheet_compressor = nil

  root             Dir.pwd
  public_directory root.join(DEFAULT_PUBLIC_DIRECTORY)
  manifest         DEFAULT_MANIFEST
end
root(value = nil) click to toggle source

Sources root

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 331
def root(value = nil)
  if value.nil?
    @root
  else
    @root = Pathname.new(value).realpath
    sources.root = @root
  end
end
scheme(value = nil) click to toggle source

URL scheme for the application

This is used to generate absolute URL from helpers.

@since 0.1.0

# File lib/hanami/assets/configuration.rb, line 281
def scheme(value = nil)
  if value.nil?
    @scheme
  else
    @scheme = value
  end
end
source(file) click to toggle source

@since 0.3.0 @api private

# File lib/hanami/assets/configuration.rb, line 398
def source(file)
  pathname = Pathname.new(file)
  pathname.absolute? ? pathname : find(file)
end
sources() click to toggle source

Application's assets sources

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 384
def sources
  @sources ||= Hanami::Assets::Config::Sources.new(root)
end
stylesheet_compressor(value = nil) click to toggle source

Stylesheet compressor

Determine which compressor to use for Stylesheet files during deploy.

By default it's nil, that means it doesn't compress Stylesheets at deploy time.

It accepts a Symbol or an object that respond to #compress(file).

The following symbols are accepted:

* <tt>:builtin</tt> - Ruby based compressor. It doesn't require any external gem.
                      It's fast, but not an efficient compressor.
* <tt>:yui</tt> - YUI-Compressor, it depends on <tt>yui-compressor</tt> gem and requires Java 1.4+
* <tt>:sass</tt> - Sass, it depends on <tt>sassc</tt> gem

@param value [Symbol,#compress] the compressor

@since 0.1.0

@see yui.github.io/yuicompressor @see rubygems.org/gems/yui-compressor

@see sass-lang.com @see rubygems.org/gems/sassc

@example YUI Compressor

require 'hanami/assets'

Hanami::Assets.configure do
  # ...
  stylesheet_compressor :yui
end.load!

@example Custom Compressor

require 'hanami/assets'

Hanami::Assets.configure do
  # ...
  stylesheet_compressor MyCustomStylesheetCompressor.new
end.load!
# File lib/hanami/assets/configuration.rb, line 268
def stylesheet_compressor(value = nil)
  if value.nil?
    @stylesheet_compressor
  else
    @stylesheet_compressor = value
  end
end
subresource_integrity(*values) click to toggle source

Subresource integrity mode

Determine if the helpers should generate the integrity attribute for an asset. Usually this is turned on in production mode.

@since 0.3.0

# File lib/hanami/assets/configuration.rb, line 152
def subresource_integrity(*values)
  if values.empty?
    @subresource_integrity
  elsif values.length == 1
    @subresource_integrity = values.first
  else
    @subresource_integrity = values
  end
end
subresource_integrity_algorithms() click to toggle source

An array of crypographically secure hashing algorithms to use for generating asset subresource integrity checks

@since 0.3.0

# File lib/hanami/assets/configuration.rb, line 457
def subresource_integrity_algorithms
  if @subresource_integrity == true
    [DEFAULT_SUBRESOURCE_INTEGRITY_ALGORITHM]
  else
    # Using Array() allows us to accept Array or Symbol, and '|| nil' lets
    # us return an empty array when @subresource_integrity is `false`
    Array(@subresource_integrity || nil)
  end
end
subresource_integrity_value(source) click to toggle source

Subresource integrity attribute

@since 0.3.0 @api private

# File lib/hanami/assets/configuration.rb, line 471
def subresource_integrity_value(source)
  return unless subresource_integrity

  public_manifest.subresource_integrity_values(
    prefix.join(source)
  ).join(SUBRESOURCE_INTEGRITY_SEPARATOR)
end

Private Instance Methods

compile_path(source) click to toggle source

@since 0.1.0 @api private

# File lib/hanami/assets/configuration.rb, line 638
def compile_path(source)
  result = prefix.join(source)
  result = public_manifest.target(result) if fingerprint
  result.to_s
end
url_port() click to toggle source

@since 0.1.0 @api private

rubocop:disable Style/MultilineTernaryOperator rubocop:disable Style/TernaryParentheses

# File lib/hanami/assets/configuration.rb, line 649
def url_port
  ((scheme == HTTP_SCHEME && port == HTTP_PORT) ||
    (scheme == HTTPS_SCHEME && port == HTTPS_PORT)) ? nil : port.to_i
end