coaster 1.4.11 → 1.4.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/coaster/safe_yaml_serializer.rb +9 -22
- data/lib/coaster/serialized_properties.rb +5 -5
- data/lib/coaster/version.rb +1 -1
- data/lib/coaster.rb +2 -0
- data/test/support/models.rb +2 -0
- data/test/test_serialized_property.rb +14 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d279a04cfebf399525a91a6c5a420edb97b1e88e2e546cd731cca891a331f3dd
|
4
|
+
data.tar.gz: a631c80a70d26b6def26707657a4a5936011f2b937de0b0389f1245d5c9ff7b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4172c445dd990e6ed2950f60a688abc87b6824d935a8a1a52e2dbd1267245f5d22bfc056fd76f7328de74ca776ee2b3e6531993952384e91ecb90d2dc247229
|
7
|
+
data.tar.gz: ec9afaecd622f124d418a8b00aff82783ec92fef04096c07a1b0ee58dc569f13ecc0bf923dab961768d0dde134fb24a107d83f3481aa956be944edd4ec583ffe
|
@@ -1,19 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Coaster
|
4
|
-
# +ActiveRecord::AttributeMethods::Serialization#serialize+ 적용시 YAML
|
5
|
-
# 시리얼라이저로 지정한다. 다음과 같은 특징이 있다.
|
6
|
-
# * 안전한 YAML(+Psych.safe_load+ 가능한 YAML)로 시리얼라이즈한다.
|
7
|
-
# * +Hash+ 만 지원한다.
|
8
|
-
# * YAML 데이터가 nil 인 경우 +load+ 하면 빈 해시를 반환한다.
|
9
|
-
# * +load+ 는 +ActiveSupport::HashWithIndifferentAccess+ 를 반환한다.
|
10
|
-
# ==== 주의
|
11
|
-
# * 해시 값에 지정된 객체는 기본 타입(String으로 변환된다
|
12
|
-
#
|
13
|
-
# ==== Example
|
14
|
-
# class User < ApplicationRecord
|
15
|
-
# serialize :data, SafeYamlSerializer
|
16
|
-
# end
|
17
4
|
class SafeYamlSerializer
|
18
5
|
class << self
|
19
6
|
def dump(obj)
|
@@ -25,14 +12,12 @@ module Coaster
|
|
25
12
|
return {} if yaml.nil?
|
26
13
|
return yaml unless yaml.is_a?(String) && yaml.start_with?("---")
|
27
14
|
|
28
|
-
|
29
|
-
YAML.
|
30
|
-
|
31
|
-
|
32
|
-
YAML.
|
33
|
-
|
34
|
-
# Rails.logger.warn e.inspect
|
35
|
-
# Rails.logger.warn e.backtrace.join("\n")
|
15
|
+
begin
|
16
|
+
YAML.safe_load(yaml, permitted_classes: [Date, Time], aliases: true) || {}
|
17
|
+
rescue Psych::DisallowedClass => e
|
18
|
+
if YAML.respond_to?(:unsafe_load)
|
19
|
+
YAML.unsafe_load(yaml) || {}
|
20
|
+
else
|
36
21
|
YAML.load(yaml) || {}
|
37
22
|
end
|
38
23
|
end
|
@@ -40,7 +25,9 @@ module Coaster
|
|
40
25
|
|
41
26
|
# @return [HashWithIndifferentAccess]
|
42
27
|
def load(yaml)
|
43
|
-
|
28
|
+
obj = _load_hash(yaml)
|
29
|
+
obj = obj.with_indifferent_access if obj.is_a?(Hash)
|
30
|
+
obj
|
44
31
|
end
|
45
32
|
end
|
46
33
|
end
|
@@ -106,7 +106,7 @@ module Coaster
|
|
106
106
|
_define_serialized_property(serialize_column, key, default: default || [])
|
107
107
|
elsif type.respond_to?(:serialized_property_serializer) && (serializer = type.serialized_property_serializer)
|
108
108
|
_define_serialized_property(serialize_column, key, getter: serializer[:getter], setter: serializer[:setter], setter_callback: serializer[:setter_callback], default: default)
|
109
|
-
elsif type.is_a?(Class) && type < ActiveRecord::Base
|
109
|
+
elsif (type.is_a?(Symbol) && (t = type.to_s.constantize rescue nil)) || (type.is_a?(Class) && type < ActiveRecord::Base && (t = type))
|
110
110
|
_define_serialized_property serialize_column, "#{key}_id", default: default
|
111
111
|
|
112
112
|
define_method key.to_sym do
|
@@ -116,10 +116,10 @@ module Coaster
|
|
116
116
|
if key_id.nil?
|
117
117
|
instance_val = nil
|
118
118
|
else
|
119
|
-
instance_val =
|
120
|
-
instance_variable_set("@#{key}".to_sym, instance_val)
|
119
|
+
instance_val = t.find(key_id) rescue nil
|
121
120
|
end
|
122
121
|
instance_val = getter.call(instance_val) if getter
|
122
|
+
instance_variable_set("@#{key}".to_sym, instance_val)
|
123
123
|
instance_val
|
124
124
|
end
|
125
125
|
|
@@ -130,8 +130,8 @@ module Coaster
|
|
130
130
|
instance_variable_set("@#{key}".to_sym, nil)
|
131
131
|
send("#{key}_id=".to_sym, nil)
|
132
132
|
else
|
133
|
-
unless val.is_a?(
|
134
|
-
raise ActiveRecord::AssociationTypeMismatch, "#{
|
133
|
+
unless val.is_a?(t)
|
134
|
+
raise ActiveRecord::AssociationTypeMismatch, "#{t}(##{t.object_id}) expected, got #{val.class.name}(#{val.class.object_id})"
|
135
135
|
end
|
136
136
|
instance_variable_set("@#{key}".to_sym, val)
|
137
137
|
send("#{key}_id=".to_sym, (Integer(val.id) rescue val.id))
|
data/lib/coaster/version.rb
CHANGED
data/lib/coaster.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'oj'
|
2
|
+
require 'active_support/deprecation'
|
3
|
+
require 'active_support/deprecator'
|
2
4
|
require 'active_support/core_ext/hash/indifferent_access'
|
3
5
|
require 'active_support/core_ext/module/attribute_accessors'
|
4
6
|
require 'active_support/core_ext/class/attribute_accessors'
|
data/test/support/models.rb
CHANGED
@@ -6,6 +6,8 @@ class User < ActiveRecord::Base
|
|
6
6
|
extend Coaster::SerializedProperties
|
7
7
|
serialized_column :data
|
8
8
|
serialized_property :data, :appendix, default: {}
|
9
|
+
serialized_property :data, :father, type: :User
|
10
|
+
serialized_property :data, :mother, type: self
|
9
11
|
|
10
12
|
def init_appendix
|
11
13
|
appendix['test_key1'] ||= 0
|
@@ -14,6 +14,20 @@ module Coaster
|
|
14
14
|
user.init_appendix
|
15
15
|
assert_equal 0, user.appendix['test_key1']
|
16
16
|
assert_equal 0, user.appendix['test_key2']
|
17
|
+
father = User.create(name: 'father')
|
18
|
+
user.father = father
|
19
|
+
assert_equal father, user.father
|
20
|
+
assert_equal father.id, user.father_id
|
21
|
+
mother = User.create(name: 'mother')
|
22
|
+
user.mother = mother
|
23
|
+
assert_equal mother, user.mother
|
24
|
+
assert_equal mother.id, user.mother_id
|
25
|
+
assert_equal({"appendix"=>{"test_key1"=>0, "test_key2"=>0}, "father_id"=>father.id, "mother_id"=>mother.id}, user.data)
|
26
|
+
user.save!
|
27
|
+
user = User.find(user.id)
|
28
|
+
assert_equal({"appendix"=>{"test_key1"=>0, "test_key2"=>0}, "father_id"=>father.id, "mother_id"=>mother.id}, user.data)
|
29
|
+
assert_equal mother, user.mother
|
30
|
+
assert_equal father, user.father
|
17
31
|
end
|
18
32
|
end
|
19
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- buzz jung
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -56,14 +56,14 @@ dependencies:
|
|
56
56
|
name: activesupport
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 7.0.7
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 7.0.7
|
69
69
|
- !ruby/object:Gem::Dependency
|
@@ -246,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
246
246
|
- !ruby/object:Gem::Version
|
247
247
|
version: '0'
|
248
248
|
requirements: []
|
249
|
-
rubygems_version: 3.3.
|
249
|
+
rubygems_version: 3.3.27
|
250
250
|
signing_key:
|
251
251
|
specification_version: 4
|
252
252
|
summary: A little convenient feature for standard library
|