roodi 2.1.0 → 2.2.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.
Files changed (48) hide show
  1. data/Gemfile +6 -0
  2. data/Gemfile.lock +22 -0
  3. data/History.txt +0 -6
  4. data/Manifest.txt +0 -4
  5. data/Rakefile +2 -9
  6. data/lib/roodi.rb +1 -4
  7. data/lib/roodi/checks/abc_metric_method_check.rb +4 -2
  8. data/lib/roodi/checks/assignment_in_conditional_check.rb +2 -4
  9. data/lib/roodi/checks/check.rb +15 -0
  10. data/lib/roodi/checks/class_line_count_check.rb +13 -3
  11. data/lib/roodi/checks/class_name_check.rb +13 -3
  12. data/lib/roodi/checks/cyclomatic_complexity_block_check.rb +5 -3
  13. data/lib/roodi/checks/cyclomatic_complexity_check.rb +5 -2
  14. data/lib/roodi/checks/cyclomatic_complexity_method_check.rb +5 -3
  15. data/lib/roodi/checks/line_count_check.rb +4 -11
  16. data/lib/roodi/checks/method_line_count_check.rb +13 -3
  17. data/lib/roodi/checks/method_name_check.rb +13 -3
  18. data/lib/roodi/checks/missing_foreign_key_index_check.rb +1 -0
  19. data/lib/roodi/checks/module_line_count_check.rb +13 -3
  20. data/lib/roodi/checks/module_name_check.rb +14 -4
  21. data/lib/roodi/checks/name_check.rb +3 -10
  22. data/lib/roodi/checks/npath_complexity_check.rb +2 -0
  23. data/lib/roodi/checks/npath_complexity_method_check.rb +4 -3
  24. data/lib/roodi/checks/parameter_number_check.rb +8 -4
  25. data/lib/roodi/core/runner.rb +6 -6
  26. data/lib/roodi/version.rb +3 -0
  27. data/roodi.gemspec +18 -0
  28. data/roodi.yml +24 -15
  29. data/spec/roodi/checks/abc_metric_method_check_spec.rb +1 -1
  30. data/spec/roodi/checks/assignment_in_conditional_check_spec.rb +1 -1
  31. data/spec/roodi/checks/case_missing_else_check_spec.rb +1 -1
  32. data/spec/roodi/checks/class_line_count_check_spec.rb +1 -1
  33. data/spec/roodi/checks/class_name_check_spec.rb +1 -1
  34. data/spec/roodi/checks/class_variable_check_spec.rb +1 -1
  35. data/spec/roodi/checks/control_coupling_check_spec.rb +1 -1
  36. data/spec/roodi/checks/cyclomatic_complexity_block_check_spec.rb +1 -1
  37. data/spec/roodi/checks/cyclomatic_complexity_method_check_spec.rb +1 -1
  38. data/spec/roodi/checks/empty_rescue_body_check_spec.rb +1 -1
  39. data/spec/roodi/checks/for_loop_check_spec.rb +1 -1
  40. data/spec/roodi/checks/method_line_count_check_spec.rb +1 -1
  41. data/spec/roodi/checks/method_name_check_spec.rb +1 -1
  42. data/spec/roodi/checks/missing_foreign_key_index_check_spec.rb +1 -1
  43. data/spec/roodi/checks/module_line_count_check_spec.rb +1 -1
  44. data/spec/roodi/checks/module_name_check_spec.rb +1 -1
  45. data/spec/roodi/checks/npath_complexity_method_check_spec.rb +1 -1
  46. data/spec/roodi/checks/parameter_number_check_spec.rb +1 -1
  47. data/spec/roodi/roodi.yml +2 -1
  48. metadata +61 -67
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ gem "rake"
6
+ gem "rspec", "~> 1.3.2"
@@ -0,0 +1,22 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ roodi (2.2.0)
5
+ ruby_parser (~> 2.3.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ rake (10.0.3)
11
+ rspec (1.3.2)
12
+ ruby_parser (2.3.0)
13
+ sexp_processor (~> 3.0)
14
+ sexp_processor (3.2.0)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ rake
21
+ roodi!
22
+ rspec (~> 1.3.2)
@@ -1,9 +1,3 @@
1
- = 2.1.0
2
-
3
- * Ruby 1.9 compatible.
4
- * New framework support to allow start and end file events.
5
- * Added MissingForeignKeyIndexCheck. Still experimental for now.
6
-
7
1
  = 2.0.1
8
2
 
9
3
  * Fixed a bug where roodi.yml was not being loaded. Patch supplied by Rob Mitchell.
@@ -22,7 +22,6 @@ lib/roodi/checks/for_loop_check.rb
22
22
  lib/roodi/checks/line_count_check.rb
23
23
  lib/roodi/checks/method_line_count_check.rb
24
24
  lib/roodi/checks/method_name_check.rb
25
- lib/roodi/checks/missing_foreign_key_index_check.rb
26
25
  lib/roodi/checks/module_line_count_check.rb
27
26
  lib/roodi/checks/module_name_check.rb
28
27
  lib/roodi/checks/name_check.rb
@@ -50,11 +49,8 @@ spec/roodi/checks/empty_rescue_body_check_spec.rb
50
49
  spec/roodi/checks/for_loop_check_spec.rb
51
50
  spec/roodi/checks/method_line_count_check_spec.rb
52
51
  spec/roodi/checks/method_name_check_spec.rb
53
- spec/roodi/checks/missing_foreign_key_index_check_spec.rb
54
52
  spec/roodi/checks/module_line_count_check_spec.rb
55
53
  spec/roodi/checks/module_name_check_spec.rb
56
54
  spec/roodi/checks/npath_complexity_method_check_spec.rb
57
55
  spec/roodi/checks/parameter_number_check_spec.rb
58
- spec/roodi/core/runner_spec.rb
59
- spec/roodi/roodi.yml
60
56
  spec/spec_helper.rb
data/Rakefile CHANGED
@@ -1,16 +1,9 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
2
-
3
- require 'rubygems'
4
- require 'hoe'
5
1
  require 'rake'
6
2
  require 'spec/rake/spectask'
3
+ require 'bundler'
7
4
  require 'roodi'
8
5
 
9
- Hoe.new('roodi', Roodi::VERSION) do |p|
10
- p.developer('Marty Andrews', 'marty@cogentconsulting.com.au')
11
- p.extra_deps = ['ruby_parser']
12
- p.remote_rdoc_dir = ''
13
- end
6
+ Bundler::GemHelper.install_tasks
14
7
 
15
8
  def roodi(ruby_files)
16
9
  roodi = Roodi::Core::Runner.new
@@ -1,6 +1,3 @@
1
1
  require 'roodi/checks'
2
2
  require 'roodi/core'
3
-
4
- module Roodi
5
- VERSION = '2.1.0'
6
- end
3
+ require 'roodi/version'
@@ -16,9 +16,11 @@ module Roodi
16
16
  OPERATORS = [:*, :/, :%, :+, :<<, :>>, :&, :|, :^]
17
17
  DEFAULT_SCORE = 10
18
18
 
19
- def initialize(options = {})
19
+ attr_accessor :score
20
+
21
+ def initialize
20
22
  super()
21
- @score = options['score'] || DEFAULT_SCORE
23
+ self.score = DEFAULT_SCORE
22
24
  end
23
25
 
24
26
  def interesting_nodes
@@ -7,10 +7,7 @@ module Roodi
7
7
  # A conditional containing an assignment is likely to be a mistyped equality check. You
8
8
  # should either fix the typo or factor out the assignment so that the code is clearer.
9
9
  class AssignmentInConditionalCheck < Check
10
- def initialize(options = {})
11
- super()
12
- end
13
-
10
+
14
11
  def interesting_nodes
15
12
  [:if, :while]
16
13
  end
@@ -29,6 +26,7 @@ module Roodi
29
26
  end
30
27
  found_assignment
31
28
  end
29
+
32
30
  end
33
31
  end
34
32
  end
@@ -3,8 +3,23 @@ require 'roodi/core/error'
3
3
  module Roodi
4
4
  module Checks
5
5
  class Check
6
+
6
7
  NODE_TYPES = [:defn, :module, :resbody, :lvar, :cvar, :class, :if, :while, :until, :for, :rescue, :case, :when, :and, :or]
7
8
 
9
+ class << self
10
+
11
+ def make(options = nil)
12
+ check = new
13
+ if options
14
+ options.each do |name, value|
15
+ check.send("#{name}=", value)
16
+ end
17
+ end
18
+ check
19
+ end
20
+
21
+ end
22
+
8
23
  def initialize
9
24
  @errors = []
10
25
  end
@@ -7,12 +7,22 @@ module Roodi
7
7
  # A class getting too large is a code smell that indicates it might be taking on too many
8
8
  # responsibilities. It should probably be refactored into multiple smaller classes.
9
9
  class ClassLineCountCheck < LineCountCheck
10
+
10
11
  DEFAULT_LINE_COUNT = 300
11
12
 
12
- def initialize(options = {})
13
- line_count = options['line_count'] || DEFAULT_LINE_COUNT
14
- super([:class], line_count, 'Class')
13
+ def initialize
14
+ super()
15
+ self.line_count = DEFAULT_LINE_COUNT
16
+ end
17
+
18
+ def interesting_nodes
19
+ [:class]
15
20
  end
21
+
22
+ def message_prefix
23
+ 'Class'
24
+ end
25
+
16
26
  end
17
27
  end
18
28
  end
@@ -6,16 +6,26 @@ module Roodi
6
6
  #
7
7
  # Keeping to a consistent naming convention makes your code easier to read.
8
8
  class ClassNameCheck < NameCheck
9
+
9
10
  DEFAULT_PATTERN = /^[A-Z][a-zA-Z0-9]*$/
10
11
 
11
- def initialize(options = {})
12
- pattern = options['pattern'] || DEFAULT_PATTERN
13
- super([:class], pattern, 'Class')
12
+ def initialize
13
+ super()
14
+ self.pattern = DEFAULT_PATTERN
14
15
  end
15
16
 
17
+ def interesting_nodes
18
+ [:class]
19
+ end
20
+
21
+ def message_prefix
22
+ 'Class'
23
+ end
24
+
16
25
  def find_name(node)
17
26
  node[1].class == Symbol ? node[1] : node[1].last
18
27
  end
28
+
19
29
  end
20
30
  end
21
31
  end
@@ -12,11 +12,12 @@ module Roodi
12
12
  # Generally, for a block, 1-2 is considered good, 3-4 ok, 5-8 consider re-factoring, and 8+
13
13
  # re-factor now!
14
14
  class CyclomaticComplexityBlockCheck < CyclomaticComplexityCheck
15
+
15
16
  DEFAULT_COMPLEXITY = 4
16
17
 
17
- def initialize(options = {})
18
- complexity = options['complexity'] || DEFAULT_COMPLEXITY
19
- super(complexity)
18
+ def initialize
19
+ super()
20
+ self.complexity = DEFAULT_COMPLEXITY
20
21
  end
21
22
 
22
23
  def interesting_nodes
@@ -34,6 +35,7 @@ module Roodi
34
35
  def evaluate_matching_end
35
36
  add_error "Block cyclomatic complexity is #{@count}. It should be #{@complexity} or less." unless @count <= @complexity
36
37
  end
38
+
37
39
  end
38
40
  end
39
41
  end
@@ -3,11 +3,13 @@ require 'roodi/checks/check'
3
3
  module Roodi
4
4
  module Checks
5
5
  class CyclomaticComplexityCheck < Check
6
+
6
7
  COMPLEXITY_NODE_TYPES = [:if, :while, :until, :for, :rescue, :case, :when, :and, :or]
7
8
 
8
- def initialize(complexity)
9
+ attr_accessor :complexity
10
+
11
+ def initialize
9
12
  super()
10
- @complexity = complexity
11
13
  @count = 0
12
14
  @counting = 0
13
15
  end
@@ -42,6 +44,7 @@ module Roodi
42
44
  def counting?
43
45
  @counting > 0
44
46
  end
47
+
45
48
  end
46
49
  end
47
50
  end
@@ -12,11 +12,12 @@ module Roodi
12
12
  # Generally, for a method, 1-4 is considered good, 5-8 ok, 9-10 consider re-factoring, and
13
13
  # 11+ re-factor now!
14
14
  class CyclomaticComplexityMethodCheck < CyclomaticComplexityCheck
15
+
15
16
  DEFAULT_COMPLEXITY = 8
16
17
 
17
- def initialize(options = {})
18
- complexity = options['complexity'] || DEFAULT_COMPLEXITY
19
- super(complexity)
18
+ def initialize
19
+ super()
20
+ self.complexity = DEFAULT_COMPLEXITY
20
21
  end
21
22
 
22
23
  def interesting_nodes
@@ -35,6 +36,7 @@ module Roodi
35
36
  def evaluate_matching_end
36
37
  add_error "Method name \"#{@method_name}\" cyclomatic complexity is #{@count}. It should be #{@complexity} or less." unless @count <= @complexity
37
38
  end
39
+
38
40
  end
39
41
  end
40
42
  end
@@ -3,20 +3,12 @@ require 'roodi/checks/check'
3
3
  module Roodi
4
4
  module Checks
5
5
  class LineCountCheck < Check
6
- def initialize(interesting_nodes, line_count, message_prefix)
7
- super()
8
- @interesting_nodes = interesting_nodes
9
- @line_count = line_count
10
- @message_prefix = message_prefix
11
- end
12
-
13
- def interesting_nodes
14
- @interesting_nodes
15
- end
6
+
7
+ attr_accessor :line_count
16
8
 
17
9
  def evaluate_start(node)
18
10
  line_count = count_lines(node)
19
- add_error "#{@message_prefix} \"#{node[1]}\" has #{line_count} lines. It should have #{@line_count} or less." unless line_count <= @line_count
11
+ add_error "#{message_prefix} \"#{node[1]}\" has #{line_count} lines. It should have #{@line_count} or less." unless line_count <= @line_count
20
12
  end
21
13
 
22
14
  protected
@@ -24,6 +16,7 @@ module Roodi
24
16
  def count_lines(node)
25
17
  node.last.line - node.line - 1
26
18
  end
19
+
27
20
  end
28
21
  end
29
22
  end
@@ -8,12 +8,22 @@ module Roodi
8
8
  # thing and becoming hard to test. It should probably be refactored into multiple methods
9
9
  # that each do a single thing well.
10
10
  class MethodLineCountCheck < LineCountCheck
11
+
11
12
  DEFAULT_LINE_COUNT = 20
12
13
 
13
- def initialize(options = {})
14
- line_count = options['line_count'] || DEFAULT_LINE_COUNT
15
- super([:defn], line_count, 'Method')
14
+ def initialize
15
+ super()
16
+ self.line_count = DEFAULT_LINE_COUNT
17
+ end
18
+
19
+ def interesting_nodes
20
+ [:defn]
16
21
  end
22
+
23
+ def message_prefix
24
+ 'Method'
25
+ end
26
+
17
27
  end
18
28
  end
19
29
  end
@@ -6,16 +6,26 @@ module Roodi
6
6
  #
7
7
  # Keeping to a consistent nameing convention makes your code easier to read.
8
8
  class MethodNameCheck < NameCheck
9
+
9
10
  DEFAULT_PATTERN = /^[_a-z<>=\[|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
10
11
 
11
- def initialize(options = {})
12
- pattern = options['pattern'] || DEFAULT_PATTERN
13
- super([:defn], pattern, 'Method')
12
+ def initialize
13
+ super()
14
+ self.pattern = DEFAULT_PATTERN
14
15
  end
15
16
 
17
+ def interesting_nodes
18
+ [:defn]
19
+ end
20
+
21
+ def message_prefix
22
+ 'Method'
23
+ end
24
+
16
25
  def find_name(node)
17
26
  node[1]
18
27
  end
28
+
19
29
  end
20
30
  end
21
31
  end
@@ -10,6 +10,7 @@ module Roodi
10
10
  # Enumerable.each with a block instead.
11
11
  class MissingForeignKeyIndexCheck < Check
12
12
  def initialize
13
+ super()
13
14
  @foreign_keys = {}
14
15
  @indexes = {}
15
16
  end
@@ -7,12 +7,22 @@ module Roodi
7
7
  # A module getting too large is a code smell that indicates it might be taking on too many
8
8
  # responsibilities. It should probably be refactored into multiple smaller modules.
9
9
  class ModuleLineCountCheck < LineCountCheck
10
+
10
11
  DEFAULT_LINE_COUNT = 300
11
12
 
12
- def initialize(options = {})
13
- line_count = options['line_count'] || DEFAULT_LINE_COUNT
14
- super([:module], line_count, 'Module')
13
+ def initialize
14
+ super()
15
+ self.line_count = DEFAULT_LINE_COUNT
16
+ end
17
+
18
+ def interesting_nodes
19
+ [:module]
15
20
  end
21
+
22
+ def message_prefix
23
+ 'Module'
24
+ end
25
+
16
26
  end
17
27
  end
18
28
  end
@@ -6,16 +6,26 @@ module Roodi
6
6
  #
7
7
  # Keeping to a consistent nameing convention makes your code easier to read.
8
8
  class ModuleNameCheck < NameCheck
9
+
9
10
  DEFAULT_PATTERN = /^[A-Z][a-zA-Z0-9]*$/
10
11
 
11
- def initialize(options = {})
12
- pattern = options['pattern'] || DEFAULT_PATTERN
13
- super([:module], pattern, 'Module')
12
+ def initialize
13
+ super()
14
+ self.pattern = DEFAULT_PATTERN
14
15
  end
15
-
16
+
17
+ def interesting_nodes
18
+ [:module]
19
+ end
20
+
21
+ def message_prefix
22
+ 'Module'
23
+ end
24
+
16
25
  def find_name(node)
17
26
  node[1].class == Symbol ? node[1] : node[1].last
18
27
  end
28
+
19
29
  end
20
30
  end
21
31
  end
@@ -3,21 +3,14 @@ require 'roodi/checks/check'
3
3
  module Roodi
4
4
  module Checks
5
5
  class NameCheck < Check
6
- def initialize(interesting_nodes, pattern, message_prefix)
7
- super()
8
- @interesting_nodes = interesting_nodes
9
- @pattern = pattern
10
- @message_prefix = message_prefix
11
- end
12
6
 
13
- def interesting_nodes
14
- @interesting_nodes
15
- end
7
+ attr_accessor :pattern
16
8
 
17
9
  def evaluate_start(node)
18
10
  name = find_name(node)
19
- add_error "#{@message_prefix} name \"#{name}\" should match pattern #{@pattern.inspect}" unless name.to_s =~ @pattern
11
+ add_error "#{message_prefix} name \"#{name}\" should match pattern #{@pattern.inspect}" unless name.to_s =~ @pattern
20
12
  end
13
+
21
14
  end
22
15
  end
23
16
  end
@@ -8,6 +8,8 @@ module Roodi
8
8
  ADDING_NODE_TYPES = [:rescue]
9
9
  COMPLEXITY_NODE_TYPES = MULTIPLYING_NODE_TYPES + ADDING_NODE_TYPES
10
10
 
11
+ attr_accessor :complexity
12
+
11
13
  def initialize(complexity)
12
14
  super()
13
15
  @complexity = complexity
@@ -4,11 +4,11 @@ module Roodi
4
4
  module Checks
5
5
  # Checks Npath complexity of a method against a specified limit.
6
6
  class NpathComplexityMethodCheck < NpathComplexityCheck
7
+
7
8
  DEFAULT_COMPLEXITY = 8
8
9
 
9
- def initialize(options = {})
10
- complexity = options['complexity'] || DEFAULT_COMPLEXITY
11
- super(complexity)
10
+ def initialize
11
+ super(DEFAULT_COMPLEXITY)
12
12
  end
13
13
 
14
14
  def interesting_nodes
@@ -23,6 +23,7 @@ module Roodi
23
23
  def evaluate_end_defn(node)
24
24
  add_error "Method name \"#{@method_name}\" n-path complexity is #{@current_value}. It should be #{@complexity} or less." unless @current_value <= @complexity
25
25
  end
26
+
26
27
  end
27
28
  end
28
29
  end
@@ -8,11 +8,14 @@ module Roodi
8
8
  # much, or that the parameters should be grouped into one or more objects of their own. It
9
9
  # probably needs some refactoring.
10
10
  class ParameterNumberCheck < Check
11
+
11
12
  DEFAULT_PARAMETER_COUNT = 5
12
13
 
13
- def initialize(options = {})
14
+ attr_accessor :parameter_count
15
+
16
+ def initialize
14
17
  super()
15
- @parameter_count = options['parameter_count'] || DEFAULT_PARAMETER_COUNT
18
+ self.parameter_count = DEFAULT_PARAMETER_COUNT
16
19
  end
17
20
 
18
21
  def interesting_nodes
@@ -22,9 +25,10 @@ module Roodi
22
25
  def evaluate_start(node)
23
26
  method_name = node[1]
24
27
  arguments = node[2]
25
- parameter_count = arguments.inject(-1) { |count, each| count = count + (each.class == Symbol ? 1 : 0) }
26
- add_error "Method name \"#{method_name}\" has #{parameter_count} parameters. It should have #{@parameter_count} or less." unless parameter_count <= @parameter_count
28
+ actual_parameter_count = arguments.inject(-1) { |count, each| count = count + (each.class == Symbol ? 1 : 0) }
29
+ add_error "Method name \"#{method_name}\" has #{actual_parameter_count} parameters. It should have #{@parameter_count} or less." unless actual_parameter_count <= @parameter_count
27
30
  end
31
+
28
32
  end
29
33
  end
30
34
  end
@@ -15,7 +15,6 @@ module Roodi
15
15
  def initialize(*checks)
16
16
  @config = DEFAULT_CONFIG
17
17
  @checks = checks unless checks.empty?
18
- @parser = Parser.new
19
18
  end
20
19
 
21
20
  def check(filename, content)
@@ -36,7 +35,7 @@ module Roodi
36
35
  end
37
36
 
38
37
  def print(filename, content)
39
- node = @parser.parse(content, filename)
38
+ node = parse(content, filename)
40
39
  puts "Line: #{node.line}"
41
40
  pp node
42
41
  end
@@ -59,7 +58,7 @@ module Roodi
59
58
 
60
59
  def parse(filename, content)
61
60
  begin
62
- @parser.parse(content, filename)
61
+ Parser.new.parse(content, filename)
63
62
  rescue Exception => e
64
63
  puts "#{filename} looks like it's not a valid Ruby file. Skipping..." if ENV["ROODI_DEBUG"]
65
64
  nil
@@ -69,12 +68,13 @@ module Roodi
69
68
  def load_checks
70
69
  check_objects = []
71
70
  checks = YAML.load_file @config
72
- checks.each do |check|
73
- klass = eval("Roodi::Checks::#{check[0]}")
74
- check_objects << (check[1].empty? ? klass.new : klass.new(check[1]))
71
+ checks.each do |check_class_name, options|
72
+ check_class = Roodi::Checks.const_get(check_class_name)
73
+ check_objects << check_class.make(options || {})
75
74
  end
76
75
  check_objects
77
76
  end
77
+
78
78
  end
79
79
  end
80
80
  end
@@ -0,0 +1,3 @@
1
+ module Roodi
2
+ VERSION = '2.2.0'
3
+ end
@@ -0,0 +1,18 @@
1
+ $: << File.expand_path("../lib", __FILE__)
2
+ require "roodi/version"
3
+
4
+ Gem::Specification.new do |gem|
5
+
6
+ gem.name = "roodi"
7
+ gem.summary = "Roodi stands for Ruby Object Oriented Design Inferometer"
8
+ gem.description = "Roodi stands for Ruby Object Oriented Design Inferometer"
9
+ gem.homepage = "http://roodi.rubyforge.org"
10
+ gem.authors = ["Marty Andrews"]
11
+ gem.email = "marty@cogent.co"
12
+ gem.files = Dir['lib/**/*.rb'] + Dir['bin/*'] + Dir['[A-Za-z]*'] + Dir['spec/**/*']
13
+ gem.version = Roodi::VERSION.dup
14
+ gem.platform = Gem::Platform::RUBY
15
+ gem.add_runtime_dependency("ruby_parser", "~> 2.3.0")
16
+ gem.executables = ["roodi", "roodi-describe"]
17
+
18
+ end
data/roodi.yml CHANGED
@@ -1,16 +1,25 @@
1
- AssignmentInConditionalCheck: { }
2
- CaseMissingElseCheck: { }
3
- ClassLineCountCheck: { line_count: 300 }
4
- ClassNameCheck: { pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/ }
5
- ClassVariableCheck: { }
6
- CyclomaticComplexityBlockCheck: { complexity: 4 }
7
- CyclomaticComplexityMethodCheck: { complexity: 8 }
8
- EmptyRescueBodyCheck: { }
9
- ForLoopCheck: { }
10
- MethodLineCountCheck: { line_count: 20 }
11
- MethodNameCheck: { pattern: !ruby/regexp /^[_a-z<>=\[|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ }
12
- # MissingForeignKeyIndexCheck: { }
13
- ModuleLineCountCheck: { line_count: 300 }
14
- ModuleNameCheck: { pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/ }
15
- ParameterNumberCheck: { parameter_count: 5 }
1
+ AssignmentInConditionalCheck:
2
+ CaseMissingElseCheck:
3
+ ClassLineCountCheck:
4
+ line_count: 300
5
+ ClassNameCheck:
6
+ pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
7
+ ClassVariableCheck:
8
+ CyclomaticComplexityBlockCheck:
9
+ complexity: 4
10
+ CyclomaticComplexityMethodCheck:
11
+ complexity: 8
12
+ EmptyRescueBodyCheck:
13
+ ForLoopCheck:
14
+ MethodLineCountCheck:
15
+ line_count: 20
16
+ MethodNameCheck:
17
+ pattern: !ruby/regexp /^[_a-z<>=\[|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
18
+ # MissingForeignKeyIndexCheck:
19
+ ModuleLineCountCheck:
20
+ line_count: 300
21
+ ModuleNameCheck:
22
+ pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
23
+ ParameterNumberCheck:
24
+ parameter_count: 5
16
25
 
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::AbcMetricMethodCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::AbcMetricMethodCheck.new({'score' => 0}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::AbcMetricMethodCheck.make({'score' => 0}))
6
6
  end
7
7
 
8
8
  def verify_content_score(content, a, b, c)
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::AssignmentInConditionalCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::AssignmentInConditionalCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::AssignmentInConditionalCheck.make)
6
6
  end
7
7
 
8
8
  it "should accept an assignment before an if clause" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::CaseMissingElseCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::CaseMissingElseCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::CaseMissingElseCheck.make)
6
6
  end
7
7
 
8
8
  it "should accept case statements that do have an else" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ClassLineCountCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ClassLineCountCheck.new({'line_count' => 1}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ClassLineCountCheck.make({'line_count' => 1}))
6
6
  end
7
7
 
8
8
  it "should accept classes with less lines than the threshold" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ClassNameCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ClassNameCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ClassNameCheck.make)
6
6
  end
7
7
 
8
8
  it "should accept camel case class names starting in capitals" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ClassVariableCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ClassVariableCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ClassVariableCheck.make)
6
6
  end
7
7
 
8
8
  it "should reject class variables" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ControlCouplingCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ControlCouplingCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ControlCouplingCheck.make)
6
6
  end
7
7
 
8
8
  it "should reject methods with if checks using a parameter" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::CyclomaticComplexityBlockCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::CyclomaticComplexityBlockCheck.new({'complexity' => 0}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::CyclomaticComplexityBlockCheck.make({'complexity' => 0}))
6
6
  end
7
7
 
8
8
  def verify_content_complexity(content, complexity)
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::CyclomaticComplexityMethodCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::CyclomaticComplexityMethodCheck.new({'complexity' => 0}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::CyclomaticComplexityMethodCheck.make({'complexity' => 0}))
6
6
  end
7
7
 
8
8
  def verify_content_complexity(content, complexity)
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::EmptyRescueBodyCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::EmptyRescueBodyCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::EmptyRescueBodyCheck.make)
6
6
  end
7
7
 
8
8
  it "should accept a rescue body with content and no parameter" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ForLoopCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ForLoopCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ForLoopCheck.make)
6
6
  end
7
7
 
8
8
  it "should reject for loops" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::MethodLineCountCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::MethodLineCountCheck.new({'line_count' => 1}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::MethodLineCountCheck.make({'line_count' => 1}))
6
6
  end
7
7
 
8
8
  it "should accept methods with less lines than the threshold" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::MethodNameCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::MethodNameCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::MethodNameCheck.make)
6
6
  end
7
7
 
8
8
  it "should accept method names with underscores" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::MissingForeignKeyIndexCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::MissingForeignKeyIndexCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::MissingForeignKeyIndexCheck.make)
6
6
  end
7
7
 
8
8
  it "should warn about a missing foreign key" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ModuleLineCountCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ModuleLineCountCheck.new({'line_count' => 1}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ModuleLineCountCheck.make({'line_count' => 1}))
6
6
  end
7
7
 
8
8
  it "should accept modules with less lines than the threshold" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ModuleNameCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ModuleNameCheck.new)
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ModuleNameCheck.make)
6
6
  end
7
7
 
8
8
  it "should accept camel case module names starting in capitals" do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::NpathComplexityMethodCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::NpathComplexityMethodCheck.new({'complexity' => 0}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::NpathComplexityMethodCheck.make({'complexity' => 0}))
6
6
  end
7
7
 
8
8
  def verify_content_complexity(content, complexity)
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Roodi::Checks::ParameterNumberCheck do
4
4
  before(:each) do
5
- @roodi = Roodi::Core::Runner.new(Roodi::Checks::ParameterNumberCheck.new({'parameter_count' => 1}))
5
+ @roodi = Roodi::Core::Runner.new(Roodi::Checks::ParameterNumberCheck.make({'parameter_count' => 1}))
6
6
  end
7
7
 
8
8
  it "should accept methods with less lines than the threshold" do
@@ -1 +1,2 @@
1
- MethodNameCheck: { pattern: !ruby/regexp /^[A-Z]+$/ }
1
+ MethodNameCheck:
2
+ pattern: !ruby/regexp /^[A-Z]+$/
metadata CHANGED
@@ -1,58 +1,40 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: roodi
3
- version: !ruby/object:Gem::Version
4
- version: 2.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.0
5
+ prerelease:
5
6
  platform: ruby
6
- authors:
7
+ authors:
7
8
  - Marty Andrews
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2009-12-28 00:00:00 +11:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2013-01-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: ruby_parser
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.3.0
17
22
  type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: hoe
27
- type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 2.3.3
34
- version:
35
- description: Roodi stands for Ruby Object Oriented Design Inferometer. It parses your Ruby code and warns you about design issues you have based on the checks that is has configured.
36
- email:
37
- - marty@cogentconsulting.com.au
38
- executables:
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.3.0
30
+ description: Roodi stands for Ruby Object Oriented Design Inferometer
31
+ email: marty@cogent.co
32
+ executables:
39
33
  - roodi
40
34
  - roodi-describe
41
35
  extensions: []
42
-
43
- extra_rdoc_files:
44
- - History.txt
45
- - Manifest.txt
46
- - README.txt
47
- files:
48
- - History.txt
49
- - Manifest.txt
50
- - README.txt
51
- - Rakefile
52
- - bin/roodi
53
- - bin/roodi-describe
54
- - lib/roodi.rb
55
- - lib/roodi/checks.rb
36
+ extra_rdoc_files: []
37
+ files:
56
38
  - lib/roodi/checks/abc_metric_method_check.rb
57
39
  - lib/roodi/checks/assignment_in_conditional_check.rb
58
40
  - lib/roodi/checks/case_missing_else_check.rb
@@ -76,13 +58,25 @@ files:
76
58
  - lib/roodi/checks/npath_complexity_check.rb
77
59
  - lib/roodi/checks/npath_complexity_method_check.rb
78
60
  - lib/roodi/checks/parameter_number_check.rb
79
- - lib/roodi/core.rb
61
+ - lib/roodi/checks.rb
80
62
  - lib/roodi/core/checking_visitor.rb
81
63
  - lib/roodi/core/error.rb
82
64
  - lib/roodi/core/parser.rb
83
65
  - lib/roodi/core/runner.rb
84
66
  - lib/roodi/core/visitable_sexp.rb
67
+ - lib/roodi/core.rb
68
+ - lib/roodi/version.rb
69
+ - lib/roodi.rb
85
70
  - lib/roodi_task.rb
71
+ - bin/roodi
72
+ - bin/roodi-describe
73
+ - Gemfile
74
+ - Gemfile.lock
75
+ - History.txt
76
+ - Manifest.txt
77
+ - Rakefile
78
+ - README.txt
79
+ - roodi.gemspec
86
80
  - roodi.yml
87
81
  - spec/roodi/checks/abc_metric_method_check_spec.rb
88
82
  - spec/roodi/checks/assignment_in_conditional_check_spec.rb
@@ -105,34 +99,34 @@ files:
105
99
  - spec/roodi/core/runner_spec.rb
106
100
  - spec/roodi/roodi.yml
107
101
  - spec/spec_helper.rb
108
- has_rdoc: true
109
102
  homepage: http://roodi.rubyforge.org
110
103
  licenses: []
111
-
112
104
  post_install_message:
113
- rdoc_options:
114
- - --main
115
- - README.txt
116
- require_paths:
105
+ rdoc_options: []
106
+ require_paths:
117
107
  - lib
118
- required_ruby_version: !ruby/object:Gem::Requirement
119
- requirements:
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- version: "0"
123
- version:
124
- required_rubygems_version: !ruby/object:Gem::Requirement
125
- requirements:
126
- - - ">="
127
- - !ruby/object:Gem::Version
128
- version: "0"
129
- version:
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ segments:
115
+ - 0
116
+ hash: -2141010416866692951
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ segments:
124
+ - 0
125
+ hash: -2141010416866692951
130
126
  requirements: []
131
-
132
- rubyforge_project: roodi
133
- rubygems_version: 1.3.5
127
+ rubyforge_project:
128
+ rubygems_version: 1.8.24
134
129
  signing_key:
135
130
  specification_version: 3
136
131
  summary: Roodi stands for Ruby Object Oriented Design Inferometer
137
132
  test_files: []
138
-