active_typed_store 2.0.0 → 2.2.0

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: 8bbeb2d1b777327fdb95ee0864943128f702833b22bb67499e89d8508f2d99fd
4
- data.tar.gz: e6c3263d53cad2ff342195ac01581039520cbe7ebb3622a47f3adaa6e2690110
3
+ metadata.gz: 1e918d13d52a6a9f552268e94d638b32654d63dc9ab20d299b163c6ad84ff548
4
+ data.tar.gz: 0bf50c0a8b76af41801b7ada33a7b8748a33b99a9ec0095a3a4b6c513cd9e1a1
5
5
  SHA512:
6
- metadata.gz: 17d199bc2b8421bc0efb370b145576d948236be298ea2ef80ef6e865a751130d8d5016bfb7e2f366202a55d062b80ba7b5e4494166086c15da3a65a9aec2c715
7
- data.tar.gz: 6341dc95fdc95c2442eaf105297e153697ce9227b9d81993862b70c94f2d9e9449d5f1bb47a60ef39a2e5202e06e282168a95093cb18f9930c15a0c43b5b61ce
6
+ metadata.gz: c99c23d0ac8876b192a71ef57e07fc5668123d1af4865048ce575b657a1761bf54958220bee6ec3c8ecae5ad102c16f605c32fcf9c11294b7c94aea18fc83c54
7
+ data.tar.gz: 76b28e162bf1c42c9b9eb47aa338c3708e27e54123461577fe50570925ad6a1c8b46db66f71b6800378056cba5d3dfef976e33ba24d7052edfcaa5b6dd912012
data/Gemfile CHANGED
@@ -5,7 +5,6 @@ source "https://rubygems.org"
5
5
  gemspec
6
6
 
7
7
  gem "dry-types"
8
- gem "dry-struct"
9
8
  gem "priscilla", github: "corp-gp/priscilla"
10
9
  gem "rake", "~> 13.0"
11
10
  gem "rspec", "~> 3.9"
data/Gemfile.lock CHANGED
@@ -22,7 +22,7 @@ GIT
22
22
  PATH
23
23
  remote: .
24
24
  specs:
25
- active_typed_store (1.3.0)
25
+ active_typed_store (2.2.0)
26
26
  activemodel
27
27
  activerecord
28
28
  activesupport
@@ -63,11 +63,6 @@ GEM
63
63
  concurrent-ruby (~> 1.0)
64
64
  dry-core (~> 1.0, < 2)
65
65
  zeitwerk (~> 2.6)
66
- dry-struct (1.6.0)
67
- dry-core (~> 1.0, < 2)
68
- dry-types (>= 1.7, < 2)
69
- ice_nine (~> 0.11)
70
- zeitwerk (~> 2.6)
71
66
  dry-types (1.7.2)
72
67
  bigdecimal (~> 3.0)
73
68
  concurrent-ruby (~> 1.0)
@@ -77,7 +72,6 @@ GEM
77
72
  zeitwerk (~> 2.6)
78
73
  i18n (1.14.5)
79
74
  concurrent-ruby (~> 1.0)
80
- ice_nine (0.11.2)
81
75
  json (2.7.2)
82
76
  language_server-protocol (3.17.0.3)
83
77
  logger (1.6.1)
@@ -137,6 +131,8 @@ GEM
137
131
  rumoji (0.5.0)
138
132
  securerandom (0.3.1)
139
133
  sqlite3 (1.7.3-arm64-darwin)
134
+ sqlite3 (1.7.3-x86_64-darwin)
135
+ sqlite3 (1.7.3-x86_64-linux)
140
136
  timeout (0.4.1)
141
137
  tzinfo (2.0.6)
142
138
  concurrent-ruby (~> 1.0)
@@ -144,11 +140,14 @@ GEM
144
140
  zeitwerk (2.6.18)
145
141
 
146
142
  PLATFORMS
143
+ arm64-darwin-21
144
+ arm64-darwin-23
147
145
  arm64-darwin-24
146
+ x86_64-darwin-21
147
+ x86_64-linux
148
148
 
149
149
  DEPENDENCIES
150
150
  active_typed_store!
151
- dry-struct
152
151
  dry-types
153
152
  priscilla!
154
153
  rake (~> 13.0)
@@ -28,7 +28,8 @@ module ActiveTypedStore
28
28
  # dry_type[nil] для optional типов возвращает не default-значение, а nil
29
29
  reader(attr_name, field, type, (type.value if type.default?))
30
30
  else
31
- raise "type <#{type}> for field '#{field}' not supported"
31
+ writer(attr_name, field, type)
32
+ reader(attr_name, field, type, default)
32
33
  end
33
34
  end
34
35
 
@@ -42,40 +43,28 @@ module ActiveTypedStore
42
43
 
43
44
  private def reader(store_attribute, field, type, default)
44
45
  ivar_prev = :"@__ts_prev_#{field}"
46
+
45
47
  store_module.define_method(field) do
46
48
  val = read_store_attribute(store_attribute, field)
47
- return val if instance_variable_get(ivar_prev) == val.object_id && !val.nil?
48
49
 
49
- is_default = false
50
50
  casted_val =
51
51
  if val.nil? && !default.nil?
52
- is_default = true
53
- default.dup
52
+ v = default.dup
53
+ self[store_attribute][field] = v
54
+ clear_attribute_change(store_attribute)
55
+ self[store_attribute][field] = v
56
+ elsif val.nil?
57
+ return nil
58
+ elsif instance_variable_get(ivar_prev).eql?(val)
59
+ return val
54
60
  elsif type.respond_to?(:cast)
55
- type.cast(val)
61
+ casted = type.cast(val)
62
+ casted.eql?(val) ? val : (self[store_attribute][field] = casted)
56
63
  else
57
- type[val]
58
- end
59
-
60
- return_val =
61
- if casted_val.eql?(val)
62
- val
63
- else
64
- is_changed = attribute_changed?(store_attribute)
65
-
66
- # write cast val
67
- self[store_attribute][field] = casted_val
68
-
69
- # discard changes
70
- if !is_changed && (val == casted_val || is_default)
71
- @attributes.write_from_database(store_attribute, self[store_attribute].to_json).value[field]
72
- else
73
- casted_val
74
- end
64
+ self[store_attribute][field] = type[val]
75
65
  end
76
66
 
77
- instance_variable_set(ivar_prev, return_val.object_id)
78
- return_val
67
+ instance_variable_set(ivar_prev, casted_val)
79
68
  end
80
69
  end
81
70
  end
@@ -2,10 +2,19 @@
2
2
 
3
3
  module ActiveTypedStore
4
4
  module Store
5
+ class CustomJson < ActiveRecord::Type::Json
6
+ def changed_in_place?(raw_old_value, new_value)
7
+ deserialize(raw_old_value) != new_value.as_json
8
+ end
9
+ end
10
+
11
+ CUSTOM_JSON = CustomJson.new
12
+
5
13
  def typed_store(store_attribute, &)
6
14
  attrs = Attrs.new(store_attribute)
7
15
  attrs.instance_eval(&)
8
16
 
17
+ define_attribute(store_attribute.name, CUSTOM_JSON)
9
18
  store_accessor store_attribute, attrs.fields
10
19
 
11
20
  if ActiveTypedStore.config.hash_safety == :disallow_symbol_keys
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveTypedStore
4
- VERSION = "2.0.0"
4
+ VERSION = "2.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_typed_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ermolaev Andrey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-05-28 00:00:00.000000000 Z
11
+ date: 2025-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel