lib/nanoc/base/source_data/configuration.rb in nanoc-4.0.0b4 vs lib/nanoc/base/source_data/configuration.rb in nanoc-4.0.0rc1

- old
+ new

@@ -1,20 +1,106 @@ module Nanoc::Int # Represents the site configuration. # # @api private - class Configuration < ::Hash + class Configuration + NONE = Object.new + + # The default configuration for a data source. A data source's + # configuration overrides these options. + DEFAULT_DATA_SOURCE_CONFIG = { + type: 'filesystem', + items_root: '/', + layouts_root: '/', + config: {}, + identifier_type: 'full', + } + + # The default configuration for a site. A site's configuration overrides + # these options: when a {Nanoc::Int::Site} is created with a configuration + # that lacks some options, the default value will be taken from + # `DEFAULT_CONFIG`. + DEFAULT_CONFIG = { + text_extensions: %w( css erb haml htm html js less markdown md php rb sass scss txt xhtml xml coffee hb handlebars mustache ms slim rdoc ).sort, + lib_dirs: %w( lib ), + commands_dirs: %w( commands ), + output_dir: 'output', + data_sources: [{}], + index_filenames: ['index.html'], + enable_output_diff: false, + prune: { auto_prune: false, exclude: ['.git', '.hg', '.svn', 'CVS'] }, + string_pattern_type: 'glob', + } + # Creates a new configuration with the given hash. # # @param [Hash] hash The actual configuration hash - def initialize(hash) - replace(hash) + def initialize(hash = {}) + @wrapped = hash.__nanoc_symbolize_keys_recursively end + def with_defaults + new_wrapped = DEFAULT_CONFIG.merge(@wrapped) + new_wrapped[:data_sources] = new_wrapped[:data_sources].map do |ds| + DEFAULT_DATA_SOURCE_CONFIG.merge(ds) + end + + self.class.new(new_wrapped) + end + + def to_h + @wrapped + end + + def [](key) + @wrapped[key] + end + + def fetch(key, fallback = NONE, &_block) + @wrapped.fetch(key) do + if !fallback.equal?(NONE) + fallback + elsif block_given? + yield(key) + else + raise KeyError, "key not found: #{key.inspect}" + end + end + end + + def []=(key, value) + @wrapped[key] = value + end + + def merge(hash) + self.class.new(@wrapped.merge(hash.to_h)) + end + + def without(key) + self.class.new(@wrapped.reject { |k, _v| k == key }) + end + + def update(hash) + @wrapped.update(hash) + end + + def each + @wrapped.each { |k, v| yield(k, v) } + self + end + + def __nanoc_freeze_recursively + @wrapped.__nanoc_freeze_recursively + end + # Returns an object that can be used for uniquely identifying objects. # # @return [Object] An unique reference to this object def reference :config + end + + def inspect + "<#{self.class}>" end end end