Sha256: ce7dfd842396f86e16ee8e2b35d27cf552643724c805dcc2a6cde6ace6271b43

Contents?: true

Size: 1.23 KB

Versions: 7

Compression:

Stored size: 1.23 KB

Contents

# frozen_string_literal: true

require "dry/monads"
require "versionaire"

module Milestoner
  module Commits
    # Calculates next version based on commit trailer version keys.
    class Versioner
      include Import[:git]
      include Dry::Monads[:result]

      using Versionaire::Cast

      DEFAULTS = {trailer_key: "Milestone", fallback: Versionaire::Version.new}.freeze

      def initialize(defaults: DEFAULTS, collector: Collector.new, **)
        @defaults = defaults
        @collector = collector
        super(**)
      end

      def call
        trailer_milestones.then { |milestones| bump milestones }
                          .value_or(fallback)
      end

      private

      attr_reader :defaults, :collector

      def trailer_milestones
        collector.call.value_or([]).each.with_object [] do |commit, values|
          commit.trailer_value_for(trailer_key).bind { |milestone| values.append milestone.to_sym }
        end
      end

      def bump milestones
        target = fallback.members.intersection(milestones).first
        git.tag_last.fmap { |tag| target ? Version(tag).bump(target) : fallback }
      end

      def trailer_key = defaults.fetch __method__

      def fallback = defaults.fetch __method__
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
milestoner-17.6.0 lib/milestoner/commits/versioner.rb
milestoner-17.5.0 lib/milestoner/commits/versioner.rb
milestoner-17.4.0 lib/milestoner/commits/versioner.rb
milestoner-17.3.0 lib/milestoner/commits/versioner.rb
milestoner-17.2.0 lib/milestoner/commits/versioner.rb
milestoner-17.1.0 lib/milestoner/commits/versioner.rb
milestoner-17.0.0 lib/milestoner/commits/versioner.rb