usernam3/meta_commit

View on GitHub
lib/meta_commit/changelog/adapters/changelog.rb

Summary

Maintainability
A
25 mins
Test Coverage
module MetaCommit::Changelog
  module Adapters
    # Adapter class to write repository changes to changelog file
    class Changelog
      VERSION_DELIMITER="\n\n\n"
      VERSION_HEADER_REGEX = /(## \[.*?\] - \d{4}-\d{2}-\d{2})/m

      attr_accessor :path, :filename, :tag, :date

      # @param [String] path
      # @param [String] filename
      # @param [String] tag version
      # @param [String] date of version release
      def initialize(path, filename, tag, date)
        @path=path
        @filename=filename
        @tag=tag
        @date=date
      end

      # Builds changelog message and adds it after description text and before latest version
      # @param repo
      # @param [Array<MetaCommit::Contracts::Diff>] diffs
      # @return [String]
      def write_repository_change_chunk(repo, diffs)
        message_builder = changelog_message_builder(@tag, @date)
        diffs.each do |diff|
          message_builder.add_to_added(diff.string_representation) if diff.type_addition?
          message_builder.add_to_removed(diff.string_representation) if diff.type_deletion?
          message_builder.add_to_changed(diff.string_representation) if diff.type_replace?
        end
        prepend_to_changelog(message_builder.build)
      end

      # @return [String] path to changelog file
      def changelog_path
        File.join(@path, @filename)
      end

      private :changelog_path

      # @param [String] version
      # @param [String] date
      # @return [MetaCommit::Services::KeepAChangelogVerReportBuilder]
      def changelog_message_builder(version, date)
        MetaCommit::Changelog::Formatters::KeepAChangelogVerReportBuilder.new(version, date)
      end

      private :changelog_message_builder

      # @param [String] text
      # @return [String]
      def prepend_to_changelog(text)
        current_changelog_content = read_from_changelog
        current_changelog_parts = current_changelog_content.split(VERSION_HEADER_REGEX)

        if starts_with_description(current_changelog_parts)
          new_changelog_parts = [current_changelog_parts[0]] + [text, "#{VERSION_DELIMITER}"] + current_changelog_parts[1..-1]
        else
          new_changelog_parts = [text, "#{VERSION_DELIMITER}"] + current_changelog_parts
        end

        write_to_changelog(new_changelog_parts.join)
      end

      private :prepend_to_changelog

      # @return [String] changelog file content
      def read_from_changelog
        File.read(changelog_path)
      end

      private :read_from_changelog

      # @param [String] text content to write to changelog file
      # @return [String]
      def write_to_changelog(text)
        File.open(changelog_path, 'w').write(text)
        text
      end

      private :write_to_changelog

      # @param [Array<String>] changelog_parts content sections from changelog
      # @return [Boolean]
      def starts_with_description(changelog_parts)
        return false if changelog_parts.empty?
        changelog_parts[0].match(VERSION_HEADER_REGEX).nil?
      end

      private :starts_with_description
    end
  end
end