cane 2.6.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1eef945328c09e0abccd91652842a632f639eac0
4
+ data.tar.gz: 5c154f5d285bea2fd7d5d0549436a16ace066ca8
5
+ SHA512:
6
+ metadata.gz: a4d12974def26b1bfb704167090c2c56a50d5fb134b598821a532fadfb4f75cbce155d017734a2720d06ce851be65bf4a413886ca403a5dde3a2365b3f1fe5bc
7
+ data.tar.gz: e5a7b0b163105d6eab4e2e92522693552d034503f12e10de7e45268ae80a330ba203e8c77bdb305bfc8fc519a4f29ef71f9f5ee870e974f8c08dc3c7559883a9
data/HISTORY.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Cane History
2
2
 
3
+ ## 2.6.1 - 30 October 2013 (2ea008)
4
+
5
+ * Feature: Don't require doc for one-line class w/out method.
6
+ * Bugfix: JsonFormatter initializer needs to take an options hash.
7
+ * Doc: Add license definition to gemspec.
8
+
3
9
  ## 2.6.0 - 7 June 2013 (616bb8a5)
4
10
 
5
11
  * Feature: classes with no methods do not require documentation.
data/README.md CHANGED
@@ -79,21 +79,23 @@ Command-line arguments will override arguments specified in the `.cane` file.
79
79
 
80
80
  ## Integrating with Rake
81
81
 
82
- begin
83
- require 'cane/rake_task'
84
-
85
- desc "Run cane to check quality metrics"
86
- Cane::RakeTask.new(:quality) do |cane|
87
- cane.abc_max = 10
88
- cane.add_threshold 'coverage/covered_percent', :>=, 99
89
- cane.no_style = true
90
- cane.abc_exclude = %w(Foo::Bar#some_method)
91
- end
92
-
93
- task :default => :quality
94
- rescue LoadError
95
- warn "cane not available, quality task not provided."
96
- end
82
+ ```ruby
83
+ begin
84
+ require 'cane/rake_task'
85
+
86
+ desc "Run cane to check quality metrics"
87
+ Cane::RakeTask.new(:quality) do |cane|
88
+ cane.abc_max = 10
89
+ cane.add_threshold 'coverage/covered_percent', :>=, 99
90
+ cane.no_style = true
91
+ cane.abc_exclude = %w(Foo::Bar#some_method)
92
+ end
93
+
94
+ task :default => :quality
95
+ rescue LoadError
96
+ warn "cane not available, quality task not provided."
97
+ end
98
+ ```
97
99
 
98
100
  Loading options from a `.cane` file is supported by setting `canefile=` to the
99
101
  file name.
@@ -137,22 +139,24 @@ Checks must implement:
137
139
 
138
140
  See existing checks for guidance. Create your check in a new file:
139
141
 
140
- # unhappy.rb
141
- class UnhappyCheck < Struct.new(:opts)
142
- def self.options
143
- {
144
- unhappy_file: ["File to check", default: [nil]]
145
- }
146
- end
147
-
148
- def violations
149
- [
150
- description: "Files are unhappy",
151
- file: opts.fetch(:unhappy_file),
152
- label: ":("
153
- ]
154
- end
155
- end
142
+ ```ruby
143
+ # unhappy.rb
144
+ class UnhappyCheck < Struct.new(:opts)
145
+ def self.options
146
+ {
147
+ unhappy_file: ["File to check", default: [nil]]
148
+ }
149
+ end
150
+
151
+ def violations
152
+ [
153
+ description: "Files are unhappy",
154
+ file: opts.fetch(:unhappy_file),
155
+ label: ":("
156
+ ]
157
+ end
158
+ end
159
+ ```
156
160
 
157
161
  Include your check either using command-line options:
158
162
 
@@ -160,11 +164,13 @@ Include your check either using command-line options:
160
164
 
161
165
  Or in your rake task:
162
166
 
163
- require 'unhappy'
167
+ ```ruby
168
+ require 'unhappy'
164
169
 
165
- Cane::RakeTask.new(:quality) do |c|
166
- c.use UnhappyCheck, unhappy_file: 'myfile'
167
- end
170
+ Cane::RakeTask.new(:quality) do |c|
171
+ c.use UnhappyCheck, unhappy_file: 'myfile'
172
+ end
173
+ ```
168
174
 
169
175
  ## Protips
170
176
 
@@ -26,6 +26,7 @@ Gem::Specification.new do |gem|
26
26
  gem.require_paths = ["lib"]
27
27
  gem.bindir = "bin"
28
28
  gem.executables << "cane"
29
+ gem.license = "Apache 2.0"
29
30
  gem.version = Cane::VERSION
30
31
  gem.has_rdoc = false
31
32
  gem.add_dependency 'parallel'
@@ -43,6 +43,10 @@ module Cane
43
43
 
44
44
  CLASS_REGEX = /^\s*(?:class|module)\s+([^\s;]+)/
45
45
 
46
+ # http://rubular.com/r/53BapkefdD
47
+ SINGLE_LINE_CLASS_REGEX =
48
+ /^\s*(?:class|module).*;\s*end\s*(#.*)?\s*$/
49
+
46
50
  METHOD_REGEX = /(?:^|\s)def\s+/
47
51
 
48
52
  def violations
@@ -67,26 +71,35 @@ module Cane
67
71
  end
68
72
 
69
73
  def class_definitions_in(file_name)
70
- class_definitions = []
74
+ closed_classes = []
75
+ open_classes = []
71
76
  last_line = ""
72
77
 
73
78
  Cane::File.iterator(file_name).each_with_index do |line, number|
74
79
  if class_definition? line
75
- class_definitions << ClassDefinition.new({
76
- line: (number + 1),
77
- label: extract_class_name(line),
78
- has_doc: comment?(last_line)
79
- })
80
- end
81
-
82
- if method_definition?(line) && !class_definitions.empty?
83
- class_definitions.last.requires_doc = true
80
+ if single_line_class_definition? line
81
+ closed_classes
82
+ else
83
+ open_classes
84
+ end.push class_definition(number, line, last_line)
85
+
86
+ elsif method_definition?(line) && !open_classes.empty?
87
+ open_classes.last.requires_doc = true
84
88
  end
85
89
 
86
90
  last_line = line
87
91
  end
88
92
 
89
- class_definitions
93
+ (closed_classes + open_classes).sort_by(&:line)
94
+ end
95
+
96
+ def class_definition(number, line, last_line)
97
+ ClassDefinition.new({
98
+ line: (number + 1),
99
+ label: extract_class_name(line),
100
+ has_doc: comment?(last_line),
101
+ requires_doc: method_definition?(line)
102
+ })
90
103
  end
91
104
 
92
105
  def missing_file_violations
@@ -112,6 +125,10 @@ module Cane
112
125
  line =~ CLASS_REGEX && $1.index('<<') != 0
113
126
  end
114
127
 
128
+ def single_line_class_definition?(line)
129
+ line =~ SINGLE_LINE_CLASS_REGEX
130
+ end
131
+
115
132
  def comment?(line)
116
133
  line =~ /^\s*#/ && !(MAGIC_COMMENT_REGEX =~ line)
117
134
  end
@@ -5,7 +5,7 @@ module Cane
5
5
  # Computes a machine-readable JSON representation from an array of violations
6
6
  # computed by the checks.
7
7
  class JsonFormatter
8
- def initialize(violations)
8
+ def initialize(violations, options = {})
9
9
  @violations = violations
10
10
  end
11
11
 
@@ -1,3 +1,3 @@
1
1
  module Cane
2
- VERSION = '2.6.0'
2
+ VERSION = '2.6.1'
3
3
  end
@@ -9,7 +9,6 @@ describe Cane::DocCheck do
9
9
 
10
10
  it 'creates a DocViolation for each undocumented class with a method' do
11
11
  file_name = make_file <<-RUBY
12
- # This class is documented
13
12
  class Doc; end
14
13
  class Empty; end # No doc is fine
15
14
  class NoDoc; def with_method; end; end
@@ -43,15 +42,39 @@ end
43
42
  violations.length.should == 3
44
43
 
45
44
  violations[0].values_at(:file, :line, :label).should == [
46
- file_name, 4, "NoDoc"
45
+ file_name, 3, "NoDoc"
47
46
  ]
48
47
 
49
48
  violations[1].values_at(:file, :line, :label).should == [
50
- file_name, 16, "AlsoNeedsDoc"
49
+ file_name, 15, "AlsoNeedsDoc"
51
50
  ]
52
51
 
53
52
  violations[2].values_at(:file, :line, :label).should == [
54
- file_name, 18, "ButThisNeedsDoc"
53
+ file_name, 17, "ButThisNeedsDoc"
54
+ ]
55
+ end
56
+
57
+ it 'does not create violations for single line classes without methods' do
58
+ file_name = make_file <<-RUBY
59
+ class NeedsDoc
60
+ class AlsoNeedsDoc < StandardError; def foo; end; end
61
+ class NoDocIsOk < StandardError; end
62
+ class NoDocIsAlsoOk < StandardError; end # No doc is fine on this too
63
+
64
+ def my_method
65
+ end
66
+ end
67
+ RUBY
68
+
69
+ violations = check(file_name).violations
70
+ violations.length.should == 2
71
+
72
+ violations[0].values_at(:file, :line, :label).should == [
73
+ file_name, 1, "NeedsDoc"
74
+ ]
75
+
76
+ violations[1].values_at(:file, :line, :label).should == [
77
+ file_name, 2, "AlsoNeedsDoc"
55
78
  ]
56
79
  end
57
80
 
@@ -61,4 +61,6 @@ class SimpleCov::Formatter::QualityFormatter
61
61
  end
62
62
 
63
63
  SimpleCov.formatter = SimpleCov::Formatter::QualityFormatter
64
- SimpleCov.start
64
+ SimpleCov.start do
65
+ add_filter "vendor/bundle/"
66
+ end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
5
- prerelease:
4
+ version: 2.6.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Xavier Shay
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-08 00:00:00.000000000 Z
11
+ date: 2013-10-31 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: parallel
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,49 +41,43 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: simplecov
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rspec-fire
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  description: Fails your build if code quality thresholds are not met
@@ -136,28 +125,28 @@ files:
136
125
  - cane.gemspec
137
126
  - bin/cane
138
127
  homepage: http://github.com/square/cane
139
- licenses: []
128
+ licenses:
129
+ - Apache 2.0
130
+ metadata: {}
140
131
  post_install_message:
141
132
  rdoc_options: []
142
133
  require_paths:
143
134
  - lib
144
135
  required_ruby_version: !ruby/object:Gem::Requirement
145
- none: false
146
136
  requirements:
147
- - - ! '>='
137
+ - - '>='
148
138
  - !ruby/object:Gem::Version
149
139
  version: 1.9.0
150
140
  required_rubygems_version: !ruby/object:Gem::Requirement
151
- none: false
152
141
  requirements:
153
- - - ! '>='
142
+ - - '>='
154
143
  - !ruby/object:Gem::Version
155
144
  version: '0'
156
145
  requirements: []
157
146
  rubyforge_project:
158
- rubygems_version: 1.8.23
147
+ rubygems_version: 2.0.3
159
148
  signing_key:
160
- specification_version: 3
149
+ specification_version: 4
161
150
  summary: Fails your build if code quality thresholds are not met. Provides complexity
162
151
  and style checkers built-in, and allows integration with with custom quality metrics.
163
152
  test_files:
@@ -175,3 +164,4 @@ test_files:
175
164
  - spec/style_check_spec.rb
176
165
  - spec/threshold_check_spec.rb
177
166
  - spec/violation_formatter_spec.rb
167
+ has_rdoc: false