kyletolle/everything-core

View on GitHub
lib/everything/piece/metadata.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'fileutils'
require 'yaml'

module Everything
  class Piece
    class Metadata
      extend Forwardable

      # TODO: Need to add some ways in here to save the metadata file once it's
      # been edited.
      # TODO: Also add a #to_s or #inspect methods to render the raw_yaml
      # TODO: Also add a #[]= here that delegates to raw_yaml as well.

      def initialize(piece_path)
        @piece_path = piece_path
      end

      def absolute_dir
        @absolute_dir ||= Everything.path.join(dir)
      end

      def absolute_path
        @absolute_path ||= absolute_dir.join(file_name)
      end

      def dir
        @dir ||= calculated_dir
      end

      def file_path
        # TODO: Could try a deprecation approach like http://seejohncode.com/2012/01/09/deprecating-methods-in-ruby/
        deprecation_message = "Piece Metadata's #file_path is deprecated and will be removed soon. Use #absolute_path instead."
        warn deprecation_message
        @file_path ||= File.join(piece_path, file_name)
      end

      def path
        @path ||= dir.join(file_name)
      end

      def raw_yaml
        @raw_yaml ||= YAML.load_file(absolute_path)
      end

      def raw_yaml=(value)
        @raw_yaml = value
      end

      def save
        FileUtils.mkdir_p(piece_path)

        absolute_path.write(@raw_yaml)
      end

      def_delegators :raw_yaml, :[]

    private
      attr_reader :piece_path

      def file_name
        'index.yaml'
      end

      def calculated_dir
        full_pathname = Pathname.new(piece_path)
        _relative_pathname = full_pathname.relative_path_from(Everything.path)
      end
    end
  end
end