still_active 3.0.0.rc4 → 3.0.0.rc5
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/helpers/activity_helper.rb +3 -3
- data/lib/helpers/alternatives_helper.rb +1 -1
- data/lib/helpers/ansi_helper.rb +1 -1
- data/lib/helpers/bot_context.rb +7 -7
- data/lib/helpers/bundler_helper.rb +1 -2
- data/lib/helpers/catalog_index.rb +1 -1
- data/lib/helpers/constraint_helper.rb +6 -6
- data/lib/helpers/cvss_helper.rb +2 -2
- data/lib/helpers/cyclonedx_helper.rb +14 -14
- data/lib/helpers/diff_markdown_helper.rb +4 -4
- data/lib/helpers/dotnet_helper.rb +4 -4
- data/lib/helpers/endoflife_helper.rb +3 -3
- data/lib/helpers/http_helper.rb +31 -19
- data/lib/helpers/lockfile_dependency_parser.rb +2 -2
- data/lib/helpers/markdown_escape.rb +1 -1
- data/lib/helpers/markdown_helper.rb +7 -7
- data/lib/helpers/ruby_advisory_db.rb +1 -1
- data/lib/helpers/ruby_helper.rb +3 -3
- data/lib/helpers/runtime_ceiling_helper.rb +2 -2
- data/lib/helpers/sarif_helper.rb +34 -34
- data/lib/helpers/status_helper.rb +1 -1
- data/lib/helpers/summary_helper.rb +1 -1
- data/lib/helpers/terminal_helper.rb +8 -8
- data/lib/helpers/vulnerability_helper.rb +1 -1
- data/lib/still_active/artifactory_client.rb +47 -18
- data/lib/still_active/cli.rb +38 -38
- data/lib/still_active/compact_index_client.rb +117 -0
- data/lib/still_active/config.rb +1 -1
- data/lib/still_active/config_file.rb +4 -4
- data/lib/still_active/deps_dev_client.rb +7 -7
- data/lib/still_active/diff.rb +12 -12
- data/lib/still_active/ecosystem_lens.rb +5 -5
- data/lib/still_active/ecosystems_client.rb +7 -7
- data/lib/still_active/forgejo_client.rb +3 -3
- data/lib/still_active/github_client.rb +6 -6
- data/lib/still_active/gitlab_client.rb +3 -3
- data/lib/still_active/options.rb +4 -4
- data/lib/still_active/osv_client.rb +8 -8
- data/lib/still_active/poison_security_correlator.rb +3 -3
- data/lib/still_active/pypi_client.rb +2 -2
- data/lib/still_active/repository.rb +4 -4
- data/lib/still_active/sarif/rules.rb +20 -20
- data/lib/still_active/sbom_reader.rb +8 -8
- data/lib/still_active/sbom_workflow.rb +7 -7
- data/lib/still_active/source_credentials.rb +39 -0
- data/lib/still_active/version.rb +1 -1
- data/lib/still_active/workflow.rb +57 -31
- data/still_active.gemspec +16 -20
- metadata +5 -115
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative "artifactory_client"
|
|
4
|
+
require_relative "compact_index_client"
|
|
5
|
+
require_relative "source_credentials"
|
|
4
6
|
require_relative "ceiling_reconciler"
|
|
5
7
|
require_relative "deps_dev_client"
|
|
6
8
|
require_relative "osv_client"
|
|
@@ -46,8 +48,8 @@ module StillActive
|
|
|
46
48
|
ruby_range =
|
|
47
49
|
begin
|
|
48
50
|
RubyHelper.supported_ruby_range
|
|
49
|
-
rescue
|
|
50
|
-
|
|
51
|
+
rescue => e
|
|
52
|
+
warn("warning: Ruby support window lookup failed: #{e.class} (#{e.message}); skipping language-ceiling checks")
|
|
51
53
|
nil
|
|
52
54
|
end
|
|
53
55
|
# Resolve the GitHub token once here, single-fibered, before the fan-out:
|
|
@@ -79,14 +81,14 @@ module StillActive
|
|
|
79
81
|
advisory_db: advisory_db,
|
|
80
82
|
catalog: catalog,
|
|
81
83
|
constraint_cache: constraint_cache,
|
|
82
|
-
ruby_range: ruby_range
|
|
84
|
+
ruby_range: ruby_range
|
|
83
85
|
)
|
|
84
86
|
rescue Octokit::TooManyRequests
|
|
85
87
|
$stderr.print("\r\e[K") if on_progress
|
|
86
|
-
|
|
87
|
-
rescue
|
|
88
|
+
warn("rate limited checking #{gem[:name]}: set GITHUB_TOKEN to increase your limit")
|
|
89
|
+
rescue => e
|
|
88
90
|
$stderr.print("\r\e[K") if on_progress
|
|
89
|
-
|
|
91
|
+
warn("error occurred for #{gem[:name]}: #{e.class}\n\t#{e.message}")
|
|
90
92
|
ensure
|
|
91
93
|
completed += 1
|
|
92
94
|
on_progress&.call(completed, total)
|
|
@@ -115,7 +117,7 @@ module StillActive
|
|
|
115
117
|
private
|
|
116
118
|
|
|
117
119
|
def gem_info(gem_name:, result_object:, gem_version: nil, source_type: :rubygems, source_uri: nil, direct: true, dependency_path: nil, advisory_db: nil, catalog: nil, constraint_cache: {}, ruby_range: nil)
|
|
118
|
-
result_object[gem_name] = {
|
|
120
|
+
result_object[gem_name] = {source_type: source_type, direct: direct}
|
|
119
121
|
result_object[gem_name][:dependency_path] = dependency_path if dependency_path
|
|
120
122
|
result_object[gem_name][:version_used] = gem_version if gem_version
|
|
121
123
|
|
|
@@ -129,7 +131,7 @@ module StillActive
|
|
|
129
131
|
result_object: result_object,
|
|
130
132
|
source_uri: source_uri,
|
|
131
133
|
advisory_db: advisory_db,
|
|
132
|
-
ruby_range: ruby_range
|
|
134
|
+
ruby_range: ruby_range
|
|
133
135
|
)
|
|
134
136
|
end
|
|
135
137
|
|
|
@@ -148,19 +150,19 @@ module StillActive
|
|
|
148
150
|
signals = repo_signals(
|
|
149
151
|
source: repo_info[:source],
|
|
150
152
|
repository_owner: repo_info[:owner],
|
|
151
|
-
repository_name: repo_info[:name]
|
|
153
|
+
repository_name: repo_info[:name]
|
|
152
154
|
)
|
|
153
155
|
commit_date = signals[:last_commit_date]
|
|
154
156
|
archived = signals[:archived]
|
|
155
157
|
last_release = VersionHelper.find_version(versions: vs, pre_release: false)
|
|
156
158
|
last_pre_release = VersionHelper.upcoming_pre_release(
|
|
157
159
|
pre_release: VersionHelper.find_version(versions: vs, pre_release: true),
|
|
158
|
-
release: last_release
|
|
160
|
+
release: last_release
|
|
159
161
|
)
|
|
160
162
|
deps_dev = fetch_deps_dev_info(
|
|
161
163
|
gem_name: gem_name,
|
|
162
164
|
version: gem_version || VersionHelper.gem_version(version_hash: last_release),
|
|
163
|
-
advisory_db: advisory_db
|
|
165
|
+
advisory_db: advisory_db
|
|
164
166
|
)
|
|
165
167
|
result_object[gem_name].merge!({
|
|
166
168
|
latest_version: VersionHelper.gem_version(version_hash: last_release),
|
|
@@ -172,10 +174,14 @@ module StillActive
|
|
|
172
174
|
repository_url: repo_info[:url],
|
|
173
175
|
last_commit_date: commit_date,
|
|
174
176
|
archived: archived,
|
|
175
|
-
**deps_dev
|
|
177
|
+
**deps_dev
|
|
176
178
|
})
|
|
177
179
|
|
|
178
|
-
|
|
180
|
+
# Only a gem that actually lives on public rubygems.org gets a rubygems.org
|
|
181
|
+
# page link. For a private source, rubygems.org/gems/<name> is a public
|
|
182
|
+
# name collision (for sidekiq-pro, the 0.0.3 squat-warning decoy), not the
|
|
183
|
+
# gem the user resolves -- the same #43 substitution the repo-URL guard blocks.
|
|
184
|
+
unless vs.empty? || unqueryable_private_source?(source_uri)
|
|
179
185
|
result_object[gem_name][:ruby_gems_url] = "https://rubygems.org/gems/#{gem_name}"
|
|
180
186
|
end
|
|
181
187
|
|
|
@@ -184,7 +190,7 @@ module StillActive
|
|
|
184
190
|
source: repo_info[:source],
|
|
185
191
|
repository_owner: repo_info[:owner],
|
|
186
192
|
repository_name: repo_info[:name],
|
|
187
|
-
version: VersionHelper.gem_version(version_hash: last_release)
|
|
193
|
+
version: VersionHelper.gem_version(version_hash: last_release)
|
|
188
194
|
)
|
|
189
195
|
end
|
|
190
196
|
|
|
@@ -194,7 +200,7 @@ module StillActive
|
|
|
194
200
|
up_to_date: VersionHelper.up_to_date(
|
|
195
201
|
version_used: version_used,
|
|
196
202
|
latest_version: last_release,
|
|
197
|
-
latest_pre_release_version: last_pre_release
|
|
203
|
+
latest_pre_release_version: last_pre_release
|
|
198
204
|
),
|
|
199
205
|
|
|
200
206
|
version_used_release_date: VersionHelper.release_date(version_hash: version_used),
|
|
@@ -202,8 +208,8 @@ module StillActive
|
|
|
202
208
|
license: VersionHelper.license(version_hash: version_used),
|
|
203
209
|
libyear: LibyearHelper.gem_libyear(
|
|
204
210
|
version_used_release_date: VersionHelper.release_date(version_hash: version_used),
|
|
205
|
-
latest_version_release_date: VersionHelper.release_date(version_hash: last_release)
|
|
206
|
-
)
|
|
211
|
+
latest_version_release_date: VersionHelper.release_date(version_hash: last_release)
|
|
212
|
+
)
|
|
207
213
|
})
|
|
208
214
|
end
|
|
209
215
|
|
|
@@ -218,7 +224,7 @@ module StillActive
|
|
|
218
224
|
used_ruby_requirement: canonical_ruby_requirement(vs, version_used),
|
|
219
225
|
latest_ruby_requirement: canonical_ruby_requirement(vs, last_release),
|
|
220
226
|
pinned: !version_used.nil?,
|
|
221
|
-
ruby_range: ruby_range
|
|
227
|
+
ruby_range: ruby_range
|
|
222
228
|
)
|
|
223
229
|
end
|
|
224
230
|
end
|
|
@@ -297,7 +303,7 @@ module StillActive
|
|
|
297
303
|
repository_url: repo_info[:url],
|
|
298
304
|
last_commit_date: signals[:last_commit_date],
|
|
299
305
|
archived: signals[:archived],
|
|
300
|
-
**deps_dev
|
|
306
|
+
**deps_dev
|
|
301
307
|
})
|
|
302
308
|
end
|
|
303
309
|
|
|
@@ -311,7 +317,7 @@ module StillActive
|
|
|
311
317
|
|
|
312
318
|
leads = AlternativesHelper.leads_for(gem_name: gem_name, index: catalog)
|
|
313
319
|
result_object[gem_name][:alternatives] = leads unless leads.empty?
|
|
314
|
-
rescue
|
|
320
|
+
rescue
|
|
315
321
|
nil # cosmetic best-effort: lead-fetching must never break the core audit
|
|
316
322
|
end
|
|
317
323
|
|
|
@@ -373,7 +379,7 @@ module StillActive
|
|
|
373
379
|
# drop the advisory and read a known-vulnerable gem as clean, so an
|
|
374
380
|
# un-enriched key still contributes a minimal advisory (mirrors EcosystemLens;
|
|
375
381
|
# ruby-advisory-db then fills the score on merge when it also carries it).
|
|
376
|
-
deps_dev_vulns = advisory_keys.map { |id| DepsDevClient.advisory_detail(advisory_id: id) || {
|
|
382
|
+
deps_dev_vulns = advisory_keys.map { |id| DepsDevClient.advisory_detail(advisory_id: id) || {id: id, source: "deps.dev"} }
|
|
377
383
|
radb_vulns = RubyAdvisoryDb.advisories_for(database: advisory_db, gem_name: gem_name, version: version)
|
|
378
384
|
vulnerabilities = VulnerabilityHelper.merge_advisories(deps_dev: deps_dev_vulns, ruby_advisory_db: radb_vulns)
|
|
379
385
|
# Enrich with OSV: a real GHSA severity label (deps.dev can't score a CVSS-4-only
|
|
@@ -384,7 +390,7 @@ module StillActive
|
|
|
384
390
|
scorecard_score: scorecard&.dig(:score),
|
|
385
391
|
scorecard_maintained: scorecard&.dig(:maintained),
|
|
386
392
|
vulnerability_count: vulnerabilities.length,
|
|
387
|
-
vulnerabilities: vulnerabilities
|
|
393
|
+
vulnerabilities: vulnerabilities
|
|
388
394
|
}
|
|
389
395
|
end
|
|
390
396
|
|
|
@@ -394,8 +400,7 @@ module StillActive
|
|
|
394
400
|
elsif ArtifactoryClient.artifactory_uri?(source_uri)
|
|
395
401
|
ArtifactoryClient.versions(gem_name: gem_name, source_uri: source_uri)
|
|
396
402
|
elsif unqueryable_private_source?(source_uri)
|
|
397
|
-
|
|
398
|
-
[]
|
|
403
|
+
private_source_versions(gem_name: gem_name, source_uri: source_uri)
|
|
399
404
|
else
|
|
400
405
|
Gems.versions(gem_name)
|
|
401
406
|
end
|
|
@@ -409,7 +414,7 @@ module StillActive
|
|
|
409
414
|
# best-effort feature must not be able to degrade an unrelated gem's core data:
|
|
410
415
|
# degrade to "no versions known" here, exactly like Gems::NotFound.
|
|
411
416
|
rescue Gems::GemError, *HttpHelper::TRANSPORT_ERRORS => e
|
|
412
|
-
|
|
417
|
+
warn("warning: rubygems.org versions lookup failed for #{gem_name}: #{e.class} (#{e.message})")
|
|
413
418
|
[]
|
|
414
419
|
end
|
|
415
420
|
|
|
@@ -437,11 +442,32 @@ module StillActive
|
|
|
437
442
|
false
|
|
438
443
|
end
|
|
439
444
|
|
|
445
|
+
# Any Bundler-compatible private host (Contribsys, Gemstash, Gemfury, a private
|
|
446
|
+
# mirror) serves the RubyGems compact index, since that is how `bundle install`
|
|
447
|
+
# resolves from it. So try that agnostic rail before declaring the source
|
|
448
|
+
# unqueryable: it covers the whole class with no per-host client, and falls
|
|
449
|
+
# through to the same warning when a host does not serve it. Auth is Bundler's
|
|
450
|
+
# own host-keyed credential only; still_active's ambient --artifactory-token is
|
|
451
|
+
# never sent to a lockfile-derived host this way (that stays ArtifactoryClient's,
|
|
452
|
+
# behind its host allowlist). The repo-signal path is untouched, so #43 still
|
|
453
|
+
# blocks a public name-collision's repo data from standing in for the private gem.
|
|
454
|
+
def private_source_versions(gem_name:, source_uri:)
|
|
455
|
+
versions = CompactIndexClient.versions(
|
|
456
|
+
gem_name: gem_name,
|
|
457
|
+
source_uri: source_uri,
|
|
458
|
+
headers: SourceCredentials.headers_for(source_uri)
|
|
459
|
+
)
|
|
460
|
+
return versions unless versions.empty?
|
|
461
|
+
|
|
462
|
+
warn_unqueryable_private_source(gem_name: gem_name, source_uri: source_uri)
|
|
463
|
+
[]
|
|
464
|
+
end
|
|
465
|
+
|
|
440
466
|
def warn_unqueryable_private_source(gem_name:, source_uri:)
|
|
441
467
|
host = URI(source_uri).host
|
|
442
|
-
|
|
468
|
+
warn(
|
|
443
469
|
"warning: #{gem_name} resolves from a private source (#{host}) still_active cannot query; " \
|
|
444
|
-
"reporting no version/latest/libyear data for it rather than substituting public rubygems.org data"
|
|
470
|
+
"reporting no version/latest/libyear data for it rather than substituting public rubygems.org data"
|
|
445
471
|
)
|
|
446
472
|
end
|
|
447
473
|
|
|
@@ -450,7 +476,7 @@ module StillActive
|
|
|
450
476
|
namespace_path = base.path
|
|
451
477
|
path = "#{namespace_path}/api/v1/gems/#{CGI.escape(gem_name)}/versions.json"
|
|
452
478
|
token = StillActive.config.github_oauth_token
|
|
453
|
-
headers = token ? {
|
|
479
|
+
headers = token ? {"Authorization" => "Bearer #{token}"} : {}
|
|
454
480
|
HttpHelper.get_json(base, path, headers: headers) || []
|
|
455
481
|
end
|
|
456
482
|
|
|
@@ -471,7 +497,7 @@ module StillActive
|
|
|
471
497
|
# deps.dev scorecards index github.com and gitlab.com only. A Forgejo/Codeberg
|
|
472
498
|
# repo has no deps.dev project, so leave its project_id nil rather than minting
|
|
473
499
|
# a bogus github.com/owner/name that would fetch the wrong (or no) scorecard.
|
|
474
|
-
DEPS_DEV_HOST_BY_SOURCE = {
|
|
500
|
+
DEPS_DEV_HOST_BY_SOURCE = {github: "github.com", gitlab: "gitlab.com"}.freeze
|
|
475
501
|
|
|
476
502
|
def deps_dev_project_id(repo)
|
|
477
503
|
host = DEPS_DEV_HOST_BY_SOURCE[repo[:source]]
|
|
@@ -505,7 +531,7 @@ module StillActive
|
|
|
505
531
|
|
|
506
532
|
[
|
|
507
533
|
info.metadata&.dig("source_code_uri"),
|
|
508
|
-
info.homepage
|
|
534
|
+
info.homepage
|
|
509
535
|
].compact.uniq
|
|
510
536
|
end
|
|
511
537
|
|
|
@@ -521,7 +547,7 @@ module StillActive
|
|
|
521
547
|
|
|
522
548
|
[
|
|
523
549
|
info["homepage_uri"],
|
|
524
|
-
info["source_code_uri"]
|
|
550
|
+
info["source_code_uri"]
|
|
525
551
|
].compact.uniq
|
|
526
552
|
rescue Gems::NotFound
|
|
527
553
|
[]
|
data/still_active.gemspec
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
require_relative "lib/still_active/version"
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |spec|
|
|
6
|
-
spec.name
|
|
7
|
-
spec.version
|
|
8
|
-
spec.authors
|
|
9
|
-
spec.email
|
|
6
|
+
spec.name = "still_active"
|
|
7
|
+
spec.version = StillActive::VERSION
|
|
8
|
+
spec.authors = ["Sean Floyd"]
|
|
9
|
+
spec.email = ["contact@seanfloyd.dev"]
|
|
10
10
|
|
|
11
|
-
spec.summary
|
|
11
|
+
spec.summary = "Audit your dependencies for maintenance health, abandonment, and below-the-fix vulnerabilities. " \
|
|
12
12
|
"Ruby gems natively; npm, PyPI, Cargo, Go, Maven, and NuGet via a CycloneDX SBOM."
|
|
13
|
-
spec.description
|
|
13
|
+
spec.description = "Analyses your Gemfile.lock for dependency health across the full transitive graph: " \
|
|
14
14
|
"whether each gem is actively maintained (last activity on GitHub, GitLab, or Codeberg/Forgejo, plus " \
|
|
15
15
|
"release recency), outdated versions, archived repos, OpenSSF Scorecard scores, known vulnerabilities " \
|
|
16
16
|
"(deps.dev and OSV, merged with ruby-advisory-db, flagging advisories with no fix and pins that sit below " \
|
|
@@ -24,9 +24,14 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
"with granular, committed suppression via .still_active.yml. " \
|
|
25
25
|
"Complements bundle outdated, bundler-audit, and libyear-bundler by adding the maintenance signal they " \
|
|
26
26
|
"don't, and folds their version, CVE, and libyear checks into one report."
|
|
27
|
-
spec.homepage
|
|
28
|
-
spec.license
|
|
27
|
+
spec.homepage = "https://github.com/SeanLF/still_active"
|
|
28
|
+
spec.license = "MIT"
|
|
29
29
|
spec.required_ruby_version = ">= 3.3.0"
|
|
30
|
+
# Gem::Resolver::APISet::GemParser, which parses the RubyGems compact index for
|
|
31
|
+
# the Artifactory client, first shipped in RubyGems 3.2.3. Ruby 3.3.0 bundles
|
|
32
|
+
# 3.5.3, so this is documentation of the real dependency rather than a bound
|
|
33
|
+
# anyone can trip.
|
|
34
|
+
spec.required_rubygems_version = ">= 3.2.3"
|
|
30
35
|
|
|
31
36
|
spec.metadata["homepage_uri"] = spec.homepage
|
|
32
37
|
spec.metadata["source_code_uri"] = spec.homepage
|
|
@@ -36,23 +41,14 @@ Gem::Specification.new do |spec|
|
|
|
36
41
|
spec.metadata["rubygems_mfa_required"] = "true"
|
|
37
42
|
|
|
38
43
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
39
|
-
|
|
44
|
+
`git ls-files -z`.split("\x0").select do |f|
|
|
40
45
|
f.start_with?("lib/", "bin/still_active") || f.match?(/\A(LICENSE|README|CHANGELOG|still_active\.gemspec)\b/)
|
|
41
46
|
end
|
|
42
47
|
end
|
|
43
|
-
spec.bindir
|
|
44
|
-
spec.executables
|
|
48
|
+
spec.bindir = "bin"
|
|
49
|
+
spec.executables = spec.files.grep(%r{\Abin/still_active}) { |f| File.basename(f) }
|
|
45
50
|
spec.require_paths = ["lib"]
|
|
46
51
|
|
|
47
|
-
spec.add_development_dependency("bundler-audit")
|
|
48
|
-
spec.add_development_dependency("debug")
|
|
49
|
-
spec.add_development_dependency("faker")
|
|
50
|
-
spec.add_development_dependency("json_schemer")
|
|
51
|
-
spec.add_development_dependency("rubocop")
|
|
52
|
-
spec.add_development_dependency("rubocop-performance")
|
|
53
|
-
spec.add_development_dependency("rubocop-rspec")
|
|
54
|
-
spec.add_development_dependency("rubocop-shopify")
|
|
55
|
-
|
|
56
52
|
# 2.0/2.1 ship a scheduler that breaks our fan-out (io_read); 2.2 is the
|
|
57
53
|
# verified floor (checked against Ruby 3.3 in Docker). octokit/faraday-retry/
|
|
58
54
|
# gems work down to ancient versions, so they stay unpinned rather than
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: still_active
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0.0.
|
|
4
|
+
version: 3.0.0.rc5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sean Floyd
|
|
@@ -9,118 +9,6 @@ bindir: bin
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
-
- !ruby/object:Gem::Dependency
|
|
13
|
-
name: bundler-audit
|
|
14
|
-
requirement: !ruby/object:Gem::Requirement
|
|
15
|
-
requirements:
|
|
16
|
-
- - ">="
|
|
17
|
-
- !ruby/object:Gem::Version
|
|
18
|
-
version: '0'
|
|
19
|
-
type: :development
|
|
20
|
-
prerelease: false
|
|
21
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
-
requirements:
|
|
23
|
-
- - ">="
|
|
24
|
-
- !ruby/object:Gem::Version
|
|
25
|
-
version: '0'
|
|
26
|
-
- !ruby/object:Gem::Dependency
|
|
27
|
-
name: debug
|
|
28
|
-
requirement: !ruby/object:Gem::Requirement
|
|
29
|
-
requirements:
|
|
30
|
-
- - ">="
|
|
31
|
-
- !ruby/object:Gem::Version
|
|
32
|
-
version: '0'
|
|
33
|
-
type: :development
|
|
34
|
-
prerelease: false
|
|
35
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
-
requirements:
|
|
37
|
-
- - ">="
|
|
38
|
-
- !ruby/object:Gem::Version
|
|
39
|
-
version: '0'
|
|
40
|
-
- !ruby/object:Gem::Dependency
|
|
41
|
-
name: faker
|
|
42
|
-
requirement: !ruby/object:Gem::Requirement
|
|
43
|
-
requirements:
|
|
44
|
-
- - ">="
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: '0'
|
|
47
|
-
type: :development
|
|
48
|
-
prerelease: false
|
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
-
requirements:
|
|
51
|
-
- - ">="
|
|
52
|
-
- !ruby/object:Gem::Version
|
|
53
|
-
version: '0'
|
|
54
|
-
- !ruby/object:Gem::Dependency
|
|
55
|
-
name: json_schemer
|
|
56
|
-
requirement: !ruby/object:Gem::Requirement
|
|
57
|
-
requirements:
|
|
58
|
-
- - ">="
|
|
59
|
-
- !ruby/object:Gem::Version
|
|
60
|
-
version: '0'
|
|
61
|
-
type: :development
|
|
62
|
-
prerelease: false
|
|
63
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
-
requirements:
|
|
65
|
-
- - ">="
|
|
66
|
-
- !ruby/object:Gem::Version
|
|
67
|
-
version: '0'
|
|
68
|
-
- !ruby/object:Gem::Dependency
|
|
69
|
-
name: rubocop
|
|
70
|
-
requirement: !ruby/object:Gem::Requirement
|
|
71
|
-
requirements:
|
|
72
|
-
- - ">="
|
|
73
|
-
- !ruby/object:Gem::Version
|
|
74
|
-
version: '0'
|
|
75
|
-
type: :development
|
|
76
|
-
prerelease: false
|
|
77
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
-
requirements:
|
|
79
|
-
- - ">="
|
|
80
|
-
- !ruby/object:Gem::Version
|
|
81
|
-
version: '0'
|
|
82
|
-
- !ruby/object:Gem::Dependency
|
|
83
|
-
name: rubocop-performance
|
|
84
|
-
requirement: !ruby/object:Gem::Requirement
|
|
85
|
-
requirements:
|
|
86
|
-
- - ">="
|
|
87
|
-
- !ruby/object:Gem::Version
|
|
88
|
-
version: '0'
|
|
89
|
-
type: :development
|
|
90
|
-
prerelease: false
|
|
91
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
-
requirements:
|
|
93
|
-
- - ">="
|
|
94
|
-
- !ruby/object:Gem::Version
|
|
95
|
-
version: '0'
|
|
96
|
-
- !ruby/object:Gem::Dependency
|
|
97
|
-
name: rubocop-rspec
|
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
|
99
|
-
requirements:
|
|
100
|
-
- - ">="
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0'
|
|
103
|
-
type: :development
|
|
104
|
-
prerelease: false
|
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
-
requirements:
|
|
107
|
-
- - ">="
|
|
108
|
-
- !ruby/object:Gem::Version
|
|
109
|
-
version: '0'
|
|
110
|
-
- !ruby/object:Gem::Dependency
|
|
111
|
-
name: rubocop-shopify
|
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
|
113
|
-
requirements:
|
|
114
|
-
- - ">="
|
|
115
|
-
- !ruby/object:Gem::Version
|
|
116
|
-
version: '0'
|
|
117
|
-
type: :development
|
|
118
|
-
prerelease: false
|
|
119
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
-
requirements:
|
|
121
|
-
- - ">="
|
|
122
|
-
- !ruby/object:Gem::Version
|
|
123
|
-
version: '0'
|
|
124
12
|
- !ruby/object:Gem::Dependency
|
|
125
13
|
name: async
|
|
126
14
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -281,6 +169,7 @@ files:
|
|
|
281
169
|
- lib/still_active/artifactory_client.rb
|
|
282
170
|
- lib/still_active/ceiling_reconciler.rb
|
|
283
171
|
- lib/still_active/cli.rb
|
|
172
|
+
- lib/still_active/compact_index_client.rb
|
|
284
173
|
- lib/still_active/config.rb
|
|
285
174
|
- lib/still_active/config_file.rb
|
|
286
175
|
- lib/still_active/core_ext.rb
|
|
@@ -300,6 +189,7 @@ files:
|
|
|
300
189
|
- lib/still_active/sarif/rules.rb
|
|
301
190
|
- lib/still_active/sbom_reader.rb
|
|
302
191
|
- lib/still_active/sbom_workflow.rb
|
|
192
|
+
- lib/still_active/source_credentials.rb
|
|
303
193
|
- lib/still_active/suppressions.rb
|
|
304
194
|
- lib/still_active/version.rb
|
|
305
195
|
- lib/still_active/workflow.rb
|
|
@@ -326,9 +216,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
326
216
|
requirements:
|
|
327
217
|
- - ">="
|
|
328
218
|
- !ruby/object:Gem::Version
|
|
329
|
-
version:
|
|
219
|
+
version: 3.2.3
|
|
330
220
|
requirements: []
|
|
331
|
-
rubygems_version: 4.0.
|
|
221
|
+
rubygems_version: 4.0.16
|
|
332
222
|
specification_version: 4
|
|
333
223
|
summary: Audit your dependencies for maintenance health, abandonment, and below-the-fix
|
|
334
224
|
vulnerabilities. Ruby gems natively; npm, PyPI, Cargo, Go, Maven, and NuGet via
|