diff --git a/.travis.yml b/.travis.yml index df47ac1..150ba84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,8 @@ cache: bundler: true rvm: - - 2.0.0 - - 2.1 - - 2.2 + - 2.0 + - 2.5 addons: postgresql: "9.4" diff --git a/delta.gemspec b/delta.gemspec index 70e26f4..41d8393 100644 --- a/delta.gemspec +++ b/delta.gemspec @@ -29,12 +29,11 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency "request_store" - spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency "rake" spec.add_development_dependency "awesome_print" - spec.add_development_dependency "rails", "~> 4.2" + spec.add_development_dependency "awesome_pry" + spec.add_development_dependency "rails", ">= 5.1", "< 5.2" spec.add_development_dependency "rspec" spec.add_development_dependency "rspec-rails" - spec.add_development_dependency "test_after_commit" spec.add_development_dependency "pg" - #spec.add_development_dependency "rubocop" end diff --git a/lib/delta/tracker.rb b/lib/delta/tracker.rb index 266bcbd..ef96ed8 100644 --- a/lib/delta/tracker.rb +++ b/lib/delta/tracker.rb @@ -53,17 +53,17 @@ def persist!(model, deltas = []) deltas = [deltas] unless deltas.is_a?(Array) model.cache_deltas(deltas) - - if model.persisted? - Delta.config.adapters.each do |adapter| - "#{adapter}::Store" - .constantize - .new(model, model.deltas_cache) - .persist! - end - - model.reset_deltas_cache! + return if model.deltas_cache.empty? + return unless model.persisted? + + Delta.config.adapters.each do |adapter| + "#{adapter}::Store" + .constantize + .new(model, model.deltas_cache) + .persist! end + + model.reset_deltas_cache! end private diff --git a/lib/delta/tracker/association.rb b/lib/delta/tracker/association.rb index 2895ae1..a006162 100644 --- a/lib/delta/tracker/association.rb +++ b/lib/delta/tracker/association.rb @@ -42,7 +42,7 @@ def serialize(obj, action) # loosing the main idea and without huge performance bottlenecks. # And also think about tracking changes of polymorphic assocs. def serialize_change(obj) - if (obj.changes.keys & @opts[:serialize]).any? + if (obj.saved_changes.keys & @opts[:serialize]).any? serialize(obj, "C") end end @@ -64,7 +64,7 @@ def track_association_change! after_update do t = #{@trackable_class}.delta_tracker delta = t.trackable_fields['#{@name}'].serialize_change(self) - model = association_cache['#{assoc}'] || send('#{assoc}') + model = send('#{assoc}') t.persist!(model, delta) if delta end diff --git a/lib/delta/tracker/attribute.rb b/lib/delta/tracker/attribute.rb index bfc4208..a861d37 100644 --- a/lib/delta/tracker/attribute.rb +++ b/lib/delta/tracker/attribute.rb @@ -8,7 +8,7 @@ def initialize(name, attr, opts = {}) def track!; end def serialize(model, action, opts = {}) - return unless changed = model.changes[@name] + return unless changed = model.changes_to_save[@name] { name: @name, diff --git a/lib/delta/tracker/belongs_to.rb b/lib/delta/tracker/belongs_to.rb index 1fd30e2..698f27a 100644 --- a/lib/delta/tracker/belongs_to.rb +++ b/lib/delta/tracker/belongs_to.rb @@ -5,9 +5,9 @@ def track! end def serialize(model, action, opts = {}) - return unless model.changes[key] || (polymorphic? && model.changes[type]) + return unless model.saved_changes[key] || (polymorphic? && model.saved_changes[type]) - assoc = model.association_cache[@name] || model.send(@name) + assoc = model.send(@name) key = @reflection.klass.primary_key serialized = if assoc { key => assoc.send(key) }.tap do |hash| diff --git a/lib/delta/tracker/model_ext.rb b/lib/delta/tracker/model_ext.rb index c17cc15..d34c1dc 100644 --- a/lib/delta/tracker/model_ext.rb +++ b/lib/delta/tracker/model_ext.rb @@ -7,17 +7,17 @@ def self.included(base) base.send :include, DeltaAssociationsMethods base.class_eval do - before_update :cache_delta_fields! + before_save :cache_delta_fields! if Delta.config.dont_use_after_commit_callbacks # Might be useful in app's specs, for example - after_update :persist_delta_cache! + after_save :persist_delta_cache! after_destroy :reset_deltas_cache! after_create :reset_deltas_cache! else - after_commit :persist_delta_cache!, on: :update - after_commit :reset_deltas_cache!, on: [:destroy, :create] + after_commit :persist_delta_cache!, on: [:create, :update] + after_commit :reset_deltas_cache!, on: :destroy end end end @@ -43,7 +43,7 @@ def persist_delta_cache! module DeltaFieldsMethods def cache_delta_fields! - return if changes.empty? + return unless has_changes_to_save? ts = Time.now.to_i deltas = [] diff --git a/lib/delta/version.rb b/lib/delta/version.rb index 180c086..a40d166 100644 --- a/lib/delta/version.rb +++ b/lib/delta/version.rb @@ -1,3 +1,3 @@ module Delta - VERSION = "0.0.1.alpha" + VERSION = "0.0.1" end diff --git a/lib/generators/delta/templates/create_deltas.rb b/lib/generators/delta/templates/create_deltas.rb index 4ed4088..2bfe97b 100644 --- a/lib/generators/delta/templates/create_deltas.rb +++ b/lib/generators/delta/templates/create_deltas.rb @@ -1,4 +1,4 @@ -class CreateDeltas < ActiveRecord::Migration +class CreateDeltas < ActiveRecord::Migration[4.2] def change create_table :deltas, force: :cascade do |t| # TODO: custom users key name diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 04d4b6d..21612e4 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -16,6 +16,5 @@ CreateDeltas.new.change RSpec.configure do |c| - require 'test_after_commit' c.use_transactional_fixtures = true end diff --git a/spec/test_app/application.rb b/spec/test_app/application.rb index 04add2b..ae61ff2 100644 --- a/spec/test_app/application.rb +++ b/spec/test_app/application.rb @@ -13,7 +13,6 @@ class Application < Rails::Application config.consider_all_requests_local = true config.eager_load = false config.encoding = "utf-8" - config.active_record.raise_in_transactional_callbacks = true config.paths["app/controllers"] << "#{TEST_APP_PATH}/controllers" config.paths["app/models"] << "#{TEST_APP_PATH}/models" diff --git a/spec/test_app/controllers/orders_controller.rb b/spec/test_app/controllers/orders_controller.rb index 8313bab..cbe3c1c 100644 --- a/spec/test_app/controllers/orders_controller.rb +++ b/spec/test_app/controllers/orders_controller.rb @@ -1,7 +1,7 @@ class OrdersController < ActionController::Base def update_address Order.last.update address: "new address" - render text: "ok" + render plain: "ok" end protected