reactive-record 0.7.39 → 0.7.40
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/lib/reactive-record.rb +2 -0
- data/lib/reactive_record/active_record/reactive_record/base.rb +22 -0
- data/lib/reactive_record/active_record/reactive_record/collection.rb +24 -5
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +5 -1
- data/lib/reactive_record/reactive_scope.rb +18 -0
- data/lib/reactive_record/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bb0f789a2d04f7a3256763e9f6df888a030bd36
|
4
|
+
data.tar.gz: 4192db45d77b75734e1b1be6280144c06d94e510
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d1b9081a8b0133ce8dc3a2d1195b5ed9d4478b40520739b25bb6a77ef9c75f978f92c472a6a1722acbed85e86561ede0dc4bdd0241559c38804b89d383317f6
|
7
|
+
data.tar.gz: ad0483d874c65bd03407e8e0f7058033bbb18f318cd1228f8d183238bb41b31dbff4d113516afacec7b852d29520abbc68909f2de5b82abc46866327adeb9c67
|
data/lib/reactive-record.rb
CHANGED
@@ -9,6 +9,7 @@ if RUBY_ENGINE == 'opal'
|
|
9
9
|
require "reactive_record/active_record/associations"
|
10
10
|
require "reactive_record/active_record/reactive_record/base"
|
11
11
|
require "reactive_record/active_record/reactive_record/collection"
|
12
|
+
require "reactive_record/reactive_scope"
|
12
13
|
require "reactive_record/active_record/class_methods"
|
13
14
|
require "reactive_record/active_record/instance_methods"
|
14
15
|
require "reactive_record/active_record/base"
|
@@ -22,6 +23,7 @@ else
|
|
22
23
|
require "reactive_record/engine"
|
23
24
|
require "reactive_record/server_data_cache"
|
24
25
|
require "reactive_record/active_record/reactive_record/isomorphic_base"
|
26
|
+
require "reactive_record/reactive_scope"
|
25
27
|
require "reactive_record/serializers"
|
26
28
|
require "reactive_record/pry"
|
27
29
|
|
@@ -65,6 +65,28 @@ module ReactiveRecord
|
|
65
65
|
@class_scopes[model.base_class]
|
66
66
|
end
|
67
67
|
|
68
|
+
def self.sync_blocks
|
69
|
+
# @sync_blocks[watch_model][sync_model][scope_name][...array of blocks...]
|
70
|
+
@sync_blocks ||= Hash.new { |hash, key| hash[key] = Hash.new { |hash, key| hash[key] = Hash.new { |hash, key| hash[key] = [] } } }
|
71
|
+
end
|
72
|
+
|
73
|
+
def sync_scopes
|
74
|
+
self.class.sync_blocks[self.model].each do |watching_class, scopes|
|
75
|
+
scopes.each do |scope_name, blocks|
|
76
|
+
blocks.each do |block|
|
77
|
+
if block.arity > 0
|
78
|
+
block.call watching_class.send(scope_name), @ar_instance
|
79
|
+
elsif @ar_instance.instance_eval &block
|
80
|
+
watching_class.send(scope_name) << @ar_instance
|
81
|
+
else
|
82
|
+
watching_class.send(scope_name).delete(@ar_instance)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
model.all << @ar_instance
|
88
|
+
end
|
89
|
+
|
68
90
|
def self.find(model, attribute, value)
|
69
91
|
# will return the unique record with this attribute-value pair
|
70
92
|
# value cannot be an association or aggregation
|
@@ -27,6 +27,7 @@ module ReactiveRecord
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def all
|
30
|
+
observed
|
30
31
|
@dummy_collection.notify if @dummy_collection
|
31
32
|
unless @collection
|
32
33
|
@collection = []
|
@@ -43,7 +44,7 @@ module ReactiveRecord
|
|
43
44
|
end
|
44
45
|
|
45
46
|
def [](index)
|
46
|
-
|
47
|
+
observed
|
47
48
|
if (@collection || all).length <= index and @dummy_collection
|
48
49
|
(@collection.length..index).each do |i|
|
49
50
|
new_dummy_record = ReactiveRecord::Base.new_from_vector(@target_klass, nil, *@vector, "*#{i}")
|
@@ -55,6 +56,9 @@ module ReactiveRecord
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def ==(other_collection)
|
59
|
+
observed
|
60
|
+
return nil unless other_collection.is_a? Collection
|
61
|
+
other_collection.observed
|
58
62
|
my_collection = (@collection || []).select { |target| target != @dummy_record }
|
59
63
|
other_collection = (other_collection ? (other_collection.collection || []) : []).select { |target| target != other_collection.dummy_record }
|
60
64
|
my_collection == other_collection
|
@@ -68,6 +72,7 @@ module ReactiveRecord
|
|
68
72
|
end
|
69
73
|
|
70
74
|
def count
|
75
|
+
observed
|
71
76
|
if @collection
|
72
77
|
@collection.count
|
73
78
|
elsif @count ||= ReactiveRecord::Base.fetch_from_db([*@vector, "*count"])
|
@@ -89,6 +94,7 @@ module ReactiveRecord
|
|
89
94
|
end
|
90
95
|
|
91
96
|
def <<(item)
|
97
|
+
return delete(item) if item.destroyed? # pushing a destroyed item is the same as removing it
|
92
98
|
backing_record = item.backing_record
|
93
99
|
all << item unless all.include? item # does this use == if so we are okay...
|
94
100
|
if backing_record and @owner and @association and inverse_of = @association.inverse_of and item.attributes[inverse_of] != @owner
|
@@ -104,7 +110,7 @@ module ReactiveRecord
|
|
104
110
|
@dummy_record = @collection.detect { |r| r.backing_record.vector.last =~ /^\*[0-9]+$/ }
|
105
111
|
@dummy_collection = nil
|
106
112
|
end
|
107
|
-
|
113
|
+
notify_of_change
|
108
114
|
end
|
109
115
|
|
110
116
|
[:first, :last].each do |method|
|
@@ -141,11 +147,11 @@ module ReactiveRecord
|
|
141
147
|
@dummy_collection = @dummy_record = nil
|
142
148
|
new_array.each { |item| self << item }
|
143
149
|
end
|
144
|
-
new_array
|
150
|
+
notify_of_change new_array
|
145
151
|
end
|
146
152
|
|
147
153
|
def delete(item)
|
148
|
-
if @owner and @association and inverse_of = @association.inverse_of
|
154
|
+
notify_of_change(if @owner and @association and inverse_of = @association.inverse_of
|
149
155
|
if backing_record = item.backing_record and backing_record.attributes[inverse_of] == @owner
|
150
156
|
# the if prevents double update if delete is being called from << (see << above)
|
151
157
|
backing_record.update_attribute(inverse_of, nil)
|
@@ -153,7 +159,7 @@ module ReactiveRecord
|
|
153
159
|
all.delete(item).tap { @owner.backing_record.update_attribute(@association.attribute) } # forces a check if association contents have changed from synced values
|
154
160
|
else
|
155
161
|
all.delete(item)
|
156
|
-
end
|
162
|
+
end)
|
157
163
|
end
|
158
164
|
|
159
165
|
def loading?
|
@@ -185,6 +191,19 @@ module ReactiveRecord
|
|
185
191
|
@dummy_collection
|
186
192
|
end
|
187
193
|
|
194
|
+
def notify_of_change(value = nil)
|
195
|
+
begin
|
196
|
+
React::State.set_state(self, "collection", collection) unless ReactiveRecord::Base.data_loading?
|
197
|
+
rescue Exception => e
|
198
|
+
`debugger`
|
199
|
+
end
|
200
|
+
value
|
201
|
+
end
|
202
|
+
|
203
|
+
def observed
|
204
|
+
React::State.get_state(self, "collection") unless ReactiveRecord::Base.data_loading?
|
205
|
+
end
|
206
|
+
|
188
207
|
end
|
189
208
|
|
190
209
|
end
|
@@ -316,7 +316,10 @@ module ReactiveRecord
|
|
316
316
|
end
|
317
317
|
end
|
318
318
|
|
319
|
-
response.json[:saved_models].each
|
319
|
+
response.json[:saved_models].each do | item |
|
320
|
+
backing_records[item[0]].sync_scopes
|
321
|
+
backing_records[item[0]].errors! item[3]
|
322
|
+
end
|
320
323
|
|
321
324
|
yield response.json[:success], response.json[:message], response.json[:models] if block
|
322
325
|
promise.resolve response.json
|
@@ -546,6 +549,7 @@ module ReactiveRecord
|
|
546
549
|
|
547
550
|
if !data_loading? and (id or vector)
|
548
551
|
HTTP.post(`window.ReactiveRecordEnginePath`+"/destroy", payload: {model: ar_instance.model_name, id: id, vector: vector}).then do |response|
|
552
|
+
sync_scopes
|
549
553
|
yield response.json[:success], response.json[:message] if block
|
550
554
|
promise.resolve response.json
|
551
555
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class ActiveRecord::Base
|
2
|
+
|
3
|
+
def self.to_sync(scope_name, opts={}, &block)
|
4
|
+
watch_list = if opts[:watch]
|
5
|
+
[*opts.delete[:watch]]
|
6
|
+
else
|
7
|
+
[self]
|
8
|
+
end
|
9
|
+
if RUBY_ENGINE=='opal'
|
10
|
+
watch_list.each do |klass_to_watch|
|
11
|
+
ReactiveRecord::Base.sync_blocks[klass_to_watch][self][scope_name] << block
|
12
|
+
end
|
13
|
+
else
|
14
|
+
# this is where we put server side watchers in place to sync all clients!
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reactive-record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.40
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mitch VanDuyn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- lib/reactive_record/interval.rb
|
166
166
|
- lib/reactive_record/permissions.rb
|
167
167
|
- lib/reactive_record/pry.rb
|
168
|
+
- lib/reactive_record/reactive_scope.rb
|
168
169
|
- lib/reactive_record/serializers.rb
|
169
170
|
- lib/reactive_record/server_data_cache.rb
|
170
171
|
- lib/reactive_record/version.rb
|