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 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