tree_diff 1.1.2 → 1.1.3

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
  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