paper_trail 2.2.7 → 2.2.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.
data/README.md CHANGED
@@ -348,7 +348,7 @@ PaperTrail can restore `:has_one` associations as they were at (actually, 3 seco
348
348
 
349
349
  >> treasure.update_attributes :amount => 153
350
350
  >> treasure.location.update_attributes :latitude => 54.321
351
-
351
+
352
352
  >> t = treasure.versions.last.reify(:has_one => true)
353
353
  >> t.amount # 100
354
354
  >> t.location.latitude # 12.345
@@ -374,13 +374,13 @@ Given these models:
374
374
  has_many :authors, :through => :authorships, :source => :person
375
375
  has_paper_trail
376
376
  end
377
-
377
+
378
378
  class Authorship < ActiveRecord::Base
379
379
  belongs_to :book
380
380
  belongs_to :person
381
381
  has_paper_trail # NOTE
382
382
  end
383
-
383
+
384
384
  class Person < ActiveRecord::Base
385
385
  has_many :authorships, :dependent => :destroy
386
386
  has_many :books, :through => :authorships
@@ -403,7 +403,7 @@ But none of these will:
403
403
  Having said that, you can apparently get all these working (I haven't tested it myself) with this [monkey patch](http://stackoverflow.com/questions/2381033/how-to-create-a-full-audit-log-in-rails-for-every-table/2381411#2381411):
404
404
 
405
405
  # In config/initializers/core_extensions.rb or lib/core_extensions.rb
406
- ActiveRecord::Associations::HasManyThroughAssociation.class_eval do
406
+ ActiveRecord::Associations::HasManyThroughAssociation.class_eval do
407
407
  def delete_records(records)
408
408
  klass = @reflection.through_reflection.klass
409
409
  records.each do |associate|
@@ -413,7 +413,7 @@ Having said that, you can apparently get all these working (I haven't tested it
413
413
  end
414
414
 
415
415
  The difference is the call to `destroy_all` instead of `delete_all` in [the original](http://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/has_many_through_association.rb#L76-81).
416
-
416
+
417
417
 
418
418
  There may be a way to store authorship versions, probably using association callbacks, no matter how the collection is manipulated but I haven't found it yet. Let me know if you do.
419
419
 
@@ -455,10 +455,10 @@ Remember to add those extra columns to your `versions` table ;)
455
455
 
456
456
  There are two scenarios: diffing adjacent versions and diffing non-adjacent versions.
457
457
 
458
- The best way to diff adjacent versions is to get PaperTrail to do it for you. If you add an `object_changes` text column to your `versions` table, either at installation time with the `--with-changes` option or manually, PaperTrail will store the `changes` diff in each `update` version. You can use the `version.changeset` method to retrieve it. For example:
458
+ The best way to diff adjacent versions is to get PaperTrail to do it for you. If you add an `object_changes` text column to your `versions` table, either at installation time with the `--with-changes` option or manually, PaperTrail will store the `changes` diff (excluding any attributes PaperTrail is ignoring) in each `update` version. You can use the `version.changeset` method to retrieve it. For example:
459
459
 
460
460
  >> widget = Widget.create :name => 'Bob'
461
- >> widget.versions.last.changeset # nil
461
+ >> widget.versions.last.changeset # {}
462
462
  >> widget.update_attributes :name => 'Robert'
463
463
  >> widget.versions.last.changeset # {'name' => ['Bob', 'Robert']}
464
464
 
@@ -114,7 +114,12 @@ module PaperTrail
114
114
  :object => object_to_string(item_before_change),
115
115
  :whodunnit => PaperTrail.whodunnit
116
116
  }
117
- data[:object_changes] = self.changes.to_yaml if Version.method_defined? :object_changes
117
+ if Version.method_defined? :object_changes
118
+ # The double negative (reject, !include?) preserves the hash structure of self.changes.
119
+ data[:object_changes] = self.changes.reject do |key, value|
120
+ !notably_changed.include?(key)
121
+ end.to_yaml
122
+ end
118
123
  versions.build merge_metadata(data)
119
124
  end
120
125
  end
@@ -80,8 +80,15 @@ class Version < ActiveRecord::Base
80
80
  end
81
81
 
82
82
  # Returns what changed in this version of the item. Cf. `ActiveModel::Dirty#changes`.
83
+ # Returns nil if your `versions` table does not have an `object_changes` text column.
83
84
  def changeset
84
- YAML::load(object_changes) if Version.method_defined?(:object_changes) && object_changes
85
+ if Version.method_defined?(:object_changes)
86
+ if changes = object_changes
87
+ YAML::load(changes)
88
+ else
89
+ {}
90
+ end
91
+ end
85
92
  end
86
93
 
87
94
  # Returns who put the item into the state stored in this version.
@@ -1,3 +1,3 @@
1
1
  module PaperTrail
2
- VERSION = '2.2.7'
2
+ VERSION = '2.2.8'
3
3
  end
@@ -13,6 +13,10 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
13
13
  context 'which updates an ignored column and a selected column' do
14
14
  setup { @article.update_attributes :title => 'My first title', :content => 'Some text here.' }
15
15
  should_change('the number of versions', :by => 1) { Version.count }
16
+
17
+ should 'have stored only non-ignored attributes' do
18
+ assert_equal ({'content' => [nil, 'Some text here.']}), @article.versions.last.changeset
19
+ end
16
20
  end
17
21
 
18
22
  context 'which updates a selected column' do
@@ -61,7 +65,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
61
65
  end
62
66
 
63
67
  should 'should not have changes' do
64
- assert_nil @widget.versions.last.changeset
68
+ assert_equal Hash.new, @widget.versions.last.changeset
65
69
  end
66
70
 
67
71
  context 'and then updated without any changes' do
@@ -105,7 +109,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
105
109
  assert_equal ({'name' => ['Henry', 'Harry']}), @widget.versions.last.changeset
106
110
  end
107
111
 
108
- should 'not have stored changes if object_changes column doesn\'t exist' do
112
+ should "not have stored changes if object_changes column doesn't exist" do
109
113
  remove_object_changes_column
110
114
  Version.reset_column_information
111
115
  assert_nil @widget.versions.last.changeset
@@ -192,6 +196,10 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
192
196
  @reified_widget.save
193
197
  assert_equal 1, @reified_widget.fluxors.length
194
198
  end
199
+
200
+ should 'should not have changes' do
201
+ assert_equal Hash.new, @widget.versions.last.changeset
202
+ end
195
203
  end
196
204
  end
197
205
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paper_trail
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 2
9
- - 7
10
- version: 2.2.7
9
+ - 8
10
+ version: 2.2.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andy Stewart
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-13 00:00:00 +01:00
18
+ date: 2011-07-14 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency