paper_trail 3.0.0.rc1 → 3.0.0.rc2
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/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
|