paper_trail 2.0.0 → 2.0.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.
- data/Gemfile.lock +1 -1
- data/README.md +26 -20
- data/lib/generators/paper_trail/install_generator.rb +18 -0
- data/lib/paper_trail/has_paper_trail.rb +11 -3
- data/lib/paper_trail/version.rb +1 -1
- data/lib/paper_trail/version_number.rb +1 -1
- data/test/dummy/app/models/article.rb +2 -1
- data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +1 -0
- data/test/dummy/db/schema.rb +1 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/unit/model_test.rb +12 -1
- metadata +5 -5
- data/lib/generators/paper_trail/paper_trail_generator.rb +0 -24
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@ PaperTrail lets you track changes to your models' data. It's good for auditing
|
|
7
7
|
|
8
8
|
* Stores every create, update and destroy.
|
9
9
|
* Does not store updates which don't change anything.
|
10
|
-
*
|
10
|
+
* Allows you to specify attributes (by inclusion or exclusion) which must change for a Version to be stored.
|
11
11
|
* Allows you to get at every version, including the original, even once destroyed.
|
12
12
|
* Allows you to get at every version even if the schema has since changed.
|
13
13
|
* Allows you to get at the version as of a particular time.
|
@@ -26,7 +26,7 @@ PaperTrail lets you track changes to your models' data. It's good for auditing
|
|
26
26
|
|
27
27
|
## Rails Version
|
28
28
|
|
29
|
-
Works on Rails 3 and Rails 2.3. The Rails 3 code is on the master branch and tagged v2.x
|
29
|
+
Works on Rails 3 and Rails 2.3. The Rails 3 code is on the `master` branch and tagged `v2.x`. The Rails 2.3 code is on the `rails2` branch and tagged `v1.x`.
|
30
30
|
|
31
31
|
|
32
32
|
## API Summary
|
@@ -164,7 +164,7 @@ Here's a helpful table showing what PaperTrail stores:
|
|
164
164
|
PaperTrail stores the values in the Model Before column. Most other auditing/versioning plugins store the After column.
|
165
165
|
|
166
166
|
|
167
|
-
##
|
167
|
+
## Choosing Attributes To Monitor
|
168
168
|
|
169
169
|
You can ignore changes to certain attributes like this:
|
170
170
|
|
@@ -182,6 +182,23 @@ This means that changes to just the `title` or `rating` will not store another v
|
|
182
182
|
>> a.versions.length # 2
|
183
183
|
>> a.versions.last.reify.title # 'My Title'
|
184
184
|
|
185
|
+
Or, you can specify a list of all attributes you care about:
|
186
|
+
|
187
|
+
class Article < ActiveRecord::Base
|
188
|
+
has_paper_trail :only => [:title]
|
189
|
+
end
|
190
|
+
|
191
|
+
This means that only changes to the `title` will save a version of the article:
|
192
|
+
|
193
|
+
>> a = Article.create
|
194
|
+
>> a.versions.length # 1
|
195
|
+
>> a.update_attributes :title => 'My Title'
|
196
|
+
>> a.versions.length # 2
|
197
|
+
>> a.update_attributes :content => 'Hello'
|
198
|
+
>> a.versions.length # 2
|
199
|
+
|
200
|
+
Passing both `:ignore` and `:only` options will result in the article being saved if a changed attribute is included in `:only` but not in `:ignore`.
|
201
|
+
|
185
202
|
|
186
203
|
## Reverting And Undeleting A Model
|
187
204
|
|
@@ -494,29 +511,17 @@ Over time your `versions` table will grow to an unwieldy size. Because each ver
|
|
494
511
|
|
495
512
|
2. Generate a migration which will add a `versions` table to your database.
|
496
513
|
|
497
|
-
`rails generate paper_trail`
|
514
|
+
`bundle exec rails generate paper_trail`
|
498
515
|
|
499
516
|
3. Run the migration.
|
500
517
|
|
501
|
-
`rake db:migrate`
|
518
|
+
`bundle exec rake db:migrate`
|
502
519
|
|
503
520
|
4. Add `has_paper_trail` to the models you want to track.
|
504
521
|
|
505
522
|
### Rails 2
|
506
523
|
|
507
|
-
|
508
|
-
|
509
|
-
`config.gem 'paper_trail', :version => '~> 1'`
|
510
|
-
|
511
|
-
2. Generate a migration which will add a `versions` table to your database.
|
512
|
-
|
513
|
-
`script/generate paper_trail`
|
514
|
-
|
515
|
-
3. Run the migration.
|
516
|
-
|
517
|
-
`rake db:migrate`
|
518
|
-
|
519
|
-
4. Add `has_paper_trail` to the models you want to track.
|
524
|
+
Please see the `rails2` branch.
|
520
525
|
|
521
526
|
|
522
527
|
## Testing
|
@@ -547,7 +552,8 @@ Many thanks to:
|
|
547
552
|
* Danny Trelogan
|
548
553
|
* [Mikl Kurkov](http://github.com/mkurkov)
|
549
554
|
* [Franco Catena](https://github.com/francocatena)
|
550
|
-
* [Emmanuel](https://github.com/emmanuel)
|
555
|
+
* [Emmanuel Gomez](https://github.com/emmanuel)
|
556
|
+
* [Matthew MacLeod](https://github.com/mattmacleod)
|
551
557
|
|
552
558
|
|
553
559
|
## Inspirations
|
@@ -558,5 +564,5 @@ Many thanks to:
|
|
558
564
|
|
559
565
|
## Intellectual Property
|
560
566
|
|
561
|
-
Copyright (c)
|
567
|
+
Copyright (c) 2011 Andy Stewart (boss@airbladesoftware.com).
|
562
568
|
Released under the MIT licence.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
require 'rails/generators/active_record/migration'
|
4
|
+
|
5
|
+
module PaperTrail
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
extend ActiveRecord::Generators::Migration
|
9
|
+
|
10
|
+
source_root File.expand_path('../templates', __FILE__)
|
11
|
+
|
12
|
+
desc 'Generates (but does not run) a migration to add a versions table.'
|
13
|
+
|
14
|
+
def create_migration_file
|
15
|
+
migration_template 'create_versions.rb', 'db/migrate/create_versions.rb'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -12,6 +12,7 @@ module PaperTrail
|
|
12
12
|
#
|
13
13
|
# Options:
|
14
14
|
# :ignore an array of attributes for which a new `Version` will not be created if only they change.
|
15
|
+
# :only inverse of `ignore` - a new `Version` will be created only for these attributes if supplied
|
15
16
|
# :meta a hash of extra data to store. You must add a column to the `versions` table for each key.
|
16
17
|
# Values are objects or procs (which are called with `self`, i.e. the model with the paper
|
17
18
|
# trail). See `PaperTrail::Controller.info_for_paper_trail` for how to store data from
|
@@ -25,8 +26,11 @@ module PaperTrail
|
|
25
26
|
attr_accessor :version
|
26
27
|
|
27
28
|
cattr_accessor :ignore
|
28
|
-
self.ignore = (options[:ignore] || []).map &:to_s
|
29
|
+
self.ignore = ([options[:ignore]].flatten.compact || []).map &:to_s
|
29
30
|
|
31
|
+
cattr_accessor :only
|
32
|
+
self.only = ([options[:only]].flatten.compact || []).map &:to_s
|
33
|
+
|
30
34
|
cattr_accessor :meta
|
31
35
|
self.meta = options[:meta] || {}
|
32
36
|
|
@@ -68,11 +72,11 @@ module PaperTrail
|
|
68
72
|
end
|
69
73
|
|
70
74
|
# Returns the object (not a Version) as it was at the given timestamp.
|
71
|
-
def version_at(timestamp)
|
75
|
+
def version_at(timestamp, reify_options={})
|
72
76
|
# Because a version stores how its object looked *before* the change,
|
73
77
|
# we need to look for the first version created *after* the timestamp.
|
74
78
|
version = versions.after(timestamp).first
|
75
|
-
version ? version.reify : self
|
79
|
+
version ? version.reify(reify_options) : self
|
76
80
|
end
|
77
81
|
|
78
82
|
# Returns the object (not a Version) as it was most recently.
|
@@ -147,6 +151,10 @@ module PaperTrail
|
|
147
151
|
end
|
148
152
|
|
149
153
|
def notably_changed
|
154
|
+
self.class.only.empty? ? changed_and_not_ignored : (changed_and_not_ignored & self.class.only)
|
155
|
+
end
|
156
|
+
|
157
|
+
def changed_and_not_ignored
|
150
158
|
changed - self.class.ignore
|
151
159
|
end
|
152
160
|
|
data/lib/paper_trail/version.rb
CHANGED
data/test/dummy/db/schema.rb
CHANGED
data/test/dummy/db/test.sqlite3
CHANGED
Binary file
|
data/test/unit/model_test.rb
CHANGED
@@ -10,10 +10,21 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
10
10
|
should_not_change('the number of versions') { Version.count }
|
11
11
|
end
|
12
12
|
|
13
|
-
context 'which updates an ignored column and a
|
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
16
|
end
|
17
|
+
|
18
|
+
context 'which updates a selected column' do
|
19
|
+
setup { @article.update_attributes :content => 'Some text here.' }
|
20
|
+
should_change('the number of versions', :by => 1) { Version.count }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'which updates a non-ignored and non-selected column' do
|
24
|
+
setup { @article.update_attributes :abstract => 'Other abstract'}
|
25
|
+
should_not_change('the number of versions') { Version.count }
|
26
|
+
end
|
27
|
+
|
17
28
|
end
|
18
29
|
|
19
30
|
|
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:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.
|
9
|
+
- 1
|
10
|
+
version: 2.0.1
|
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-02-
|
18
|
+
date: 2011-02-25 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -95,7 +95,7 @@ files:
|
|
95
95
|
- README.md
|
96
96
|
- Rakefile
|
97
97
|
- lib/generators/paper_trail/USAGE
|
98
|
-
- lib/generators/paper_trail/
|
98
|
+
- lib/generators/paper_trail/install_generator.rb
|
99
99
|
- lib/generators/paper_trail/templates/create_versions.rb
|
100
100
|
- lib/paper_trail.rb
|
101
101
|
- lib/paper_trail/config.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'rails/generators/named_base'
|
2
|
-
require 'rails/generators/migration'
|
3
|
-
|
4
|
-
class PaperTrailGenerator < Rails::Generators::NamedBase
|
5
|
-
include Rails::Generators::Migration
|
6
|
-
|
7
|
-
desc "Generates (but does not run) a migration to add a versions table."
|
8
|
-
source_root File.expand_path('../templates', __FILE__)
|
9
|
-
argument :name, :type => :string, :default => "create_versions"
|
10
|
-
|
11
|
-
# Implement the required interface for Rails::Generators::Migration.
|
12
|
-
# taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
|
13
|
-
def self.next_migration_number(dirname)
|
14
|
-
if ActiveRecord::Base.timestamped_migrations
|
15
|
-
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
16
|
-
else
|
17
|
-
"%.3d" % (current_migration_number(dirname) + 1)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def create_migration_file
|
22
|
-
migration_template 'create_versions.rb', 'db/migrate/create_versions.rb'
|
23
|
-
end
|
24
|
-
end
|