activerecord-sqlite-types 0.3.1 → 0.3.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 +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/sqlite_types/array.rb +59 -1
- data/lib/sqlite_types/ip_address.rb +2 -2
- data/lib/sqlite_types/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 81175508913f3b2ce7a13f10d48dd86bfa7c040bd77945af0c1b14c95468847d
|
|
4
|
+
data.tar.gz: 01fe17d2fbc47bde9745418246959cfe376e1a454bd6448b723ec2a2f09b5974
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: be09ffdd30ac8794d139836d669a2f410caad99abf4e247b95684876c767a413e769840953cd8d13cdfd09a318f5b46e055830a87b9b46780a1d636a22a8eebc
|
|
7
|
+
data.tar.gz: 64b75feb538d840a567201e486e4685a9fbf0483e9fa9cc514a2f75bad8a2677a15386dadf8163d2fe999f3779506059d64c2a39ad76ba99b5c0aa9059262f3f
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [0.3.3] - 2026-05-14
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Canonicalize `IpAddress` string serialization to match `IPAddr` values in Active Record lookup and query paths
|
|
8
|
+
|
|
9
|
+
## [0.3.2] - 2026-05-14
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Serialize Rails assignment values for JSON-backed arrays before subtype validation
|
|
14
|
+
|
|
3
15
|
## [0.3.1] - 2026-05-14
|
|
4
16
|
|
|
5
17
|
### Fixed
|
data/lib/sqlite_types/array.rb
CHANGED
|
@@ -35,7 +35,7 @@ module SQLiteTypes
|
|
|
35
35
|
|
|
36
36
|
# Normalize through the same cast path as reads so persisted values and equality queries
|
|
37
37
|
# use one canonical JSON representation for the declared subtype.
|
|
38
|
-
array =
|
|
38
|
+
array = serialize_array(value)
|
|
39
39
|
array = serialize_datetime_array(array) if @subtype == :datetime
|
|
40
40
|
super(array)
|
|
41
41
|
end
|
|
@@ -66,6 +66,52 @@ module SQLiteTypes
|
|
|
66
66
|
raise ArgumentError, "Invalid #{description} value: #{value.inspect}"
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
+
def serialize_array(value)
|
|
70
|
+
array = parse_array(value)
|
|
71
|
+
|
|
72
|
+
if @nested
|
|
73
|
+
array.map do |nested_array|
|
|
74
|
+
parse_array(nested_array, nested: true).map { |element| serialize_element(element) }
|
|
75
|
+
end
|
|
76
|
+
else
|
|
77
|
+
array.map { |element| serialize_element(element) }
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def serialize_element(elem)
|
|
82
|
+
case @subtype
|
|
83
|
+
when :integer
|
|
84
|
+
return cast_integer_element(elem) if integer_string?(elem)
|
|
85
|
+
|
|
86
|
+
assert_json_compatible!(elem)
|
|
87
|
+
elem
|
|
88
|
+
when :string, :text
|
|
89
|
+
return elem.to_s if elem.instance_of?(::Symbol)
|
|
90
|
+
|
|
91
|
+
assert_json_compatible!(elem)
|
|
92
|
+
elem
|
|
93
|
+
when :hash
|
|
94
|
+
return elem if json_compatible?(elem)
|
|
95
|
+
return json_round_trip(elem) if elem.is_a?(::Hash)
|
|
96
|
+
|
|
97
|
+
serialized = json_round_trip(elem)
|
|
98
|
+
raise ArgumentError, "Invalid #{@subtype} array element: #{elem.inspect}" unless serialized.is_a?(::Hash) && serialized.any?
|
|
99
|
+
|
|
100
|
+
serialized
|
|
101
|
+
when :json, :jsonb
|
|
102
|
+
assert_json_compatible!(elem)
|
|
103
|
+
elem
|
|
104
|
+
when :datetime
|
|
105
|
+
unless elem.nil? || elem.is_a?(::String) || datetime_like?(elem)
|
|
106
|
+
raise ArgumentError, "Invalid #{@subtype} array element: #{elem.inspect}"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
cast_datetime_element(elem)
|
|
110
|
+
else
|
|
111
|
+
raise ArgumentError, "Unsupported subtype: #{@subtype}"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
69
115
|
def cast_element(elem)
|
|
70
116
|
raise ArgumentError, "Invalid #{@subtype} array element: #{elem.inspect}" unless storable_element?(elem)
|
|
71
117
|
|
|
@@ -150,5 +196,17 @@ module SQLiteTypes
|
|
|
150
196
|
end
|
|
151
197
|
end
|
|
152
198
|
end
|
|
199
|
+
|
|
200
|
+
def assert_json_compatible!(value)
|
|
201
|
+
return if json_compatible?(value)
|
|
202
|
+
|
|
203
|
+
raise ArgumentError, "Invalid #{@subtype} array element: #{value.inspect}"
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def json_round_trip(value)
|
|
207
|
+
::ActiveSupport::JSON.decode(::ActiveSupport::JSON.encode(value))
|
|
208
|
+
rescue JSON::ParserError, TypeError, EncodingError
|
|
209
|
+
raise ArgumentError, "Invalid #{@subtype} array element: #{value.inspect}"
|
|
210
|
+
end
|
|
153
211
|
end
|
|
154
212
|
end
|
|
@@ -9,8 +9,8 @@ module SQLiteTypes
|
|
|
9
9
|
when ::IPAddr
|
|
10
10
|
serialize_ipaddr(value)
|
|
11
11
|
when ::String
|
|
12
|
-
::IPAddr.new(value)
|
|
13
|
-
value
|
|
12
|
+
ipaddr = ::IPAddr.new(value)
|
|
13
|
+
value.include?("/") ? value : serialize_ipaddr(ipaddr)
|
|
14
14
|
else
|
|
15
15
|
raise ArgumentError, "Invalid IP address: #{value}"
|
|
16
16
|
end
|
data/lib/sqlite_types/version.rb
CHANGED