still_active 0.1.1 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/isolated_execution_state"
3
4
  require "active_support/core_ext/integer/time"
4
5
 
5
6
  module StillActive
@@ -11,9 +12,9 @@ module StillActive
11
12
  return StillActive.config.unsure_emoji if most_recent_activity.nil?
12
13
 
13
14
  case most_recent_activity
14
- when (StillActive.config.safe_range_end.years.ago)..(Time.now)
15
+ when (StillActive.config.no_warning_range_end.years.ago)..(Time.now)
15
16
  ""
16
- when (StillActive.config.warning_range_end.years.ago)..(StillActive.config.safe_range_end.years.ago)
17
+ when (StillActive.config.warning_range_end.years.ago)..(StillActive.config.no_warning_range_end.years.ago)
17
18
  StillActive.config.warning_emoji
18
19
  else
19
20
  StillActive.config.critical_warning_emoji
@@ -36,7 +36,7 @@ module StillActive
36
36
  last_commit_date = data.dig(:last_commit_date)
37
37
  last_commit_url = repository_url
38
38
 
39
- inactive_repository_emoji = data.dig(:last_activity_worrying_emoji)
39
+ inactive_repository_emoji = data.dig(:last_activity_warning_emoj)
40
40
  using_latest_version_emoji = data.dig(:up_to_date_emoji)
41
41
 
42
42
  formatted_name = markdown_url(text: gem_name, url: repository_url)
@@ -2,6 +2,8 @@
2
2
 
3
3
  module StillActive
4
4
  module VersionHelper
5
+ extend self
6
+
5
7
  def find_version(versions:, version_string: nil, pre_release: false)
6
8
  if version_string && pre_release
7
9
  versions&.find { |v| v["number"] == version_string && v["prerelease"] == pre_release }
@@ -6,7 +6,6 @@ require_relative "../helpers/emoji_helper"
6
6
  require_relative "../helpers/markdown_helper"
7
7
  require_relative "../helpers/version_helper"
8
8
  require_relative "workflow"
9
- require "debug"
10
9
  # require "cli/ui"
11
10
 
12
11
  module StillActive
@@ -28,12 +27,12 @@ module StillActive
28
27
  puts MarkdownHelper.markdown_table_header_line
29
28
  result.keys.sort.each do |name|
30
29
  result[name].merge!({
31
- last_activity_worrying_emoji: EmojiHelper.inactive_gem_emoji(result[name]),
30
+ last_activity_warning_emoj: EmojiHelper.inactive_gem_emoji(result[name]),
32
31
  up_to_date_emoji: EmojiHelper.using_latest_emoji(
33
- using_last_release: up_to_date?(
32
+ using_last_release: VersionHelper.up_to_date?(
34
33
  version_used: result[name].dig(:version_used), latest_version: result[name].dig(:latest_version)
35
34
  ),
36
- using_last_pre_release: up_to_date?(
35
+ using_last_pre_release: VersionHelper.up_to_date?(
37
36
  version_used: result[name].dig(:version_used), latest_version: result[name].dig(:latest_pre_release_version)
38
37
  ),
39
38
  ),
@@ -5,12 +5,14 @@ require "bundler"
5
5
  module StillActive
6
6
  class Config
7
7
  attr_accessor :critical_warning_emoji, :futurist_emoji, :gemfile_path, :gems, :github_oauth_token, :output_format,
8
- :safe_range_end, :success_emoji, :unsure_emoji, :warning_emoji, :warning_range_end
8
+ :parallelism, :no_warning_range_end, :success_emoji, :unsure_emoji, :warning_emoji, :warning_range_end
9
9
 
10
10
  def initialize
11
11
  @gemfile_path = Bundler.default_gemfile.to_s
12
12
  @gems = []
13
13
 
14
+ @parallelism = 10
15
+
14
16
  @output_format = :markdown
15
17
 
16
18
  @critical_warning_emoji = "🚩"
@@ -19,7 +21,7 @@ module StillActive
19
21
  @unsure_emoji = "❓"
20
22
  @warning_emoji = "⚠️"
21
23
 
22
- @safe_range_end = 1
24
+ @no_warning_range_end = 1
23
25
  @warning_range_end = 3
24
26
  end
25
27
 
@@ -15,6 +15,7 @@ module StillActive
15
15
  add_gems_option(opts)
16
16
  add_output_options(opts)
17
17
  add_token_options(opts)
18
+ add_parallelism_options(opts)
18
19
  add_range_options(opts)
19
20
  add_emoji_options(opts)
20
21
  end
@@ -57,13 +58,19 @@ module StillActive
57
58
  end
58
59
  end
59
60
 
61
+ def add_parallelism_options(opts)
62
+ opts.on("--simultaneous-requests=QTY", Integer, "Number of simultaneous requests made") do |value|
63
+ StillActive.config { |config| config.parallelism = value }
64
+ end
65
+ end
66
+
60
67
  def add_range_options(opts)
61
- opts.on("--safe-range-end=YEARS", Integer,
62
- "maximum number of years since last activity to be considered safe") do |value|
63
- StillActive.config { |config| config.safe_range_end = value }
68
+ opts.on("--no-warning-range-end=YEARS", Integer,
69
+ "maximum number of years since last activity until which you do not want to be warned about ") do |value|
70
+ StillActive.config { |config| config.no_warning_range_end = value }
64
71
  end
65
72
  opts.on("--warning-range-end=YEARS", Integer,
66
- "maximum number of years since last activity to be considered worrying") do |value|
73
+ "maximum number of years since last activity that you want to be warned about") do |value|
67
74
  StillActive.config { |config| config.warning_range_end = value }
68
75
  end
69
76
  end
@@ -5,6 +5,9 @@ module StillActive
5
5
  GITHUB_REGEX = %r{(http(?:s)?://(?:www\.)?(github)\.com/((?:\w|_|-)+)/((?:\w|_|-)+))}i
6
6
  GITLAB_REGEX = %r{(http(?:s)?://(?:www\.)?(gitlab)\.com/((?:\w|_|-)+)/((?:\w|_|-)+))}i
7
7
 
8
+ HASH_KEYS = [:url, :source, :owner, :name]
9
+ private_constant :HASH_KEYS
10
+
8
11
  extend self
9
12
 
10
13
  def valid?(url:)
@@ -18,7 +21,7 @@ module StillActive
18
21
  values = url&.scan(regex)&.first
19
22
  next if values.nil? || values.empty?
20
23
 
21
- return [:url, :source, :owner, :name].zip(values).to_h
24
+ return HASH_KEYS.zip(values).to_h
22
25
  end
23
26
  { source: :unhandled, owner: nil, name: nil }
24
27
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StillActive
4
- VERSION = "0.1.1"
4
+ VERSION = "0.4.1"
5
5
  end
@@ -4,6 +4,7 @@ require_relative "repository"
4
4
  require_relative "../helpers/version_helper"
5
5
  require "async"
6
6
  require "async/barrier"
7
+ require "async/semaphore"
7
8
  require "gems"
8
9
  require "github_api"
9
10
 
@@ -15,9 +16,10 @@ module StillActive
15
16
  def call
16
17
  task = Async do
17
18
  barrier = Async::Barrier.new
19
+ semaphore = Async::Semaphore.new(StillActive.config.parallelism, parent: barrier)
18
20
  result_object = {}
19
21
  StillActive.config.gems.each_with_object(result_object) do |gem, hash|
20
- barrier.async do
22
+ semaphore.async do
21
23
  gem_info(gem_name: gem[:name], result_object: hash, gem_version: gem.dig(:version))
22
24
  end
23
25
  end
@@ -31,43 +33,40 @@ module StillActive
31
33
 
32
34
  def gem_info(gem_name:, result_object:, gem_version: nil)
33
35
  result_object[gem_name] = {}
34
- result_object[gem_name].merge!({
35
- version_used: gem_version,
36
- }) if gem_version
36
+ result_object[gem_name][:version_used] = gem_version if gem_version
37
37
 
38
38
  vs = versions(gem_name: gem_name)
39
39
  repo_info = repository_info(gem_name: gem_name, versions: vs)
40
40
  last_commit_date = last_commit_date(source: repo_info[:source], repository_owner: repo_info[:owner],
41
41
  repository_name: repo_info[:name])
42
- last_release = find_version(versions: vs, pre_release: false)
43
- last_pre_release = find_version(versions: vs, pre_release: true)
42
+ last_release = VersionHelper.find_version(versions: vs, pre_release: false)
43
+ last_pre_release = VersionHelper.find_version(versions: vs, pre_release: true)
44
44
  result_object[gem_name].merge!({
45
- latest_version: gem_version(version_hash: last_release),
46
- latest_version_release_date: release_date(version_hash: last_release),
45
+ latest_version: VersionHelper.gem_version(version_hash: last_release),
46
+ latest_version_release_date: VersionHelper.release_date(version_hash: last_release),
47
47
 
48
- latest_pre_release_version: gem_version(version_hash: last_pre_release),
49
- latest_pre_release_version_release_date: release_date(version_hash: last_pre_release),
48
+ latest_pre_release_version: VersionHelper.gem_version(version_hash: last_pre_release),
49
+ latest_pre_release_version_release_date: VersionHelper.release_date(version_hash: last_pre_release),
50
50
 
51
51
  repository_url: repo_info[:url],
52
52
  last_commit_date: last_commit_date,
53
53
  })
54
54
 
55
55
  unless vs.empty?
56
- result_object[gem_name].merge!({ ruby_gems_url: "https://rubygems.org/gems/#{gem_name}" })
56
+ result_object[gem_name][:ruby_gems_url] = "https://rubygems.org/gems/#{gem_name}"
57
57
  end
58
58
 
59
59
  if gem_version
60
- version_used = find_version(versions: vs, version_string: gem_version)
60
+ version_used = VersionHelper.find_version(versions: vs, version_string: gem_version)
61
61
  result_object[gem_name].merge!({
62
- # global_warning: global_warning,
63
62
  up_to_date:
64
- up_to_date?(
65
- version_used: version_used,
66
- latest_version: last_release,
67
- latest_pre_release_version: last_pre_release
68
- ),
63
+ VersionHelper.up_to_date?(
64
+ version_used: version_used,
65
+ latest_version: last_release,
66
+ latest_pre_release_version: last_pre_release
67
+ ),
69
68
 
70
- version_used_release_date: release_date(version_hash: version_used),
69
+ version_used_release_date: VersionHelper.release_date(version_hash: version_used),
71
70
  })
72
71
  end
73
72
  rescue StandardError => e
@@ -82,7 +81,6 @@ module StillActive
82
81
  end
83
82
 
84
83
  def repository_info(gem_name:, versions:)
85
- # binding.break # if gem_name == "still_active"
86
84
  valid_repository_url =
87
85
  installed_gem_urls(gem_name: gem_name).find { |url| Repository.valid?(url: url) } ||
88
86
  rubygems_versions_repository_url(versions: versions).find { |url| Repository.valid?(url: url) } ||
@@ -90,7 +88,6 @@ module StillActive
90
88
  Repository.url_with_owner_and_name(url: valid_repository_url)
91
89
  end
92
90
 
93
- # does not make network requests
94
91
  def installed_gem_urls(gem_name:)
95
92
  info = Gem::Dependency.new(gem_name).matching_specs.first
96
93
  return [] if info.nil?
@@ -101,15 +98,12 @@ module StillActive
101
98
  ].compact.uniq
102
99
  end
103
100
 
104
- # does not make network requests
105
101
  def rubygems_versions_repository_url(versions:)
106
102
  versions
107
- .map { |version| version.dig("metadata", "source_code_uri") }
108
- .compact
103
+ .filter_map { |version| version.dig("metadata", "source_code_uri") }
109
104
  .uniq
110
105
  end
111
106
 
112
- # makes network request
113
107
  def rubygems_gem_repository_url(gem_name:)
114
108
  info = Gems.info(gem_name)
115
109
  return [] if info.nil?
@@ -122,7 +116,6 @@ module StillActive
122
116
  []
123
117
  end
124
118
 
125
- # makes network request
126
119
  def last_commit(source:, repository_owner:, repository_name:)
127
120
  case source.to_sym
128
121
  when :github
@@ -132,7 +125,6 @@ module StillActive
132
125
  end
133
126
  end
134
127
 
135
- # makes network request
136
128
  def last_commit_date(source:, repository_owner:, repository_name:)
137
129
  commit = last_commit(source: source, repository_owner: repository_owner, repository_name: repository_name)
138
130
  case source.to_sym
data/still_active.gemspec CHANGED
@@ -10,9 +10,9 @@ Gem::Specification.new do |spec|
10
10
 
11
11
  spec.summary = "Check if gems are under active development."
12
12
  spec.description = "Obtain last release, pre-release, and last commit date to determine if a gem is still under active development."
13
- spec.homepage = "https://github.com/SeanLF/still_active."
13
+ spec.homepage = "https://github.com/SeanLF/still_active"
14
14
  spec.license = "MIT"
15
- spec.required_ruby_version = ">= 2.6.0"
15
+ spec.required_ruby_version = ">= 2.7.0"
16
16
 
17
17
  # spec.metadata["allowed_push_host"] = "TODO: Set to 'https://mygemserver.com'"
18
18
 
@@ -35,12 +35,15 @@ Gem::Specification.new do |spec|
35
35
  spec.add_development_dependency("debug")
36
36
  spec.add_development_dependency("faker")
37
37
  spec.add_development_dependency("rubocop")
38
+ spec.add_development_dependency("rubocop-performance")
39
+ spec.add_development_dependency("rubocop-rspec")
38
40
  spec.add_development_dependency("rubocop-shopify")
39
41
 
40
42
  spec.add_runtime_dependency("activesupport")
41
43
  spec.add_runtime_dependency("async")
42
44
  # spec.add_runtime_dependency("cli-ui")
43
45
  spec.add_runtime_dependency("async-http")
46
+ spec.add_runtime_dependency("bundler", ">= 2.0")
44
47
  spec.add_runtime_dependency("gems")
45
48
  spec.add_runtime_dependency("github_api")
46
49
  # spec.add_runtime_dependency("gitlab")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: still_active
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Floyd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-07 00:00:00.000000000 Z
11
+ date: 2022-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dead_end
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-performance
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rubocop-shopify
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +150,20 @@ dependencies:
122
150
  - - ">="
123
151
  - !ruby/object:Gem::Version
124
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: bundler
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '2.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '2.0'
125
167
  - !ruby/object:Gem::Dependency
126
168
  name: gems
127
169
  requirement: !ruby/object:Gem::Requirement
@@ -159,7 +201,9 @@ executables:
159
201
  extensions: []
160
202
  extra_rdoc_files: []
161
203
  files:
162
- - ".github/workflows/main.yml"
204
+ - ".github/workflows/codeql-analysis.yml"
205
+ - ".github/workflows/rspec.yml"
206
+ - ".github/workflows/rubocop-analysis.yml"
163
207
  - ".gitignore"
164
208
  - ".rspec"
165
209
  - ".rubocop.yml"
@@ -172,6 +216,7 @@ files:
172
216
  - bin/console
173
217
  - bin/setup
174
218
  - bin/still_active
219
+ - fixtures/vcr_cassettes/gems.yml
175
220
  - lib/helpers/bundler_helper.rb
176
221
  - lib/helpers/emoji_helper.rb
177
222
  - lib/helpers/markdown_helper.rb
@@ -185,13 +230,13 @@ files:
185
230
  - lib/still_active/version.rb
186
231
  - lib/still_active/workflow.rb
187
232
  - still_active.gemspec
188
- homepage: https://github.com/SeanLF/still_active.
233
+ homepage: https://github.com/SeanLF/still_active
189
234
  licenses:
190
235
  - MIT
191
236
  metadata:
192
- homepage_uri: https://github.com/SeanLF/still_active.
193
- source_code_uri: https://github.com/SeanLF/still_active.
194
- changelog_uri: https://github.com/SeanLF/still_active./blob/main/CHANGELOG.md
237
+ homepage_uri: https://github.com/SeanLF/still_active
238
+ source_code_uri: https://github.com/SeanLF/still_active
239
+ changelog_uri: https://github.com/SeanLF/still_active/blob/main/CHANGELOG.md
195
240
  post_install_message:
196
241
  rdoc_options: []
197
242
  require_paths:
@@ -200,14 +245,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
200
245
  requirements:
201
246
  - - ">="
202
247
  - !ruby/object:Gem::Version
203
- version: 2.6.0
248
+ version: 2.7.0
204
249
  required_rubygems_version: !ruby/object:Gem::Requirement
205
250
  requirements:
206
251
  - - ">="
207
252
  - !ruby/object:Gem::Version
208
253
  version: '0'
209
254
  requirements: []
210
- rubygems_version: 3.2.30
255
+ rubygems_version: 3.3.5
211
256
  signing_key:
212
257
  specification_version: 4
213
258
  summary: Check if gems are under active development.
@@ -1,16 +0,0 @@
1
- name: Ruby
2
-
3
- on: [push,pull_request]
4
-
5
- jobs:
6
- build:
7
- runs-on: ubuntu-latest
8
- steps:
9
- - uses: actions/checkout@v2
10
- - name: Set up Ruby
11
- uses: ruby/setup-ruby@v1
12
- with:
13
- ruby-version: 3.0.2
14
- bundler-cache: true
15
- - name: Run the default task
16
- run: bundle exec rake