Sha256: 84553cd2a8dc3d3c0bacbbf69fb7a21b8b05573417e30280989d12c5aee4dfe5

Contents?: true

Size: 1.84 KB

Versions: 2

Compression:

Stored size: 1.84 KB

Contents

# frozen_string_literal: true

module Geet
  module Services
    class ListMilestones
      def initialize(repository, out: $output)
        @repository = repository
        @out = out
      end

      def execute
        milestones = find_milestones
        issues_by_milestone_number = find_milestone_issues(milestones)

        @out.puts

        milestones.each do |milestone|
          @out.puts milestone_description(milestone)

          milestone_issues = issues_by_milestone_number[milestone.number]

          milestone_issues.each do |issue|
            @out.puts "  #{issue.number}. #{issue.title} (#{issue.link})"
          end
        end
      end

      private

      # Not included in the Milestone class because descriptions (which will be customizable)
      # are considered formatters, conceptually external to the class.
      def milestone_description(milestone)
        description = "#{milestone.number}. #{milestone.title}"
        description += " (due #{milestone.due_on})" if milestone.due_on
        description
      end

      def find_milestones
        @out.puts 'Finding milestones...'

        @repository.milestones
      end

      def find_milestone_issues(milestones)
        @out.puts 'Finding issues...'

        # Interestingly, on MRI, concurrent hash access is not a problem without mutex,
        # since due to the GIL, only one thread at a time will actually access it.
        issues_by_milestone_number = {}
        mutex = Mutex.new

        issue_threads = milestones.map do |milestone|
          Thread.new do
            issues = @repository.abstract_issues(milestone: milestone.number)

            mutex.synchronize do
              issues_by_milestone_number[milestone.number] = issues
            end
          end
        end

        issue_threads.map(&:join)

        issues_by_milestone_number
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
geet-0.3.3 lib/geet/services/list_milestones.rb
geet-0.3.2 lib/geet/services/list_milestones.rb