-
Notifications
You must be signed in to change notification settings - Fork 3
/
end_of_life.rb
93 lines (76 loc) · 2.42 KB
/
end_of_life.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# frozen_string_literal: true
require "async"
require "dry-monads"
require "json"
require "octokit"
require_relative "end_of_life/options"
require_relative "end_of_life/repository"
require_relative "end_of_life/ruby_version"
require_relative "end_of_life/terminal_helper"
require_relative "end_of_life/version"
module EndOfLife
extend TerminalHelper
class CLI
include TerminalHelper
def call(argv)
parse_options(argv)
.then { |options| execute_command(options) }
end
private
def execute_command(options)
case options[:command]
when :help
puts options[:parser]
when :version
puts "end_of_life v#{EndOfLife::VERSION}"
when :print_error
puts error_msg(options[:error])
exit(-1)
else
check_eol_ruby_on_repositories(options)
end
end
def check_eol_ruby_on_repositories(options)
fetch_repositories(options)
.fmap { |repositories| filter_repositories_with_end_of_life(repositories, max_eol_date: options[:max_eol_date]) }
.fmap { |repositories| print_diagnose_for(repositories, max_eol_date: options[:max_eol_date]) }
.or { |error| puts "\n#{error_msg(error)}" }
end
def parse_options(argv)
Options.from(argv)
end
def fetch_repositories(options)
with_loading_spinner("Fetching repositories...") do |spinner|
result = Repository.fetch(options)
spinner.error if result.failure?
result
end
end
def filter_repositories_with_end_of_life(repositories, max_eol_date:)
with_loading_spinner("Searching for EOL Ruby in repositories...") do
Sync do
repositories
.tap { |repos| repos.map { |repo| Async { repo.ruby_version } }.map(&:wait) }
.filter { |repo| repo.eol_ruby?(at: max_eol_date) }
end
end
end
def print_diagnose_for(repositories, max_eol_date:)
puts
if repositories.empty?
puts "No repositories using EOL Ruby."
return
end
puts "Found #{repositories.size} repositories using EOL Ruby (<= #{RubyVersion.latest_eol(at: max_eol_date)}):"
puts end_of_life_table(repositories)
exit(-1)
end
def end_of_life_table(repositories)
headers = ["", "Repository", "Ruby version"]
rows = repositories.map.with_index(1) do |repo, i|
[i, repo.url, repo.ruby_version]
end
table(headers, rows)
end
end
end