rubycritic 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rubycritic.rb +3 -22
- data/lib/rubycritic/adapters/complexity/flog.rb +1 -1
- data/lib/rubycritic/adapters/smell/flay.rb +1 -1
- data/lib/rubycritic/adapters/smell/flog.rb +1 -1
- data/lib/rubycritic/adapters/smell/reek.rb +1 -1
- data/lib/rubycritic/analysed_files_builder.rb +36 -0
- data/lib/rubycritic/analysers/config.reek +6 -2
- data/lib/rubycritic/analysers_runner.rb +2 -2
- data/lib/rubycritic/cli.rb +2 -1
- data/lib/rubycritic/core/analysed_file.rb +22 -0
- data/lib/rubycritic/{location.rb → core/location.rb} +0 -0
- data/lib/rubycritic/{smell.rb → core/smell.rb} +10 -4
- data/lib/rubycritic/orchestrators/base.rb +27 -0
- data/lib/rubycritic/orchestrators/main.rb +14 -0
- data/lib/rubycritic/orchestrators/mini.rb +14 -0
- data/lib/rubycritic/report_generators/assets/javascripts/application.js +2 -9
- data/lib/rubycritic/report_generators/base.rb +43 -0
- data/lib/rubycritic/report_generators/code_file.rb +40 -0
- data/lib/rubycritic/report_generators/code_index.rb +29 -0
- data/lib/rubycritic/report_generators/line.rb +29 -0
- data/lib/rubycritic/report_generators/overview.rb +26 -0
- data/lib/rubycritic/report_generators/smells_index.rb +25 -0
- data/lib/rubycritic/report_generators/templates/{file.html.erb → code_file.html.erb} +2 -2
- data/lib/rubycritic/report_generators/templates/code_index.html.erb +3 -3
- data/lib/rubycritic/report_generators/templates/smells_index.html.erb +1 -1
- data/lib/rubycritic/report_generators/view_helpers.rb +0 -4
- data/lib/rubycritic/reporters/main.rb +55 -0
- data/lib/rubycritic/reporters/mini.rb +26 -0
- data/lib/rubycritic/revision_comparator.rb +1 -1
- data/lib/rubycritic/source_locator.rb +4 -4
- data/lib/rubycritic/turbulence.rb +8 -18
- data/lib/rubycritic/version.rb +1 -1
- data/test/lib/rubycritic/{quality_adapters → adapters/complexity}/flog_test.rb +2 -2
- data/test/lib/rubycritic/{smell_adapters → adapters/smell}/flay_test.rb +2 -2
- data/test/lib/rubycritic/{smell_adapters → adapters/smell}/flog_test.rb +0 -0
- data/test/lib/rubycritic/{smell_adapters → adapters/smell}/reek_test.rb +0 -0
- data/test/lib/rubycritic/analysed_files_builder_test.rb +36 -0
- data/test/lib/rubycritic/analysers_runner_test.rb +2 -2
- data/test/lib/rubycritic/core/analysed_file_test.rb +51 -0
- data/test/lib/rubycritic/{location_test.rb → core/location_test.rb} +1 -1
- data/test/lib/rubycritic/core/smell_test.rb +80 -0
- data/test/lib/rubycritic/{smells_array_test.rb → core/smells_array_test.rb} +1 -1
- data/test/lib/rubycritic/smells_status_setter_test.rb +1 -1
- data/test/lib/rubycritic/turbulence_test.rb +9 -18
- data/test/samples/reek/not_smelly.rb +10 -1
- metadata +36 -26
- data/lib/rubycritic/report_generators/base_generator.rb +0 -41
- data/lib/rubycritic/report_generators/code_index_generator.rb +0 -32
- data/lib/rubycritic/report_generators/file_generator.rb +0 -41
- data/lib/rubycritic/report_generators/line_generator.rb +0 -27
- data/lib/rubycritic/report_generators/overview_generator.rb +0 -24
- data/lib/rubycritic/report_generators/reporter.rb +0 -67
- data/lib/rubycritic/report_generators/smells_index_generator.rb +0 -23
- data/test/lib/rubycritic/smell_test.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4f79955ca6f3dab8dccacc5dca7c2b994db9cc7
|
4
|
+
data.tar.gz: 51bb696eca3c5caa072c1e20a0fb67c1d18c113f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0794412b39af6196e6d9e70ab55c634744778acf6a9102538ea34a2bbf0aa509fb2f4569437203eb53e0dc770dd73db7095ae2238323e9a10fff1520e30dfb50
|
7
|
+
data.tar.gz: f93087c069037601daa5f19c21d5794d8b176dbcc81b291b8a3f46f5d14a091bce4d75c0dd2d0e9b73cc7d0f4c5aa1568ec93ef7f33a91f2d3839010aeee60f6
|
data/lib/rubycritic.rb
CHANGED
@@ -3,25 +3,6 @@ require "rubycritic/source_locator"
|
|
3
3
|
require "rubycritic/analysers_runner"
|
4
4
|
require "rubycritic/source_control_systems/source_control_system"
|
5
5
|
require "rubycritic/revision_comparator"
|
6
|
-
require "rubycritic/
|
7
|
-
require "rubycritic/
|
8
|
-
|
9
|
-
module Rubycritic
|
10
|
-
|
11
|
-
class Rubycritic
|
12
|
-
def initialize
|
13
|
-
@source_control_system = SourceControlSystem.create
|
14
|
-
end
|
15
|
-
|
16
|
-
def critique(paths)
|
17
|
-
source = SourceLocator.new(paths)
|
18
|
-
smells = AnalysersRunner.new(source.paths).run
|
19
|
-
if @source_control_system.has_revision?
|
20
|
-
smells = RevisionComparator.new(smells, @source_control_system).smells
|
21
|
-
turbulence_data = Turbulence.new(source.paths, @source_control_system).data
|
22
|
-
end
|
23
|
-
Reporter.new(source.pathnames, smells, turbulence_data).generate_report
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
6
|
+
require "rubycritic/analysers/churn"
|
7
|
+
require "rubycritic/adapters/complexity/flog"
|
8
|
+
require "rubycritic/analysed_files_builder"
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "rubycritic/core/analysed_file"
|
2
|
+
|
3
|
+
module Rubycritic
|
4
|
+
|
5
|
+
class AnalysedFilesBuilder
|
6
|
+
def initialize(pathnames, smells, churn, complexity)
|
7
|
+
@pathnames = pathnames
|
8
|
+
@smells = smells
|
9
|
+
@churn = churn
|
10
|
+
@complexity = complexity
|
11
|
+
end
|
12
|
+
|
13
|
+
def analysed_files
|
14
|
+
@pathnames.zip(@churn, @complexity).map do |file_attributes|
|
15
|
+
pathname = file_attributes[0]
|
16
|
+
AnalysedFile.new(
|
17
|
+
:smells => file_smells(pathname),
|
18
|
+
:pathname => pathname,
|
19
|
+
:churn => file_attributes[1],
|
20
|
+
:complexity => file_attributes[2]
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def file_smells(pathname)
|
28
|
+
file_smells = []
|
29
|
+
@smells.each do |smell|
|
30
|
+
file_smells << smell if smell.at_pathname?(pathname)
|
31
|
+
end
|
32
|
+
file_smells
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -3,6 +3,10 @@ Attribute:
|
|
3
3
|
enabled: false
|
4
4
|
IrresponsibleModule:
|
5
5
|
enabled: false
|
6
|
+
NestedIterators:
|
7
|
+
max_allowed_nesting: 2
|
8
|
+
TooManyStatements:
|
9
|
+
enabled: false
|
6
10
|
UncommunicativeMethodName:
|
7
11
|
reject:
|
8
12
|
- !ruby/regexp /^[a-z]$/
|
@@ -16,5 +20,5 @@ UncommunicativeVariableName:
|
|
16
20
|
reject:
|
17
21
|
- !ruby/regexp /^.$/
|
18
22
|
- !ruby/regexp /[0-9]$/
|
19
|
-
|
20
|
-
|
23
|
+
UtilityFunction:
|
24
|
+
enabled: false
|
@@ -14,7 +14,7 @@ module Rubycritic
|
|
14
14
|
@paths = paths
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def smells
|
18
18
|
aggregate_smells(smell_adapters)
|
19
19
|
end
|
20
20
|
|
@@ -27,7 +27,7 @@ module Rubycritic
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def aggregate_smells(smell_adapters)
|
30
|
-
smell_adapters.
|
30
|
+
smell_adapters.flat_map(&:smells).sort
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
data/lib/rubycritic/cli.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "optparse"
|
2
2
|
require "rubycritic"
|
3
|
+
require "rubycritic/orchestrators/main"
|
3
4
|
|
4
5
|
module Rubycritic
|
5
6
|
|
@@ -23,7 +24,7 @@ module Rubycritic
|
|
23
24
|
end.parse!
|
24
25
|
|
25
26
|
ARGV << "." if ARGV.empty?
|
26
|
-
puts "New critique at #{
|
27
|
+
puts "New critique at #{Orchestrator::Main.new.critique(ARGV)}"
|
27
28
|
exit 0
|
28
29
|
|
29
30
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "virtus"
|
2
|
+
|
3
|
+
module Rubycritic
|
4
|
+
|
5
|
+
class AnalysedFile
|
6
|
+
include Virtus.model
|
7
|
+
|
8
|
+
attribute :pathname
|
9
|
+
attribute :smells
|
10
|
+
attribute :churn
|
11
|
+
attribute :complexity
|
12
|
+
|
13
|
+
def name
|
14
|
+
pathname.basename.sub_ext("").to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def has_smells?
|
18
|
+
!smells.empty?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require "virtus"
|
2
|
-
require "rubycritic/location"
|
2
|
+
require "rubycritic/core/location"
|
3
3
|
|
4
4
|
module Rubycritic
|
5
5
|
|
@@ -13,11 +13,11 @@ module Rubycritic
|
|
13
13
|
attribute :type
|
14
14
|
attribute :status
|
15
15
|
|
16
|
-
def
|
17
|
-
|
16
|
+
def at_pathname?(other_pathname)
|
17
|
+
pathnames.any? { |pathname| pathname == other_pathname }
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def at_location?(other_location)
|
21
21
|
locations.any? { |location| location == other_location }
|
22
22
|
end
|
23
23
|
|
@@ -47,6 +47,12 @@ module Rubycritic
|
|
47
47
|
def state
|
48
48
|
[@context, @message, @score, @type]
|
49
49
|
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def pathnames
|
54
|
+
@pathnames ||= locations.map(&:pathname).uniq
|
55
|
+
end
|
50
56
|
end
|
51
57
|
|
52
58
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Rubycritic
|
2
|
+
module Orchestrator
|
3
|
+
|
4
|
+
class Base
|
5
|
+
def initialize
|
6
|
+
@source_control_system = SourceControlSystem.create
|
7
|
+
end
|
8
|
+
|
9
|
+
def critique(paths)
|
10
|
+
source = SourceLocator.new(paths)
|
11
|
+
@smells = AnalysersRunner.new(source.paths).smells
|
12
|
+
if @source_control_system.has_revision?
|
13
|
+
@smells = RevisionComparator.new(@smells, @source_control_system).smells
|
14
|
+
churn = Analyser::Churn.new(source.paths, @source_control_system).churn
|
15
|
+
end
|
16
|
+
complexity = ComplexityAdapter::Flog.new(source.paths).complexity
|
17
|
+
@analysed_files = AnalysedFilesBuilder.new(source.pathnames, @smells, churn, complexity).analysed_files
|
18
|
+
generate_report
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_report
|
22
|
+
raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "rubycritic/orchestrators/base"
|
2
|
+
require "rubycritic/reporters/main"
|
3
|
+
|
4
|
+
module Rubycritic
|
5
|
+
module Orchestrator
|
6
|
+
|
7
|
+
class Main < Base
|
8
|
+
def generate_report
|
9
|
+
Reporter::Main.new(@analysed_files, @smells).generate_report
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "rubycritic/orchestrators/base"
|
2
|
+
require "rubycritic/reporters/mini"
|
3
|
+
|
4
|
+
module Rubycritic
|
5
|
+
module Orchestrator
|
6
|
+
|
7
|
+
class Mini < Base
|
8
|
+
def generate_report
|
9
|
+
Reporter::Mini.new(@analysed_files.first).generate_report
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -86,13 +86,6 @@ $("#js-chart-container").highcharts({
|
|
86
86
|
}
|
87
87
|
}
|
88
88
|
},
|
89
|
-
states: {
|
90
|
-
hover: {
|
91
|
-
marker: {
|
92
|
-
enabled: false
|
93
|
-
}
|
94
|
-
}
|
95
|
-
},
|
96
89
|
tooltip: {
|
97
90
|
headerFormat: "<b>{point.key}</b><br>",
|
98
91
|
pointFormat: "Committed {point.x} times, with Flog score of {point.y}"
|
@@ -100,8 +93,8 @@ $("#js-chart-container").highcharts({
|
|
100
93
|
}
|
101
94
|
},
|
102
95
|
series: [{
|
96
|
+
showInLegend: false,
|
103
97
|
color: "steelblue",
|
104
|
-
data: turbulence_data
|
105
|
-
showInLegend: false
|
98
|
+
data: turbulence_data
|
106
99
|
}]
|
107
100
|
});
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "rubycritic/report_generators/view_helpers"
|
3
|
+
|
4
|
+
module Rubycritic
|
5
|
+
module Generator
|
6
|
+
|
7
|
+
class Base
|
8
|
+
def self.erb_template(template_path)
|
9
|
+
ERB.new(File.read(File.join(TEMPLATES_DIR, template_path)))
|
10
|
+
end
|
11
|
+
|
12
|
+
TEMPLATES_DIR = File.expand_path("../templates", __FILE__)
|
13
|
+
LAYOUT_TEMPLATE = erb_template(File.join("layouts", "application.html.erb"))
|
14
|
+
|
15
|
+
include ViewHelpers
|
16
|
+
|
17
|
+
def file_href
|
18
|
+
"file://#{file_pathname}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def file_pathname
|
22
|
+
File.join(file_directory, file_name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def file_directory
|
26
|
+
root_directory
|
27
|
+
end
|
28
|
+
|
29
|
+
def file_name
|
30
|
+
raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
|
31
|
+
end
|
32
|
+
|
33
|
+
def render
|
34
|
+
raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_binding
|
38
|
+
binding
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "rubycritic/report_generators/base"
|
3
|
+
require "rubycritic/report_generators/line"
|
4
|
+
|
5
|
+
module Rubycritic
|
6
|
+
module Generator
|
7
|
+
|
8
|
+
class CodeFile < Base
|
9
|
+
LINE_NUMBER_OFFSET = 1
|
10
|
+
TEMPLATE = erb_template("code_file.html.erb")
|
11
|
+
|
12
|
+
def initialize(analysed_file)
|
13
|
+
@analysed_file = analysed_file
|
14
|
+
@pathname = @analysed_file.pathname
|
15
|
+
@smells = @analysed_file.smells
|
16
|
+
end
|
17
|
+
|
18
|
+
def file_directory
|
19
|
+
File.join(root_directory, @pathname.dirname)
|
20
|
+
end
|
21
|
+
|
22
|
+
def file_name
|
23
|
+
@pathname.basename.sub_ext(".html")
|
24
|
+
end
|
25
|
+
|
26
|
+
def render
|
27
|
+
file_code = ""
|
28
|
+
File.readlines(@pathname).each.with_index(LINE_NUMBER_OFFSET) do |line_text, line_number|
|
29
|
+
location = Location.new(@pathname, line_number)
|
30
|
+
line_smells = @smells.select { |smell| smell.at_location?(location) }
|
31
|
+
file_code << Line.new(line_text, line_smells).render
|
32
|
+
end
|
33
|
+
|
34
|
+
file_body = TEMPLATE.result(get_binding { file_code })
|
35
|
+
LAYOUT_TEMPLATE.result(get_binding { file_body })
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "rubycritic/report_generators/base"
|
3
|
+
|
4
|
+
module Rubycritic
|
5
|
+
module Generator
|
6
|
+
|
7
|
+
class CodeIndex < Base
|
8
|
+
TEMPLATE = erb_template("code_index.html.erb")
|
9
|
+
|
10
|
+
def initialize(analysed_files)
|
11
|
+
@analysed_files = analysed_files
|
12
|
+
end
|
13
|
+
|
14
|
+
def file_name
|
15
|
+
"code_index.html"
|
16
|
+
end
|
17
|
+
|
18
|
+
def render
|
19
|
+
index_body = TEMPLATE.result(get_binding)
|
20
|
+
LAYOUT_TEMPLATE.result(get_binding { index_body })
|
21
|
+
end
|
22
|
+
|
23
|
+
def file_path(pathname)
|
24
|
+
File.join(root_directory, pathname.sub_ext(".html"))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "rubycritic/report_generators/base"
|
3
|
+
require "cgi"
|
4
|
+
|
5
|
+
module Rubycritic
|
6
|
+
module Generator
|
7
|
+
|
8
|
+
class Line < Base
|
9
|
+
NORMAL_TEMPLATE = erb_template("line.html.erb")
|
10
|
+
SMELLY_TEMPLATE = erb_template("smelly_line.html.erb")
|
11
|
+
|
12
|
+
def initialize(text, smells)
|
13
|
+
@text = CGI::escapeHTML(text.chomp)
|
14
|
+
@smells = smells
|
15
|
+
@template =
|
16
|
+
if @smells.empty?
|
17
|
+
NORMAL_TEMPLATE
|
18
|
+
else
|
19
|
+
SMELLY_TEMPLATE
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def render
|
24
|
+
@template.result(binding).delete("\n") + "\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|