coaster 1.4.38 → 1.4.39

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: d69bb86707fa932dcc3782453f4a1eaf5a0f6affb00ae4ad7cb512af8ee5502b
4
- data.tar.gz: afdd5fee8f322409b3ab0a67c735172d7afadeb243831d5ecc7e759b6381f1f6
3
+ metadata.gz: db3e3c711b051a059c028d9de5543c55ea1db20e5134b790308a310357d04780
4
+ data.tar.gz: 75f518e585672bca7c8f84c034b4bbc92e3bb330126d6aebc8c867558a1f7396
5
5
  SHA512:
6
- metadata.gz: 57bde1aabfa65503fbdfbc57e9c6c36d673fcd99838dcf914717ce5e09b70be5c4620ee9e3bdc0bb707f02b236cfc0e5cbade535d776bdf3aebab53bddae3ac9
7
- data.tar.gz: 01da4d3b757a1cba48acdeda80bd3cd6adf0cb0b5f65f5f7592db9fde8b0465680f461467928d69b4870ecc4e780c8174f374598ace29dbe96cd52a441540d16
6
+ metadata.gz: a529d3b506a6ba67c320314746580007cdd5ff9912acdf4989581e8b622fdf6386e9bed1da388a192345bbbf306d705ff6a133b26c77aac601709906ffc39d32
7
+ data.tar.gz: d48154a8d863cd647a525fa9a3e2e4288d47daf43528f28f9f954092161beb3b4e2ab7ef16f5e77455337f502b1716a10d3a578ff049f04ad8aa1b1a56dc1108
@@ -27,7 +27,6 @@ module Coaster
27
27
  setting = self.class.serialized_property_setting(key)
28
28
  return unless setting
29
29
  col = setting[:column]
30
- send("#{col}_will_change!")
31
30
  hsh = send(col)
32
31
  if value.nil?
33
32
  hsh.delete(key.to_s)
@@ -312,7 +311,6 @@ module Coaster
312
311
  if is_active_record
313
312
  define_method "#{key}_without_callback=".to_sym do |val|
314
313
  col = serialize_column
315
- send("#{col}_will_change!")
316
314
  hsh = send(col)
317
315
  if val.nil?
318
316
  hsh.delete(key.to_s)
@@ -1,3 +1,3 @@
1
1
  module Coaster
2
- VERSION = '1.4.38'
2
+ VERSION = '1.4.39'
3
3
  end
@@ -0,0 +1,142 @@
1
+ require 'test_helper'
2
+ require 'minitest/autorun'
3
+
4
+ module Coaster
5
+ class TestSerializedProperty < Minitest::Test
6
+ def setup
7
+ end
8
+
9
+ def teardown
10
+ end
11
+
12
+ def test_dirty
13
+ user = User.create(name: 'abc')
14
+ mother = User.create(name: 'mother')
15
+ user.mother = mother
16
+ assert_equal mother, user.mother
17
+ assert_equal mother.id, user.mother_id
18
+ assert_equal({"mother_id"=>mother.id}, user.data)
19
+ assert_equal({"data" => [{}, {"mother_id"=>mother.id}]}, user.changes)
20
+ assert_equal({"mother_id" => [nil, mother.id]}, user.sprop_changes)
21
+ assert_equal(true, user.mother_id_changed?)
22
+ assert_equal(nil, user.mother_id_was)
23
+ user.save!
24
+ user = User.find(user.id)
25
+ user.mother_id = mother.id
26
+ assert_equal(false, user.mother_id_changed?)
27
+ assert_equal({}, user.changes)
28
+ step_mother = User.create(name: 'step_mother')
29
+ user.mother = step_mother
30
+ assert_equal({"data" => [{"mother_id" => mother.id}, {"mother_id" => step_mother.id}]}, user.changes)
31
+ assert_equal({"mother_id" => [mother.id, step_mother.id]}, user.sprop_changes)
32
+ end
33
+
34
+ # Tests for dirty tracking optimization (skip dirty marking when value unchanged)
35
+ def test_same_value_setter_does_not_mark_dirty
36
+ user = User.create(name: 'test_same_value')
37
+ user.simple = 'initial_value'
38
+ user.save!
39
+
40
+ # Reload to clear dirty state
41
+ user.reload
42
+ assert_equal false, user.changed?
43
+
44
+ # Set same value - should NOT mark dirty
45
+ user.simple = 'initial_value'
46
+ assert_equal false, user.simple_changed?, 'Setting same value should not mark property as changed'
47
+ assert_equal false, user.changed?, 'Setting same value should not mark record as changed'
48
+ end
49
+
50
+ def test_different_value_setter_marks_dirty
51
+ user = User.create(name: 'test_different_value')
52
+ user.simple = 'initial_value'
53
+ user.save!
54
+ user.reload
55
+
56
+ # Set different value - should mark dirty
57
+ user.simple = 'new_value'
58
+ assert_equal true, user.simple_changed?, 'Setting different value should mark property as changed'
59
+ assert_equal true, user.changed?, 'Setting different value should mark record as changed'
60
+ assert_equal ['initial_value', 'new_value'], user.simple_change
61
+ end
62
+
63
+ def test_nil_to_value_marks_dirty
64
+ user = User.create(name: 'test_nil_to_value')
65
+ user.save!
66
+ user.reload
67
+
68
+ assert_nil user.simple
69
+ user.simple = 'some_value'
70
+ assert_equal true, user.simple_changed?
71
+ assert_equal [nil, 'some_value'], user.simple_change
72
+ end
73
+
74
+ def test_value_to_nil_marks_dirty
75
+ user = User.create(name: 'test_value_to_nil')
76
+ user.simple = 'some_value'
77
+ user.save!
78
+ user.reload
79
+
80
+ user.simple = nil
81
+ assert_equal true, user.simple_changed?
82
+ assert_equal ['some_value', nil], user.simple_change
83
+ end
84
+
85
+ def test_nil_to_nil_does_not_mark_dirty
86
+ user = User.create(name: 'test_nil_to_nil')
87
+ user.save!
88
+ user.reload
89
+
90
+ assert_nil user.simple
91
+ user.simple = nil
92
+ assert_equal false, user.simple_changed?, 'Setting nil to nil should not mark as changed'
93
+ assert_equal false, user.changed?
94
+ end
95
+
96
+ def test_same_value_via_write_attribute_does_not_mark_dirty
97
+ user = User.create(name: 'test_write_attr_same')
98
+ user.write_attribute(:simple, 'initial')
99
+ user.save!
100
+ user.reload
101
+
102
+ user.write_attribute(:simple, 'initial')
103
+ assert_equal false, user.simple_changed?
104
+ assert_equal false, user.changed?
105
+ end
106
+
107
+ def test_same_value_via_bracket_accessor_does_not_mark_dirty
108
+ user = User.create(name: 'test_bracket_same')
109
+ user[:simple] = 'initial'
110
+ user.save!
111
+ user.reload
112
+
113
+ user[:simple] = 'initial'
114
+ assert_equal false, user.simple_changed?
115
+ assert_equal false, user.changed?
116
+ end
117
+
118
+ def test_same_value_with_setter_proc_does_not_mark_dirty
119
+ student = Student.create(name: 'test_setter_same')
120
+ student.uppercase_name = 'hello' # Stored as 'HELLO'
121
+ student.save!
122
+ student.reload
123
+
124
+ # Setting same raw input - setter transforms to same value
125
+ student.uppercase_name = 'hello'
126
+ assert_equal false, student.uppercase_name_changed?, 'Same value after setter transform should not mark dirty'
127
+ assert_equal false, student.changed?
128
+ end
129
+
130
+ def test_different_case_with_setter_proc_marks_dirty
131
+ student = Student.create(name: 'test_setter_diff')
132
+ student.uppercase_name = 'hello' # Stored as 'HELLO'
133
+ student.save!
134
+ student.reload
135
+
136
+ # Setting different value
137
+ student.uppercase_name = 'world' # Stored as 'WORLD'
138
+ assert_equal true, student.uppercase_name_changed?
139
+ assert_equal ['HELLO', 'WORLD'], student.uppercase_name_change
140
+ end
141
+ end
142
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.38
4
+ version: 1.4.39
5
5
  platform: ruby
6
6
  authors:
7
7
  - buzz jung
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-12-10 00:00:00.000000000 Z
10
+ date: 2025-12-17 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: oj
@@ -234,6 +234,7 @@ files:
234
234
  - test/test_month.rb
235
235
  - test/test_object_translation.rb
236
236
  - test/test_serialized_property.rb
237
+ - test/test_serialized_property_dirty.rb
237
238
  - test/test_standard_error.rb
238
239
  - test/test_string.rb
239
240
  - test/test_util.rb
@@ -257,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
257
258
  - !ruby/object:Gem::Version
258
259
  version: '0'
259
260
  requirements: []
260
- rubygems_version: 3.6.7
261
+ rubygems_version: 3.6.9
261
262
  specification_version: 4
262
263
  summary: A little convenient feature for standard library
263
264
  test_files:
@@ -277,6 +278,7 @@ test_files:
277
278
  - test/test_month.rb
278
279
  - test/test_object_translation.rb
279
280
  - test/test_serialized_property.rb
281
+ - test/test_serialized_property_dirty.rb
280
282
  - test/test_standard_error.rb
281
283
  - test/test_string.rb
282
284
  - test/test_util.rb