vestal_versions 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -2
- data/VERSION +1 -1
- data/lib/vestal_versions/creation.rb +1 -1
- data/lib/vestal_versions/options.rb +3 -0
- data/lib/vestal_versions/reset.rb +1 -29
- data/lib/vestal_versions/version.rb +0 -3
- data/lib/vestal_versions/versions.rb +2 -2
- data/test/control_test.rb +2 -2
- data/test/reset_test.rb +14 -9
- data/test/reversion_test.rb +3 -1
- data/test/schema.rb +3 -0
- data/test/tagging_test.rb +3 -2
- data/test/version_test.rb +2 -2
- data/vestal_versions.gemspec +5 -8
- metadata +4 -14
data/Rakefile
CHANGED
@@ -13,8 +13,7 @@ begin
|
|
13
13
|
g.email = 'steve@laserlemon.com'
|
14
14
|
g.homepage = 'http://github.com/laserlemon/vestal_versions'
|
15
15
|
g.authors = %w(laserlemon)
|
16
|
-
g.
|
17
|
-
g.add_development_dependency 'activesupport'
|
16
|
+
g.add_dependency 'activerecord', '>= 2.1.0'
|
18
17
|
g.add_development_dependency 'shoulda'
|
19
18
|
g.add_development_dependency 'mocha'
|
20
19
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.2
|
@@ -35,7 +35,7 @@ module VestalVersions
|
|
35
35
|
private
|
36
36
|
# Returns whether a new version should be created upon updating the parent record.
|
37
37
|
def create_version?
|
38
|
-
version_changes.
|
38
|
+
!version_changes.blank?
|
39
39
|
end
|
40
40
|
|
41
41
|
# Creates a new version upon updating the parent record.
|
@@ -28,6 +28,9 @@ module VestalVersions
|
|
28
28
|
:class_name => 'VestalVersions::Version',
|
29
29
|
:dependent => :delete_all
|
30
30
|
)
|
31
|
+
options.reverse_merge!(
|
32
|
+
:order => "#{options[:class_name].constantize.table_name}.number ASC"
|
33
|
+
)
|
31
34
|
|
32
35
|
class_inheritable_accessor :vestal_versions_options
|
33
36
|
self.vestal_versions_options = options.dup
|
@@ -2,8 +2,6 @@ module VestalVersions
|
|
2
2
|
# Adds the ability to "reset" (or hard revert) a versioned ActiveRecord::Base instance.
|
3
3
|
module Reset
|
4
4
|
def self.included(base) # :nodoc:
|
5
|
-
Version.send(:include, VersionMethods)
|
6
|
-
|
7
5
|
base.class_eval do
|
8
6
|
include InstanceMethods
|
9
7
|
end
|
@@ -20,37 +18,11 @@ module VestalVersions
|
|
20
18
|
# documentation for more details.
|
21
19
|
def reset_to!(value)
|
22
20
|
if saved = skip_version{ revert_to!(value) }
|
23
|
-
versions.after(value)
|
21
|
+
versions.send(:delete_records, versions.after(value))
|
24
22
|
reset_version
|
25
23
|
end
|
26
24
|
saved
|
27
25
|
end
|
28
|
-
|
29
|
-
private
|
30
|
-
# The method used to individually remove versions from the version history by way of the
|
31
|
-
# +reset_to!+ method. There are three options for the <tt>:dependent</tt> option given
|
32
|
-
# to the +versioned+ method: <tt>:delete_all</tt>, <tt>:destroy</tt> and <tt>:nullify</tt>.
|
33
|
-
# If none is given, <tt>:delete_all</tt> is the default.
|
34
|
-
#
|
35
|
-
# If <tt>:delete_all</tt> is given, each version will be deleted from the database,
|
36
|
-
# triggering no callbacks. If <tt>:destroy</tt> is given, each version will likewise be
|
37
|
-
# deleted from the database, but any callbacks associated with version destruction will be
|
38
|
-
# triggered. If <tt>:nullify</tt> is specified, the version records will simply be
|
39
|
-
# dissociated from the versioned parent record by setting its foreign key to nil.
|
40
|
-
def version_reset_method
|
41
|
-
vestal_versions_options[:dependent].to_s.sub(/_all$/, '').to_sym
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Instance methods added to the VestalVersions::Version model to accomodate resetting the
|
46
|
-
# parent ActiveRecord::Base instance.
|
47
|
-
module VersionMethods
|
48
|
-
# The +nullify+ method is meant to mimic the behavior of ActiveRecord when the parent of a
|
49
|
-
# +has_many+ association (with <tt>:dependent => :nullify</tt>) is destroyed and the child
|
50
|
-
# records are dissociated from the parent's primary key.
|
51
|
-
def nullify
|
52
|
-
update_attribute(:versioned_id, nil)
|
53
|
-
end
|
54
26
|
end
|
55
27
|
end
|
56
28
|
end
|
@@ -6,9 +6,6 @@ module VestalVersions
|
|
6
6
|
# Associate polymorphically with the parent record.
|
7
7
|
belongs_to :versioned, :polymorphic => true
|
8
8
|
|
9
|
-
# Order versions by number, ascending by default.
|
10
|
-
default_scope :order => "#{table_name}.number ASC"
|
11
|
-
|
12
9
|
# ActiveRecord::Base#changes is an existing method, so before serializing the +changes+ column,
|
13
10
|
# the existing +changes+ method is undefined. The overridden +changes+ method pertained to
|
14
11
|
# dirty attributes, but will not affect the partial updates functionality as that's based on
|
@@ -64,9 +64,9 @@ module VestalVersions
|
|
64
64
|
# still return a valid version number (useful for reversion).
|
65
65
|
def number_at(value)
|
66
66
|
case value
|
67
|
-
when Date, Time then at(value).
|
67
|
+
when Date, Time then (v = at(value)) ? v.number : 1
|
68
68
|
when Numeric then value.floor
|
69
|
-
when String, Symbol then at(value).
|
69
|
+
when String, Symbol then (v = at(value)) ? v.number : nil
|
70
70
|
when Version then value.number
|
71
71
|
end
|
72
72
|
end
|
data/test/control_test.rb
CHANGED
@@ -122,7 +122,7 @@ class ControlTest < Test::Unit::TestCase
|
|
122
122
|
end
|
123
123
|
|
124
124
|
should 'update the last version' do
|
125
|
-
last_version = @user.versions.last
|
125
|
+
last_version = @user.versions(true).last
|
126
126
|
assert_equal @last_version.id, last_version.id
|
127
127
|
assert_not_equal @last_version.attributes, last_version.attributes
|
128
128
|
end
|
@@ -142,7 +142,7 @@ class ControlTest < Test::Unit::TestCase
|
|
142
142
|
end
|
143
143
|
|
144
144
|
should 'update the last version' do
|
145
|
-
last_version = @user.versions.last
|
145
|
+
last_version = @user.versions(true).last
|
146
146
|
assert_equal @last_version.id, last_version.id
|
147
147
|
assert_not_equal @last_version.attributes, last_version.attributes
|
148
148
|
end
|
data/test/reset_test.rb
CHANGED
@@ -3,6 +3,7 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
3
3
|
class ResetTest < Test::Unit::TestCase
|
4
4
|
context 'Resetting a model' do
|
5
5
|
setup do
|
6
|
+
@original_dependent = User.reflect_on_association(:versions).options[:dependent]
|
6
7
|
@user, @versions = User.new, []
|
7
8
|
@names = ['Steve Richert', 'Stephen Richert', 'Stephen Jobs', 'Steve Jobs']
|
8
9
|
@names.each do |name|
|
@@ -19,7 +20,7 @@ class ResetTest < Test::Unit::TestCase
|
|
19
20
|
end
|
20
21
|
|
21
22
|
should 'dissociate all versions after the target' do
|
22
|
-
@versions.reverse.
|
23
|
+
@versions.reverse.each do |version|
|
23
24
|
@user.reset_to!(version)
|
24
25
|
assert_equal 0, @user.versions(true).after(version).count
|
25
26
|
end
|
@@ -27,11 +28,11 @@ class ResetTest < Test::Unit::TestCase
|
|
27
28
|
|
28
29
|
context 'with the :dependent option as :delete_all' do
|
29
30
|
setup do
|
30
|
-
User.
|
31
|
+
User.reflect_on_association(:versions).options[:dependent] = :delete_all
|
31
32
|
end
|
32
33
|
|
33
34
|
should 'delete all versions after the target version' do
|
34
|
-
@versions.reverse.
|
35
|
+
@versions.reverse.each do |version|
|
35
36
|
later_versions = @user.versions.after(version)
|
36
37
|
@user.reset_to!(version)
|
37
38
|
later_versions.each do |later_version|
|
@@ -44,7 +45,7 @@ class ResetTest < Test::Unit::TestCase
|
|
44
45
|
|
45
46
|
should 'not destroy all versions after the target version' do
|
46
47
|
VestalVersions::Version.any_instance.stubs(:destroy).raises(RuntimeError)
|
47
|
-
@versions.reverse.
|
48
|
+
@versions.reverse.each do |version|
|
48
49
|
assert_nothing_raised do
|
49
50
|
@user.reset_to!(version)
|
50
51
|
end
|
@@ -54,11 +55,11 @@ class ResetTest < Test::Unit::TestCase
|
|
54
55
|
|
55
56
|
context 'with the :dependent option as :destroy' do
|
56
57
|
setup do
|
57
|
-
User.
|
58
|
+
User.reflect_on_association(:versions).options[:dependent] = :destroy
|
58
59
|
end
|
59
60
|
|
60
61
|
should 'delete all versions after the target version' do
|
61
|
-
@versions.reverse.
|
62
|
+
@versions.reverse.each do |version|
|
62
63
|
later_versions = @user.versions.after(version)
|
63
64
|
@user.reset_to!(version)
|
64
65
|
later_versions.each do |later_version|
|
@@ -71,7 +72,7 @@ class ResetTest < Test::Unit::TestCase
|
|
71
72
|
|
72
73
|
should 'destroy all versions after the target version' do
|
73
74
|
VestalVersions::Version.any_instance.stubs(:destroy).raises(RuntimeError)
|
74
|
-
@versions.reverse.
|
75
|
+
@versions.reverse.each do |version|
|
75
76
|
later_versions = @user.versions.after(version)
|
76
77
|
if later_versions.empty?
|
77
78
|
assert_nothing_raised do
|
@@ -88,11 +89,11 @@ class ResetTest < Test::Unit::TestCase
|
|
88
89
|
|
89
90
|
context 'with the :dependent option as :nullify' do
|
90
91
|
setup do
|
91
|
-
User.
|
92
|
+
User.reflect_on_association(:versions).options[:dependent] = :nullify
|
92
93
|
end
|
93
94
|
|
94
95
|
should 'leave all versions after the target version' do
|
95
|
-
@versions.reverse.
|
96
|
+
@versions.reverse.each do |version|
|
96
97
|
later_versions = @user.versions.after(version)
|
97
98
|
@user.reset_to!(version)
|
98
99
|
later_versions.each do |later_version|
|
@@ -103,5 +104,9 @@ class ResetTest < Test::Unit::TestCase
|
|
103
104
|
end
|
104
105
|
end
|
105
106
|
end
|
107
|
+
|
108
|
+
teardown do
|
109
|
+
User.reflect_on_association(:versions).options[:dependent] = @original_dependent
|
110
|
+
end
|
106
111
|
end
|
107
112
|
end
|
data/test/reversion_test.rb
CHANGED
@@ -10,7 +10,9 @@ class ReversionTest < Test::Unit::TestCase
|
|
10
10
|
@user.update_attribute(:name, name)
|
11
11
|
@attributes[@user.version] = @user.attributes
|
12
12
|
time += 1.hour
|
13
|
-
@user.versions.last
|
13
|
+
if last_version = @user.versions.last
|
14
|
+
last_version.update_attribute(:created_at, time)
|
15
|
+
end
|
14
16
|
@times[@user.version] = time
|
15
17
|
end
|
16
18
|
@user.reload.versions.reload
|
data/test/schema.rb
CHANGED
data/test/tagging_test.rb
CHANGED
@@ -9,9 +9,10 @@ class TaggingTest < Test::Unit::TestCase
|
|
9
9
|
|
10
10
|
should "update the version record's tag column" do
|
11
11
|
tag_name = 'TAG'
|
12
|
-
|
12
|
+
last_version = @user.versions.last
|
13
|
+
assert_not_equal tag_name, last_version.tag
|
13
14
|
@user.tag_version(tag_name)
|
14
|
-
assert_equal tag_name,
|
15
|
+
assert_equal tag_name, last_version.reload.tag
|
15
16
|
end
|
16
17
|
|
17
18
|
should 'create a version record for an initial version' do
|
data/test/version_test.rb
CHANGED
@@ -29,8 +29,8 @@ class VersionTest < Test::Unit::TestCase
|
|
29
29
|
assert_not_equal @last_version, last_version
|
30
30
|
end
|
31
31
|
|
32
|
-
should 'default to ordering by number when finding' do
|
33
|
-
order =
|
32
|
+
should 'default to ordering by number when finding through association' do
|
33
|
+
order = @user.versions.send(:scope, :find)[:order]
|
34
34
|
assert_equal 'versions.number ASC', order
|
35
35
|
end
|
36
36
|
|
data/vestal_versions.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{vestal_versions}
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["laserlemon"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-13}
|
13
13
|
s.description = %q{Keep a DRY history of your ActiveRecord models' changes}
|
14
14
|
s.email = %q{steve@laserlemon.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -88,19 +88,16 @@ Gem::Specification.new do |s|
|
|
88
88
|
s.specification_version = 3
|
89
89
|
|
90
90
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
91
|
-
s.
|
92
|
-
s.add_development_dependency(%q<activesupport>, [">= 0"])
|
91
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 2.1.0"])
|
93
92
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
94
93
|
s.add_development_dependency(%q<mocha>, [">= 0"])
|
95
94
|
else
|
96
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
97
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
95
|
+
s.add_dependency(%q<activerecord>, [">= 2.1.0"])
|
98
96
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
99
97
|
s.add_dependency(%q<mocha>, [">= 0"])
|
100
98
|
end
|
101
99
|
else
|
102
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
103
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
100
|
+
s.add_dependency(%q<activerecord>, [">= 2.1.0"])
|
104
101
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
105
102
|
s.add_dependency(%q<mocha>, [">= 0"])
|
106
103
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vestal_versions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- laserlemon
|
@@ -9,28 +9,18 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-13 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
17
|
-
type: :
|
17
|
+
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
-
version:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: activesupport
|
27
|
-
type: :development
|
28
|
-
version_requirement:
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: "0"
|
23
|
+
version: 2.1.0
|
34
24
|
version:
|
35
25
|
- !ruby/object:Gem::Dependency
|
36
26
|
name: shoulda
|