reactive-record 0.7.43 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Join the chat at https://gitter.im/catprintlabs/reactive-record](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/reactrb/chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/reactrb/reactive-record/badges/gpa.svg)](https://codeclimate.com/github/reactrb/reactive-record)
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/reactive-record.svg)](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