reactive-record 0.7.43 → 0.8.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/README.md +50 -0
- data/app/controllers/reactive_record/reactive_record_controller.rb +15 -9
- data/lib/reactive-record.rb +1 -1
- data/lib/reactive_record/active_record/reactive_record/base.rb +3 -3
- data/lib/reactive_record/active_record/reactive_record/collection.rb +4 -0
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +31 -3
- data/lib/reactive_record/active_record/reactive_record/while_loading.rb +3 -3
- data/lib/reactive_record/version.rb +1 -1
- metadata +10 -8
- data/README.rdoc +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a836715dff414352aca8fa4fbe91d987d4ac219d
|
4
|
+
data.tar.gz: e7077d62b8071a21c0ea4289ccd3a7b9dd5e3938
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec0ca8663425dd46831d51cbb029897f51394c1432055d5f05f01063d2e7eb8fc5716e0111d664e6bab423998c3a70e9a3de4f0077bd3a230ca80b84351375c4
|
7
|
+
data.tar.gz: 10819073b864f14caea7934d1e79b7f1d605b40a47b6bf6ee454f9c42fe555a8fe034c5d083f6bc4e7f2b3453b7bbaaaff789c6a464037c180c54ef9fb798508
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Reactive Record
|
2
|
+
|
3
|
+
[](https://gitter.im/reactrb/chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
|
+
[](https://codeclimate.com/github/reactrb/reactive-record)
|
5
|
+
[](https://badge.fury.io/rb/reactive-record)
|
6
|
+
|
7
|
+
|
8
|
+
#### reactive-record gives you active-record models on the client integrated with reactrb.
|
9
|
+
|
10
|
+
*"So simple its almost magic" (Amazed developer)*
|
11
|
+
|
12
|
+
#### NOTE: reactive-record >= 0.8.x depends on the reactrb gem. You must [upgrade to reactrb](https://github.com/reactrb/reactrb#upgrading-to-reactrb)
|
13
|
+
|
14
|
+
You do nothing to your current active-record models except move them to the models/public directory (so they are compiled on the client as well as the server.)
|
15
|
+
|
16
|
+
* Fully integrated with [Reactrb](https://github.com/reactrb/reactrb) (which is React with a beautiful ruby dsl.)
|
17
|
+
* Takes advantage of React prerendering, and afterwards additional data is *lazy loaded* as it is needed by the client.
|
18
|
+
* Supports full CRUD access using standard Active Record features, including associations, aggregations, and errors.
|
19
|
+
* Uses model based authorization mechanism for security similar to [Hobo](http://www.hobocentral.net/manual/permissions) or [Pundit](https://github.com/elabs/pundit).
|
20
|
+
* Models and even methods within models can be selectively implemented "server-side" only.
|
21
|
+
|
22
|
+
There are no docs yet, but you may consider the test cases as a starting point, or have a look at [reactrb todo](https://reactiverb-todo.herokuapp.com/) (live demo [here.](https://reactiverb-todo.herokuapp.com/))
|
23
|
+
|
24
|
+
For best results simply use the [reactrb-rails-installer](https://github.com/reactrb/reactrb-rails-installer) to install everything you need into a new or existing rails app.
|
25
|
+
|
26
|
+
Head on over to [gitter.im](https://gitter.im/reactrb/chat) to ask any questions you might have!
|
27
|
+
|
28
|
+
Note: We have dropped suppport for the ability to load the same Class from two different files. If you need this functionality load the following code to your config/application.rb file.
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
module ::ActiveRecord
|
32
|
+
module Core
|
33
|
+
module ClassMethods
|
34
|
+
def inherited(child_class)
|
35
|
+
begin
|
36
|
+
file = Rails.root.join('app','models',"#{child_class.name.underscore}.rb").to_s rescue nil
|
37
|
+
begin
|
38
|
+
require file
|
39
|
+
rescue LoadError
|
40
|
+
end
|
41
|
+
# from active record:
|
42
|
+
child_class.initialize_find_by_cache
|
43
|
+
rescue
|
44
|
+
end # if File.exist?(Rails.root.join('app', 'view', 'models.rb'))
|
45
|
+
super
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
```
|
@@ -6,9 +6,9 @@ module ReactiveRecord
|
|
6
6
|
|
7
7
|
def fetch
|
8
8
|
render :json => ReactiveRecord::ServerDataCache[
|
9
|
-
(
|
10
|
-
(
|
11
|
-
|
9
|
+
(json_params[:models] || []).map(&:with_indifferent_access),
|
10
|
+
(json_params[:associations] || []).map(&:with_indifferent_access),
|
11
|
+
json_params[:pending_fetches],
|
12
12
|
acting_user
|
13
13
|
]
|
14
14
|
rescue Exception => e
|
@@ -17,10 +17,10 @@ module ReactiveRecord
|
|
17
17
|
|
18
18
|
def save
|
19
19
|
render :json => ReactiveRecord::Base.save_records(
|
20
|
-
(
|
21
|
-
(
|
20
|
+
(json_params[:models] || []).map(&:with_indifferent_access),
|
21
|
+
(json_params[:associations] || []).map(&:with_indifferent_access),
|
22
22
|
acting_user,
|
23
|
-
|
23
|
+
json_params[:validate],
|
24
24
|
true
|
25
25
|
)
|
26
26
|
rescue Exception => e
|
@@ -29,15 +29,21 @@ module ReactiveRecord
|
|
29
29
|
|
30
30
|
def destroy
|
31
31
|
render :json => ReactiveRecord::Base.destroy_record(
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
json_params[:model],
|
33
|
+
json_params[:id],
|
34
|
+
json_params[:vector],
|
35
35
|
acting_user
|
36
36
|
)
|
37
37
|
rescue Exception => e
|
38
38
|
render json: {error: e.message, backtrace: e.backtrace}, status: 500
|
39
39
|
end
|
40
40
|
|
41
|
+
private
|
42
|
+
|
43
|
+
def json_params
|
44
|
+
JSON.parse(params[:json]).symbolize_keys
|
45
|
+
end
|
46
|
+
|
41
47
|
end
|
42
48
|
|
43
49
|
end
|
data/lib/reactive-record.rb
CHANGED
@@ -421,9 +421,9 @@ module ReactiveRecord
|
|
421
421
|
elsif aggregation = @model.reflect_on_aggregation(method) and (aggregation.klass < ActiveRecord::Base)
|
422
422
|
new_from_vector(aggregation.klass, self, *vector, method)
|
423
423
|
elsif id and id != ""
|
424
|
-
self.class.fetch_from_db([@model, [:find, id], *method]) || self.class.load_from_db(self, *vector, method)
|
424
|
+
self.class.fetch_from_db([@model, [:find, id], *method]) || self.class.load_from_db(self, *(vector ? vector : [nil]), method)
|
425
425
|
else # its a attribute in an aggregate or we are on the client and don't know the id
|
426
|
-
self.class.fetch_from_db([*vector, *method]) || self.class.load_from_db(self, *vector, method)
|
426
|
+
self.class.fetch_from_db([*vector, *method]) || self.class.load_from_db(self, *(vector ? vector : [nil]), method)
|
427
427
|
end
|
428
428
|
new_value = @attributes[method] if new_value.is_a? DummyValue and @attributes.has_key?(method)
|
429
429
|
sync_attribute(method, new_value)
|
@@ -439,7 +439,7 @@ module ReactiveRecord
|
|
439
439
|
unless @attributes.has_key?(method)
|
440
440
|
log("Warning: reading from new #{model.name}.#{method} before assignment. Will fetch value from server. This may not be what you expected!!", :warning)
|
441
441
|
end
|
442
|
-
new_value = self.class.load_from_db(self, *vector, method)
|
442
|
+
new_value = self.class.load_from_db(self, *(vector ? vector : [nil]), method)
|
443
443
|
new_value = @attributes[method] if new_value.is_a? DummyValue and @attributes.has_key?(method)
|
444
444
|
sync_attribute(method, new_value)
|
445
445
|
end
|
@@ -167,6 +167,10 @@ module ReactiveRecord
|
|
167
167
|
@dummy_collection.loading?
|
168
168
|
end
|
169
169
|
|
170
|
+
def empty? # should be handled by method missing below, but opal-rspec does not deal well with method missing, so to test...
|
171
|
+
all.empty?
|
172
|
+
end
|
173
|
+
|
170
174
|
def method_missing(method, *args, &block)
|
171
175
|
if [].respond_to? method
|
172
176
|
all.send(method, *args, &block)
|
@@ -167,6 +167,11 @@ module ReactiveRecord
|
|
167
167
|
0
|
168
168
|
end
|
169
169
|
|
170
|
+
def to_number
|
171
|
+
notify
|
172
|
+
0
|
173
|
+
end
|
174
|
+
|
170
175
|
def to_date
|
171
176
|
notify
|
172
177
|
"2001-01-01T00:00:00.000-00:00".to_date
|
@@ -196,7 +201,14 @@ module ReactiveRecord
|
|
196
201
|
log(["Server Fetching: %o", pending_fetches.to_n])
|
197
202
|
start_time = Time.now
|
198
203
|
HTTP.post(`window.ReactiveRecordEnginePath`,
|
199
|
-
|
204
|
+
payload: {
|
205
|
+
json: {
|
206
|
+
models: models,
|
207
|
+
associations: associations,
|
208
|
+
pending_fetches: pending_fetches
|
209
|
+
}.to_json
|
210
|
+
}
|
211
|
+
).then do |response|
|
200
212
|
fetch_time = Time.now
|
201
213
|
log(" Fetched in: #{(fetch_time-start_time).to_i}s")
|
202
214
|
begin
|
@@ -301,7 +313,15 @@ module ReactiveRecord
|
|
301
313
|
|
302
314
|
promise = Promise.new
|
303
315
|
|
304
|
-
HTTP.post(`window.ReactiveRecordEnginePath`+"/save",
|
316
|
+
HTTP.post(`window.ReactiveRecordEnginePath`+"/save",
|
317
|
+
payload: {
|
318
|
+
json: {
|
319
|
+
models: models,
|
320
|
+
associations: associations,
|
321
|
+
validate: validate
|
322
|
+
}.to_json
|
323
|
+
}
|
324
|
+
).then do |response|
|
305
325
|
begin
|
306
326
|
response.json[:models] = response.json[:saved_models].collect do |item|
|
307
327
|
backing_records[item[0]].ar_instance
|
@@ -548,7 +568,15 @@ module ReactiveRecord
|
|
548
568
|
promise = Promise.new
|
549
569
|
|
550
570
|
if !data_loading? and (id or vector)
|
551
|
-
HTTP.post(`window.ReactiveRecordEnginePath`+"/destroy",
|
571
|
+
HTTP.post(`window.ReactiveRecordEnginePath`+"/destroy",
|
572
|
+
payload: {
|
573
|
+
json: {
|
574
|
+
model: ar_instance.model_name,
|
575
|
+
id: id,
|
576
|
+
vector: vector
|
577
|
+
}.to_json
|
578
|
+
}
|
579
|
+
).then do |response|
|
552
580
|
sync_scopes
|
553
581
|
yield response.json[:success], response.json[:message] if block
|
554
582
|
promise.resolve response.json
|
@@ -158,7 +158,7 @@ module ReactiveRecord
|
|
158
158
|
@waiting_on_resources = loading
|
159
159
|
WhileLoading.add_style_sheet
|
160
160
|
%x{
|
161
|
-
var node = #{
|
161
|
+
var node = #{dom_node};
|
162
162
|
$(node).children(':nth-child(-1n+'+#{loaded_children.count}+')').addClass('reactive_record_show_when_loaded');
|
163
163
|
$(node).children(':nth-child(1n+'+#{loaded_children.count+1}+')').addClass('reactive_record_show_while_loading');
|
164
164
|
}
|
@@ -240,7 +240,7 @@ module React
|
|
240
240
|
# Fyi, the while_loading container is responsible for setting its own link to itself
|
241
241
|
|
242
242
|
%x{
|
243
|
-
var node = #{
|
243
|
+
var node = #{dom_node};
|
244
244
|
if (!$(node).is('[data-reactive_record_enclosing_while_loading_container_id]')) {
|
245
245
|
var while_loading_container = $(node).closest('[data-reactive_record_while_loading_container_id]')
|
246
246
|
if (while_loading_container.length > 0) {
|
@@ -256,7 +256,7 @@ module React
|
|
256
256
|
|
257
257
|
%x{
|
258
258
|
|
259
|
-
var node = #{
|
259
|
+
var node = #{dom_node};
|
260
260
|
var while_loading_container_id = $(node).attr('data-reactive_record_enclosing_while_loading_container_id');
|
261
261
|
if (while_loading_container_id) {
|
262
262
|
var while_loading_container = $('[data-reactive_record_while_loading_container_id='+while_loading_container_id+']');
|
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.
|
4
|
+
version: 0.8.1
|
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-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -123,7 +123,7 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: reactrb
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
@@ -136,7 +136,8 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
-
description:
|
139
|
+
description: Access active-record models inside Reactrb components. Model data is
|
140
|
+
calculated during pre-rerendering, and then dynamically loaded as components update.
|
140
141
|
email:
|
141
142
|
- mitch@catprint.com
|
142
143
|
executables: []
|
@@ -144,7 +145,7 @@ extensions: []
|
|
144
145
|
extra_rdoc_files: []
|
145
146
|
files:
|
146
147
|
- MIT-LICENSE
|
147
|
-
- README.
|
148
|
+
- README.md
|
148
149
|
- Rakefile
|
149
150
|
- app/controllers/reactive_record/application_controller.rb
|
150
151
|
- app/controllers/reactive_record/reactive_record_controller.rb
|
@@ -172,7 +173,8 @@ files:
|
|
172
173
|
homepage:
|
173
174
|
licenses: []
|
174
175
|
metadata: {}
|
175
|
-
post_install_message:
|
176
|
+
post_install_message: As of version 0.8.x, reactive-record depends on reactrb instead
|
177
|
+
of reactive-ruby. If you have already switched, you can ignore this message.
|
176
178
|
rdoc_options: []
|
177
179
|
require_paths:
|
178
180
|
- lib
|
@@ -188,8 +190,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
188
190
|
version: '0'
|
189
191
|
requirements: []
|
190
192
|
rubyforge_project:
|
191
|
-
rubygems_version: 2.
|
193
|
+
rubygems_version: 2.5.1
|
192
194
|
signing_key:
|
193
195
|
specification_version: 4
|
194
|
-
summary:
|
196
|
+
summary: Access active-record models inside Reactrb components.
|
195
197
|
test_files: []
|
data/README.rdoc
DELETED