rein 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ coverage
4
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rein.gemspec
4
+ gemspec
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task default: :spec
@@ -5,15 +5,16 @@ end
5
5
 
6
6
  RC = Rein::Constraint
7
7
 
8
- require 'active_record'
9
- require 'active_support/core_ext/hash'
8
+ require "active_record"
9
+ require "active_support/core_ext/hash"
10
+ require "active_support/inflector"
10
11
 
11
- require 'rein/constraint/primary_key'
12
- require 'rein/constraint/foreign_key'
13
- require 'rein/constraint/inclusion'
14
- require 'rein/constraint/numericality'
15
- require 'rein/constraint/presence'
16
- require 'rein/view'
12
+ require "rein/constraint/primary_key"
13
+ require "rein/constraint/foreign_key"
14
+ require "rein/constraint/inclusion"
15
+ require "rein/constraint/numericality"
16
+ require "rein/constraint/presence"
17
+ require "rein/view"
17
18
 
18
19
  module ActiveRecord::ConnectionAdapters
19
20
  class MysqlAdapter < AbstractAdapter
@@ -10,8 +10,8 @@ module RC
10
10
  sql << " ADD CONSTRAINT #{name}"
11
11
  sql << " FOREIGN KEY (#{referencing_attribute})"
12
12
  sql << " REFERENCES #{referenced_table} (#{referenced_attribute})"
13
- sql << " ON DELETE #{referential_action(options[:on_delete] || :restrict)}"
14
- sql << " ON UPDATE #{referential_action(options[:on_update] || :restrict)}"
13
+ sql << " ON DELETE #{referential_action(options[:on_delete])}" if options[:on_delete].present?
14
+ sql << " ON UPDATE #{referential_action(options[:on_update])}" if options[:on_update].present?
15
15
  end
16
16
 
17
17
  execute(sql)
@@ -23,7 +23,6 @@ module RC
23
23
 
24
24
  def remove_foreign_key_constraint(referencing_table, referenced_table, options = {})
25
25
  referencing_attribute = options[:referencing] || "#{referenced_table.to_s.singularize}_id".to_sym
26
- referenced_attribute = "id".to_sym
27
26
 
28
27
  name = options[:name] || "#{referencing_attribute}_fk".to_sym
29
28
 
@@ -41,6 +40,8 @@ module RC
41
40
  private
42
41
  def referential_action(action)
43
42
  case action.to_sym
43
+ when :no_action
44
+ "NO ACTION"
44
45
  when :cascade
45
46
  "CASCADE"
46
47
  when :restrict
@@ -1,3 +1,3 @@
1
1
  module Rein
2
- VERSION = "0.8.1" unless defined?(Rein::VERSION)
2
+ VERSION = "0.8.2"
3
3
  end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ #
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+
5
+ require "rein/version"
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "rein"
9
+ s.version = Rein::VERSION
10
+ s.author = "Josh Bassett"
11
+ s.email = "josh.bassett@gmail.com"
12
+ s.homepage = "http://github.com/nullobject/rein"
13
+ s.summary = "Database constraints made easy for ActiveRecord."
14
+ s.description = "Rein adds bunch of methods to your ActiveRecord migrations so you can easily tame your database."
15
+
16
+ s.rubyforge_project = "rein"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f) }
21
+
22
+ s.add_development_dependency "rake"
23
+ s.add_development_dependency "rspec"
24
+ s.add_development_dependency "rr"
25
+ s.add_development_dependency "simplecov"
26
+
27
+ s.add_runtime_dependency "activerecord"
28
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe RC::ForeignKey do
4
+ let(:adapter) do
5
+ Class.new do
6
+ include RC::ForeignKey
7
+ end.new
8
+ end
9
+
10
+ describe "#add_foreign_key_constraint" do
11
+ subject { adapter }
12
+
13
+ before do
14
+ stub(adapter).execute
15
+ stub(adapter).add_index
16
+ end
17
+
18
+ context "with no options" do
19
+ before { adapter.add_foreign_key_constraint(:books, :people) }
20
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT person_id_fk FOREIGN KEY (person_id) REFERENCES people (id)") }
21
+ end
22
+
23
+ context "with a given referencing attribute" do
24
+ before { adapter.add_foreign_key_constraint(:books, :people, :referencing => :author_id) }
25
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT author_id_fk FOREIGN KEY (author_id) REFERENCES people (id)") }
26
+ end
27
+
28
+ context "with a given referenced attribute" do
29
+ before { adapter.add_foreign_key_constraint(:books, :people, :referenced => :person_id) }
30
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT person_id_fk FOREIGN KEY (person_id) REFERENCES people (person_id)") }
31
+ end
32
+
33
+ context "with a given referencing attribute and referenced attribute" do
34
+ before { adapter.add_foreign_key_constraint(:books, :people, :referencing => :author_id, :referenced => :person_id) }
35
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT author_id_fk FOREIGN KEY (author_id) REFERENCES people (person_id)") }
36
+ end
37
+
38
+ context "with a given name" do
39
+ before { adapter.add_foreign_key_constraint(:books, :people, :name => :foo) }
40
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT foo FOREIGN KEY (person_id) REFERENCES people (id)") }
41
+ end
42
+
43
+ context "with a given on delete referential action" do
44
+ before { adapter.add_foreign_key_constraint(:books, :people, :on_delete => :cascade) }
45
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT person_id_fk FOREIGN KEY (person_id) REFERENCES people (id) ON DELETE CASCADE") }
46
+ end
47
+
48
+ context "with a given on update referential action" do
49
+ before { adapter.add_foreign_key_constraint(:books, :people, :on_update => :cascade) }
50
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT person_id_fk FOREIGN KEY (person_id) REFERENCES people (id) ON UPDATE CASCADE") }
51
+ end
52
+
53
+ context "with a 'cascade' on delete and update referential action" do
54
+ before { adapter.add_foreign_key_constraint(:books, :people, :on_delete => :cascade, :on_update => :cascade) }
55
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT person_id_fk FOREIGN KEY (person_id) REFERENCES people (id) ON DELETE CASCADE ON UPDATE CASCADE") }
56
+ end
57
+
58
+ context "with a 'no action' on delete and update referential action" do
59
+ before { adapter.add_foreign_key_constraint(:books, :people, :on_delete => :no_action, :on_update => :no_action) }
60
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT person_id_fk FOREIGN KEY (person_id) REFERENCES people (id) ON DELETE NO ACTION ON UPDATE NO ACTION") }
61
+ end
62
+
63
+ describe "with a given add_index option" do
64
+ before { adapter.add_foreign_key_constraint(:books, :people, :add_index => true) }
65
+ it { should have_received.add_index(:books, :person_id) }
66
+ end
67
+
68
+ describe "with a referencing attribute and a add_index option" do
69
+ before { adapter.add_foreign_key_constraint(:books, :people, :referencing => :author_id, :add_index => true) }
70
+ it { should have_received.add_index(:books, :author_id) }
71
+ end
72
+ end
73
+
74
+ describe "#remove_foreign_key_constraint" do
75
+ subject { adapter }
76
+
77
+ before do
78
+ stub(adapter).execute
79
+ stub(adapter).remove_index
80
+ end
81
+
82
+ context "with no options" do
83
+ before { adapter.remove_foreign_key_constraint(:books, :people) }
84
+ it { should have_received.execute("ALTER TABLE books DROP CONSTRAINT person_id_fk") }
85
+ end
86
+
87
+ context "with a given referencing attribute" do
88
+ before { adapter.remove_foreign_key_constraint(:books, :people, :referencing => :author_id) }
89
+ it { should have_received.execute("ALTER TABLE books DROP CONSTRAINT author_id_fk") }
90
+ end
91
+
92
+ context "with a given name" do
93
+ before { adapter.remove_foreign_key_constraint(:books, :people, :name => :foo) }
94
+ it { should have_received.execute("ALTER TABLE books DROP CONSTRAINT foo") }
95
+ end
96
+
97
+ describe "with a given remove_index option" do
98
+ before { adapter.remove_foreign_key_constraint(:books, :people, :remove_index => true) }
99
+ it { should have_received.remove_index(:books, :person_id) }
100
+ end
101
+
102
+ describe "with a referencing attribute and a remove_index option" do
103
+ before { adapter.remove_foreign_key_constraint(:books, :people, :referencing => :author_id, :remove_index => true) }
104
+ it { should have_received.remove_index(:books, :author_id) }
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe RC::Inclusion, "#add_inclusion_constraint" do
4
+ let(:adapter) do
5
+ Class.new do
6
+ include RC::Inclusion
7
+ end.new
8
+ end
9
+
10
+ subject { adapter }
11
+
12
+ before { stub(adapter).execute }
13
+
14
+ context "given an array of string values" do
15
+ before { adapter.add_inclusion_constraint(:books, :state, :in => %w(available on_loan)) }
16
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_state CHECK (state IN ('available', 'on_loan'))") }
17
+ end
18
+
19
+ context "given an array of numeric values" do
20
+ before { adapter.add_inclusion_constraint(:books, :state, :in => [1, 2, 3]) }
21
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_state CHECK (state IN (1, 2, 3))") }
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe RC::Numericality, "#add_numericality_constraint" do
4
+ let(:adapter) do
5
+ Class.new do
6
+ include RC::Numericality
7
+ end.new
8
+ end
9
+
10
+ subject { adapter }
11
+
12
+ before { stub(adapter).execute }
13
+
14
+ context "greater_than" do
15
+ before { adapter.add_numericality_constraint(:books, :published_month, :greater_than => 1) }
16
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_published_month CHECK (published_month > 1)") }
17
+ end
18
+
19
+ context "greater_than_or_equal_to" do
20
+ before { adapter.add_numericality_constraint(:books, :published_month, :greater_than_or_equal_to => 2) }
21
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_published_month CHECK (published_month >= 2)") }
22
+ end
23
+
24
+ context "equal_to" do
25
+ before { adapter.add_numericality_constraint(:books, :published_month, :equal_to => 3) }
26
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_published_month CHECK (published_month = 3)") }
27
+ end
28
+
29
+ context "not_equal_to" do
30
+ before { adapter.add_numericality_constraint(:books, :published_month, :not_equal_to => 0) }
31
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_published_month CHECK (published_month != 0)") }
32
+ end
33
+
34
+ context "less_than" do
35
+ before { adapter.add_numericality_constraint(:books, :published_month, :less_than => 4) }
36
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_published_month CHECK (published_month < 4)") }
37
+ end
38
+
39
+ context "less_than_or_equal_to" do
40
+ before { adapter.add_numericality_constraint(:books, :published_month, :less_than_or_equal_to => 5) }
41
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_published_month CHECK (published_month <= 5)") }
42
+ end
43
+
44
+ context "greater_than_or_equal_to and less_than_or_equal_to" do
45
+ before { adapter.add_numericality_constraint(:books, :published_month, :greater_than_or_equal_to => 5, :less_than_or_equal_to => 6) }
46
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_published_month CHECK (published_month >= 5 AND published_month <= 6)") }
47
+ end
48
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe RC::Presence, "#add_presence_constraint" do
4
+ let(:adapter) do
5
+ Class.new do
6
+ include RC::Presence
7
+ end.new
8
+ end
9
+
10
+ subject { adapter }
11
+
12
+ before { stub(adapter).execute }
13
+
14
+ context "given a table and attribute" do
15
+ before { adapter.add_presence_constraint(:books, :state) }
16
+ it { should have_received.execute("ALTER TABLE books ADD CONSTRAINT books_state CHECK (state !~ '^\s*$')") }
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe RC::PrimaryKey, "#add_primary_key" do
4
+ let(:adapter) do
5
+ Class.new do
6
+ include RC::PrimaryKey
7
+ end.new
8
+ end
9
+
10
+ subject { adapter }
11
+
12
+ before { stub(adapter).execute }
13
+
14
+ context "with no options" do
15
+ before { adapter.add_primary_key(:books) }
16
+ it { should have_received.execute("ALTER TABLE books ADD PRIMARY KEY (id)") }
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rein::View do
4
+ let(:adapter) do
5
+ Class.new do
6
+ include Rein::View
7
+ end.new
8
+ end
9
+
10
+ subject { adapter }
11
+
12
+ before { stub(adapter).execute }
13
+
14
+ describe "#create_view" do
15
+ before { adapter.create_view(:foo, "SELECT * FROM bar") }
16
+ it { should have_received.execute("CREATE VIEW foo AS SELECT * FROM bar") }
17
+ end
18
+
19
+ describe "#drop_view" do
20
+ before { adapter.drop_view(:foo) }
21
+ it { should have_received.execute("DROP VIEW foo") }
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ require "rr"
2
+ require "rr/adapters/rspec"
3
+ require "rspec"
4
+ require "simplecov"
5
+
6
+ SimpleCov.start
7
+
8
+ require "rein"
9
+
10
+ RSpec.configure do |config|
11
+ config.mock_with :rr
12
+ end
13
+
14
+ # FIXME: This is a workaround to get RSpec 2 to play nicely with RR.
15
+ def have_received(method = nil)
16
+ RR::Adapters::Rspec::InvocationMatcher.new(method)
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rein
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,85 +9,88 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-22 00:00:00.000000000 Z
12
+ date: 2012-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: activerecord
16
- requirement: &70131003190740 !ruby/object:Gem::Requirement
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: '0'
22
- type: :runtime
22
+ type: :development
23
23
  prerelease: false
24
- version_requirements: *70131003190740
25
- - !ruby/object:Gem::Dependency
26
- name: hirb
27
- requirement: &70131003190020 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
30
- - - ~>
27
+ - - ! '>='
31
28
  - !ruby/object:Gem::Version
32
- version: 0.3.2
33
- type: :development
34
- prerelease: false
35
- version_requirements: *70131003190020
29
+ version: '0'
36
30
  - !ruby/object:Gem::Dependency
37
- name: rake
38
- requirement: &70131003189520 !ruby/object:Gem::Requirement
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
34
  requirements:
41
- - - ~>
35
+ - - ! '>='
42
36
  - !ruby/object:Gem::Version
43
- version: 0.8.7
37
+ version: '0'
44
38
  type: :development
45
39
  prerelease: false
46
- version_requirements: *70131003189520
47
- - !ruby/object:Gem::Dependency
48
- name: rcov
49
- requirement: &70131003189000 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
50
41
  none: false
51
42
  requirements:
52
- - - ~>
43
+ - - ! '>='
53
44
  - !ruby/object:Gem::Version
54
- version: 0.9.9
55
- type: :development
56
- prerelease: false
57
- version_requirements: *70131003189000
45
+ version: '0'
58
46
  - !ruby/object:Gem::Dependency
59
- name: rspec
60
- requirement: &70131003188520 !ruby/object:Gem::Requirement
47
+ name: rr
48
+ requirement: !ruby/object:Gem::Requirement
61
49
  none: false
62
50
  requirements:
63
- - - ~>
51
+ - - ! '>='
64
52
  - !ruby/object:Gem::Version
65
- version: 2.4.0
53
+ version: '0'
66
54
  type: :development
67
55
  prerelease: false
68
- version_requirements: *70131003188520
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
69
62
  - !ruby/object:Gem::Dependency
70
- name: rr
71
- requirement: &70131003188060 !ruby/object:Gem::Requirement
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
72
65
  none: false
73
66
  requirements:
74
- - - ~>
67
+ - - ! '>='
75
68
  - !ruby/object:Gem::Version
76
- version: 1.0.0
69
+ version: '0'
77
70
  type: :development
78
71
  prerelease: false
79
- version_requirements: *70131003188060
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
80
78
  - !ruby/object:Gem::Dependency
81
- name: wirble
82
- requirement: &70131003187600 !ruby/object:Gem::Requirement
79
+ name: activerecord
80
+ requirement: !ruby/object:Gem::Requirement
83
81
  none: false
84
82
  requirements:
85
- - - ~>
83
+ - - ! '>='
86
84
  - !ruby/object:Gem::Version
87
- version: 0.1.3
88
- type: :development
85
+ version: '0'
86
+ type: :runtime
89
87
  prerelease: false
90
- version_requirements: *70131003187600
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
91
94
  description: Rein adds bunch of methods to your ActiveRecord migrations so you can
92
95
  easily tame your database.
93
96
  email: josh.bassett@gmail.com
@@ -95,7 +98,13 @@ executables: []
95
98
  extensions: []
96
99
  extra_rdoc_files: []
97
100
  files:
98
- - lib/rein/alone.rb
101
+ - .gitignore
102
+ - .rspec
103
+ - Gemfile
104
+ - LICENSE
105
+ - README.md
106
+ - Rakefile
107
+ - lib/rein.rb
99
108
  - lib/rein/constraint/foreign_key.rb
100
109
  - lib/rein/constraint/inclusion.rb
101
110
  - lib/rein/constraint/numericality.rb
@@ -103,10 +112,14 @@ files:
103
112
  - lib/rein/constraint/primary_key.rb
104
113
  - lib/rein/version.rb
105
114
  - lib/rein/view.rb
106
- - lib/rein.rb
107
- - lib/verify_rcov.rb
108
- - LICENSE
109
- - README.md
115
+ - rein.gemspec
116
+ - spec/rein/constraint/foreign_key_spec.rb
117
+ - spec/rein/constraint/inclusion_spec.rb
118
+ - spec/rein/constraint/numericality_spec.rb
119
+ - spec/rein/constraint/presence_spec.rb
120
+ - spec/rein/constraint/primary_key_spec.rb
121
+ - spec/rein/view_spec.rb
122
+ - spec/spec_helper.rb
110
123
  homepage: http://github.com/nullobject/rein
111
124
  licenses: []
112
125
  post_install_message:
@@ -119,16 +132,29 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
132
  - - ! '>='
120
133
  - !ruby/object:Gem::Version
121
134
  version: '0'
135
+ segments:
136
+ - 0
137
+ hash: 2852352367581315615
122
138
  required_rubygems_version: !ruby/object:Gem::Requirement
123
139
  none: false
124
140
  requirements:
125
141
  - - ! '>='
126
142
  - !ruby/object:Gem::Version
127
- version: 1.3.6
143
+ version: '0'
144
+ segments:
145
+ - 0
146
+ hash: 2852352367581315615
128
147
  requirements: []
129
148
  rubyforge_project: rein
130
- rubygems_version: 1.8.10
149
+ rubygems_version: 1.8.23
131
150
  signing_key:
132
151
  specification_version: 3
133
152
  summary: Database constraints made easy for ActiveRecord.
134
- test_files: []
153
+ test_files:
154
+ - spec/rein/constraint/foreign_key_spec.rb
155
+ - spec/rein/constraint/inclusion_spec.rb
156
+ - spec/rein/constraint/numericality_spec.rb
157
+ - spec/rein/constraint/presence_spec.rb
158
+ - spec/rein/constraint/primary_key_spec.rb
159
+ - spec/rein/view_spec.rb
160
+ - spec/spec_helper.rb
@@ -1,14 +0,0 @@
1
- rc = "#{ENV['HOME']}/.rubyrc"
2
- load(rc) if File.exist?(rc)
3
-
4
- require 'rubygems'
5
- require 'bundler'
6
-
7
- envs = [:default]
8
- envs << ENV["REIN_ENV"].downcase.to_sym if ENV["REIN_ENV"]
9
- Bundler.setup(*envs)
10
-
11
- path = File.join(File.expand_path(File.dirname(__FILE__)), '..')
12
- $LOAD_PATH.unshift(path)
13
-
14
- require 'rein'
@@ -1,56 +0,0 @@
1
- module RCov
2
- # A task that can verify that the RCov coverage doesn't
3
- # drop below a certain threshold. It should be run after
4
- # running Spec::Rake::SpecTask.
5
- class VerifyTask < Rake::TaskLib
6
- # Name of the task. Defaults to :verify_rcov
7
- attr_accessor :name
8
-
9
- # Path to the index.html file generated by RCov, which
10
- # is the file containing the total coverage.
11
- # Defaults to 'coverage/index.html'
12
- attr_accessor :index_html
13
-
14
- # Whether or not to output details. Defaults to true.
15
- attr_accessor :verbose
16
-
17
- # The threshold value (in percent) for coverage. If the
18
- # actual coverage is not equal to this value, the task will raise an
19
- # exception.
20
- attr_accessor :threshold
21
-
22
- # Require the threshold value be met exactly. This is the default.
23
- attr_accessor :require_exact_threshold
24
-
25
- def initialize(name=:verify_rcov)
26
- @name = name
27
- @index_html = 'coverage/index.html'
28
- @verbose = true
29
- @require_exact_threshold = true
30
- yield self if block_given?
31
- raise "Threshold must be set" if @threshold.nil?
32
- define
33
- end
34
-
35
- def define
36
- desc "Verify that rcov coverage is at least #{threshold}%"
37
- task @name do
38
- total_coverage = 0
39
-
40
- File.open(index_html).each_line do |line|
41
- if line =~ /<tt class='coverage_total'>\s*(\d+\.\d+)%\s*<\/tt>/
42
- total_coverage = $1.to_f
43
- break
44
- end
45
- end
46
- output_coverage(total_coverage)
47
- end
48
- end
49
-
50
- def output_coverage(total_coverage)
51
- puts "Coverage: #{total_coverage}% (threshold: #{threshold}%)" if verbose
52
- raise "Coverage must be at least #{threshold}% but was #{total_coverage}%" if total_coverage < threshold
53
- raise "Coverage has increased above the threshold of #{threshold}% to #{total_coverage}%. You should update your threshold value." if (total_coverage > threshold) and require_exact_threshold
54
- end
55
- end
56
- end