class Milestoner::Commits::Categorizer

Retrieves and categorizes Git repository commit tagged or untagged history.

def call configuration = Container[:configuration]

def call configuration = Container[:configuration]
  categories = configuration.commit_categories.pluck :label
  categories.reduce({}) { |group, prefix| group.merge prefix => [] }
            .merge("Unknown" => [])
            .then { |groups| group_by_category categories, groups }
            .each_value { |commits| commits.sort_by!(&:subject) }
            .values
            .flatten
end

def group_by_category categories, groups

def group_by_category categories, groups
  collector.call.value_or([]).each.with_object groups do |commit, collection|
    category = commit.subject[subject_pattern(categories)]
    key = collection.key?(category) ? category : "Unknown"
    collection[key] << commit
  end
end

def initialize(collector: Collector.new, expression: Regexp, **)

def initialize(collector: Collector.new, expression: Regexp, **)
  @collector = collector
  @expression = expression
  super(**)
end

def subject_pattern categories

def subject_pattern categories
  categories.empty? ? expression.new(//) : expression.union(categories)
end