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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9bf681540718f57e237227b7237dd75588325471
4
- data.tar.gz: 53ca44944999542128882287cfeb7a2a0c3957e6
3
+ metadata.gz: 0c33a2d2b003d082bede1ad845e1a4b158707782
4
+ data.tar.gz: 4e47a0a036926d20dca09f9cf22ab7c7c492dadd
5
5
  SHA512:
6
- metadata.gz: 0c71e183ad7347c6d2a4202b8f4c5a00cfda6c8945a91edf325d5dbbde3c1458bee5e06cbf135deb3f33446038de435e51682d29b68b0aaf9fba77925c5e839b
7
- data.tar.gz: 49fc4e1bc5e418bf1565749e8853f6516dc937fca663638da0a011dd47d6284dc53338cf479f6e8ad3ff74a7f53a93f168708108ce76a93c0474161c49d156d1
6
+ metadata.gz: ae06bb1637cea1664c1f75ede2ac0195cac6f44a490d2988921a71d5461ac8d65cd96171ddbe4ad8d273340c9cba21aed937fdf755bdd56438d96ee49e261deb
7
+ data.tar.gz: 63587c8419be2ed421ffee4019564b84f64ed1536f5e323437070aab0144e3216800f32698154f98193d383087a0cc2e7ed04f647ed451aa73da8c2a281fbd79
@@ -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.beta1'`
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
 
@@ -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 any information from the controller that you want
59
- # PaperTrail to store.
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
@@ -1,6 +1,7 @@
1
1
  # before hook for Cucumber
2
2
  before do
3
3
  ::PaperTrail.enabled = false
4
+ ::PaperTrail.enabled_for_controller = true
4
5
  ::PaperTrail.whodunnit = nil
5
6
  ::PaperTrail.controller_info = {} if defined? ::Rails
6
7
  end
@@ -7,6 +7,7 @@ RSpec.configure do |config|
7
7
 
8
8
  config.before(:each) do
9
9
  ::PaperTrail.enabled = false
10
+ ::PaperTrail.enabled_for_controller = true
10
11
  ::PaperTrail.whodunnit = nil
11
12
  ::PaperTrail.controller_info = {} if defined?(::Rails) && defined?(::RSpec::Rails)
12
13
  end
@@ -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.class.paper_trail_enabled_for_model
326
+ PaperTrail.enabled? && PaperTrail.enabled_for_controller? && self.paper_trail_enabled_for_model
328
327
  end
329
328
 
330
329
  def save_version?
@@ -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).order("#{PaperTrail.timestamp_field} ASC")
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).order("#{PaperTrail.timestamp_field} DESC")
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} < ?", start_time, end_time).
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
- unless object.nil?
79
- attrs = self.class.object_col_is_json? ? object : PaperTrail.serializer.load(object)
80
-
81
- # Normally a polymorphic belongs_to relationship allows us
82
- # to get the object we belong to by calling, in this case,
83
- # `item`. However this returns nil if `item` has been
84
- # destroyed, and we need to be able to retrieve destroyed
85
- # objects.
86
- #
87
- # In this situation we constantize the `item_type` to get hold of
88
- # the class...except when the stored object's attributes
89
- # include a `type` key. If this is the case, the object
90
- # we belong to is using single table inheritance and the
91
- # `item_type` will be the base class, not the actual subclass.
92
- # If `type` is present but empty, the class is the base class.
93
-
94
- if item
95
- model = item
96
- # Look for attributes that exist in the model and not in this version. These attributes should be set to nil.
97
- (model.attribute_names - attrs.keys).each { |k| attrs[k] = nil }
98
- else
99
- inheritance_column_name = item_type.constantize.inheritance_column
100
- class_name = attrs[inheritance_column_name].blank? ? item_type : attrs[inheritance_column_name]
101
- klass = class_name.constantize
102
- model = klass.new
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
- model.class.unserialize_attributes_for_paper_trail attrs
108
+ model.class.unserialize_attributes_for_paper_trail attrs
106
109
 
107
- # Set all the attributes in this version on the model
108
- attrs.each do |k, v|
109
- if model.respond_to?("#{k}=")
110
- model[k.to_sym] = v
111
- else
112
- logger.warn "Attribute #{k} does not exist on #{item_type} (Version id: #{id})."
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
- model.send "#{model.class.version_association_name}=", self
119
+ model.send "#{model.class.version_association_name}=", self
117
120
 
118
- unless options[:has_one] == false
119
- reify_has_ones model, options[:has_one]
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
- @index ||= sibling_versions.select([PaperTrail.timestamp_field, self.class.primary_key.to_sym]).
167
- order("#{PaperTrail.timestamp_field} ASC").index(self)
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
@@ -1,3 +1,3 @@
1
1
  module PaperTrail
2
- VERSION = '3.0.0.rc1'
2
+ VERSION = '3.0.0.rc2'
3
3
  end
@@ -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. Good for auditing or versioning."
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 = 'boss@airbladesoftware.com'
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
@@ -33,7 +33,7 @@ describe PaperTrail::Version do
33
33
  end
34
34
 
35
35
  describe :version_author do
36
- it { should respond_to(:terminator) }
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
@@ -39,5 +39,5 @@ RSpec.configure do |config|
39
39
  # order dependency and want to debug it, you can fix the order by providing
40
40
  # the seed, which is printed after each run.
41
41
  # --seed 1234
42
- config.order = 'random'
42
+ # config.order = 'random'
43
43
  end
@@ -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
@@ -1,4 +1,4 @@
1
1
  Dummy::Application.routes.draw do
2
2
  resources :articles, :only => [:create]
3
- resources :widgets
3
+ resources :widgets, :only => [:create, :update, :destroy]
4
4
  end
@@ -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.rc1
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-10-29 00:00:00.000000000 Z
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. Good for auditing or versioning.
173
- email: boss@airbladesoftware.com
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. Good for auditing or versioning.
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