rubycritic 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/lib/rubycritic/analysers/attributes.rb +21 -0
  4. data/lib/rubycritic/analysers/churn.rb +5 -5
  5. data/lib/rubycritic/analysers/complexity.rb +6 -6
  6. data/lib/rubycritic/analysers/helpers/ast_node.rb +73 -0
  7. data/lib/rubycritic/analysers/{adapters → helpers}/config.reek +0 -0
  8. data/lib/rubycritic/analysers/{adapters → helpers}/flay.rb +0 -0
  9. data/lib/rubycritic/analysers/{adapters → helpers}/flog.rb +0 -0
  10. data/lib/rubycritic/analysers/helpers/methods_counter.rb +28 -0
  11. data/lib/rubycritic/analysers/helpers/modules_locator.rb +46 -0
  12. data/lib/rubycritic/analysers/{adapters → helpers}/reek.rb +0 -0
  13. data/lib/rubycritic/analysers/smells/flay.rb +9 -9
  14. data/lib/rubycritic/analysers/smells/flog.rb +8 -8
  15. data/lib/rubycritic/analysers/smells/reek.rb +8 -8
  16. data/lib/rubycritic/analysers_runner.rb +6 -6
  17. data/lib/rubycritic/cli.rb +2 -2
  18. data/lib/rubycritic/core/{analysed_file.rb → analysed_module.rb} +4 -7
  19. data/lib/rubycritic/modules_initializer.rb +14 -0
  20. data/lib/rubycritic/orchestrator.rb +5 -5
  21. data/lib/rubycritic/report_generators/code_file.rb +4 -4
  22. data/lib/rubycritic/report_generators/code_index.rb +2 -2
  23. data/lib/rubycritic/report_generators/overview.rb +2 -2
  24. data/lib/rubycritic/report_generators/smells_index.rb +13 -2
  25. data/lib/rubycritic/report_generators/templates/code_file.html.erb +10 -10
  26. data/lib/rubycritic/report_generators/templates/code_index.html.erb +7 -7
  27. data/lib/rubycritic/report_generators/templates/smells_index.html.erb +1 -1
  28. data/lib/rubycritic/report_generators/turbulence.rb +5 -5
  29. data/lib/rubycritic/report_generators/view_helpers.rb +4 -4
  30. data/lib/rubycritic/reporters/main.rb +7 -8
  31. data/lib/rubycritic/reporters/mini.rb +3 -3
  32. data/lib/rubycritic/revision_comparator.rb +12 -10
  33. data/lib/rubycritic/source_locator.rb +1 -1
  34. data/lib/rubycritic/version.rb +1 -1
  35. data/rubycritic.gemspec +3 -4
  36. data/test/analysers_test_helper.rb +1 -1
  37. data/test/lib/rubycritic/analysers/churn_test.rb +9 -9
  38. data/test/lib/rubycritic/analysers/complexity_test.rb +5 -5
  39. data/test/lib/rubycritic/analysers/helpers/methods_counter_test.rb +29 -0
  40. data/test/lib/rubycritic/analysers/helpers/modules_locator_test.rb +53 -0
  41. data/test/lib/rubycritic/analysers/smells/flay_test.rb +10 -12
  42. data/test/lib/rubycritic/analysers/smells/flog_test.rb +7 -7
  43. data/test/lib/rubycritic/analysers/smells/reek_test.rb +10 -10
  44. data/test/lib/rubycritic/core/analysed_module_test.rb +88 -0
  45. data/test/lib/rubycritic/report_generators/turbulence_test.rb +4 -4
  46. data/test/lib/rubycritic/report_generators/view_helpers_test.rb +10 -23
  47. data/test/lib/rubycritic/smells_status_setter_test.rb +1 -1
  48. data/test/lib/rubycritic/source_locator_test.rb +6 -6
  49. data/test/samples/{stats/empty_example.rb → empty.rb} +0 -0
  50. data/test/samples/{stats/example.rb → methods_count.rb} +0 -0
  51. data/test/samples/module_names.rb +18 -0
  52. data/test/samples/unparsable.rb +1 -0
  53. metadata +30 -23
  54. data/lib/rubycritic/analysers/adapters/ast_node.rb +0 -35
  55. data/lib/rubycritic/analysers/stats.rb +0 -34
  56. data/lib/rubycritic/files_initializer.rb +0 -15
  57. data/test/lib/rubycritic/analysers/stats_test.rb +0 -30
  58. data/test/lib/rubycritic/core/analysed_file_test.rb +0 -86
  59. data/test/samples/stats/unparsable_example.rb +0 -2
@@ -1,35 +0,0 @@
1
- module Parser
2
- module AST
3
-
4
- class Node
5
- def count_nodes_of_type(*types)
6
- count = 0
7
- recursive_children do |child|
8
- count += 1 if types.include?(child.type)
9
- end
10
- count
11
- end
12
-
13
- def recursive_children
14
- children.each do |child|
15
- next unless child.is_a?(Parser::AST::Node)
16
- yield child
17
- child.recursive_children { |grand_child| yield grand_child }
18
- end
19
- end
20
- end
21
-
22
- end
23
- end
24
-
25
- module Rubycritic
26
- module AST
27
-
28
- class EmptyNode
29
- def count_nodes_of_type(*types)
30
- 0
31
- end
32
- end
33
-
34
- end
35
- end
@@ -1,34 +0,0 @@
1
- require "parser/current"
2
- require "rubycritic/analysers/adapters/ast_node"
3
-
4
- module Rubycritic
5
- module Analyser
6
-
7
- class Stats
8
- def initialize(analysed_files)
9
- @analysed_files = analysed_files
10
- end
11
-
12
- def run
13
- @analysed_files.each do |analysed_file|
14
- analysed_file.methods_count = methods_count(analysed_file.path)
15
- end
16
- end
17
-
18
- private
19
-
20
- def methods_count(path)
21
- content = File.read(path)
22
- node = parse_content(content)
23
- node.count_nodes_of_type(:def, :defs)
24
- end
25
-
26
- def parse_content(content)
27
- Parser::CurrentRuby.parse(content) || AST::EmptyNode.new
28
- rescue Parser::SyntaxError => error
29
- AST::EmptyNode.new
30
- end
31
- end
32
-
33
- end
34
- end
@@ -1,15 +0,0 @@
1
- require "rubycritic/source_locator"
2
- require "rubycritic/core/analysed_file"
3
-
4
- module Rubycritic
5
-
6
- module FilesInitializer
7
- def self.init(paths)
8
- source = SourceLocator.new(paths)
9
- source.pathnames.map do |pathname|
10
- AnalysedFile.new(:pathname => pathname, :smells => [], :duplication => 0)
11
- end
12
- end
13
- end
14
-
15
- end
@@ -1,30 +0,0 @@
1
- require "analysers_test_helper"
2
- require "rubycritic/analysers/stats"
3
-
4
- describe Rubycritic::Analyser::Stats do
5
- context "when a file contains Ruby code" do
6
- it "calculates the number of methods of each file and adds it to analysed_files" do
7
- analysed_file = AnalysedFileDouble.new(:path => "test/samples/stats/example.rb")
8
- Rubycritic::Analyser::Stats.new([analysed_file]).run
9
- analysed_file.methods_count.must_equal 2
10
- end
11
- end
12
-
13
- context "when a file is empty" do
14
- it "calculates the number of methods as 0, adding it to analysed_files" do
15
- analysed_file = AnalysedFileDouble.new(:path => "test/samples/stats/empty_example.rb")
16
- Rubycritic::Analyser::Stats.new([analysed_file]).run
17
- analysed_file.methods_count.must_equal 0
18
- end
19
- end
20
-
21
- context "when a file is unparsable" do
22
- it "does not blow up" do
23
- analysed_file = AnalysedFileDouble.new(:path => "test/samples/stats/unparsable_example.rb")
24
- capture_output_streams do
25
- Rubycritic::Analyser::Stats.new([analysed_file]).run
26
- end
27
- analysed_file.methods_count.must_equal 0
28
- end
29
- end
30
- end
@@ -1,86 +0,0 @@
1
- require "test_helper"
2
- require "rubycritic/core/analysed_file"
3
- require "rubycritic/core/smell"
4
-
5
- describe Rubycritic::AnalysedFile do
6
- describe "attribute readers" do
7
- before do
8
- @pathname = Pathname.new("foo/bar.rb")
9
- @smells = []
10
- @churn = 1
11
- @complexity = 2
12
- @analysed_file = Rubycritic::AnalysedFile.new(
13
- :pathname => @pathname,
14
- :smells => @smells,
15
- :churn => @churn,
16
- :complexity => @complexity
17
- )
18
- end
19
-
20
- it "has a pathname reader" do
21
- @analysed_file.pathname.must_equal @pathname
22
- end
23
-
24
- it "has a smells reader" do
25
- @analysed_file.smells.must_equal @smells
26
- end
27
-
28
- it "has a churn reader" do
29
- @analysed_file.churn.must_equal @churn
30
- end
31
-
32
- it "has a complexity reader" do
33
- @analysed_file.complexity.must_equal @complexity
34
- end
35
-
36
- it "has a name reader" do
37
- @analysed_file.name.must_equal "bar"
38
- end
39
-
40
- it "has a path reader" do
41
- @analysed_file.path.must_equal @pathname.to_s
42
- end
43
- end
44
-
45
- describe "#cost" do
46
- it "returns the remediation cost of fixing the analysed_file" do
47
- smells = [SmellDouble.new(:cost => 1), SmellDouble.new(:cost => 2)]
48
- analysed_file = Rubycritic::AnalysedFile.new(:smells => smells, :complexity => 0)
49
- analysed_file.cost.must_equal 3
50
- end
51
- end
52
-
53
- describe "#complexity_per_method" do
54
- context "when the file has no methods" do
55
- it "returns a placeholder" do
56
- analysed_file = Rubycritic::AnalysedFile.new(:complexity => 0, :methods_count => 0)
57
- analysed_file.complexity_per_method.must_equal "N/A"
58
- end
59
- end
60
-
61
- context "when the file has at least one method" do
62
- it "returns the average complexity per method" do
63
- analysed_file = Rubycritic::AnalysedFile.new(:complexity => 10, :methods_count => 2)
64
- analysed_file.complexity_per_method.must_equal 5
65
- end
66
- end
67
- end
68
-
69
- describe "#has_smells?" do
70
- it "returns true if the analysed_file has at least one smell" do
71
- analysed_file = Rubycritic::AnalysedFile.new(:smells => [SmellDouble.new])
72
- analysed_file.has_smells?.must_equal true
73
- end
74
- end
75
-
76
- describe "#smells_at_location" do
77
- it "returns the smells of an analysed_file at a certain location" do
78
- location = Rubycritic::Location.new("./foo", "42")
79
- smells = [Rubycritic::Smell.new(:locations => [location])]
80
- analysed_file = Rubycritic::AnalysedFile.new(:smells => smells)
81
- analysed_file.smells_at_location(location).must_equal smells
82
- end
83
- end
84
- end
85
-
86
- class SmellDouble < OpenStruct; end
@@ -1,2 +0,0 @@
1
- factory :<%= singular_name %> do
2
- end