Sha256: e4161607538f0d718d5bf4cd6e4870392e745a3c11e4e8c75b8f932378562c18

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

require 'yaml'
require 'json'

module Middleman
  module CoreExtensions
    module Data
      # Load data files
      class FileLoader
        # No parser available
        class NoFileLoaderFoundError < StandardError; end

        # Load yaml files
        class YamlFileLoader
          def match?(file)
            %w(.yaml .yml).include? File.extname(file)
          end

          # @param [Pathname] file
          def load(file)
            YAML.load_file(file)
          rescue Psych::SyntaxError, StandardError => e
            $stderr.puts %(Loading data file "#{file}" failed due to an error: #{e.message})
            {}
          end
        end

        # Load json files
        class JsonFileLoader
          def match?(file)
            '.json' == File.extname(file)
          end

          # @param [Pathname] file
          def load(file)
            JSON.parse(file.read)
          rescue => e
            $stderr.puts %(Loading data file "#{file}" failed due to an error: #{e.message})
            {}
          end
        end

        # Default loader
        #
        # Always fails
        class NilFileLoader
          def match?(file)
            raise NoFileLoaderFoundError
          end
        end

        private

        attr_reader :loaders

        public

        def initialize
          @loaders = []
          @loaders << YamlFileLoader.new
          @loaders << JsonFileLoader.new
          @loaders << NilFileLoader.new
        end

        # Load file using loader
        def load(file)
          loaders.find { |l| l.match? file }.load(file)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
middleman-core-3.4.1 lib/middleman-core/core_extensions/data/file_loader.rb