ar_doc_store 2.0.4 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afe26947ddd8664a737271d05ab8635e62c1f757f97ad52b6d85b703e7c40cb6
4
- data.tar.gz: 413625561be11082f189c64715aaacfa61a15b4f92de05f98965024908c806a9
3
+ metadata.gz: b5e0f3b286ab52eebdb032146c7bd7c368f76888221e3bdf1c01f3a7d088d5ef
4
+ data.tar.gz: 96e38a0850648b7eb8af1f7b1ebadc44c136b0633f0c33a398ab3e632d734f88
5
5
  SHA512:
6
- metadata.gz: 2897af9b534b27f233469c277931a78df6154412ecc7e54386168f15b553af567cbca9133ff729f465bcec238f464bf5622b6e01e6c20658ade61aeb315e365d
7
- data.tar.gz: 5512f91e3214cbeb4797aceb558106295649ff6ba19ff954ad8199aa8a97a313bc92f2ca1503e6d53668b0155f4af788f6a62286e1db036d98e76611b0b43a46
6
+ metadata.gz: 5d4cc8a28403eaf2f42277b1c5d1f2d702380c3a90b2dbce9a80aec55d02af3c716dcd15075eb513c8ac1d48f83db3a20e1006770d539eb81be16c2709f04b10
7
+ data.tar.gz: f7c4ab93d371cf71a7e8a29542e9a00a8a84d64910b9df8763ab56622531bcf5f4545f703c8755ec70bf18b49208ee1ac6996c93e7e44e54243fca8fd95bdecf
@@ -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", ">=5.2"
21
+ spec.add_dependency "activerecord", ">=6.1"
22
22
  spec.add_dependency "pg"
23
- spec.add_development_dependency "bundler", "~> 1.7"
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "ar_doc_store/version"
2
4
  require "ar_doc_store/storage"
3
5
  require "ar_doc_store/embedding"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  class Array < Base
@@ -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
- value = nil if value == '' || value == ['']
37
- send :attribute=, attribute_name, value
38
- new_value = send :attribute, attribute_name
39
- write_store_attribute(json_column, attribute_name, new_value)
40
- new_value
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 Boolean < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  module CallbackSupport
@@ -18,4 +20,4 @@ module ArDocStore
18
20
  end
19
21
  end
20
22
  end
21
- end
23
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  class Date < Base
@@ -18,4 +20,4 @@ module ArDocStore
18
20
  end
19
21
  end
20
22
  end
21
- end
23
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  class Datetime < Base
@@ -18,4 +20,4 @@ module ArDocStore
18
20
  end
19
21
  end
20
22
  end
21
- end
23
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  class Decimal < Base
@@ -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 = send :attribute, :#{attribute}
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
- send :attribute=, :#{attribute}, value
26
- new_value = send :attribute, :#{attribute}
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 = send :attribute, :#{attribute}
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
- write_store_attribute json_column, :#{attribute}, #{attribute}
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
  module ArDocStore
2
4
  module Attributes
3
5
  class Enumeration < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  class Float < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  class Integer < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Attributes
3
5
  class String < Base
@@ -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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
4
  module Embedding
3
5
  def self.included(mod)
@@ -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,25 +7,34 @@ 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
 
11
14
  module InstanceMethods
12
15
  def assign_json_data
13
16
  json_data = respond_to?(json_column) && self[json_column]
14
- return if json_data.blank?
15
- json_attributes.keys.each do |key|
17
+ json_data && json_attributes.keys.each do |key|
16
18
  next unless json_data.key?(key)
17
- send :attribute=, key, json_data[key] if self.respond_to?("#{key}=")
19
+ self[key] = json_data[key] if respond_to?("#{key}=")
20
+ # send :attribute=, key, json_data[key] if self.respond_to?("#{key}=")
18
21
  self[key].parent = self if self[key].respond_to?(:parent=)
19
22
  self[key].embedded_as = key if self[key].respond_to?(:embedded_as)
20
23
  mutations_from_database.forget_change(key) unless new_record?
21
24
  end
22
25
  end
26
+
27
+ def save_json_data
28
+ json_attributes.each do |key, value|
29
+ write_store_attribute(json_column, key, read_attribute(key)) if changes.key?(key)
30
+ end
31
+ end
32
+
23
33
  def mark_embeds_as_persisted
24
34
  json_attributes.values.each do |value|
25
- if value.respond_to?(:embedded?) && value.embedded? && respond_to?(value.attribute) && !public_send(value.attribute).nil?
26
- public_send(value.attribute).persist
35
+ if value.respond_to?(:embedded?) && value.embedded? && respond_to?(value.attribute)
36
+ val = public_send(value.attribute)
37
+ val.persist if val && val.respond_to?(:persist)
27
38
  end
28
39
  end
29
40
  end
@@ -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
- nil
30
- elsif values.respond_to?(:each)
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
- value
14
- elsif value.kind_of?(class_name)
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
- nil
26
- elsif value.kind_of?(class_name)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArDocStore
2
- VERSION = "2.0.4"
4
+ VERSION = "2.1.2"
3
5
  end
@@ -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
- assert_equal b.data['entrance']['name'], b.entrance.name
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.0.4
4
+ version: 2.1.2
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: 2018-11-20 00:00:00.000000000 Z
11
+ date: 2021-01-26 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: '5.2'
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: '5.2'
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: '1.7'
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: '1.7'
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
- rubyforge_project:
154
- rubygems_version: 2.7.7
155
- signing_key:
153
+ rubygems_version: 3.0.8
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: