rubycritic 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/rubycritic/analysers_runner.rb +2 -5
- data/lib/rubycritic/core/analysed_modules_collection.rb +49 -0
- data/lib/rubycritic/generators/html/overview.rb +2 -0
- data/lib/rubycritic/generators/html/templates/overview.html.erb +4 -0
- data/lib/rubycritic/generators/json/simple.rb +2 -1
- data/lib/rubycritic/version.rb +1 -1
- data/rubycritic.gemspec +1 -1
- data/test/lib/rubycritic/analysers/smells/reek_test.rb +2 -2
- data/test/lib/rubycritic/core/analysed_modules_collection_test.rb +109 -0
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 08d300df3ff05cf7919348a8302d52623343c9b7
|
4
|
+
data.tar.gz: 75d743139e01f2310eec35c8300b25d0550f689a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3453709805cd4268e8093baf584b3db879c400bca3240e22c919dd1a3a6deea19d683750aaf48a9dca1e27c8c07374be50d7daccb009ede7fdcda14e22f6867
|
7
|
+
data.tar.gz: 2c746421764e0bef87f7798c09c7fbb4234758c73c9a408f776f7f4494231ba814b10e7750e678e9057817200a3ba1a3a96ae907752876be1075f47d33a18efe
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require "rubycritic/
|
2
|
-
require "rubycritic/core/analysed_module"
|
1
|
+
require "rubycritic/core/analysed_modules_collection"
|
3
2
|
require "rubycritic/analysers/smells/flay"
|
4
3
|
require "rubycritic/analysers/smells/flog"
|
5
4
|
require "rubycritic/analysers/smells/reek"
|
@@ -29,9 +28,7 @@ module Rubycritic
|
|
29
28
|
end
|
30
29
|
|
31
30
|
def analysed_modules
|
32
|
-
@analysed_modules ||=
|
33
|
-
AnalysedModule.new(:pathname => pathname)
|
34
|
-
end
|
31
|
+
@analysed_modules ||= AnalysedModulesCollection.new(@paths)
|
35
32
|
end
|
36
33
|
end
|
37
34
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "rubycritic/source_locator"
|
2
|
+
require "rubycritic/core/analysed_module"
|
3
|
+
|
4
|
+
module Rubycritic
|
5
|
+
class AnalysedModulesCollection
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
# Limit used to prevent very bad modules to have excessive impact in the
|
9
|
+
# overall result. See #limited_cost_for
|
10
|
+
COST_LIMIT = 32
|
11
|
+
# Score goes from 0 (worst) to 100 (perfect)
|
12
|
+
MAX_SCORE = 100
|
13
|
+
# Projects with an average cost of 16 (or above) will score 0, since 16
|
14
|
+
# is where the worst possible rating (F) starts
|
15
|
+
ZERO_SCORE_COST = 16
|
16
|
+
COST_MULTIPLIER = MAX_SCORE.to_f / ZERO_SCORE_COST
|
17
|
+
|
18
|
+
def initialize(paths)
|
19
|
+
@modules = SourceLocator.new(paths).pathnames.map do |pathname|
|
20
|
+
AnalysedModule.new(:pathname => pathname)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def each(&block)
|
25
|
+
@modules.each(&block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_json(*options)
|
29
|
+
@modules.to_json(*options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def score
|
33
|
+
MAX_SCORE - average_limited_cost * COST_MULTIPLIER
|
34
|
+
rescue
|
35
|
+
0.0
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def average_limited_cost
|
41
|
+
avg = map { |mod| limited_cost_for(mod) }.reduce(:+) / @modules.size.to_f
|
42
|
+
[avg, ZERO_SCORE_COST].min
|
43
|
+
end
|
44
|
+
|
45
|
+
def limited_cost_for(mod)
|
46
|
+
[mod.cost, COST_LIMIT].min
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/rubycritic/version.rb
CHANGED
data/rubycritic.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_runtime_dependency "virtus", "~> 1.0"
|
24
24
|
spec.add_runtime_dependency "flay", "2.6.1"
|
25
25
|
spec.add_runtime_dependency "flog", "4.3.2"
|
26
|
-
spec.add_runtime_dependency "reek", "3.
|
26
|
+
spec.add_runtime_dependency "reek", "3.7.1"
|
27
27
|
spec.add_runtime_dependency "parser", ">= 2.2.0", "< 3.0"
|
28
28
|
|
29
29
|
spec.add_development_dependency "bundler", "~> 1.3"
|
@@ -16,10 +16,10 @@ describe Rubycritic::Analyser::ReekSmells do
|
|
16
16
|
|
17
17
|
it "creates smells with messages" do
|
18
18
|
first_smell = @analysed_module.smells.first
|
19
|
-
first_smell.message.must_equal "has
|
19
|
+
first_smell.message.must_equal "has boolean parameter 'reek'"
|
20
20
|
|
21
21
|
last_smell = @analysed_module.smells.last
|
22
|
-
last_smell.message.must_equal "has
|
22
|
+
last_smell.message.must_equal "has no descriptive comment"
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "rubycritic/core/analysed_modules_collection"
|
3
|
+
|
4
|
+
describe Rubycritic::AnalysedModulesCollection do
|
5
|
+
subject { Rubycritic::AnalysedModulesCollection.new(paths) }
|
6
|
+
|
7
|
+
describe ".new" do
|
8
|
+
context "with an empty path" do
|
9
|
+
let(:paths) { "" }
|
10
|
+
|
11
|
+
it "returns an empty collection" do
|
12
|
+
subject.count.must_equal 0
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "with a list of files" do
|
17
|
+
let(:paths) { %w(test/samples/doesnt_exist.rb test/samples/unparsable.rb test/samples/empty.rb) }
|
18
|
+
|
19
|
+
it "registers one AnalysedModule element per existent file" do
|
20
|
+
subject.count.must_equal 2
|
21
|
+
subject.all? { |a| a.is_a?(Rubycritic::AnalysedModule) }.must_equal true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with a directory" do
|
26
|
+
let(:paths) { "test/samples/" }
|
27
|
+
|
28
|
+
it "recursively registers all files" do
|
29
|
+
subject.count.must_equal 13
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "with redundant paths" do
|
34
|
+
let(:paths) { %w(test/samples/flog test/samples/flog/complex.rb) }
|
35
|
+
|
36
|
+
it "returns a redundant collection" do
|
37
|
+
subject.count.must_equal 3
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#score" do
|
43
|
+
context "with no modules" do
|
44
|
+
let(:paths) { "" }
|
45
|
+
|
46
|
+
it "returns zero" do
|
47
|
+
subject.score.must_equal 0.0
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "with not analysed modules" do
|
52
|
+
let(:paths) { "test/samples/flog" }
|
53
|
+
|
54
|
+
it "returns zero" do
|
55
|
+
subject.score.must_equal 0.0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "with analysed modules" do
|
60
|
+
before do
|
61
|
+
subject.each_with_index do |mod, i|
|
62
|
+
mod.expects(:cost).returns costs[i]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
let(:paths) { %w(test/samples/flog test/samples/flay) }
|
67
|
+
|
68
|
+
context "with perfect modules" do
|
69
|
+
let(:costs) { [0.0, 0.0, 0.0, 0.0] }
|
70
|
+
|
71
|
+
it "returns the maximum score" do
|
72
|
+
subject.score.must_equal 100.0
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "with very bad modules" do
|
77
|
+
let(:costs) { [16.0, 16.0, 16.0, 16.0] }
|
78
|
+
|
79
|
+
it "returns zero" do
|
80
|
+
subject.score.must_equal 0.0
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "with horrible modules" do
|
85
|
+
let(:costs) { [32.0, 32.0, 32.0, 32.0] }
|
86
|
+
|
87
|
+
it "returns zero" do
|
88
|
+
subject.score.must_equal 0.0
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "with mixed modules" do
|
93
|
+
let(:costs) { [32.0, 2.0, 0.0, 2.0] }
|
94
|
+
|
95
|
+
it "properly calculates the score" do
|
96
|
+
subject.score.must_equal 43.75
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "with a module above the cost limit" do
|
101
|
+
let(:costs) { [220.0, 2.0, 0.0, 2.0] }
|
102
|
+
|
103
|
+
it "reduces the impact in the result" do
|
104
|
+
subject.score.must_equal 43.75
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubycritic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guilherme Simoes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 3.
|
61
|
+
version: 3.7.1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 3.
|
68
|
+
version: 3.7.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: parser
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,6 +198,7 @@ files:
|
|
198
198
|
- lib/rubycritic/commands/version.rb
|
199
199
|
- lib/rubycritic/configuration.rb
|
200
200
|
- lib/rubycritic/core/analysed_module.rb
|
201
|
+
- lib/rubycritic/core/analysed_modules_collection.rb
|
201
202
|
- lib/rubycritic/core/location.rb
|
202
203
|
- lib/rubycritic/core/rating.rb
|
203
204
|
- lib/rubycritic/core/smell.rb
|
@@ -250,6 +251,7 @@ files:
|
|
250
251
|
- test/lib/rubycritic/analysers/smells/reek_test.rb
|
251
252
|
- test/lib/rubycritic/configuration_test.rb
|
252
253
|
- test/lib/rubycritic/core/analysed_module_test.rb
|
254
|
+
- test/lib/rubycritic/core/analysed_modules_collection_test.rb
|
253
255
|
- test/lib/rubycritic/core/location_test.rb
|
254
256
|
- test/lib/rubycritic/core/smell_test.rb
|
255
257
|
- test/lib/rubycritic/core/smells_array_test.rb
|
@@ -300,7 +302,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
300
302
|
version: '0'
|
301
303
|
requirements: []
|
302
304
|
rubyforge_project:
|
303
|
-
rubygems_version: 2.4.
|
305
|
+
rubygems_version: 2.4.5
|
304
306
|
signing_key:
|
305
307
|
specification_version: 4
|
306
308
|
summary: RubyCritic is a Ruby code quality reporter
|
@@ -315,6 +317,7 @@ test_files:
|
|
315
317
|
- test/lib/rubycritic/analysers/smells/reek_test.rb
|
316
318
|
- test/lib/rubycritic/configuration_test.rb
|
317
319
|
- test/lib/rubycritic/core/analysed_module_test.rb
|
320
|
+
- test/lib/rubycritic/core/analysed_modules_collection_test.rb
|
318
321
|
- test/lib/rubycritic/core/location_test.rb
|
319
322
|
- test/lib/rubycritic/core/smell_test.rb
|
320
323
|
- test/lib/rubycritic/core/smells_array_test.rb
|