metric_fu 4.11.4 → 4.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.md +10 -1
- data/checksum/metric_fu-4.11.4.gem.sha512 +1 -0
- data/lib/metric_fu/metrics/rcov/rcov_line.rb +2 -2
- data/lib/metric_fu/metrics/reek/generator.rb +28 -82
- data/lib/metric_fu/version.rb +7 -1
- data/metric_fu.gemspec +1 -1
- data/spec/capture_warnings.rb +11 -8
- data/spec/metric_fu/metrics/rcov/rcov_line_spec.rb +2 -2
- data/spec/metric_fu/metrics/reek/generator_spec.rb +87 -117
- data/spec/quality_spec.rb +28 -10
- data/spec/spec_helper.rb +3 -0
- metadata +9 -30
- checksums.yaml.gz.sig +0 -1
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17c8fa2540d144f89979c7f5586a71c3889a29f5
|
4
|
+
data.tar.gz: 23514588a8ce5ab8ebea208c91874c220db2a1fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81f84088449c69e96c1e3830e3d938e0cef39d6e81b68c69699924f71d6e012d3b4ef055d19df66ba067a59c202f2fd5f33bfafefae1b4817f678596f79ac232
|
7
|
+
data.tar.gz: 3da37a9252de3c65890b68c5593b9cab45fdaf86a1b36f995c2a3f609787c22382810ab7d5eb3210c1275823eceeef937e2b6111baa52afb0925b823d059f485
|
data/HISTORY.md
CHANGED
@@ -4,13 +4,22 @@ Each change should fall into categories that would affect whether the release is
|
|
4
4
|
|
5
5
|
As such, a _Feature_ would map to either major (breaking change) or minor. A _bug fix_ to a patch. And _misc_ is either minor or patch, the difference being kind of fuzzy for the purposes of history. Adding tests would be patch level.
|
6
6
|
|
7
|
-
### Master [changes](https://github.com/metricfu/metric_fu/compare/v4.
|
7
|
+
### Master [changes](https://github.com/metricfu/metric_fu/compare/v4.12.0...master)
|
8
8
|
|
9
9
|
* Breaking Changes
|
10
10
|
* Features
|
11
11
|
* Fixes
|
12
12
|
* Misc
|
13
13
|
|
14
|
+
### [4.12.0](https://github.com/metricfu/metric_fu/compare/v4.11.4...v4.12.0)
|
15
|
+
|
16
|
+
* Features
|
17
|
+
* Add line numbers to reek output. (ggallen, #255)
|
18
|
+
* Use reek directly. (Martin Gotink, #258)
|
19
|
+
* Add support for reek 2. (Martin Gotink, #258)
|
20
|
+
* Fixes
|
21
|
+
* Use same styling for covered as ignored lines. (Martin Gotink, #254)
|
22
|
+
|
14
23
|
### [4.11.4](https://github.com/metricfu/metric_fu/compare/v4.11.3...v4.11.4)
|
15
24
|
|
16
25
|
* Fixes
|
@@ -0,0 +1 @@
|
|
1
|
+
9a74861bf6d89f703786e562cdff96eea727aac874e0d9615d4ac8af57b2c97d15e2121de8d978b7097b56bd72b40744c9a27be9d3d12f9ecf75b66ac565e3ef
|
@@ -1,7 +1,5 @@
|
|
1
1
|
module MetricFu
|
2
2
|
class ReekGenerator < Generator
|
3
|
-
REEK_REGEX = /^(\S+) (.*) \((.*)\)$/
|
4
|
-
|
5
3
|
def self.metric
|
6
4
|
:reek
|
7
5
|
end
|
@@ -10,36 +8,20 @@ module MetricFu
|
|
10
8
|
files = files_to_analyze
|
11
9
|
if files.empty?
|
12
10
|
mf_log "Skipping Reek, no files found to analyze"
|
13
|
-
@output =
|
11
|
+
@output = run!([], config_files)
|
14
12
|
else
|
15
|
-
|
16
|
-
@output = run!(args)
|
17
|
-
@output = massage_for_reek_12 if reek_12?
|
13
|
+
@output = run!(files, config_files)
|
18
14
|
end
|
19
15
|
end
|
20
16
|
|
21
|
-
def run!(
|
22
|
-
|
23
|
-
|
24
|
-
MetricFu::Utility.capture_output do
|
25
|
-
Reek::Cli::Application.new(args).execute
|
26
|
-
end
|
17
|
+
def run!(files, config_files)
|
18
|
+
examiner.new(files, config_files)
|
27
19
|
end
|
28
20
|
|
29
21
|
def analyze
|
30
|
-
@matches = @output.
|
31
|
-
|
32
|
-
|
33
|
-
file_path = match.shift.split(" -- ").first
|
34
|
-
file_path = file_path.gsub('"', " ").strip
|
35
|
-
code_smells = match.map do |smell|
|
36
|
-
match_object = smell.match(REEK_REGEX)
|
37
|
-
next unless match_object
|
38
|
-
{ method: match_object[1].strip,
|
39
|
-
message: match_object[2].strip,
|
40
|
-
type: match_object[3].strip }
|
41
|
-
end.compact
|
42
|
-
{ file_path: file_path, code_smells: code_smells }
|
22
|
+
@matches = @output.smells.group_by(&:source).collect do |file_path, smells|
|
23
|
+
{ file_path: file_path,
|
24
|
+
code_smells: analyze_smells(smells) }
|
43
25
|
end
|
44
26
|
end
|
45
27
|
|
@@ -67,31 +49,6 @@ module MetricFu
|
|
67
49
|
end
|
68
50
|
end
|
69
51
|
|
70
|
-
def reek_12?
|
71
|
-
return false if @output.length == 0
|
72
|
-
(@output =~ /^"/) != 0
|
73
|
-
end
|
74
|
-
|
75
|
-
def massage_for_reek_12
|
76
|
-
section_break = ""
|
77
|
-
@output.split("\n").map do |line|
|
78
|
-
case line
|
79
|
-
when /^ /
|
80
|
-
"#{line.gsub(/^ /, '')}\n"
|
81
|
-
else
|
82
|
-
parts = line.split(" -- ")
|
83
|
-
if parts[1].nil?
|
84
|
-
"#{line}\n"
|
85
|
-
else
|
86
|
-
warnings = parts[1].gsub(/ \(.*\):/, ":")
|
87
|
-
result = "#{section_break}\"#{parts[0]}\" -- #{warnings}\n"
|
88
|
-
section_break = "\n"
|
89
|
-
result
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end.join
|
93
|
-
end
|
94
|
-
|
95
52
|
private
|
96
53
|
|
97
54
|
def files_to_analyze
|
@@ -100,47 +57,36 @@ module MetricFu
|
|
100
57
|
remove_excluded_files(files_to_reek)
|
101
58
|
end
|
102
59
|
|
103
|
-
def cli_options(files)
|
104
|
-
[
|
105
|
-
disable_line_number_option,
|
106
|
-
turn_off_color,
|
107
|
-
*config_option,
|
108
|
-
*files
|
109
|
-
].reject(&:empty?)
|
110
|
-
end
|
111
|
-
|
112
60
|
# TODO: Check that specified line config file exists
|
113
|
-
def
|
114
|
-
|
115
|
-
if config_file_pattern.to_s.empty?
|
116
|
-
[""]
|
117
|
-
else
|
118
|
-
["--config", config_file_pattern]
|
119
|
-
end
|
61
|
+
def config_files
|
62
|
+
Array(options[:config_file_pattern])
|
120
63
|
end
|
121
64
|
|
122
|
-
|
123
|
-
|
124
|
-
if reek_version >= "1.3.7"
|
125
|
-
"--no-color"
|
126
|
-
else
|
127
|
-
""
|
128
|
-
end
|
65
|
+
def analyze_smells(smells)
|
66
|
+
smells.collect(&method(:smell_data))
|
129
67
|
end
|
130
68
|
|
131
|
-
def
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
69
|
+
def smell_data(smell)
|
70
|
+
{ method: smell.context,
|
71
|
+
message: smell.message,
|
72
|
+
type: smell_type(smell),
|
73
|
+
lines: smell.lines }
|
136
74
|
end
|
137
75
|
|
138
|
-
def
|
139
|
-
|
76
|
+
def smell_type(smell)
|
77
|
+
return smell.subclass if smell.respond_to?(:subclass)
|
78
|
+
|
79
|
+
smell.smell_type
|
140
80
|
end
|
141
81
|
|
142
|
-
def
|
143
|
-
|
82
|
+
def examiner
|
83
|
+
require "reek"
|
84
|
+
# To load any changing dependencies such as "reek/configuration/app_configuration"
|
85
|
+
# Added in 1.6.0 https://github.com/troessner/reek/commit/7f4ed2be442ca926e08ccc41945e909e8f710947
|
86
|
+
# But not always loaded
|
87
|
+
require "reek/cli/application"
|
88
|
+
|
89
|
+
Reek.const_defined?(:Examiner) ? Reek.const_get(:Examiner) : Reek.const_get(:Core).const_get(:Examiner)
|
144
90
|
end
|
145
91
|
end
|
146
92
|
end
|
data/lib/metric_fu/version.rb
CHANGED
data/metric_fu.gemspec
CHANGED
@@ -45,7 +45,7 @@ Gem::Specification.new do |s|
|
|
45
45
|
s.add_runtime_dependency "flay", [">= 2.0.1", "~> 2.1"]
|
46
46
|
s.add_runtime_dependency "churn", ["~> 0.0.35"]
|
47
47
|
s.add_runtime_dependency "flog", [">= 4.1.1", "~> 4.1"]
|
48
|
-
s.add_runtime_dependency "reek", [">= 1.3.4", "
|
48
|
+
s.add_runtime_dependency "reek", [">= 1.3.4", "< 3.0"]
|
49
49
|
s.add_runtime_dependency "cane", [">= 2.5.2", "~> 2.5"]
|
50
50
|
s.add_runtime_dependency "rails_best_practices", [">= 1.14.3", "~> 1.14"]
|
51
51
|
s.add_runtime_dependency "metric_fu-Saikuro", [">= 1.1.3", "~> 1.1"]
|
data/spec/capture_warnings.rb
CHANGED
@@ -7,10 +7,10 @@ require "tempfile"
|
|
7
7
|
require "fileutils"
|
8
8
|
|
9
9
|
stderr_file = Tempfile.new("app.stderr")
|
10
|
-
|
11
|
-
output_dir = File.join(
|
10
|
+
app_root ||= Dir.pwd
|
11
|
+
output_dir = File.join(app_root, "tmp")
|
12
12
|
FileUtils.mkdir_p(output_dir)
|
13
|
-
bundle_dir = File.join(
|
13
|
+
bundle_dir = File.join(app_root, "bundle")
|
14
14
|
|
15
15
|
RSpec.configure do |config|
|
16
16
|
config.before(:suite) do
|
@@ -25,9 +25,9 @@ RSpec.configure do |config|
|
|
25
25
|
|
26
26
|
$stderr.reopen(STDERR)
|
27
27
|
|
28
|
-
app_warnings, other_warnings = lines.partition
|
29
|
-
line.include?(
|
30
|
-
|
28
|
+
app_warnings, other_warnings = lines.partition { |line|
|
29
|
+
line.include?(app_root) && !line.include?(bundle_dir)
|
30
|
+
}
|
31
31
|
|
32
32
|
if app_warnings.any?
|
33
33
|
puts <<-WARNINGS
|
@@ -40,13 +40,16 @@ RSpec.configure do |config|
|
|
40
40
|
end
|
41
41
|
|
42
42
|
if other_warnings.any?
|
43
|
-
File.
|
43
|
+
output_file = File.join(output_dir, "warnings.txt")
|
44
|
+
File.write(output_file, other_warnings.join("\n") << "\n")
|
44
45
|
puts
|
45
46
|
puts "Non-app warnings written to tmp/warnings.txt"
|
46
47
|
puts
|
47
48
|
end
|
48
49
|
|
49
50
|
# fail the build...
|
50
|
-
|
51
|
+
if app_warnings.any?
|
52
|
+
abort "Failing build due to app warnings: #{app_warnings.inspect}"
|
53
|
+
end
|
51
54
|
end
|
52
55
|
end
|
@@ -71,9 +71,9 @@ describe MetricFu::RCovLine do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
describe "#css_class" do
|
74
|
-
it "returns '' for an ignored line" do
|
74
|
+
it "returns 'rcov_run' for an ignored line" do
|
75
75
|
rcov_line = RCovLine.new("", nil)
|
76
|
-
expect(rcov_line.css_class).to eq("")
|
76
|
+
expect(rcov_line.css_class).to eq("rcov_run")
|
77
77
|
end
|
78
78
|
|
79
79
|
it "returns 'rcov_not_run' for a missed line" do
|
@@ -13,80 +13,102 @@ describe MetricFu::ReekGenerator do
|
|
13
13
|
|
14
14
|
it "includes config file pattern into reek parameters when specified" do
|
15
15
|
options.merge!(config_file_pattern: "lib/config/*.reek")
|
16
|
-
expect(reek).to receive(:run!) do |args|
|
17
|
-
expect(args).to include("--config", "lib/config/*.reek")
|
18
|
-
end.and_return("")
|
19
|
-
reek.emit
|
20
|
-
end
|
21
16
|
|
22
|
-
|
23
|
-
|
24
|
-
expect(args).not_to include("")
|
17
|
+
expect(reek).to receive(:run!) do |_files, config_files|
|
18
|
+
expect(config_files).to eq(["lib/config/*.reek"])
|
25
19
|
end.and_return("")
|
26
|
-
reek.emit
|
27
|
-
end
|
28
20
|
|
29
|
-
it "turns off color output from reek output, for reek 1.3.7 or greater" do
|
30
|
-
allow(reek).to receive(:reek_version).and_return("1.3.7")
|
31
|
-
expect(reek).to receive(:run!) do |args|
|
32
|
-
expect(args).to include("--no-color")
|
33
|
-
end.and_return("")
|
34
21
|
reek.emit
|
35
22
|
end
|
36
23
|
|
37
|
-
it "
|
38
|
-
|
39
|
-
|
40
|
-
expect(args).not_to include("--no-color")
|
24
|
+
it "passes an empty array when no config file pattern is specified" do
|
25
|
+
expect(reek).to receive(:run!) do |_files, config_files|
|
26
|
+
expect(config_files).to eq([])
|
41
27
|
end.and_return("")
|
42
|
-
reek.emit
|
43
|
-
end
|
44
28
|
|
45
|
-
it "disables lines numbers from reek output" do
|
46
|
-
expect(reek).to receive(:run!) do |args|
|
47
|
-
expect(args).to include("--no-line-numbers")
|
48
|
-
end.and_return("")
|
49
29
|
reek.emit
|
50
30
|
end
|
51
31
|
|
52
32
|
it "includes files to analyze into reek parameters" do
|
53
|
-
expect(reek).to receive(:run!) do |
|
54
|
-
expect(
|
33
|
+
expect(reek).to receive(:run!) do |files, _config_files|
|
34
|
+
expect(files).to eq(["lib/foo.rb", "lib/bar.rb"])
|
55
35
|
end.and_return("")
|
36
|
+
|
56
37
|
reek.emit
|
57
38
|
end
|
58
39
|
end
|
59
40
|
|
60
|
-
# TODO review tested output
|
61
41
|
describe "analyze method" do
|
62
42
|
before :each do
|
63
43
|
MetricFu::Configuration.run {}
|
64
44
|
allow(File).to receive(:directory?).and_return(true)
|
65
45
|
@reek = MetricFu::ReekGenerator.new
|
46
|
+
@examiner = @reek.send(:examiner)
|
47
|
+
@smell_warning = Reek.const_defined?(:SmellWarning) ? Reek.const_get(:SmellWarning) : Reek.const_get(:Smells).const_get(:SmellWarning)
|
48
|
+
if @smell_warning.instance_methods.include?(:subclass)
|
49
|
+
@smell_warning.send(:alias_method, :smell_type, :subclass)
|
50
|
+
end
|
66
51
|
end
|
67
52
|
|
68
53
|
context "with reek warnings" do
|
69
54
|
before :each do
|
70
|
-
@
|
71
|
-
|
72
|
-
|
73
|
-
ActivityReportsController#authorize_user
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
"
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
55
|
+
@smells = [
|
56
|
+
instance_double(@smell_warning,
|
57
|
+
source: "app/controllers/activity_reports_controller.rb",
|
58
|
+
context: "ActivityReportsController#authorize_user",
|
59
|
+
message: "calls current_user.primary_site_ids multiple times",
|
60
|
+
smell_type: "Duplication",
|
61
|
+
lines: [2, 4]),
|
62
|
+
instance_double(@smell_warning,
|
63
|
+
source: "app/controllers/activity_reports_controller.rb",
|
64
|
+
context: "ActivityReportsController#authorize_user",
|
65
|
+
message: "calls params[id] multiple times",
|
66
|
+
smell_type: "Duplication",
|
67
|
+
lines: [5, 7]),
|
68
|
+
instance_double(@smell_warning,
|
69
|
+
source: "app/controllers/activity_reports_controller.rb",
|
70
|
+
context: "ActivityReportsController#authorize_user",
|
71
|
+
message: "calls params[primary_site_id] multiple times",
|
72
|
+
smell_type: "Duplication",
|
73
|
+
lines: [11, 15]),
|
74
|
+
instance_double(@smell_warning,
|
75
|
+
source: "app/controllers/activity_reports_controller.rb",
|
76
|
+
context: "ActivityReportsController#authorize_user",
|
77
|
+
message: "has approx 6 statements",
|
78
|
+
smell_type: "Long Method",
|
79
|
+
lines: [8]),
|
80
|
+
|
81
|
+
instance_double(@smell_warning,
|
82
|
+
source: "app/controllers/application.rb",
|
83
|
+
context: "ApplicationController#start_background_task/block/block",
|
84
|
+
message: "is nested",
|
85
|
+
smell_type: "Nested Iterators",
|
86
|
+
lines: [23]),
|
87
|
+
|
88
|
+
instance_double(@smell_warning,
|
89
|
+
source: "app/controllers/link_targets_controller.rb",
|
90
|
+
context: "LinkTargetsController#authorize_user",
|
91
|
+
message: "calls current_user.role multiple times",
|
92
|
+
smell_type: "Duplication",
|
93
|
+
lines: [8]),
|
94
|
+
|
95
|
+
instance_double(@smell_warning,
|
96
|
+
source: "app/controllers/newline_controller.rb",
|
97
|
+
context: "NewlineController#some_method",
|
98
|
+
message: "calls current_user.<< \"new line\n\" multiple times",
|
99
|
+
smell_type: "Duplication",
|
100
|
+
lines: [6, 9])
|
101
|
+
]
|
102
|
+
@lines = instance_double(@examiner, smells: @smells)
|
86
103
|
@reek.instance_variable_set(:@output, @lines)
|
87
104
|
@matches = @reek.analyze
|
88
105
|
end
|
89
106
|
|
107
|
+
it "should find the code smell's line numbers" do
|
108
|
+
smell = @matches.first[:code_smells].first
|
109
|
+
expect(smell[:lines]).to eq([2, 4])
|
110
|
+
end
|
111
|
+
|
90
112
|
it "should find the code smell's method name" do
|
91
113
|
smell = @matches.first[:code_smells].first
|
92
114
|
expect(smell[:method]).to eq("ActivityReportsController#authorize_user")
|
@@ -109,91 +131,39 @@ NewlineController#some_method calls current_user.<< "new line\n" multiple times
|
|
109
131
|
|
110
132
|
it "should NOT insert nil smells into the array when there's a newline in the method call" do
|
111
133
|
expect(@matches.last[:code_smells]).to eq(@matches.last[:code_smells].compact)
|
112
|
-
expect(@matches.last).to eq(file_path: "app/controllers/newline_controller.rb",
|
113
|
-
code_smells: [{ type: "Duplication",
|
114
|
-
method: "\"",
|
115
|
-
message: "multiple times" }])
|
116
|
-
# Note: hopefully a temporary solution until I figure out how to deal with newlines in the method call more effectively -Jake 5/11/2009
|
117
134
|
end
|
118
135
|
end
|
119
136
|
|
120
|
-
context "
|
137
|
+
context "with reek 1.3 output" do
|
121
138
|
before :each do
|
122
|
-
@
|
123
|
-
|
124
|
-
|
125
|
-
|
139
|
+
@smells = [
|
140
|
+
double(source: "app/controllers/activity_reports_controller.rb",
|
141
|
+
context: "ActivityReportsController#authorize_user",
|
142
|
+
message: "calls current_user.primary_site_ids multiple times",
|
143
|
+
subclass: "Duplication",
|
144
|
+
lines: [2, 4]),
|
145
|
+
]
|
146
|
+
@lines = instance_double(@examiner, smells: @smells)
|
126
147
|
@reek.instance_variable_set(:@output, @lines)
|
127
148
|
@matches = @reek.analyze
|
128
149
|
end
|
129
150
|
|
130
|
-
it "
|
131
|
-
|
151
|
+
it "uses the subclass field to find the smell type" do
|
152
|
+
smell = @matches.first[:code_smells].first
|
153
|
+
expect(smell[:type]).to eq('Duplication')
|
132
154
|
end
|
133
155
|
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe MetricFu::ReekGenerator do
|
138
|
-
before :each do
|
139
|
-
MetricFu::Configuration.run {}
|
140
|
-
@reek = MetricFu::ReekGenerator.new
|
141
|
-
@lines11 = <<-HERE
|
142
|
-
"app/controllers/activity_reports_controller.rb" -- 4 warnings:
|
143
|
-
ActivityReportsController#authorize_user calls current_user.primary_site_ids multiple times (Duplication)
|
144
|
-
ActivityReportsController#authorize_user calls params[id] multiple times (Duplication)
|
145
|
-
ActivityReportsController#authorize_user calls params[primary_site_id] multiple times (Duplication)
|
146
|
-
ActivityReportsController#authorize_user has approx 6 statements (Long Method)
|
147
|
-
|
148
|
-
"app/controllers/application.rb" -- 1 warnings:
|
149
|
-
ApplicationController#start_background_task/block/block is nested (Nested Iterators)
|
150
|
-
|
151
|
-
"app/controllers/link_targets_controller.rb" -- 1 warnings:
|
152
|
-
LinkTargetsController#authorize_user calls current_user.role multiple times (Duplication)
|
153
|
-
|
154
|
-
"app/controllers/newline_controller.rb" -- 1 warnings:
|
155
|
-
NewlineController#some_method calls current_user.<< "new line\n" multiple times (Duplication)
|
156
|
-
HERE
|
157
|
-
@lines12 = <<-HERE
|
158
|
-
app/controllers/activity_reports_controller.rb -- 4 warnings (+3 masked):
|
159
|
-
ActivityReportsController#authorize_user calls current_user.primary_site_ids multiple times (Duplication)
|
160
|
-
ActivityReportsController#authorize_user calls params[id] multiple times (Duplication)
|
161
|
-
ActivityReportsController#authorize_user calls params[primary_site_id] multiple times (Duplication)
|
162
|
-
ActivityReportsController#authorize_user has approx 6 statements (Long Method)
|
163
|
-
app/controllers/application.rb -- 1 warnings:
|
164
|
-
ApplicationController#start_background_task/block/block is nested (Nested Iterators)
|
165
|
-
app/controllers/link_targets_controller.rb -- 1 warnings (+1 masked):
|
166
|
-
LinkTargetsController#authorize_user calls current_user.role multiple times (Duplication)
|
167
|
-
app/controllers/newline_controller.rb -- 1 warnings:
|
168
|
-
NewlineController#some_method calls current_user.<< "new line\n" multiple times (Duplication)
|
169
|
-
HERE
|
170
|
-
end
|
171
|
-
|
172
|
-
context "with Reek 1.1 output format" do
|
173
|
-
it "reports 1.1 style when the output is empty" do
|
174
|
-
@reek.instance_variable_set(:@output, "")
|
175
|
-
expect(@reek).not_to be_reek_12
|
176
|
-
end
|
177
|
-
it "detects 1.1 format output" do
|
178
|
-
@reek.instance_variable_set(:@output, @lines11)
|
179
|
-
expect(@reek).not_to be_reek_12
|
180
|
-
end
|
181
|
-
|
182
|
-
it "massages empty output to be unchanged" do
|
183
|
-
@reek.instance_variable_set(:@output, "")
|
184
|
-
expect(@reek.massage_for_reek_12).to be_empty
|
185
|
-
end
|
186
|
-
end
|
187
156
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
157
|
+
context "without reek warnings" do
|
158
|
+
before :each do
|
159
|
+
@lines = instance_double(@examiner, smells: [])
|
160
|
+
@reek.instance_variable_set(:@output, @lines)
|
161
|
+
@matches = @reek.analyze
|
162
|
+
end
|
193
163
|
|
194
|
-
|
195
|
-
|
196
|
-
|
164
|
+
it "returns empty analysis" do
|
165
|
+
expect(@matches).to eq([])
|
166
|
+
end
|
197
167
|
end
|
198
168
|
end
|
199
169
|
end
|
data/spec/quality_spec.rb
CHANGED
@@ -8,18 +8,39 @@ if defined?(Encoding) && Encoding.default_external != "UTF-8"
|
|
8
8
|
end
|
9
9
|
|
10
10
|
RSpec.describe "The library itself" do
|
11
|
+
# For some reason RSpec may expect this to be defined
|
12
|
+
# and crash really bad without it
|
13
|
+
def self.uses_transaction?(*)
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def encode_utf8!(string)
|
18
|
+
string.encode!(Encoding::UTF_8,
|
19
|
+
invalid: :replace,
|
20
|
+
undef: :replace,
|
21
|
+
replace: "<?>".freeze
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def ignore_whitespace?(filename)
|
26
|
+
@whitespace_regex ||=
|
27
|
+
/\.gitmodules|fixtures|vendor|LICENSE|etc|db|public|reports/
|
28
|
+
!!(filename =~ @whitespace_regex)
|
29
|
+
end
|
30
|
+
|
11
31
|
def check_for_spec_defs_with_single_quotes(filename)
|
12
32
|
failing_lines = []
|
13
33
|
|
14
34
|
File.readlines(filename).each_with_index do |line, number|
|
15
|
-
|
35
|
+
encode_utf8!(line)
|
16
36
|
failing_lines << number + 1 if line =~ /^ *(describe|it|context) {1}'{1}/
|
17
37
|
end
|
18
38
|
|
19
|
-
|
39
|
+
if failing_lines.any?
|
20
40
|
# Prevent rubocop from looping infinitely
|
21
41
|
# rubocop:disable Style/StringLiterals
|
22
|
-
"#{filename} uses inconsistent single quotes
|
42
|
+
"#{filename} uses inconsistent single quotes "\
|
43
|
+
"on lines #{failing_lines.join(', ')}"
|
23
44
|
# rubocop:enable Style/StringLiterals
|
24
45
|
end
|
25
46
|
end
|
@@ -27,7 +48,7 @@ RSpec.describe "The library itself" do
|
|
27
48
|
def check_for_tab_characters(filename)
|
28
49
|
failing_lines = []
|
29
50
|
File.readlines(filename).each_with_index do |line, number|
|
30
|
-
|
51
|
+
encode_utf8!(line)
|
31
52
|
failing_lines << number + 1 if line =~ /\t/
|
32
53
|
end
|
33
54
|
|
@@ -42,7 +63,7 @@ RSpec.describe "The library itself" do
|
|
42
63
|
def check_for_extra_spaces(filename)
|
43
64
|
failing_lines = []
|
44
65
|
File.readlines(filename).each_with_index do |line, number|
|
45
|
-
|
66
|
+
encode_utf8!(line)
|
46
67
|
next if line =~ /^\s+#.*\s+\n$/
|
47
68
|
failing_lines << number + 1 if line =~ /\s+\n$/
|
48
69
|
end
|
@@ -63,15 +84,12 @@ RSpec.describe "The library itself" do
|
|
63
84
|
match(&:empty?)
|
64
85
|
end
|
65
86
|
|
66
|
-
WHITESPACE_OK =
|
67
|
-
/\.gitmodules|\.marshal|fixtures|ssl_certs|vendor|LICENSE|etc|reports/
|
68
|
-
|
69
87
|
it "has no malformed whitespace" do
|
70
88
|
error_messages = []
|
71
89
|
Dir.chdir(File.expand_path("../..", __FILE__)) do
|
72
90
|
`git ls-files -z`.split("\x0").each do |filename|
|
73
91
|
next if !File.exist?(filename)
|
74
|
-
next if filename
|
92
|
+
next if ignore_whitespace?(filename)
|
75
93
|
error_messages << check_for_tab_characters(filename)
|
76
94
|
error_messages << check_for_extra_spaces(filename)
|
77
95
|
end
|
@@ -83,7 +101,7 @@ RSpec.describe "The library itself" do
|
|
83
101
|
included = /spec/
|
84
102
|
error_messages = []
|
85
103
|
Dir.chdir(File.expand_path("../", __FILE__)) do
|
86
|
-
`git ls-files -z`.split("\x0").each do |filename|
|
104
|
+
`git ls-files -z spec`.split("\x0").each do |filename|
|
87
105
|
next unless filename =~ included
|
88
106
|
error_messages << check_for_spec_defs_with_single_quotes(filename)
|
89
107
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -18,7 +18,9 @@ Dir[MetricFu.root_dir + "/spec/support/**/*.rb"].each { |f| require f }
|
|
18
18
|
RSpec.configure do |config|
|
19
19
|
config.filter_run focus: true
|
20
20
|
config.run_all_when_everything_filtered = true
|
21
|
+
# Skip specs tagged `:slow` unless SLOW_SPECS is set
|
21
22
|
config.filter_run_excluding :slow unless ENV["SLOW_SPECS"]
|
23
|
+
# End specs on first failure if FAIL_FAST is set
|
22
24
|
config.fail_fast = ENV.include?("FAIL_FAST")
|
23
25
|
config.order = :rand
|
24
26
|
config.color = true
|
@@ -27,6 +29,7 @@ RSpec.configure do |config|
|
|
27
29
|
end
|
28
30
|
config.mock_with :rspec do |mocks|
|
29
31
|
mocks.syntax = :expect
|
32
|
+
mocks.verify_partial_doubles = true
|
30
33
|
end
|
31
34
|
|
32
35
|
# :suite after/before all specs
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metric_fu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jake Scruggs
|
@@ -19,30 +19,8 @@ authors:
|
|
19
19
|
autorequire:
|
20
20
|
bindir: bin
|
21
21
|
cert_chain:
|
22
|
-
-
|
23
|
-
|
24
|
-
MIIDmjCCAoKgAwIBAgIBATANBgkqhkiG9w0BAQUFADBJMQ8wDQYDVQQDDAZnaXRo
|
25
|
-
dWIxITAfBgoJkiaJk/IsZAEZFhFiZW5qYW1pbmZsZWlzY2hlcjETMBEGCgmSJomT
|
26
|
-
8ixkARkWA2NvbTAeFw0xNTAxMjIxMzAyNTNaFw0xNjAxMjIxMzAyNTNaMEkxDzAN
|
27
|
-
BgNVBAMMBmdpdGh1YjEhMB8GCgmSJomT8ixkARkWEWJlbmphbWluZmxlaXNjaGVy
|
28
|
-
MRMwEQYKCZImiZPyLGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
29
|
-
CgKCAQEA7V1VZBU7Aft01XAoK8I8tdClfv3H/NIauiV0jfyNtXtZEWwaZ6ooZNLk
|
30
|
-
8kmIUsO2xI7I/B3es6w7le9q9xdEowlYjiR/X/yazNvufu5kpM4f6Ri1AKN8xvPk
|
31
|
-
LFlR8aOAd9LptcusYDfE+BjhmAvnLTgMGODcDLJIaJzLJaRywTLUuFv4digpFwCm
|
32
|
-
Zps9VheJnL4hkgI5BDn6DVjxHSCMRnccQM/kX9L34lbP9KkHXXEtQgkQYpElHbnd
|
33
|
-
MtR753aPeLfOBxSGzsso+6Lhe+fz8huD05mzgWaEZN40e6M7dA9FRSsEzL32ZOad
|
34
|
-
0z13MZWj3Yg5srV/cZvzCDCdVvRphwIDAQABo4GMMIGJMAkGA1UdEwQCMAAwCwYD
|
35
|
-
VR0PBAQDAgSwMB0GA1UdDgQWBBQvUrPExdvmdz0Vau0dH3hRh1YQfDAnBgNVHREE
|
36
|
-
IDAegRxnaXRodWJAYmVuamFtaW5mbGVpc2NoZXIuY29tMCcGA1UdEgQgMB6BHGdp
|
37
|
-
dGh1YkBiZW5qYW1pbmZsZWlzY2hlci5jb20wDQYJKoZIhvcNAQEFBQADggEBAEWo
|
38
|
-
g1soMaRTT/OfFklTuP+odV0w+2qJSfJhOY5bIebDjqxb9BN7hZJ9L6WXhcXCvl6r
|
39
|
-
kuXjpcC05TIv1DoWWaSjGK2ADmEBDNVhaFepYidAYuUQN4+ZjVH/gS9V9OkBcE8h
|
40
|
-
3ZwRv+9RkXM0uY1FwuGI6jgbgPeR1AkkfJnhOPohkG+VN5bFo9aK/Stw8Nwhuuiz
|
41
|
-
axCPD3cmaJBguufRXSMC852SDiBT7AtI4Gl2Fyr+0M5TzXHKbQ9xRBxwfE1bWDd6
|
42
|
-
lEs7ndJ1/vd/Hy0zQ1tIRWyql+ITLhqMi161Pw5flsYpQvPlRLR5pGJ4eD0/JdKE
|
43
|
-
ZG9WSFH7QcGLY65mEYc=
|
44
|
-
-----END CERTIFICATE-----
|
45
|
-
date: 2015-02-27 00:00:00.000000000 Z
|
22
|
+
- certs/bf4.pem
|
23
|
+
date: 2015-06-18 00:00:00.000000000 Z
|
46
24
|
dependencies:
|
47
25
|
- !ruby/object:Gem::Dependency
|
48
26
|
name: flay
|
@@ -105,9 +83,9 @@ dependencies:
|
|
105
83
|
- - ">="
|
106
84
|
- !ruby/object:Gem::Version
|
107
85
|
version: 1.3.4
|
108
|
-
- - "
|
86
|
+
- - "<"
|
109
87
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
88
|
+
version: '3.0'
|
111
89
|
type: :runtime
|
112
90
|
prerelease: false
|
113
91
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -115,9 +93,9 @@ dependencies:
|
|
115
93
|
- - ">="
|
116
94
|
- !ruby/object:Gem::Version
|
117
95
|
version: 1.3.4
|
118
|
-
- - "
|
96
|
+
- - "<"
|
119
97
|
- !ruby/object:Gem::Version
|
120
|
-
version: '
|
98
|
+
version: '3.0'
|
121
99
|
- !ruby/object:Gem::Dependency
|
122
100
|
name: cane
|
123
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -369,6 +347,7 @@ files:
|
|
369
347
|
- checksum/metric_fu-4.11.1.gem.sha512
|
370
348
|
- checksum/metric_fu-4.11.2.gem.sha512
|
371
349
|
- checksum/metric_fu-4.11.3.gem.sha512
|
350
|
+
- checksum/metric_fu-4.11.4.gem.sha512
|
372
351
|
- checksum/metric_fu-4.2.0.gem.sha512
|
373
352
|
- checksum/metric_fu-4.2.1.gem.sha512
|
374
353
|
- checksum/metric_fu-4.3.0.gem.sha512
|
@@ -648,7 +627,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
648
627
|
version: 1.3.6
|
649
628
|
requirements: []
|
650
629
|
rubyforge_project: metric_fu
|
651
|
-
rubygems_version: 2.4.
|
630
|
+
rubygems_version: 2.4.6
|
652
631
|
signing_key:
|
653
632
|
specification_version: 4
|
654
633
|
summary: A fistful of code metrics, with awesome templates and graphs
|
checksums.yaml.gz.sig
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
+˗�O����8���lz�G�t{�b��I�N�yv���ӊ�>y5�ΐ���q�Йd5�z�*뼳�}��I�.��y��bR�"P;N%%=n�O������i3B1���+��t�l��oD������c�M��/���я."?��gK�mH%b<�zw�M��Iɨ���z��遷������ʘdº�#���v �Fh��V!*.��a��hB�wG�7�{��̴����A\ tP�\6u�rM
|
data.tar.gz.sig
DELETED
Binary file
|
metadata.gz.sig
DELETED