ar_doc_store 0.0.9 → 0.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 859e7263865cce405dd43843c6be28ecadea246f
4
- data.tar.gz: ab105e19313a9daa2142bde69a1dba4aa871e3c9
3
+ metadata.gz: 7e522200ea6aeccb2f865c7642e7ce75ac64224a
4
+ data.tar.gz: 76c9d6f63fa544eb7bd38fc1e857db5c99f590aa
5
5
  SHA512:
6
- metadata.gz: c8cf5dde9b458e9713fedd7099d40450ec45767d3c648cdc7c5125b1ec949306e55fd61a9c33b4154e5c08d521b687335f41c9a0b73b248c1de6a415f028aa0a
7
- data.tar.gz: b1b30cb1b932b8b4d349fb11db08bd4d48746586bca625e7238ab777618f1e1cb771c37f4302210571814c3a6b596eca4cfd531d5ab2c98450556e179e7d50c4
6
+ metadata.gz: f247dfe4caaac8e32e33bb2c77fde2e7667e46c3a08e54f1fd6b4fd28a9685d445fb935c20b0964044658330b91f14bec70a3ed1823e651e2768252d6bcf4359
7
+ data.tar.gz: 5218202cab8de9cec3b81990a95087e9b3d3498837cf283528d8a792458448e837b366a14e2ec3a4ce3b84aa03c2a9160d8ae9e5d43575f906df8a3090fa20d4
@@ -115,12 +115,9 @@ module ArDocStore
115
115
  @parent, @class_name, @assn_name, @models, @values = parent, class_name, assn_name, models, values
116
116
  values.each { |value|
117
117
  value = value.symbolize_keys
118
- Rails.logger.info value.inspect
119
118
  if value.key?(:id)
120
- Rails.logger.info 'process_existing_model'
121
119
  process_existing_model(value)
122
120
  else
123
- Rails.logger.info 'adding new model'
124
121
  add(value)
125
122
  end
126
123
  }
@@ -33,10 +33,11 @@ module ArDocStore
33
33
 
34
34
  def initialize(attrs=HashWithIndifferentAccess.new)
35
35
  @attributes = HashWithIndifferentAccess.new
36
- self.parent = attrs.delete(:parent)
36
+ self.parent = attrs.delete(:parent) if attrs
37
37
  apply_attributes attrs
38
+ @_initialized = true
38
39
  end
39
-
40
+
40
41
  def apply_attributes(attrs=HashWithIndifferentAccess.new)
41
42
  virtual_attributes.keys.each do |attr|
42
43
  @attributes[attr] ||= nil
@@ -67,7 +68,11 @@ module ArDocStore
67
68
  end
68
69
 
69
70
  def write_store_attribute(store, key, value)
70
- changed_attributes[key] = read_store_attribute(:data, key)
71
+ changed_attributes[key] = read_store_attribute(:data, key) if @_initialized
72
+ @attributes[key] = value
73
+ end
74
+
75
+ def write_default_store_attribute(key, value)
71
76
  @attributes[key] = value
72
77
  end
73
78
 
@@ -5,7 +5,20 @@ module ArDocStore
5
5
  def self.included(mod)
6
6
  mod.send :include, ArDocStore::Storage
7
7
  mod.send :include, ArDocStore::Embedding
8
+ mod.send :include, InstanceMethods
9
+ end
10
+
11
+ module InstanceMethods
12
+
13
+ def write_store_attribute(store_attribute, key, value)
14
+ public_send "#{key}_will_change!"
15
+ super(store_attribute, key, value)
16
+ end
17
+
18
+ def write_default_store_attribute(key, default_value)
19
+ data[key] = default_value
20
+ end
21
+
8
22
  end
9
-
10
23
  end
11
24
  end
@@ -27,7 +27,7 @@ module ArDocStore
27
27
  super
28
28
  end
29
29
  end
30
-
30
+
31
31
  private
32
32
 
33
33
  def is_stored_attribute?(name)
@@ -44,6 +44,8 @@ module ArDocStore
44
44
  is_store_accessor_method?(name) ? name : name.match(/\'(\w+)\'/)[0].gsub("'", '')
45
45
  end
46
46
 
47
+
48
+
47
49
  end
48
50
 
49
51
  module ClassMethods
@@ -56,6 +58,7 @@ module ArDocStore
56
58
  raise "Invalid attribute type: #{name}" unless const_defined?(class_name)
57
59
  class_name = class_name.constantize
58
60
  class_name.build self, name, options
61
+ define_virtual_attribute_method name
59
62
  end
60
63
 
61
64
  def add_ransacker(key, predicate = nil)
@@ -88,7 +91,8 @@ module ArDocStore
88
91
  if value
89
92
  value.public_send(typecast_method)
90
93
  elsif default_value
91
- write_store_attribute(:data, key, default_value)
94
+ write_default_store_attribute(key, default_value)
95
+ # write_store_attribute(:data, key, default_value)
92
96
  default_value
93
97
  end
94
98
  }
@@ -101,7 +105,7 @@ module ArDocStore
101
105
  end
102
106
  }
103
107
  end
104
-
108
+
105
109
  def store_attribute_from_class(class_name, key)
106
110
  define_method key.to_sym, -> {
107
111
  ivar = "@#{key}"
@@ -125,6 +129,25 @@ module ArDocStore
125
129
  write_store_attribute :data, key, value
126
130
  }
127
131
  end
132
+
133
+ # Pretty much the same as define_attribute_method but skipping the matches that create read and write methods
134
+ def define_virtual_attribute_method(attr_name)
135
+ attr_name = attr_name.to_s
136
+ attribute_method_matchers.each do |matcher|
137
+ method_name = matcher.method_name(attr_name)
138
+ next if instance_method_already_implemented?(method_name)
139
+ next if %w{attribute attribute= attribute_before_type_cast}.include? matcher.method_missing_target
140
+ generate_method = "define_method_#{matcher.method_missing_target}"
141
+ if respond_to?(generate_method, true)
142
+ send(generate_method, attr_name)
143
+ else
144
+ define_proxy_call true, generated_attribute_methods, method_name, matcher.method_missing_target, attr_name.to_s
145
+ end
146
+ end
147
+ attribute_method_matchers_cache.clear
148
+ end
149
+
150
+
128
151
 
129
152
  def string_attributes(*args)
130
153
  args.each do |arg|
@@ -1,3 +1,3 @@
1
1
  module ArDocStore
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,24 @@
1
+ require_relative './test_helper'
2
+
3
+ class DirtylAttributeTest < MiniTest::Test
4
+
5
+ def test_dirty_attributes_on_model
6
+ b = Building.new name: 'Foo!'
7
+ assert_equal b.name_changed?, false
8
+ b.name = 'Bar.'
9
+ assert b.name_changed?
10
+ assert_equal 'Foo!', b.name_was
11
+ assert_equal 'Bar.', b.name
12
+ end
13
+
14
+ def test_dirty_attributes_on_embedded_model
15
+ b = Building.new
16
+ r = b.build_restroom is_signage_clear: true
17
+ assert_equal r.is_signage_clear_changed?, false
18
+ r.is_signage_clear = false
19
+ assert r.is_signage_clear_changed?
20
+ assert_equal true, r.is_signage_clear_was
21
+ assert_equal false, r.is_signage_clear
22
+ end
23
+
24
+ end
@@ -24,11 +24,12 @@ class ARDuck
24
24
 
25
25
  def initialize(attrs=nil)
26
26
  @attributes = HashWithIndifferentAccess.new
27
- return if attrs.nil?
28
- attrs.each { |key, value|
29
- key = "#{key}=".to_sym
30
- self.public_send(key, value) if methods.include?(key)
31
- }
27
+ unless attrs.nil?
28
+ attrs.each { |key, value|
29
+ @attributes[key] = value
30
+ }
31
+ end
32
+ @_initialized = true
32
33
  end
33
34
 
34
35
  def persisted?
@@ -52,18 +53,10 @@ class ARDuck
52
53
  end
53
54
 
54
55
  def write_store_attribute(store, key, value)
55
- changed_attributes[key] = read_store_attribute(:data, key)
56
+ #changed_attributes[key] = read_store_attribute(:data, key) if @_initialized
56
57
  @attributes[key] = value
57
58
  end
58
59
 
59
- def data_will_change!
60
- true
61
- end
62
-
63
- def self.columns_hash
64
- @@columns_hash ||= HashWithIndifferentAccess.new
65
- end
66
-
67
60
  end
68
61
 
69
62
  class EmptyModel
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: 0.0.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Furber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-11 00:00:00.000000000 Z
11
+ date: 2015-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -84,6 +84,7 @@ files:
84
84
  - lib/ar_doc_store/model.rb
85
85
  - lib/ar_doc_store/storage.rb
86
86
  - lib/ar_doc_store/version.rb
87
+ - test/dirty_attributes_test.rb
87
88
  - test/embedded_model_attribute_test.rb
88
89
  - test/embedding_test.rb
89
90
  - test/model_attribute_access_test.rb
@@ -113,6 +114,7 @@ signing_key:
113
114
  specification_version: 4
114
115
  summary: A document storage gem meant for ActiveRecord PostgresQL JSON storage.
115
116
  test_files:
117
+ - test/dirty_attributes_test.rb
116
118
  - test/embedded_model_attribute_test.rb
117
119
  - test/embedding_test.rb
118
120
  - test/model_attribute_access_test.rb