cane 2.5.1 → 2.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Cane History
2
2
 
3
+ ## 2.5.2 - 26 January 2013 (a0cf38ba)
4
+
5
+ * Feature: support operators beside `>=` in threshold check.
6
+
3
7
  ## 2.5.1 - 26 January 2013 (93819f19)
4
8
 
5
9
  * Feature: documentation check supports `.mdown` and `.rdoc` extensions.
data/README.md CHANGED
@@ -34,33 +34,37 @@ Customize behaviour with a wealth of options:
34
34
 
35
35
  Default options are loaded from a .cane file in the current directory.
36
36
 
37
- -r, --require FILE Load a Ruby file containing user-defined checks
38
- -c, --check CLASS Use the given user-defined check
39
-
40
- --abc-glob GLOB Glob to run ABC metrics over (default: {app,lib}/**/*.rb)
41
- --abc-max VALUE Ignore methods under this complexity (default: 15)
42
- --abc-exclude METHOD Exclude method from analysis (eg. Foo::Bar#method)
43
- --no-abc Disable ABC checking
44
-
45
- --style-glob GLOB Glob to run style checks over (default: {app,lib,spec}/**/*.rb)
46
- --style-measure VALUE Max line length (default: 80)
47
- --style-exclude GLOB Exclude file or glob from style checking
48
- --no-style Disable style checking
49
-
50
- --doc-glob GLOB Glob to run doc checks over (default: {app,lib}/**/*.rb)
51
- --doc-exclude GLOB Exclude file or glob from documentation checking
52
- --no-readme Disable readme checking
53
- --no-doc Disable documentation checking
54
-
55
- --gte FILE,THRESHOLD Check the number in FILE is >= to THRESHOLD (a number or another file name)
56
-
57
- -f, --all FILE Apply all checks to given file
58
- --max-violations VALUE Max allowed violations (default: 0)
59
- --json Output as JSON
60
- --parallel Use all processors. Slower on small projects, faster on large.
61
-
62
- -v, --version Show version
63
- -h, --help Show this message
37
+ -r, --require FILE Load a Ruby file containing user-defined checks
38
+ -c, --check CLASS Use the given user-defined check
39
+
40
+ --abc-glob GLOB Glob to run ABC metrics over (default: {app,lib}/**/*.rb)
41
+ --abc-max VALUE Ignore methods under this complexity (default: 15)
42
+ --abc-exclude METHOD Exclude method from analysis (eg. Foo::Bar#method)
43
+ --no-abc Disable ABC checking
44
+
45
+ --style-glob GLOB Glob to run style checks over (default: {app,lib,spec}/**/*.rb)
46
+ --style-measure VALUE Max line length (default: 80)
47
+ --style-exclude GLOB Exclude file or glob from style checking
48
+ --no-style Disable style checking
49
+
50
+ --doc-glob GLOB Glob to run doc checks over (default: {app,lib}/**/*.rb)
51
+ --doc-exclude GLOB Exclude file or glob from documentation checking
52
+ --no-readme Disable readme checking
53
+ --no-doc Disable documentation checking
54
+
55
+ --lt FILE,THRESHOLD Check the number in FILE is < to THRESHOLD (a number or another file name)
56
+ --lte FILE,THRESHOLD Check the number in FILE is <= to THRESHOLD (a number or another file name)
57
+ --eq FILE,THRESHOLD Check the number in FILE is == to THRESHOLD (a number or another file name)
58
+ --gte FILE,THRESHOLD Check the number in FILE is >= to THRESHOLD (a number or another file name)
59
+ --gt FILE,THRESHOLD Check the number in FILE is > to THRESHOLD (a number or another file name)
60
+
61
+ -f, --all FILE Apply all checks to given file
62
+ --max-violations VALUE Max allowed violations (default: 0)
63
+ --json Output as JSON
64
+ --parallel Use all processors. Slower on small projects, faster on large.
65
+
66
+ -v, --version Show version
67
+ -h, --help Show this message
64
68
 
65
69
  Set default options using a `.cane` file:
66
70
 
@@ -5,15 +5,22 @@ module Cane
5
5
  # Configurable check that allows the contents of a file to be compared against
6
6
  # a given value.
7
7
  class ThresholdCheck < Struct.new(:opts)
8
+ THRESHOLDS = {
9
+ lt: :<,
10
+ lte: :<=,
11
+ eq: :==,
12
+ gte: :>=,
13
+ gt: :>
14
+ }
8
15
 
9
16
  def self.key; :threshold; end
10
17
  def self.options
11
- {
12
- gte: ["Check the number in FILE is >= to THRESHOLD " +
13
- "(a number or another file name)",
14
- variable: "FILE,THRESHOLD",
15
- type: Array]
16
- }
18
+ THRESHOLDS.each_with_object({}) do |(key, value), h|
19
+ h[key] = ["Check the number in FILE is #{value} to THRESHOLD " +
20
+ "(a number or another file name)",
21
+ variable: "FILE,THRESHOLD",
22
+ type: Array]
23
+ end
17
24
  end
18
25
 
19
26
  def violations
@@ -54,9 +61,11 @@ module Cane
54
61
  end
55
62
 
56
63
  def thresholds
57
- (opts[:gte] || []).map do |x|
58
- x.unshift(:>=)
59
- end
64
+ THRESHOLDS.map do |k, v|
65
+ opts.fetch(k, []).map do |x|
66
+ x.unshift(v)
67
+ end
68
+ end.reduce(:+)
60
69
  end
61
70
 
62
71
  # Null object for all cases when the value to be compared against cannot be
@@ -1,3 +1,3 @@
1
1
  module Cane
2
- VERSION = '2.5.1'
2
+ VERSION = '2.5.2'
3
3
  end
@@ -17,11 +17,31 @@ describe Cane::CLI::Parser do
17
17
  result[:style_measure].should == 3
18
18
  end
19
19
 
20
- it 'allows checking of a value in a file' do
20
+ it 'allows checking gte of a value in a file' do
21
21
  output, result = run("--gte myfile,90")
22
22
  result[:gte].should == [['myfile', '90']]
23
23
  end
24
24
 
25
+ it 'allows checking eq of a value in a file' do
26
+ output, result = run("--eq myfile,90")
27
+ result[:eq].should == [['myfile', '90']]
28
+ end
29
+
30
+ it 'allows checking lte of a value in a file' do
31
+ output, result = run("--lte myfile,90")
32
+ result[:lte].should == [['myfile', '90']]
33
+ end
34
+
35
+ it 'allows checking lt of a value in a file' do
36
+ output, result = run("--lt myfile,90")
37
+ result[:lt].should == [['myfile', '90']]
38
+ end
39
+
40
+ it 'allows checking gt of a value in a file' do
41
+ output, resugt = run("--gt myfile,90")
42
+ resugt[:gt].should == [['myfile', '90']]
43
+ end
44
+
25
45
  it 'allows upper bound of failed checks' do
26
46
  output, result = run("--max-violations 1")
27
47
  result[:max_violations].should == 1
@@ -28,6 +28,21 @@ def make_file(content)
28
28
  tempfile.path
29
29
  end
30
30
 
31
+ RSpec::Matchers.define :have_violation do |label|
32
+ match do |check|
33
+ violations = check.violations
34
+ violations.length.should == 1
35
+ violations[0][:label].should == label
36
+ end
37
+ end
38
+
39
+ RSpec::Matchers.define :have_no_violations do |label|
40
+ match do |check|
41
+ violations = check.violations
42
+ violations.length.should == 0
43
+ end
44
+ end
45
+
31
46
  require 'simplecov'
32
47
 
33
48
  class SimpleCov::Formatter::QualityFormatter
@@ -16,23 +16,59 @@ describe Cane::ThresholdCheck do
16
16
 
17
17
  context "checking violations" do
18
18
 
19
+ def run(threshold, value)
20
+ described_class.new(threshold => [['x', value]])
21
+ end
22
+
19
23
  context "when the current coverage cannot be read" do
20
- it 'reports a violation' do
21
- check = Cane::ThresholdCheck.new(gte: [['bogus_file', '20']])
22
- violations = check.violations
23
- violations.length.should == 1
24
- violations[0][:label].should ==
25
- 'bogus_file is unavailable, should be >= 20.0'
24
+ it do
25
+ run(:gte, 20).should \
26
+ have_violation('x is unavailable, should be >= 20.0')
26
27
  end
27
28
  end
28
29
 
29
30
  context "when the coverage threshold is incorrectly specified" do
30
- it 'reports a violation' do
31
- check = Cane::ThresholdCheck.new(gte: [['20', 'bogus_file']])
32
- violations = check.violations
33
- violations.length.should == 1
34
- violations[0][:label].should ==
35
- 'bogus_file is not a number or a file'
31
+ it do
32
+ described_class.new(gte: [['20', 'bogus_file']]).should \
33
+ have_violation('bogus_file is not a number or a file')
34
+ end
35
+ end
36
+
37
+ context 'when coverage threshold is valid' do
38
+ before do
39
+ file = fire_replaced_class_double("Cane::File")
40
+ stub_const("Cane::File", file)
41
+ file.should_receive(:contents).with('x').and_return("8\n")
42
+ end
43
+
44
+ context '>' do
45
+ it { run(:gt, 7).should have_no_violations }
46
+ it { run(:gt, 8).should have_violation('x is 8.0, should be > 8.0') }
47
+ it { run(:gt, 9).should have_violation('x is 8.0, should be > 9.0') }
48
+ end
49
+
50
+ context '>=' do
51
+ it { run(:gte, 7).should have_no_violations }
52
+ it { run(:gte, 8).should have_no_violations }
53
+ it { run(:gte, 9).should have_violation('x is 8.0, should be >= 9.0') }
54
+ end
55
+
56
+ context '==' do
57
+ it { run(:eq, 7).should have_violation('x is 8.0, should be == 7.0') }
58
+ it { run(:eq, 8).should have_no_violations }
59
+ it { run(:eq, 9).should have_violation('x is 8.0, should be == 9.0') }
60
+ end
61
+
62
+ context '<=' do
63
+ it { run(:lte, 7).should have_violation('x is 8.0, should be <= 7.0') }
64
+ it { run(:lte, 8).should have_no_violations }
65
+ it { run(:lte, 9).should have_no_violations }
66
+ end
67
+
68
+ context '<' do
69
+ it { run(:lt, 7).should have_violation('x is 8.0, should be < 7.0') }
70
+ it { run(:lt, 8).should have_violation('x is 8.0, should be < 8.0') }
71
+ it { run(:lt, 9).should have_no_violations }
36
72
  end
37
73
  end
38
74
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1
4
+ version: 2.5.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: