tree_diff 1.1.2 → 1.1.3

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
  SHA256:
3
- metadata.gz: 275453852f6c76b905b0f39363e622763473bbaf81ad6ff527d49a0a03711a9d
4
- data.tar.gz: daf3a58eaf867ec2c308747b04bffec7befe7df8336ca9f49b4d49e472ad3caa
3
+ metadata.gz: 17646f7343db4fba5bb20b308c77b7cfa910b903b5c9a089f604b466db3bbf3b
4
+ data.tar.gz: e15623b04dba3b55518dc850d4d5eb4a15a1b3ecb8aa7e845ca1b807f1b0c682
5
5
  SHA512:
6
- metadata.gz: feacaeada2e4d4b0298bace2d3441835f0cac924bec321a50c228edcd4e746ff0fed1d50ee59eef091864e2619915395cc5c05e04ea6fc3c0be91aa362e730ac
7
- data.tar.gz: 0dc668bad79c7a76b2fab3d19da7fbf532b384188e0023b55f594f19bcdf9f14d000b5179583fc4bc381717f0168b316246b78b81cdc753c824ec3a5b0869c17
6
+ metadata.gz: 0b15fb4b1eee4a1da4eca5324ae3dae423ac18517f25e392ed52cff29fb9f8b55a703c43df6cc077692eacfcefecec6cb74e43c68b8c5b21fd1476653547e5e1
7
+ data.tar.gz: 30d487b43dba72b0b9b27576bdc3930b0cb76be6ceb57bbfeebdf71e9453ab4b204ee65d0f116e1e6cac2cbeb9f2d68a020f038d10da09f208eeff371c6f492a
data/lib/tree_diff.rb CHANGED
@@ -203,10 +203,12 @@ class TreeDiff
203
203
  end
204
204
 
205
205
  def call_and_copy_value(receiver, method_name)
206
+ return -> { nil } unless receiver
207
+
206
208
  source_value = receiver.public_send(method_name)
207
209
  source_value = Marshal.load(Marshal.dump(source_value)) # Properly clones hashes
208
210
 
209
- -> { source_value }
211
+ -> { source_value } # The return value of this becomes the body of the method defined on the Mold object
210
212
  end
211
213
 
212
214
  def iterate_observations(mold, current_object)
@@ -238,6 +240,8 @@ class TreeDiff
238
240
 
239
241
  def method_caller_with_condition(path)
240
242
  ->(object_and_method) do
243
+ return nil unless object_and_method.fetch(:receiver)
244
+
241
245
  condition = condition_for(path)
242
246
 
243
247
  if !condition || condition.call(object_and_method.fetch(:receiver))
data/test/helper.rb CHANGED
@@ -10,6 +10,12 @@ ActiveRecord::Schema.define do
10
10
  t.string :number
11
11
  end
12
12
 
13
+ create_table :extra_order_details, force: true do |t|
14
+ t.references :order
15
+ t.string :integration_id
16
+ t.string :external_id
17
+ end
18
+
13
19
  create_table :line_items, force: true do |t|
14
20
  t.string :description
15
21
  t.integer :price_usd_cents
@@ -45,16 +51,20 @@ ActiveRecord::Schema.define do
45
51
  end
46
52
  end
47
53
 
48
- # Define the models
49
54
  class Order < ActiveRecord::Base
50
55
  has_many :line_items, inverse_of: :order
51
56
  has_many :orders_vehicles
57
+ has_one :detail, class_name: "ExtraOrderDetail"
52
58
 
53
59
  has_many :trucks, through: :orders_vehicles, source: :vehicle, source_type: "Vehicle", class_name: "Truck"
54
60
 
55
61
  accepts_nested_attributes_for :line_items, allow_destroy: true
56
62
  end
57
63
 
64
+ class ExtraOrderDetail < ActiveRecord::Base
65
+ belongs_to :order
66
+ end
67
+
58
68
  class LineItem < ActiveRecord::Base
59
69
  belongs_to :order, inverse_of: :line_items
60
70
  has_many :item_categories
@@ -27,6 +27,10 @@ class TreeDiffTest < Minitest::Test
27
27
  observe :number, orders_vehicles: {vehicle: :id}
28
28
  end
29
29
 
30
+ class InvolvingOrderDetailDiff < TreeDiff
31
+ observe :number, detail: [:integration_id, :external_id]
32
+ end
33
+
30
34
  class TableDiff < TreeDiff
31
35
  observe wood_finish: [:color, :cost, :applied_at, :cost_mapping,
32
36
  blemishes: [:severity]]
@@ -61,6 +65,18 @@ class TreeDiffTest < Minitest::Test
61
65
  assert_nil diff.changes_at(:quantity)
62
66
  end
63
67
 
68
+ def test_nil_associations
69
+ order = Order.create!(number: 'XYZ123')
70
+
71
+ diff = InvolvingOrderDetailDiff.new(order)
72
+ assert_empty diff.changes
73
+
74
+ order.update!(detail: ExtraOrderDetail.new(integration_id: '123', external_id: '321'))
75
+
76
+ assert_equal [{:path=>[:detail, :integration_id], :old=>nil, :new=>"123"},
77
+ {:path=>[:detail, :external_id], :old=>nil, :new=>"321"}], diff.changes
78
+ end
79
+
64
80
  def test_big_tree
65
81
  foo_category = ItemCategory.new(description: 'foo')
66
82
  bar_category = ItemCategory.new(description: 'bar')
data/tree_diff.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'tree_diff'
3
- s.version = '1.1.2'
3
+ s.version = '1.1.3'
4
4
  s.date = '2019-08-23'
5
5
  s.summary = "Observe attribute changes in big complex object trees, like a generic & standalone ActiveModel::Dirty"
6
6
  s.description = "Given a tree of relationships in a similar format to strong params, analyzes attribute changes by " \
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tree_diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Nelson