Skip to content

Commit

Permalink
Separate dirty tracking of plain objects verse (persistable and query…
Browse files Browse the repository at this point in the history
…able) stored objects.
  • Loading branch information
jnunemaker committed Feb 13, 2012
1 parent 9522e87 commit 0756e3d
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 65 deletions.
1 change: 1 addition & 0 deletions lib/toy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ module Middleware
autoload 'Caching', 'toy/caching'
autoload 'Callbacks', 'toy/callbacks'
autoload 'Dirty', 'toy/dirty'
autoload 'DirtyStore', 'toy/dirty_store'
autoload 'Cloneable', 'toy/cloneable'
autoload 'Equality', 'toy/equality'
autoload 'Inspect', 'toy/inspect'
Expand Down
24 changes: 2 additions & 22 deletions lib/toy/dirty.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@ module Toy
module Dirty
extend ActiveSupport::Concern
include ActiveModel::Dirty
include Reloadable

def initialize(*)
super
if new_record?
# never register initial id assignment as a change
@changed_attributes.delete('id')
else
@previously_changed = {}
@changed_attributes.clear if @changed_attributes
end
# never register initial id assignment as a change
@changed_attributes.delete('id') if @changed_attributes
end

def initialize_copy(*)
Expand All @@ -22,20 +16,6 @@ def initialize_copy(*)
end
end

def reload
super.tap do
@previously_changed = {}
@changed_attributes = {}
end
end

def save(*)
super.tap do
@previously_changed = changes
@changed_attributes.clear if @changed_attributes
end
end

def write_attribute(name, value)
name = name.to_s
current = read_attribute(name)
Expand Down
32 changes: 32 additions & 0 deletions lib/toy/dirty_store.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
module Toy
module DirtyStore
extend ActiveSupport::Concern
include ActiveModel::Dirty
include Reloadable
include Persistence
include Querying

def initialize(*)
super

if persisted?
@previously_changed = {}
@changed_attributes.clear if @changed_attributes
end
end

def reload
super.tap do
@previously_changed = {}
@changed_attributes = {}
end
end

def save(*)
super.tap do
@previously_changed = changes
@changed_attributes.clear if @changed_attributes
end
end
end
end
1 change: 1 addition & 0 deletions lib/toy/store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ module Store
include MassAssignmentSecurity
include Cloneable
include Dirty
include DirtyStore
include Equality
include Inspect
include Querying
Expand Down
48 changes: 5 additions & 43 deletions spec/toy/dirty_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,49 +29,11 @@
end

it "knows when attribute did not change" do
user = User.create(:name => 'Geoffrey')
user.name = 'Geoffrey'
user = User.new
user.name = nil
user.should_not be_changed
end

describe "#save" do
before { @user = User.create(:name => 'Geoffrey') }
let(:user) { @user }

it "clears changes" do
user.name = 'John'
user.should be_changed
user.save
user.should_not be_changed
end

it "sets previous changes" do
user.previous_changes.should == {'name' => [nil, 'Geoffrey']}
end
end

it "does not have changes when loaded from database" do
user = User.create
loaded = User.get(user.id)
loaded.should_not be_changed
end

describe "#reload" do
before { @user = User.create(:name => 'John') }
let(:user) { @user }

it "clears changes" do
user.name = 'Steve'
user.reload
user.should_not be_changed
end

it "clears previously changed" do
user.reload
user.previous_changes.should be_empty
end
end

it "has attribute changed? method" do
user = User.new
user.should_not be_name_changed
Expand All @@ -80,19 +42,19 @@
end

it "has attribute was method" do
user = User.create(:name => 'John')
user = User.new(:name => 'John')
user.name = 'Steve'
user.name_was.should == 'John'
end

it "has attribute change method" do
user = User.create(:name => 'John')
user = User.new(:name => 'John')
user.name = 'Steve'
user.name_change.should == ['John', 'Steve']
end

it "has attribute will change! method" do
user = User.create
user = User.new
user.name_will_change!
user.should be_changed
end
Expand Down
47 changes: 47 additions & 0 deletions spec/toy/dirty_store_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
require 'helper'

describe Toy::DirtyStore do
uses_constants('User')

before do
User.attribute(:name, String)
end

it "does not have changes when loaded from database" do
user = User.create
loaded = User.get(user.id)
loaded.should_not be_changed
end

describe "#reload" do
before { @user = User.create(:name => 'John') }
let(:user) { @user }

it "clears changes" do
user.name = 'Steve'
user.reload
user.should_not be_changed
end

it "clears previously changed" do
user.reload
user.previous_changes.should be_empty
end
end

describe "#save" do
before { @user = User.create(:name => 'Geoffrey') }
let(:user) { @user }

it "clears changes" do
user.name = 'John'
user.should be_changed
user.save
user.should_not be_changed
end

it "sets previous changes" do
user.previous_changes.should == {'name' => [nil, 'Geoffrey']}
end
end
end

0 comments on commit 0756e3d

Please sign in to comment.