volt 0.4.9 → 0.4.10
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/VERSION +1 -1
- data/app/volt/tasks/channel_tasks.rb +2 -2
- data/lib/volt/console.rb +0 -1
- data/lib/volt/controllers/model_controller.rb +20 -2
- data/lib/volt/models.rb +4 -2
- data/lib/volt/models/array_model.rb +19 -5
- data/lib/volt/models/model.rb +51 -9
- data/lib/volt/models/model_wrapper.rb +2 -2
- data/lib/volt/models/persistors/array_store.rb +79 -0
- data/lib/volt/models/persistors/base.rb +24 -0
- data/lib/volt/models/persistors/model_store.rb +140 -0
- data/lib/volt/models/persistors/params.rb +26 -0
- data/lib/volt/models/persistors/store.rb +44 -0
- data/lib/volt/models/persistors/store_factory.rb +15 -0
- data/lib/volt/models/url.rb +2 -1
- data/lib/volt/page/bindings/each_binding.rb +2 -2
- data/lib/volt/page/channel.rb +0 -2
- data/lib/volt/page/page.rb +2 -3
- data/lib/volt/page/tasks.rb +28 -7
- data/lib/volt/reactive/reactive_array.rb +14 -1
- data/lib/volt/tasks/dispatcher.rb +8 -2
- data/spec/models/model_spec.rb +32 -2
- data/spec/models/persistors/params_spec.rb +16 -0
- data/spec/models/persistors/store_spec.rb +29 -0
- data/spec/models/store_spec.rb +16 -16
- data/spec/router/routes_spec.rb +1 -1
- data/templates/project/app/home/controllers/index_controller.rb +2 -1
- metadata +12 -8
- data/lib/volt/models/params.rb +0 -72
- data/lib/volt/models/params_array.rb +0 -9
- data/lib/volt/models/store.rb +0 -183
- data/lib/volt/models/store_array.rb +0 -82
- data/spec/models/params_spec.rb +0 -16
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'volt/models/persistors/base'
|
2
|
+
|
3
|
+
module Persistors
|
4
|
+
class Params < Base
|
5
|
+
def initialize(model)
|
6
|
+
@model = model
|
7
|
+
end
|
8
|
+
|
9
|
+
def changed(attribute_name)
|
10
|
+
if RUBY_PLATFORM == 'opal'
|
11
|
+
%x{
|
12
|
+
if (window.setTimeout && this.$run_update.bind) {
|
13
|
+
if (window.paramsUpdateTimer) {
|
14
|
+
clearTimeout(window.paramsUpdateTimer);
|
15
|
+
}
|
16
|
+
window.paramsUpdateTimer = setTimeout(this.$run_update.bind(this), 0);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def run_update
|
23
|
+
$page.params.trigger!('child_changed') if Volt.client?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'volt/models/persistors/base'
|
2
|
+
|
3
|
+
module Persistors
|
4
|
+
class Store < Base
|
5
|
+
def initialize(model, tasks=nil)
|
6
|
+
@model = model
|
7
|
+
@is_tracking = false
|
8
|
+
@tasks = tasks
|
9
|
+
end
|
10
|
+
|
11
|
+
def change_channel_connection(add_or_remove, event=nil, scope=nil)
|
12
|
+
if (@model.attributes && @model.path.size > 1) || @model.is_a?(ArrayModel)
|
13
|
+
channel_name = self.channel_name.to_s
|
14
|
+
channel_name += "-#{event}" if event
|
15
|
+
|
16
|
+
puts "Event #{add_or_remove}: #{channel_name} -- #{@model.attributes.inspect}"
|
17
|
+
@tasks.call('ChannelTasks', "#{add_or_remove}_listener", channel_name, scope)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
# On stores, we store the model so we don't have to look it up
|
23
|
+
# every time we do a read.
|
24
|
+
def read_new_model(method_name)
|
25
|
+
# On stores, plural associations are automatically assumed to be
|
26
|
+
# collections.
|
27
|
+
options = @model.options.merge(parent: @model, path: @model.path + [method_name])
|
28
|
+
if method_name.plural?
|
29
|
+
model = @model.new_array_model([], options)
|
30
|
+
else
|
31
|
+
model = @model.new_model(nil, options)
|
32
|
+
end
|
33
|
+
|
34
|
+
@model.attributes ||= {}
|
35
|
+
@model.attributes[method_name] = model
|
36
|
+
|
37
|
+
# if model.is_a?(StoreArray)# && model.state == :not_loaded
|
38
|
+
# model.load!
|
39
|
+
# end
|
40
|
+
|
41
|
+
return model
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/volt/models/url.rb
CHANGED
@@ -17,8 +17,8 @@ class EachBinding < BaseBinding
|
|
17
17
|
# Run the initial render
|
18
18
|
update
|
19
19
|
|
20
|
-
@added_listener = @value.on('added') { |_, position, item|
|
21
|
-
@changed_listener = @value.on('changed') {
|
20
|
+
@added_listener = @value.on('added') { |_, position, item| item_added(position) }
|
21
|
+
@changed_listener = @value.on('changed') { reload }
|
22
22
|
@removed_listener = @value.on('removed') { |_, position| item_removed(position) }
|
23
23
|
end
|
24
24
|
|
data/lib/volt/page/channel.rb
CHANGED
@@ -82,10 +82,8 @@ class Channel
|
|
82
82
|
destructive!
|
83
83
|
end
|
84
84
|
def send_message(message)
|
85
|
-
puts "Send #{message.inspect}"
|
86
85
|
if @state != :open
|
87
86
|
@queue << message
|
88
|
-
puts "Queue"
|
89
87
|
else
|
90
88
|
# TODO: Temp: wrap message in an array, so we're sure its valid JSON
|
91
89
|
message = JSON.dump([message])
|
data/lib/volt/page/page.rb
CHANGED
@@ -4,7 +4,6 @@ if RUBY_PLATFORM == 'opal'
|
|
4
4
|
require 'opal-jquery'
|
5
5
|
end
|
6
6
|
require 'volt/models'
|
7
|
-
require 'volt/models/params'
|
8
7
|
require 'volt/controllers/model_controller'
|
9
8
|
require 'volt/page/bindings/attribute_binding'
|
10
9
|
require 'volt/page/bindings/content_binding'
|
@@ -42,8 +41,8 @@ class Page
|
|
42
41
|
@model_classes = {}
|
43
42
|
|
44
43
|
# Run the code to setup the page
|
45
|
-
@page = ReactiveValue.new(Model.new)
|
46
|
-
@store = ReactiveValue.new(
|
44
|
+
@page = ReactiveValue.new(Model.new)
|
45
|
+
@store = ReactiveValue.new(Model.new({}, persistor: Persistors::StoreFactory.new(tasks)))
|
47
46
|
|
48
47
|
@url = ReactiveValue.new(URL.new)
|
49
48
|
@params = @url.params
|
data/lib/volt/page/tasks.rb
CHANGED
@@ -42,31 +42,52 @@ class Tasks
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def response(callback_id,
|
45
|
+
def response(callback_id, result, error)
|
46
46
|
callback = @callbacks.delete(callback_id)
|
47
47
|
|
48
48
|
if callback
|
49
|
-
|
49
|
+
if error
|
50
|
+
# TODO: full error handling
|
51
|
+
puts "Error: #{error.inspect}"
|
52
|
+
else
|
53
|
+
callback.call(result)
|
54
|
+
end
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
53
58
|
def changed(model_id, data)
|
54
59
|
$loading_models = true
|
55
|
-
puts "UPDATE: #{model_id} with #{data.inspect}"
|
56
|
-
|
60
|
+
puts "From Backend: UPDATE: #{model_id} with #{data.inspect}"
|
61
|
+
Persistors::ModelStore.update(model_id, data)
|
57
62
|
$loading_models = false
|
58
63
|
end
|
59
64
|
|
60
65
|
def added(path, data)
|
61
66
|
$loading_models = true
|
62
|
-
|
63
|
-
|
67
|
+
|
68
|
+
# Don't add if already in there
|
69
|
+
# TODO: shouldn't send twice
|
70
|
+
unless Persistors::ModelStore.from_id(data[:_id])
|
71
|
+
|
72
|
+
_, parent_id = data.find {|k,v| k != :_id && k[-3..-1] == '_id'}
|
73
|
+
if parent_id
|
74
|
+
parent_collection = Persistors::ModelStore.from_id(parent_id).model
|
75
|
+
else
|
76
|
+
# On the root
|
77
|
+
parent_collection = $page.store
|
78
|
+
end
|
79
|
+
|
80
|
+
puts "From Backend: Add: #{path.inspect} - #{data.inspect}"
|
81
|
+
parent_collection.send(path) << data
|
82
|
+
end
|
64
83
|
$loading_models = false
|
65
84
|
end
|
66
85
|
|
67
86
|
def removed(id)
|
87
|
+
puts "From Backend: Remove: #{id}"
|
68
88
|
$loading_models = true
|
69
|
-
|
89
|
+
model = Persistors::ModelStore.from_id(id)
|
90
|
+
model.delete!
|
70
91
|
$loading_models = false
|
71
92
|
end
|
72
93
|
|
@@ -53,7 +53,7 @@ class ReactiveArray# < Array
|
|
53
53
|
|
54
54
|
__clear_element(index)
|
55
55
|
|
56
|
-
@array.delete_at(index_val)
|
56
|
+
model = @array.delete_at(index_val)
|
57
57
|
|
58
58
|
trigger_on_direct_listeners!('removed', index_val)
|
59
59
|
|
@@ -64,6 +64,19 @@ class ReactiveArray# < Array
|
|
64
64
|
end
|
65
65
|
|
66
66
|
trigger_size_change!
|
67
|
+
|
68
|
+
@persistor.removed(model) if @persistor
|
69
|
+
|
70
|
+
return model
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# Delete is implemented as part of delete_at
|
75
|
+
tag_method(:delete) do
|
76
|
+
destructive!
|
77
|
+
end
|
78
|
+
def delete(val)
|
79
|
+
self.delete_at(@array.index(val))
|
67
80
|
end
|
68
81
|
|
69
82
|
|
@@ -14,11 +14,17 @@ class Dispatcher
|
|
14
14
|
klass = Object.send(:const_get, class_name)
|
15
15
|
|
16
16
|
# Init and send the method
|
17
|
-
|
17
|
+
begin
|
18
|
+
result = klass.new(channel, self).send(method_name, *args)
|
19
|
+
error = nil
|
20
|
+
rescue => e
|
21
|
+
result = nil
|
22
|
+
error = e
|
23
|
+
end
|
18
24
|
|
19
25
|
if callback_id
|
20
26
|
# Callback with result
|
21
|
-
channel.send_message('response', callback_id, result)
|
27
|
+
channel.send_message('response', callback_id, result, error)
|
22
28
|
end
|
23
29
|
end
|
24
30
|
end
|
data/spec/models/model_spec.rb
CHANGED
@@ -293,7 +293,7 @@ describe Model do
|
|
293
293
|
|
294
294
|
it "should handle a basic todo list with no setup" do
|
295
295
|
store = ReactiveValue.new(Model.new)
|
296
|
-
params = ReactiveValue.new(
|
296
|
+
params = ReactiveValue.new(Model.new({}, persistor: Persistors::Params))
|
297
297
|
|
298
298
|
a = store._todo_lists
|
299
299
|
store._current_todo = store._todo_lists[params._index.or(0).to_i]
|
@@ -412,8 +412,30 @@ describe Model do
|
|
412
412
|
|
413
413
|
end
|
414
414
|
|
415
|
-
it "should
|
415
|
+
it "should delete from an ArrayModel" do
|
416
|
+
array = ArrayModel.new([])
|
416
417
|
|
418
|
+
array << {_name: 'One'}
|
419
|
+
array << {_name: 'Two'}
|
420
|
+
array << {_name: 'Three'}
|
421
|
+
|
422
|
+
expect(array.size).to eq(3)
|
423
|
+
|
424
|
+
expect(array.index(array[0])).to eq(0)
|
425
|
+
|
426
|
+
array.delete(array[0])
|
427
|
+
expect(array.size).to eq(2)
|
428
|
+
expect(array[0]._name).to eq('Two')
|
429
|
+
end
|
430
|
+
|
431
|
+
it "should compare true" do
|
432
|
+
a = Model.new({_name: 'Cool'})
|
433
|
+
expect(a == a).to eq(true)
|
434
|
+
end
|
435
|
+
|
436
|
+
it "should do index" do
|
437
|
+
a = [{name: 'One'}, {name: 'Two'}, {name: 'Three'}]
|
438
|
+
expect(a.index(a[1])).to eq(1)
|
417
439
|
end
|
418
440
|
|
419
441
|
|
@@ -438,4 +460,12 @@ describe Model do
|
|
438
460
|
expect(@model._lists[0]._items.path.cur).to eq([:_lists, :[], :_items])
|
439
461
|
end
|
440
462
|
end
|
463
|
+
|
464
|
+
describe "persistors" do
|
465
|
+
it "should setup a new instance of the persistor with self" do
|
466
|
+
persistor = double('persistor')
|
467
|
+
expect(persistor).to receive(:new)
|
468
|
+
@model = Model.new(nil, persistor: persistor)
|
469
|
+
end
|
470
|
+
end
|
441
471
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'volt/models'
|
2
|
+
|
3
|
+
describe Persistors::Params do
|
4
|
+
it "should stay as params classes when used" do
|
5
|
+
a = Model.new({}, persistor: Persistors::Params)
|
6
|
+
expect(a._test.class).to eq(Model)
|
7
|
+
|
8
|
+
expect(a._test._cool.persistor.class).to eq(Persistors::Params)
|
9
|
+
|
10
|
+
a._items << {_name: 'Test'}
|
11
|
+
|
12
|
+
expect(a._items.persistor.class).to eq(Persistors::Params)
|
13
|
+
expect(a._items[0].persistor.class).to eq(Persistors::Params)
|
14
|
+
expect(a._items[0]._name.class).to eq(String)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'volt/models'
|
2
|
+
|
3
|
+
describe Persistors::Store do
|
4
|
+
it "should tell the persistor when the model has changed" do
|
5
|
+
persistor = double('persistor')
|
6
|
+
persistor_instance = double('persistor instance')
|
7
|
+
expect(persistor_instance).to receive(:loaded)
|
8
|
+
expect(persistor).to receive(:new).and_return(persistor_instance)
|
9
|
+
|
10
|
+
@model = Model.new(nil, persistor: persistor)
|
11
|
+
|
12
|
+
expect(persistor_instance).to receive(:changed)
|
13
|
+
|
14
|
+
@model._attr = 'yes'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should tell the persistor when something is added to an array model" do
|
18
|
+
persistor = double('persistor')
|
19
|
+
persistor_instance = double('persistor instance')
|
20
|
+
expect(persistor_instance).to receive(:loaded)
|
21
|
+
expect(persistor).to receive(:new).and_return(persistor_instance)
|
22
|
+
|
23
|
+
@model = ArrayModel.new([1,2,3], persistor: persistor)
|
24
|
+
|
25
|
+
expect(persistor_instance).to receive(:added).with(4)
|
26
|
+
|
27
|
+
@model << 4
|
28
|
+
end
|
29
|
+
end
|
data/spec/models/store_spec.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
require 'volt/models'
|
2
|
-
|
3
|
-
describe Store do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
1
|
+
# require 'volt/models'
|
2
|
+
#
|
3
|
+
# describe Store do
|
4
|
+
# # it "should stay as store classes when used" do
|
5
|
+
# # a = Store.new
|
6
|
+
# # expect(a._test.class).to eq(Store)
|
7
|
+
# #
|
8
|
+
# # expect(a._test._cool.class).to eq(Store)
|
9
|
+
# #
|
10
|
+
# # a._items << {_name: 'Test'}
|
11
|
+
# #
|
12
|
+
# # expect(a._items.class).to eq(StoreArray)
|
13
|
+
# # expect(a._items[0].class).to eq(Store)
|
14
|
+
# # expect(a._items[0]._name.class).to eq(String)
|
15
|
+
# # end
|
16
|
+
# end
|
data/spec/router/routes_spec.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: volt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Stout
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -354,10 +354,12 @@ files:
|
|
354
354
|
- lib/volt/models/array_model.rb
|
355
355
|
- lib/volt/models/model.rb
|
356
356
|
- lib/volt/models/model_wrapper.rb
|
357
|
-
- lib/volt/models/
|
358
|
-
- lib/volt/models/
|
359
|
-
- lib/volt/models/
|
360
|
-
- lib/volt/models/
|
357
|
+
- lib/volt/models/persistors/array_store.rb
|
358
|
+
- lib/volt/models/persistors/base.rb
|
359
|
+
- lib/volt/models/persistors/model_store.rb
|
360
|
+
- lib/volt/models/persistors/params.rb
|
361
|
+
- lib/volt/models/persistors/store.rb
|
362
|
+
- lib/volt/models/persistors/store_factory.rb
|
361
363
|
- lib/volt/models/url.rb
|
362
364
|
- lib/volt/page/bindings/attribute_binding.rb
|
363
365
|
- lib/volt/page/bindings/base_binding.rb
|
@@ -424,7 +426,8 @@ files:
|
|
424
426
|
- spec/models/event_chain_spec.rb
|
425
427
|
- spec/models/model_spec.rb
|
426
428
|
- spec/models/old_model_spec.rb
|
427
|
-
- spec/models/params_spec.rb
|
429
|
+
- spec/models/persistors/params_spec.rb
|
430
|
+
- spec/models/persistors/store_spec.rb
|
428
431
|
- spec/models/reactive_array_spec.rb
|
429
432
|
- spec/models/reactive_tags_spec.rb
|
430
433
|
- spec/models/reactive_value_spec.rb
|
@@ -510,7 +513,8 @@ test_files:
|
|
510
513
|
- spec/models/event_chain_spec.rb
|
511
514
|
- spec/models/model_spec.rb
|
512
515
|
- spec/models/old_model_spec.rb
|
513
|
-
- spec/models/params_spec.rb
|
516
|
+
- spec/models/persistors/params_spec.rb
|
517
|
+
- spec/models/persistors/store_spec.rb
|
514
518
|
- spec/models/reactive_array_spec.rb
|
515
519
|
- spec/models/reactive_tags_spec.rb
|
516
520
|
- spec/models/reactive_value_spec.rb
|