lib/memoria/configuration.rb
require 'memoria/errors'
module Memoria
# Stores the configuration of the gem.
class Configuration
# The only allowed snapshot record modes.
VALID_SNAPSHOT_RECORD_MODES = %i[all new_episodes none].freeze
# @return [String] Directory where the snapshots will be saved
# @api public
#
attr_accessor :snapshot_directory
# @return [String] The way the snapshots are recorded.
# @api public
#
attr_reader :snapshot_record_mode
# @return [String] File extension of new snapshots.
# @api public
#
attr_reader :snapshot_extension
# Creates an instance of the configuration.
#
# @example
# configuration = Memoria::Configuration.new
#
# @return [Configuration] An instance of +Configuration+.
#
# @api public
#
def initialize
self.snapshot_extension = 'snap'
self.snapshot_record_mode = :new_episodes
end
# Sets the extension for new snapshots.
#
# @param [Symbol] snapshot_extension The new snapshot extension.
# @raise [Errors::InvalidSnapshotExtension] If the snapshot extension is not valid.
#
# @return [String] The given snapshot extension.
#
# @api public
#
def snapshot_extension=(snapshot_extension)
validate_snapshot_extension(snapshot_extension)
@snapshot_extension = snapshot_extension
end
# Sets the snapshot record mode. TODO
#
# @param [Symbol] record_mode The new snapshot record mode.
# @raise [Errors::InvalidRecordMode] If record mode is not one of +VALID_SNAPSHOT_RECORD_MODES+
#
# @return [String] The given snapshot extension.
#
# @api public
#
def snapshot_record_mode=(record_mode)
validate_record_mode(record_mode)
@snapshot_record_mode = record_mode
end
# Adds a new setting with the given +name+.
#
# @example Configuring a setting directly.
# configuration = Memoria::Configuration
# configuration.add_setting(:now) do
# Time.now
# end
#
# @example Configuring a setting through Memoria's DSL.
# Memoria.configure do |config|
# config.add_setting(:now) do
# Time.now
# end
# end
#
# @param [Symbol] name The name of the setting.
# @param [Symbol] block The block to be executed when the setting is called.
# @raise [Errors::DuplicateSetting] If there is already a setting defined with that name.
#
# @return [Symbol] The name of the setting
#
# @api public
#
def add_setting(name, &block)
validate_setting_existence(name)
define_singleton_method(name, block)
end
private
# Checks if there is a setting already defined with the given +setting_name.
def validate_setting_existence(setting_name)
error_message = "There is already a setting defined with the name #{setting_name}"
raise Errors::DuplicateSetting, error_message if respond_to?(setting_name)
end
# Checks if the snapshot record mode is one of the modes declared in +VALID_SNAPSHOT_RECORD_MODES+.
def validate_record_mode(record_mode)
raise Errors::InvalidRecordMode unless VALID_SNAPSHOT_RECORD_MODES.include?(record_mode.to_sym)
end
# Checks if the snapshot extension is valid.
def validate_snapshot_extension(snapshot_extension)
raise Errors::InvalidSnapshotExtension unless snapshot_extension =~ /^[a-zA-Z0-9]+$/
end
end
end