acts_as_versionable 0.3.1 → 0.3.3
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.
data/CHANGELOG.rdoc
ADDED
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Acts As Versionable
|
2
2
|
|
3
|
-
Minimalist versionable engine
|
3
|
+
Minimalist versionable engine for rails > 3
|
4
4
|
|
5
5
|
=== Installation
|
6
6
|
|
@@ -13,14 +13,14 @@
|
|
13
13
|
rails g model Document title:string body:text
|
14
14
|
rake db:migrate
|
15
15
|
|
16
|
-
|
16
|
+
_generate versionable table_
|
17
17
|
|
18
18
|
rails g versionable Document
|
19
|
-
create db/migrate/
|
19
|
+
create db/migrate/20120119150513_create_document_versions.rb
|
20
20
|
|
21
|
-
class
|
21
|
+
class CreateDocumentVersions < ActiveRecord::Migration
|
22
22
|
def self.up
|
23
|
-
create_table :
|
23
|
+
create_table :document_versions do |t|
|
24
24
|
t.column :title, :string
|
25
25
|
t.column :body, :text
|
26
26
|
t.column :current_version, :integer
|
@@ -28,12 +28,12 @@
|
|
28
28
|
t.integer :versioned_as
|
29
29
|
t.timestamps
|
30
30
|
end
|
31
|
-
add_index :
|
31
|
+
add_index :document_versions, :versioned_as
|
32
32
|
add_column :documents, :current_version, :integer
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.down
|
36
|
-
drop_table :
|
36
|
+
drop_table :document_versions
|
37
37
|
remove_column :documents, :current_version
|
38
38
|
end
|
39
39
|
end
|
@@ -53,3 +53,4 @@
|
|
53
53
|
document.versions => Array(2)
|
54
54
|
document.revert_to(1) => #<Document ...>
|
55
55
|
|
56
|
+
document.new_from_version(2) => #<Document ...>
|
data/lib/acts_as_versionable.rb
CHANGED
@@ -30,8 +30,9 @@ module ActsAsVersionable
|
|
30
30
|
self.max_versions = options[:limit].to_i
|
31
31
|
|
32
32
|
class << create_class("#{self.name}Versions", ActiveRecord::Base)
|
33
|
+
REJECT_COLUMNS = %w(id created_at updated_at versioned_as)
|
33
34
|
def actual_columns
|
34
|
-
|
35
|
+
columns.reject { |c| REJECT_COLUMNS.include?(c.name) }
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -47,29 +48,38 @@ module ActsAsVersionable
|
|
47
48
|
end
|
48
49
|
|
49
50
|
def revert_to(version)
|
50
|
-
revision =
|
51
|
-
|
52
|
-
raise NoSuchVersionError, "Couldn't find #{version} version" if revision.blank?
|
53
|
-
|
54
|
-
versions.actual_columns.each do |column|
|
55
|
-
self[column.name] = revision[column.name]
|
56
|
-
end
|
51
|
+
revision = get_version(version)
|
57
52
|
|
53
|
+
move_columns revision, self
|
54
|
+
|
58
55
|
self.current_version = version
|
59
56
|
self.local_changes = true
|
60
57
|
self.save
|
61
58
|
end
|
62
59
|
|
60
|
+
def new_from_version(version)
|
61
|
+
revision = get_version(version)
|
62
|
+
dummy = self.class.new
|
63
|
+
|
64
|
+
move_columns revision, dummy
|
65
|
+
|
66
|
+
dummy
|
67
|
+
end
|
68
|
+
|
63
69
|
private
|
64
70
|
|
71
|
+
def get_version(version)
|
72
|
+
revision = versions.find_by_versioned_as(version)
|
73
|
+
raise NoSuchVersionError, "Couldn't find #{version} version" if revision.blank?
|
74
|
+
revision
|
75
|
+
end
|
76
|
+
|
65
77
|
def apply_versioning
|
66
78
|
unless self.local_changes
|
67
79
|
version_content = {}
|
68
80
|
last_version = version + 1
|
69
81
|
|
70
|
-
|
71
|
-
version_content[column.name] = self[column.name]
|
72
|
-
end
|
82
|
+
move_columns self, version_content
|
73
83
|
|
74
84
|
version_content.merge!(:versioned_as => last_version)
|
75
85
|
|
@@ -89,6 +99,12 @@ module ActsAsVersionable
|
|
89
99
|
versions.where("versioned_as <= ?",excess_baggage).destroy_all
|
90
100
|
end
|
91
101
|
end
|
102
|
+
|
103
|
+
def move_columns from, to
|
104
|
+
versions.actual_columns.each do |column|
|
105
|
+
to[column.name] = from[column.name]
|
106
|
+
end
|
107
|
+
end
|
92
108
|
|
93
109
|
end
|
94
110
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
<%
|
2
|
-
versions_table = "#{@model_name}_versions".downcase
|
3
|
-
|
2
|
+
versions_table = "#{@model_name}_versions".downcase
|
3
|
+
rejects_columns = ["id", "created_at", "updated_at"]
|
4
|
+
columns = @model.classify.constantize.columns - rejects_columns
|
5
|
+
#columns = @model.classify.constantize.content_columns.reject { |c| c.type == :datetime }
|
4
6
|
%>
|
5
7
|
class <%= migration_name %> < ActiveRecord::Migration
|
6
8
|
def self.up
|
@@ -102,6 +102,17 @@ class VersionableTest < Test::Unit::TestCase
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
+
def test_new_from_version
|
106
|
+
article = Article.first
|
107
|
+
assert_not_nil article
|
108
|
+
|
109
|
+
dummy = article.new_from_version 1
|
110
|
+
|
111
|
+
article.revert_to(1)
|
112
|
+
assert_equal dummy.title, article.title
|
113
|
+
assert_equal dummy.body, article.body
|
114
|
+
end
|
115
|
+
|
105
116
|
def test_dependent_destroy
|
106
117
|
Article.destroy_all
|
107
118
|
assert_equal [], ArticleVersions.all
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_versionable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-20 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: ''
|
15
15
|
email:
|
@@ -19,6 +19,7 @@ extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
21
|
- .gitignore
|
22
|
+
- CHANGELOG.rdoc
|
22
23
|
- Gemfile
|
23
24
|
- README.rdoc
|
24
25
|
- Rakefile
|