Sha256: 46a951521370f8b015ae401022446044664298972efb72c8caa9ba28bcf3bb4f

Contents?: true

Size: 2 KB

Versions: 2

Compression:

Stored size: 2 KB

Contents

require "shopify_cli/sed"

module ShopifyCLI
  class Changelog
    CHANGELOG_FILE = File.join(ShopifyCLI::ROOT, "CHANGELOG.md")

    def initialize
      load(File.read(CHANGELOG_FILE))
    end

    def update_version!(new_version)
      Sed.new.replace_inline(
        CHANGELOG_FILE,
        "## \\[Unreleased\\]",
        "## [Unreleased]\\n\\n## Version #{new_version}"
      )
    end

    def release_notes(version)
      changes[version].map do |change_category, changes|
        <<~CHANGES
          ### #{change_category}
          #{changes.map { |change| entry(**change) }.join("\n")}
        CHANGES
      end.join("\n")
    end

    def entry(pr_id:, desc:)
      "* [##{pr_id}](https://github.com/Shopify/shopify-cli/pull/#{pr_id}): #{desc}"
    end

    private

    def changes
      @changes ||= Hash.new do |h, k|
        h[k] = Hash.new do |h2, k2|
          h2[k2] = []
        end
      end
    end

    def load(log)
      state = :initial
      change_category = nil
      current_version = nil
      @remainder = ""
      log.each_line do |line|
        case state
        when :initial
          next unless line.chomp == "\#\# [Unreleased]"
          state = :unreleased
          current_version = "Unreleased"
        when :unreleased, :last_version
          if /\A\#\#\# (?<category>\w+)/ =~ line
            change_category = category
          elsif %r{\A\* \[\#(?<pr_id>\d+)\]\(https://github.com/Shopify/shopify-cli/pull/\d+\): (?<desc>.+)\n} =~ line
            changes[current_version][change_category] << { pr_id: pr_id, desc: desc }
          elsif /\A\#\# Version (?<version>\d+\.\d+\.\d+)/ =~ line
            current_version = version
            state =
              case state
              when :unreleased
                :last_version
              else
                :finished
              end
          elsif !line.match?(/\s*\n/)
            raise "Unrecognized line: #{line.inspect}"
          end
        when :finished
          @remainder << line
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
shopify-cli-2.15.2 lib/shopify_cli/changelog.rb
shopify-cli-2.15.1 lib/shopify_cli/changelog.rb