class Nanoc::Int::Store
An abstract superclass for classes that need to store data to the filesystem, such as checksums, cached compiled content and dependency graphs.
Each store has a version number. When attempting to load data from a store that has an incompatible version number, no data will be loaded, but {#version_mismatch_detected} will be called.
@abstract Subclasses must implement {#data} and {#data=}, and may
implement {#no_data_found} and {#version_mismatch_detected}.
@api private
Attributes
@return [String] The name of the file where data will be loaded from and
stored to.
@return [Numeric] The version number corresponding to the file format
the data is in. When the file format changes, the version number should be incremented.
Public Class Methods
Creates a new store for the given filename.
@param [String] filename The name of the file where data will be loaded
from and stored to.
@param [Numeric] version The version number corresponding to the file
format the data is in. When the file format changes, the version number should be incremented.
# File lib/nanoc/base/repos/store.rb, line 32 def initialize(filename, version) @filename = filename @version = version end
Public Instance Methods
@return The data that should be written to the disk
@abstract This method must be implemented by the subclass.
# File lib/nanoc/base/repos/store.rb, line 42 def data raise NotImplementedError.new('Nanoc::Int::Store subclasses must implement #data and #data=') end
@param new_data The data that has been loaded from the disk
@abstract This method must be implemented by the subclass.
@return [void]
# File lib/nanoc/base/repos/store.rb, line 51 def data=(new_data) # rubocop:disable Lint/UnusedMethodArgument raise NotImplementedError.new('Nanoc::Int::Store subclasses must implement #data and #data=') end
Loads the data from the filesystem into memory. This method will set the
loaded data using the {#data=} method.
@return [void]
# File lib/nanoc/base/repos/store.rb, line 59 def load # Check file existance unless File.file?(filename) no_data_found return end begin pstore.transaction do # Check version if pstore[:version] != version version_mismatch_detected return end # Load self.data = pstore[:data] end rescue FileUtils.rm_f(filename) load end end
Callback method that is called when no data file was found. By default, this implementation does nothing, but it should probably be overridden by the subclass.
@return [void]
# File lib/nanoc/base/repos/store.rb, line 103 def no_data_found end
Stores the data contained in memory to the filesystem. This method will
use the {#data} method to fetch the data that should be written.
@return [void]
# File lib/nanoc/base/repos/store.rb, line 87 def store FileUtils.mkdir_p(File.dirname(filename)) pstore.transaction do pstore[:data] = data pstore[:version] = version end end
Callback method that is called when a version mismatch is detected. By default, this implementation does nothing, but it should probably be overridden by the subclass.
@return [void]
# File lib/nanoc/base/repos/store.rb, line 111 def version_mismatch_detected end
Private Instance Methods
# File lib/nanoc/base/repos/store.rb, line 116 def pstore @pstore ||= PStore.new(filename) end