rubycritic 0.0.14 → 0.0.15

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -4
  3. data/bin/rubycritic +2 -0
  4. data/lib/rubycritic/adapters/complexity/flog.rb +8 -6
  5. data/lib/rubycritic/adapters/smell/flay.rb +31 -9
  6. data/lib/rubycritic/adapters/smell/flog.rb +18 -9
  7. data/lib/rubycritic/adapters/smell/reek.rb +12 -5
  8. data/lib/rubycritic/analysers/churn.rb +6 -3
  9. data/lib/rubycritic/analysers/stats.rb +31 -0
  10. data/lib/rubycritic/analysers_runner.rb +13 -19
  11. data/lib/rubycritic/cli.rb +34 -18
  12. data/lib/rubycritic/configuration.rb +7 -1
  13. data/lib/rubycritic/core/analysed_file.rb +27 -1
  14. data/lib/rubycritic/core/location.rb +1 -1
  15. data/lib/rubycritic/core/rating.rb +22 -0
  16. data/lib/rubycritic/core/smell.rb +3 -12
  17. data/lib/rubycritic/files_initializer.rb +15 -0
  18. data/lib/rubycritic/orchestrator.rb +23 -0
  19. data/lib/rubycritic/report_generators/assets/javascripts/application.js +5 -3
  20. data/lib/rubycritic/report_generators/assets/javascripts/jquery.timeago-v1.4.1.js +214 -0
  21. data/lib/rubycritic/report_generators/assets/stylesheets/application.css +87 -2
  22. data/lib/rubycritic/report_generators/code_file.rb +1 -3
  23. data/lib/rubycritic/report_generators/code_index.rb +0 -1
  24. data/lib/rubycritic/report_generators/current_code_file.rb +17 -0
  25. data/lib/rubycritic/report_generators/line.rb +0 -1
  26. data/lib/rubycritic/report_generators/overview.rb +1 -2
  27. data/lib/rubycritic/report_generators/smells_index.rb +0 -1
  28. data/lib/rubycritic/report_generators/templates/code_file.html.erb +28 -1
  29. data/lib/rubycritic/report_generators/templates/code_index.html.erb +6 -2
  30. data/lib/rubycritic/report_generators/templates/layouts/application.html.erb +8 -7
  31. data/lib/rubycritic/report_generators/templates/overview.html.erb +1 -1
  32. data/lib/rubycritic/report_generators/view_helpers.rb +6 -2
  33. data/lib/rubycritic/reporters/main.rb +7 -3
  34. data/lib/rubycritic/reporters/mini.rb +13 -4
  35. data/lib/rubycritic/revision_comparator.rb +15 -16
  36. data/lib/rubycritic/serializer.rb +32 -0
  37. data/lib/rubycritic/smells_status_setter.rb +5 -11
  38. data/lib/rubycritic/source_control_systems/base.rb +60 -0
  39. data/lib/rubycritic/source_control_systems/double.rb +19 -0
  40. data/lib/rubycritic/source_control_systems/git.rb +46 -40
  41. data/lib/rubycritic/turbulence.rb +3 -7
  42. data/lib/rubycritic/version.rb +1 -1
  43. data/lib/rubycritic.rb +1 -7
  44. data/rubycritic.gemspec +1 -0
  45. data/test/lib/rubycritic/adapters/complexity/flog_test.rb +5 -5
  46. data/test/lib/rubycritic/adapters/smell/flay_test.rb +19 -8
  47. data/test/lib/rubycritic/adapters/smell/flog_test.rb +11 -8
  48. data/test/lib/rubycritic/adapters/smell/reek_test.rb +14 -10
  49. data/test/lib/rubycritic/analysers/churn_test.rb +23 -8
  50. data/test/lib/rubycritic/core/analysed_file_test.rb +31 -11
  51. data/test/lib/rubycritic/core/smell_test.rb +13 -20
  52. data/test/lib/rubycritic/smells_status_setter_test.rb +2 -2
  53. data/test/lib/rubycritic/source_control_systems/source_control_system_test.rb +5 -12
  54. data/test/lib/rubycritic/turbulence_test.rb +1 -2
  55. data/test/lib/rubycritic/version_test.rb +1 -0
  56. data/test/samples/flog/{smelly2.rb → complex.rb} +0 -0
  57. data/test/test_helper.rb +1 -0
  58. metadata +27 -17
  59. data/lib/rubycritic/active_support/methods.rb +0 -36
  60. data/lib/rubycritic/analysed_files_builder.rb +0 -36
  61. data/lib/rubycritic/orchestrators/base.rb +0 -27
  62. data/lib/rubycritic/orchestrators/main.rb +0 -14
  63. data/lib/rubycritic/orchestrators/mini.rb +0 -14
  64. data/lib/rubycritic/smells_serializer.rb +0 -32
  65. data/lib/rubycritic/source_control_systems/source_control_system.rb +0 -50
  66. data/test/lib/rubycritic/analysed_files_builder_test.rb +0 -36
  67. data/test/lib/rubycritic/analysers_runner_test.rb +0 -11
  68. data/test/samples/analysers_runner/empty.rb +0 -0
@@ -1,22 +1,16 @@
1
1
  module Rubycritic
2
2
 
3
- class SmellsStatusSetter
4
- def initialize(smells_before, smells_now)
5
- @smells_before = smells_before || []
6
- @smells_now = smells_now || []
7
- end
8
-
9
- def smells
10
- old_smells = @smells_now & @smells_before
3
+ module SmellsStatusSetter
4
+ def self.set(smells_before, smells_now)
5
+ old_smells = smells_now & smells_before
11
6
  set_status(old_smells, :old)
12
- new_smells = @smells_now - @smells_before
7
+ new_smells = smells_now - smells_before
13
8
  set_status(new_smells, :new)
14
- @smells_now
15
9
  end
16
10
 
17
11
  private
18
12
 
19
- def set_status(smells, status)
13
+ def self.set_status(smells, status)
20
14
  smells.each { |smell| smell.status = status }
21
15
  end
22
16
  end
@@ -0,0 +1,60 @@
1
+ require "shellwords"
2
+
3
+ module Rubycritic
4
+ module SourceControlSystem
5
+
6
+ class Base
7
+ @@systems = []
8
+
9
+ def self.register_system
10
+ @@systems << self
11
+ end
12
+
13
+ def self.create
14
+ supported_system = systems.detect(&:supported?)
15
+ if supported_system
16
+ supported_system.new
17
+ else
18
+ puts "Rubycritic requires a #{system_names} repository."
19
+ Double.new
20
+ end
21
+ end
22
+
23
+ def self.systems
24
+ @@systems
25
+ end
26
+
27
+ def self.system_names
28
+ systems.join(", ")
29
+ end
30
+
31
+ def self.supported?
32
+ raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
33
+ end
34
+
35
+ def has_revision?
36
+ raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
37
+ end
38
+
39
+ def head_reference
40
+ raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
41
+ end
42
+
43
+ def travel_to_head
44
+ raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
45
+ end
46
+
47
+ def revisions_count(path)
48
+ raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
49
+ end
50
+
51
+ def date_of_last_commit(path)
52
+ raise NotImplementedError.new("The #{self.class} class must implement the #{__method__} method.")
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+
59
+ require "rubycritic/source_control_systems/double"
60
+ require "rubycritic/source_control_systems/git"
@@ -0,0 +1,19 @@
1
+ module Rubycritic
2
+ module SourceControlSystem
3
+
4
+ class Double < Base
5
+ def has_revision?
6
+ false
7
+ end
8
+
9
+ def revisions_count(path)
10
+ "N/A"
11
+ end
12
+
13
+ def date_of_last_commit(path)
14
+ nil
15
+ end
16
+ end
17
+
18
+ end
19
+ end
@@ -1,57 +1,63 @@
1
1
  module Rubycritic
2
+ module SourceControlSystem
2
3
 
3
- class Git < SourceControlSystem
4
- register_system
4
+ class Git < Base
5
+ register_system
5
6
 
6
- def self.supported?
7
- `git branch 2>&1` && $?.success?
8
- end
7
+ def self.supported?
8
+ `git branch 2>&1` && $?.success?
9
+ end
9
10
 
10
- def self.to_s
11
- "Git"
12
- end
11
+ def self.to_s
12
+ "Git"
13
+ end
13
14
 
14
- def has_revision?
15
- head_reference && $?.success?
16
- end
15
+ def has_revision?
16
+ head_reference && $?.success?
17
+ end
17
18
 
18
- def head_reference
19
- `git rev-parse --verify HEAD`.chomp
20
- end
19
+ def head_reference
20
+ `git rev-parse --verify HEAD`.chomp!
21
+ end
21
22
 
22
- def travel_to_head
23
- stash_successful = stash_changes
24
- yield
25
- ensure
26
- travel_to_original_state if stash_successful
27
- end
23
+ def travel_to_head
24
+ stash_successful = stash_changes
25
+ yield
26
+ ensure
27
+ travel_to_original_state if stash_successful
28
+ end
28
29
 
29
- def revisions_count(file)
30
- `git log --follow --format=oneline #{file}`.count("\n")
31
- end
30
+ def revisions_count(path)
31
+ `git log --follow --format=oneline #{path.shellescape}`.count("\n")
32
+ end
32
33
 
33
- private
34
+ def date_of_last_commit(path)
35
+ `git log -1 --date=iso --format=%ad #{path.shellescape}`.chomp!
36
+ end
34
37
 
35
- def stash_changes
36
- return false if everything_commmited?
38
+ private
37
39
 
38
- stashes_count_before = stashes_count
39
- `git stash`
40
- stashes_count_after = stashes_count
41
- stashes_count_after > stashes_count_before
42
- end
40
+ def stash_changes
41
+ return false if everything_commmited?
43
42
 
44
- def everything_commmited?
45
- `git status --porcelain`.empty?
46
- end
43
+ stashes_count_before = stashes_count
44
+ `git stash`
45
+ stashes_count_after = stashes_count
46
+ stashes_count_after > stashes_count_before
47
+ end
47
48
 
48
- def stashes_count
49
- `git stash list`.count("\n")
50
- end
49
+ def everything_commmited?
50
+ `git status --porcelain`.empty?
51
+ end
51
52
 
52
- def travel_to_original_state
53
- `git stash pop`
53
+ def stashes_count
54
+ `git stash list`.count("\n")
55
+ end
56
+
57
+ def travel_to_original_state
58
+ `git stash pop`
59
+ end
54
60
  end
55
- end
56
61
 
62
+ end
57
63
  end
@@ -2,13 +2,9 @@ require "json"
2
2
 
3
3
  module Rubycritic
4
4
 
5
- class Turbulence
6
- def initialize(analysed_files)
7
- @analysed_files = analysed_files
8
- end
9
-
10
- def data
11
- @analysed_files.map do |analysed_file|
5
+ module Turbulence
6
+ def self.data(analysed_files)
7
+ analysed_files.map do |analysed_file|
12
8
  {
13
9
  :name => analysed_file.pathname,
14
10
  :x => analysed_file.churn,
@@ -1,3 +1,3 @@
1
1
  module Rubycritic
2
- VERSION = "0.0.14"
2
+ VERSION = "0.0.15"
3
3
  end
data/lib/rubycritic.rb CHANGED
@@ -1,8 +1,2 @@
1
1
  require "rubycritic/configuration"
2
- require "rubycritic/source_locator"
3
- require "rubycritic/analysers_runner"
4
- require "rubycritic/source_control_systems/source_control_system"
5
- require "rubycritic/revision_comparator"
6
- require "rubycritic/analysers/churn"
7
- require "rubycritic/adapters/complexity/flog"
8
- require "rubycritic/analysed_files_builder"
2
+ require "rubycritic/orchestrator"
data/rubycritic.gemspec CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_runtime_dependency "flay", "2.4.0"
26
26
  spec.add_runtime_dependency "flog", "4.2.0"
27
27
  spec.add_runtime_dependency "reek", "1.3.6"
28
+ spec.add_runtime_dependency "code_analyzer", "0.4.5"
28
29
 
29
30
  spec.add_development_dependency "bundler", "~> 1.3"
30
31
  spec.add_development_dependency "rake"
@@ -4,14 +4,14 @@ require "rubycritic/adapters/complexity/flog"
4
4
 
5
5
  describe Rubycritic::ComplexityAdapter::Flog do
6
6
  before do
7
- sample_paths = ["test/samples/flog/smelly.rb", "test/samples/flog/smelly2.rb"]
8
- @adapter = Rubycritic::ComplexityAdapter::Flog.new(sample_paths)
7
+ @analysed_files = [AnalysedFileDouble.new(:path => "test/samples/flog/complex.rb")]
8
+ Rubycritic::ComplexityAdapter::Flog.new(@analysed_files).complexity
9
9
  end
10
10
 
11
11
  describe "#complexity" do
12
- it "return an array containing the complexity of each file" do
13
- @adapter.complexity.each do |file_complexity|
14
- file_complexity.must_be_kind_of Numeric
12
+ it "calculates the complexity of each file and adds it to analysed_files" do
13
+ @analysed_files.each do |analysed_file|
14
+ analysed_file.complexity.must_be_kind_of Numeric
15
15
  end
16
16
  end
17
17
  end
@@ -1,23 +1,34 @@
1
1
  require "test_helper"
2
2
  require "rubycritic/adapters/smell/flay"
3
+ require "rubycritic/core/analysed_file"
4
+ require "pathname"
3
5
 
4
6
  describe Rubycritic::SmellAdapter::Flay do
5
7
  before do
6
- sample_paths = ["test/samples/flay/smelly.rb"]
7
- @adapter = Rubycritic::SmellAdapter::Flay.new(sample_paths)
8
+ @analysed_file = Rubycritic::AnalysedFile.new(
9
+ :pathname => Pathname.new("test/samples/flay/smelly.rb"),
10
+ :smells => [],
11
+ :duplication => 0
12
+ )
13
+ analysed_files = [@analysed_file]
14
+ Rubycritic::SmellAdapter::Flay.new(analysed_files).smells
8
15
  end
9
16
 
10
- it "detects smells" do
11
- @adapter.smells.wont_be_empty
17
+ it "detects smells and adds them to analysed_files" do
18
+ @analysed_file.smells.length.must_equal 1
12
19
  end
13
20
 
14
- it "has smells with messages" do
15
- smell = @adapter.smells.first
21
+ it "creates smells with messages" do
22
+ smell = @analysed_file.smells.first
16
23
  smell.message.must_be_instance_of String
17
24
  end
18
25
 
19
- it "has smells with scores" do
20
- smell = @adapter.smells.first
26
+ it "creates smells with scores" do
27
+ smell = @analysed_file.smells.first
21
28
  smell.score.must_be_kind_of Numeric
22
29
  end
30
+
31
+ it "calculates the mass of duplicate code and adds it to analysed_files" do
32
+ @analysed_file.duplication.must_be(:>, 0)
33
+ end
23
34
  end
@@ -3,21 +3,24 @@ require "rubycritic/adapters/smell/flog"
3
3
 
4
4
  describe Rubycritic::SmellAdapter::Flog do
5
5
  before do
6
- sample_paths = ["test/samples/flog/smelly.rb"]
7
- @adapter = Rubycritic::SmellAdapter::Flog.new(sample_paths)
6
+ @analysed_file = AnalysedFileDouble.new(:path => "test/samples/flog/smelly.rb", :smells => [])
7
+ analysed_files = [@analysed_file]
8
+ Rubycritic::SmellAdapter::Flog.new(analysed_files).smells
8
9
  end
9
10
 
10
- it "detects smells" do
11
- @adapter.smells.wont_be_empty
11
+ it "detects smells and adds them to analysed_files" do
12
+ @analysed_file.smells.length.must_equal 1
12
13
  end
13
14
 
14
- it "has smells with messages" do
15
- smell = @adapter.smells.first
15
+ it "creates smells with messages" do
16
+ smell = @analysed_file.smells.first
16
17
  smell.message.must_be_instance_of String
17
18
  end
18
19
 
19
- it "has smells with scores" do
20
- smell = @adapter.smells.first
20
+ it "creates smells with scores" do
21
+ smell = @analysed_file.smells.first
21
22
  smell.score.must_be_kind_of Numeric
22
23
  end
23
24
  end
25
+
26
+ class AnalysedFileDouble < OpenStruct; end
@@ -4,28 +4,32 @@ require "rubycritic/adapters/smell/reek"
4
4
  describe Rubycritic::SmellAdapter::Reek do
5
5
  context "when analysing a smelly file" do
6
6
  before do
7
- sample_paths = ["test/samples/reek/smelly.rb"]
8
- @adapter = Rubycritic::SmellAdapter::Reek.new(sample_paths)
7
+ @analysed_file = AnalysedFileDouble.new(:path => "test/samples/reek/smelly.rb", :smells => [])
8
+ analysed_files = [@analysed_file]
9
+ Rubycritic::SmellAdapter::Reek.new(analysed_files).smells
9
10
  end
10
11
 
11
- it "detects smells" do
12
- @adapter.smells.wont_be_empty
12
+ it "detects smells and adds them to analysed_files" do
13
+ @analysed_file.smells.length.must_equal 1
13
14
  end
14
15
 
15
- it "has smells with messages" do
16
- smell = @adapter.smells.first
16
+ it "creates smells with messages" do
17
+ smell = @analysed_file.smells.first
17
18
  smell.message.must_equal "has boolean parameter 'reek'"
18
19
  end
19
20
  end
20
21
 
21
22
  context "when analysing a file with smells ignored in config.reek" do
22
23
  before do
23
- sample_paths = ["test/samples/reek/not_smelly.rb"]
24
- @adapter = Rubycritic::SmellAdapter::Reek.new(sample_paths)
24
+ @analysed_file = AnalysedFileDouble.new(:path => "test/samples/reek/not_smelly.rb", :smells => [])
25
+ analysed_files = [@analysed_file]
26
+ Rubycritic::SmellAdapter::Reek.new(analysed_files)
25
27
  end
26
28
 
27
- it "does not detect smells" do
28
- @adapter.smells.must_be_empty
29
+ it "does not detect smells and does not add them to analysed files" do
30
+ @analysed_file.smells.must_be_empty
29
31
  end
30
32
  end
31
33
  end
34
+
35
+ class AnalysedFileDouble < OpenStruct; end
@@ -1,23 +1,38 @@
1
1
  require "test_helper"
2
2
  require "rubycritic/analysers/churn"
3
- require "rubycritic/source_control_systems/source_control_system"
3
+ require "rubycritic/source_control_systems/base"
4
4
 
5
5
  describe Rubycritic::Analyser::Churn do
6
6
  before do
7
- sample_paths = ["path_to_some_file.rb"]
8
- source_control_system = SourceControlSystemDouble.new
9
- @churn = Rubycritic::Analyser::Churn.new(sample_paths, source_control_system)
7
+ @analysed_files = [AnalysedFileDouble.new(:path => "path_to_some_file.rb")]
8
+ @source_control_system = SourceControlSystemDouble.new
10
9
  end
11
10
 
12
11
  describe "#churn" do
13
- it "returns an array containing the number of times each file has changed" do
14
- @churn.churn.must_equal [1]
12
+ it "calculates the churn of each file and adds it to analysed_files" do
13
+ Rubycritic::Analyser::Churn.new(@analysed_files, @source_control_system).churn
14
+ @analysed_files.each do |analysed_file|
15
+ analysed_file.churn.must_equal 1
16
+ end
17
+ end
18
+
19
+ it "calculates the date of the last commit of each file and adds it to analysed_files" do
20
+ Rubycritic::Analyser::Churn.new(@analysed_files, @source_control_system).churn
21
+ @analysed_files.each do |analysed_file|
22
+ analysed_file.committed_at.must_equal "2013-10-09 12:52:49 +0100"
23
+ end
15
24
  end
16
25
  end
17
26
  end
18
27
 
19
- class SourceControlSystemDouble < Rubycritic::SourceControlSystem
20
- def revisions_count(file)
28
+ class AnalysedFileDouble < OpenStruct; end
29
+
30
+ class SourceControlSystemDouble < Rubycritic::SourceControlSystem::Base
31
+ def revisions_count(path)
21
32
  1 # churn
22
33
  end
34
+
35
+ def date_of_last_commit(path)
36
+ "2013-10-09 12:52:49 +0100"
37
+ end
23
38
  end
@@ -1,14 +1,16 @@
1
1
  require "test_helper"
2
2
  require "rubycritic/core/analysed_file"
3
+ require "rubycritic/core/smell"
4
+ require "rubycritic/core/location"
3
5
 
4
6
  describe Rubycritic::AnalysedFile do
5
7
  describe "attribute readers" do
6
8
  before do
7
- @pathname = Pathname.new("./foo")
9
+ @pathname = Pathname.new("foo/bar.rb")
8
10
  @smells = []
9
11
  @churn = 1
10
12
  @complexity = 2
11
- @smell = Rubycritic::AnalysedFile.new(
13
+ @analysed_file = Rubycritic::AnalysedFile.new(
12
14
  :pathname => @pathname,
13
15
  :smells => @smells,
14
16
  :churn => @churn,
@@ -17,26 +19,35 @@ describe Rubycritic::AnalysedFile do
17
19
  end
18
20
 
19
21
  it "has a pathname reader" do
20
- @smell.pathname.must_equal @pathname
22
+ @analysed_file.pathname.must_equal @pathname
21
23
  end
22
24
 
23
25
  it "has a smells reader" do
24
- @smell.smells.must_equal @smells
26
+ @analysed_file.smells.must_equal @smells
25
27
  end
26
28
 
27
29
  it "has a churn reader" do
28
- @smell.churn.must_equal @churn
30
+ @analysed_file.churn.must_equal @churn
29
31
  end
30
32
 
31
33
  it "has a complexity reader" do
32
- @smell.complexity.must_equal @complexity
34
+ @analysed_file.complexity.must_equal @complexity
35
+ end
36
+
37
+ it "has a name reader" do
38
+ @analysed_file.name.must_equal "bar"
39
+ end
40
+
41
+ it "has a path reader" do
42
+ @analysed_file.path.must_equal @pathname.to_s
33
43
  end
34
44
  end
35
45
 
36
- describe "#name" do
37
- it "returns the name of the file" do
38
- analysed_file = Rubycritic::AnalysedFile.new(:pathname => Pathname.new("foo/bar.rb"))
39
- analysed_file.name.must_equal "bar"
46
+ describe "#cost" do
47
+ it "returns the remediation cost of fixing the analysed_file" do
48
+ smells = [SmellDouble.new(:cost => 1), SmellDouble.new(:cost => 2)]
49
+ analysed_file = Rubycritic::AnalysedFile.new(:smells => smells, :complexity => 0)
50
+ analysed_file.cost.must_equal 3
40
51
  end
41
52
  end
42
53
 
@@ -46,6 +57,15 @@ describe Rubycritic::AnalysedFile do
46
57
  analysed_file.has_smells?.must_equal true
47
58
  end
48
59
  end
60
+
61
+ describe "#smells_at_location" do
62
+ it "returns the smells of an analysed_file at a certain location" do
63
+ location = Rubycritic::Location.new("./foo", "42")
64
+ smells = [Rubycritic::Smell.new(:locations => [location])]
65
+ analysed_file = Rubycritic::AnalysedFile.new(:smells => smells)
66
+ analysed_file.smells_at_location(location).must_equal smells
67
+ end
68
+ end
49
69
  end
50
70
 
51
- class SmellDouble; end
71
+ class SmellDouble < OpenStruct; end
@@ -1,5 +1,6 @@
1
1
  require "test_helper"
2
2
  require "rubycritic/core/smell"
3
+ require "rubycritic/core/location"
3
4
 
4
5
  describe Rubycritic::Smell do
5
6
  describe "attribute readers" do
@@ -47,16 +48,6 @@ describe Rubycritic::Smell do
47
48
  end
48
49
  end
49
50
 
50
- describe "#at_pathname?" do
51
- it "returns true if the smell has a pathname that matches the pathname passed as argument" do
52
- path = "./foo"
53
- pathname = Pathname.new(path)
54
- location = Rubycritic::Location.new(path, "42")
55
- smell = Rubycritic::Smell.new(:locations => [location])
56
- smell.at_pathname?(pathname).must_equal true
57
- end
58
- end
59
-
60
51
  describe "#has_multiple_locations?" do
61
52
  it "returns true if the smell has more than one location" do
62
53
  location1 = Rubycritic::Location.new("./foo", "42")
@@ -66,15 +57,17 @@ describe Rubycritic::Smell do
66
57
  end
67
58
  end
68
59
 
69
- it "is comparable" do
70
- attributes = {
71
- :context => "#bar",
72
- :message => "This smells",
73
- :score => 0,
74
- :type => :complexity
75
- }
76
- smell1 = Rubycritic::Smell.new(attributes)
77
- smell2 = Rubycritic::Smell.new(attributes)
78
- smell1.must_equal smell2
60
+ describe "#==" do
61
+ it "returns true if two smells have the same base attributes" do
62
+ attributes = {
63
+ :context => "#bar",
64
+ :message => "This smells",
65
+ :score => 0,
66
+ :type => :complexity
67
+ }
68
+ smell1 = Rubycritic::Smell.new(attributes)
69
+ smell2 = Rubycritic::Smell.new(attributes)
70
+ smell1.must_equal smell2
71
+ end
79
72
  end
80
73
  end
@@ -10,12 +10,12 @@ describe Rubycritic::SmellsStatusSetter do
10
10
  end
11
11
 
12
12
  it "marks old smells" do
13
- Rubycritic::SmellsStatusSetter.new(@smells, @smells).smells
13
+ Rubycritic::SmellsStatusSetter.set(@smells, @smells)
14
14
  @smell.status.must_equal :old
15
15
  end
16
16
 
17
17
  it "marks new smells" do
18
- Rubycritic::SmellsStatusSetter.new([], @smells).smells
18
+ Rubycritic::SmellsStatusSetter.set([], @smells)
19
19
  @smell.status.must_equal :new
20
20
  end
21
21
  end
@@ -1,9 +1,9 @@
1
1
  require "test_helper"
2
- require "rubycritic/source_control_systems/source_control_system"
2
+ require "rubycritic/source_control_systems/base"
3
3
 
4
4
  describe Rubycritic::SourceControlSystem do
5
5
  before do
6
- Rubycritic::SourceControlSystem.systems.each do |system|
6
+ Rubycritic::SourceControlSystem::Base.systems.each do |system|
7
7
  system.stubs(:supported?).returns(false)
8
8
  end
9
9
  end
@@ -11,16 +11,9 @@ describe Rubycritic::SourceControlSystem do
11
11
  describe "::create" do
12
12
  describe "when a source control system is found" do
13
13
  it "creates an instance of that source control system" do
14
- Rubycritic::Git.stubs(:supported?).returns(true)
15
- system = Rubycritic::SourceControlSystem.create
16
- system.must_be_instance_of Rubycritic::Git
17
- end
18
- end
19
-
20
- describe "when no source control system is found" do
21
- it "raises an error" do
22
- error = proc { Rubycritic::SourceControlSystem.create }.must_raise RuntimeError
23
- error.message.must_match "Rubycritic requires a Git repository."
14
+ Rubycritic::SourceControlSystem::Git.stubs(:supported?).returns(true)
15
+ system = Rubycritic::SourceControlSystem::Base.create
16
+ system.must_be_instance_of Rubycritic::SourceControlSystem::Git
24
17
  end
25
18
  end
26
19
  end
@@ -1,12 +1,11 @@
1
1
  require "test_helper"
2
2
  require "rubycritic/turbulence"
3
- require "ostruct"
4
3
 
5
4
  describe Rubycritic::Turbulence do
6
5
  describe "#data" do
7
6
  it "returns json data that maps pathname, churn and complexity to name, x and y" do
8
7
  files = [AnalysedFileDouble.new(:pathname => "./foo.rb", :churn => 1, :complexity => 2)]
9
- turbulence_data = Rubycritic::Turbulence.new(files).data
8
+ turbulence_data = Rubycritic::Turbulence.data(files)
10
9
  instance_parsed_json = JSON.parse(turbulence_data).first
11
10
  instance_parsed_json["name"].must_equal "./foo.rb"
12
11
  instance_parsed_json["x"].must_equal 1
@@ -1,4 +1,5 @@
1
1
  require "test_helper"
2
+ require "rubycritic/version"
2
3
 
3
4
  describe "Rubycritic version" do
4
5
  it "is defined" do
File without changes
data/test/test_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "minitest/autorun"
2
2
  require "minitest/pride"
3
3
  require "mocha/setup"
4
+ require "ostruct"
4
5
 
5
6
  def context(*args, &block)
6
7
  describe(*args, &block)