active_typed_store 1.2.0 → 2.0.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: 81b1efdd481c9034944b0b3ad6acb8972492128a13197a5054d291ee1b2e23ae
4
- data.tar.gz: 8af315be7e55e6af5bba99f126b1abf26217f3634aef8aae708abf0887270c5c
3
+ metadata.gz: 8bbeb2d1b777327fdb95ee0864943128f702833b22bb67499e89d8508f2d99fd
4
+ data.tar.gz: e6c3263d53cad2ff342195ac01581039520cbe7ebb3622a47f3adaa6e2690110
5
5
  SHA512:
6
- metadata.gz: 7dd04ad99513208826305d50e04b558778800b4ce3dbc6873193d995eb638b48a36c84c20b3a9c57dda18af7503751b48d9af291c6d720314ddf60a988f41b8c
7
- data.tar.gz: eb4103cf2a62dc935a4cb283896083710f66a60146a5e4086c4fbcf57d215d52e88f5102f744aded09fa4291e1e62afca3375cadc05cf5c2dcbf6e72e9652995
6
+ metadata.gz: 17d199bc2b8421bc0efb370b145576d948236be298ea2ef80ef6e865a751130d8d5016bfb7e2f366202a55d062b80ba7b5e4494166086c15da3a65a9aec2c715
7
+ data.tar.gz: 6341dc95fdc95c2442eaf105297e153697ce9227b9d81993862b70c94f2d9e9449d5f1bb47a60ef39a2e5202e06e282168a95093cb18f9930c15a0c43b5b61ce
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ source "https://rubygems.org"
5
5
  gemspec
6
6
 
7
7
  gem "dry-types"
8
+ gem "dry-struct"
8
9
  gem "priscilla", github: "corp-gp/priscilla"
9
10
  gem "rake", "~> 13.0"
10
11
  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.2.0)
25
+ active_typed_store (1.3.0)
26
26
  activemodel
27
27
  activerecord
28
28
  activesupport
@@ -63,6 +63,11 @@ 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)
66
71
  dry-types (1.7.2)
67
72
  bigdecimal (~> 3.0)
68
73
  concurrent-ruby (~> 1.0)
@@ -72,6 +77,7 @@ GEM
72
77
  zeitwerk (~> 2.6)
73
78
  i18n (1.14.5)
74
79
  concurrent-ruby (~> 1.0)
80
+ ice_nine (0.11.2)
75
81
  json (2.7.2)
76
82
  language_server-protocol (3.17.0.3)
77
83
  logger (1.6.1)
@@ -131,8 +137,6 @@ GEM
131
137
  rumoji (0.5.0)
132
138
  securerandom (0.3.1)
133
139
  sqlite3 (1.7.3-arm64-darwin)
134
- sqlite3 (1.7.3-x86_64-darwin)
135
- sqlite3 (1.7.3-x86_64-linux)
136
140
  timeout (0.4.1)
137
141
  tzinfo (2.0.6)
138
142
  concurrent-ruby (~> 1.0)
@@ -140,13 +144,11 @@ GEM
140
144
  zeitwerk (2.6.18)
141
145
 
142
146
  PLATFORMS
143
- arm64-darwin-21
144
- arm64-darwin-23
145
- x86_64-darwin-21
146
- x86_64-linux
147
+ arm64-darwin-24
147
148
 
148
149
  DEPENDENCIES
149
150
  active_typed_store!
151
+ dry-struct
150
152
  dry-types
151
153
  priscilla!
152
154
  rake (~> 13.0)
@@ -5,7 +5,7 @@ module ActiveTypedStore
5
5
  attr_reader :fields, :store_module, :store_attribute
6
6
 
7
7
  def initialize(store_attribute)
8
- @store_attribute = store_attribute
8
+ @store_attribute = store_attribute.is_a?(Symbol) ? store_attribute.name : store_attribute
9
9
  @fields = []
10
10
  @store_module = Module.new
11
11
  end
@@ -41,27 +41,41 @@ module ActiveTypedStore
41
41
  end
42
42
 
43
43
  private def reader(store_attribute, field, type, default)
44
- ivar_prev = :"@__ts_prev_#{field}"
45
- ivar_cache = :"@__ts_cache_#{field}"
44
+ ivar_prev = :"@__ts_prev_#{field}"
46
45
  store_module.define_method(field) do
47
46
  val = read_store_attribute(store_attribute, field)
48
- return instance_variable_get(ivar_cache) if instance_variable_get(ivar_prev) == val && !val.nil?
47
+ return val if instance_variable_get(ivar_prev) == val.object_id && !val.nil?
49
48
 
50
- cache_val =
49
+ is_default = false
50
+ casted_val =
51
51
  if val.nil? && !default.nil?
52
- is_changed = attribute_changed?(store_attribute)
53
- stored_value = self[store_attribute][field] = default.dup
54
- clear_attribute_change(store_attribute) unless is_changed
55
- stored_value
52
+ is_default = true
53
+ default.dup
56
54
  elsif type.respond_to?(:cast)
57
- casted = type.cast(val)
58
- casted.eql?(val) ? val : casted
55
+ type.cast(val)
59
56
  else
60
57
  type[val]
61
58
  end
62
59
 
63
- instance_variable_set(ivar_prev, val)
64
- instance_variable_set(ivar_cache, cache_val)
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
75
+ end
76
+
77
+ instance_variable_set(ivar_prev, return_val.object_id)
78
+ return_val
65
79
  end
66
80
  end
67
81
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveTypedStore
4
- VERSION = "1.2.0"
4
+ VERSION = "2.0.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: 1.2.0
4
+ version: 2.0.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: 2024-10-22 00:00:00.000000000 Z
11
+ date: 2025-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -94,8 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
94
  - !ruby/object:Gem::Version
95
95
  version: '0'
96
96
  requirements: []
97
- rubygems_version: 3.3.17
97
+ rubygems_version: 3.3.7
98
98
  signing_key:
99
99
  specification_version: 4
100
- summary: Typed store for active records json/hstore columns
100
+ summary: Typed store for active records json columns (postgresql, mysql, sqlite)
101
101
  test_files: []