draftsman 0.4.0 → 0.5.0

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: cd9e61138b818bff3ff18a8f3039e2e890cd6f90
4
- data.tar.gz: c84a08a47b0e0d19995a4c00c6a3a5de0ae48d61
3
+ metadata.gz: f18e08326633f6b3b20b26217a23d1d81042d158
4
+ data.tar.gz: 4d0ab78461094ab35bc1d4b77322a88237eed9a1
5
5
  SHA512:
6
- metadata.gz: 200f68df8dbc6ab78eef9fad8dbfbdfcf33f5a57be1c4f5d3fdc8f8cb199254b20800f7170f37a99bb2d05aca071bd21704fafd8a78e42e653938fff7fd689d9
7
- data.tar.gz: 613df4b0ad438fa2fb73fe3930d8201df1941e68640df7e42fb17c3f616b1a739519f16879bcf9b648aa3c3f92425cff1daf8404f96d44ea2edfe553ef7c7445
6
+ metadata.gz: c8a87e165dcaf68c72f65a97471c418e4bde43de5c07da002ab47b13ec9067e52744bf25b6909ba74199765d61a8619b779692e8f88ece0a910af182cae2bcd9
7
+ data.tar.gz: d28d6bf39bc7c4e7ef5ea2891445529687eddb54142dc79bc9c5f676273923c3b85f8865c9429698e62b6d23f540bdc1d429567c7365b381adaa269203eea43f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.5.0 - August 20, 2016
4
+
5
+ - [@npezza93](https://github.com/npezza93)
6
+ [Implemented](https://github.com/liveeditor/draftsman/pull/45)
7
+ [#44](https://github.com/liveeditor/draftsman/issues/44)
8
+ Rails 5 compatibility
9
+
3
10
  ## 0.4.0 - April 5, 2016
4
11
 
5
12
  - [@npafundi](https://github.com/npafundi)
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Draftsman v0.4.0 (alpha)
1
+ # Draftsman v0.5.0 (beta)
2
2
 
3
3
  Draftsman is a Ruby gem that lets you create draft versions of your database records. If you're developing a system in
4
4
  need of simple drafts or a publishing approval queue, then Draftsman just might be what you need.
@@ -41,18 +41,18 @@ source: it's a nice clean example of a gem that hooks into Rails and Sinatra.
41
41
 
42
42
  ## Compatibility
43
43
 
44
- Compatible with ActiveRecord 3 and 4.
44
+ Compatible with ActiveRecord 3, 4, and 5.
45
45
 
46
46
  Works well with Rails, Sinatra, or any other application that depends on ActiveRecord.
47
47
 
48
48
  ## Installation
49
49
 
50
- ### Rails 3 & 4
50
+ ### Rails 3, 4, and 5
51
51
 
52
52
  Add Draftsman to your `Gemfile`.
53
53
 
54
54
  ```ruby
55
- gem 'draftsman', '~> 0.4.0'
55
+ gem 'draftsman', '~> 0.5.0'
56
56
  ```
57
57
 
58
58
  Or if you want to grab the latest from `master`:
@@ -323,8 +323,8 @@ this. It also presents all data in its drafted form, if a draft exists.
323
323
 
324
324
  ```ruby
325
325
  class Admin::WidgetsController < Admin::BaseController
326
- before_filter :find_widget, :only => [:show, :edit, :update, :destroy]
327
- before_filter :reify_widget, :only => [:show, :edit]
326
+ before_action :find_widget, :only => [:show, :edit, :update, :destroy]
327
+ before_action :reify_widget, :only => [:show, :edit]
328
328
 
329
329
  def index
330
330
  # The `live` scope gives us widgets that aren't in the trash.
@@ -423,7 +423,7 @@ other workflow action that you would like for your application to provide for dr
423
423
 
424
424
  ```ruby
425
425
  class Admin::DraftsController < Admin::BaseController
426
- before_filter :find_draft, :only => [:show, :update, :destroy]
426
+ before_action :find_draft, :only => [:show, :update, :destroy]
427
427
 
428
428
  def index
429
429
  @drafts = Draftsman::Draft.includes(:item).order('updated_at DESC')
data/draftsman.gemspec CHANGED
@@ -16,12 +16,12 @@ Gem::Specification.new do |s|
16
16
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
17
  s.require_paths = ['lib']
18
18
 
19
- s.add_dependency 'activerecord', ['>= 3.0', '< 5.0']
19
+ s.add_dependency 'activerecord', ['>= 3.0', '< 5.1']
20
20
 
21
- s.add_development_dependency 'rake', '~> 10.5'
22
- s.add_development_dependency 'railties', ['>= 3.0', '< 5.0']
21
+ s.add_development_dependency 'rake'
22
+ s.add_development_dependency 'railties', ['>= 3.0', '< 5.1']
23
23
  s.add_development_dependency 'sinatra', '~> 1.0'
24
- s.add_development_dependency 'rspec-rails', '3.2.1'
24
+ s.add_development_dependency 'rspec-rails', '~> 3.5'
25
25
 
26
26
  # JRuby support for the test ENV
27
27
  if defined?(JRUBY_VERSION)
data/lib/draftsman.rb CHANGED
@@ -7,6 +7,29 @@ Dir[File.join(File.dirname(__FILE__), 'draftsman', 'serializers', '*.rb')].each
7
7
 
8
8
  # Draftsman's module methods can be called in both models and controllers.
9
9
  module Draftsman
10
+ # Switches Draftsman on or off.
11
+ def self.enabled=(value)
12
+ Draftsman.config.enabled = value
13
+ end
14
+
15
+ # Returns `true` if Draftsman is on, `false` otherwise.
16
+ # Draftsman is enabled by default.
17
+ def self.enabled?
18
+ !!Draftsman.config.enabled
19
+ end
20
+
21
+ # Sets whether Draftsman is enabled or disabled for the current request.
22
+ def self.enabled_for_controller=(value)
23
+ draftsman_store[:request_enabled_for_controller] = value
24
+ end
25
+
26
+ # Returns `true` if Draftsman is enabled for the request, `false` otherwise.
27
+ #
28
+ # See `Draftsman::Rails::Controller#draftsman_enabled_for_controller`.
29
+ def self.enabled_for_controller?
30
+ !!draftsman_store[:request_enabled_for_controller]
31
+ end
32
+
10
33
  # Returns whether or not ActiveRecord is configured to require mass assignment whitelisting via `attr_accessible`.
11
34
  def self.active_record_protected_attributes?
12
35
  @active_record_protected_attributes ||= ActiveRecord::VERSION::STRING.to_f < 4.0 || defined?(ProtectedAttributes)
@@ -0,0 +1,89 @@
1
+ module Draftsman
2
+ module AttributesSerialization
3
+ class NoOpAttribute
4
+ def type_cast_for_database(value)
5
+ value
6
+ end
7
+
8
+ def type_cast_from_database(data)
9
+ data
10
+ end
11
+ end
12
+ NO_OP_ATTRIBUTE = NoOpAttribute.new
13
+
14
+ class SerializedAttribute
15
+ def initialize(coder)
16
+ @coder = coder.respond_to?(:dump) ? coder : Draftsman.serializer
17
+ end
18
+
19
+ def type_cast_for_database(value)
20
+ @coder.dump(value)
21
+ end
22
+
23
+ def type_cast_from_database(data)
24
+ @coder.load(data)
25
+ end
26
+ end
27
+
28
+ SERIALIZE, DESERIALIZE =
29
+ if ::ActiveRecord::VERSION::MAJOR >= 5
30
+ [:serialize, :deserialize]
31
+ else
32
+ [:type_cast_for_database, :type_cast_from_database]
33
+ end
34
+
35
+ if ::ActiveRecord::VERSION::STRING < '4.2'
36
+ # Backport Rails 4.2 and later's `type_for_attribute` to build
37
+ # on a common interface.
38
+ def type_for_attribute(attr_name)
39
+ serialized_attribute_types[attr_name.to_s] || NO_OP_ATTRIBUTE
40
+ end
41
+
42
+ def serialized_attribute_types
43
+ @attribute_types ||= Hash[serialized_attributes.map do |attr_name, coder|
44
+ [attr_name, SerializedAttribute.new(coder)]
45
+ end]
46
+ end
47
+ private :serialized_attribute_types
48
+ end
49
+
50
+ # Used for `Version#object` attribute.
51
+ def serialize_attributes_for_draftsman(attributes)
52
+ alter_attributes_for_draftsman(SERIALIZE, attributes)
53
+ end
54
+
55
+ def unserialize_attributes_for_draftsman(attributes)
56
+ alter_attributes_for_draftsman(DESERIALIZE, attributes)
57
+ end
58
+
59
+ def alter_attributes_for_draftsman(serializer, attributes)
60
+ # Don't serialize before values before inserting into columns of type
61
+ # `JSON` on `PostgreSQL` databases.
62
+ return attributes if self.draft_class.object_col_is_json?
63
+
64
+ attributes.each do |key, value|
65
+ attributes[key] = type_for_attribute(key).send(serializer, value)
66
+ end
67
+ end
68
+
69
+ # Used for Version#object_changes attribute.
70
+ def serialize_draft_attribute_changes(changes)
71
+ alter_draft_attribute_changes(SERIALIZE, changes)
72
+ end
73
+
74
+ def unserialize_draft_attribute_changes(changes)
75
+ alter_draft_attribute_changes(DESERIALIZE, changes)
76
+ end
77
+
78
+ def alter_draft_attribute_changes(serializer, changes)
79
+ # Don't serialize before values before inserting into columns of type
80
+ # `JSON` on `PostgreSQL` databases.
81
+ return changes if self.draft_class.object_changes_col_is_json?
82
+
83
+ changes.clone.each do |key, change|
84
+ type = type_for_attribute(key)
85
+ changes[key] = Array(change).map { |value| type.send(serializer, value) }
86
+ end
87
+ end
88
+ end
89
+ end
@@ -7,7 +7,17 @@ module Draftsman
7
7
 
8
8
  def initialize
9
9
  @timestamp_field = :created_at
10
+ @mutex = Mutex.new
10
11
  @serializer = Draftsman::Serializers::Yaml
11
12
  end
13
+
14
+ # Indicates whether Draftsman is on or off. Default: true.
15
+ def enabled
16
+ @mutex.synchronize { !!@enabled }
17
+ end
18
+
19
+ def enabled=(enable)
20
+ @mutex.synchronize { @enabled = enable }
21
+ end
12
22
  end
13
23
  end
@@ -46,13 +46,7 @@ class Draftsman::Draft < ActiveRecord::Base
46
46
  def changeset
47
47
  return nil unless self.class.column_names.include? 'object_changes'
48
48
 
49
- _changes = self.class.object_changes_col_is_json? ? self.object_changes : Draftsman.serializer.load(self.object_changes)
50
-
51
- @changeset ||= HashWithIndifferentAccess.new(_changes).tap do |changes|
52
- item_type.constantize.unserialize_draft_attribute_changes(changes)
53
- end
54
- rescue
55
- {}
49
+ @changeset ||= load_changeset
56
50
  end
57
51
 
58
52
  # Returns whether or not this is a `create` event.
@@ -303,4 +297,20 @@ private
303
297
  block.call
304
298
  end
305
299
  end
300
+
301
+ def load_changeset
302
+ changes = HashWithIndifferentAccess.new(object_changes_deserialized)
303
+ item_type.constantize.unserialize_draft_attribute_changes(changes)
304
+ changes
305
+ rescue
306
+ {}
307
+ end
308
+
309
+ def object_changes_deserialized
310
+ if self.class.object_changes_col_is_json?
311
+ object_changes
312
+ else
313
+ Draftsman.serializer.load(object_changes)
314
+ end
315
+ end
306
316
  end
@@ -1,9 +1,23 @@
1
1
  module Draftsman
2
2
  module Rails
3
3
  module Controller
4
-
5
4
  def self.included(base)
6
- base.before_filter :set_draftsman_whodunnit, :set_draftsman_controller_info
5
+ before = [
6
+ :set_draftsman_enabled_for_controller,
7
+ :set_draftsman_controller_info
8
+ ]
9
+ after = [
10
+ :warn_about_not_setting_whodunnit
11
+ ]
12
+ if base.respond_to? :before_action
13
+ # Rails 4+
14
+ before.map { |sym| base.before_action sym }
15
+ after.map { |sym| base.after_action sym }
16
+ else
17
+ # Rails 3.
18
+ before.map { |sym| base.before_filter sym }
19
+ after.map { |sym| base.after_filter sym }
20
+ end
7
21
  end
8
22
 
9
23
  protected
@@ -14,7 +28,10 @@ module Draftsman
14
28
  # Override this method in your controller to call a different
15
29
  # method, e.g. `current_person`, or anything you like.
16
30
  def user_for_draftsman
17
- current_user if defined?(current_user)
31
+ return unless defined?(current_user)
32
+ ActiveSupport::VERSION::MAJOR >= 4 ? current_user.try!(:id) : current_user.try(:id)
33
+ rescue NoMethodError
34
+ current_user
18
35
  end
19
36
 
20
37
  # Returns any information about the controller or request that you
@@ -38,23 +55,54 @@ module Draftsman
38
55
  {}
39
56
  end
40
57
 
58
+ # Returns `true` (default) or `false` depending on whether Draftsman
59
+ # should be active for the current request.
60
+ #
61
+ # Override this method in your controller to specify when Draftsman
62
+ # should be off.
63
+ def draftsman_enabled_for_controller
64
+ ::Draftsman.enabled?
65
+ end
66
+
41
67
  private
42
68
 
69
+ # Tells Draftsman whether drafts should be saved in the current request.
70
+ def set_draftsman_enabled_for_controller
71
+ ::Draftsman.enabled_for_controller = draftsman_enabled_for_controller
72
+ end
73
+
43
74
  # Tells Draftsman who is responsible for any changes that occur.
44
75
  def set_draftsman_whodunnit
45
- ::Draftsman.whodunnit = user_for_draftsman
76
+ @set_draftsman_whodunnit_called = true
77
+ ::Draftsman.whodunnit = user_for_draftsman if ::Draftsman.enabled_for_controller?
46
78
  end
47
79
 
48
- # Tells Draftsman any information from the controller you want
49
- # to store alongside any changes that occur.
80
+ # Tells Draftsman any information from the controller you want to store
81
+ # alongside any changes that occur.
50
82
  def set_draftsman_controller_info
51
83
  ::Draftsman.controller_info = info_for_draftsman
52
84
  end
53
85
 
86
+ def warn_about_not_setting_whodunnit
87
+ enabled = ::Draftsman.enabled_for_controller?
88
+ user_present = user_for_draftsman.present?
89
+ whodunnit_blank = ::Draftsman.whodunnit.blank?
90
+ if enabled && user_present && whodunnit_blank && !@set_draftsman_whodunnit_called
91
+ ::Kernel.warn <<-EOS.strip_heredoc
92
+ user_for_draftsman is present, but whodunnit has not been set.
93
+ Draftsman no longer adds the set_draftsman_whodunnit callback for
94
+ you. To continue recording whodunnit, please add this before_action
95
+ callback to your ApplicationController . For more information,
96
+ please see https://git.io/vrTsk
97
+ EOS
98
+ end
99
+ end
54
100
  end
55
101
  end
56
102
 
57
103
  if defined?(::ActionController)
58
- ::ActiveSupport.on_load(:action_controller) { include Draftsman::Rails::Controller }
104
+ ::ActiveSupport.on_load(:action_controller) do
105
+ include ::Draftsman::Rails::Controller
106
+ end
59
107
  end
60
108
  end
@@ -1,3 +1,5 @@
1
+ require 'draftsman/attributes_serialization'
2
+
1
3
  module Draftsman
2
4
  module Model
3
5
 
@@ -44,6 +46,7 @@ module Draftsman
44
46
  # Lazily include the instance methods so we don't clutter up
45
47
  # any more ActiveRecord models than we need to.
46
48
  send :include, InstanceMethods
49
+ send :extend, AttributesSerialization
47
50
 
48
51
  # Define before/around/after callbacks on each drafted model
49
52
  send :extend, ActiveModel::Callbacks
@@ -124,65 +127,11 @@ module Draftsman
124
127
  method_defined?(:draftsman_options)
125
128
  end
126
129
 
127
- # Serializes attribute changes for `Draft#object_changes` attribute.
128
- def serialize_draft_attribute_changes(changes)
129
- # Don't serialize values before inserting into columns of type `JSON` on PostgreSQL databases.
130
- return changes if self.draft_class.object_changes_col_is_json?
131
-
132
- serialized_attributes.each do |key, coder|
133
- if changes.key?(key)
134
- coder = Draftsman::Serializers::Yaml unless coder.respond_to?(:dump) # Fall back to YAML if `coder` has no `dump` method
135
- old_value, new_value = changes[key]
136
- changes[key] = [coder.dump(old_value), coder.dump(new_value)]
137
- end
138
- end
139
- end
140
-
141
- # Used for `Draft#object` attribute
142
- def serialize_attributes_for_draftsman(attributes)
143
- # Don't serialize values before inserting into columns of type `JSON` on PostgreSQL databases.
144
- return attributes if self.draft_class.object_col_is_json?
145
-
146
- serialized_attributes.each do |key, coder|
147
- if attributes.key?(key)
148
- coder = Draftsman::Serializers::Yaml unless coder.respond_to?(:dump) # Fall back to YAML if `coder` has no `dump` method
149
- attributes[key] = coder.dump(attributes[key])
150
- end
151
- end
152
- end
153
-
154
130
  # Returns whether or not a `trashed_at` timestamp is set up on this model.
155
131
  def trashable?
156
132
  draftable? && method_defined?(self.trashed_at_attribute_name)
157
133
  end
158
134
 
159
- # Unserializes attribute changes for `Draft#object_changes` attribute.
160
- def unserialize_draft_attribute_changes(changes)
161
- # Don't serialize values before inserting into columns of type `JSON` on PostgreSQL databases.
162
- return changes if self.draft_class.object_changes_col_is_json?
163
-
164
- serialized_attributes.each do |key, coder|
165
- if changes.key?(key)
166
- coder = Draftsman::Serializers::Yaml unless coder.respond_to?(:dump)
167
- old_value, new_value = changes[key]
168
- changes[key] = [coder.load(old_value), coder.load(new_value)]
169
- end
170
- end
171
- end
172
-
173
- # Used for `Draft#object` attribute
174
- def unserialize_attributes_for_draftsman(attributes)
175
- # Don't serialize values before inserting into columns of type `JSON` on PostgreSQL databases.
176
- return attributes if self.draft_class.object_col_is_json?
177
-
178
- serialized_attributes.each do |key, coder|
179
- if attributes.key?(key)
180
- coder = Draftsman::Serializers::Yaml unless coder.respond_to?(:dump)
181
- attributes[key] = coder.load(attributes[key])
182
- end
183
- end
184
- end
185
-
186
135
  # Returns whether or not the included ActiveRecord can do `where.not(...)` style queries.
187
136
  def where_not?
188
137
  ActiveRecord::VERSION::STRING.to_f >= 4.0
@@ -1,3 +1,3 @@
1
1
  module Draftsman
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  # Tests controller `info_for_draftsman` method
4
- describe InformantsController, :type => :controller do
5
- let(:trashable) { Trashable.create!(:name => 'Bob') }
4
+ describe InformantsController, type: :controller do
5
+ let(:trashable) { Trashable.create!(name: 'Bob') }
6
6
 
7
7
  describe 'create' do
8
8
  before { post :create }
@@ -18,7 +18,7 @@ describe InformantsController, :type => :controller do
18
18
  end
19
19
 
20
20
  describe 'update' do
21
- before { put :update, :id => trashable.id }
21
+ before { put :update, id: trashable.id }
22
22
  subject { Draftsman::Draft.last }
23
23
 
24
24
  it 'records `ip` from custom `info_for_draftsman`' do
@@ -31,7 +31,7 @@ describe InformantsController, :type => :controller do
31
31
  end
32
32
 
33
33
  describe 'destroy' do
34
- before { delete :destroy, :id => trashable.id }
34
+ before { delete :destroy, id: trashable.id }
35
35
  subject { Draftsman::Draft.last }
36
36
 
37
37
  it 'records `ip` from custom `info_for_draftsman`' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe UsersController, :type => :controller do
4
- let(:trashable) { Trashable.create!(:name => 'Bob') }
3
+ describe UsersController, type: :controller do
4
+ let(:trashable) { Trashable.create!(name: 'Bob') }
5
5
 
6
6
  describe 'create' do
7
7
  before { post :create }
@@ -13,7 +13,7 @@ describe UsersController, :type => :controller do
13
13
  end
14
14
 
15
15
  describe 'update' do
16
- before { put :update, :id => trashable.id }
16
+ before { put :update, id: trashable.id }
17
17
  subject { return Draftsman::Draft.last }
18
18
 
19
19
  it 'records user name via `user_for_draftsman`' do
@@ -22,7 +22,7 @@ describe UsersController, :type => :controller do
22
22
  end
23
23
 
24
24
  describe 'destroy' do
25
- before { delete :destroy, :id => trashable.id }
25
+ before { delete :destroy, id: trashable.id }
26
26
  subject { return Draftsman::Draft.last }
27
27
 
28
28
  it 'records user name via `user_for_draftsman`' do
@@ -1,33 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  # Tests the automatic usage of `current_user` as the `whodunnit` attribute on the draft object
4
- describe WhodunnitsController, :type => :controller do
5
- let(:trashable) { Trashable.create!(:name => 'Bob') }
4
+ describe WhodunnitsController, type: :controller do
5
+ let(:trashable) { Trashable.create!(name: 'Bob') }
6
6
 
7
7
  describe 'create' do
8
8
  before { post :create }
9
9
  subject { Draftsman::Draft.last }
10
10
 
11
11
  it 'records `current_user` via `user_for_draftsman' do
12
- expect(subject.whodunnit).to eql "153"
12
+ expect(subject.whodunnit).to eql '153'
13
13
  end
14
14
  end
15
15
 
16
16
  describe 'update' do
17
- before { put :update, :id => trashable.id }
17
+ before { put :update, id: trashable.id }
18
18
  subject { Draftsman::Draft.last }
19
19
 
20
20
  it 'records `current_user` via `user_for_draftsman' do
21
- expect(subject.whodunnit).to eql "153"
21
+ expect(subject.whodunnit).to eql '153'
22
22
  end
23
23
  end
24
24
 
25
25
  describe 'destroy' do
26
- before { delete :destroy, :id => trashable.id }
26
+ before { delete :destroy, id: trashable.id }
27
27
  subject { Draftsman::Draft.last }
28
28
 
29
29
  it 'records `current_user` via `user_for_draftsman' do
30
- expect(subject.whodunnit).to eql "153"
30
+ expect(subject.whodunnit).to eql '153'
31
31
  end
32
32
  end
33
33
  end
@@ -1,20 +1,27 @@
1
1
  class ApplicationController < ActionController::Base
2
2
  protect_from_forgery
3
+ before_action :set_draftsman_whodunnit
3
4
 
4
5
  def create
5
- Trashable.new(:name => 'Bob').draft_creation
6
- render nothing: true
6
+ Trashable.new(name: 'Bob').draft_creation
7
+ head :no_content
7
8
  end
8
9
 
9
10
  def update
10
11
  trashable = Trashable.last
11
12
  trashable.name = 'Sam'
12
13
  trashable.draft_update
13
- render nothing: true
14
+ head :no_content
14
15
  end
15
16
 
16
17
  def destroy
17
18
  Trashable.last.draft_destruction
18
- render nothing: true
19
+ head :no_content
20
+ end
21
+
22
+ private
23
+
24
+ def draftsman_enabled_for_controller
25
+ request.user_agent != 'Disable User-Agent'
19
26
  end
20
27
  end
@@ -32,6 +32,6 @@ module Dummy
32
32
  config.active_record.whitelist_attributes = false if ::Draftsman.active_record_protected_attributes?
33
33
 
34
34
  # Do not access the DB or load models when precompiling assets
35
- config.assets.initialize_on_precompile = false
35
+ config.assets.enabled = false if config.respond_to?(:assets)
36
36
  end
37
37
  end
@@ -12,15 +12,21 @@ Dummy::Application.configure do
12
12
  # preloads Rails for running tests, you may have to set it to true.
13
13
  config.eager_load = false
14
14
 
15
- # Configure static asset server for tests with Cache-Control for performance
16
- if ::ActiveRecord::VERSION::STRING < '4.2'
17
- config.serve_static_assets = true
18
- # Rails 4.2 deprecates this in favor of `serve_static_files`.
15
+ if config.respond_to?(:public_file_server)
16
+ config.public_file_server.enabled = true
17
+ elsif config.respond_to?(:serve_static_files=)
18
+ config.serve_static_files = true
19
19
  else
20
- config.serve_static_files = true
20
+ config.serve_static_assets = true
21
21
  end
22
22
 
23
- config.static_cache_control = "public, max-age=3600"
23
+ if config.respond_to?(:public_file_server)
24
+ config.public_file_server.headers = {
25
+ "Cache-Control" => "public, max-age=3600"
26
+ }
27
+ else
28
+ config.static_cache_control = "public, max-age=3600"
29
+ end
24
30
 
25
31
  # Show full error reports and disable caching
26
32
  config.consider_all_requests_local = true
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  # A Trashable has a simple call to `has_drafts` without any options specified. The model also contains a `deleted_at`
4
4
  # attribute, which allows deletes to be drafts too.
5
5
  describe Trashable do
6
- let(:trashable) { Trashable.new :name => 'Bob' }
6
+ let(:trashable) { Trashable.new name: 'Bob' }
7
7
 
8
8
  describe '.draftable?' do
9
9
  it 'is draftable' do
@@ -287,7 +287,7 @@ describe Vanilla do
287
287
  subject { Vanilla.live }
288
288
 
289
289
  it 'raises an exception' do
290
- expect { subject.load }.to raise_exception
290
+ expect { subject.load }.to raise_exception(ActiveRecord::StatementInvalid)
291
291
  end
292
292
  end
293
293
 
@@ -311,7 +311,7 @@ describe Vanilla do
311
311
  subject { Vanilla.trashed }
312
312
 
313
313
  it 'raises an exception' do
314
- expect { subject.load }.to raise_exception
314
+ expect { subject.load }.to raise_exception(ActiveRecord::StatementInvalid)
315
315
  end
316
316
  end
317
317
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: draftsman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Peters
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-06 00:00:00.000000000 Z
11
+ date: 2016-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '3.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.0'
22
+ version: '5.1'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,21 +29,21 @@ dependencies:
29
29
  version: '3.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.0'
32
+ version: '5.1'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rake
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '10.5'
39
+ version: '0'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '10.5'
46
+ version: '0'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: railties
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +53,7 @@ dependencies:
53
53
  version: '3.0'
54
54
  - - "<"
55
55
  - !ruby/object:Gem::Version
56
- version: '5.0'
56
+ version: '5.1'
57
57
  type: :development
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
@@ -63,7 +63,7 @@ dependencies:
63
63
  version: '3.0'
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
- version: '5.0'
66
+ version: '5.1'
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: sinatra
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -82,16 +82,16 @@ dependencies:
82
82
  name: rspec-rails
83
83
  requirement: !ruby/object:Gem::Requirement
84
84
  requirements:
85
- - - '='
85
+ - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: 3.2.1
87
+ version: '3.5'
88
88
  type: :development
89
89
  prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
- - - '='
92
+ - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: 3.2.1
94
+ version: '3.5'
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: sqlite3
97
97
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +122,7 @@ files:
122
122
  - Rakefile
123
123
  - draftsman.gemspec
124
124
  - lib/draftsman.rb
125
+ - lib/draftsman/attributes_serialization.rb
125
126
  - lib/draftsman/config.rb
126
127
  - lib/draftsman/draft.rb
127
128
  - lib/draftsman/frameworks/cucumber.rb
@@ -204,7 +205,6 @@ files:
204
205
  - spec/models/vanilla_spec.rb
205
206
  - spec/models/whitelister_spec.rb
206
207
  - spec/spec_helper.rb
207
- - spec/support/silence_serialized_attributes_deprecation.rb
208
208
  homepage: https://github.com/liveeditor/draftsman
209
209
  licenses:
210
210
  - MIT
@@ -225,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
225
  version: '0'
226
226
  requirements: []
227
227
  rubyforge_project:
228
- rubygems_version: 2.4.5.1
228
+ rubygems_version: 2.5.1
229
229
  signing_key:
230
230
  specification_version: 4
231
231
  summary: Create draft versions of your database records.
@@ -296,4 +296,3 @@ test_files:
296
296
  - spec/models/vanilla_spec.rb
297
297
  - spec/models/whitelister_spec.rb
298
298
  - spec/spec_helper.rb
299
- - spec/support/silence_serialized_attributes_deprecation.rb
@@ -1,16 +0,0 @@
1
- # SerializedAttributes is deprecated in Rails 4.2.x, and will be removed in
2
- # Rails 5. Draftsman spews a ton of deprecation warnings about this issue.
3
- #
4
- # More info: https://github.com/airblade/paper_trail/issues/416
5
- #
6
- # TODO: when migrating to Rails 5, remove this initializer
7
-
8
- if Draftsman::VERSION.to_f < 1.0
9
- current_behavior = ActiveSupport::Deprecation.behavior
10
- ActiveSupport::Deprecation.behavior = lambda do |message, callstack|
11
- return if message =~ /`serialized_attributes` is deprecated without replacement/ && callstack.any? { |m| m =~ /draftsman/ }
12
- Array.wrap(current_behavior).each { |behavior| behavior.call(message, callstack) }
13
- end
14
- else
15
- warn 'FIXME: Draftsman initializer to suppress deprecation warnings can be safely removed.'
16
- end