rtiss_acts_as_versioned 0.7.7 → 0.7.8
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.
- checksums.yaml +4 -4
- data/Rakefile +1 -8
- data/lib/rtiss_acts_as_versioned.rb +51 -31
- data/rtiss_acts_as_versioned.gemspec +2 -2
- data/test/fixtures/locked_pages.yml +4 -2
- data/test/fixtures/locked_pages_revisions.yml +4 -4
- data/test/fixtures/page.rb +0 -1
- data/test/fixtures/widget.rb +1 -1
- data/test/schema.rb +10 -8
- data/test/tiss_test.rb +48 -7
- data/test/versioned_test.rb +17 -11
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2f630279fadaf312a0d49b69fe00dbdfadf0dde5
|
|
4
|
+
data.tar.gz: a464dd23cb736ad635080101e14ef751afaa8543
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 73332935aafa174653421081523e244544595e740b6003a8b6be1907168f2645f467bafe4e55c63decebba4ac1c344f5d1dbe22b62b00e9709e9ed3c1fa49ef5
|
|
7
|
+
data.tar.gz: 0699711f61e6b4cda088686fab69a7533da97ae31e69132a434455451da2f1925fbc727e190119f39fda0553069a5a11d65d40943516de1ba3324d6ada50682a
|
data/Rakefile
CHANGED
|
@@ -73,14 +73,6 @@ task :console do
|
|
|
73
73
|
sh "irb -rubygems -r ./lib//#{name}.rb"
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
-
#############################################################################
|
|
77
|
-
#
|
|
78
|
-
# Custom tasks (add your own tasks here)
|
|
79
|
-
#
|
|
80
|
-
#############################################################################
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
76
|
#############################################################################
|
|
85
77
|
#
|
|
86
78
|
# Packaging tasks
|
|
@@ -90,6 +82,7 @@ end
|
|
|
90
82
|
task :release => :build do
|
|
91
83
|
sh "git commit --allow-empty -a -m 'Release #{version}'"
|
|
92
84
|
sh "git tag #{version}"
|
|
85
|
+
sh "git push origin master"
|
|
93
86
|
sh "git push origin master --tags"
|
|
94
87
|
sh "gem push pkg/#{name}-#{version}.gem"
|
|
95
88
|
end
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
22
|
|
|
23
|
-
VERSION = '0.7.
|
|
23
|
+
VERSION = '0.7.8'
|
|
24
24
|
|
|
25
25
|
module ActiveRecord #:nodoc:
|
|
26
26
|
module Acts #:nodoc:
|
|
@@ -173,7 +173,7 @@ module ActiveRecord #:nodoc:
|
|
|
173
173
|
|
|
174
174
|
cattr_accessor :versioned_class_name, :versioned_foreign_key, :versioned_table_name, :versioned_inheritance_column,
|
|
175
175
|
:version_column, :max_version_limit, :track_altered_attributes, :version_condition, :version_sequence_name, :non_versioned_columns,
|
|
176
|
-
:version_association_options, :version_if_changed, :deleted_in_original_table_flag, :
|
|
176
|
+
:version_association_options, :version_if_changed, :deleted_in_original_table_flag, :record_restored_column
|
|
177
177
|
|
|
178
178
|
self.versioned_class_name = options[:class_name] || "Version"
|
|
179
179
|
self.versioned_foreign_key = options[:foreign_key] || self.to_s.foreign_key
|
|
@@ -182,11 +182,14 @@ module ActiveRecord #:nodoc:
|
|
|
182
182
|
self.versioned_inheritance_column = options[:inheritance_column] || "versioned_#{inheritance_column}"
|
|
183
183
|
self.version_column = options[:version_column] || 'version'
|
|
184
184
|
self.deleted_in_original_table_flag = options[:deleted_in_original_table_flag] || 'deleted_in_original_table'
|
|
185
|
-
self.
|
|
185
|
+
self.record_restored_column = options[:record_restored_column] || 'record_restored'
|
|
186
186
|
self.version_sequence_name = options[:sequence_name]
|
|
187
187
|
self.max_version_limit = options[:limit].to_i
|
|
188
188
|
self.version_condition = options[:if] || true
|
|
189
189
|
self.non_versioned_columns = [self.primary_key, inheritance_column, self.version_column, 'lock_version', versioned_inheritance_column] + options[:non_versioned_columns].to_a.map(&:to_s)
|
|
190
|
+
if options[:association_options].is_a?(Hash) && options[:association_options][:dependent] == :nullify
|
|
191
|
+
raise "Illegal option :dependent => :nullify - this would produce orphans in version model"
|
|
192
|
+
end
|
|
190
193
|
self.version_association_options = {
|
|
191
194
|
:class_name => "#{self.to_s}::#{versioned_class_name}",
|
|
192
195
|
:foreign_key => versioned_foreign_key
|
|
@@ -231,6 +234,7 @@ module ActiveRecord #:nodoc:
|
|
|
231
234
|
const_set(versioned_class_name, Class.new(ActiveRecord::Base)).class_eval do
|
|
232
235
|
def self.reloadable? ; false ; end
|
|
233
236
|
# find first version before the given version
|
|
237
|
+
# TODO: replace "version" in selects with version_column, use select-method instead of find
|
|
234
238
|
def self.before(version)
|
|
235
239
|
find :first, :order => 'version desc',
|
|
236
240
|
:conditions => ["#{original_class.versioned_foreign_key} = ? and version < ?", version.send(original_class.versioned_foreign_key), version.version]
|
|
@@ -263,7 +267,7 @@ module ActiveRecord #:nodoc:
|
|
|
263
267
|
version_hash = self.attributes
|
|
264
268
|
version_hash.delete "id"
|
|
265
269
|
version_hash.delete self.original_class.deleted_in_original_table_flag.to_s
|
|
266
|
-
version_hash.delete self.original_class.
|
|
270
|
+
version_hash.delete self.original_class.record_restored_column.to_s
|
|
267
271
|
version_hash.delete self.original_class.versioned_foreign_key.to_s
|
|
268
272
|
|
|
269
273
|
restored_record = self.original_class.new(version_hash)
|
|
@@ -271,18 +275,26 @@ module ActiveRecord #:nodoc:
|
|
|
271
275
|
if restored_record.respond_to? :updated_at=
|
|
272
276
|
restored_record.updated_at = Time.now
|
|
273
277
|
end
|
|
278
|
+
# DON'T EVEN THINK ABOUT CALCULATING THE VERSION NUMBER USING THE VERSIONS ASSOCIATION HERE:
|
|
279
|
+
# There is a problem in ActiveRecord. An association Relation will be converted to an Array internally, when the SQL-select is
|
|
280
|
+
# executed.
|
|
281
|
+
# Some ActiveRecord-Methods (for example #ActiveRecord::Base::AutosaveAssociation#save_collection_association) try to use ActiveRecord methods
|
|
282
|
+
# with these Relations, and if these Relations have been converted to Arrays, these calls fail with an Exception
|
|
283
|
+
new_version_number = self.class.where(self.original_class.versioned_foreign_key => id).order('id desc').first.send(restored_record.version_column).to_i + 1
|
|
284
|
+
restored_record.send("#{restored_record.version_column}=", new_version_number)
|
|
274
285
|
unless restored_record.save_without_revision(perform_validation)
|
|
275
286
|
raise RuntimeError.new("Couldn't restore the record, id = #{id} class = #{self.class.name}")
|
|
276
287
|
end
|
|
288
|
+
restored_record.save_version(true, false, self.send(self.original_class.version_column))
|
|
289
|
+
end
|
|
277
290
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
new_version.save!
|
|
291
|
+
def record_restored?
|
|
292
|
+
self.read_attribute(self.original_class.record_restored_column) != nil
|
|
293
|
+
end
|
|
294
|
+
alias :record_restored :record_restored?
|
|
295
|
+
|
|
296
|
+
def record_restored_from_version
|
|
297
|
+
self.read_attribute(self.original_class.record_restored_column)
|
|
286
298
|
end
|
|
287
299
|
|
|
288
300
|
def original_record_exists?
|
|
@@ -307,15 +319,15 @@ module ActiveRecord #:nodoc:
|
|
|
307
319
|
end
|
|
308
320
|
|
|
309
321
|
# Saves a version of the model in the versioned table. This is called in the after_save callback by default
|
|
310
|
-
def save_version
|
|
311
|
-
if @saving_version
|
|
322
|
+
def save_version(save_this=false, deleted_flag=false, restored_from_version=nil)
|
|
323
|
+
if @saving_version || save_this
|
|
312
324
|
@saving_version = nil
|
|
313
325
|
rev = self.class.versioned_class.new
|
|
314
326
|
clone_versioned_model(self, rev)
|
|
315
327
|
rev.send("#{self.class.version_column}=", send(self.class.version_column))
|
|
316
328
|
rev.send("#{self.class.versioned_foreign_key}=", id)
|
|
317
|
-
rev.send("#{self.class.deleted_in_original_table_flag}=",
|
|
318
|
-
rev.send("#{self.class.
|
|
329
|
+
rev.send("#{self.class.deleted_in_original_table_flag}=", deleted_flag)
|
|
330
|
+
rev.send("#{self.class.record_restored_column}=", restored_from_version)
|
|
319
331
|
if rev.respond_to? :updated_at=
|
|
320
332
|
rev.updated_at = Time.now
|
|
321
333
|
end
|
|
@@ -331,7 +343,7 @@ module ActiveRecord #:nodoc:
|
|
|
331
343
|
rev.send("#{self.class.version_column}=", highest_version+1)
|
|
332
344
|
rev.send("#{self.class.versioned_foreign_key}=", id)
|
|
333
345
|
rev.send("#{self.class.deleted_in_original_table_flag}=", true)
|
|
334
|
-
rev.send("#{self.class.
|
|
346
|
+
rev.send("#{self.class.record_restored_column}=", nil)
|
|
335
347
|
if rev.respond_to? :updated_at=
|
|
336
348
|
rev.updated_at = Time.now
|
|
337
349
|
end
|
|
@@ -351,9 +363,11 @@ module ActiveRecord #:nodoc:
|
|
|
351
363
|
# Reverts a model to a given version. Takes either a version number or an instance of the versioned model
|
|
352
364
|
def revert_to(version)
|
|
353
365
|
if version.is_a?(self.class.versioned_class)
|
|
366
|
+
@reverted_from = version.send(self.class.version_column)
|
|
354
367
|
return false unless version.send(self.class.versioned_foreign_key) == id and !version.new_record?
|
|
355
368
|
else
|
|
356
|
-
|
|
369
|
+
@reverted_from = version
|
|
370
|
+
return false unless version = versions.where(self.class.version_column => version).first
|
|
357
371
|
end
|
|
358
372
|
self.clone_versioned_model(version, self)
|
|
359
373
|
send("#{self.class.version_column}=", version.send(self.class.version_column))
|
|
@@ -363,7 +377,13 @@ module ActiveRecord #:nodoc:
|
|
|
363
377
|
# Reverts a model to a given version and saves the model.
|
|
364
378
|
# Takes either a version number or an instance of the versioned model
|
|
365
379
|
def revert_to!(version)
|
|
366
|
-
revert_to(version)
|
|
380
|
+
if revert_to(version)
|
|
381
|
+
set_new_version
|
|
382
|
+
save_without_revision
|
|
383
|
+
save_version(true, false, @reverted_from)
|
|
384
|
+
else
|
|
385
|
+
false
|
|
386
|
+
end
|
|
367
387
|
end
|
|
368
388
|
|
|
369
389
|
# Temporarily turns off Optimistic Locking while saving. Used when reverting so that a new version is not created.
|
|
@@ -466,7 +486,7 @@ module ActiveRecord #:nodoc:
|
|
|
466
486
|
def find_newest_version
|
|
467
487
|
return nil if self.id.nil?
|
|
468
488
|
|
|
469
|
-
self.class.versioned_class.
|
|
489
|
+
self.class.versioned_class.where("#{self.class.versioned_foreign_key} = #{self.id}").order("version DESC").first
|
|
470
490
|
end
|
|
471
491
|
|
|
472
492
|
def highest_version
|
|
@@ -481,22 +501,22 @@ module ActiveRecord #:nodoc:
|
|
|
481
501
|
def find_version(version)
|
|
482
502
|
return nil if self.id.nil?
|
|
483
503
|
|
|
484
|
-
ret = self.class.versioned_class.
|
|
504
|
+
ret = self.class.versioned_class.where("#{self.class.versioned_foreign_key} = #{self.id} and #{self.class.version_column}=#{version}").first
|
|
485
505
|
raise "find_version: version #{version} not found in database" unless ret
|
|
486
506
|
ret
|
|
487
507
|
end
|
|
488
508
|
|
|
489
509
|
protected
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
510
|
+
# sets the new version before saving
|
|
511
|
+
def set_new_version
|
|
512
|
+
@saving_version = new_record? || save_version?
|
|
513
|
+
self.send("#{self.class.version_column}=", next_version) if new_record? || save_version?
|
|
514
|
+
end
|
|
495
515
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
516
|
+
# Gets the next available version for the current record, or 1 for a new record
|
|
517
|
+
def next_version
|
|
518
|
+
(new_record? ? 0 : versions.calculate(:maximum, version_column).to_i) + 1
|
|
519
|
+
end
|
|
500
520
|
|
|
501
521
|
module ClassMethods
|
|
502
522
|
# Returns an array of columns that are versioned. See non_versioned_columns
|
|
@@ -523,7 +543,7 @@ module ActiveRecord #:nodoc:
|
|
|
523
543
|
t.column versioned_foreign_key, :integer
|
|
524
544
|
t.column version_column, :integer
|
|
525
545
|
t.column deleted_in_original_table_flag, :boolean, :default => false
|
|
526
|
-
t.column
|
|
546
|
+
t.column record_restored_column, :integer, :default => nil
|
|
527
547
|
end
|
|
528
548
|
|
|
529
549
|
self.versioned_columns.each do |col|
|
|
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
|
|
|
12
12
|
## If your rubyforge_project name is different, then edit it and comment out
|
|
13
13
|
## the sub! line in the Rakefile
|
|
14
14
|
s.name = 'rtiss_acts_as_versioned'
|
|
15
|
-
s.version = '0.7.
|
|
16
|
-
s.date = '2014-11-
|
|
15
|
+
s.version = '0.7.8'
|
|
16
|
+
s.date = '2014-11-18'
|
|
17
17
|
s.rubyforge_project = 'rtiss_acts_as_versioned'
|
|
18
18
|
s.summary = "Add simple versioning to ActiveRecord models (TISS version)."
|
|
19
19
|
s.description = "Add simple versioning to ActiveRecord models (TISS version).
|
|
@@ -2,26 +2,26 @@ welcome_1:
|
|
|
2
2
|
id: 1
|
|
3
3
|
page_id: 1
|
|
4
4
|
title: Welcome to the weblg
|
|
5
|
-
|
|
5
|
+
version: 23
|
|
6
6
|
version_type: LockedPage
|
|
7
7
|
|
|
8
8
|
welcome_2:
|
|
9
9
|
id: 2
|
|
10
10
|
page_id: 1
|
|
11
11
|
title: Welcome to the weblog
|
|
12
|
-
|
|
12
|
+
version: 24
|
|
13
13
|
version_type: LockedPage
|
|
14
14
|
|
|
15
15
|
thinking_1:
|
|
16
16
|
id: 3
|
|
17
17
|
page_id: 2
|
|
18
18
|
title: So I was thinking!!!
|
|
19
|
-
|
|
19
|
+
version: 23
|
|
20
20
|
version_type: SpecialLockedPage
|
|
21
21
|
|
|
22
22
|
thinking_2:
|
|
23
23
|
id: 4
|
|
24
24
|
page_id: 2
|
|
25
25
|
title: So I was thinking
|
|
26
|
-
|
|
26
|
+
version: 24
|
|
27
27
|
version_type: SpecialLockedPage
|
data/test/fixtures/page.rb
CHANGED
|
@@ -29,7 +29,6 @@ class LockedPage < ActiveRecord::Base
|
|
|
29
29
|
:foreign_key => :page_id,
|
|
30
30
|
:table_name => :locked_pages_revisions,
|
|
31
31
|
:class_name => 'LockedPageRevision',
|
|
32
|
-
:version_column => :lock_version,
|
|
33
32
|
:limit => 2,
|
|
34
33
|
:if_changed => :title,
|
|
35
34
|
:extend => LockedPageExtension
|
data/test/fixtures/widget.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
class Widget < ActiveRecord::Base
|
|
2
2
|
acts_as_versioned :sequence_name => 'widgets_seq', :association_options => {
|
|
3
|
-
:
|
|
3
|
+
:order => 'version desc' # Don't nullify the foreign key column when deleting the original record! :dependent => :nullify option removed
|
|
4
4
|
}
|
|
5
5
|
non_versioned_columns << 'foo'
|
|
6
6
|
end
|
data/test/schema.rb
CHANGED
|
@@ -19,7 +19,7 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
19
19
|
t.column :author_id, :integer
|
|
20
20
|
t.column :revisor_id, :integer
|
|
21
21
|
t.column :deleted_in_original_table, :boolean
|
|
22
|
-
t.column :record_restored, :
|
|
22
|
+
t.column :record_restored, :integer, :precision => 38, :scale => 0, :default => nil
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
add_index :pages_h, [:page_id, :version], :unique => true
|
|
@@ -31,6 +31,7 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
31
31
|
|
|
32
32
|
create_table :locked_pages, :force => true do |t|
|
|
33
33
|
t.column :lock_version, :integer
|
|
34
|
+
t.column :version, :integer
|
|
34
35
|
t.column :title, :string, :limit => 255
|
|
35
36
|
t.column :body, :text
|
|
36
37
|
t.column :type, :string, :limit => 255
|
|
@@ -38,16 +39,17 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
38
39
|
|
|
39
40
|
create_table :locked_pages_revisions, :force => true do |t|
|
|
40
41
|
t.column :page_id, :integer
|
|
41
|
-
t.column :
|
|
42
|
+
t.column :version, :integer
|
|
43
|
+
#t.column :lock_version, :integer
|
|
42
44
|
t.column :title, :string, :limit => 255
|
|
43
45
|
t.column :body, :text
|
|
44
46
|
t.column :version_type, :string, :limit => 255
|
|
45
47
|
t.column :updated_at, :datetime
|
|
46
48
|
t.column :deleted_in_original_table, :boolean
|
|
47
|
-
t.column :record_restored, :
|
|
49
|
+
t.column :record_restored, :integer, :precision => 38, :scale => 0, :default => nil
|
|
48
50
|
end
|
|
49
51
|
|
|
50
|
-
add_index :locked_pages_revisions, [:page_id, :
|
|
52
|
+
add_index :locked_pages_revisions, [:page_id, :version], :unique => true
|
|
51
53
|
|
|
52
54
|
create_table :widgets, :force => true do |t|
|
|
53
55
|
t.column :name, :string, :limit => 50
|
|
@@ -62,7 +64,7 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
62
64
|
t.column :version, :integer
|
|
63
65
|
t.column :updated_at, :datetime
|
|
64
66
|
t.column :deleted_in_original_table, :boolean
|
|
65
|
-
t.column :record_restored, :
|
|
67
|
+
t.column :record_restored, :integer, :precision => 38, :scale => 0, :default => nil
|
|
66
68
|
end
|
|
67
69
|
|
|
68
70
|
add_index :widgets_h, [:widget_id, :version], :unique => true
|
|
@@ -83,7 +85,7 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
83
85
|
t.column :doesnt_trigger_version,:string
|
|
84
86
|
t.column :version, :integer
|
|
85
87
|
t.column :deleted_in_original_table, :boolean
|
|
86
|
-
t.column :record_restored, :
|
|
88
|
+
t.column :record_restored, :integer, :precision => 38, :scale => 0, :default => nil
|
|
87
89
|
end
|
|
88
90
|
|
|
89
91
|
add_index :landmark_h, [:landmark_id, :version], :unique => true
|
|
@@ -111,7 +113,7 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
111
113
|
t.string "name", :limit => 50
|
|
112
114
|
t.string "beschreibung", :limit => 250
|
|
113
115
|
t.boolean "deleted_in_original_table", :precision => 1, :scale => 0
|
|
114
|
-
t.
|
|
116
|
+
t.integer "record_restored", :precision => 38, :scale => 0, :default => nil
|
|
115
117
|
t.integer "parent_id", :precision => 38, :scale => 0
|
|
116
118
|
t.string "beschreibung_intern", :limit => 4000
|
|
117
119
|
t.string "geltungsbereich", :limit => 1000
|
|
@@ -144,7 +146,7 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
|
144
146
|
t.string "name", :limit => 50
|
|
145
147
|
t.string "beschreibung", :limit => 250
|
|
146
148
|
t.boolean "deleted_in_original_table", :precision => 1, :scale => 0
|
|
147
|
-
t.
|
|
149
|
+
t.integer "record_restored", :precision => 38, :scale => 0, :default => nil
|
|
148
150
|
t.integer "parent_id", :precision => 38, :scale => 0
|
|
149
151
|
t.string "beschreibung_intern", :limit => 4000
|
|
150
152
|
t.string "geltungsbereich", :limit => 1000
|
data/test/tiss_test.rb
CHANGED
|
@@ -106,23 +106,63 @@ class TissTest < ActiveSupport::TestCase
|
|
|
106
106
|
oid = o.id
|
|
107
107
|
v = o.find_version(1)
|
|
108
108
|
assert v!=nil
|
|
109
|
-
|
|
109
|
+
|
|
110
110
|
assert_raises(RuntimeError) { v.restore }
|
|
111
111
|
assert !v.deleted_in_original_table
|
|
112
112
|
assert !v.record_restored, "Record_restored shows that the record was undeleted (should be false) for a newly created record"
|
|
113
113
|
|
|
114
|
+
old_version = o.version
|
|
114
115
|
o.destroy
|
|
115
116
|
v = o.find_newest_version
|
|
116
|
-
|
|
117
|
+
first_delete_version = v.version
|
|
118
|
+
assert v.deleted_in_original_table, "Deleted-Flag in versioned record is not set"
|
|
119
|
+
assert_equal old_version + 1, v.version, "Destroy did not increment version number in history record"
|
|
117
120
|
|
|
118
121
|
v.restore
|
|
122
|
+
restored_version = v.version
|
|
119
123
|
assert !v.record_restored, "Record_restored shows that the record was undeleted (should be false) for the restored version record (but should be in the newly created record)"
|
|
120
124
|
o = Rolle.find oid
|
|
121
|
-
assert v.version == o.version, "Version field not restored correctly"
|
|
122
|
-
|
|
123
125
|
v = o.find_newest_version
|
|
126
|
+
v_old = v
|
|
127
|
+
assert_equal v.version, o.version
|
|
128
|
+
assert_equal old_version + 2, v.version, "Version field not restored correctly"
|
|
124
129
|
assert !v.deleted_in_original_table, "Deleted_in_original_table doesn't show that the record was undeleted (should be false)"
|
|
125
130
|
assert v.record_restored, "Record_restored doesn't show that the record was undeleted (should be true) for the version record created upon restore"
|
|
131
|
+
assert_equal restored_version, v.record_restored_from_version
|
|
132
|
+
|
|
133
|
+
o.name = 'kaputt'
|
|
134
|
+
assert o.save
|
|
135
|
+
o.destroy
|
|
136
|
+
v = o.find_newest_version
|
|
137
|
+
v.restore
|
|
138
|
+
o = Rolle.find oid
|
|
139
|
+
assert_equal v.version + 1, o.version
|
|
140
|
+
assert_equal 'kaputt', o.name
|
|
141
|
+
assert_equal v.version, o.find_newest_version.record_restored_from_version
|
|
142
|
+
o.destroy
|
|
143
|
+
v_old.restore
|
|
144
|
+
o = Rolle.find oid
|
|
145
|
+
assert_equal 'lebt', o.name
|
|
146
|
+
assert_equal v_old.version, o.find_newest_version.record_restored_from_version
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_restore_and_destroy_with_revision_on_every_change
|
|
150
|
+
r = Rolle.new(:name => 'karin')
|
|
151
|
+
assert r.save
|
|
152
|
+
r.name = 'zak'
|
|
153
|
+
assert r.save
|
|
154
|
+
assert_equal 2, Rolle::Version.count
|
|
155
|
+
r.destroy
|
|
156
|
+
assert_equal 0, Rolle.count
|
|
157
|
+
assert_equal 3, Rolle::Version.count
|
|
158
|
+
assert version = r.find_version(3)
|
|
159
|
+
assert version.deleted_in_original_table?
|
|
160
|
+
assert version = r.find_version(2)
|
|
161
|
+
version.restore
|
|
162
|
+
assert r = Rolle.first
|
|
163
|
+
assert r.find_newest_version.record_restored?
|
|
164
|
+
assert_equal 4, Rolle::Version.count
|
|
165
|
+
assert_equal 4, r.version
|
|
126
166
|
end
|
|
127
167
|
|
|
128
168
|
def test_original_record_exists
|
|
@@ -193,7 +233,8 @@ class TissTest < ActiveSupport::TestCase
|
|
|
193
233
|
assert r.save
|
|
194
234
|
r.name = 'zak'
|
|
195
235
|
assert r.save
|
|
196
|
-
|
|
236
|
+
r.reload
|
|
237
|
+
assert_equal 2, r.versions.size
|
|
197
238
|
assert_equal 2, r.versions.count
|
|
198
239
|
end
|
|
199
240
|
|
|
@@ -205,9 +246,9 @@ class TissTest < ActiveSupport::TestCase
|
|
|
205
246
|
|
|
206
247
|
r = Rolle.new(:name => 'karin')
|
|
207
248
|
assert r.save
|
|
208
|
-
|
|
209
249
|
assert_raises RuntimeError do version.restore end
|
|
210
|
-
assert_nothing_raised do
|
|
250
|
+
#assert_nothing_raised do
|
|
251
|
+
version.restore(perform_validations = false) #end
|
|
211
252
|
end
|
|
212
253
|
|
|
213
254
|
def test_save_without_revision
|
data/test/versioned_test.rb
CHANGED
|
@@ -29,11 +29,14 @@ class VersionedTest < ActiveSupport::TestCase
|
|
|
29
29
|
|
|
30
30
|
def test_rollback_with_version_number
|
|
31
31
|
p = pages(:welcome)
|
|
32
|
+
versioncount = p.versions.count
|
|
32
33
|
assert_equal 24, p.version
|
|
33
34
|
assert_equal 'Welcome to the weblog', p.title
|
|
34
35
|
|
|
35
36
|
assert p.revert_to!(23), "Couldn't revert to 23"
|
|
36
|
-
|
|
37
|
+
assert p.reload
|
|
38
|
+
assert_equal versioncount + 1, p.versions.count
|
|
39
|
+
assert_equal 25, p.version
|
|
37
40
|
assert_equal 'Welcome to the weblg', p.title
|
|
38
41
|
end
|
|
39
42
|
|
|
@@ -56,11 +59,14 @@ class VersionedTest < ActiveSupport::TestCase
|
|
|
56
59
|
|
|
57
60
|
def test_rollback_with_version_class
|
|
58
61
|
p = pages(:welcome)
|
|
62
|
+
versioncount = p.versions.count
|
|
59
63
|
assert_equal 24, p.version
|
|
60
64
|
assert_equal 'Welcome to the weblog', p.title
|
|
61
65
|
|
|
62
66
|
assert p.revert_to!(p.versions.find_by_version(23)), "Couldn't revert to 23"
|
|
63
|
-
|
|
67
|
+
assert p.reload
|
|
68
|
+
assert_equal versioncount + 1, p.versions.count
|
|
69
|
+
assert_equal 25, p.version
|
|
64
70
|
assert_equal 'Welcome to the weblg', p.title
|
|
65
71
|
end
|
|
66
72
|
|
|
@@ -81,7 +87,7 @@ class VersionedTest < ActiveSupport::TestCase
|
|
|
81
87
|
assert_equal 'Welcome to the weblog', p.title
|
|
82
88
|
assert_equal 'LockedPage', p.versions.first.version_type
|
|
83
89
|
|
|
84
|
-
assert p.revert_to!(p.versions.first.
|
|
90
|
+
assert p.revert_to!(p.versions.first.version), "Couldn't revert to 23"
|
|
85
91
|
assert_equal 'Welcome to the weblg', p.title
|
|
86
92
|
assert_equal 'LockedPage', p.versions.first.version_type
|
|
87
93
|
end
|
|
@@ -108,7 +114,7 @@ class VersionedTest < ActiveSupport::TestCase
|
|
|
108
114
|
p = locked_pages(:thinking)
|
|
109
115
|
assert_equal 'So I was thinking', p.title
|
|
110
116
|
|
|
111
|
-
assert p.revert_to!(p.versions.first.
|
|
117
|
+
assert p.revert_to!(p.versions.first.version), "Couldn't revert to 1"
|
|
112
118
|
assert_equal 'So I was thinking!!!', p.title
|
|
113
119
|
assert_equal 'SpecialLockedPage', p.versions.first.version_type
|
|
114
120
|
end
|
|
@@ -202,7 +208,7 @@ class VersionedTest < ActiveSupport::TestCase
|
|
|
202
208
|
p.title = "title#{i}"
|
|
203
209
|
p.save
|
|
204
210
|
assert_equal "title#{i}", p.title
|
|
205
|
-
assert_equal (i+4), p.
|
|
211
|
+
assert_equal (i+4), p.version
|
|
206
212
|
assert p.versions(true).size <= 2, "locked version can only store 2 versions"
|
|
207
213
|
end
|
|
208
214
|
end
|
|
@@ -215,25 +221,25 @@ class VersionedTest < ActiveSupport::TestCase
|
|
|
215
221
|
|
|
216
222
|
def test_track_altered_attributes
|
|
217
223
|
p = LockedPage.create! :title => "title"
|
|
218
|
-
assert_equal 1, p.
|
|
224
|
+
assert_equal 1, p.version
|
|
219
225
|
assert_equal 1, p.versions(true).size
|
|
220
226
|
|
|
221
227
|
p.body = 'whoa'
|
|
222
228
|
assert !p.save_version?
|
|
223
229
|
p.save
|
|
224
|
-
assert_equal
|
|
230
|
+
assert_equal 1, p.version # no increment, because we're not using lock_version column
|
|
225
231
|
assert_equal 1, p.versions(true).size
|
|
226
232
|
|
|
227
233
|
p.title = 'updated title'
|
|
228
234
|
assert p.save_version?
|
|
229
235
|
p.save
|
|
230
|
-
assert_equal
|
|
231
|
-
assert_equal
|
|
236
|
+
assert_equal 2, p.version
|
|
237
|
+
assert_equal 2, p.versions(true).size
|
|
232
238
|
|
|
233
239
|
p.title = 'updated title!'
|
|
234
240
|
assert p.save_version?
|
|
235
241
|
p.save
|
|
236
|
-
assert_equal
|
|
242
|
+
assert_equal 3, p.version
|
|
237
243
|
assert_equal 2, p.versions(true).size # version 1 deleted
|
|
238
244
|
end
|
|
239
245
|
|
|
@@ -273,7 +279,7 @@ class VersionedTest < ActiveSupport::TestCase
|
|
|
273
279
|
|
|
274
280
|
association = Widget.reflect_on_association(:versions)
|
|
275
281
|
options = association.options
|
|
276
|
-
assert_equal :nullify, options[:dependent]
|
|
282
|
+
#assert_equal :nullify, options[:dependent] #Removed! we do not nullify the foreign key, because on restore we want to set the correct original ID
|
|
277
283
|
assert_equal 'version desc', options[:order]
|
|
278
284
|
assert_equal 'widget_id', options[:foreign_key]
|
|
279
285
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rtiss_acts_as_versioned
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.7.
|
|
4
|
+
version: 0.7.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rick Olson
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2014-11-
|
|
13
|
+
date: 2014-11-18 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: activerecord
|