Skip to content

Commit 37a22fd

Browse files
committed
Support ActiveRecord 5.2
1 parent 11df93a commit 37a22fd

File tree

5 files changed

+52
-4
lines changed

5 files changed

+52
-4
lines changed

.travis.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@ env:
1818
- ACTIVERECORD=4.2.0
1919
- ACTIVERECORD=5.0.0
2020
- ACTIVERECORD=5.1.1
21+
- ACTIVERECORD=5.2.0
2122
matrix:
2223
exclude:
2324
- rvm: 2.0
2425
env: ACTIVERECORD=5.0.0
2526
- rvm: 2.0
2627
env: ACTIVERECORD=5.1.1
28+
- rvm: 2.0
29+
env: ACTIVERECORD=5.2.0
2730
- rvm: 2.1
2831
env: ACTIVERECORD=5.0.0
2932
- rvm: 2.1
3033
env: ACTIVERECORD=5.1.1
34+
- rvm: 2.1
35+
env: ACTIVERECORD=5.2.0
3136
- rvm: 2.4.0
3237
env: ACTIVERECORD=3.0.0
3338
- rvm: 2.4.0
@@ -52,6 +57,8 @@ matrix:
5257
env: ACTIVERECORD=5.0.0
5358
- rvm: rbx
5459
env: ACTIVERECORD=5.1.1
60+
- rvm: rbx
61+
env: ACTIVERECORD=5.2.0
5562
allow_failures:
5663
- rvm: rbx
5764
fast_finish: true

attr_encrypted.gemspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ Gem::Specification.new do |s|
4242
s.add_development_dependency('rake')
4343
s.add_development_dependency('minitest')
4444
s.add_development_dependency('sequel')
45+
s.add_development_dependency('pry-byebug')
4546
if RUBY_VERSION < '2.1.0'
4647
s.add_development_dependency('nokogiri', '< 1.7.0')
4748
s.add_development_dependency('public_suffix', '< 3.0.0')
@@ -50,7 +51,7 @@ Gem::Specification.new do |s|
5051
s.add_development_dependency('activerecord-jdbcsqlite3-adapter')
5152
s.add_development_dependency('jdbc-sqlite3', '< 3.8.7') # 3.8.7 is nice and broke
5253
else
53-
s.add_development_dependency('sqlite3')
54+
s.add_development_dependency('sqlite3', '~> 1.3.0', '>= 1.3.6')
5455
end
5556
s.add_development_dependency('dm-sqlite-adapter')
5657
s.add_development_dependency('simplecov')

lib/attr_encrypted/adapters/active_record.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def attr_encrypted(*attrs)
6666
end
6767
else
6868
define_method("#{attr}_changed?") do
69-
attribute_changed?(attr)
69+
attribute_changed?(attr)
7070
end
7171
end
7272

@@ -75,6 +75,20 @@ def attr_encrypted(*attrs)
7575
end
7676

7777
define_method("#{attr}_with_dirtiness=") do |value|
78+
##
79+
# In ActiveRecord 5.2+, due to changes to the way virtual
80+
# attributes are handled, @attributes[attr].value is nil which
81+
# breaks attribute_was. Setting it here returns us to the expected
82+
# behavior.
83+
if ::ActiveRecord::VERSION::STRING >= "5.2"
84+
# This is needed support attribute_was before a record has
85+
# been saved
86+
set_attribute_was(attr, __send__(attr)) if value != __send__(attr)
87+
# This is needed to support attribute_was after a record has
88+
# been saved
89+
@attributes.write_from_user(attr.to_s, value) if value != __send__(attr)
90+
end
91+
##
7892
attribute_will_change!(attr) if value != __send__(attr)
7993
__send__("#{attr}_without_dirtiness=", value)
8094
end

test/active_record_test.rb

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ class Address < ActiveRecord::Base
126126
end
127127

128128
class ActiveRecordTest < Minitest::Test
129-
130129
def setup
131130
drop_all_tables
132131
create_tables
@@ -221,6 +220,32 @@ def test_attribute_was_works_when_options_for_old_encrypted_value_are_different_
221220
assert_equal pw.reverse, account.password
222221
end
223222

223+
# Add ActiveRecord 5.2 specific methods
224+
if ::ActiveRecord::VERSION::STRING >= "5.2"
225+
def test_should_create_will_save_change_to_predicate
226+
person = Person.create!(email: 'test@example.com')
227+
refute person.will_save_change_to_email?
228+
person.email = 'test@example.com'
229+
refute person.will_save_change_to_email?
230+
person.email = nil
231+
assert person.will_save_change_to_email?
232+
person.email = 'test2@example.com'
233+
assert person.will_save_change_to_email?
234+
end
235+
236+
def test_should_create_saved_change_to_predicate
237+
person = Person.create!(email: 'test@example.com')
238+
assert person.saved_change_to_email?
239+
person.reload
240+
person.email = 'test@example.com'
241+
refute person.saved_change_to_email?
242+
person.email = nil
243+
refute person.saved_change_to_email?
244+
person.email = 'test2@example.com'
245+
refute person.saved_change_to_email?
246+
end
247+
end
248+
224249
if ::ActiveRecord::VERSION::STRING > "4.0"
225250
def test_should_assign_attributes
226251
@user = UserWithProtectedAttribute.new(login: 'login', is_admin: false)

test/test_helper.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
require 'simplecov'
44
require 'simplecov-rcov'
5-
require "codeclimate-test-reporter"
5+
require 'codeclimate-test-reporter'
6+
require 'pry-byebug'
67

78
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
89
[

0 commit comments

Comments
 (0)