File: //usr/local/rvm/gems/ruby-2.5.9/gems/sprockets-4.0.2/lib/sprockets/exporters/base.rb
module Sprockets
module Exporters
# Convienence class for all exporters to inherit from
#
# An exporter is responsible for exporting a Sprockets::Asset
# to a file system. For example the Exporters::File class
# writes the asset to it's destination. The Exporters::Zlib class
# writes a gzip copy of the asset to disk.
class Base
attr_reader :asset, :environment, :directory, :target
# Public: Creates new instance
#
# Initialize will be called with
# keyword arguments:
#
# - asset: An instance of Sprockets::Asset.
# - environment: An instance of Sprockets::Environment.
# - directory: String representing the target directory to write to.
#
# These will all be stored as accessible values. In addition a
# +target+ will be available which is the target directory and
# the asset's digest path combined.
def initialize(asset: nil, environment: nil, directory: nil)
@asset = asset
@environment = environment
@directory = directory
@target = ::File.join(directory, asset.digest_path)
setup
end
# Public: Callback that is executed after intialization
#
# Any setup that needs to be done can be performed in the +setup+
# method. It will be called immediately after initialization.
def setup
end
# Public: Handles logic for skipping exporter and notifying logger
#
# The `skip?` will be called before anything will be written.
# If `skip?` returns truthy it will not continue. This method
# takes a `logger` that responds to +debug+ and +info+. The `skip?`
# method is the only place expected to write to a logger, any other
# messages may produce jumbled logs.
def skip?(logger)
false
end
# Public: Contains logic for writing "exporting" asset to disk
#
# If the exporter is not skipped it then Sprockets will execute it's
# `call` method. This method takes no arguments and should only use
# elements passed in via initialize or stored in `setup`.
def call
raise "Must subclass and implement call"
end
# Public: Yields a file that can be written to with the input
#
# `filename`. Defaults to the `target`. Method
# is safe to use in forked or threaded environments.
def write(filename = target)
FileUtils.mkdir_p File.dirname(filename)
PathUtils.atomic_write(filename) do |f|
yield f
end
end
end
end
end