repo_analyzer 1.3.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 54ba42a406d9f7d7b89588217709447e77a85619969e38d2ad07b683ef3b7308
4
- data.tar.gz: 349ad885453dbfffe666b3968f6a89064094c05635552130e1e2596f94a8219c
3
+ metadata.gz: 2eebe99c02596c84f2083e7bbbc0caacb0261f702ed21421015f6c9d71e0015d
4
+ data.tar.gz: db9318ec621fbd332662d7211b86ed581fb40a4d9108c2a465181f39d81feb91
5
5
  SHA512:
6
- metadata.gz: 1547a6ca87bf7aa12f063019b06eaec47d068390e5706fbcce14ec40da76a42ec67fb88090dd645ebf451332b401d3fc36039a0e21ab0817691197bb3ba40175
7
- data.tar.gz: 56b67a96d0fad9e2130d6785e73882731a3cacc927e166bd733ef0e0981154ec523204b59492b9db6470a14cb7aad8610039fee2e2b421ad5658db2d116f01db
6
+ metadata.gz: c948672842944f02f10a8fafd98628dbf098030fe97b5074e6cbb0ae67d992716c03f5bfe7a306abaf64401cca0b3c6d8dd03fef24824a6ff624c7e454e0525d
7
+ data.tar.gz: 74a2984c5557c394cfce472533fecff7c5a82a5b6e95b6d2f2074fca9b1ca15004b50a5a4ca6d5e0440717c26968826f50e44fcf760dc03a72cc42c58314a4dd
data/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ### v1.5.0
6
+ #### Added
7
+
8
+ * Run analyze rake task with custom project path.
9
+ #### Fixed
10
+
11
+ * Remove [fasterer](https://github.com/DamirSvrtan/fasterer) extractor.
12
+ ### v1.4.0
13
+ #### Added
14
+
15
+ * Add [reek](https://github.com/troessner/reek) extractor.
16
+ * Add [fasterer](https://github.com/DamirSvrtan/fasterer) extractor.
17
+ * Add [bundler-audit](https://github.com/rubysec/bundler-audit) extractor.
18
+ * Add [bundler-stats](https://github.com/jmmastey/bundler-stats) extractor.
5
19
 
6
20
  ### v1.3.0
7
21
 
data/Gemfile.lock CHANGED
@@ -1,11 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- repo_analyzer (1.3.0)
4
+ repo_analyzer (1.5.0)
5
5
  brakeman
6
+ bundler-audit
7
+ bundler-stats
8
+ faraday-retry
9
+ fasterer
6
10
  octokit (~> 4.0)
7
11
  rails (>= 6.0)
8
12
  rails_best_practices
13
+ reek
9
14
  rubocop (~> 1.9)
10
15
  rubocop-performance
11
16
  rubocop-platanus (~> 0.2)
@@ -79,9 +84,16 @@ GEM
79
84
  ast (2.4.2)
80
85
  brakeman (5.3.1)
81
86
  builder (3.2.4)
87
+ bundler-audit (0.9.1)
88
+ bundler (>= 1.2.0, < 3)
89
+ thor (~> 1.0)
90
+ bundler-stats (2.3.0)
91
+ bundler (>= 1.9, < 3)
92
+ thor (>= 0.19.0, < 2.0)
82
93
  code_analyzer (0.5.5)
83
94
  sexp_processor
84
95
  coderay (1.1.3)
96
+ colorize (0.8.1)
85
97
  concurrent-ruby (1.1.10)
86
98
  coveralls (0.8.23)
87
99
  json (>= 1.8, < 3)
@@ -104,6 +116,11 @@ GEM
104
116
  faraday-net_http (>= 2.0, < 3.1)
105
117
  ruby2_keywords (>= 0.0.4)
106
118
  faraday-net_http (3.0.2)
119
+ faraday-retry (2.1.0)
120
+ faraday (~> 2.0)
121
+ fasterer (0.10.1)
122
+ colorize (~> 0.7)
123
+ ruby_parser (>= 3.19.1)
107
124
  ffi (1.15.5)
108
125
  formatador (1.1.0)
109
126
  globalid (1.0.0)
@@ -125,6 +142,7 @@ GEM
125
142
  i18n (1.12.0)
126
143
  concurrent-ruby (~> 1.0)
127
144
  json (2.6.3)
145
+ kwalify (0.7.2)
128
146
  listen (3.7.1)
129
147
  rb-fsevent (~> 0.10, >= 0.10.3)
130
148
  rb-inotify (~> 0.9, >= 0.9.10)
@@ -165,7 +183,7 @@ GEM
165
183
  faraday (>= 1, < 3)
166
184
  sawyer (~> 0.9)
167
185
  parallel (1.22.1)
168
- parser (3.1.3.0)
186
+ parser (3.2.2.1)
169
187
  ast (~> 2.4.1)
170
188
  pry (0.14.1)
171
189
  coderay (~> 1.1)
@@ -216,6 +234,11 @@ GEM
216
234
  rb-fsevent (0.11.2)
217
235
  rb-inotify (0.10.1)
218
236
  ffi (~> 1.0)
237
+ reek (6.1.4)
238
+ kwalify (~> 0.7.0)
239
+ parser (~> 3.2.0)
240
+ rainbow (>= 2.0, < 4.0)
241
+ rexml (~> 3.1)
219
242
  regexp_parser (2.6.1)
220
243
  require_all (3.0.0)
221
244
  rexml (3.2.5)
@@ -267,6 +290,8 @@ GEM
267
290
  rubocop (~> 1.33)
268
291
  ruby-progressbar (1.11.0)
269
292
  ruby2_keywords (0.0.5)
293
+ ruby_parser (3.20.1)
294
+ sexp_processor (~> 4.16)
270
295
  sawyer (0.9.2)
271
296
  addressable (>= 2.3.5)
272
297
  faraday (>= 0.17.3, < 3)
@@ -316,8 +341,6 @@ DEPENDENCIES
316
341
  repo_analyzer!
317
342
  rspec-rails
318
343
  rspec_junit_formatter
319
- rubocop (~> 1.9)
320
- rubocop-rails
321
344
  sqlite3
322
345
 
323
346
  BUNDLED WITH
@@ -0,0 +1,50 @@
1
+ module RepoAnalyzer
2
+ class BundlerAuditExtractor < ProjectInfoExtractor
3
+ KEY_VALUE_REGEXP = /\A(.*):\s(.*)\z/
4
+
5
+ private
6
+
7
+ def extracted_info
8
+ { vulnerabilities: audit_info }
9
+ end
10
+
11
+ def audit_info
12
+ audit_collection.inject({}) do |memo, row|
13
+ category = nil
14
+
15
+ formatted_item = row.split("\n").inject({}) do |item, line|
16
+ key, value = extract_key_value_form_row(line)
17
+
18
+ if key == :criticality
19
+ category = value
20
+ memo[category] ||= []
21
+ next item
22
+ end
23
+
24
+ item[key] = value
25
+ item
26
+ end
27
+
28
+ memo[category] << formatted_item
29
+ memo
30
+ end
31
+ end
32
+
33
+ def audit_collection
34
+ collection = audit_raw_result.split("\n\n")
35
+ collection.pop
36
+ collection
37
+ end
38
+
39
+ def extract_key_value_form_row(line)
40
+ key, value = line.scan(KEY_VALUE_REGEXP).flatten
41
+ key = key.gsub(" ", "_").downcase.to_sym
42
+ [key, value]
43
+ end
44
+
45
+ def audit_raw_result
46
+ `bundle exec bundle-audit update`
47
+ `bundle exec bundle-audit check #{project_data_bridge.project_path}`
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,10 @@
1
+ module RepoAnalyzer
2
+ class BundlerStatsExtractor < ProjectInfoExtractor
3
+ private
4
+
5
+ def extracted_info
6
+ result = `bundle exec bundle-stats stats -f json`
7
+ JSON.parse(result)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,38 @@
1
+ require "reek/cli/application"
2
+
3
+ module RepoAnalyzer
4
+ class ReekExtractor < ProjectInfoExtractor
5
+ private
6
+
7
+ def extracted_info
8
+ { warnings: reek_info }
9
+ end
10
+
11
+ def reek_info
12
+ @reek_info ||= reek_json.inject({}) do |memo, warning|
13
+ memo[warning["smell_type"]] ||= []
14
+ memo[warning["smell_type"]] << {
15
+ lines: warning["lines"],
16
+ message: warning["message"],
17
+ source: relative_file_name(warning["source"]),
18
+ name: warning["name"],
19
+ documentation_link: warning["documentation_link"]
20
+ }
21
+ memo
22
+ end
23
+ end
24
+
25
+ def relative_file_name(file_path)
26
+ file_path.gsub(%r{\A\D*#{project_data_bridge.project_path}/}, "")
27
+ end
28
+
29
+ def reek_json
30
+ application = Reek::CLI::Application.new(
31
+ ["--format=json", project_data_bridge.project_path]
32
+ )
33
+
34
+ result = OutputUtils.with_captured_stdout { application.execute }
35
+ JSON.parse(result)
36
+ end
37
+ end
38
+ end
@@ -1,8 +1,8 @@
1
1
  module RepoAnalyzer
2
2
  class ExtractProjectInfoJob < ApplicationJob
3
- def perform(repo_name)
3
+ def perform(repo_name, project_path)
4
4
  project_info = {}
5
- bridge = RepoAnalyzer::ProjectDataBridge.new(repo_name)
5
+ bridge = RepoAnalyzer::ProjectDataBridge.new(repo_name, project_path)
6
6
 
7
7
  for_each_extractor do |extractor|
8
8
  extracted_data = extractor.new(bridge).extract
@@ -1,3 +1,3 @@
1
1
  module RepoAnalyzer
2
- VERSION = '1.3.0'
2
+ VERSION = '1.5.0'
3
3
  end
data/lib/repo_analyzer.rb CHANGED
@@ -1,6 +1,10 @@
1
+ require "bundler/audit"
2
+ require "bundler/stats"
1
3
  require "brakeman"
4
+ require "fasterer"
2
5
  require "octokit"
3
6
  require "rails_best_practices"
7
+ require "reek"
4
8
  require "rubocop"
5
9
  require "rubocop-performance"
6
10
  require "rubocop-platanus"
@@ -1,7 +1,9 @@
1
1
  namespace :repo_analyzer do
2
2
  desc "Extract repo info and post to defined endpoint"
3
- task :analyze, [:repo_name] => :environment do |_t, args|
4
- project_info = RepoAnalyzer::ExtractProjectInfoJob.perform_now(args.repo_name)
3
+ task :analyze, [:repo_name, :project_path] => :environment do |_t, args|
4
+ project_info = RepoAnalyzer::ExtractProjectInfoJob.perform_now(
5
+ args.repo_name, args.project_path
6
+ )
5
7
  RepoAnalyzer::PostExtractedInfoJob.perform_now(args.repo_name, project_info)
6
8
  end
7
9
  end
@@ -19,10 +19,15 @@ Gem::Specification.new do |s|
19
19
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  s.test_files = Dir["spec/**/*"]
21
21
 
22
+ s.add_dependency "bundler-audit"
23
+ s.add_dependency "bundler-stats"
22
24
  s.add_dependency "brakeman"
25
+ s.add_dependency "faraday-retry"
26
+ s.add_dependency "fasterer"
23
27
  s.add_dependency "octokit", "~> 4.0"
24
28
  s.add_dependency "rails", ">= 6.0"
25
29
  s.add_dependency "rails_best_practices"
30
+ s.add_dependency "reek"
26
31
  s.add_dependency "rubocop", "~> 1.9"
27
32
  s.add_dependency "rubocop-performance"
28
33
  s.add_dependency "rubocop-platanus", "~> 0.2"
@@ -37,6 +42,4 @@ Gem::Specification.new do |s|
37
42
  s.add_development_dependency "pry-rails"
38
43
  s.add_development_dependency "rspec_junit_formatter"
39
44
  s.add_development_dependency "rspec-rails"
40
- s.add_development_dependency "rubocop", "~> 1.9"
41
- s.add_development_dependency "rubocop-rails"
42
45
  end
@@ -0,0 +1,141 @@
1
+ require 'rails_helper'
2
+
3
+ describe RepoAnalyzer::BundlerAuditExtractor, repo_analyzer_extractor_helpers: true do
4
+ describe "#extract" do
5
+ let(:audit_result_content) do
6
+ <<~TEXT
7
+ Name: actionpack
8
+ Version: 6.1.7
9
+ CVE: CVE-2023-22792
10
+ GHSA: GHSA-p84v-45xj-wwqj
11
+ Criticality: Unknown
12
+ URL: https://github.com/rails/rails/releases/tag/v7.0.4.1
13
+ Title: ReDoS based DoS vulnerability in Action Dispatch
14
+ Solution: upgrade to '~> 5.2.8, >= 5.2.8.15', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'
15
+
16
+ Name: actionpack
17
+ Version: 6.1.7
18
+ CVE: CVE-2023-22795
19
+ GHSA: GHSA-8xww-x3g3-6jcv
20
+ Criticality: Unknown
21
+ URL: https://github.com/rails/rails/releases/tag/v7.0.4.1
22
+ Title: ReDoS based DoS vulnerability in Action Dispatch
23
+ Solution: upgrade to '~> 5.2.8, >= 5.2.8.15', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'
24
+
25
+ Name: activerecord
26
+ Version: 6.1.7
27
+ CVE: CVE-2022-44566
28
+ GHSA: GHSA-579w-22j4-4749
29
+ Criticality: High
30
+ URL: https://github.com/rails/rails/releases/tag/v7.0.4.1
31
+ Title: Denial of Service Vulnerability in ActiveRecord's PostgreSQL adapter
32
+ Solution: upgrade to '~> 5.2.8, >= 5.2.8.15', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'
33
+
34
+ Name: activerecord
35
+ Version: 6.1.7
36
+ CVE: CVE-2023-22794
37
+ GHSA: GHSA-hq7p-j377-6v63
38
+ Criticality: High
39
+ URL: https://github.com/rails/rails/releases/tag/v7.0.4.1
40
+ Title: SQL Injection Vulnerability via ActiveRecord comments
41
+ Solution: upgrade to '~> 6.0.6, >= 6.0.6.1', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'
42
+
43
+ Name: loofah
44
+ Version: 2.19.0
45
+ CVE: CVE-2022-23515
46
+ GHSA: GHSA-228g-948r-83gx
47
+ Criticality: Medium
48
+ URL: https://github.com/flavorjones/loofah/security/advisories/GHSA-228g-948r-83gx
49
+ Title: Improper neutralization of data URIs may allow XSS in Loofah
50
+ Solution: upgrade to '>= 2.19.1'
51
+
52
+ Name: rails-html-sanitizer
53
+ Version: 1.4.3
54
+ CVE: CVE-2022-23520
55
+ GHSA: GHSA-rrfc-7g8p-99q8
56
+ Criticality: Medium
57
+ URL: https://github.com/rails/rails-html-sanitizer/security/advisories/GHSA-rrfc-7g8p-99q8
58
+ Title: Possible XSS vulnerability with certain configurations of rails-html-sanitizer
59
+ Solution: upgrade to '>= 1.4.4'
60
+
61
+ Vulnerabilities found!
62
+ TEXT
63
+ end
64
+
65
+ before do
66
+ allow(extractor).to receive(:`).with('bundle exec bundle-audit update')
67
+ allow(extractor).to receive(:`).with(
68
+ 'bundle exec bundle-audit check spec/assets/test_project'
69
+ ).and_return(audit_result_content)
70
+ end
71
+
72
+ let(:expected) do
73
+ {
74
+ "vulnerabilities" => {
75
+ "Unknown" => [
76
+ {
77
+ name: "actionpack",
78
+ version: "6.1.7",
79
+ cve: "CVE-2023-22792",
80
+ ghsa: "GHSA-p84v-45xj-wwqj",
81
+ url: "https://github.com/rails/rails/releases/tag/v7.0.4.1",
82
+ title: "ReDoS based DoS vulnerability in Action Dispatch",
83
+ solution: "upgrade to '~> 5.2.8, >= 5.2.8.15', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'"
84
+ },
85
+ {
86
+ name: "actionpack",
87
+ version: "6.1.7",
88
+ cve: "CVE-2023-22795",
89
+ ghsa: "GHSA-8xww-x3g3-6jcv",
90
+ url: "https://github.com/rails/rails/releases/tag/v7.0.4.1",
91
+ title: "ReDoS based DoS vulnerability in Action Dispatch",
92
+ solution: "upgrade to '~> 5.2.8, >= 5.2.8.15', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'"
93
+ }
94
+ ],
95
+ "High" => [
96
+ {
97
+ name: "activerecord",
98
+ version: "6.1.7",
99
+ cve: "CVE-2022-44566",
100
+ ghsa: "GHSA-579w-22j4-4749",
101
+ url: "https://github.com/rails/rails/releases/tag/v7.0.4.1",
102
+ title: "Denial of Service Vulnerability in ActiveRecord's PostgreSQL adapter",
103
+ solution: "upgrade to '~> 5.2.8, >= 5.2.8.15', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'"
104
+ },
105
+ {
106
+ name: "activerecord",
107
+ version: "6.1.7",
108
+ cve: "CVE-2023-22794",
109
+ ghsa: "GHSA-hq7p-j377-6v63",
110
+ url: "https://github.com/rails/rails/releases/tag/v7.0.4.1",
111
+ title: "SQL Injection Vulnerability via ActiveRecord comments",
112
+ solution: "upgrade to '~> 6.0.6, >= 6.0.6.1', '~> 6.1.7, >= 6.1.7.1', '>= 7.0.4.1'"
113
+ }
114
+ ],
115
+ "Medium" => [
116
+ {
117
+ name: "loofah",
118
+ version: "2.19.0",
119
+ cve: "CVE-2022-23515",
120
+ ghsa: "GHSA-228g-948r-83gx",
121
+ url: "https://github.com/flavorjones/loofah/security/advisories/GHSA-228g-948r-83gx",
122
+ title: "Improper neutralization of data URIs may allow XSS in Loofah",
123
+ solution: "upgrade to '>= 2.19.1'"
124
+ },
125
+ {
126
+ name: "rails-html-sanitizer",
127
+ version: "1.4.3",
128
+ cve: "CVE-2022-23520",
129
+ ghsa: "GHSA-rrfc-7g8p-99q8",
130
+ url: "https://github.com/rails/rails-html-sanitizer/security/advisories/GHSA-rrfc-7g8p-99q8",
131
+ title: "Possible XSS vulnerability with certain configurations of rails-html-sanitizer",
132
+ solution: "upgrade to '>= 1.4.4'"
133
+ }
134
+ ]
135
+ }
136
+ }.with_indifferent_access
137
+ end
138
+
139
+ it { expect(extract[:bundler_audit_extractor]).to eq(expected) }
140
+ end
141
+ end
@@ -0,0 +1,285 @@
1
+ require 'rails_helper'
2
+
3
+ describe RepoAnalyzer::BundlerStatsExtractor, repo_analyzer_extractor_helpers: true do
4
+ describe "#extract" do
5
+ let(:stats) do
6
+ {
7
+ "summary": {
8
+ "declared": 10,
9
+ "unpinned": 9,
10
+ "total": 117,
11
+ "github": 0
12
+ },
13
+ "gems": [
14
+ {
15
+ "name": "repo_analyzer",
16
+ "total_dependencies": 84,
17
+ "first_level_dependencies": 14,
18
+ "top_level_dependencies": {},
19
+ "transitive_dependencies": [
20
+ "brakeman (>= 0)",
21
+ "bundler-audit (>= 0)",
22
+ "bundler-stats (>= 0)",
23
+ "faraday-retry (>= 0)",
24
+ "fasterer (>= 0)",
25
+ "octokit (~> 4.0)",
26
+ "rails (>= 6.0)",
27
+ "rails_best_practices (>= 0)",
28
+ "reek (>= 0)",
29
+ "rubocop (~> 1.9)",
30
+ "rubocop-performance (>= 0)",
31
+ "rubocop-platanus (~> 0.2)",
32
+ "rubocop-rails (>= 0)",
33
+ "rubocop-rspec (~> 2.2)",
34
+ "bundler (>= 1.2.0, < 3)",
35
+ "thor (~> 1.0)",
36
+ "faraday (~> 2.0)",
37
+ "faraday-net_http (>= 2.0, < 3.1)",
38
+ "ruby2_keywords (>= 0.0.4)",
39
+ "colorize (~> 0.7)",
40
+ "ruby_parser (>= 3.19.1)",
41
+ "sexp_processor (~> 4.16)",
42
+ "sawyer (~> 0.9)",
43
+ "addressable (>= 2.3.5)",
44
+ "public_suffix (>= 2.0.2, < 6.0)",
45
+ "actioncable (= 6.1.7)",
46
+ "actionmailbox (= 6.1.7)",
47
+ "actionmailer (= 6.1.7)",
48
+ "actionpack (= 6.1.7)",
49
+ "actiontext (= 6.1.7)",
50
+ "actionview (= 6.1.7)",
51
+ "activejob (= 6.1.7)",
52
+ "activemodel (= 6.1.7)",
53
+ "activerecord (= 6.1.7)",
54
+ "activestorage (= 6.1.7)",
55
+ "activesupport (= 6.1.7)",
56
+ "railties (= 6.1.7)",
57
+ "sprockets-rails (>= 2.0.0)",
58
+ "nio4r (~> 2.0)",
59
+ "websocket-driver (>= 0.6.1)",
60
+ "rack (~> 2.0, >= 2.0.9)",
61
+ "rack-test (>= 0.6.3)",
62
+ "rails-dom-testing (~> 2.0)",
63
+ "rails-html-sanitizer (~> 1.0, >= 1.2.0)",
64
+ "builder (~> 3.1)",
65
+ "erubi (~> 1.4)",
66
+ "concurrent-ruby (~> 1.0, >= 1.0.2)",
67
+ "i18n (>= 1.6, < 2)",
68
+ "minitest (>= 5.1)",
69
+ "tzinfo (~> 2.0)",
70
+ "zeitwerk (~> 2.3)",
71
+ "nokogiri (>= 1.6)",
72
+ "mini_portile2 (~> 2.8.0)",
73
+ "racc (~> 1.4)",
74
+ "loofah (~> 2.3)",
75
+ "crass (~> 1.0.2)",
76
+ "websocket-extensions (>= 0.1.0)",
77
+ "mail (>= 2.7.1)",
78
+ "globalid (>= 0.3.6)",
79
+ "marcel (~> 1.0)",
80
+ "mini_mime (>= 1.1.0)",
81
+ "net-imap (>= 0)",
82
+ "net-pop (>= 0)",
83
+ "net-smtp (>= 0)",
84
+ "date (>= 0)",
85
+ "net-protocol (>= 0)",
86
+ "timeout (>= 0)",
87
+ "method_source (>= 0)",
88
+ "rake (>= 12.2)",
89
+ "sprockets (>= 3.0.0)",
90
+ "code_analyzer (~> 0.5.5)",
91
+ "erubis (>= 0)",
92
+ "json (>= 0)",
93
+ "require_all (~> 3.0)",
94
+ "ruby-progressbar (>= 0)",
95
+ "kwalify (~> 0.7.0)",
96
+ "parser (~> 3.2.0)",
97
+ "rainbow (>= 2.0, < 4.0)",
98
+ "rexml (~> 3.1)",
99
+ "ast (~> 2.4.1)",
100
+ "parallel (~> 1.10)",
101
+ "regexp_parser (>= 1.8, < 3.0)",
102
+ "rubocop-ast (>= 1.23.0, < 2.0)",
103
+ "unicode-display_width (>= 1.4.0, < 3.0)"
104
+ ]
105
+ },
106
+ {
107
+ "name": "rspec-rails",
108
+ "total_dependencies": 28,
109
+ "first_level_dependencies": 7,
110
+ "top_level_dependencies": {},
111
+ "transitive_dependencies": [
112
+ "actionpack (>= 6.1)",
113
+ "activesupport (>= 6.1)",
114
+ "railties (>= 6.1)",
115
+ "rspec-core (~> 3.11)",
116
+ "rspec-expectations (~> 3.11)",
117
+ "rspec-mocks (~> 3.11)",
118
+ "rspec-support (~> 3.11)",
119
+ "actionview (= 6.1.7)",
120
+ "rack (~> 2.0, >= 2.0.9)",
121
+ "rack-test (>= 0.6.3)",
122
+ "rails-dom-testing (~> 2.0)",
123
+ "rails-html-sanitizer (~> 1.0, >= 1.2.0)",
124
+ "builder (~> 3.1)",
125
+ "erubi (~> 1.4)",
126
+ "concurrent-ruby (~> 1.0, >= 1.0.2)",
127
+ "i18n (>= 1.6, < 2)",
128
+ "minitest (>= 5.1)",
129
+ "tzinfo (~> 2.0)",
130
+ "zeitwerk (~> 2.3)",
131
+ "nokogiri (>= 1.6)",
132
+ "mini_portile2 (~> 2.8.0)",
133
+ "racc (~> 1.4)",
134
+ "loofah (~> 2.3)",
135
+ "crass (~> 1.0.2)",
136
+ "method_source (>= 0)",
137
+ "rake (>= 12.2)",
138
+ "thor (~> 1.0)",
139
+ "diff-lcs (>= 1.2.0, < 2.0)"
140
+ ]
141
+ },
142
+ {
143
+ "name": "factory_bot_rails",
144
+ "total_dependencies": 24,
145
+ "first_level_dependencies": 2,
146
+ "top_level_dependencies": {},
147
+ "transitive_dependencies": [
148
+ "factory_bot (~> 6.2.0)",
149
+ "railties (>= 5.0.0)",
150
+ "activesupport (>= 5.0.0)",
151
+ "concurrent-ruby (~> 1.0, >= 1.0.2)",
152
+ "i18n (>= 1.6, < 2)",
153
+ "minitest (>= 5.1)",
154
+ "tzinfo (~> 2.0)",
155
+ "zeitwerk (~> 2.3)",
156
+ "actionpack (= 6.1.7)",
157
+ "method_source (>= 0)",
158
+ "rake (>= 12.2)",
159
+ "thor (~> 1.0)",
160
+ "actionview (= 6.1.7)",
161
+ "rack (~> 2.0, >= 2.0.9)",
162
+ "rack-test (>= 0.6.3)",
163
+ "rails-dom-testing (~> 2.0)",
164
+ "rails-html-sanitizer (~> 1.0, >= 1.2.0)",
165
+ "builder (~> 3.1)",
166
+ "erubi (~> 1.4)",
167
+ "nokogiri (>= 1.6)",
168
+ "mini_portile2 (~> 2.8.0)",
169
+ "racc (~> 1.4)",
170
+ "loofah (~> 2.3)",
171
+ "crass (~> 1.0.2)"
172
+ ]
173
+ },
174
+ {
175
+ "name": "guard-rspec",
176
+ "total_dependencies": 21,
177
+ "first_level_dependencies": 3,
178
+ "top_level_dependencies": {},
179
+ "transitive_dependencies": [
180
+ "guard (~> 2.1)",
181
+ "guard-compat (~> 1.1)",
182
+ "rspec (>= 2.99.0, < 4.0)",
183
+ "formatador (>= 0.2.4)",
184
+ "listen (>= 2.7, < 4.0)",
185
+ "lumberjack (>= 1.0.12, < 2.0)",
186
+ "nenv (~> 0.1)",
187
+ "notiffany (~> 0.0)",
188
+ "pry (>= 0.13.0)",
189
+ "shellany (~> 0.0)",
190
+ "thor (>= 0.18.1)",
191
+ "rb-fsevent (~> 0.10, >= 0.10.3)",
192
+ "rb-inotify (~> 0.9, >= 0.9.10)",
193
+ "ffi (~> 1.0)",
194
+ "coderay (~> 1.1)",
195
+ "method_source (~> 1.0)",
196
+ "rspec-core (~> 3.12.0)",
197
+ "rspec-expectations (~> 3.12.0)",
198
+ "rspec-mocks (~> 3.12.0)",
199
+ "rspec-support (~> 3.12.0)",
200
+ "diff-lcs (>= 1.2.0, < 2.0)"
201
+ ]
202
+ },
203
+ {
204
+ "name": "coveralls",
205
+ "total_dependencies": 8,
206
+ "first_level_dependencies": 5,
207
+ "top_level_dependencies": {},
208
+ "transitive_dependencies": [
209
+ "json (>= 1.8, < 3)",
210
+ "simplecov (~> 0.16.1)",
211
+ "term-ansicolor (~> 1.3)",
212
+ "thor (>= 0.19.4, < 2.0)",
213
+ "tins (~> 1.6)",
214
+ "docile (~> 1.1)",
215
+ "simplecov-html (~> 0.10.0)",
216
+ "sync (>= 0)"
217
+ ]
218
+ },
219
+ {
220
+ "name": "pry-rails",
221
+ "total_dependencies": 3,
222
+ "first_level_dependencies": 1,
223
+ "top_level_dependencies": {},
224
+ "transitive_dependencies": [
225
+ "pry (>= 0.10.4)",
226
+ "coderay (~> 1.1)",
227
+ "method_source (~> 1.0)"
228
+ ]
229
+ },
230
+ {
231
+ "name": "pry",
232
+ "total_dependencies": 2,
233
+ "first_level_dependencies": 2,
234
+ "top_level_dependencies": {
235
+ "guard": "guard (2.18.0)",
236
+ "guard-rspec": "guard-rspec (4.7.3)",
237
+ "pry-rails": "pry-rails (0.3.9)"
238
+ },
239
+ "transitive_dependencies": [
240
+ "coderay (~> 1.1)",
241
+ "method_source (~> 1.0)"
242
+ ]
243
+ },
244
+ {
245
+ "name": "rspec_junit_formatter",
246
+ "total_dependencies": 2,
247
+ "first_level_dependencies": 1,
248
+ "top_level_dependencies": {},
249
+ "transitive_dependencies": [
250
+ "rspec-core (>= 2, < 4, != 2.12.0)",
251
+ "rspec-support (~> 3.12.0)"
252
+ ]
253
+ },
254
+ {
255
+ "name": "bundler",
256
+ "total_dependencies": 0,
257
+ "first_level_dependencies": 0,
258
+ "top_level_dependencies": {
259
+ "bundler-audit": "bundler-audit (0.9.1)",
260
+ "bundler-stats": "bundler-stats (2.3.0)",
261
+ "rails": "rails (6.1.7)",
262
+ "repo_analyzer": "repo_analyzer (1.3.0)"
263
+ },
264
+ "transitive_dependencies": []
265
+ },
266
+ {
267
+ "name": "sqlite3",
268
+ "total_dependencies": 0,
269
+ "first_level_dependencies": 0,
270
+ "top_level_dependencies": {},
271
+ "transitive_dependencies": []
272
+ }
273
+ ]
274
+ }
275
+ end
276
+
277
+ before do
278
+ allow(extractor).to receive(:`).with(
279
+ 'bundle exec bundle-stats stats -f json'
280
+ ).and_return(stats.to_json)
281
+ end
282
+
283
+ it { expect(extract[:bundler_stats_extractor]).to eq(stats.with_indifferent_access) }
284
+ end
285
+ end
@@ -0,0 +1,76 @@
1
+ require 'rails_helper'
2
+
3
+ describe RepoAnalyzer::ReekExtractor, repo_analyzer_extractor_helpers: true do
4
+ describe "#extract" do
5
+ let(:reek_result_content) do
6
+ [
7
+ {
8
+ "context" => "ApplicationCable::Channel",
9
+ "lines" => [2],
10
+ "message" => "has no descriptive comment",
11
+ "smell_type" => "IrresponsibleModule",
12
+ "source" => "spec/assets/test_project/app/channels/application_cable/channel.rb",
13
+ "documentation_link" => "http://gh.com/reek/blob/v6.1.4/docs/Irresponsible-Module.md"
14
+ },
15
+ {
16
+ "context" => "ApplicationCable::Connection",
17
+ "lines" => [2],
18
+ "message" => "has no descriptive comment",
19
+ "smell_type" => "IrresponsibleModule",
20
+ "source" => "spec/assets/test_project/app/channels/application_cable/connection.rb",
21
+ "documentation_link" => "http://gh.com/reek/blob/v6.1.4/docs/Irresponsible-Module.md"
22
+ },
23
+ {
24
+ "context" => "AbastibleClient#parse_prices_by_type",
25
+ "lines" => [189],
26
+ "message" => "has the variable name 'e'",
27
+ "smell_type" => "UncommunicativeVariableName",
28
+ "source" => "spec/assets/test_project/app/clients/abastible_client.rb",
29
+ "name" => "e",
30
+ "documentation_link" => "http://gh.com/reek/blob/v6.1.4/docs/Uncommunicative-Variable-Name.md"
31
+ }
32
+ ].to_json
33
+ end
34
+
35
+ before do
36
+ allow(OutputUtils).to receive(:with_captured_stdout).and_return(reek_result_content)
37
+ end
38
+
39
+ let(:expected) do
40
+ {
41
+ "warnings" =>
42
+ {
43
+ "IrresponsibleModule" =>
44
+ [
45
+ {
46
+ "lines" => [2],
47
+ "message" => "has no descriptive comment",
48
+ "source" => "app/channels/application_cable/channel.rb",
49
+ "name" => nil,
50
+ "documentation_link" => "http://gh.com/reek/blob/v6.1.4/docs/Irresponsible-Module.md"
51
+ },
52
+ {
53
+ "lines" => [2],
54
+ "message" => "has no descriptive comment",
55
+ "source" => "app/channels/application_cable/connection.rb",
56
+ "name" => nil,
57
+ "documentation_link" => "http://gh.com/reek/blob/v6.1.4/docs/Irresponsible-Module.md"
58
+ }
59
+ ],
60
+ "UncommunicativeVariableName" =>
61
+ [
62
+ {
63
+ "lines" => [189],
64
+ "message" => "has the variable name 'e'",
65
+ "source" => "app/clients/abastible_client.rb",
66
+ "name" => "e",
67
+ "documentation_link" => "http://gh.com/reek/blob/v6.1.4/docs/Uncommunicative-Variable-Name.md"
68
+ }
69
+ ]
70
+ }
71
+ }
72
+ end
73
+
74
+ it { expect(extract[:reek_extractor]).to eq(expected) }
75
+ end
76
+ end
@@ -2,6 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe RepoAnalyzer::ExtractProjectInfoJob, type: :job do
4
4
  let(:repo_name) { "platanus/alisur-formulator" }
5
+ let(:project_path) { "spec/assets/test_project" }
5
6
 
6
7
  let(:files_list) do
7
8
  "app/extractors/repo_analyzer/project_versions_extractor.rb"
@@ -31,7 +32,7 @@ describe RepoAnalyzer::ExtractProjectInfoJob, type: :job do
31
32
  let(:engine_root) { instance_double("Pathname", join: files_list) }
32
33
 
33
34
  def perform_now
34
- described_class.perform_now(repo_name)
35
+ described_class.perform_now(repo_name, project_path)
35
36
  end
36
37
 
37
38
  before do
@@ -44,7 +45,7 @@ describe RepoAnalyzer::ExtractProjectInfoJob, type: :job do
44
45
 
45
46
  it do
46
47
  perform_now
47
- expect(RepoAnalyzer::ProjectDataBridge).to have_received(:new).with(repo_name).once
48
+ expect(RepoAnalyzer::ProjectDataBridge).to have_received(:new).with(repo_name, project_path).once
48
49
  expect(RepoAnalyzer::ProjectVersionsExtractor).to have_received(:new).with(bridge).once
49
50
  end
50
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repo_analyzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Platanus
@@ -9,8 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-04-04 00:00:00.000000000 Z
12
+ date: 2023-06-06 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler-audit
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler-stats
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
14
42
  - !ruby/object:Gem::Dependency
15
43
  name: brakeman
16
44
  requirement: !ruby/object:Gem::Requirement
@@ -25,6 +53,34 @@ dependencies:
25
53
  - - ">="
26
54
  - !ruby/object:Gem::Version
27
55
  version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: faraday-retry
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: fasterer
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
28
84
  - !ruby/object:Gem::Dependency
29
85
  name: octokit
30
86
  requirement: !ruby/object:Gem::Requirement
@@ -67,6 +123,20 @@ dependencies:
67
123
  - - ">="
68
124
  - !ruby/object:Gem::Version
69
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: reek
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
70
140
  - !ruby/object:Gem::Dependency
71
141
  name: rubocop
72
142
  requirement: !ruby/object:Gem::Requirement
@@ -249,34 +319,6 @@ dependencies:
249
319
  - - ">="
250
320
  - !ruby/object:Gem::Version
251
321
  version: '0'
252
- - !ruby/object:Gem::Dependency
253
- name: rubocop
254
- requirement: !ruby/object:Gem::Requirement
255
- requirements:
256
- - - "~>"
257
- - !ruby/object:Gem::Version
258
- version: '1.9'
259
- type: :development
260
- prerelease: false
261
- version_requirements: !ruby/object:Gem::Requirement
262
- requirements:
263
- - - "~>"
264
- - !ruby/object:Gem::Version
265
- version: '1.9'
266
- - !ruby/object:Gem::Dependency
267
- name: rubocop-rails
268
- requirement: !ruby/object:Gem::Requirement
269
- requirements:
270
- - - ">="
271
- - !ruby/object:Gem::Version
272
- version: '0'
273
- type: :development
274
- prerelease: false
275
- version_requirements: !ruby/object:Gem::Requirement
276
- requirements:
277
- - - ">="
278
- - !ruby/object:Gem::Version
279
- version: '0'
280
322
  description: Rails engine to extract technical debt
281
323
  email:
282
324
  - rubygems@platan.us
@@ -305,6 +347,8 @@ files:
305
347
  - app/clients/repo_analyzer/github_client.rb
306
348
  - app/controllers/repo_analyzer/application_controller.rb
307
349
  - app/extractors/repo_analyzer/brakeman_extractor.rb
350
+ - app/extractors/repo_analyzer/bundler_audit_extractor.rb
351
+ - app/extractors/repo_analyzer/bundler_stats_extractor.rb
308
352
  - app/extractors/repo_analyzer/circleci_extractor.rb
309
353
  - app/extractors/repo_analyzer/github_extractor.rb
310
354
  - app/extractors/repo_analyzer/power_types_extractor.rb
@@ -312,6 +356,7 @@ files:
312
356
  - app/extractors/repo_analyzer/project_info_extractor.rb
313
357
  - app/extractors/repo_analyzer/project_versions_extractor.rb
314
358
  - app/extractors/repo_analyzer/rails_best_practices_extractor.rb
359
+ - app/extractors/repo_analyzer/reek_extractor.rb
315
360
  - app/extractors/repo_analyzer/rubocop_extractor.rb
316
361
  - app/extractors/repo_analyzer/tests_info_extractor.rb
317
362
  - app/helpers/repo_analyzer/application_helper.rb
@@ -399,12 +444,15 @@ files:
399
444
  - spec/dummy/public/apple-touch-icon.png
400
445
  - spec/dummy/public/favicon.ico
401
446
  - spec/extractors/brakeman_extractor_spec.rb
447
+ - spec/extractors/bundler_audit_extractor_spec.rb
448
+ - spec/extractors/bundler_stats_extractor_spec.rb
402
449
  - spec/extractors/circleci_extractor_spec.rb
403
450
  - spec/extractors/github_extractor_spec.rb
404
451
  - spec/extractors/power_types_extractor_spec.rb
405
452
  - spec/extractors/project_config_extractor_spec.rb
406
453
  - spec/extractors/project_versions_extractor_spec.rb
407
454
  - spec/extractors/rails_best_practices_extractor_spec.rb
455
+ - spec/extractors/reek_extractor_spec.rb
408
456
  - spec/extractors/rubocop_extractor_spec.rb
409
457
  - spec/extractors/tests_info_extractor_spec.rb
410
458
  - spec/fixtures/files/image.png
@@ -503,12 +551,15 @@ test_files:
503
551
  - spec/dummy/public/apple-touch-icon.png
504
552
  - spec/dummy/public/favicon.ico
505
553
  - spec/extractors/brakeman_extractor_spec.rb
554
+ - spec/extractors/bundler_audit_extractor_spec.rb
555
+ - spec/extractors/bundler_stats_extractor_spec.rb
506
556
  - spec/extractors/circleci_extractor_spec.rb
507
557
  - spec/extractors/github_extractor_spec.rb
508
558
  - spec/extractors/power_types_extractor_spec.rb
509
559
  - spec/extractors/project_config_extractor_spec.rb
510
560
  - spec/extractors/project_versions_extractor_spec.rb
511
561
  - spec/extractors/rails_best_practices_extractor_spec.rb
562
+ - spec/extractors/reek_extractor_spec.rb
512
563
  - spec/extractors/rubocop_extractor_spec.rb
513
564
  - spec/extractors/tests_info_extractor_spec.rb
514
565
  - spec/fixtures/files/image.png