class Nanoc::Core::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

filename[R]

@return [String] The name of the file where data will be loaded from and

stored to.
version[R]

@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

new(filename, version) click to toggle source

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/core/store.rb, line 37
def initialize(filename, version)
  @filename = filename
  @version  = version
end
tmp_path_for(store_name:, config:) click to toggle source
# File lib/nanoc/core/store.rb, line 45
def self.tmp_path_for(store_name:, config:)
  File.absolute_path(
    File.join(tmp_path_prefix(config.output_dir), store_name),
    config.dir,
  )
end
tmp_path_prefix(output_dir) click to toggle source
# File lib/nanoc/core/store.rb, line 53
def self.tmp_path_prefix(output_dir)
  dir = Digest::SHA1.hexdigest(output_dir)[0..12]
  File.join('tmp', 'nanoc', dir)
end

Public Instance Methods

data() click to toggle source

@return The data that should be written to the disk

@abstract This method must be implemented by the subclass.

# File lib/nanoc/core/store.rb, line 63
def data
  raise NotImplementedError.new('Nanoc::Core::Store subclasses must implement #data and #data=')
end
data=(new_data) click to toggle source

@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/core/store.rb, line 72
def data=(new_data) # rubocop:disable Lint/UnusedMethodArgument
  raise NotImplementedError.new('Nanoc::Core::Store subclasses must implement #data and #data=')
end
load() click to toggle source

Loads the data from the filesystem into memory. This method will set the

loaded data using the {#data=} method.

@return [void]

# File lib/nanoc/core/store.rb, line 80
def load
  return unless File.file?(filename)

  begin
    pstore.transaction do
      return if pstore[:version] != version

      self.data = pstore[:data]
    end
  rescue
    FileUtils.rm_f(filename)
    load
  end
end
store() click to toggle source

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/core/store.rb, line 99
def store
  FileUtils.mkdir_p(File.dirname(filename))

  pstore.transaction do
    pstore[:data]    = data
    pstore[:version] = version
  end
end

Private Instance Methods

pstore() click to toggle source
# File lib/nanoc/core/store.rb, line 110
def pstore
  @pstore ||= PStore.new(filename)
end