reactive-record 0.7.39 → 0.7.40
Sign up to get free protection for your applications and to get access to all the features.
- 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
|