bundler-audit 0.8.0.rc1 → 0.9.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +3 -0
  3. data/.github/ISSUE_TEMPLATE/bug-report.md +44 -0
  4. data/.github/workflows/ruby.yml +16 -2
  5. data/.rubocop.yml +83 -0
  6. data/COPYING.txt +4 -4
  7. data/ChangeLog.md +45 -11
  8. data/Gemfile +7 -3
  9. data/README.md +20 -15
  10. data/Rakefile +7 -3
  11. data/bundler-audit.gemspec +3 -4
  12. data/gemspec.yml +2 -2
  13. data/lib/bundler/audit/advisory.rb +24 -3
  14. data/lib/bundler/audit/cli/formats/json.rb +17 -3
  15. data/lib/bundler/audit/cli/formats/junit.rb +127 -0
  16. data/lib/bundler/audit/cli/formats/text.rb +19 -13
  17. data/lib/bundler/audit/cli/formats.rb +8 -4
  18. data/lib/bundler/audit/cli/thor_ext/shell/basic/say_error.rb +33 -0
  19. data/lib/bundler/audit/cli.rb +41 -29
  20. data/lib/bundler/audit/configuration.rb +12 -5
  21. data/lib/bundler/audit/database.rb +21 -5
  22. data/lib/bundler/audit/results/insecure_source.rb +5 -2
  23. data/lib/bundler/audit/results/unpatched_gem.rb +7 -3
  24. data/lib/bundler/audit/results.rb +2 -2
  25. data/lib/bundler/audit/scanner.rb +9 -3
  26. data/lib/bundler/audit/task.rb +20 -5
  27. data/lib/bundler/audit/version.rb +3 -3
  28. data/lib/bundler/audit.rb +2 -2
  29. data/spec/advisory_spec.rb +9 -1
  30. data/spec/bundle/insecure_sources/Gemfile.lock +73 -71
  31. data/spec/bundle/secure/Gemfile.lock +55 -53
  32. data/spec/cli/formats/json_spec.rb +1 -0
  33. data/spec/cli/formats/junit_spec.rb +284 -0
  34. data/spec/cli/formats/text_spec.rb +113 -19
  35. data/spec/cli_spec.rb +61 -21
  36. data/spec/configuration_spec.rb +8 -0
  37. data/spec/database_spec.rb +25 -1
  38. data/spec/fixtures/advisory/CVE-2020-1234.yml +2 -0
  39. data/spec/fixtures/config/bad/empty.yml +0 -0
  40. data/spec/fixtures/lib/bundler/audit/cli/formats/bad.rb +0 -2
  41. data/spec/fixtures/lib/bundler/audit/cli/formats/good.rb +0 -2
  42. data/spec/integration_spec.rb +17 -103
  43. data/spec/results/unpatched_gem_spec.rb +2 -2
  44. data/spec/scanner_spec.rb +25 -1
  45. data/spec/spec_helper.rb +5 -1
  46. metadata +18 -17
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  require 'yaml'
@@ -26,14 +26,17 @@ module Bundler
26
26
  # @since 0.8.0
27
27
  #
28
28
  class Configuration
29
- class InvalidConfigurationError < StandardError; end
30
- class FileNotFound < StandardError; end
29
+ class InvalidConfigurationError < StandardError
30
+ end
31
+
32
+ class FileNotFound < StandardError
33
+ end
31
34
 
32
35
  #
33
36
  # A constructor method for loading configuration from a YAML file.
34
37
  #
35
38
  # @param [String] file_path
36
- # Path to the yaml file holding the configuration.
39
+ # Path to the YAML file holding the configuration.
37
40
  #
38
41
  # @raise [FileNotFound]
39
42
  # Will raise a file not found error when the path to the
@@ -52,6 +55,10 @@ module Bundler
52
55
 
53
56
  doc = YAML.parse(File.new(file_path))
54
57
 
58
+ unless doc.kind_of?(YAML::Nodes::Document)
59
+ raise(InvalidConfigurationError,"Configuration found in '#{file_path}' is not YAML")
60
+ end
61
+
55
62
  unless doc.root.kind_of?(YAML::Nodes::Mapping)
56
63
  raise(InvalidConfigurationError,"Configuration found in '#{file_path}' is not a Hash")
57
64
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  require 'bundler/audit/advisory'
@@ -82,7 +82,7 @@ module Bundler
82
82
  # The given path of the database to check.
83
83
  #
84
84
  # @return [Boolean]
85
- #
85
+ #
86
86
  # @since 0.8.0
87
87
  #
88
88
  def self.exists?(path=DEFAULT_PATH)
@@ -119,7 +119,7 @@ module Bundler
119
119
 
120
120
  path = options.fetch(:path,DEFAULT_PATH)
121
121
 
122
- command = %w(git clone)
122
+ command = %w[git clone]
123
123
  command << '--quiet' if options[:quiet]
124
124
  command << URL << path
125
125
 
@@ -199,7 +199,7 @@ module Bundler
199
199
  def update!(options={})
200
200
  if git?
201
201
  Dir.chdir(@path) do
202
- command = %w(git pull)
202
+ command = %w[git pull]
203
203
  command << '--quiet' if options[:quiet]
204
204
  command << 'origin' << 'master'
205
205
 
@@ -212,6 +212,22 @@ module Bundler
212
212
  end
213
213
  end
214
214
 
215
+ #
216
+ # The last commit ID of the repository.
217
+ #
218
+ # @return [String, nil]
219
+ # The commit hash or `nil` if the database is not a git repository.
220
+ #
221
+ # @since 0.9.0
222
+ #
223
+ def commit_id
224
+ if git?
225
+ Dir.chdir(@path) do
226
+ `git rev-parse HEAD`.chomp
227
+ end
228
+ end
229
+ end
230
+
215
231
  #
216
232
  # Determines the time when the database was last updated.
217
233
  #
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  require 'bundler/audit/results/result'
@@ -20,6 +20,9 @@ require 'bundler/audit/results/result'
20
20
  module Bundler
21
21
  module Audit
22
22
  module Results
23
+ #
24
+ # Represents an insecure gem source (ex: `git://...` or `http://...`).
25
+ #
23
26
  class InsecureSource < Result
24
27
 
25
28
  # The insecure `git://` or `http://` URI.
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  require 'bundler/audit/results/result'
@@ -22,6 +22,10 @@ require 'uri'
22
22
  module Bundler
23
23
  module Audit
24
24
  module Results
25
+ #
26
+ # Represents a gem version that has known vulnerabilities and needs to be
27
+ # upgraded.
28
+ #
25
29
  class UnpatchedGem < Result
26
30
 
27
31
  # The specification of the vulnerable gem.
@@ -73,7 +77,7 @@ module Bundler
73
77
  end
74
78
 
75
79
  #
76
- # Converts the unpached gem to a Hash.
80
+ # Converts the unpatched gem to a Hash.
77
81
  #
78
82
  # @return [Hash{Symbol => Object}]
79
83
  #
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  require 'bundler/audit/results/insecure_source'
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  require 'bundler'
@@ -31,6 +31,9 @@ require 'yaml'
31
31
 
32
32
  module Bundler
33
33
  module Audit
34
+ #
35
+ # Scans a `Gemfile.lock` for security issues.
36
+ #
34
37
  class Scanner
35
38
 
36
39
  # The advisory database
@@ -63,6 +66,9 @@ module Bundler
63
66
  # @param [Database] database
64
67
  # The database to scan against.
65
68
  #
69
+ # @param [String] config_dot_file
70
+ # The file name of the bundler-audit config file.
71
+ #
66
72
  # @raise [Bundler::GemfileLockNotFound]
67
73
  # The `gemfile_lock` file could not be found within the `root`
68
74
  # directory.
@@ -79,7 +85,7 @@ module Bundler
79
85
 
80
86
  @lockfile = LockfileParser.new(File.read(gemfile_lock_path))
81
87
 
82
- config_dot_file_full_path = File.join(@root,config_dot_file)
88
+ config_dot_file_full_path = File.absolute_path(config_dot_file, @root)
83
89
 
84
90
  @config = if File.exist?(config_dot_file_full_path)
85
91
  Configuration.load(config_dot_file_full_path)
@@ -2,6 +2,9 @@ require 'rake/tasklib'
2
2
 
3
3
  module Bundler
4
4
  module Audit
5
+ #
6
+ # Defines the `bundle:audit` rake tasks.
7
+ #
5
8
  class Task < Rake::TaskLib
6
9
  #
7
10
  # Initializes the task.
@@ -13,16 +16,28 @@ module Bundler
13
16
  protected
14
17
 
15
18
  #
16
- # Defines the `bundle:audit` task.
19
+ # Defines the `bundle:audit` and `bundle:audit:update` task.
17
20
  #
18
21
  def define
19
22
  namespace :bundle do
20
- desc 'Checks the Gemfile.lock for insecure dependencies'
21
- task :audit do
22
- require 'bundler/audit/cli'
23
- Bundler::Audit::CLI.start %w[check]
23
+ namespace :audit do
24
+ desc 'Checks the Gemfile.lock for insecure dependencies'
25
+ task :check do
26
+ system 'bundler-audit', 'check'
27
+ end
28
+
29
+ desc 'Updates the bundler-audit vulnerability database'
30
+ task :update do
31
+ system 'bundler-audit', 'update'
32
+ end
24
33
  end
34
+
35
+ task :audit => 'audit:check'
25
36
  end
37
+
38
+ task 'bundler:audit' => 'bundle:audit'
39
+ task 'bundler:audit:check' => 'bundle:audit:check'
40
+ task 'bundler:audit:update' => 'bundle:audit:update'
26
41
  end
27
42
  end
28
43
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,12 +12,12 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  module Bundler
19
19
  module Audit
20
20
  # bundler-audit version
21
- VERSION = '0.8.0.rc1'
21
+ VERSION = '0.9.0.1'
22
22
  end
23
23
  end
data/lib/bundler/audit.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2013-2020 Hal Brodigan (postmodern.mod3 at gmail.com)
2
+ # Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
3
3
  #
4
4
  # bundler-audit is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
12
12
  # GNU General Public License for more details.
13
13
  #
14
14
  # You should have received a copy of the GNU General Public License
15
- # along with bundler-audit. If not, see <http://www.gnu.org/licenses/>.
15
+ # along with bundler-audit. If not, see <https://www.gnu.org/licenses/>.
16
16
  #
17
17
 
18
18
  require 'bundler/audit/database'
@@ -83,7 +83,7 @@ describe Bundler::Audit::Advisory do
83
83
  end
84
84
 
85
85
  context "YAML data not representing a hash" do
86
- let(:path ) do
86
+ let(:path) do
87
87
  File.expand_path('../fixtures/advisory/not_a_hash.yml', __FILE__)
88
88
  end
89
89
 
@@ -353,4 +353,12 @@ describe Bundler::Audit::Advisory do
353
353
  end
354
354
  end
355
355
  end
356
+
357
+ describe "#to_h" do
358
+ subject { super().to_h }
359
+
360
+ it "must include criticality: :critical" do
361
+ expect(subject[:criticality]).to be :critical
362
+ end
363
+ end
356
364
  end
@@ -10,118 +10,120 @@ GIT
10
10
  GEM
11
11
  remote: http://rubygems.org/
12
12
  specs:
13
- actioncable (6.1.0)
14
- actionpack (= 6.1.0)
15
- activesupport (= 6.1.0)
13
+ actioncable (6.1.3.2)
14
+ actionpack (= 6.1.3.2)
15
+ activesupport (= 6.1.3.2)
16
16
  nio4r (~> 2.0)
17
17
  websocket-driver (>= 0.6.1)
18
- actionmailbox (6.1.0)
19
- actionpack (= 6.1.0)
20
- activejob (= 6.1.0)
21
- activerecord (= 6.1.0)
22
- activestorage (= 6.1.0)
23
- activesupport (= 6.1.0)
18
+ actionmailbox (6.1.3.2)
19
+ actionpack (= 6.1.3.2)
20
+ activejob (= 6.1.3.2)
21
+ activerecord (= 6.1.3.2)
22
+ activestorage (= 6.1.3.2)
23
+ activesupport (= 6.1.3.2)
24
24
  mail (>= 2.7.1)
25
- actionmailer (6.1.0)
26
- actionpack (= 6.1.0)
27
- actionview (= 6.1.0)
28
- activejob (= 6.1.0)
29
- activesupport (= 6.1.0)
25
+ actionmailer (6.1.3.2)
26
+ actionpack (= 6.1.3.2)
27
+ actionview (= 6.1.3.2)
28
+ activejob (= 6.1.3.2)
29
+ activesupport (= 6.1.3.2)
30
30
  mail (~> 2.5, >= 2.5.4)
31
31
  rails-dom-testing (~> 2.0)
32
- actionpack (6.1.0)
33
- actionview (= 6.1.0)
34
- activesupport (= 6.1.0)
32
+ actionpack (6.1.3.2)
33
+ actionview (= 6.1.3.2)
34
+ activesupport (= 6.1.3.2)
35
35
  rack (~> 2.0, >= 2.0.9)
36
36
  rack-test (>= 0.6.3)
37
37
  rails-dom-testing (~> 2.0)
38
38
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
39
- actiontext (6.1.0)
40
- actionpack (= 6.1.0)
41
- activerecord (= 6.1.0)
42
- activestorage (= 6.1.0)
43
- activesupport (= 6.1.0)
39
+ actiontext (6.1.3.2)
40
+ actionpack (= 6.1.3.2)
41
+ activerecord (= 6.1.3.2)
42
+ activestorage (= 6.1.3.2)
43
+ activesupport (= 6.1.3.2)
44
44
  nokogiri (>= 1.8.5)
45
- actionview (6.1.0)
46
- activesupport (= 6.1.0)
45
+ actionview (6.1.3.2)
46
+ activesupport (= 6.1.3.2)
47
47
  builder (~> 3.1)
48
48
  erubi (~> 1.4)
49
49
  rails-dom-testing (~> 2.0)
50
50
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
51
- activejob (6.1.0)
52
- activesupport (= 6.1.0)
51
+ activejob (6.1.3.2)
52
+ activesupport (= 6.1.3.2)
53
53
  globalid (>= 0.3.6)
54
- activemodel (6.1.0)
55
- activesupport (= 6.1.0)
56
- activerecord (6.1.0)
57
- activemodel (= 6.1.0)
58
- activesupport (= 6.1.0)
59
- activestorage (6.1.0)
60
- actionpack (= 6.1.0)
61
- activejob (= 6.1.0)
62
- activerecord (= 6.1.0)
63
- activesupport (= 6.1.0)
64
- marcel (~> 0.3.1)
65
- mimemagic (~> 0.3.2)
66
- activesupport (6.1.0)
54
+ activemodel (6.1.3.2)
55
+ activesupport (= 6.1.3.2)
56
+ activerecord (6.1.3.2)
57
+ activemodel (= 6.1.3.2)
58
+ activesupport (= 6.1.3.2)
59
+ activestorage (6.1.3.2)
60
+ actionpack (= 6.1.3.2)
61
+ activejob (= 6.1.3.2)
62
+ activerecord (= 6.1.3.2)
63
+ activesupport (= 6.1.3.2)
64
+ marcel (~> 1.0.0)
65
+ mini_mime (~> 1.0.2)
66
+ activesupport (6.1.3.2)
67
67
  concurrent-ruby (~> 1.0, >= 1.0.2)
68
68
  i18n (>= 1.6, < 2)
69
69
  minitest (>= 5.1)
70
70
  tzinfo (~> 2.0)
71
71
  zeitwerk (~> 2.3)
72
72
  builder (3.2.4)
73
- concurrent-ruby (1.1.7)
73
+ concurrent-ruby (1.1.8)
74
74
  crass (1.0.6)
75
75
  erubi (1.10.0)
76
76
  globalid (0.4.2)
77
77
  activesupport (>= 4.2.0)
78
- i18n (1.8.5)
78
+ i18n (1.8.10)
79
79
  concurrent-ruby (~> 1.0)
80
- loofah (2.8.0)
80
+ loofah (2.9.1)
81
81
  crass (~> 1.0.2)
82
82
  nokogiri (>= 1.5.9)
83
83
  mail (2.7.1)
84
84
  mini_mime (>= 0.1.1)
85
- marcel (0.3.3)
86
- mimemagic (~> 0.3.2)
85
+ marcel (1.0.1)
87
86
  method_source (1.0.0)
88
- mimemagic (0.3.5)
89
- mini_mime (1.0.2)
90
- mini_portile2 (2.4.0)
91
- minitest (5.14.2)
92
- nio4r (2.5.4)
93
- nokogiri (1.10.10)
94
- mini_portile2 (~> 2.4.0)
87
+ mini_mime (1.0.3)
88
+ mini_portile2 (2.5.1)
89
+ minitest (5.14.4)
90
+ nio4r (2.5.7)
91
+ nokogiri (1.11.6)
92
+ mini_portile2 (~> 2.5.0)
93
+ racc (~> 1.4)
94
+ nokogiri (1.11.6-x86_64-linux)
95
+ racc (~> 1.4)
96
+ racc (1.5.2)
95
97
  rack (2.2.3)
96
98
  rack-test (1.1.0)
97
99
  rack (>= 1.0, < 3)
98
- rails (6.1.0)
99
- actioncable (= 6.1.0)
100
- actionmailbox (= 6.1.0)
101
- actionmailer (= 6.1.0)
102
- actionpack (= 6.1.0)
103
- actiontext (= 6.1.0)
104
- actionview (= 6.1.0)
105
- activejob (= 6.1.0)
106
- activemodel (= 6.1.0)
107
- activerecord (= 6.1.0)
108
- activestorage (= 6.1.0)
109
- activesupport (= 6.1.0)
100
+ rails (6.1.3.2)
101
+ actioncable (= 6.1.3.2)
102
+ actionmailbox (= 6.1.3.2)
103
+ actionmailer (= 6.1.3.2)
104
+ actionpack (= 6.1.3.2)
105
+ actiontext (= 6.1.3.2)
106
+ actionview (= 6.1.3.2)
107
+ activejob (= 6.1.3.2)
108
+ activemodel (= 6.1.3.2)
109
+ activerecord (= 6.1.3.2)
110
+ activestorage (= 6.1.3.2)
111
+ activesupport (= 6.1.3.2)
110
112
  bundler (>= 1.15.0)
111
- railties (= 6.1.0)
113
+ railties (= 6.1.3.2)
112
114
  sprockets-rails (>= 2.0.0)
113
115
  rails-dom-testing (2.0.3)
114
116
  activesupport (>= 4.2.0)
115
117
  nokogiri (>= 1.6)
116
118
  rails-html-sanitizer (1.3.0)
117
119
  loofah (~> 2.3)
118
- railties (6.1.0)
119
- actionpack (= 6.1.0)
120
- activesupport (= 6.1.0)
120
+ railties (6.1.3.2)
121
+ actionpack (= 6.1.3.2)
122
+ activesupport (= 6.1.3.2)
121
123
  method_source
122
124
  rake (>= 0.8.7)
123
125
  thor (~> 1.0)
124
- rake (13.0.1)
126
+ rake (13.0.3)
125
127
  sprockets (4.0.2)
126
128
  concurrent-ruby (~> 1.0)
127
129
  rack (> 1, < 3)
@@ -129,10 +131,10 @@ GEM
129
131
  actionpack (>= 4.0)
130
132
  activesupport (>= 4.0)
131
133
  sprockets (>= 3.0.0)
132
- thor (1.0.1)
133
- tzinfo (2.0.3)
134
+ thor (1.1.0)
135
+ tzinfo (2.0.4)
134
136
  concurrent-ruby (~> 1.0)
135
- websocket-driver (0.7.3)
137
+ websocket-driver (0.7.4)
136
138
  websocket-extensions (>= 0.1.0)
137
139
  websocket-extensions (0.1.5)
138
140
  zeitwerk (2.4.2)