activejsonmodel 0.1.2 → 0.1.5
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/README.md +3 -3
- data/lib/{activejsonmodel → active_json_model}/active_record_encrypted_type.rb +25 -13
- data/lib/{activejsonmodel → active_json_model}/active_record_type.rb +14 -7
- data/lib/{activejsonmodel → active_json_model}/after_load_callback.rb +0 -0
- data/lib/{activejsonmodel → active_json_model}/array.rb +35 -3
- data/lib/{activejsonmodel → active_json_model}/json_attribute.rb +0 -0
- data/lib/{activejsonmodel → active_json_model}/model.rb +27 -3
- data/lib/{activejsonmodel → active_json_model}/utils.rb +0 -0
- data/lib/{activejsonmodel → active_json_model}/version.rb +1 -1
- data/lib/active_json_model.rb +9 -4
- data/lib/activejsonmodel.rb +4 -0
- metadata +17 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6358d312dd78f6dec607bfcc0417e3bb716c8029d19502701d2c96704107d0f7
|
4
|
+
data.tar.gz: 0da1d126eead2748545c9455ac94a4b79c94e4278526ef9f78332104c63f121a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e9d4ec02edfcdfc3ac5eea8ed235094e37d18be43e4980d1fc789219856c73fe442116c53362f5e36e91ca1a79f3a5845f7da85e6a0822dc0271e7a2b6c7e45
|
7
|
+
data.tar.gz: 78b47a73bc4f50e8309655b01dbac8851377630941e1e85fba9c30e02e4f5a7c0c0a326c1bfd5e6fc3f0c0f04437a23e8b948a1295e235d609abfa91d0b2a40f
|
data/README.md
CHANGED
@@ -214,12 +214,12 @@ end
|
|
214
214
|
|
215
215
|
```bash
|
216
216
|
$ rake release
|
217
|
-
|
217
|
+
active_json_model x.x.x built to pkg/active_json_model-x.x.x.gem.
|
218
218
|
Tagged vx.x.x.
|
219
219
|
Pushed git commits and release tag.
|
220
220
|
Pushing gem to https://rubygems.org...
|
221
|
-
Successfully registered gem:
|
222
|
-
Pushed
|
221
|
+
Successfully registered gem: active_json_model (x.x.x)
|
222
|
+
Pushed active_json_model x.x.x to rubygems.org
|
223
223
|
Don't forget to publish the release on GitHub!
|
224
224
|
```
|
225
225
|
|
@@ -18,25 +18,29 @@ if Gem.find_files("symmetric-encryption").any? &&
|
|
18
18
|
# end
|
19
19
|
# end
|
20
20
|
#
|
21
|
-
# class
|
21
|
+
# class User < ActiveRecord::Base
|
22
22
|
# attribute :credentials, Credentials.encrypted_attribute_type
|
23
23
|
# end
|
24
|
+
#
|
25
|
+
# Alternatively, the type can be registered ahead of time:
|
26
|
+
#
|
27
|
+
# # config/initializers/types.rb
|
28
|
+
# ActiveRecord::Type.register(:credentials_encrypted_type, Credentials.encrypted_attribute_type)
|
29
|
+
#
|
30
|
+
# Then the custom type can be used as:
|
31
|
+
#
|
32
|
+
# class User < ActiveRecord::Base
|
33
|
+
# attribute :credentials, :credentials_encrypted_type
|
34
|
+
# end
|
35
|
+
#
|
24
36
|
class ActiveRecordEncryptedType < ::ActiveJsonModel::ActiveRecordType
|
25
37
|
def type
|
26
38
|
:string
|
27
39
|
end
|
28
40
|
|
29
|
-
def cast(value)
|
30
|
-
if value.is_a?(@clazz)
|
31
|
-
value
|
32
|
-
elsif value.is_a?(::Array)
|
33
|
-
@clazz.load(value)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
41
|
def deserialize(value)
|
38
42
|
if String === value
|
39
|
-
|
43
|
+
decoded = SymmetricEncryption.decrypt(value, type: :json) rescue nil
|
40
44
|
@clazz.load(decoded)
|
41
45
|
else
|
42
46
|
super
|
@@ -46,9 +50,17 @@ if Gem.find_files("symmetric-encryption").any? &&
|
|
46
50
|
def serialize(value)
|
47
51
|
case value
|
48
52
|
when @clazz
|
49
|
-
|
50
|
-
|
51
|
-
|
53
|
+
SymmetricEncryption.encrypt(
|
54
|
+
@clazz.dump(value),
|
55
|
+
random_iv: true,
|
56
|
+
type: :json
|
57
|
+
)
|
58
|
+
when ::Hash, ::HashWithIndifferentAccess, ::Array
|
59
|
+
SymmetricEncryption.encrypt(
|
60
|
+
value,
|
61
|
+
random_iv: true,
|
62
|
+
type: :json
|
63
|
+
)
|
52
64
|
else
|
53
65
|
super
|
54
66
|
end
|
@@ -15,10 +15,21 @@ if Gem.find_files("active_record").any?
|
|
15
15
|
# end
|
16
16
|
# end
|
17
17
|
#
|
18
|
-
# class
|
18
|
+
# class User < ActiveRecord::Base
|
19
19
|
# attribute :credentials, Credentials.attribute_type
|
20
20
|
# end
|
21
21
|
#
|
22
|
+
# Alternatively, the type can be registered ahead of time:
|
23
|
+
#
|
24
|
+
# # config/initializers/types.rb
|
25
|
+
# ActiveRecord::Type.register(:credentials_type, Credentials.attribute_type)
|
26
|
+
#
|
27
|
+
# Then the custom type can be used as:
|
28
|
+
#
|
29
|
+
# class User < ActiveRecord::Base
|
30
|
+
# attribute :credentials, :credentials_type
|
31
|
+
# end
|
32
|
+
#
|
22
33
|
# This is based on:
|
23
34
|
# https://jetrockets.pro/blog/rails-5-attributes-api-value-objects-and-jsonb
|
24
35
|
class ActiveRecordType < ::ActiveRecord::Type::Value
|
@@ -39,11 +50,7 @@ if Gem.find_files("active_record").any?
|
|
39
50
|
end
|
40
51
|
|
41
52
|
def cast(value)
|
42
|
-
|
43
|
-
value
|
44
|
-
elsif value.is_a?(::Array)
|
45
|
-
@clazz.load(value)
|
46
|
-
end
|
53
|
+
@clazz.active_json_model_cast(value)
|
47
54
|
end
|
48
55
|
|
49
56
|
def deserialize(value)
|
@@ -59,7 +66,7 @@ if Gem.find_files("active_record").any?
|
|
59
66
|
case value
|
60
67
|
when @clazz
|
61
68
|
::ActiveSupport::JSON.encode(@clazz.dump(value))
|
62
|
-
when
|
69
|
+
when ::Hash, ::HashWithIndifferentAccess, ::Array
|
63
70
|
::ActiveSupport::JSON.encode(value)
|
64
71
|
else
|
65
72
|
super
|
File without changes
|
@@ -6,7 +6,7 @@ require 'active_support'
|
|
6
6
|
require_relative './json_attribute'
|
7
7
|
require_relative './after_load_callback'
|
8
8
|
|
9
|
-
if
|
9
|
+
if Gem.find_files("active_record").any?
|
10
10
|
require_relative './active_record_type'
|
11
11
|
require_relative './active_record_encrypted_type'
|
12
12
|
end
|
@@ -238,7 +238,11 @@ module ActiveJsonModel
|
|
238
238
|
#
|
239
239
|
# Note that this array_data would be stored as jsonb in the database
|
240
240
|
def attribute_type
|
241
|
-
|
241
|
+
if Gem.find_files("active_record").any?
|
242
|
+
@attribute_type ||= ::ActiveJsonModel::ActiveRecordType.new(self)
|
243
|
+
else
|
244
|
+
raise RuntimeError.new('ActiveRecord must be installed to use attribute_type')
|
245
|
+
end
|
242
246
|
end
|
243
247
|
|
244
248
|
# Allow this model to be used as ActiveRecord attribute type in Rails 5+.
|
@@ -253,7 +257,15 @@ module ActiveJsonModel
|
|
253
257
|
# Note that this array_data would be stored as a string in the database, encrypted using
|
254
258
|
# a symmetric key at the application level.
|
255
259
|
def encrypted_attribute_type
|
256
|
-
|
260
|
+
if Gem.find_files("active_record").any?
|
261
|
+
if Gem.find_files("symmetric-encryption").any?
|
262
|
+
@encrypted_attribute_type ||= ::ActiveJsonModel::ActiveRecordEncryptedType.new(self)
|
263
|
+
else
|
264
|
+
raise RuntimeError.new('symmetric-encryption must be installed to use attribute_type')
|
265
|
+
end
|
266
|
+
else
|
267
|
+
raise RuntimeError.new('active_record must be installed to use attribute_type')
|
268
|
+
end
|
257
269
|
end
|
258
270
|
end
|
259
271
|
|
@@ -605,6 +617,26 @@ module ActiveJsonModel
|
|
605
617
|
end
|
606
618
|
end
|
607
619
|
|
620
|
+
# Convert a value that might already be an instance of this class from underlying data.
|
621
|
+
# Used to delegate potential loading from ActiveRecord attributes
|
622
|
+
#
|
623
|
+
# @param vals either an instance of this model or an array-like object
|
624
|
+
def active_json_model_cast(vals)
|
625
|
+
if vals.is_a?(self)
|
626
|
+
vals
|
627
|
+
elsif vals.is_a?(::Array)
|
628
|
+
if vals.length == 0
|
629
|
+
self.new(values: vals)
|
630
|
+
elsif vals[0].respond_to?(:dump_to_json)
|
631
|
+
self.new(values: vals)
|
632
|
+
else
|
633
|
+
self.load(vals)
|
634
|
+
end
|
635
|
+
elsif vals.nil?
|
636
|
+
self.new(values: [])
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
608
640
|
# Define a polymorphic factory to choose the concrete class for the list model. Note that because the array_data passed
|
609
641
|
# to the block is an array of models, you must account for what the behavior is if there are no elements.
|
610
642
|
#
|
File without changes
|
@@ -5,7 +5,7 @@ require 'json'
|
|
5
5
|
require_relative './json_attribute'
|
6
6
|
require_relative './after_load_callback'
|
7
7
|
|
8
|
-
if
|
8
|
+
if Gem.find_files("active_record").any?
|
9
9
|
require_relative './active_record_type'
|
10
10
|
require_relative './active_record_encrypted_type'
|
11
11
|
end
|
@@ -275,7 +275,11 @@ module ActiveJsonModel
|
|
275
275
|
#
|
276
276
|
# Note that this data would be stored as jsonb in the database
|
277
277
|
def attribute_type
|
278
|
-
|
278
|
+
if Gem.find_files("active_record").any?
|
279
|
+
@attribute_type ||= ::ActiveJsonModel::ActiveRecordType.new(self)
|
280
|
+
else
|
281
|
+
raise RuntimeError.new('ActiveRecord must be installed to use attribute_type')
|
282
|
+
end
|
279
283
|
end
|
280
284
|
|
281
285
|
# Allow this model to be used as ActiveRecord attribute type in Rails 5+.
|
@@ -290,7 +294,15 @@ module ActiveJsonModel
|
|
290
294
|
# Note that this data would be stored as a string in the database, encrypted using
|
291
295
|
# a symmetric key at the application level.
|
292
296
|
def encrypted_attribute_type
|
293
|
-
|
297
|
+
if Gem.find_files("active_record").any?
|
298
|
+
if Gem.find_files("symmetric-encryption").any?
|
299
|
+
@encrypted_attribute_type ||= ::ActiveJsonModel::ActiveRecordEncryptedType.new(self)
|
300
|
+
else
|
301
|
+
raise RuntimeError.new('symmetric-encryption must be installed to use attribute_type')
|
302
|
+
end
|
303
|
+
else
|
304
|
+
raise RuntimeError.new('active_record must be installed to use attribute_type')
|
305
|
+
end
|
294
306
|
end
|
295
307
|
end
|
296
308
|
|
@@ -547,6 +559,18 @@ module ActiveJsonModel
|
|
547
559
|
end
|
548
560
|
end
|
549
561
|
|
562
|
+
# Convert a value that might already be an instance of this class from underlying data.
|
563
|
+
# Used to delegate potential loading from ActiveRecord attributes
|
564
|
+
#
|
565
|
+
# @param val either an instance of this model or a Hash like object
|
566
|
+
def active_json_model_cast(val)
|
567
|
+
if val.is_a?(self)
|
568
|
+
val
|
569
|
+
elsif val.is_a?(::Hash) || val.is_a?(::HashWithIndifferentAccess)
|
570
|
+
self.load(val)
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
550
574
|
# Register a new after load callback which is invoked after the instance is loaded from JSON
|
551
575
|
#
|
552
576
|
# @param method_name [Symbol, String] the name of the method to be invoked
|
File without changes
|
data/lib/active_json_model.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
require 'active_model'
|
2
|
+
require "active_support"
|
2
3
|
|
3
4
|
module ActiveJsonModel
|
4
|
-
|
5
|
-
|
6
|
-
autoload :
|
7
|
-
autoload :
|
5
|
+
extend ActiveSupport::Autoload
|
6
|
+
|
7
|
+
autoload :ActiveRecordEncryptedType, "active_json_model/active_record_encrypted_type" unless Gem.find_files("active_record").none? || Gem.find_files("symmetric-encryption").none?
|
8
|
+
autoload :ActiveRecordType, "active_json_model/active_record_type" unless Gem.find_files("active_record").none?
|
9
|
+
autoload :Array, "active_json_model/array"
|
10
|
+
autoload :Model, "active_json_model/model"
|
11
|
+
autoload :Utils, "active_json_model/utils"
|
12
|
+
autoload :VERSION, "active_json_model/version"
|
8
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activejsonmodel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Morlok
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -50,7 +50,12 @@ dependencies:
|
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '7.1'
|
53
|
-
description:
|
53
|
+
description: |
|
54
|
+
A library for creating Active Models that can serialize/deserialize to JSON. This includes full support for validation
|
55
|
+
and change detection through nested models. You can write polymorphic models or arrays of models and get full support
|
56
|
+
for natural serialization.
|
57
|
+
|
58
|
+
Active JSON Model can optionally be combined with Active Record to create nested child models via JSON/JSONB columns.
|
54
59
|
email:
|
55
60
|
- ryan.morlok@morlok.com
|
56
61
|
executables: []
|
@@ -60,14 +65,15 @@ files:
|
|
60
65
|
- LICENSE.txt
|
61
66
|
- README.md
|
62
67
|
- lib/active_json_model.rb
|
63
|
-
- lib/
|
64
|
-
- lib/
|
65
|
-
- lib/
|
66
|
-
- lib/
|
67
|
-
- lib/
|
68
|
-
- lib/
|
69
|
-
- lib/
|
70
|
-
- lib/
|
68
|
+
- lib/active_json_model/active_record_encrypted_type.rb
|
69
|
+
- lib/active_json_model/active_record_type.rb
|
70
|
+
- lib/active_json_model/after_load_callback.rb
|
71
|
+
- lib/active_json_model/array.rb
|
72
|
+
- lib/active_json_model/json_attribute.rb
|
73
|
+
- lib/active_json_model/model.rb
|
74
|
+
- lib/active_json_model/utils.rb
|
75
|
+
- lib/active_json_model/version.rb
|
76
|
+
- lib/activejsonmodel.rb
|
71
77
|
homepage: https://github.com/rmorlok/activejsonmodel
|
72
78
|
licenses:
|
73
79
|
- MIT
|