rubycritic 2.6.0 → 2.7.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/.rubocop.yml +3 -585
- data/.rubocop_todo.yml +36 -0
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -1
- data/Rakefile +9 -9
- data/bin/rubycritic +2 -2
- data/features/command_line_interface/options.feature +1 -0
- data/features/step_definitions/rubycritic_steps.rb +1 -1
- data/features/step_definitions/sample_file_steps.rb +3 -3
- data/features/support/env.rb +6 -6
- data/lib/rubycritic.rb +1 -1
- data/lib/rubycritic/analysers/attributes.rb +6 -7
- data/lib/rubycritic/analysers/churn.rb +4 -6
- data/lib/rubycritic/analysers/complexity.rb +5 -7
- data/lib/rubycritic/analysers/helpers/ast_node.rb +4 -6
- data/lib/rubycritic/analysers/helpers/flay.rb +1 -3
- data/lib/rubycritic/analysers/helpers/flog.rb +5 -7
- data/lib/rubycritic/analysers/helpers/methods_counter.rb +1 -3
- data/lib/rubycritic/analysers/helpers/modules_locator.rb +3 -5
- data/lib/rubycritic/analysers/helpers/parser.rb +2 -2
- data/lib/rubycritic/analysers/helpers/reek.rb +1 -1
- data/lib/rubycritic/analysers/smells/flay.rb +14 -16
- data/lib/rubycritic/analysers/smells/flog.rb +15 -17
- data/lib/rubycritic/analysers/smells/reek.rb +11 -13
- data/lib/rubycritic/analysers_runner.rb +8 -10
- data/lib/rubycritic/browser.rb +17 -0
- data/lib/rubycritic/cli/application.rb +3 -3
- data/lib/rubycritic/cli/options.rb +29 -23
- data/lib/rubycritic/command_factory.rb +5 -5
- data/lib/rubycritic/commands/base.rb +2 -2
- data/lib/rubycritic/commands/ci.rb +4 -4
- data/lib/rubycritic/commands/default.rb +5 -5
- data/lib/rubycritic/commands/help.rb +1 -1
- data/lib/rubycritic/commands/status_reporter.rb +1 -1
- data/lib/rubycritic/commands/version.rb +2 -2
- data/lib/rubycritic/configuration.rb +4 -2
- data/lib/rubycritic/core/analysed_module.rb +15 -17
- data/lib/rubycritic/core/analysed_modules_collection.rb +3 -3
- data/lib/rubycritic/core/location.rb +4 -6
- data/lib/rubycritic/core/rating.rb +5 -7
- data/lib/rubycritic/core/smell.rb +11 -13
- data/lib/rubycritic/generators/console_report.rb +1 -1
- data/lib/rubycritic/generators/html/base.rb +9 -9
- data/lib/rubycritic/generators/html/code_file.rb +5 -7
- data/lib/rubycritic/generators/html/code_index.rb +3 -5
- data/lib/rubycritic/generators/html/line.rb +4 -6
- data/lib/rubycritic/generators/html/overview.rb +4 -6
- data/lib/rubycritic/generators/html/smells_index.rb +3 -5
- data/lib/rubycritic/generators/html/turbulence.rb +4 -6
- data/lib/rubycritic/generators/html/view_helpers.rb +4 -4
- data/lib/rubycritic/generators/html_report.rb +13 -9
- data/lib/rubycritic/generators/json/simple.rb +7 -9
- data/lib/rubycritic/generators/json_report.rb +1 -3
- data/lib/rubycritic/generators/text/list.rb +9 -9
- data/lib/rubycritic/reporter.rb +3 -5
- data/lib/rubycritic/revision_comparator.rb +6 -8
- data/lib/rubycritic/serializer.rb +2 -4
- data/lib/rubycritic/smells_status_setter.rb +2 -4
- data/lib/rubycritic/source_control_systems/base.rb +4 -6
- data/lib/rubycritic/source_control_systems/double.rb +1 -2
- data/lib/rubycritic/source_control_systems/git.rb +1 -3
- data/lib/rubycritic/source_control_systems/mercurial.rb +1 -3
- data/lib/rubycritic/source_locator.rb +5 -6
- data/lib/rubycritic/version.rb +1 -1
- data/rubycritic.gemspec +26 -25
- data/test/analysers_test_helper.rb +1 -1
- data/test/lib/rubycritic/analysers/churn_test.rb +9 -9
- data/test/lib/rubycritic/analysers/complexity_test.rb +5 -5
- data/test/lib/rubycritic/analysers/helpers/methods_counter_test.rb +12 -12
- data/test/lib/rubycritic/analysers/helpers/modules_locator_test.rb +25 -25
- data/test/lib/rubycritic/analysers/smells/flay_test.rb +12 -12
- data/test/lib/rubycritic/analysers/smells/flog_test.rb +7 -7
- data/test/lib/rubycritic/analysers/smells/reek_test.rb +8 -8
- data/test/lib/rubycritic/browser_test.rb +16 -0
- data/test/lib/rubycritic/commands/status_reporter_test.rb +31 -19
- data/test/lib/rubycritic/configuration_test.rb +10 -10
- data/test/lib/rubycritic/core/analysed_module_test.rb +37 -37
- data/test/lib/rubycritic/core/analysed_modules_collection_test.rb +32 -32
- data/test/lib/rubycritic/core/location_test.rb +16 -16
- data/test/lib/rubycritic/core/smell_test.rb +31 -31
- data/test/lib/rubycritic/core/smells_array_test.rb +18 -18
- data/test/lib/rubycritic/generators/console_report_test.rb +26 -26
- data/test/lib/rubycritic/generators/turbulence_test.rb +8 -8
- data/test/lib/rubycritic/generators/view_helpers_test.rb +36 -36
- data/test/lib/rubycritic/smells_status_setter_test.rb +7 -7
- data/test/lib/rubycritic/source_control_systems/base_test.rb +7 -7
- data/test/lib/rubycritic/source_control_systems/double_test.rb +3 -3
- data/test/lib/rubycritic/source_control_systems/git_test.rb +4 -4
- data/test/lib/rubycritic/source_control_systems/mercurial_test.rb +3 -3
- data/test/lib/rubycritic/source_locator_test.rb +30 -30
- data/test/lib/rubycritic/version_test.rb +4 -4
- data/test/test_helper.rb +4 -4
- metadata +30 -17
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'rubycritic/source_locator'
|
2
|
+
require 'rubycritic/core/analysed_module'
|
3
3
|
|
4
4
|
module Rubycritic
|
5
5
|
class AnalysedModulesCollection
|
@@ -17,7 +17,7 @@ module Rubycritic
|
|
17
17
|
|
18
18
|
def initialize(paths)
|
19
19
|
@modules = SourceLocator.new(paths).pathnames.map do |pathname|
|
20
|
-
AnalysedModule.new(:
|
20
|
+
AnalysedModule.new(pathname: pathname)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'pathname'
|
2
2
|
|
3
3
|
module Rubycritic
|
4
|
-
|
5
4
|
class Location
|
6
5
|
attr_reader :pathname, :line
|
7
6
|
|
@@ -11,7 +10,7 @@ module Rubycritic
|
|
11
10
|
end
|
12
11
|
|
13
12
|
def file_name
|
14
|
-
@pathname.basename.sub_ext(
|
13
|
+
@pathname.basename.sub_ext('').to_s
|
15
14
|
end
|
16
15
|
|
17
16
|
def to_s
|
@@ -20,8 +19,8 @@ module Rubycritic
|
|
20
19
|
|
21
20
|
def to_h
|
22
21
|
{
|
23
|
-
:
|
24
|
-
:
|
22
|
+
path: pathname.to_s,
|
23
|
+
line: line
|
25
24
|
}
|
26
25
|
end
|
27
26
|
|
@@ -43,5 +42,4 @@ module Rubycritic
|
|
43
42
|
[@pathname, @line]
|
44
43
|
end
|
45
44
|
end
|
46
|
-
|
47
45
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
module Rubycritic
|
2
|
-
|
3
2
|
class Rating
|
4
3
|
def self.from_cost(cost)
|
5
|
-
if cost <= 2 then new(
|
6
|
-
elsif cost <= 4 then new(
|
7
|
-
elsif cost <= 8 then new(
|
8
|
-
elsif cost <= 16 then new(
|
9
|
-
else new(
|
4
|
+
if cost <= 2 then new('A')
|
5
|
+
elsif cost <= 4 then new('B')
|
6
|
+
elsif cost <= 8 then new('C')
|
7
|
+
elsif cost <= 16 then new('D')
|
8
|
+
else new('F')
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
@@ -26,5 +25,4 @@ module Rubycritic
|
|
26
25
|
to_h.to_json(*a)
|
27
26
|
end
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
@@ -1,14 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'virtus'
|
2
|
+
require 'rubycritic/core/location'
|
3
3
|
|
4
4
|
module Rubycritic
|
5
|
-
|
6
5
|
class Smell
|
7
6
|
include Virtus.model
|
8
7
|
|
9
8
|
attribute :context
|
10
9
|
attribute :cost
|
11
|
-
attribute :locations, Array, :
|
10
|
+
attribute :locations, Array, default: []
|
12
11
|
attribute :message
|
13
12
|
attribute :score
|
14
13
|
attribute :status
|
@@ -25,7 +24,7 @@ module Rubycritic
|
|
25
24
|
def ==(other)
|
26
25
|
state == other.state
|
27
26
|
end
|
28
|
-
|
27
|
+
alias eql? ==
|
29
28
|
|
30
29
|
def to_s
|
31
30
|
"(#{type}) #{context} #{message}"
|
@@ -33,13 +32,13 @@ module Rubycritic
|
|
33
32
|
|
34
33
|
def to_h
|
35
34
|
{
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
35
|
+
context: context,
|
36
|
+
cost: cost,
|
37
|
+
locations: locations,
|
38
|
+
message: message,
|
39
|
+
score: score,
|
40
|
+
status: status,
|
41
|
+
type: type
|
43
42
|
}
|
44
43
|
end
|
45
44
|
|
@@ -57,5 +56,4 @@ module Rubycritic
|
|
57
56
|
[@context, @message, @score, @type]
|
58
57
|
end
|
59
58
|
end
|
60
|
-
|
61
59
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'erb'
|
2
|
+
require 'pathname'
|
3
|
+
require 'rubycritic/generators/html/view_helpers'
|
4
4
|
|
5
5
|
module Rubycritic
|
6
6
|
module Generator
|
7
7
|
module Html
|
8
|
-
|
9
8
|
class Base
|
10
9
|
def self.erb_template(template_path)
|
11
10
|
ERB.new(File.read(File.join(TEMPLATES_DIR, template_path)))
|
12
11
|
end
|
13
12
|
|
14
|
-
TEMPLATES_DIR = File.expand_path(
|
15
|
-
LAYOUT_TEMPLATE = erb_template(File.join(
|
13
|
+
TEMPLATES_DIR = File.expand_path('../templates', __FILE__)
|
14
|
+
LAYOUT_TEMPLATE = erb_template(File.join('layouts', 'application.html.erb'))
|
16
15
|
|
17
16
|
include ViewHelpers
|
18
17
|
|
@@ -29,11 +28,13 @@ module Rubycritic
|
|
29
28
|
end
|
30
29
|
|
31
30
|
def file_name
|
32
|
-
|
31
|
+
fail NotImplementedError,
|
32
|
+
"The #{self.class} class must implement the #{__method__} method."
|
33
33
|
end
|
34
34
|
|
35
35
|
def render
|
36
|
-
|
36
|
+
fail NotImplementedError,
|
37
|
+
"The #{self.class} class must implement the #{__method__} method."
|
37
38
|
end
|
38
39
|
|
39
40
|
private
|
@@ -46,7 +47,6 @@ module Rubycritic
|
|
46
47
|
binding
|
47
48
|
end
|
48
49
|
end
|
49
|
-
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -1,13 +1,12 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'rubycritic/generators/html/base'
|
2
|
+
require 'rubycritic/generators/html/line'
|
3
3
|
|
4
4
|
module Rubycritic
|
5
5
|
module Generator
|
6
6
|
module Html
|
7
|
-
|
8
7
|
class CodeFile < Base
|
9
8
|
LINE_NUMBER_OFFSET = 1
|
10
|
-
TEMPLATE = erb_template(
|
9
|
+
TEMPLATE = erb_template('code_file.html.erb')
|
11
10
|
|
12
11
|
def initialize(analysed_module)
|
13
12
|
@analysed_module = analysed_module
|
@@ -19,11 +18,11 @@ module Rubycritic
|
|
19
18
|
end
|
20
19
|
|
21
20
|
def file_name
|
22
|
-
@pathname.basename.sub_ext(
|
21
|
+
@pathname.basename.sub_ext('.html')
|
23
22
|
end
|
24
23
|
|
25
24
|
def render
|
26
|
-
file_code =
|
25
|
+
file_code = ''
|
27
26
|
File.readlines(@pathname).each.with_index(LINE_NUMBER_OFFSET) do |line_text, line_number|
|
28
27
|
location = Location.new(@pathname, line_number)
|
29
28
|
line_smells = @analysed_module.smells_at_location(location)
|
@@ -34,7 +33,6 @@ module Rubycritic
|
|
34
33
|
LAYOUT_TEMPLATE.result(get_binding { file_body })
|
35
34
|
end
|
36
35
|
end
|
37
|
-
|
38
36
|
end
|
39
37
|
end
|
40
38
|
end
|
@@ -1,18 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'rubycritic/generators/html/base'
|
2
2
|
|
3
3
|
module Rubycritic
|
4
4
|
module Generator
|
5
5
|
module Html
|
6
|
-
|
7
6
|
class CodeIndex < Base
|
8
|
-
TEMPLATE = erb_template(
|
7
|
+
TEMPLATE = erb_template('code_index.html.erb')
|
9
8
|
|
10
9
|
def initialize(analysed_modules)
|
11
10
|
@analysed_modules = analysed_modules
|
12
11
|
end
|
13
12
|
|
14
13
|
def file_name
|
15
|
-
|
14
|
+
'code_index.html'
|
16
15
|
end
|
17
16
|
|
18
17
|
def render
|
@@ -20,7 +19,6 @@ module Rubycritic
|
|
20
19
|
LAYOUT_TEMPLATE.result(get_binding { index_body })
|
21
20
|
end
|
22
21
|
end
|
23
|
-
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
@@ -1,13 +1,12 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'cgi'
|
2
|
+
require 'rubycritic/generators/html/base'
|
3
3
|
|
4
4
|
module Rubycritic
|
5
5
|
module Generator
|
6
6
|
module Html
|
7
|
-
|
8
7
|
class Line < Base
|
9
|
-
NORMAL_TEMPLATE = erb_template(
|
10
|
-
SMELLY_TEMPLATE = erb_template(
|
8
|
+
NORMAL_TEMPLATE = erb_template('line.html.erb')
|
9
|
+
SMELLY_TEMPLATE = erb_template('smelly_line.html.erb')
|
11
10
|
|
12
11
|
attr_reader :file_directory
|
13
12
|
|
@@ -31,7 +30,6 @@ module Rubycritic
|
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
34
|
-
|
35
33
|
end
|
36
34
|
end
|
37
35
|
end
|
@@ -1,12 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'rubycritic/generators/html/base'
|
2
|
+
require 'rubycritic/generators/html/turbulence'
|
3
3
|
|
4
4
|
module Rubycritic
|
5
5
|
module Generator
|
6
6
|
module Html
|
7
|
-
|
8
7
|
class Overview < Base
|
9
|
-
TEMPLATE = erb_template(
|
8
|
+
TEMPLATE = erb_template('overview.html.erb')
|
10
9
|
|
11
10
|
def initialize(analysed_modules)
|
12
11
|
@turbulence_data = Turbulence.data(analysed_modules)
|
@@ -15,7 +14,7 @@ module Rubycritic
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def file_name
|
18
|
-
|
17
|
+
'overview.html'
|
19
18
|
end
|
20
19
|
|
21
20
|
def render
|
@@ -23,7 +22,6 @@ module Rubycritic
|
|
23
22
|
LAYOUT_TEMPLATE.result(get_binding { index_body })
|
24
23
|
end
|
25
24
|
end
|
26
|
-
|
27
25
|
end
|
28
26
|
end
|
29
27
|
end
|
@@ -1,11 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require 'rubycritic/generators/html/base'
|
2
2
|
|
3
3
|
module Rubycritic
|
4
4
|
module Generator
|
5
5
|
module Html
|
6
|
-
|
7
6
|
class SmellsIndex < Base
|
8
|
-
TEMPLATE = erb_template(
|
7
|
+
TEMPLATE = erb_template('smells_index.html.erb')
|
9
8
|
|
10
9
|
def initialize(analysed_modules)
|
11
10
|
@smells = analysed_modules.flat_map(&:smells).uniq
|
@@ -14,7 +13,7 @@ module Rubycritic
|
|
14
13
|
end
|
15
14
|
|
16
15
|
def file_name
|
17
|
-
|
16
|
+
'smells_index.html'
|
18
17
|
end
|
19
18
|
|
20
19
|
def render
|
@@ -32,7 +31,6 @@ module Rubycritic
|
|
32
31
|
names
|
33
32
|
end
|
34
33
|
end
|
35
|
-
|
36
34
|
end
|
37
35
|
end
|
38
36
|
end
|
@@ -1,17 +1,15 @@
|
|
1
|
-
require
|
1
|
+
require 'json'
|
2
2
|
|
3
3
|
module Rubycritic
|
4
|
-
|
5
4
|
module Turbulence
|
6
5
|
def self.data(analysed_modules)
|
7
6
|
analysed_modules.map do |analysed_module|
|
8
7
|
{
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
8
|
+
name: analysed_module.name,
|
9
|
+
x: analysed_module.churn,
|
10
|
+
y: analysed_module.complexity
|
12
11
|
}
|
13
12
|
end.to_json
|
14
13
|
end
|
15
14
|
end
|
16
|
-
|
17
15
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Rubycritic
|
2
|
-
|
3
2
|
module ViewHelpers
|
4
3
|
def timeago_tag(time)
|
5
4
|
"<time class='js-timeago' datetime='#{time}'>#{time}</time>"
|
@@ -32,12 +31,13 @@ module Rubycritic
|
|
32
31
|
end
|
33
32
|
|
34
33
|
def file_directory
|
35
|
-
|
34
|
+
fail NotImplementedError,
|
35
|
+
"The #{self.class} class must implement the #{__method__} method."
|
36
36
|
end
|
37
37
|
|
38
38
|
def root_directory
|
39
|
-
|
39
|
+
fail NotImplementedError,
|
40
|
+
"The #{self.class} class must implement the #{__method__} method."
|
40
41
|
end
|
41
42
|
end
|
42
|
-
|
43
43
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require 'fileutils'
|
2
|
+
require 'rubycritic/configuration'
|
3
|
+
require 'rubycritic/generators/html/overview'
|
4
|
+
require 'rubycritic/generators/html/smells_index'
|
5
|
+
require 'rubycritic/generators/html/code_index'
|
6
|
+
require 'rubycritic/generators/html/code_file'
|
6
7
|
|
7
8
|
module Rubycritic
|
8
9
|
module Generator
|
9
|
-
|
10
10
|
class HtmlReport
|
11
|
-
ASSETS_DIR = File.expand_path(
|
11
|
+
ASSETS_DIR = File.expand_path('../html/assets', __FILE__)
|
12
12
|
|
13
13
|
def initialize(analysed_modules)
|
14
14
|
@analysed_modules = analysed_modules
|
@@ -18,6 +18,11 @@ module Rubycritic
|
|
18
18
|
create_directories_and_files
|
19
19
|
copy_assets_to_report_directory
|
20
20
|
puts "New critique at #{report_location}"
|
21
|
+
browser.open unless Config.no_browser
|
22
|
+
end
|
23
|
+
|
24
|
+
def browser
|
25
|
+
@browser ||= Rubycritic::Browser.new(report_location)
|
21
26
|
end
|
22
27
|
|
23
28
|
private
|
@@ -25,7 +30,7 @@ module Rubycritic
|
|
25
30
|
def create_directories_and_files
|
26
31
|
Array(generators).each do |generator|
|
27
32
|
FileUtils.mkdir_p(generator.file_directory)
|
28
|
-
File.open(generator.file_pathname,
|
33
|
+
File.open(generator.file_pathname, 'w+') do |file|
|
29
34
|
file.write(generator.render)
|
30
35
|
end
|
31
36
|
end
|
@@ -61,6 +66,5 @@ module Rubycritic
|
|
61
66
|
overview_generator.file_href
|
62
67
|
end
|
63
68
|
end
|
64
|
-
|
65
69
|
end
|
66
70
|
end
|
@@ -1,10 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'json'
|
2
|
+
require 'rubycritic/version'
|
3
3
|
|
4
4
|
module Rubycritic
|
5
5
|
module Generator
|
6
6
|
module Json
|
7
|
-
|
8
7
|
class Simple
|
9
8
|
def initialize(analysed_modules)
|
10
9
|
@analysed_modules = analysed_modules
|
@@ -16,17 +15,16 @@ module Rubycritic
|
|
16
15
|
|
17
16
|
def data
|
18
17
|
{
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
18
|
+
metadata: {
|
19
|
+
rubycritic: {
|
20
|
+
version: Rubycritic::VERSION
|
22
21
|
}
|
23
22
|
},
|
24
|
-
:
|
25
|
-
:
|
23
|
+
analysed_modules: @analysed_modules,
|
24
|
+
score: @analysed_modules.score
|
26
25
|
}
|
27
26
|
end
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
31
29
|
end
|
32
30
|
end
|