class Bunto::StaticFile
Attributes
Public Class Methods
The cache of last modification times [path] -> mtime.
# File lib/bunto/static_file.rb, line 7 def mtimes @mtimes ||= {} end
Initialize a new StaticFile
.
site - The Site
. base - The String path to the <source>. dir - The String path between <source> and the file. name - The String filename of the file. rubocop: disable ParameterLists
# File lib/bunto/static_file.rb, line 23 def initialize(site, base, dir, name, collection = nil) @site = site @base = base @dir = dir @name = name @collection = collection @relative_path = File.join(*[@dir, @name].compact) @extname = File.extname(@name) data.default_proc = proc do |_, key| site.frontmatter_defaults.find(relative_path, type, key) end end
# File lib/bunto/static_file.rb, line 11 def reset_cache @mtimes = nil end
Public Instance Methods
# File lib/bunto/static_file.rb, line 110 def basename File.basename(name, extname) end
# File lib/bunto/static_file.rb, line 106 def data @data ||= {} end
Returns the front matter defaults defined for the file's URL
and/or type as defined in _config.yml.
# File lib/bunto/static_file.rb, line 146 def defaults @defaults ||= @site.frontmatter_defaults.all url, type end
Obtain destination path.
dest - The String path to the destination dir.
Returns destination file path.
# File lib/bunto/static_file.rb, line 48 def destination(dest) @site.in_dest_dir(*[dest, destination_rel_dir, @name].compact) end
# File lib/bunto/static_file.rb, line 52 def destination_rel_dir if @collection File.dirname(url) else @dir end end
Is source path modified?
Returns true if modified since last write.
# File lib/bunto/static_file.rb, line 72 def modified? self.class.mtimes[path] != mtime end
# File lib/bunto/static_file.rb, line 60 def modified_time @modified_time ||= File.stat(path).mtime end
Returns last modification time for this file.
# File lib/bunto/static_file.rb, line 65 def mtime modified_time.to_i end
Returns source file path.
# File lib/bunto/static_file.rb, line 39 def path File.join(*[@base, @dir, @name].compact) end
# File lib/bunto/static_file.rb, line 114 def placeholders { :collection => @collection.label, :path => relative_path[ @collection.relative_directory.size..relative_path.size], :output_ext => "", :name => "", :title => "", } end
# File lib/bunto/static_file.rb, line 102 def to_liquid @to_liquid ||= Drops::StaticFileDrop.new(self) end
Returns the type of the collection if present, nil otherwise.
# File lib/bunto/static_file.rb, line 140 def type @type ||= @collection.nil? ? nil : @collection.label.to_sym end
Applies a similar URL-building technique as Bunto::Document
that takes the collection's URL
template into account. The default URL
template can be overriden in the collection's configuration in _config.yml.
# File lib/bunto/static_file.rb, line 128 def url @url ||= if @collection.nil? relative_path else ::Bunto::URL.new({ :template => @collection.url_template, :placeholders => placeholders, }) end.to_s.gsub(%r!/$!, "") end
Write the static file to the destination directory (if modified).
dest - The String path to the destination dir.
Returns false if the file was not modified since last time (no-op).
# File lib/bunto/static_file.rb, line 89 def write(dest) dest_path = destination(dest) return false if File.exist?(dest_path) && !modified? self.class.mtimes[path] = mtime FileUtils.mkdir_p(File.dirname(dest_path)) FileUtils.rm(dest_path) if File.exist?(dest_path) copy_file(dest_path) true end
Whether to write the file to the filesystem
Returns true unless the defaults for the destination path from _config.yml contain `published: false`.
# File lib/bunto/static_file.rb, line 80 def write? defaults.fetch("published", true) end
Private Instance Methods
# File lib/bunto/static_file.rb, line 151 def copy_file(dest_path) if @site.safe || Bunto.env == "production" FileUtils.cp(path, dest_path) else FileUtils.copy_entry(path, dest_path) end unless File.symlink?(dest_path) File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path) end end