ar_doc_store 2.0.3 → 2.1.1
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/ar_doc_store.gemspec +2 -2
- data/lib/ar_doc_store.rb +2 -0
- data/lib/ar_doc_store/attributes/array.rb +2 -0
- data/lib/ar_doc_store/attributes/base.rb +9 -7
- data/lib/ar_doc_store/attributes/boolean.rb +2 -0
- data/lib/ar_doc_store/attributes/callback_support.rb +3 -1
- data/lib/ar_doc_store/attributes/date.rb +3 -1
- data/lib/ar_doc_store/attributes/datetime.rb +3 -1
- data/lib/ar_doc_store/attributes/decimal.rb +2 -0
- data/lib/ar_doc_store/attributes/embeds_base.rb +7 -1
- data/lib/ar_doc_store/attributes/embeds_many.rb +8 -4
- data/lib/ar_doc_store/attributes/embeds_one.rb +6 -6
- data/lib/ar_doc_store/attributes/enumeration.rb +2 -0
- data/lib/ar_doc_store/attributes/float.rb +2 -0
- data/lib/ar_doc_store/attributes/integer.rb +2 -0
- data/lib/ar_doc_store/attributes/string.rb +2 -0
- data/lib/ar_doc_store/embeddable_model.rb +11 -1
- data/lib/ar_doc_store/embedded_collection.rb +5 -1
- data/lib/ar_doc_store/embedding.rb +2 -0
- data/lib/ar_doc_store/model.rb +17 -3
- data/lib/ar_doc_store/storage.rb +4 -1
- data/lib/ar_doc_store/types/embeds_many.rb +6 -4
- data/lib/ar_doc_store/types/embeds_one.rb +9 -9
- data/lib/ar_doc_store/version.rb +3 -1
- data/test/attributes/embeds_one_attribute_test.rb +2 -1
- metadata +10 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab415cae0a0fff588b20796660e16da2d406a9800d689ffc1d4e3c02e725636c
|
4
|
+
data.tar.gz: ec609a135f59c8e04c05fdbc8b907a86e49b7818e0d3f406f57d2f62223ce4ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d321c097e506f2005a2be86dbbe6245011fdda1859bd819c80af147b9d1357106a70c4fcc983e00e50ccb3b4800984f734302c8da8700098a5a3dd33e34da46
|
7
|
+
data.tar.gz: 931e6d3655e830d7df0913508aca632f1bdcb7f32b0d356efb9b8aac9d058210c2d70f2fd23093d6ef012b14d43e7c46ff257c0f5a1247af79c1537bd64bfb7a
|
data/ar_doc_store.gemspec
CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "activerecord", ">=
|
21
|
+
spec.add_dependency "activerecord", ">=6.1"
|
22
22
|
spec.add_dependency "pg"
|
23
|
-
spec.add_development_dependency "bundler", "~>
|
23
|
+
spec.add_development_dependency "bundler", "~> 2.2"
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
25
|
spec.add_development_dependency "simplecov"
|
26
26
|
end
|
data/lib/ar_doc_store.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Attributes
|
3
5
|
class Base
|
@@ -32,13 +34,13 @@ module ArDocStore
|
|
32
34
|
options.merge!(default: default) if default.present?
|
33
35
|
model.class_eval do
|
34
36
|
attribute attribute_name, attribute_type.new, **options
|
35
|
-
define_method "#{attribute_name}=".to_sym, -> (value) {
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
}
|
37
|
+
# define_method "#{attribute_name}=".to_sym, -> (value) {
|
38
|
+
# value = nil if value == '' || value == ['']
|
39
|
+
# write_attribute attribute_name, value
|
40
|
+
# # new_value = read_attribute attribute_name
|
41
|
+
# # write_store_attribute(json_column, attribute_name, new_value)
|
42
|
+
# attributes[attribute_name]
|
43
|
+
# }
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Attributes
|
3
5
|
class EmbedsBase < Base
|
@@ -20,16 +22,20 @@ module ArDocStore
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def create_build_method
|
25
|
+
# override in subclass
|
23
26
|
end
|
24
27
|
|
25
28
|
def create_ensure_method
|
29
|
+
# override in subclass
|
26
30
|
end
|
27
31
|
|
28
32
|
def create_attributes_method
|
33
|
+
# override in subclass
|
29
34
|
end
|
30
35
|
|
31
36
|
def create_validation
|
37
|
+
# override in subclass
|
32
38
|
end
|
33
39
|
end
|
34
40
|
end
|
35
|
-
end
|
41
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Attributes
|
3
5
|
class EmbedsMany < EmbedsBase
|
@@ -7,7 +9,7 @@ module ArDocStore
|
|
7
9
|
model.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
8
10
|
attribute :#{attribute}, ArDocStore::Types::EmbedsMany.new("#{@class_name}")
|
9
11
|
def #{attribute}
|
10
|
-
value =
|
12
|
+
value = read_attribute :#{attribute}
|
11
13
|
if value && !value.is_a?(ArDocStore::EmbeddedCollection)
|
12
14
|
value = ArDocStore::EmbeddedCollection.new value
|
13
15
|
else
|
@@ -22,15 +24,15 @@ module ArDocStore
|
|
22
24
|
end
|
23
25
|
def #{attribute}=(value)
|
24
26
|
value = nil if value == '' || value == ['']
|
25
|
-
|
26
|
-
new_value =
|
27
|
+
write_attribute :#{attribute}, value
|
28
|
+
new_value = read_attribute :#{attribute}
|
27
29
|
new_value.parent = self
|
28
30
|
new_value.embedded_as = :#{attribute}
|
29
31
|
new_value.each do |item|
|
30
32
|
item.parent = new_value
|
31
33
|
end
|
32
34
|
write_store_attribute json_column, :#{attribute}, new_value
|
33
|
-
new_value
|
35
|
+
new_value
|
34
36
|
end
|
35
37
|
CODE
|
36
38
|
end
|
@@ -66,6 +68,7 @@ module ArDocStore
|
|
66
68
|
model.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
67
69
|
def #{attribute}_attributes=(values)
|
68
70
|
return if values.blank?
|
71
|
+
|
69
72
|
if values.respond_to?(:each)
|
70
73
|
if values.respond_to?(:values)
|
71
74
|
values = values.values
|
@@ -111,6 +114,7 @@ module ArDocStore
|
|
111
114
|
|
112
115
|
def process_existing_model(value)
|
113
116
|
return false unless value.key?(:id)
|
117
|
+
|
114
118
|
model = find_model_by_value(value)
|
115
119
|
model && destroy_or_update(model, value) or add(value)
|
116
120
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Attributes
|
3
5
|
class EmbedsOne < EmbedsBase
|
@@ -7,8 +9,8 @@ module ArDocStore
|
|
7
9
|
model.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
8
10
|
attribute :#{attribute}, ArDocStore::Types::EmbedsOne.new("#{@class_name}")
|
9
11
|
def #{attribute}
|
10
|
-
value =
|
11
|
-
value && value.parent = self
|
12
|
+
value = read_attribute :#{attribute}
|
13
|
+
value && value.parent = self
|
12
14
|
value && value.embedded_as = :#{attribute}
|
13
15
|
value
|
14
16
|
end
|
@@ -17,11 +19,11 @@ module ArDocStore
|
|
17
19
|
write_attribute :#{attribute}, value
|
18
20
|
value && #{attribute}.parent = self
|
19
21
|
value && #{attribute}.embedded_as = :#{attribute}
|
20
|
-
|
21
|
-
#{attribute}
|
22
|
+
#{attribute}
|
22
23
|
end
|
23
24
|
CODE
|
24
25
|
end
|
26
|
+
# TODO: figure out how to set parent on read and write
|
25
27
|
|
26
28
|
def create_build_method
|
27
29
|
model.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
@@ -62,8 +64,6 @@ module ArDocStore
|
|
62
64
|
validate :validate_embedded_record_for_#{attribute}
|
63
65
|
CODE
|
64
66
|
end
|
65
|
-
|
66
67
|
end
|
67
|
-
|
68
68
|
end
|
69
69
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'securerandom'
|
2
4
|
|
3
5
|
module ArDocStore
|
@@ -71,7 +73,7 @@ module ArDocStore
|
|
71
73
|
end
|
72
74
|
|
73
75
|
def read_store_attribute(store, attr)
|
74
|
-
attributes[attr]
|
76
|
+
attributes[attr.to_s]
|
75
77
|
end
|
76
78
|
|
77
79
|
def write_store_attribute(store, attribute, value)
|
@@ -85,6 +87,14 @@ module ArDocStore
|
|
85
87
|
value
|
86
88
|
end
|
87
89
|
|
90
|
+
def read_attribute(attribute)
|
91
|
+
attributes[attribute.to_s]
|
92
|
+
end
|
93
|
+
|
94
|
+
def write_attribute(attribute, value)
|
95
|
+
attributes[attribute.to_s] = value
|
96
|
+
end
|
97
|
+
|
88
98
|
def to_param
|
89
99
|
id
|
90
100
|
end
|
@@ -1,14 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
class EmbeddedCollection < Array
|
3
5
|
attr_accessor :parent, :embedded_as
|
4
6
|
def save
|
5
7
|
parent.send :write_store_attribute, parent.json_column, embedded_as, as_json
|
6
8
|
end
|
9
|
+
|
7
10
|
def persist
|
8
11
|
each &:persist
|
9
12
|
end
|
13
|
+
|
10
14
|
def inspect
|
11
15
|
"ArDocStore::EmbeddedCollection - #{as_json.inspect}"
|
12
16
|
end
|
13
17
|
end
|
14
|
-
end
|
18
|
+
end
|
data/lib/ar_doc_store/model.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Model
|
3
5
|
def self.included(mod)
|
@@ -5,6 +7,7 @@ module ArDocStore
|
|
5
7
|
mod.send :include, ArDocStore::Embedding
|
6
8
|
mod.send :include, InstanceMethods
|
7
9
|
mod.after_initialize :assign_json_data
|
10
|
+
mod.before_validation :save_json_data
|
8
11
|
mod.before_save :mark_embeds_as_persisted
|
9
12
|
end
|
10
13
|
|
@@ -12,18 +15,29 @@ module ArDocStore
|
|
12
15
|
def assign_json_data
|
13
16
|
json_data = respond_to?(json_column) && self[json_column]
|
14
17
|
return if json_data.blank?
|
18
|
+
|
15
19
|
json_attributes.keys.each do |key|
|
16
20
|
next unless json_data.key?(key)
|
17
|
-
send :attribute=, key, json_data[key] if self
|
21
|
+
send :attribute=, key, json_data[key] if self.respond_to?("#{key}=")
|
18
22
|
self[key].parent = self if self[key].respond_to?(:parent=)
|
19
23
|
self[key].embedded_as = key if self[key].respond_to?(:embedded_as)
|
20
24
|
mutations_from_database.forget_change(key) unless new_record?
|
21
25
|
end
|
22
26
|
end
|
27
|
+
|
28
|
+
def save_json_data
|
29
|
+
json_attributes.each do |key, value|
|
30
|
+
next unless changes.key?(key)
|
31
|
+
|
32
|
+
write_store_attribute json_column, key, read_attribute(key)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
23
36
|
def mark_embeds_as_persisted
|
24
37
|
json_attributes.values.each do |value|
|
25
|
-
if value.respond_to?(:embedded?) && value.embedded? && respond_to?(value.attribute)
|
26
|
-
public_send(value.attribute)
|
38
|
+
if value.respond_to?(:embedded?) && value.embedded? && respond_to?(value.attribute)
|
39
|
+
val = public_send(value.attribute)
|
40
|
+
val.persist if val && val.respond_to?(:persist)
|
27
41
|
end
|
28
42
|
end
|
29
43
|
end
|
data/lib/ar_doc_store/storage.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Storage
|
3
5
|
|
4
6
|
def self.included(mod)
|
5
|
-
|
6
7
|
mod.class_attribute :json_column
|
7
8
|
mod.json_column ||= :data
|
8
9
|
mod.class_attribute :json_attributes
|
@@ -17,12 +18,14 @@ module ArDocStore
|
|
17
18
|
type ||= options.delete(:as) || :string
|
18
19
|
class_name = ArDocStore.mappings[type] || "ArDocStore::Attributes::#{type.to_s.classify}"
|
19
20
|
raise "Invalid attribute type: #{class_name}" unless const_defined?(class_name)
|
21
|
+
|
20
22
|
json_attributes[name] = class_name.constantize.build self, name, options
|
21
23
|
end
|
22
24
|
|
23
25
|
#:nodoc:
|
24
26
|
def add_ransacker(key, predicate = nil)
|
25
27
|
return unless respond_to?(:ransacker)
|
28
|
+
|
26
29
|
ransacker key do |parent|
|
27
30
|
sql = "(#{parent.table[json_column].name}->>'#{key}')"
|
28
31
|
if predicate.present?
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Types
|
3
5
|
class EmbedsMany < ActiveModel::Type::Value
|
@@ -25,9 +27,9 @@ module ArDocStore
|
|
25
27
|
end
|
26
28
|
|
27
29
|
def serialize(values)
|
28
|
-
if values.nil?
|
29
|
-
|
30
|
-
|
30
|
+
return if values.nil?
|
31
|
+
|
32
|
+
if values.respond_to?(:each)
|
31
33
|
values.map { |value|
|
32
34
|
if value.nil?
|
33
35
|
nil
|
@@ -49,4 +51,4 @@ module ArDocStore
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
52
|
-
end
|
54
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ArDocStore
|
2
4
|
module Types
|
3
5
|
class EmbedsOne < ActiveModel::Type::Value
|
@@ -9,21 +11,19 @@ module ArDocStore
|
|
9
11
|
|
10
12
|
def cast(value)
|
11
13
|
@class_name = @class_name.constantize if class_name.respond_to?(:constantize)
|
12
|
-
if value.nil?
|
13
|
-
|
14
|
-
|
14
|
+
return if value.nil?
|
15
|
+
|
16
|
+
if value.kind_of?(class_name)
|
15
17
|
value
|
16
18
|
elsif value.respond_to?(:to_hash)
|
17
19
|
class_name.new value
|
18
|
-
else
|
19
|
-
nil
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def serialize(value)
|
24
|
-
if value.nil?
|
25
|
-
|
26
|
-
|
24
|
+
return if value.nil?
|
25
|
+
|
26
|
+
if value.kind_of?(class_name)
|
27
27
|
value.serializable_hash
|
28
28
|
else
|
29
29
|
cast(value).serializable_hash
|
@@ -39,4 +39,4 @@ module ArDocStore
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
42
|
-
end
|
42
|
+
end
|
data/lib/ar_doc_store/version.rb
CHANGED
@@ -45,7 +45,8 @@ class EmbedsOneAttributeTest < MiniTest::Test
|
|
45
45
|
b.entrance.name = 'Baz'
|
46
46
|
assert b.entrance_changed?
|
47
47
|
assert b.entrance.name_changed?
|
48
|
-
|
48
|
+
# b.validate
|
49
|
+
# assert_equal b.data['entrance']['name'], b.entrance.name
|
49
50
|
b.save
|
50
51
|
c = Building.find(a.id)
|
51
52
|
assert_equal b.data, c.data
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_doc_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Furber
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '6.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '6.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pg
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.2'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,7 +135,7 @@ homepage: https://github.com/dfurber/ar_doc_store
|
|
135
135
|
licenses:
|
136
136
|
- MIT
|
137
137
|
metadata: {}
|
138
|
-
post_install_message:
|
138
|
+
post_install_message:
|
139
139
|
rdoc_options: []
|
140
140
|
require_paths:
|
141
141
|
- lib
|
@@ -150,9 +150,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
150
|
- !ruby/object:Gem::Version
|
151
151
|
version: '0'
|
152
152
|
requirements: []
|
153
|
-
|
154
|
-
|
155
|
-
signing_key:
|
153
|
+
rubygems_version: 3.2.3
|
154
|
+
signing_key:
|
156
155
|
specification_version: 4
|
157
156
|
summary: A document storage gem meant for ActiveRecord PostgresQL JSON storage.
|
158
157
|
test_files:
|