sandi_meter 1.0.3 → 1.0.4

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjQ3NGNjZTlkNjIxYWQxYWMxZmZkOTg5NTZjYjdjYmEyNDQyNTkyMA==
4
+ NjM5NTVlNTgyZGU3ZDQ2ZjgyMzU0MmY1YjkwZmFkNjViMjYzNzE1YQ==
5
5
  data.tar.gz: !binary |-
6
- YzEyNzM3MjRjYWZlNmE5N2M4YmUyOTY5N2M3YzExNTg2ZmVjN2I3Yg==
7
- !binary "U0hBNTEy":
6
+ NjJjODA5ZDlkZDQwZmU0OThmYjAzOGM0ZjJhMjEzNjI0ZWI0M2E1OQ==
7
+ SHA512:
8
8
  metadata.gz: !binary |-
9
- ZmU5NzY1ZmYwNWVkMjUzNWYxN2RkODEzMzUyMzdmODVhNDk0MzRhOGE0MDMz
10
- MjBlM2ViYjBiOWZjNzViYTNhMDI5MjkwMGYyYTgzZjE2YTc5NzNjYWVmZjVh
11
- ZTk0YjhkYzY2MTViNDgzODVhOTJkNzdmNjM4NmNkNmQ2NmRiNjc=
9
+ YzE5OTlmMjQ2NzkzMzY4MzU5NDYwMDEwYjNlOGNiMTI5ZDc0MDlkODdlZjFm
10
+ ODdiM2Q3ZTkwMzc5YjE2M2QzMDc3MjhjZmUxMjNhNzU3ODQ4MzYyYzM0YjRj
11
+ MjQwYzBkOGIzNjM2ZjlhODg0NjAyZmJiNWYxY2NmODk1YjRiYmU=
12
12
  data.tar.gz: !binary |-
13
- ZTA4OWE3NWI5Y2E0YWMyODk3MGM3MDExNjdlMTk1YzIxODM4NTk4NjE3NTRk
14
- ZDI3NDc5MjZiZGNiYjkwNTM3YzhhNjNjZmEwZWJiMzU5NDcwOTQwNmMyNjAz
15
- MTlmZGE4ZmRmZmZkZWU0ODQxNzg4MWYyM2JiZjA0NmQ5OTk1NWQ=
13
+ NDU3NmQ4MGIwYmU5YmQ1MjdiNjJjMTk1ODRiZWM0MmYzYThjZTk0NmRjODZj
14
+ OGQxOGZkOTVhMTI2YzU5YWZlODg5MmM1ZDYxOTA1ZjBhYWYxMDQzODNmMzRk
15
+ YTRiM2VhODZjYjNmYWM5NjIyZjljNmJlZDA2YjMwMDBjZTJhNTQ=
data/bin/sandi_meter CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ $LOAD_PATH << File.expand_path("../../lib", __FILE__)
4
+
3
5
  require 'sandi_meter/cli'
4
6
 
5
7
  SandiMeter::CLI.execute
data/html/script.js CHANGED
@@ -35,7 +35,7 @@ function plotLine(id, data, ykeys, labels) {
35
35
  });
36
36
  }
37
37
 
38
- function latestReport(data) {
38
+ function lastReport(data) {
39
39
  return data.sort(function(a, b){
40
40
  var keyA = new Date(a.timestamp),
41
41
  keyB = new Date(b.timestamp);
@@ -47,23 +47,24 @@ function latestReport(data) {
47
47
  }
48
48
 
49
49
  function dateHeader(last_report) {
50
- var d = Date(last_report.timestamp).toString().split(' ');
50
+ var date = new Date(last_report.timestamp);
51
+ var d = date.toString().split(' ');
51
52
  return date_string = [d[3], d[1], d[2], d[4]].join(' ');
52
53
  }
53
54
 
54
55
  function setHeader(last_report) {
55
- $('.js-report-date').text("Latest report from " + dateHeader(latest_report));
56
+ $('.js-report-date').text("Latest report from " + dateHeader(last_report));
56
57
  }
57
58
 
58
59
  $(document).ready(function(){
59
- latest_report = latestReport(data);
60
+ last_report = lastReport(data);
60
61
 
61
- setHeader();
62
+ setHeader(last_report);
62
63
 
63
- plotDonut(latest_report.r10, latest_report.r11, '1. Classes under 100 lines', '1. Classes more than 100 lines', 'pie1');
64
- plotDonut(latest_report.r20, latest_report.r21, '2. Methods under 5 lines', '2. Methods more than 5 lines', 'pie2');
65
- plotDonut(latest_report.r30, latest_report.r31, '3. Method calls with less than 4 params', '3. Method calls with more than 4 params', 'pie3');
66
- plotDonut(latest_report.r40, latest_report.r41, '4. Controllers with one instance variable', '4. Controllers with many instance variables', 'pie4');
64
+ plotDonut(last_report.r10, last_report.r11, '1. Classes under 100 lines', '1. Classes more than 100 lines', 'pie1');
65
+ plotDonut(last_report.r20, last_report.r21, '2. Methods under 5 lines', '2. Methods more than 5 lines', 'pie2');
66
+ plotDonut(last_report.r30, last_report.r31, '3. Method calls with less than 4 params', '3. Method calls with more than 4 params', 'pie3');
67
+ plotDonut(last_report.r40, last_report.r41, '4. Controllers with one instance variable', '4. Controllers with many instance variables', 'pie4');
67
68
 
68
69
  plotLine('plot1', data, ['r10', 'r11'], ['under 100 lines', 'more than 100 lines.']);
69
70
  plotLine('plot2', data, ['r20', 'r21'], ['under 5 lines', 'more than 5 lines']);
@@ -2,21 +2,19 @@ require 'ripper'
2
2
  require_relative 'warning_scanner'
3
3
  require_relative 'loc_checker'
4
4
  require_relative 'method_arguments_counter'
5
+ require_relative 'sandi_meter/class'
6
+ require_relative 'sandi_meter/method_call'
7
+ require_relative 'sandi_meter/method'
5
8
 
6
9
  module SandiMeter
7
10
  class Analyzer
8
- attr_reader :classes, :misindented_classes, :methods, :misindented_methods, :method_calls, :instance_variables
11
+ attr_accessor :parent_token, :private_or_protected
12
+ attr_reader :classes, :methods, :method_calls
9
13
 
10
14
  def initialize
11
15
  @classes = []
12
- @misindented_classes = []
13
- @misindented_methods = {}
14
16
  @methods = {}
15
17
  @method_calls = []
16
- @instance_variables = {}
17
-
18
- @parent_token = nil
19
- @private_or_protected = false
20
18
  end
21
19
 
22
20
  def analyze(file_path)
@@ -26,7 +24,7 @@ module SandiMeter
26
24
  @indentation_warnings = indentation_warnings
27
25
  # TODO
28
26
  # add better determination wheter file is controller
29
- @scan_instance_variables = !!(file_path =~ /\w+_controller.rb$/)
27
+ @controller = !!(file_path =~ /\w+_controller.rb$/)
30
28
 
31
29
  sexp = Ripper.sexp(@file_body)
32
30
  scan_sexp(sexp)
@@ -38,28 +36,6 @@ module SandiMeter
38
36
  def output
39
37
  loc_checker = SandiMeter::LOCChecker.new(@file_lines)
40
38
 
41
- @classes.map! do |klass_params|
42
- klass_params << loc_checker.check(klass_params, 'class')
43
- klass_params << "#{@file_path}:#{klass_params[1]}"
44
- end
45
-
46
- @misindented_classes.map! do |klass_params|
47
- klass_params << "#{@file_path}:#{klass_params[1]}"
48
- end
49
-
50
- @methods.each_pair do |klass, methods|
51
- methods.each do |method_params|
52
- method_params << loc_checker.check(method_params, 'def')
53
- method_params << "#{@file_path}:#{method_params[1]}"
54
- end
55
- end
56
-
57
- @misindented_methods.each_pair do |klass, methods|
58
- methods.each do |method_params|
59
- method_params << "#{@file_path}:#{method_params[1]}"
60
- end
61
- end
62
-
63
39
  {
64
40
  classes: @classes,
65
41
  misindented_classes: @misindented_classes,
@@ -79,7 +55,11 @@ module SandiMeter
79
55
  class_tokens.insert(0, current_namespace) unless current_namespace.empty?
80
56
  class_name = class_tokens.join('::')
81
57
 
82
- [class_name, line_number]
58
+ {
59
+ name: class_name,
60
+ first_line: line_number,
61
+ path: @file_path
62
+ }
83
63
  end
84
64
 
85
65
  # MOVE
@@ -92,12 +72,15 @@ module SandiMeter
92
72
  end
93
73
 
94
74
  def find_method_params(sexp)
95
- sexp[1].flatten[1,2]
75
+ name, first_line = sexp[1].flatten[1, 2]
76
+ {
77
+ name: name,
78
+ first_line: first_line,
79
+ path: @file_path
80
+ }
96
81
  end
97
82
 
98
- def find_last_line(params, token = 'class')
99
- token_name, line = params
100
-
83
+ def find_last_line(line, token = 'class')
101
84
  token_indentation = @file_lines[line - 1].index(token)
102
85
  # TODO
103
86
  # add check for trailing spaces
@@ -110,24 +93,21 @@ module SandiMeter
110
93
  case element.first
111
94
  when :module
112
95
  module_params = find_class_params(element, current_namespace)
113
- module_params += [find_last_line(module_params, 'module')]
114
- current_namespace = module_params.first
96
+
97
+ module_params[:last_line] = find_last_line(module_params[:first_line], 'module')
98
+ current_namespace = module_params[:name]
115
99
 
116
100
  scan_sexp(element, current_namespace)
117
101
  when :class
118
102
  class_params = find_class_params(element, current_namespace)
119
103
 
120
- if @indentation_warnings['class'] && @indentation_warnings['class'].any? { |first_line, last_line| first_line == class_params.last }
121
- class_params << nil
122
- @misindented_classes << class_params
123
- else
124
- class_params += [find_last_line(class_params)]
125
-
126
- # in case of one liner class last line will be nil
127
- (class_params.last == nil ? @misindented_classes : @classes) << class_params
104
+ unless @indentation_warnings['class'] && @indentation_warnings['class'].any? { |first_line, last_line| first_line == class_params[:first_line] }
105
+ class_params[:last_line] = find_last_line(class_params[:first_line])
128
106
  end
129
107
 
130
- current_namespace = class_params.first
108
+ @classes << SandiMeter::Class.new(class_params)
109
+
110
+ current_namespace = class_params[:name]
131
111
  scan_sexp(element, current_namespace)
132
112
  end
133
113
  end
@@ -142,7 +122,11 @@ module SandiMeter
142
122
  counter = SandiMeter::MethodArgumentsCounter.new
143
123
  arguments_count, line = counter.count(sexp)
144
124
 
145
- @method_calls << [arguments_count, "#{@file_path}:#{line}"]
125
+ @method_calls << SandiMeter::MethodCall.new(
126
+ path: @file_path,
127
+ first_line: line,
128
+ number_of_arguments: arguments_count
129
+ )
146
130
 
147
131
  find_args_add_block(sexp)
148
132
  else
@@ -158,9 +142,8 @@ module SandiMeter
158
142
  next unless sexp.kind_of?(Array)
159
143
 
160
144
  if sexp.first == :assign
161
- @instance_variables[current_namespace] ||= {}
162
- @instance_variables[current_namespace][method_name] ||= []
163
- @instance_variables[current_namespace][method_name] << sexp[1][1][1] if sexp[1][1][0] == :@ivar
145
+ method = @methods[current_namespace].find { |m| m.name == method_name }
146
+ method.ivars << sexp[1][1][1] if sexp[1][1][0] == :@ivar
164
147
  else
165
148
  scan_def_for_ivars(current_namespace, method_name, sexp)
166
149
  end
@@ -175,19 +158,16 @@ module SandiMeter
175
158
  case element.first
176
159
  when :def
177
160
  method_params = find_method_params(element)
178
- if @indentation_warnings['def'] && @indentation_warnings['def'].any? { |first_line, last_line| first_line == method_params.last }
179
- method_params << nil
180
- method_params << number_of_arguments(element)
181
- @misindented_methods[current_namespace] ||= []
182
- @misindented_methods[current_namespace] << method_params
183
- else
184
- method_params += [find_last_line(method_params, 'def')]
185
- method_params << number_of_arguments(element)
186
- @methods[current_namespace] ||= []
187
- @methods[current_namespace] << method_params
161
+ method_params[:number_of_arguments] = number_of_arguments(element)
162
+ unless @indentation_warnings['def'] && @indentation_warnings['def'].any? { |first_line, last_line| first_line == method_params[:first_line] }
163
+ method_params[:last_line] = find_last_line(method_params[:first_line], 'def')
188
164
  end
189
- if @scan_instance_variables && !@private_or_protected
190
- scan_def_for_ivars(current_namespace, method_params.first, element)
165
+
166
+ @methods[current_namespace] ||= []
167
+ @methods[current_namespace] << SandiMeter::Method.new(method_params) unless @private_or_protected
168
+
169
+ if @controller && !@private_or_protected
170
+ scan_def_for_ivars(current_namespace, method_params[:name], element)
191
171
  end
192
172
 
193
173
  find_args_add_block(element)
@@ -31,16 +31,13 @@ module SandiMeter
31
31
  private
32
32
  def log_first_rule
33
33
  @output[:first_rule][:log] ||= {}
34
- @output[:first_rule][:log][:classes] = @data[:classes].inject([]) do |log, class_params|
35
- # TODO
36
- # wrap each class params into class and get params with
37
- # verbose name instead of array keys (class_params[2] should be klass.line_count)
38
- log << [class_params.first, class_params[2] - class_params[1] - 1, class_params.last] if class_params[-2] == false
34
+ @output[:first_rule][:log][:classes] = @data[:classes].inject([]) do |log, klass|
35
+ log << [klass.name, klass.size, klass.path] if klass.last_line && !klass.small?
39
36
  log
40
37
  end
41
38
 
42
- @output[:first_rule][:log][:misindented_classes] = @data[:misindented_classes].inject([]) do |log, class_params|
43
- log << [class_params.first, nil, class_params.last]
39
+ @output[:first_rule][:log][:misindented_classes] = @data[:classes].select { |c| c.last_line.nil? }.inject([]) do |log, klass|
40
+ log << [klass.name, nil, klass.path]
44
41
  log
45
42
  end
46
43
  end
@@ -51,25 +48,16 @@ module SandiMeter
51
48
  @output[:second_rule][:log][:misindented_methods] ||= []
52
49
 
53
50
  @data[:methods].each_pair do |klass, methods|
54
- methods.select { |m| m[-2] == false }.each do |method_params|
55
- params = [klass, method_params.first]
56
- # TODO
57
- # wrap method param to method class so method_params[1] becomes method.first_line
58
- # and method_params[2] method.last_line
59
- params << method_params[2] - method_params[1] - 1
60
- params << method_params.last
61
-
62
- @output[:second_rule][:log][:methods] << params
51
+ methods.select { |m| !m.misindented? && !m.small? }.each do |method|
52
+ @output[:second_rule][:log][:methods] << [klass, method.name, method.size, method.path]
63
53
  end
64
54
  end
65
55
 
66
- @data[:misindented_methods].each_pair do |klass, methods|
67
- methods.each do |method_params|
68
- params = [klass, method_params.first]
69
- params << nil
70
- params << method_params.last
56
+ @data[:methods].each_pair do |klass, methods|
57
+ methods.each do |method|
58
+ next unless method.misindented?
71
59
 
72
- @output[:second_rule][:log][:misindented_methods] << params
60
+ @output[:second_rule][:log][:misindented_methods] << [klass, method.name, method.size, method.path]
73
61
  end
74
62
  end
75
63
  end
@@ -80,8 +68,8 @@ module SandiMeter
80
68
 
81
69
  # TODO
82
70
  # add name of method being called
83
- proper_method_calls = @data[:method_calls].inject(0) do |sum, params|
84
- @output[:third_rule][:log][:method_calls] << params if params.first > 4
71
+ proper_method_calls = @data[:method_calls].inject(0) do |sum, method_call|
72
+ @output[:third_rule][:log][:method_calls] << [method_call.number_of_arguments, method_call.path] if method_call.number_of_arguments > 4
85
73
  end
86
74
  end
87
75
 
@@ -89,23 +77,20 @@ module SandiMeter
89
77
  @output[:fourth_rule][:log] ||={}
90
78
  @output[:fourth_rule][:log][:controllers] ||= []
91
79
 
92
- @data[:instance_variables].each_pair do |controller, methods|
93
- methods.each_pair do |method, instance_variables|
94
- if instance_variables.size > 1
95
- @output[:fourth_rule][:log][:controllers] << [controller, method, instance_variables]
96
- end
80
+ @data[:classes].select { |c| c.controller }.each do |klass|
81
+ @data[:methods][klass].each do |method|
82
+ next if method.ivars.empty?
83
+
84
+ @output[:fourth_rule][:log][:controllers] << [klass.name, method.name, method.ivars]
97
85
  end
98
86
  end
99
87
  end
100
88
 
101
89
  def check_first_rule
102
90
  total_classes_amount = @data[:classes].size
103
- small_classes_amount = @data[:classes].inject(0) do |sum, class_params|
104
- sum += 1 if class_params[-2] == true
105
- sum
106
- end
91
+ small_classes_amount = @data[:classes].select(&:small?).size
107
92
 
108
- misindented_classes_amount = @data[:misindented_classes].size
93
+ misindented_classes_amount = @data[:classes].select { |c| c.last_line.nil? }
109
94
 
110
95
  @output[:first_rule] ||= {}
111
96
  @output[:first_rule][:small_classes_amount] = small_classes_amount
@@ -120,13 +105,13 @@ module SandiMeter
120
105
  small_methods_amount = 0
121
106
 
122
107
  @data[:methods].each_pair do |klass, methods|
123
- small_methods_amount += methods.select { |m| m[-2] == true }.size
108
+ small_methods_amount += methods.select { |m| m.small? }.size
124
109
  total_methods_amount += methods.size
125
110
  end
126
111
 
127
112
  misindented_methods_amount = 0
128
- @data[:misindented_methods].each_pair do |klass, methods|
129
- misindented_methods_amount += methods.size
113
+ @data[:methods].each_pair do |klass, methods|
114
+ misindented_methods_amount += methods.select { |m| m.last_line.nil? }.size
130
115
  end
131
116
 
132
117
  @output[:second_rule] ||= {}
@@ -142,8 +127,8 @@ module SandiMeter
142
127
  def check_third_rule
143
128
  total_method_calls = @data[:method_calls].size
144
129
 
145
- proper_method_calls = @data[:method_calls].inject(0) do |sum, params|
146
- sum += 1 unless params.first > 4
130
+ proper_method_calls = @data[:method_calls].inject(0) do |sum, method_call|
131
+ sum += 1 unless method_call.number_of_arguments > 4
147
132
  sum
148
133
  end
149
134
 
@@ -158,9 +143,9 @@ module SandiMeter
158
143
  proper_controllers_amount = 0
159
144
  total_controllers_amount = 0
160
145
 
161
- @data[:instance_variables].each_pair do |controller, methods|
146
+ @data[:classes].select { |c| c.controller? }.each do |klass|
162
147
  total_controllers_amount += 1
163
- proper_controllers_amount += 1 unless methods.values.map(&:size).any? { |v| v > 1 }
148
+ proper_controllers_amount += 1 unless @data[:methods][klass.name].select { |m| m.ivars.uniq.size > 1 }.empty?
164
149
  end
165
150
 
166
151
  @output[:fourth_rule] ||= {}
@@ -2,6 +2,7 @@
2
2
  require 'mixlib/cli'
3
3
  require 'sandi_meter/file_scanner'
4
4
  require 'sandi_meter/formatter'
5
+ require 'sandi_meter/rules_checker'
5
6
  require 'sandi_meter/logger'
6
7
  require 'sandi_meter/version'
7
8
  require 'sandi_meter/html_generator'
@@ -61,6 +62,18 @@ module SandiMeter
61
62
  cli = CommandParser.new
62
63
  cli.parse_options
63
64
 
65
+ if cli.config[:graph]
66
+ log_dir_path = File.join(cli.config[:path], 'sandi_meter')
67
+ FileUtils.mkdir(log_dir_path) unless Dir.exists?(log_dir_path)
68
+ # put ignore file
69
+ ignore_file_path = File.join(cli.config[:path], 'sandi_meter', '.sandi_meter')
70
+ if File.directory?(cli.config[:path]) && !File.exists?(ignore_file_path)
71
+ File.open(ignore_file_path, "w") do |file|
72
+ file.write %w(db vendor).join("\n")
73
+ end
74
+ end
75
+ end
76
+
64
77
  if cli.config[:version]
65
78
  # stolen from gem 'bubs' :)
66
79
  puts "SandiMeter ".tr('A-Za-z1-90', 'Ⓐ-Ⓩⓐ-ⓩ①-⑨⓪').split('').join(' ') + SandiMeter::VERSION
@@ -81,28 +94,26 @@ module SandiMeter
81
94
 
82
95
  if cli.config[:graph]
83
96
  if File.directory?(cli.config[:path])
84
- logger = SandiMeter::Logger.new
85
- logger.log!(cli.config[:path], data)
97
+ logger = SandiMeter::Logger.new(data)
98
+ logger.log!(cli.config[:path])
86
99
 
87
100
  html_generator = SandiMeter::HtmlGenerator.new
88
101
  html_generator.copy_assets!(cli.config[:path])
89
102
  html_generator.generate_data!(cli.config[:path])
90
103
  html_generator.generate_details!(cli.config[:path], data)
91
104
 
92
- # put ignore file
93
- ignore_file_path = File.join(cli.config[:path], 'sandi_meter', '.sandi_meter')
94
- if File.directory?(cli.config[:path]) && !File.exists?(ignore_file_path)
95
- File.open(ignore_file_path, "w") do |file|
96
- file.write %w(db vendor).join("\n")
97
- end
98
- end
99
-
100
105
  index_html_path = File.join(cli.config[:path], 'sandi_meter/index.html')
101
106
  system "open #{index_html_path}"
102
107
  else
103
108
  puts "WARNING!!! HTML mode works only if you scan folder."
104
109
  end
105
110
  end
111
+
112
+ if RulesChecker.new(data).ok?
113
+ exit 0
114
+ else
115
+ exit 1
116
+ end
106
117
  end
107
118
 
108
119
  def self.show_sandi_rules
@@ -22,7 +22,7 @@ module SandiMeter
22
22
 
23
23
  private
24
24
  def scan_dir(path)
25
- Dir["#{path}/**/*.rb"].reject { |f| @exclude_patterns && f =~ /#{@exclude_patterns}/ }.each do |file|
25
+ Dir["#{path}/**/*.rb"].reject { |f| !@exclude_patterns.to_s.empty? && f =~ /#{@exclude_patterns}/ }.each do |file|
26
26
  scan_file(file)
27
27
  end
28
28
  end
@@ -1,34 +1,32 @@
1
1
  require 'fileutils'
2
2
 
3
3
  module SandiMeter
4
- class Logger
5
- def log!(path, data)
6
- log_dir_path = File.join(path, 'sandi_meter')
7
- FileUtils.mkdir(log_dir_path) unless Dir.exists?(log_dir_path)
8
-
9
- File.open(File.join(log_dir_path, 'sandi_meter.log'), 'a') do |file|
10
- file.puts(log_line(data))
4
+ class Logger < Struct.new(:data)
5
+ def log!(path)
6
+ File.open(File.join(path, 'sandi_meter', 'sandi_meter.log'), 'a') do |file|
7
+ file.puts(log_line)
11
8
  end
12
9
  end
13
10
 
14
11
  private
15
- def log_line(data)
16
- log_line_data = []
17
- log_line_data << data[:first_rule][:small_classes_amount]
18
- log_line_data << data[:first_rule][:total_classes_amount] - data[:first_rule][:small_classes_amount]
19
-
20
- log_line_data << data[:second_rule][:small_methods_amount]
21
- log_line_data << data[:second_rule][:total_methods_amount] - data[:second_rule][:small_methods_amount]
22
-
23
- log_line_data << data[:third_rule][:proper_method_calls]
24
- log_line_data << data[:third_rule][:total_method_calls] - data[:third_rule][:proper_method_calls]
25
-
26
- log_line_data << data[:fourth_rule][:proper_controllers_amount]
27
- log_line_data << data[:fourth_rule][:total_controllers_amount] - data[:fourth_rule][:proper_controllers_amount]
12
+ def log_line
13
+ rules_log.join(';')
14
+ end
28
15
 
29
- log_line_data << Time.now.to_i
16
+ def log_rule(rule_key, proper_key, total_key)
17
+ [
18
+ data[rule_key][proper_key],
19
+ data[rule_key][total_key] - data[rule_key][proper_key]
20
+ ]
21
+ end
30
22
 
31
- log_line_data.join(';')
23
+ def rules_log
24
+ log_line_data = [log_rule(:first_rule, :small_classes_amount, :total_classes_amount)]
25
+ log_line_data += log_rule(:second_rule, :small_methods_amount, :total_methods_amount)
26
+ log_line_data += log_rule(:third_rule, :proper_method_calls, :total_method_calls)
27
+ log_line_data += log_rule(:fourth_rule, :proper_controllers_amount, :total_controllers_amount)
28
+ log_line_data += [Time.now.to_i]
32
29
  end
33
30
  end
34
31
  end
32
+
@@ -0,0 +1,20 @@
1
+ module SandiMeter
2
+ class RulesChecker
3
+ def initialize(data)
4
+ @rules = []
5
+ @rules << percentage(data[:first_rule][:small_classes_amount], data[:first_rule][:total_classes_amount])
6
+ @rules << percentage(data[:second_rule][:small_methods_amount], data[:second_rule][:total_methods_amount])
7
+ @rules << percentage(data[:third_rule][:proper_method_calls], data[:third_rule][:total_method_calls])
8
+ @rules << percentage(data[:fourth_rule][:proper_controllers_amount], data[:fourth_rule][:total_controllers_amount])
9
+ end
10
+
11
+ def ok?
12
+ @rules.all? { |rule| rule == 1 }
13
+ end
14
+
15
+ private
16
+ def percentage(amount, total)
17
+ total > 0 ? amount / total : 1
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ module SandiMeter
2
+ class Class
3
+ MAX_LOC = 100
4
+
5
+ attr_accessor :name, :path, :first_line, :last_line, :controller
6
+
7
+ def initialize(params = {})
8
+ params.each do |key, value|
9
+ instance_variable_set("@#{key}", value)
10
+ end
11
+ end
12
+
13
+ def size
14
+ last_line and (last_line - first_line - 1)
15
+ end
16
+
17
+ def small?
18
+ last_line && size <= MAX_LOC
19
+ end
20
+
21
+ def misindented?
22
+ !!(last_line)
23
+ end
24
+
25
+ def controller?
26
+ !!(path =~ /\w+_controller.rb$/)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ module SandiMeter
2
+ class Method
3
+ MAX_LOC = 5
4
+
5
+ attr_accessor :name, :misindented, :first_line, :last_line, :path, :number_of_arguments, :ivars
6
+
7
+ def initialize(params = {})
8
+ params.each do |key, value|
9
+ instance_variable_set("@#{key}", value)
10
+ end
11
+ @ivars = []
12
+ end
13
+
14
+ def size
15
+ @last_line - @first_line - 1 if @last_line
16
+ end
17
+
18
+ def misindented?
19
+ !(@last_line)
20
+ end
21
+
22
+ def small?
23
+ size <= MAX_LOC if @last_line
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ module SandiMeter
2
+ class MethodCall
3
+ attr_accessor :path, :number_of_arguments, :first_line
4
+
5
+ def initialize(params = {})
6
+ params.each do |key, value|
7
+ instance_variable_set("@#{key}", value)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module SandiMeter
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
@@ -12,17 +12,34 @@ describe SandiMeter::Analyzer do
12
12
  end
13
13
 
14
14
  it 'finds indentation warnings for method' do
15
- analyzer.classes.should eq([["TestClass", 1, 5, true, "#{test_file_path(3)}:1"]])
16
- analyzer.misindented_classes.should be_empty
15
+ klass = analyzer.classes.find { |c| c.name == "TestClass" }
16
+
17
+ klass.should have_attributes(
18
+ first_line: 1,
19
+ last_line: 5,
20
+ path: test_file_path(3)
21
+ )
17
22
  end
18
23
 
19
24
  it 'finds methods' do
20
- analyzer.methods.should eq({"TestClass"=>[["blah", 2, 4, 0, true, "#{test_file_path(3)}:2"]]})
21
- analyzer.misindented_methods.should be_empty
25
+ method = analyzer.methods["TestClass"].find { |m| m.name == "blah" }
26
+
27
+ method.should have_attributes(
28
+ first_line: 2,
29
+ last_line: 4,
30
+ number_of_arguments: 0,
31
+ path: test_file_path(3)
32
+ )
22
33
  end
23
34
 
24
35
  it 'finds method calls that brakes third rule' do
25
- analyzer.method_calls.should eq([[5, "#{test_file_path(3)}:3"]])
36
+ method_call = analyzer.method_calls.first
37
+
38
+ method_call.should have_attributes(
39
+ first_line: 3,
40
+ number_of_arguments: 5,
41
+ path: test_file_path(3)
42
+ )
26
43
  end
27
44
  end
28
45
 
@@ -34,13 +51,24 @@ describe SandiMeter::Analyzer do
34
51
  end
35
52
 
36
53
  it 'finds indentation warnings for method' do
37
- analyzer.classes.should be_empty
38
- analyzer.misindented_classes.should eq([["MyApp::TestClass", 2, nil, "#{test_file_path(1)}:2"]])
54
+ klass = analyzer.classes.find { |c| c.name == "MyApp::TestClass" }
55
+
56
+ klass.should have_attributes(
57
+ first_line: 2,
58
+ last_line: nil,
59
+ path: test_file_path(1)
60
+ )
39
61
  end
40
62
 
41
63
  it 'finds methods' do
42
- analyzer.methods.should be_empty
43
- analyzer.misindented_methods.should eq({"MyApp::TestClass"=>[["blah", 3, nil, 0, "#{test_file_path(1)}:3"]]})
64
+ method = analyzer.methods["MyApp::TestClass"].find { |m| m.name == "blah" }
65
+
66
+ method.should have_attributes(
67
+ first_line: 3,
68
+ last_line: nil,
69
+ number_of_arguments: 0,
70
+ path: test_file_path(1)
71
+ )
44
72
  end
45
73
  end
46
74
 
@@ -52,15 +80,41 @@ describe SandiMeter::Analyzer do
52
80
  end
53
81
 
54
82
  it 'finds classes' do
55
- analyzer.classes.should include(["FirstTestClass", 1, 4, true, "#{test_file_path(4)}:1"])
56
- analyzer.classes.should include(["SecondTestClass", 6, 9, true, "#{test_file_path(4)}:6"])
57
- analyzer.misindented_classes.should be_empty
83
+ klass = analyzer.classes.find { |c| c.name == "FirstTestClass" }
84
+
85
+ klass.should have_attributes(
86
+ first_line: 1,
87
+ last_line: 4,
88
+ path: test_file_path(4)
89
+ )
90
+
91
+ klass = analyzer.classes.find { |c| c.name == "SecondTestClass" }
92
+
93
+ klass.should have_attributes(
94
+ first_line: 6,
95
+ last_line: 9,
96
+ path: test_file_path(4)
97
+ )
58
98
  end
59
99
 
60
100
  it 'finds methods' do
61
- analyzer.methods["FirstTestClass"].should eq([["first_meth", 2, 3, 1, true, "#{test_file_path(4)}:2"]])
62
- analyzer.methods["SecondTestClass"].should eq([["second_meth", 7, 8, 1, true, "#{test_file_path(4)}:7"]])
63
- analyzer.misindented_methods.should be_empty
101
+ method = analyzer.methods["FirstTestClass"].find { |m| m.name == "first_meth" }
102
+
103
+ method.should have_attributes(
104
+ first_line: 2,
105
+ last_line: 3,
106
+ number_of_arguments: 1,
107
+ path: test_file_path(4)
108
+ )
109
+
110
+ method = analyzer.methods["SecondTestClass"].find { |m| m.name == "second_meth" }
111
+
112
+ method.should have_attributes(
113
+ first_line: 7,
114
+ last_line: 8,
115
+ number_of_arguments: 1,
116
+ path: test_file_path(4)
117
+ )
64
118
  end
65
119
  end
66
120
 
@@ -72,13 +126,17 @@ describe SandiMeter::Analyzer do
72
126
  end
73
127
 
74
128
  it 'finds classes' do
75
- analyzer.misindented_classes.should eq([["OneLinerClass", 1, nil, "#{test_file_path(5)}:1"]])
76
- analyzer.classes.should be_empty
129
+ klass = analyzer.classes.find { |c| c.name == "OneLinerClass" }
130
+
131
+ klass.should have_attributes(
132
+ first_line: 1,
133
+ last_line: nil,
134
+ path: test_file_path(5)
135
+ )
77
136
  end
78
137
 
79
138
  it 'finds methods' do
80
139
  analyzer.methods.should be_empty
81
- analyzer.misindented_methods.should be_empty
82
140
  end
83
141
  end
84
142
 
@@ -90,16 +148,45 @@ describe SandiMeter::Analyzer do
90
148
  end
91
149
 
92
150
  it 'finds class and subclass' do
93
- analyzer.classes.should include(["MyApp::Blah::User", 5, 13, true, "#{test_file_path(7)}:5"])
94
- analyzer.classes.should include(["MyApp::Blah::User::SubUser", 9, 12, true, "#{test_file_path(7)}:9"])
95
- analyzer.misindented_classes.should be_empty
151
+ klass = analyzer.classes.find { |c| c.name == "MyApp::Blah::User" }
152
+ klass.should have_attributes(
153
+ first_line: 5,
154
+ last_line: 13,
155
+ path: test_file_path(7)
156
+ )
157
+
158
+ klass = analyzer.classes.find { |c| c.name == "MyApp::Blah::User::SubUser" }
159
+ klass.should have_attributes(
160
+ first_line: 9,
161
+ last_line: 12,
162
+ path: test_file_path(7)
163
+ )
96
164
  end
97
165
 
98
166
  it 'finds methods' do
99
- analyzer.methods["MyApp::Blah"].should eq([["module_meth", 2, 3, 0, true, "#{test_file_path(7)}:2"]])
100
- analyzer.methods["MyApp::Blah::User"].should eq([["class_meth", 6, 7, 0, true, "#{test_file_path(7)}:6"]])
101
- analyzer.methods["MyApp::Blah::User::SubUser"].should eq([["sub_meth", 10, 11, 0, true, "#{test_file_path(7)}:10"]])
102
- analyzer.misindented_methods.should be_empty
167
+ method = analyzer.methods["MyApp::Blah"].find { |m| m.name == "module_meth" }
168
+ method.should have_attributes(
169
+ first_line: 2,
170
+ last_line: 3,
171
+ number_of_arguments: 0,
172
+ path: test_file_path(7)
173
+ )
174
+
175
+ method = analyzer.methods["MyApp::Blah::User"].find { |m| m.name == "class_meth" }
176
+ method.should have_attributes(
177
+ first_line: 6,
178
+ last_line: 7,
179
+ number_of_arguments: 0,
180
+ path: test_file_path(7)
181
+ )
182
+
183
+ method = analyzer.methods["MyApp::Blah::User::SubUser"].find { |m| m.name == "sub_meth" }
184
+ method.should have_attributes(
185
+ first_line: 10,
186
+ last_line: 11,
187
+ number_of_arguments: 0,
188
+ path: test_file_path(7)
189
+ )
103
190
  end
104
191
  end
105
192
 
@@ -111,15 +198,33 @@ describe SandiMeter::Analyzer do
111
198
  end
112
199
 
113
200
  it 'finds class and subclass' do
114
- analyzer.classes.should include(["RailsController", 1, 12, true, "#{test_file_path(8)}:1"])
115
- analyzer.misindented_classes.should be_empty
201
+ klass = analyzer.classes.find { |c| c.name == "RailsController" }
202
+ klass.should have_attributes(
203
+ first_line: 1,
204
+ last_line: 12,
205
+ path: test_file_path(8)
206
+ )
116
207
  end
117
208
 
118
209
  it 'finds methods' do
119
- analyzer.methods["RailsController"].should include(["index", 2, 3, 0, true, "#{test_file_path(8)}:2"])
120
- analyzer.methods["RailsController"].should include(["destroy", 5, 6, 0, true, "#{test_file_path(8)}:5"])
121
- analyzer.methods["RailsController"].should include(["private_meth", 9, 10, 0, true, "#{test_file_path(8)}:9"])
122
- analyzer.misindented_methods.should be_empty
210
+ method = analyzer.methods["RailsController"].find { |m| m.name == "index" }
211
+ method.should have_attributes(
212
+ first_line: 2,
213
+ last_line: 3,
214
+ number_of_arguments: 0,
215
+ path: test_file_path(8)
216
+ )
217
+
218
+ method = analyzer.methods["RailsController"].find { |m| m.name == "destroy" }
219
+ method.should have_attributes(
220
+ first_line: 5,
221
+ last_line: 6,
222
+ number_of_arguments: 0,
223
+ path: test_file_path(8)
224
+ )
225
+
226
+ method = analyzer.methods["RailsController"].find { |m| m.name == "private_meth" }
227
+ method.should be_nil
123
228
  end
124
229
  end
125
230
 
@@ -132,7 +237,8 @@ describe SandiMeter::Analyzer do
132
237
  end
133
238
 
134
239
  it 'finds instance variable' do
135
- analyzer.instance_variables.should eq({"UsersController"=>{"index"=>["@users"]}})
240
+ method = analyzer.methods["UsersController"].find { |m| m.name == "index" }
241
+ method.ivars.should eq(["@users"])
136
242
  end
137
243
  end
138
244
 
@@ -144,7 +250,8 @@ describe SandiMeter::Analyzer do
144
250
  end
145
251
 
146
252
  it 'does not find instance variables' do
147
- analyzer.instance_variables.should eq({"GuestController"=>{"create_guest_user"=>[]}})
253
+ method = analyzer.methods["GuestController"].find { |m| m.name == "create_guest_user" }
254
+ method.ivars.should be_empty
148
255
  end
149
256
  end
150
257
 
@@ -156,7 +263,11 @@ describe SandiMeter::Analyzer do
156
263
  end
157
264
 
158
265
  it 'does not find instance variable' do
159
- analyzer.instance_variables.should be_empty
266
+ method = analyzer.methods["User"].find { |m| m.name == "initialize" }
267
+ method.ivars.should be_empty
268
+
269
+ method = analyzer.methods["User"].find { |m| m.name == "hi" }
270
+ method.ivars.should be_empty
160
271
  end
161
272
  end
162
273
 
@@ -168,22 +279,24 @@ describe SandiMeter::Analyzer do
168
279
  end
169
280
 
170
281
  it 'finds method defined after public keyword' do
171
- analyzer.instance_variables["UsersController"].should have_key("create")
282
+ method = analyzer.methods["UsersController"].find { |m| m.name == "create" }
283
+ method.ivars.should eq(["@user"])
172
284
  end
173
285
 
174
286
  it 'omits actions without instance variables' do
175
- analyzer.instance_variables["UsersController"].should_not have_key("show")
287
+ method = analyzer.methods["UsersController"].find { |m| m.name == "show" }
288
+ method.ivars.should be_empty
176
289
  end
177
290
 
178
291
  it 'omits private methods' do
179
- analyzer.instance_variables["UsersController"].should_not have_key("find_user")
292
+ method = analyzer.methods["UsersController"].find { |m| m.name == "find_user" }
293
+ method.should be_nil
180
294
  end
181
295
 
182
296
  it 'omits protected methods' do
183
- analyzer.instance_variables["UsersController"].should_not have_key("protected_find_user")
297
+ method = analyzer.methods["UsersController"].find { |m| m.name == "protected_find_user" }
298
+ method.should be_nil
184
299
  end
185
-
186
-
187
300
  end
188
301
  end
189
302
 
@@ -195,7 +308,13 @@ describe SandiMeter::Analyzer do
195
308
  end
196
309
 
197
310
  it 'counts arguments' do
198
- analyzer.method_calls.should eq([[5, "#{test_file_path(11)}:3"]])
311
+ method_call = analyzer.method_calls.first
312
+
313
+ method_call.should have_attributes(
314
+ first_line: 3,
315
+ number_of_arguments: 5,
316
+ path: test_file_path(11)
317
+ )
199
318
  end
200
319
  end
201
320
 
@@ -207,11 +326,24 @@ describe SandiMeter::Analyzer do
207
326
  end
208
327
 
209
328
  it 'are count for class definition' do
210
- analyzer.classes.should eq([["Valera", 1, 109, false, "#{test_file_path(12)}:1"]])
329
+ klass = analyzer.classes.find { |c| c.name == "Valera" }
330
+
331
+ klass.should have_attributes(
332
+ first_line: 1,
333
+ last_line: 109,
334
+ path: test_file_path(12)
335
+ )
211
336
  end
212
337
 
213
338
  it 'are count for method definition' do
214
- analyzer.methods.should eq({"Valera"=>[["doodle", 2, 9, 0, false, "#{test_file_path(12)}:2"]]})
339
+ method = analyzer.methods["Valera"].find { |m| m.name == "doodle" }
340
+
341
+ method.should have_attributes(
342
+ first_line: 2,
343
+ last_line: 9,
344
+ number_of_arguments: 0,
345
+ path: test_file_path(12)
346
+ )
215
347
  end
216
348
  end
217
349
 
@@ -236,15 +368,36 @@ describe SandiMeter::Analyzer do
236
368
  end
237
369
 
238
370
  it 'mark 4line methods good' do
239
- methods.should include(["render4", 2, 7, 0, true, "#{test_file_path(14)}:2"])
371
+ method = analyzer.methods["TestClass"].find { |m| m.name == "render4" }
372
+
373
+ method.should have_attributes(
374
+ first_line: 2,
375
+ last_line: 7,
376
+ number_of_arguments: 0,
377
+ path: test_file_path(14)
378
+ )
240
379
  end
241
380
 
242
381
  it 'mark 5line methods good' do
243
- methods.should include(["render5", 9, 15, 0, true, "#{test_file_path(14)}:9"])
382
+ method = analyzer.methods["TestClass"].find { |m| m.name == "render5" }
383
+
384
+ method.should have_attributes(
385
+ first_line: 9,
386
+ last_line: 15,
387
+ number_of_arguments: 0,
388
+ path: test_file_path(14)
389
+ )
244
390
  end
245
391
 
246
392
  it 'mark 6line methods bad' do
247
- methods.should include(["render6", 17, 24, 0, false, "#{test_file_path(14)}:17"])
393
+ method = analyzer.methods["TestClass"].find { |m| m.name == "render6" }
394
+
395
+ method.should have_attributes(
396
+ first_line: 17,
397
+ last_line: 24,
398
+ number_of_arguments: 0,
399
+ path: test_file_path(14)
400
+ )
248
401
  end
249
402
  end
250
403
  end
@@ -16,13 +16,13 @@ describe SandiMeter::Calculator do
16
16
 
17
17
  it 'counts class lines' do
18
18
  output = calculator.calculate!(true)
19
- class_params = output[:first_rule][:log][:classes].find { |params| params.first == "User" }
20
- class_params[1].should eq(109)
19
+ klass = output[:first_rule][:log][:classes].find { |params| params.first == "User" }
20
+ klass[1].should eq(109)
21
21
  end
22
22
 
23
23
  it 'counts method lines' do
24
24
  output = calculator.calculate!(true)
25
- method_params = output[:second_rule][:log][:methods].find { |params| params.first == "User" && params[1] == "create" }
25
+ method_params = output[:second_rule][:log][:methods].find { |method| method[1] == "create" }
26
26
  method_params[2].should eq(6)
27
27
  end
28
28
  end
@@ -0,0 +1,32 @@
1
+ require 'test_helper'
2
+ require_relative '../lib/sandi_meter/rules_checker'
3
+
4
+ describe SandiMeter::RulesChecker do
5
+ let(:fail_conditions) do
6
+ {
7
+ first_rule: { small_classes_amount: 1, total_classes_amount: 2 },
8
+ second_rule: { small_methods_amount: 2, total_methods_amount: 2 },
9
+ third_rule: { proper_method_calls: 2, total_method_calls: 2 },
10
+ fourth_rule: { proper_controllers_amount: 2, total_controllers_amount: 2 }
11
+ }
12
+ end
13
+
14
+ let(:succeed_conditions) do
15
+ {
16
+ first_rule: { small_classes_amount: 2, total_classes_amount: 2 },
17
+ second_rule: { small_methods_amount: 2, total_methods_amount: 2 },
18
+ third_rule: { proper_method_calls: 2, total_method_calls: 2 },
19
+ fourth_rule: { proper_controllers_amount: 0, total_controllers_amount: 0 }
20
+ }
21
+ end
22
+
23
+ describe "#ok?" do
24
+ it "returns false in any of conditions fail" do
25
+ expect(SandiMeter::RulesChecker.new(fail_conditions)).to_not be_ok
26
+ end
27
+
28
+ it "returns true if all of conditions succeed" do
29
+ expect(SandiMeter::RulesChecker.new(succeed_conditions)).to be_ok
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ class ArgsLoader
2
+ def reset!
3
+ @sexp = nil
4
+ end
5
+
6
+ def load(method_call)
7
+ reset!
8
+ load_method_add_arg(Ripper.sexp(method_call))
9
+ return @sexp
10
+ end
11
+
12
+ private
13
+ def load_method_add_arg(method_sexp)
14
+ method_sexp.each do |s|
15
+ next unless s.kind_of?(Array)
16
+
17
+ s.each do |a|
18
+ next unless a.kind_of?(Array)
19
+
20
+ if a.first == :args_add_block
21
+ @sexp ||= a
22
+ else
23
+ load_method_add_arg(s)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require 'rspec/expectations'
2
+
3
+ RSpec::Matchers.define :have_attributes do |expected|
4
+ match do |actual|
5
+ result = true
6
+ expected.each do |key, value|
7
+ result = false unless actual.send(key) == value
8
+ end
9
+
10
+ result
11
+ end
12
+
13
+ failure_message_for_should do |actual|
14
+ wrong_fields = {}
15
+ expected.each do |key, value|
16
+ wrong_fields[key] = {
17
+ actual: actual.send(key),
18
+ expected: value
19
+ } unless actual.send(key) == value
20
+ end
21
+
22
+ wrong_fields.inject("In #{actual.class.name} ") do |message, wrong_field|
23
+ key, value = wrong_field
24
+ message << "expected that #{key} would be #{value[:expected]}, but was #{value[:actual]}\n"
25
+ message
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ def test_file_path(file_name)
2
+ File.join(
3
+ File.dirname(__FILE__),
4
+ "../test_classes/#{file_name}.rb"
5
+ )
6
+ end
7
+
8
+ def read_test_file(file_name)
9
+ File.read(
10
+ test_file_path(file_name)
11
+ )
12
+ end
13
+
14
+ def load_args_block(method_call)
15
+ loader = ArgsLoader.new
16
+ loader.load(method_call)
17
+ end
data/spec/test_helper.rb CHANGED
@@ -1,49 +1,4 @@
1
1
  require 'rspec/autorun'
2
2
  require 'ripper'
3
3
 
4
- def test_file_path(file_name)
5
- File.join(
6
- File.dirname(__FILE__),
7
- "test_classes/#{file_name}.rb"
8
- )
9
- end
10
-
11
- def read_test_file(file_name)
12
- File.read(
13
- test_file_path(file_name)
14
- )
15
- end
16
-
17
- def load_args_block(method_call)
18
- loader = ArgsLoader.new
19
- loader.load(method_call)
20
- end
21
-
22
- class ArgsLoader
23
- def reset!
24
- @sexp = nil
25
- end
26
-
27
- def load(method_call)
28
- reset!
29
- load_method_add_arg(Ripper.sexp(method_call))
30
- return @sexp
31
- end
32
-
33
- private
34
- def load_method_add_arg(method_sexp)
35
- method_sexp.each do |s|
36
- next unless s.kind_of?(Array)
37
-
38
- s.each do |a|
39
- next unless a.kind_of?(Array)
40
-
41
- if a.first == :args_add_block
42
- @sexp ||= a
43
- else
44
- load_method_add_arg(s)
45
- end
46
- end
47
- end
48
- end
49
- end
4
+ Dir["#{Dir.pwd}/spec/support/**/*.rb"].each { |f| require f }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sandi_meter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anatoli Makarevich
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-23 00:00:00.000000000 Z
11
+ date: 2013-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -82,6 +82,10 @@ files:
82
82
  - lib/sandi_meter/loc_checker.rb
83
83
  - lib/sandi_meter/logger.rb
84
84
  - lib/sandi_meter/method_arguments_counter.rb
85
+ - lib/sandi_meter/rules_checker.rb
86
+ - lib/sandi_meter/sandi_meter/class.rb
87
+ - lib/sandi_meter/sandi_meter/method.rb
88
+ - lib/sandi_meter/sandi_meter/method_call.rb
85
89
  - lib/sandi_meter/version.rb
86
90
  - lib/sandi_meter/warning_scanner.rb
87
91
  - bin/sandi_meter
@@ -89,6 +93,10 @@ files:
89
93
  - spec/calculator_spec.rb
90
94
  - spec/loc_checker_spec.rb
91
95
  - spec/method_arguments_counter_spec.rb
96
+ - spec/rules_checker_spec.rb
97
+ - spec/support/args_loader.rb
98
+ - spec/support/attr_matcher.rb
99
+ - spec/support/helper_methods.rb
92
100
  - spec/test_classes/1.rb
93
101
  - spec/test_classes/10.rb
94
102
  - spec/test_classes/10_controller.rb
@@ -129,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
137
  version: '0'
130
138
  requirements: []
131
139
  rubyforge_project:
132
- rubygems_version: 2.0.5
140
+ rubygems_version: 2.1.10
133
141
  signing_key:
134
142
  specification_version: 4
135
143
  summary: Sandi Metz rules checker