acts_as_revisable 1.1.1

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.
@@ -0,0 +1,83 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ shared_examples_for "common Options usage" do
4
+ it "should return a set value" do
5
+ @options.one.should == 1
6
+ end
7
+
8
+ it "should return nil for an unset value" do
9
+ @options.two.should be_nil
10
+ end
11
+
12
+ it "should return false for unset query option" do
13
+ @options.should_not be_unset_value
14
+ end
15
+
16
+ it "should return true for a query option set to true" do
17
+ @options.should be_yes
18
+ end
19
+
20
+ it "should return false for a query option set to false" do
21
+ @options.should_not be_no
22
+ end
23
+
24
+ it "should return false for a query on a non-boolean value" do
25
+ @options.should_not be_one
26
+ end
27
+
28
+ it "should return an array when passed one" do
29
+ @options.arr.should be_a_kind_of(Array)
30
+ end
31
+
32
+ it "should not return an array when not passed one" do
33
+ @options.one.should_not be_a_kind_of(Array)
34
+ end
35
+
36
+ it "should have the right number of elements in an array" do
37
+ @options.arr.size.should == 3
38
+ end
39
+ end
40
+
41
+ describe WithoutScope::ActsAsRevisable::Options do
42
+ describe "with hash options" do
43
+ before(:each) do
44
+ @options = WithoutScope::ActsAsRevisable::Options.new :one => 1, :yes => true, :no => false, :arr => [1,2,3]
45
+ end
46
+
47
+ it_should_behave_like "common Options usage"
48
+ end
49
+
50
+ describe "with block options" do
51
+ before(:each) do
52
+ @options = WithoutScope::ActsAsRevisable::Options.new do
53
+ one 1
54
+ yes true
55
+ arr [1,2,3]
56
+ end
57
+ end
58
+
59
+ it_should_behave_like "common Options usage"
60
+ end
61
+
62
+ describe "with both block and hash options" do
63
+ before(:each) do
64
+ @options = WithoutScope::ActsAsRevisable::Options.new(:yes => true, :arr => [1,2,3]) do
65
+ one 1
66
+ end
67
+ end
68
+
69
+ it_should_behave_like "common Options usage"
70
+
71
+ describe "the block should override the hash" do
72
+ before(:each) do
73
+ @options = WithoutScope::ActsAsRevisable::Options.new(:yes => false, :one => 10, :arr => [1,2,3,4,5]) do
74
+ one 1
75
+ yes true
76
+ arr [1,2,3]
77
+ end
78
+ end
79
+
80
+ it_should_behave_like "common Options usage"
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe "the quoted_columns extension" do
4
+ after(:each) do
5
+ cleanup_db
6
+ end
7
+
8
+ it "should quote symbols matching column names as columns" do
9
+ Project.send(:quote_bound_value, :name).should == %q{"projects"."name"}
10
+ end
11
+
12
+ it "should not quote symbols that don't match column names" do
13
+ Project.send(:quote_bound_value, :whatever).should == "'#{:whatever.to_yaml}'"
14
+ end
15
+
16
+ it "should not quote strings any differently" do
17
+ Project.send(:quote_bound_value, "what").should == ActiveRecord::Base.send(:quote_bound_value, "what")
18
+ end
19
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe WithoutScope::ActsAsRevisable, "with reverting" do
4
+ after(:each) do
5
+ cleanup_db
6
+ end
7
+
8
+ before(:each) do
9
+ @project = Project.create(:name => "Rich", :notes => "a note")
10
+ @project.update_attribute(:name, "Sam")
11
+ end
12
+
13
+ it "should let you revert to previous versions" do
14
+ @project.revert_to!(:first)
15
+ @project.name.should == "Rich"
16
+ end
17
+
18
+ it "should accept the :without_revision hash option" do
19
+ lambda { @project.revert_to!(:first, :without_revision => true) }.should_not raise_error
20
+ @project.name.should == "Rich"
21
+ end
22
+
23
+ it "should support the revert_to_without_revision method" do
24
+ lambda { @project.revert_to_without_revision(:first).save }.should_not raise_error
25
+ @project.name.should == "Rich"
26
+ end
27
+
28
+ it "should support the revert_to_without_revision! method" do
29
+ lambda { @project.revert_to_without_revision!(:first) }.should_not raise_error
30
+ @project.name.should == "Rich"
31
+ end
32
+
33
+ it "should let you revert to previous versions without a new revision" do
34
+ @project.revert_to!(:first, :without_revision => true)
35
+ @project.revisions.size.should == 1
36
+ end
37
+
38
+ it "should support the revert_to method" do
39
+ lambda{ @project.revert_to(:first) }.should_not raise_error
40
+ @project.should be_changed
41
+ end
42
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,121 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ if ENV['EDGE_RAILS_PATH']
10
+ edge_path = File.expand_path(ENV['EDGE_RAILS_PATH'])
11
+ require File.join(edge_path, 'activesupport', 'lib', 'active_support')
12
+ require File.join(edge_path, 'activerecord', 'lib', 'active_record')
13
+ end
14
+
15
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
16
+ require 'acts_as_revisable'
17
+
18
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
19
+
20
+ def setup_db
21
+ ActiveRecord::Schema.define(:version => 1) do
22
+ create_table :people do |t|
23
+ t.string :name, :revisable_name, :revisable_type
24
+ t.text :notes
25
+ t.boolean :revisable_is_current
26
+ t.integer :revisable_original_id, :revisable_branched_from_id, :revisable_number, :project_id
27
+ t.datetime :revisable_current_at, :revisable_revised_at, :revisable_deleted_at
28
+ t.timestamps
29
+ end
30
+
31
+ create_table :projects do |t|
32
+ t.string :name, :unimportant, :revisable_name, :revisable_type
33
+ t.text :notes
34
+ t.boolean :revisable_is_current
35
+ t.integer :revisable_original_id, :revisable_branched_from_id, :revisable_number
36
+ t.datetime :revisable_current_at, :revisable_revised_at, :revisable_deleted_at
37
+ t.timestamps
38
+ end
39
+
40
+ create_table :foos do |t|
41
+ t.string :name, :revisable_name, :revisable_type
42
+ t.text :notes
43
+ t.boolean :revisable_is_current
44
+ t.integer :revisable_original_id, :revisable_branched_from_id, :revisable_number, :project_id
45
+ t.datetime :revisable_current_at, :revisable_revised_at, :revisable_deleted_at
46
+ t.timestamps
47
+ end
48
+
49
+ create_table :posts do |t|
50
+ t.string :name, :revisable_name, :revisable_type, :type
51
+ t.boolean :revisable_is_current
52
+ t.integer :revisable_original_id, :revisable_branched_from_id, :revisable_number
53
+ t.datetime :revisable_current_at, :revisable_revised_at, :revisable_deleted_at
54
+ t.timestamps
55
+ end
56
+ end
57
+ end
58
+
59
+ setup_db
60
+
61
+ def cleanup_db
62
+ ActiveRecord::Base.connection.tables.each do |table|
63
+ ActiveRecord::Base.connection.execute("delete from #{table}")
64
+ end
65
+ end
66
+
67
+ class Person < ActiveRecord::Base
68
+ belongs_to :project
69
+
70
+ acts_as_revisable do
71
+ revision_class_name "OldPerson"
72
+ on_delete :revise
73
+ end
74
+ end
75
+
76
+ class OldPerson < ActiveRecord::Base
77
+ acts_as_revision do
78
+ revisable_class_name "Person"
79
+ clone_associations :all
80
+ end
81
+ end
82
+
83
+ class Project < ActiveRecord::Base
84
+ has_many :people
85
+
86
+ acts_as_revisable do
87
+ revision_class_name "Session"
88
+ except :unimportant
89
+ end
90
+ end
91
+
92
+ class Session < ActiveRecord::Base
93
+ acts_as_revision do
94
+ revisable_class_name "Project"
95
+ clone_associations :all
96
+ end
97
+ end
98
+
99
+ class Foo < ActiveRecord::Base
100
+ acts_as_revisable :generate_revision_class => true, :no_validation_scoping => true
101
+
102
+ validates_uniqueness_of :name
103
+ end
104
+
105
+ class Post < ActiveRecord::Base
106
+ acts_as_revisable
107
+
108
+ validates_uniqueness_of :name
109
+ end
110
+
111
+ class PostRevision < ActiveRecord::Base
112
+ acts_as_revision
113
+ end
114
+
115
+ class Article < Post
116
+ acts_as_revisable
117
+ end
118
+
119
+ class ArticleRevision < PostRevision
120
+ acts_as_revision
121
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe WithoutScope::ActsAsRevisable, "with single table inheritance" do
4
+ after(:each) do
5
+ cleanup_db
6
+ end
7
+
8
+ before(:each) do
9
+ @article = Article.create(:name => 'an article')
10
+ @post = Post.create(:name => 'a post')
11
+ end
12
+
13
+ describe "after a revision" do
14
+ it "an article has revisions of the right type" do
15
+ @article.revise!
16
+ @article.revisions(true).first.class.should == ArticleRevision
17
+ end
18
+
19
+ it "a post has revisions of the right type" do
20
+ @post.revise!
21
+ @post.revisions(true).first.class.should == PostRevision
22
+ end
23
+
24
+ it "revisable_type column is nil for the root type" do
25
+ @post.revise!
26
+ @post.revisions(true).first.revisable_type.should == 'Post'
27
+ end
28
+
29
+ it "revisable_type column is set properly" do
30
+ @article.revise!
31
+ @article.revisions(true).first.revisable_type.should == 'Article'
32
+ end
33
+
34
+ it "can find an article by name" do
35
+ Article.find_by_name('an article').should_not be_nil
36
+ end
37
+
38
+ it "can find a post by name" do
39
+ Post.find_by_name('a post').should_not be_nil
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe WithoutScope::ActsAsRevisable, "with validations" do
4
+ after(:each) do
5
+ cleanup_db
6
+ end
7
+
8
+ before(:each) do
9
+ @post = Post.create(:name => 'a post')
10
+ @foo = Foo.create(:name => 'a foo')
11
+
12
+ end
13
+
14
+ describe "unique fields" do
15
+ it "should allow revisions" do
16
+ lambda {@post.revise!; @post.revise!}.should_not raise_error
17
+ end
18
+ end
19
+
20
+ describe "unique fields with validation scoping off" do
21
+ it "should not allow revisions" do
22
+ lambda {@foo.revise!; @foo.revise!}.should raise_error
23
+ end
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_revisable
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Rich Cavanaugh
8
+ - Stephen Caudill
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-10-02 00:00:00 -04:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description:
18
+ email: rich@withoutscope.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files:
24
+ - README.rdoc
25
+ - LICENSE
26
+ files:
27
+ - LICENSE
28
+ - README.rdoc
29
+ - Rakefile
30
+ - spec/associations_spec.rb
31
+ - spec/branch_spec.rb
32
+ - spec/deletable_spec.rb
33
+ - spec/find_spec.rb
34
+ - spec/general_spec.rb
35
+ - spec/options_spec.rb
36
+ - spec/quoted_columns_spec.rb
37
+ - spec/revert_spec.rb
38
+ - spec/spec.opts
39
+ - spec/spec_helper.rb
40
+ - spec/sti_spec.rb
41
+ - spec/validations_spec.rb
42
+ - lib/acts_as_revisable/acts/common.rb
43
+ - lib/acts_as_revisable/acts/deletable.rb
44
+ - lib/acts_as_revisable/acts/revisable.rb
45
+ - lib/acts_as_revisable/acts/revision.rb
46
+ - lib/acts_as_revisable/base.rb
47
+ - lib/acts_as_revisable/gem_spec_options.rb
48
+ - lib/acts_as_revisable/options.rb
49
+ - lib/acts_as_revisable/quoted_columns.rb
50
+ - lib/acts_as_revisable/validations.rb
51
+ - lib/acts_as_revisable/version.rb
52
+ - lib/acts_as_revisable.rb
53
+ - generators/revisable_migration/revisable_migration_generator.rb
54
+ - generators/revisable_migration/templates/migration.rb
55
+ - rails/init.rb
56
+ has_rdoc: true
57
+ homepage: http://github.com/rich/acts_as_revisable
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options:
62
+ - --main
63
+ - README.rdoc
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0"
77
+ version:
78
+ requirements: []
79
+
80
+ rubyforge_project:
81
+ rubygems_version: 1.3.5
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: acts_as_revisable enables revision tracking, querying, reverting and branching of ActiveRecord models. Inspired by acts_as_versioned.
85
+ test_files: []
86
+