end_of_life 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e058c01c970e9fde4fdceeabde71c29a623374ef989987d5b5ab10e1e247ca4
4
- data.tar.gz: 58adcd9c3aa9fbf64b1adb7a7f2f68d1d551ee41925ff9f06c03ce9e21298448
3
+ metadata.gz: cb7c4804e17e676497b2cf43afed14a21bec731ff6ea5e16bfd708ffbb265488
4
+ data.tar.gz: efaec85105f37185a05e10cd489e4c47403ac6a530615c1900ae978033573142
5
5
  SHA512:
6
- metadata.gz: 87d59b8b0d1aa556bf0b2bc7295a617fe5890bb0056437c7728d497468a05df6b57150f13680ac0be0ae9a400d40d02dac05331a5999d59943bcce7821d767f9
7
- data.tar.gz: 38acbd80942af304503ec510b666f2b18ce1de8a728d92254c5fd3acd1393d6eadeb3c8e24aa1de242bc6a7f5243226a446a11e529c03d5e6443adcd571408a6
6
+ metadata.gz: 73bb63d650d73851b37e0286fb7a6e771286bb49c35f329d91e805d087ca65cf0b160f43fdcb95f1613275f5872594745fe584494ae1314f6ea3ea8cb9048e4e
7
+ data.tar.gz: 30fed354f3c6a6a5d42c515157d531c2123a225aca3e996bd4193a8d718fd7a1860f0a2b0053cd8354cb4f2b5184751a978439509098977bab5b5d6f61111882
data/CHANGELOG.md CHANGED
@@ -1,5 +1,111 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.0]
4
+
5
+ ### Added
6
+
7
+ - Allow excluding repositories from search. Due to a [limitation] on GitHub's API,
8
+ it's only possible to exclude up to five words.
9
+
10
+ ```sh
11
+ $ end_of_life --exclude=repo1,repo2
12
+ ```
13
+
14
+ [limitation]: https://docs.github.com/en/search-github/getting-started-with-searching-on-github/troubleshooting-search-queries#limitations-on-query-length
15
+
16
+ - Allow specifying the repo visibility on search:
17
+
18
+ ```sh
19
+ $ end_of_life --public-only
20
+ # or
21
+ $ end_of_life --private-only
22
+ ```
23
+
24
+ - Allow searching repositories inside organizations
25
+
26
+ ```sh
27
+ $ end_of_life --org org1
28
+
29
+ # It's also possible to search on multiple organizations
30
+ $ end_of_life --org org1,org2
31
+ ```
32
+
33
+ - Fetch EOL Ruby versions from endoflife.date API. This ensures we always use up-to-date data but keep the embedded JSON as a fallback.
34
+
35
+ - Allow users to specify the maximum number of days away a version can be from EOL. It defaults to 0.
36
+
37
+ ```sh
38
+ $ end_of_life --max-eol-days-away 90
39
+ ```
40
+
41
+ - Add search methods to RubyVersion
42
+
43
+ It's possible to query all EOL versions, or the latest one at any given time.
44
+
45
+ ```ruby
46
+ EndOfLife::RubyVersion.eol_versions_at(Date.today)
47
+ # =>
48
+ # [#<EndOfLife::RubyVersion:0x00007f9b1300d858
49
+ # @eol_date=#<Date: 2021-03-31 ((2459305j,0s,0n),+0s,2299161j)>,
50
+ # @version=Gem::Version.new("2.5.9")>,
51
+ # #<EndOfLife::RubyVersion:0x00007f9b1300cea8
52
+ # @eol_date=#<Date: 2020-03-31 ((2458940j,0s,0n),+0s,2299161j)>,
53
+ # @version=Gem::Version.new("2.4.10")>,
54
+ # #<EndOfLife::RubyVersion:0x00007f9b1300cb10
55
+ # @eol_date=#<Date: 2019-03-31 ((2458574j,0s,0n),+0s,2299161j)>,
56
+ # @version=Gem::Version.new("2.3.8")>,
57
+ # #<EndOfLife::RubyVersion:0x00007f9b1300c5e8
58
+ # @eol_date=#<Date: 2018-03-31 ((2458209j,0s,0n),+0s,2299161j)>,
59
+ # @version=Gem::Version.new("2.2.10")>,
60
+ # #<EndOfLife::RubyVersion:0x00007f9b1300c020
61
+ # @eol_date=#<Date: 2017-03-31 ((2457844j,0s,0n),+0s,2299161j)>,
62
+ # @version=Gem::Version.new("2.1.10")>,
63
+ # #<EndOfLife::RubyVersion:0x00007f9b112efbb8
64
+ # @eol_date=#<Date: 2016-02-24 ((2457443j,0s,0n),+0s,2299161j)>,
65
+ # @version=Gem::Version.new("2.0.0.pre.p648")>,
66
+ # #<EndOfLife::RubyVersion:0x00007f9b112ef028
67
+ # @eol_date=#<Date: 2015-02-23 ((2457077j,0s,0n),+0s,2299161j)>,
68
+ # @version=Gem::Version.new("1.9.3.pre.p551")>]
69
+
70
+ EndOfLife::RubyVersion.latest_eol # returns today's latest EOL version
71
+ # =>
72
+ # #<EndOfLife::RubyVersion:0x00007f9b1300d858
73
+ # @eol_date=#<Date: 2021-03-31 ((2459305j,0s,0n),+0s,2299161j)>,
74
+ # @version=Gem::Version.new("2.5.9")>
75
+
76
+ # returns the latest EOL version at a given date
77
+ EndOfLife::RubyVersion.latest_eol(at: Date.parse("2024-03-31"))
78
+ # =>
79
+ # #<EndOfLife::RubyVersion:0x00007f9b1300e7d0
80
+ # @eol_date=#<Date: 2024-03-31 ((2460401j,0s,0n),+0s,2299161j)>,
81
+ # @version=Gem::Version.new("3.0.3")>
82
+
83
+ EndOfLife::RubyVersion.new("3.0.0").eol?
84
+ # => false
85
+
86
+ EndOfLife::RubyVersion.new("3.0.0").eol?(at: Date.parse("2024-03-31"))
87
+ # => true
88
+ ```
89
+
90
+ - Using the methods above, we can check whether a Repository is using EOL Ruby versions.
91
+
92
+ ```ruby
93
+ # repo with Ruby 3.0 (which is not EOL today)
94
+ repo.eol_ruby?
95
+ # => false
96
+
97
+ repo.eol_ruby?(at: Date.parse("2024.04.04"))
98
+ # => true
99
+ ```
100
+
101
+ ### Changed
102
+
103
+ - `EndOfLife::RubyVersion::EOL` constant was removed in favor of `EndOfLife::RubyVersion.latest_eol` method.
104
+
105
+ ---
106
+
107
+ ## [0.2.0]
108
+
3
109
  ### Added
4
110
 
5
111
  - Allow searching a specific repository.
@@ -24,15 +130,19 @@ $ end_of_life --user=matz # searches on matz's repositories
24
130
 
25
131
  ### Changed
26
132
 
133
+ - Remove the 100 repo limit on GitHub API [#13](https://github.com/MatheusRich/end_of_life/pull/13)
134
+
27
135
  - Exit with -1 if EOL repos are present.
28
136
 
29
137
  - Upgrade `octokit` to v4.22, which fixes [a Faraday warning], so we can remove the dependency on the `warning` gem.
30
138
 
31
139
  [a faraday warning]: https://github.com/octokit/octokit.rb/pull/1359
32
140
 
33
- ## [0.1.0] - 2022-01-17
141
+ ## [0.1.0]
34
142
 
35
143
  - Initial release
36
144
 
37
- [unreleased]: https://github.com/MatheusRich/end_of_life/compare/v0.1.0...HEAD
145
+ [unreleased]: https://github.com/MatheusRich/end_of_life/compare/v0.3.0...HEAD
146
+ [0.3.0]: https://github.com/MatheusRich/end_of_life/releases/tag/v0.3.0
147
+ [0.2.0]: https://github.com/MatheusRich/end_of_life/releases/tag/v0.2.0
38
148
  [0.1.0]: https://github.com/MatheusRich/end_of_life/releases/tag/v0.1.0
data/Gemfile CHANGED
@@ -7,6 +7,9 @@ gemspec
7
7
 
8
8
  gem "climate_control", "~> 1.0.1"
9
9
  gem "rake", "~> 13.0"
10
- gem "rspec", "~> 3.0"
10
+ gem "rspec", "~> 3.10"
11
+ gem "rspec-mocks", "~> 3.10"
11
12
  gem "simplecov", "~> 0.21.2"
12
13
  gem "standard", "~> 1.6"
14
+ gem "vcr", "~> 6.0.0"
15
+ gem "webmock", "~> 3.13"
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- end_of_life (0.2.0)
4
+ end_of_life (0.3.0)
5
5
  dry-monads (~> 1.3)
6
- octokit (~> 4.0)
6
+ octokit (~> 4.22)
7
7
  pastel (~> 0.8.0)
8
8
  tty-spinner (~> 0.9.0)
9
9
  tty-table (~> 0.12.0)
@@ -16,6 +16,8 @@ GEM
16
16
  ast (2.4.2)
17
17
  climate_control (1.0.1)
18
18
  concurrent-ruby (1.1.9)
19
+ crack (0.4.5)
20
+ rexml
19
21
  diff-lcs (1.4.4)
20
22
  docile (1.4.0)
21
23
  dry-core (0.7.1)
@@ -46,6 +48,7 @@ GEM
46
48
  faraday-patron (1.0.0)
47
49
  faraday-rack (1.0.0)
48
50
  faraday-retry (1.0.3)
51
+ hashdiff (1.0.1)
49
52
  multipart-post (2.1.1)
50
53
  octokit (4.22.0)
51
54
  faraday (>= 0.9)
@@ -117,6 +120,11 @@ GEM
117
120
  tty-screen (~> 0.8)
118
121
  unicode-display_width (2.1.0)
119
122
  unicode_utils (1.4.0)
123
+ vcr (6.0.0)
124
+ webmock (3.13.0)
125
+ addressable (>= 2.3.6)
126
+ crack (>= 0.3.2)
127
+ hashdiff (>= 0.4.0, < 2.0.0)
120
128
 
121
129
  PLATFORMS
122
130
  x86_64-darwin-20
@@ -126,9 +134,12 @@ DEPENDENCIES
126
134
  climate_control (~> 1.0.1)
127
135
  end_of_life!
128
136
  rake (~> 13.0)
129
- rspec (~> 3.0)
137
+ rspec (~> 3.10)
138
+ rspec-mocks (~> 3.10)
130
139
  simplecov (~> 0.21.2)
131
140
  standard (~> 1.6)
141
+ vcr (~> 6.0.0)
142
+ webmock (~> 3.13)
132
143
 
133
144
  BUNDLED WITH
134
145
  2.3.4
data/README.md CHANGED
@@ -12,13 +12,14 @@ gem install end_of_life
12
12
 
13
13
  ## Usage
14
14
 
15
- 1. Set up a [GitHub access token];
15
+ 1. Set up a [GitHub access token][] (we recommend using a read-only token);
16
16
 
17
- [GitHub access token]: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token
17
+ [github access token]: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token
18
18
 
19
19
  2. Export the `GITHUB_TOKEN` environment variable or set it when calling `end_of_life`;
20
20
 
21
21
  3. Use the `end_of_life` command to list the repositories:
22
+
22
23
  ```sh
23
24
  $ GITHUB_TOKEN=something end_of_life # if your platform supports symlinks, you can use the `eol` command instead
24
25
  [✔] Fetching repositories...
@@ -33,15 +34,32 @@ Found 2 repositories using EOL Ruby (<= 2.5.9):
33
34
  └───┴──────────────────────────────────────────────┴──────────────┘
34
35
  ```
35
36
 
36
- ## How it works?
37
+ ### Options
38
+
39
+ There are some options to help you filter down the results:
40
+
41
+ ```
42
+ Usage: end_of_life [options]
43
+ --exclude=NAME,NAME2 Exclude repositories containing a certain word in its name. You can specify up to five words.
44
+ --public-only Searches only public repostories
45
+ --private-only Searches only private repostories
46
+ --repo, --repository=USER/REPO Searches a specific repostory
47
+ --org, --organization=ORG,ORG2 Searches within specific organizations
48
+ -u, --user=NAME Sets the user used on the repository search
49
+ --max-eol-days-away NUMBER Sets the maximum number of days away a version can be from EOL. It defaults to 0.
50
+ -v, --version Displays end_of_life version
51
+ -h, --help Displays this help
52
+ ```
53
+
54
+ ## How it works
37
55
 
38
56
  This gem fetches all your GitHub repositories that contain Ruby code, then
39
57
  searches for files that may have a Ruby version. Currently, those files are:
40
58
  `.ruby-version`, `Gemfile`, `Gemfile.lock`, and `.tool-version`. We parse these
41
59
  files and extract the minimum Ruby version used in the repository.
42
60
 
43
- The EOL Ruby version is defined statically in [this JSON file] provided by
44
- https://endoflife.date/. We plan to fetch their API endpoint in the future.
61
+ The EOL Ruby version is provided by https://endoflife.date/, with a file
62
+ [fallback].
45
63
 
46
64
  > **IMPORTANT:** To parse Gemfiles, we need to execute the code inside it. **Be
47
65
  > careful** because this may be a security risk. We plan to add a secure parser
@@ -49,7 +67,7 @@ https://endoflife.date/. We plan to fetch their API endpoint in the future.
49
67
 
50
68
  Some other limitations are listed on the [issues page].
51
69
 
52
- [this json file]: ./lib/end_of_life.json
70
+ [fallback]: ./lib/end_of_life.json
53
71
  [issues page]: https://github.com/MatheusRich/end_of_life/issues
54
72
 
55
73
  ## Development
data/Rakefile CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  require "bundler/gem_tasks"
4
4
  require "rspec/core/rake_task"
5
+ require "standard/rake"
5
6
 
6
7
  RSpec::Core::RakeTask.new(:spec)
7
8
 
8
- task default: :spec
9
+ task default: [:spec, :standard]
data/end_of_life.gemspec CHANGED
@@ -32,9 +32,9 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ["lib"]
34
34
 
35
- spec.add_dependency "octokit", "~> 4.0"
36
- spec.add_dependency "pastel", "~> 0.8.0"
37
35
  spec.add_dependency "dry-monads", "~> 1.3"
36
+ spec.add_dependency "octokit", "~> 4.22"
37
+ spec.add_dependency "pastel", "~> 0.8.0"
38
38
  spec.add_dependency "tty-spinner", "~> 0.9.0"
39
39
  spec.add_dependency "tty-table", "~> 0.12.0"
40
40
 
@@ -0,0 +1,55 @@
1
+ require "optparse"
2
+
3
+ module EndOfLife
4
+ module Options
5
+ def self.from(argv)
6
+ options = {max_eol_date: Date.today}
7
+
8
+ OptionParser.new do |opts|
9
+ options[:parser] = opts
10
+
11
+ opts.banner = "Usage: end_of_life [options]"
12
+
13
+ opts.on("--exclude=NAME,NAME2", Array, "Exclude repositories containing a certain word in its name. You can specify up to five words.") do |excludes|
14
+ options[:excludes] = excludes.first(5)
15
+ end
16
+
17
+ opts.on("--public-only", "Searches only public repostories") do
18
+ options[:visibility] = :public
19
+ end
20
+
21
+ opts.on("--private-only", "Searches only private repostories") do
22
+ options[:visibility] = :private
23
+ end
24
+
25
+ opts.on("--repo=USER/REPO", "--repository=USER/REPO", "Searches a specific repostory") do |repository|
26
+ options[:repository] = repository
27
+ end
28
+
29
+ opts.on("--org=ORG,ORG2...", "--organization=ORG,ORG2", Array, "Searches within specific organizations") do |organizations|
30
+ options[:organizations] = organizations
31
+ end
32
+
33
+ opts.on("-u NAME", "--user=NAME", "Sets the user used on the repository search") do |user|
34
+ options[:user] = user
35
+ end
36
+
37
+ opts.on("--max-eol-days-away NUMBER", "Sets the maximum number of days away a version can be from EOL. It defaults to 0.") do |days|
38
+ options[:max_eol_date] = Date.today + days.to_i.abs
39
+ end
40
+
41
+ opts.on("-v", "--version", "Displays end_of_life version") do
42
+ options[:command] = :version
43
+ end
44
+
45
+ opts.on("-h", "--help", "Displays this help") do
46
+ options[:command] = :help
47
+ end
48
+ end.parse!(argv)
49
+
50
+ options
51
+ rescue OptionParser::ParseError => e
52
+ {command: :print_error, error: e}
53
+ end
54
+ end
55
+ end
@@ -1,20 +1,18 @@
1
- require "dry-monads"
2
-
3
1
  module EndOfLife
4
2
  class Repository
5
3
  class << self
6
4
  include Dry::Monads[:result, :maybe]
7
5
 
8
- def fetch(language:, user:, repository: nil)
6
+ def fetch(options)
9
7
  github_client.bind do |github|
10
- user ||= github.user.login
11
- query = search_query_for(language: language, user: user, repository: repository)
8
+ github.auto_paginate = true
9
+ options[:user] ||= github.user.login
12
10
 
13
- response = github.search_repositories(query, per_page: 100)
14
- warn "Incomplete results: we only search 100 repos at a time" if response.incomplete_results
11
+ query = search_query_for(options)
12
+ items = github.search_repositories(query).items
15
13
 
16
14
  Success(
17
- response.items.map do |repo|
15
+ items.map do |repo|
18
16
  Repository.new(
19
17
  full_name: repo.full_name,
20
18
  url: repo.html_url,
@@ -29,17 +27,29 @@ module EndOfLife
29
27
 
30
28
  def github_client
31
29
  Maybe(ENV["GITHUB_TOKEN"])
32
- .to_result
33
30
  .fmap { |token| Octokit::Client.new(access_token: token) }
34
31
  .or { Failure("Please set GITHUB_TOKEN environment variable") }
35
32
  end
36
33
 
37
- def search_query_for(language:, user:, repository:)
38
- query = "language:#{language}"
39
- query += if repository
40
- " repo:#{repository}"
34
+ def search_query_for(options)
35
+ query = "language:ruby"
36
+
37
+ query += if options[:repository]
38
+ " repo:#{options[:repository]}"
39
+ elsif options[:organizations]
40
+ options[:organizations].map { |org| " org:#{org}" }.join
41
41
  else
42
- " user:#{user}"
42
+ " user:#{options[:user]}"
43
+ end
44
+
45
+ if options[:visibility]
46
+ query += " is:#{options[:visibility]}"
47
+ end
48
+
49
+ if options[:excludes]
50
+ words_to_exclude = options[:excludes].map { |word| "NOT #{word} " }.join
51
+
52
+ query += " #{words_to_exclude} in:name"
43
53
  end
44
54
 
45
55
  query
@@ -54,8 +64,8 @@ module EndOfLife
54
64
  @github_client = github_client
55
65
  end
56
66
 
57
- def eol_ruby?
58
- ruby_version&.eol?
67
+ def eol_ruby?(at: Date.today)
68
+ ruby_version&.eol?(at: at)
59
69
  end
60
70
 
61
71
  def ruby_version
@@ -1,3 +1,4 @@
1
+ require "net/http"
1
2
  require "rubygems"
2
3
  require_relative "ruby_version/parser"
3
4
 
@@ -5,28 +6,52 @@ module EndOfLife
5
6
  class RubyVersion
6
7
  include Comparable
7
8
 
8
- DB_PATH = File.join(__dir__, "../end_of_life.json")
9
+ class << self
10
+ include Dry::Monads[:try]
9
11
 
10
- EOL = File.read(DB_PATH)
11
- .then { |json| JSON.parse(json, symbolize_names: true) }
12
- .filter { |version| Date.parse(version[:eol]) <= Date.today }
13
- .map { |version| Gem::Version.new(version[:latest]) }
14
- .max
12
+ def from_file(file_name:, content:, parser: Parser)
13
+ parser.parse_file(file_name: file_name, content: content)
14
+ end
15
15
 
16
- def self.from_file(file_name:, content:, parser: Parser)
17
- parser.parse_file(file_name: file_name, content: content)
16
+ def eol_versions_at(date)
17
+ all_versions.filter { |version| version.eol_date <= date }
18
+ end
19
+
20
+ def latest_eol(at: Date.today)
21
+ eol_versions_at(at).max
22
+ end
23
+
24
+ private
25
+
26
+ EOL_API_URL = "https://endoflife.date/api/ruby.json"
27
+ DB_PATH = File.join(__dir__, "../end_of_life.json")
28
+
29
+ def all_versions
30
+ @all_versions ||= (fetch_end_of_life_api || load_file_fallback)
31
+ .then { |json| JSON.parse(json, symbolize_names: true) }
32
+ .map { |version| new(version[:latest], eol_date: Date.parse(version[:eol])) }
33
+ end
34
+
35
+ def fetch_end_of_life_api
36
+ Try { Net::HTTP.get URI(EOL_API_URL) }.value_or(nil)
37
+ end
38
+
39
+ def load_file_fallback
40
+ File.read(DB_PATH)
41
+ end
18
42
  end
19
43
 
20
- attr :version
44
+ attr :version, :eol_date
21
45
 
22
- def initialize(version_string)
46
+ def initialize(version_string, eol_date: nil)
23
47
  @version = Gem::Version.new(version_string)
48
+ @eol_date = eol_date
24
49
 
25
50
  freeze
26
51
  end
27
52
 
28
- def eol?
29
- @version <= EOL
53
+ def eol?(at: Date.today)
54
+ self <= RubyVersion.latest_eol(at: at)
30
55
  end
31
56
 
32
57
  def <=>(other)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EndOfLife
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/end_of_life.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "dry-monads"
3
4
  require "json"
4
5
  require "octokit"
5
- require "optparse"
6
+ require_relative "end_of_life/options"
6
7
  require_relative "end_of_life/repository"
7
8
  require_relative "end_of_life/ruby_version"
8
9
  require_relative "end_of_life/terminal_helper"
@@ -36,45 +37,19 @@ module EndOfLife
36
37
  end
37
38
 
38
39
  def check_eol_ruby_on_repositories(options)
39
- fetch_repositories(user: options[:user], repository: options[:repository])
40
- .fmap { |repositories| filter_repositories_with_end_of_life(repositories) }
41
- .fmap { |repositories| print_diagnose_for(repositories) }
40
+ fetch_repositories(options)
41
+ .fmap { |repositories| filter_repositories_with_end_of_life(repositories, max_eol_date: options[:max_eol_date]) }
42
+ .fmap { |repositories| print_diagnose_for(repositories, max_eol_date: options[:max_eol_date]) }
42
43
  .or { |error| puts "\n#{error_msg(error)}" }
43
44
  end
44
45
 
45
46
  def parse_options(argv)
46
- options = {}
47
-
48
- OptionParser.new do |opts|
49
- options[:parser] = opts
50
-
51
- opts.banner = "Usage: end_of_life [options]"
52
-
53
- opts.on("--repo=USER/REPO", "--repository=USER/REPO", "Searches a specific repostory") do |repository|
54
- options[:repository] = repository
55
- end
56
-
57
- opts.on("-u NAME", "--user=NAME", "Sets the user used on the repository search") do |user|
58
- options[:user] = user
59
- end
60
-
61
- opts.on("-v", "--version", "Displays end_of_life version") do
62
- options[:command] = :version
63
- end
64
-
65
- opts.on("-h", "--help", "Displays this help") do
66
- options[:command] = :help
67
- end
68
- end.parse!(argv)
69
-
70
- options
71
- rescue OptionParser::ParseError => e
72
- {command: :print_error, error: e}
47
+ Options.from(argv)
73
48
  end
74
49
 
75
- def fetch_repositories(user:, repository:)
50
+ def fetch_repositories(options)
76
51
  with_loading_spinner("Fetching repositories...") do |spinner|
77
- result = Repository.fetch(language: "ruby", user: user, repository: repository)
52
+ result = Repository.fetch(options)
78
53
 
79
54
  spinner.error if result.failure?
80
55
 
@@ -82,13 +57,13 @@ module EndOfLife
82
57
  end
83
58
  end
84
59
 
85
- def filter_repositories_with_end_of_life(repositories)
60
+ def filter_repositories_with_end_of_life(repositories, max_eol_date:)
86
61
  with_loading_spinner("Searching for EOL Ruby in repositories...") do
87
- repositories.filter { |repo| repo.eol_ruby? }
62
+ repositories.filter { |repo| repo.eol_ruby?(at: max_eol_date) }
88
63
  end
89
64
  end
90
65
 
91
- def print_diagnose_for(repositories)
66
+ def print_diagnose_for(repositories, max_eol_date:)
92
67
  puts
93
68
 
94
69
  if repositories.empty?
@@ -96,7 +71,7 @@ module EndOfLife
96
71
  return
97
72
  end
98
73
 
99
- puts "Found #{repositories.size} repositories using EOL Ruby (<= #{RubyVersion::EOL}):"
74
+ puts "Found #{repositories.size} repositories using EOL Ruby (<= #{RubyVersion.latest_eol(at: max_eol_date)}):"
100
75
  puts end_of_life_table(repositories)
101
76
  exit(-1)
102
77
  end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: end_of_life
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matheus Richard
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-26 00:00:00.000000000 Z
11
+ date: 2022-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: octokit
14
+ name: dry-monads
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
19
+ version: '1.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '4.0'
26
+ version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
- name: pastel
28
+ name: octokit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.8.0
33
+ version: '4.22'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.8.0
40
+ version: '4.22'
41
41
  - !ruby/object:Gem::Dependency
42
- name: dry-monads
42
+ name: pastel
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.3'
47
+ version: 0.8.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.3'
54
+ version: 0.8.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: tty-spinner
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +107,7 @@ files:
107
107
  - exe/eol
108
108
  - lib/end_of_life.json
109
109
  - lib/end_of_life.rb
110
+ - lib/end_of_life/options.rb
110
111
  - lib/end_of_life/repository.rb
111
112
  - lib/end_of_life/ruby_version.rb
112
113
  - lib/end_of_life/ruby_version/parser.rb