metric_fu 4.11.4 → 4.12.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/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