paper_trail 3.0.0.rc1 → 3.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -0
- data/README.md +1 -1
- data/lib/paper_trail.rb +17 -19
- data/lib/paper_trail/frameworks/cucumber.rb +1 -0
- data/lib/paper_trail/frameworks/rspec.rb +1 -0
- data/lib/paper_trail/has_paper_trail.rb +1 -2
- data/lib/paper_trail/version.rb +50 -46
- data/lib/paper_trail/version_number.rb +1 -1
- data/paper_trail.gemspec +3 -2
- data/spec/models/joined_version_spec.rb +47 -0
- data/spec/models/version_spec.rb +1 -1
- data/spec/requests/articles_spec.rb +17 -0
- data/spec/spec_helper.rb +1 -1
- data/test/dummy/app/versions/joined_version.rb +5 -0
- data/test/dummy/config/routes.rb +1 -1
- data/test/unit/version_test.rb +4 -4
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c33a2d2b003d082bede1ad845e1a4b158707782
|
4
|
+
data.tar.gz: 4e47a0a036926d20dca09f9cf22ab7c7c492dadd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae06bb1637cea1664c1f75ede2ac0195cac6f44a490d2988921a71d5461ac8d65cd96171ddbe4ad8d273340c9cba21aed937fdf755bdd56438d96ee49e261deb
|
7
|
+
data.tar.gz: 63587c8419be2ed421ffee4019564b84f64ed1536f5e323437070aab0144e3216800f32698154f98193d383087a0cc2e7ed04f647ed451aa73da8c2a281fbd79
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
## 3.0.0 (Unreleased)
|
2
2
|
|
3
|
+
- [#295](https://github.com/airblade/paper_trail/issues/295) - Explicitly specify table name for version class when
|
4
|
+
querying attributes. Prevents `AmbiguousColumn` errors on certain `JOIN` statements.
|
3
5
|
- [#289](https://github.com/airblade/paper_trail/pull/289) - Use `ActiveSupport::Concern` for implementation of base functionality on
|
4
6
|
`PaperTrail::Version` class. Increases flexibility and makes it easier to use custom version classes with multiple `ActiveRecord` connections.
|
5
7
|
- [#288](https://github.com/airblade/paper_trail/issues/288) - Change all scope declarations to class methods on the `PaperTrail::Version`
|
data/README.md
CHANGED
@@ -64,7 +64,7 @@ steps for setting up your app with `PaperTrail` will look something like this:
|
|
64
64
|
|
65
65
|
1. Add `PaperTrail` to your `Gemfile`.
|
66
66
|
|
67
|
-
`gem 'paper_trail', '>= 3.0.0.
|
67
|
+
`gem 'paper_trail', '>= 3.0.0.rc1'`
|
68
68
|
|
69
69
|
2. Generate a migration to add a `versions` table to your database.
|
70
70
|
|
data/lib/paper_trail.rb
CHANGED
@@ -5,7 +5,6 @@ require 'paper_trail/cleaner'
|
|
5
5
|
# Require serializers
|
6
6
|
Dir[File.join(File.dirname(__FILE__), 'paper_trail', 'serializers', '*.rb')].each { |file| require file }
|
7
7
|
|
8
|
-
# PaperTrail's module methods can be called in both models and controllers.
|
9
8
|
module PaperTrail
|
10
9
|
extend PaperTrail::Cleaner
|
11
10
|
|
@@ -20,18 +19,18 @@ module PaperTrail
|
|
20
19
|
!!PaperTrail.config.enabled
|
21
20
|
end
|
22
21
|
|
22
|
+
# Sets whether PaperTrail is enabled or disabled for the current request.
|
23
|
+
def self.enabled_for_controller=(value)
|
24
|
+
paper_trail_store[:request_enabled_for_controller] = value
|
25
|
+
end
|
26
|
+
|
23
27
|
# Returns `true` if PaperTrail is enabled for the request, `false` otherwise.
|
24
28
|
#
|
25
|
-
# See `PaperTrail::Controller#paper_trail_enabled_for_controller`.
|
29
|
+
# See `PaperTrail::Rails::Controller#paper_trail_enabled_for_controller`.
|
26
30
|
def self.enabled_for_controller?
|
27
31
|
!!paper_trail_store[:request_enabled_for_controller]
|
28
32
|
end
|
29
33
|
|
30
|
-
# Sets whether PaperTrail is enabled or disabled for the current request.
|
31
|
-
def self.enabled_for_controller=(value)
|
32
|
-
paper_trail_store[:request_enabled_for_controller] = value
|
33
|
-
end
|
34
|
-
|
35
34
|
# Set the field which records when a version was created.
|
36
35
|
def self.timestamp_field=(field_name)
|
37
36
|
PaperTrail.config.timestamp_field = field_name
|
@@ -42,11 +41,6 @@ module PaperTrail
|
|
42
41
|
PaperTrail.config.timestamp_field
|
43
42
|
end
|
44
43
|
|
45
|
-
# Returns who is reponsible for any changes that occur.
|
46
|
-
def self.whodunnit
|
47
|
-
paper_trail_store[:whodunnit]
|
48
|
-
end
|
49
|
-
|
50
44
|
# Sets who is responsible for any changes that occur.
|
51
45
|
# You would normally use this in a migration or on the console,
|
52
46
|
# when working with models directly. In a controller it is set
|
@@ -55,12 +49,9 @@ module PaperTrail
|
|
55
49
|
paper_trail_store[:whodunnit] = value
|
56
50
|
end
|
57
51
|
|
58
|
-
# Returns
|
59
|
-
|
60
|
-
|
61
|
-
# See `PaperTrail::Controller#info_for_paper_trail`.
|
62
|
-
def self.controller_info
|
63
|
-
paper_trail_store[:controller_info]
|
52
|
+
# Returns who is reponsible for any changes that occur.
|
53
|
+
def self.whodunnit
|
54
|
+
paper_trail_store[:whodunnit]
|
64
55
|
end
|
65
56
|
|
66
57
|
# Sets any information from the controller that you want PaperTrail
|
@@ -69,6 +60,14 @@ module PaperTrail
|
|
69
60
|
paper_trail_store[:controller_info] = value
|
70
61
|
end
|
71
62
|
|
63
|
+
# Returns any information from the controller that you want
|
64
|
+
# PaperTrail to store.
|
65
|
+
#
|
66
|
+
# See `PaperTrail::Rails::Controller#info_for_paper_trail`.
|
67
|
+
def self.controller_info
|
68
|
+
paper_trail_store[:controller_info]
|
69
|
+
end
|
70
|
+
|
72
71
|
# Getter and Setter for PaperTrail Serializer
|
73
72
|
def self.serializer=(value)
|
74
73
|
PaperTrail.config.serializer = value
|
@@ -98,7 +97,6 @@ module PaperTrail
|
|
98
97
|
def self.configure
|
99
98
|
yield config
|
100
99
|
end
|
101
|
-
|
102
100
|
end
|
103
101
|
|
104
102
|
# Ensure `ProtectedAttributes` gem gets required if it is available before the `Version` class gets loaded in
|
@@ -5,7 +5,6 @@ module PaperTrail
|
|
5
5
|
base.send :extend, ClassMethods
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
8
|
module ClassMethods
|
10
9
|
# Declare this in your model to track every create, update, and destroy. Each version of
|
11
10
|
# the model is available in the `versions` association.
|
@@ -324,7 +323,7 @@ module PaperTrail
|
|
324
323
|
end
|
325
324
|
|
326
325
|
def paper_trail_switched_on?
|
327
|
-
PaperTrail.enabled? && PaperTrail.enabled_for_controller? && self.
|
326
|
+
PaperTrail.enabled? && PaperTrail.enabled_for_controller? && self.paper_trail_enabled_for_model
|
328
327
|
end
|
329
328
|
|
330
329
|
def save_version?
|
data/lib/paper_trail/version.rb
CHANGED
@@ -35,17 +35,19 @@ module PaperTrail
|
|
35
35
|
# These methods accept a timestamp or a version and returns other versions that come before or after
|
36
36
|
def subsequent(obj)
|
37
37
|
obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self)
|
38
|
-
where("#{PaperTrail.timestamp_field} > ?", obj).
|
38
|
+
where("#{table_name}.#{PaperTrail.timestamp_field} > ?", obj).
|
39
|
+
order("#{table_name}.#{PaperTrail.timestamp_field} ASC")
|
39
40
|
end
|
40
41
|
|
41
42
|
def preceding(obj)
|
42
43
|
obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self)
|
43
|
-
where("#{PaperTrail.timestamp_field} < ?", obj).
|
44
|
+
where("#{table_name}.#{PaperTrail.timestamp_field} < ?", obj).
|
45
|
+
order("#{table_name}.#{PaperTrail.timestamp_field} DESC")
|
44
46
|
end
|
45
47
|
|
46
48
|
def between(start_time, end_time)
|
47
|
-
where("#{PaperTrail.timestamp_field} > ? AND #{PaperTrail.timestamp_field} < ?",
|
48
|
-
order("#{PaperTrail.timestamp_field} ASC")
|
49
|
+
where("#{table_name}.#{PaperTrail.timestamp_field} > ? AND #{table_name}.#{PaperTrail.timestamp_field} < ?",
|
50
|
+
start_time, end_time).order("#{table_name}.#{PaperTrail.timestamp_field} ASC")
|
49
51
|
end
|
50
52
|
|
51
53
|
# Returns whether the `object` column is using the `json` type supported by PostgreSQL
|
@@ -71,56 +73,56 @@ module PaperTrail
|
|
71
73
|
# set to a float to change the lookback time (check whether your db supports
|
72
74
|
# sub-second datetimes if you want them).
|
73
75
|
def reify(options = {})
|
76
|
+
return nil if object.nil?
|
77
|
+
|
74
78
|
without_identity_map do
|
75
79
|
options[:has_one] = 3 if options[:has_one] == true
|
76
80
|
options.reverse_merge! :has_one => false
|
77
81
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
82
|
+
attrs = self.class.object_col_is_json? ? object : PaperTrail.serializer.load(object)
|
83
|
+
|
84
|
+
# Normally a polymorphic belongs_to relationship allows us
|
85
|
+
# to get the object we belong to by calling, in this case,
|
86
|
+
# `item`. However this returns nil if `item` has been
|
87
|
+
# destroyed, and we need to be able to retrieve destroyed
|
88
|
+
# objects.
|
89
|
+
#
|
90
|
+
# In this situation we constantize the `item_type` to get hold of
|
91
|
+
# the class...except when the stored object's attributes
|
92
|
+
# include a `type` key. If this is the case, the object
|
93
|
+
# we belong to is using single table inheritance and the
|
94
|
+
# `item_type` will be the base class, not the actual subclass.
|
95
|
+
# If `type` is present but empty, the class is the base class.
|
96
|
+
|
97
|
+
if item
|
98
|
+
model = item
|
99
|
+
# Look for attributes that exist in the model and not in this version. These attributes should be set to nil.
|
100
|
+
(model.attribute_names - attrs.keys).each { |k| attrs[k] = nil }
|
101
|
+
else
|
102
|
+
inheritance_column_name = item_type.constantize.inheritance_column
|
103
|
+
class_name = attrs[inheritance_column_name].blank? ? item_type : attrs[inheritance_column_name]
|
104
|
+
klass = class_name.constantize
|
105
|
+
model = klass.new
|
106
|
+
end
|
104
107
|
|
105
|
-
|
108
|
+
model.class.unserialize_attributes_for_paper_trail attrs
|
106
109
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
110
|
+
# Set all the attributes in this version on the model
|
111
|
+
attrs.each do |k, v|
|
112
|
+
if model.respond_to?("#{k}=")
|
113
|
+
model[k.to_sym] = v
|
114
|
+
else
|
115
|
+
logger.warn "Attribute #{k} does not exist on #{item_type} (Version id: #{id})."
|
114
116
|
end
|
117
|
+
end
|
115
118
|
|
116
|
-
|
119
|
+
model.send "#{model.class.version_association_name}=", self
|
117
120
|
|
118
|
-
|
119
|
-
|
120
|
-
end
|
121
|
-
|
122
|
-
model
|
121
|
+
unless options[:has_one] == false
|
122
|
+
reify_has_ones model, options[:has_one]
|
123
123
|
end
|
124
|
+
|
125
|
+
model
|
124
126
|
end
|
125
127
|
end
|
126
128
|
|
@@ -163,8 +165,10 @@ module PaperTrail
|
|
163
165
|
end
|
164
166
|
|
165
167
|
def index
|
166
|
-
|
167
|
-
|
168
|
+
table_name = self.class.table_name
|
169
|
+
@index ||= sibling_versions.
|
170
|
+
select(["#{table_name}.#{PaperTrail.timestamp_field}", "#{table_name}.#{self.class.primary_key}"]).
|
171
|
+
order("#{table_name}.#{PaperTrail.timestamp_field} ASC").index(self)
|
168
172
|
end
|
169
173
|
|
170
174
|
private
|
data/paper_trail.gemspec
CHANGED
@@ -5,11 +5,11 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.name = 'paper_trail'
|
6
6
|
s.version = PaperTrail::VERSION
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
|
-
s.summary = "Track changes to your models' data.
|
8
|
+
s.summary = "Track changes to your models' data. Good for auditing or versioning."
|
9
9
|
s.description = s.summary
|
10
10
|
s.homepage = 'http://github.com/airblade/paper_trail'
|
11
11
|
s.authors = ['Andy Stewart', 'Ben Atkins']
|
12
|
-
s.email = '
|
12
|
+
s.email = 'batkinz@gmail.com'
|
13
13
|
s.license = 'MIT'
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
|
23
23
|
s.add_development_dependency 'rake'
|
24
24
|
s.add_development_dependency 'shoulda', '~> 3.5'
|
25
|
+
# s.add_development_dependency 'shoulda-matchers', '~> 1.5' # needed for ActiveRecord < 4
|
25
26
|
s.add_development_dependency 'ffaker', '>= 1.15'
|
26
27
|
s.add_development_dependency 'railties', ['>= 3.0', '< 5.0']
|
27
28
|
s.add_development_dependency 'sinatra', '~> 1.0'
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JoinedVersion, :versioning => true do
|
4
|
+
it { JoinedVersion.superclass.should == PaperTrail::Version }
|
5
|
+
|
6
|
+
let(:widget) { Widget.create!(:name => Faker::Name.name) }
|
7
|
+
let(:version) { JoinedVersion.first }
|
8
|
+
|
9
|
+
describe "Scopes" do
|
10
|
+
describe "default_scope" do
|
11
|
+
it { JoinedVersion.default_scopes.should_not be_empty }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "VersionConcern::ClassMethods" do
|
15
|
+
before { widget } # persist a widget
|
16
|
+
|
17
|
+
describe :subsequent do
|
18
|
+
it "shouldn't error out when there is a default_scope that joins" do
|
19
|
+
JoinedVersion.subsequent(version).first
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe :preceding do
|
24
|
+
it "shouldn't error out when there is a default scope that joins" do
|
25
|
+
JoinedVersion.preceding(version).first
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe :between do
|
30
|
+
it "shouldn't error out when there is a default scope that joins" do
|
31
|
+
JoinedVersion.between(Time.now, 1.minute.from_now).first
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "Methods" do
|
38
|
+
describe :index do
|
39
|
+
it { should respond_to(:index) }
|
40
|
+
|
41
|
+
it "shouldn't error out when there is a default scope that joins" do
|
42
|
+
widget # persist a widget
|
43
|
+
version.index
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/spec/models/version_spec.rb
CHANGED
@@ -33,7 +33,7 @@ describe PaperTrail::Version do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
describe :version_author do
|
36
|
-
it { should respond_to(:
|
36
|
+
it { should respond_to(:version_author) }
|
37
37
|
|
38
38
|
it "should be an alias for the `terminator` method" do
|
39
39
|
subject.method(:version_author).should == subject.method(:terminator)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Articles" do
|
4
|
+
let(:valid_params) { { :article => { :title => 'Doh', :content => Faker::Lorem.sentence } } }
|
5
|
+
|
6
|
+
context "versioning disabled" do
|
7
|
+
specify { PaperTrail.enabled?.should be_false }
|
8
|
+
|
9
|
+
it "should not create a version" do
|
10
|
+
expect { post articles_path(valid_params) }.to_not change(PaperTrail::Version, :count)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not leak the state of the `PaperTrail.enabled_for_controlller?` into the next test" do
|
14
|
+
PaperTrail.enabled_for_controller?.should be_true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,5 @@
|
|
1
|
+
# The purpose of this custom version class is to test the scope methods on the VersionConcern::ClassMethods
|
2
|
+
# module. See https://github.com/airblade/paper_trail/issues/295 for more details.
|
3
|
+
class JoinedVersion < PaperTrail::Version
|
4
|
+
default_scope { joins('INNER JOIN widgets ON widgets.id = versions.item_id') }
|
5
|
+
end
|
data/test/dummy/config/routes.rb
CHANGED
data/test/unit/version_test.rb
CHANGED
@@ -62,7 +62,7 @@ class PaperTrail::VersionTest < ActiveSupport::TestCase
|
|
62
62
|
should "return all versions that were created before the Timestamp; descendingly by order of the `PaperTrail.timestamp_field`" do
|
63
63
|
value = PaperTrail::Version.subsequent(1.hour.ago)
|
64
64
|
assert_equal value, @animal.versions.to_a
|
65
|
-
assert_not_nil value.to_sql.match(/ORDER BY created_at ASC\z/)
|
65
|
+
assert_not_nil value.to_sql.match(/ORDER BY versions.created_at ASC\z/)
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -72,7 +72,7 @@ class PaperTrail::VersionTest < ActiveSupport::TestCase
|
|
72
72
|
assert_equal value, @animal.versions.to_a.tap { |assoc| assoc.shift }
|
73
73
|
# This asssertion can't pass in Ruby18 because the `strftime` method doesn't accept the %6 (milliseconds) command
|
74
74
|
if RUBY_VERSION.to_f >= 1.9 and not defined?(JRUBY_VERSION)
|
75
|
-
assert_not_nil value.to_sql.match(/WHERE \(created_at > '#{@animal.versions.first.send(PaperTrail.timestamp_field).strftime("%F %T.%6N")}'\)/)
|
75
|
+
assert_not_nil value.to_sql.match(/WHERE \(versions.created_at > '#{@animal.versions.first.send(PaperTrail.timestamp_field).strftime("%F %T.%6N")}'\)/)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
@@ -85,7 +85,7 @@ class PaperTrail::VersionTest < ActiveSupport::TestCase
|
|
85
85
|
should "return all versions that were created before the Timestamp; descendingly by order of the `PaperTrail.timestamp_field`" do
|
86
86
|
value = PaperTrail::Version.preceding(Time.now)
|
87
87
|
assert_equal value, @animal.versions.reverse
|
88
|
-
assert_not_nil value.to_sql.match(/ORDER BY created_at DESC\z/)
|
88
|
+
assert_not_nil value.to_sql.match(/ORDER BY versions.created_at DESC\z/)
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
@@ -95,7 +95,7 @@ class PaperTrail::VersionTest < ActiveSupport::TestCase
|
|
95
95
|
assert_equal value, @animal.versions.to_a.tap { |assoc| assoc.pop }.reverse
|
96
96
|
# This asssertion can't pass in Ruby18 because the `strftime` method doesn't accept the %6 (milliseconds) command
|
97
97
|
if RUBY_VERSION.to_f >= 1.9 and not defined?(JRUBY_VERSION)
|
98
|
-
assert_not_nil value.to_sql.match(/WHERE \(created_at < '#{@animal.versions.last.send(PaperTrail.timestamp_field).strftime("%F %T.%6N")}'\)/)
|
98
|
+
assert_not_nil value.to_sql.match(/WHERE \(versions.created_at < '#{@animal.versions.last.send(PaperTrail.timestamp_field).strftime("%F %T.%6N")}'\)/)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paper_trail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.
|
4
|
+
version: 3.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Stewart
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -169,8 +169,8 @@ dependencies:
|
|
169
169
|
- - ~>
|
170
170
|
- !ruby/object:Gem::Version
|
171
171
|
version: '1.2'
|
172
|
-
description: Track changes to your models' data.
|
173
|
-
email:
|
172
|
+
description: Track changes to your models' data. Good for auditing or versioning.
|
173
|
+
email: batkinz@gmail.com
|
174
174
|
executables: []
|
175
175
|
extensions: []
|
176
176
|
extra_rdoc_files: []
|
@@ -202,10 +202,12 @@ files:
|
|
202
202
|
- lib/paper_trail/version.rb
|
203
203
|
- lib/paper_trail/version_number.rb
|
204
204
|
- paper_trail.gemspec
|
205
|
+
- spec/models/joined_version_spec.rb
|
205
206
|
- spec/models/version_spec.rb
|
206
207
|
- spec/models/widget_spec.rb
|
207
208
|
- spec/modules/version_concern_spec.rb
|
208
209
|
- spec/paper_trail_spec.rb
|
210
|
+
- spec/requests/articles_spec.rb
|
209
211
|
- spec/spec_helper.rb
|
210
212
|
- test/custom_json_serializer.rb
|
211
213
|
- test/dummy/Rakefile
|
@@ -232,6 +234,7 @@ files:
|
|
232
234
|
- test/dummy/app/models/translation.rb
|
233
235
|
- test/dummy/app/models/widget.rb
|
234
236
|
- test/dummy/app/models/wotsit.rb
|
237
|
+
- test/dummy/app/versions/joined_version.rb
|
235
238
|
- test/dummy/app/versions/post_version.rb
|
236
239
|
- test/dummy/app/views/layouts/application.html.erb
|
237
240
|
- test/dummy/config.ru
|
@@ -305,12 +308,14 @@ rubyforge_project:
|
|
305
308
|
rubygems_version: 2.1.10
|
306
309
|
signing_key:
|
307
310
|
specification_version: 4
|
308
|
-
summary: Track changes to your models' data.
|
311
|
+
summary: Track changes to your models' data. Good for auditing or versioning.
|
309
312
|
test_files:
|
313
|
+
- spec/models/joined_version_spec.rb
|
310
314
|
- spec/models/version_spec.rb
|
311
315
|
- spec/models/widget_spec.rb
|
312
316
|
- spec/modules/version_concern_spec.rb
|
313
317
|
- spec/paper_trail_spec.rb
|
318
|
+
- spec/requests/articles_spec.rb
|
314
319
|
- spec/spec_helper.rb
|
315
320
|
- test/custom_json_serializer.rb
|
316
321
|
- test/dummy/Rakefile
|
@@ -337,6 +342,7 @@ test_files:
|
|
337
342
|
- test/dummy/app/models/translation.rb
|
338
343
|
- test/dummy/app/models/widget.rb
|
339
344
|
- test/dummy/app/models/wotsit.rb
|
345
|
+
- test/dummy/app/versions/joined_version.rb
|
340
346
|
- test/dummy/app/versions/post_version.rb
|
341
347
|
- test/dummy/app/views/layouts/application.html.erb
|
342
348
|
- test/dummy/config.ru
|