volt 0.8.15 → 0.8.16
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/.rubocop.yml +11 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -1
- data/Guardfile +2 -3
- data/Rakefile +1 -4
- data/VERSION +1 -1
- data/app/volt/controllers/notices_controller.rb +1 -1
- data/app/volt/tasks/live_query/data_store.rb +7 -7
- data/app/volt/tasks/live_query/live_query.rb +7 -9
- data/app/volt/tasks/live_query/live_query_pool.rb +13 -12
- data/app/volt/tasks/live_query/query_tracker.rb +4 -5
- data/app/volt/tasks/query_tasks.rb +9 -11
- data/app/volt/tasks/store_tasks.rb +4 -4
- data/app/volt/tasks/user_tasks.rb +1 -1
- data/bin/volt +2 -2
- data/lib/volt.rb +3 -7
- data/lib/volt/assets/test.rb +1 -2
- data/lib/volt/benchmark/benchmark.rb +3 -3
- data/lib/volt/boot.rb +1 -1
- data/lib/volt/cli.rb +18 -18
- data/lib/volt/cli/asset_compile.rb +8 -10
- data/lib/volt/cli/generate.rb +9 -11
- data/lib/volt/cli/new_gem.rb +51 -51
- data/lib/volt/config.rb +2 -3
- data/lib/volt/console.rb +1 -1
- data/lib/volt/controllers/model_controller.rb +6 -6
- data/lib/volt/data_stores/data_store.rb +1 -1
- data/lib/volt/data_stores/mongo_driver.rb +1 -1
- data/lib/volt/extra_core/array.rb +2 -2
- data/lib/volt/extra_core/blank.rb +1 -2
- data/lib/volt/extra_core/extra_core.rb +1 -1
- data/lib/volt/extra_core/inflector/methods.rb +0 -1
- data/lib/volt/extra_core/logger.rb +13 -7
- data/lib/volt/extra_core/numeric.rb +1 -1
- data/lib/volt/extra_core/string.rb +7 -7
- data/lib/volt/extra_core/stringify_keys.rb +5 -5
- data/lib/volt/models.rb +2 -2
- data/lib/volt/models/array_model.rb +18 -19
- data/lib/volt/models/cursor.rb +0 -1
- data/lib/volt/models/model.rb +17 -35
- data/lib/volt/models/model_hash_behaviour.rb +0 -2
- data/lib/volt/models/model_state.rb +1 -1
- data/lib/volt/models/model_wrapper.rb +1 -1
- data/lib/volt/models/persistors/array_store.rb +26 -13
- data/lib/volt/models/persistors/base.rb +1 -1
- data/lib/volt/models/persistors/flash.rb +2 -2
- data/lib/volt/models/persistors/local_store.rb +2 -3
- data/lib/volt/models/persistors/model_store.rb +7 -6
- data/lib/volt/models/persistors/params.rb +2 -2
- data/lib/volt/models/persistors/query/query_listener.rb +2 -0
- data/lib/volt/models/persistors/query/query_listener_pool.rb +1 -1
- data/lib/volt/models/persistors/store.rb +1 -2
- data/lib/volt/models/persistors/store_state.rb +2 -3
- data/lib/volt/models/url.rb +17 -16
- data/lib/volt/models/validations.rb +11 -14
- data/lib/volt/models/validators/length_validator.rb +3 -3
- data/lib/volt/models/validators/presence_validator.rb +2 -2
- data/lib/volt/page/bindings/attribute_binding.rb +2 -3
- data/lib/volt/page/bindings/base_binding.rb +1 -1
- data/lib/volt/page/bindings/each_binding.rb +8 -9
- data/lib/volt/page/bindings/event_binding.rb +2 -3
- data/lib/volt/page/bindings/template_binding.rb +8 -7
- data/lib/volt/page/bindings/template_binding/grouped_controllers.rb +2 -1
- data/lib/volt/page/channel.rb +10 -10
- data/lib/volt/page/channel_stub.rb +1 -1
- data/lib/volt/page/document.rb +0 -1
- data/lib/volt/page/document_events.rb +4 -4
- data/lib/volt/page/page.rb +26 -19
- data/lib/volt/page/string_template_renderer.rb +2 -2
- data/lib/volt/page/sub_context.rb +10 -4
- data/lib/volt/page/targets/attribute_section.rb +1 -1
- data/lib/volt/page/targets/attribute_target.rb +1 -2
- data/lib/volt/page/targets/base_section.rb +4 -4
- data/lib/volt/page/targets/binding_document/base_node.rb +0 -1
- data/lib/volt/page/targets/binding_document/component_node.rb +4 -5
- data/lib/volt/page/targets/dom_section.rb +21 -22
- data/lib/volt/page/targets/dom_target.rb +1 -1
- data/lib/volt/page/targets/dom_template.rb +11 -12
- data/lib/volt/page/targets/helpers/comment_searchers.rb +7 -8
- data/lib/volt/page/tasks.rb +0 -1
- data/lib/volt/page/template_renderer.rb +1 -1
- data/lib/volt/page/url_tracker.rb +3 -3
- data/lib/volt/reactive/computation.rb +5 -11
- data/lib/volt/reactive/dependency.rb +1 -3
- data/lib/volt/reactive/eventable.rb +17 -4
- data/lib/volt/reactive/hash_dependency.rb +1 -0
- data/lib/volt/reactive/reactive_accessors.rb +0 -1
- data/lib/volt/reactive/reactive_array.rb +20 -25
- data/lib/volt/reactive/reactive_hash.rb +3 -3
- data/lib/volt/router/routes.rb +11 -13
- data/lib/volt/server.rb +17 -17
- data/lib/volt/server/component_handler.rb +2 -2
- data/lib/volt/server/component_templates.rb +8 -8
- data/lib/volt/server/html_parser/attribute_scope.rb +9 -10
- data/lib/volt/server/html_parser/if_view_scope.rb +2 -2
- data/lib/volt/server/html_parser/sandlebars_parser.rb +14 -14
- data/lib/volt/server/html_parser/textarea_scope.rb +1 -2
- data/lib/volt/server/html_parser/view_handler.rb +1 -1
- data/lib/volt/server/html_parser/view_parser.rb +1 -1
- data/lib/volt/server/html_parser/view_scope.rb +10 -10
- data/lib/volt/server/rack/asset_files.rb +15 -16
- data/lib/volt/server/rack/component_code.rb +2 -2
- data/lib/volt/server/rack/component_html_renderer.rb +0 -1
- data/lib/volt/server/rack/component_paths.rb +13 -10
- data/lib/volt/server/rack/index_files.rb +4 -4
- data/lib/volt/server/rack/opal_files.rb +4 -5
- data/lib/volt/server/rack/source_map_server.rb +3 -3
- data/lib/volt/server/socket_connection_handler.rb +3 -4
- data/lib/volt/server/socket_connection_handler_stub.rb +1 -1
- data/lib/volt/spec/setup.rb +3 -3
- data/lib/volt/store/mongo.rb +2 -2
- data/lib/volt/tasks/task_handler.rb +3 -3
- data/lib/volt/utils/generic_counting_pool.rb +2 -2
- data/lib/volt/utils/generic_pool.rb +7 -8
- data/lib/volt/utils/local_storage.rb +4 -4
- data/lib/volt/volt/environment.rb +1 -1
- data/spec/apps/file_loading/app/shared/config/dependencies.rb +1 -1
- data/spec/apps/kitchen_sink/Gemfile +0 -2
- data/spec/apps/kitchen_sink/app/main/config/routes.rb +5 -5
- data/spec/apps/kitchen_sink/app/main/controllers/main_controller.rb +7 -6
- data/spec/apps/kitchen_sink/app/main/controllers/todos_controller.rb +3 -4
- data/spec/controllers/reactive_accessors_spec.rb +4 -4
- data/spec/extra_core/inflector_spec.rb +1 -1
- data/spec/extra_core/string_transformation_test_cases.rb +23 -24
- data/spec/extra_core/string_transformations_spec.rb +11 -12
- data/spec/integration/bindings_spec.rb +15 -15
- data/spec/integration/list_spec.rb +12 -13
- data/spec/integration/templates_spec.rb +3 -3
- data/spec/models/model_spec.rb +74 -80
- data/spec/models/persistors/params_spec.rb +2 -2
- data/spec/models/persistors/store_spec.rb +4 -4
- data/spec/models/validations_spec.rb +14 -23
- data/spec/page/bindings/content_binding_spec.rb +7 -8
- data/spec/page/bindings/template_binding_spec.rb +22 -24
- data/spec/page/sub_context_spec.rb +2 -2
- data/spec/reactive/computation_spec.rb +3 -3
- data/spec/reactive/reactive_array_spec.rb +12 -12
- data/spec/router/routes_spec.rb +45 -48
- data/spec/server/html_parser/sandlebars_parser_spec.rb +42 -42
- data/spec/server/html_parser/view_parser_spec.rb +132 -153
- data/spec/server/rack/asset_files_spec.rb +9 -8
- data/spec/server/rack/component_paths_spec.rb +5 -5
- data/spec/server/rack/rack_requests_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -1
- data/spec/tasks/live_query_spec.rb +4 -5
- data/spec/tasks/query_tasks.rb +2 -4
- data/spec/tasks/query_tracker_spec.rb +29 -29
- data/spec/templates/targets/binding_document/component_node_spec.rb +1 -1
- data/spec/utils/generic_counting_pool_spec.rb +4 -4
- data/spec/utils/generic_pool_spec.rb +12 -12
- data/templates/component/config/routes.rb +2 -2
- data/templates/component/controllers/main_controller.rb +7 -6
- data/templates/newgem/app/newgem/config/dependencies.rb +1 -1
- data/templates/newgem/app/newgem/config/routes.rb +1 -1
- data/templates/project/app/main/config/routes.rb +2 -2
- data/templates/project/app/main/controllers/main_controller.rb +7 -6
- data/templates/project/spec/sample_spec.rb +2 -2
- data/volt.gemspec +32 -33
- metadata +3 -4
- data/lib/volt/extra_core/log.rb +0 -56
- data/lib/volt/extra_core/try.rb +0 -31
|
@@ -2,13 +2,13 @@ require 'spec_helper'
|
|
|
2
2
|
require 'volt/models'
|
|
3
3
|
|
|
4
4
|
describe Volt::Persistors::Params do
|
|
5
|
-
it
|
|
5
|
+
it 'should stay as params classes when used' do
|
|
6
6
|
a = Volt::Model.new({}, persistor: Volt::Persistors::Params)
|
|
7
7
|
expect(a._test.class).to eq(Volt::Model)
|
|
8
8
|
|
|
9
9
|
expect(a._test._cool.persistor.class).to eq(Volt::Persistors::Params)
|
|
10
10
|
|
|
11
|
-
a._items << {name: 'Test'}
|
|
11
|
+
a._items << { name: 'Test' }
|
|
12
12
|
|
|
13
13
|
expect(a._items.persistor.class).to eq(Volt::Persistors::Params)
|
|
14
14
|
expect(a._items[0].persistor.class).to eq(Volt::Persistors::Params)
|
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
|
2
2
|
require 'volt/models'
|
|
3
3
|
|
|
4
4
|
describe Volt::Persistors::Store do
|
|
5
|
-
it
|
|
5
|
+
it 'should tell the persistor when the model has changed' do
|
|
6
6
|
persistor = double('volt/persistor')
|
|
7
7
|
persistor_instance = double('volt/persistor instance')
|
|
8
8
|
expect(persistor_instance).to receive(:loaded)
|
|
@@ -15,15 +15,15 @@ describe Volt::Persistors::Store do
|
|
|
15
15
|
@model._attr = 'yes'
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
it
|
|
18
|
+
it 'should tell the persistor when something is added to an array model' do
|
|
19
19
|
persistor = double('volt/persistor')
|
|
20
20
|
persistor_instance = double('volt/persistor instance')
|
|
21
21
|
expect(persistor_instance).to receive(:loaded)
|
|
22
22
|
expect(persistor).to receive(:new).and_return(persistor_instance)
|
|
23
23
|
|
|
24
|
-
@model = Volt::ArrayModel.new([1,2,3], persistor: persistor)
|
|
24
|
+
@model = Volt::ArrayModel.new([1, 2, 3], persistor: persistor)
|
|
25
25
|
|
|
26
|
-
expect(persistor_instance).to receive(:added).with(4,3)
|
|
26
|
+
expect(persistor_instance).to receive(:added).with(4, 3)
|
|
27
27
|
|
|
28
28
|
@model << 4
|
|
29
29
|
end
|
|
@@ -2,23 +2,20 @@ require 'volt/models'
|
|
|
2
2
|
|
|
3
3
|
class TestModel < Volt::Model
|
|
4
4
|
validate :_name, length: 4
|
|
5
|
-
validate :_description, length: {message: 'needs to be longer', length: 50}
|
|
5
|
+
validate :_description, length: { message: 'needs to be longer', length: 50 }
|
|
6
6
|
validate :_username, presence: true
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
describe Volt::Model do
|
|
11
|
-
it
|
|
10
|
+
it 'should validate the name' do
|
|
12
11
|
expect(TestModel.new.errors).to eq(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
:_username => ["must be specified"]
|
|
17
|
-
}
|
|
12
|
+
_name: ['must be at least 4 characters'],
|
|
13
|
+
_description: ['needs to be longer'],
|
|
14
|
+
_username: ['must be specified']
|
|
18
15
|
)
|
|
19
16
|
end
|
|
20
17
|
|
|
21
|
-
it
|
|
18
|
+
it 'should show marked validations once they are marked' do
|
|
22
19
|
model = TestModel.new
|
|
23
20
|
|
|
24
21
|
expect(model.marked_errors).to eq({})
|
|
@@ -26,13 +23,11 @@ describe Volt::Model do
|
|
|
26
23
|
model.mark_field!(:_name)
|
|
27
24
|
|
|
28
25
|
expect(model.marked_errors).to eq(
|
|
29
|
-
|
|
30
|
-
:_name => ["must be at least 4 characters"]
|
|
31
|
-
}
|
|
26
|
+
_name: ['must be at least 4 characters']
|
|
32
27
|
)
|
|
33
28
|
end
|
|
34
29
|
|
|
35
|
-
it
|
|
30
|
+
it 'should show all fields in marked errors once saved' do
|
|
36
31
|
model = TestModel.new
|
|
37
32
|
|
|
38
33
|
expect(model.marked_errors).to eq({})
|
|
@@ -42,8 +37,8 @@ describe Volt::Model do
|
|
|
42
37
|
expect(model.marked_errors.keys).to eq([:_name, :_description, :_username])
|
|
43
38
|
end
|
|
44
39
|
|
|
45
|
-
describe
|
|
46
|
-
it
|
|
40
|
+
describe 'length' do
|
|
41
|
+
it 'should allow custom errors on length' do
|
|
47
42
|
model = TestModel.new
|
|
48
43
|
|
|
49
44
|
expect(model.marked_errors).to eq({})
|
|
@@ -51,15 +46,13 @@ describe Volt::Model do
|
|
|
51
46
|
model.mark_field!(:_description)
|
|
52
47
|
|
|
53
48
|
expect(model.marked_errors).to eq(
|
|
54
|
-
|
|
55
|
-
:_description => ["needs to be longer"]
|
|
56
|
-
}
|
|
49
|
+
_description: ['needs to be longer']
|
|
57
50
|
)
|
|
58
51
|
end
|
|
59
52
|
end
|
|
60
53
|
|
|
61
|
-
describe
|
|
62
|
-
it
|
|
54
|
+
describe 'presence' do
|
|
55
|
+
it 'should validate presence' do
|
|
63
56
|
model = TestModel.new
|
|
64
57
|
|
|
65
58
|
expect(model.marked_errors).to eq({})
|
|
@@ -67,9 +60,7 @@ describe Volt::Model do
|
|
|
67
60
|
model.mark_field!(:_username)
|
|
68
61
|
|
|
69
62
|
expect(model.marked_errors).to eq(
|
|
70
|
-
|
|
71
|
-
:_username => ["must be specified"]
|
|
72
|
-
}
|
|
63
|
+
_username: ['must be specified']
|
|
73
64
|
)
|
|
74
65
|
end
|
|
75
66
|
end
|
|
@@ -4,24 +4,23 @@ require 'volt/page/targets/attribute_target'
|
|
|
4
4
|
require 'volt/page/targets/dom_section'
|
|
5
5
|
require 'volt/page/template_renderer'
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
describe Volt::ContentBinding do
|
|
9
|
-
it
|
|
8
|
+
it 'should render the content in a content binding' do
|
|
10
9
|
dom = Volt::AttributeTarget.new(0)
|
|
11
|
-
context = {:
|
|
12
|
-
binding = Volt::ContentBinding.new(nil, dom, context, 0,
|
|
10
|
+
context = { name: 'jimmy' }
|
|
11
|
+
binding = Volt::ContentBinding.new(nil, dom, context, 0, proc { self[:name] })
|
|
13
12
|
|
|
14
13
|
expect(dom.to_html).to eq('jimmy')
|
|
15
14
|
end
|
|
16
15
|
|
|
17
|
-
it
|
|
18
|
-
context = {:
|
|
19
|
-
binding = lambda {|page, target, context, id| Volt::ContentBinding.new(page, target, context, id,
|
|
16
|
+
it 'should render with a template' do
|
|
17
|
+
context = { name: 'jimmy' }
|
|
18
|
+
binding = lambda { |page, target, context, id| Volt::ContentBinding.new(page, target, context, id, proc { self[:name] }) }
|
|
20
19
|
|
|
21
20
|
templates = {
|
|
22
21
|
'main/main' => {
|
|
23
22
|
'html' => 'hello <!-- $1 --><!-- $/1 -->',
|
|
24
|
-
'bindings' => {1 => [binding]}
|
|
23
|
+
'bindings' => { 1 => [binding] }
|
|
25
24
|
}
|
|
26
25
|
}
|
|
27
26
|
|
|
@@ -26,28 +26,27 @@ describe Volt::TemplateBinding do
|
|
|
26
26
|
$page = nil
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
it
|
|
29
|
+
it 'should lookup nested controller action' do
|
|
30
30
|
@templates = {
|
|
31
31
|
'main/main/blog/nav' => '',
|
|
32
|
-
'main/comments/new/body' => ''
|
|
32
|
+
'main/comments/new/body' => ''
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
result = @template_binding.path_for_template('comments/new').last
|
|
36
|
-
expect(result).to eq(
|
|
36
|
+
expect(result).to eq(%w(main comments_controller new))
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
it
|
|
39
|
+
it 'it should not look in the local component/controller for a specified controller/action' do
|
|
40
40
|
@templates = {
|
|
41
41
|
'main/comments/new/body' => ''
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
path, result = @template_binding.path_for_template('comments/new')
|
|
45
45
|
expect(path).to eq('main/comments/new/body')
|
|
46
|
-
expect(result).to eq(
|
|
46
|
+
expect(result).to eq(%w(main comments_controller new))
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
it "should handle a tripple lookup" do
|
|
49
|
+
it 'should handle a tripple lookup' do
|
|
51
50
|
@templates = {
|
|
52
51
|
'main/comments/new/errors' => '',
|
|
53
52
|
'comments/new/errors/body' => ''
|
|
@@ -58,54 +57,53 @@ describe Volt::TemplateBinding do
|
|
|
58
57
|
expect(result).to eq(nil)
|
|
59
58
|
end
|
|
60
59
|
|
|
61
|
-
it
|
|
60
|
+
it 'should handle a tripple lookup to controllers' do
|
|
62
61
|
@templates = {
|
|
63
62
|
'comments/new/errors/body' => ''
|
|
64
63
|
}
|
|
65
64
|
|
|
66
65
|
path, result = @template_binding.path_for_template('comments/new/errors')
|
|
67
66
|
expect(path).to eq('comments/new/errors/body')
|
|
68
|
-
expect(result).to eq(
|
|
67
|
+
expect(result).to eq(%w(comments new_controller errors))
|
|
69
68
|
end
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
it "should find a matching component" do
|
|
70
|
+
it 'should find a matching component' do
|
|
73
71
|
@templates = {
|
|
74
72
|
'comments/new/index/body' => ''
|
|
75
73
|
}
|
|
76
74
|
|
|
77
75
|
path, result = @template_binding.path_for_template('comments/new')
|
|
78
76
|
expect(path).to eq('comments/new/index/body')
|
|
79
|
-
expect(result).to eq(
|
|
77
|
+
expect(result).to eq(%w(comments new_controller index))
|
|
80
78
|
end
|
|
81
79
|
|
|
82
|
-
it
|
|
80
|
+
it 'should lookup sub-templates within its own file' do
|
|
83
81
|
@templates = {
|
|
84
82
|
'main/main/blog/nav' => '',
|
|
85
|
-
'main/main/main/nav' => ''
|
|
83
|
+
'main/main/main/nav' => ''
|
|
86
84
|
}
|
|
87
85
|
|
|
88
86
|
expect(@template_binding.path_for_template('nav').first).to eq('main/main/main/nav')
|
|
89
87
|
end
|
|
90
88
|
|
|
91
|
-
it
|
|
89
|
+
it 'should lookup sub-templates within another local view' do
|
|
92
90
|
@templates = {
|
|
93
91
|
'main/main/blog/nav' => '',
|
|
94
|
-
'main/main/main/nav' => ''
|
|
92
|
+
'main/main/main/nav' => ''
|
|
95
93
|
}
|
|
96
94
|
|
|
97
95
|
expect(@template_binding.path_for_template('blog/nav').first).to eq('main/main/blog/nav')
|
|
98
96
|
end
|
|
99
97
|
|
|
100
|
-
it
|
|
98
|
+
it 'should lookup in another view' do
|
|
101
99
|
@templates = {
|
|
102
|
-
'main/main/nav/body' => ''
|
|
100
|
+
'main/main/nav/body' => ''
|
|
103
101
|
}
|
|
104
102
|
|
|
105
103
|
expect(@template_binding.path_for_template('nav').first).to eq('main/main/nav/body')
|
|
106
104
|
end
|
|
107
105
|
|
|
108
|
-
it
|
|
106
|
+
it 'should lookup in a controller' do
|
|
109
107
|
@templates = {
|
|
110
108
|
'main/nav/index/body' => ''
|
|
111
109
|
}
|
|
@@ -113,7 +111,7 @@ describe Volt::TemplateBinding do
|
|
|
113
111
|
expect(@template_binding.path_for_template('nav').first).to eq('main/nav/index/body')
|
|
114
112
|
end
|
|
115
113
|
|
|
116
|
-
it
|
|
114
|
+
it 'should lookup in a controller/view' do
|
|
117
115
|
@templates = {
|
|
118
116
|
'main/blog/nav/body' => ''
|
|
119
117
|
}
|
|
@@ -121,7 +119,7 @@ describe Volt::TemplateBinding do
|
|
|
121
119
|
expect(@template_binding.path_for_template('blog/nav').first).to eq('main/blog/nav/body')
|
|
122
120
|
end
|
|
123
121
|
|
|
124
|
-
it
|
|
122
|
+
it 'should lookup in a controller' do
|
|
125
123
|
@templates = {
|
|
126
124
|
'main/nav/index/body' => ''
|
|
127
125
|
}
|
|
@@ -129,7 +127,7 @@ describe Volt::TemplateBinding do
|
|
|
129
127
|
expect(@template_binding.path_for_template('nav').first).to eq('main/nav/index/body')
|
|
130
128
|
end
|
|
131
129
|
|
|
132
|
-
it
|
|
130
|
+
it 'should lookup in a component' do
|
|
133
131
|
@templates = {
|
|
134
132
|
'nav/main/index/body' => ''
|
|
135
133
|
}
|
|
@@ -137,7 +135,7 @@ describe Volt::TemplateBinding do
|
|
|
137
135
|
expect(@template_binding.path_for_template('nav').first).to eq('nav/main/index/body')
|
|
138
136
|
end
|
|
139
137
|
|
|
140
|
-
it
|
|
138
|
+
it 'should lookup in a component/controller/view' do
|
|
141
139
|
@templates = {
|
|
142
140
|
'nav/main/main/body' => '',
|
|
143
141
|
'auth/login/new/body' => ''
|
|
@@ -146,7 +144,7 @@ describe Volt::TemplateBinding do
|
|
|
146
144
|
expect(@template_binding.path_for_template('auth/login/new').first).to eq('auth/login/new/body')
|
|
147
145
|
end
|
|
148
146
|
|
|
149
|
-
it
|
|
147
|
+
it 'should let you force a sub template' do
|
|
150
148
|
@templates = {
|
|
151
149
|
'nav/main/index/title' => '',
|
|
152
150
|
'auth/login/new/title' => ''
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require 'volt/page/sub_context'
|
|
2
2
|
|
|
3
3
|
describe Volt::SubContext do
|
|
4
|
-
it
|
|
5
|
-
sub_context = Volt::SubContext.new(
|
|
4
|
+
it 'should respond_to correctly on locals' do
|
|
5
|
+
sub_context = Volt::SubContext.new(name: 'Name')
|
|
6
6
|
|
|
7
7
|
expect(sub_context.respond_to?(:name)).to eq(true)
|
|
8
8
|
expect(sub_context.respond_to?(:missing)).to eq(false)
|
|
@@ -50,14 +50,14 @@ describe Volt::Computation do
|
|
|
50
50
|
end.watch!
|
|
51
51
|
end.watch!
|
|
52
52
|
|
|
53
|
-
expect(values).to eq([nil,nil])
|
|
53
|
+
expect(values).to eq([nil, nil])
|
|
54
54
|
|
|
55
55
|
a[1] = 'inner'
|
|
56
56
|
Volt::Computation.flush!
|
|
57
|
-
expect(values).to eq([nil,nil,'inner'])
|
|
57
|
+
expect(values).to eq([nil, nil, 'inner'])
|
|
58
58
|
|
|
59
59
|
a[0] = 'outer'
|
|
60
60
|
Volt::Computation.flush!
|
|
61
|
-
expect(values).to eq([nil,nil,'inner','outer','inner'])
|
|
61
|
+
expect(values).to eq([nil, nil, 'inner', 'outer', 'inner'])
|
|
62
62
|
end
|
|
63
63
|
end
|
|
@@ -2,13 +2,13 @@ require 'spec_helper'
|
|
|
2
2
|
require 'volt/reactive/reactive_array'
|
|
3
3
|
|
|
4
4
|
describe Volt::ReactiveArray do
|
|
5
|
-
describe
|
|
5
|
+
describe 'cells' do
|
|
6
6
|
it 'should track dependencies for cells' do
|
|
7
7
|
a = Volt::ReactiveArray.new
|
|
8
8
|
|
|
9
9
|
count = 0
|
|
10
10
|
values = []
|
|
11
|
-
-> { values << a[0]
|
|
11
|
+
-> { values << a[0]; count += 1 }.watch!
|
|
12
12
|
|
|
13
13
|
a[0] = 5
|
|
14
14
|
|
|
@@ -24,7 +24,7 @@ describe Volt::ReactiveArray do
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
it 'should trigger changed on the last cell when appending' do
|
|
27
|
-
a = Volt::ReactiveArray.new([1,2,3])
|
|
27
|
+
a = Volt::ReactiveArray.new([1, 2, 3])
|
|
28
28
|
|
|
29
29
|
values = []
|
|
30
30
|
-> { values << a[3] }.watch!
|
|
@@ -39,7 +39,7 @@ describe Volt::ReactiveArray do
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it 'should trigger changes for each cell after index after insert' do
|
|
42
|
-
a = Volt::ReactiveArray.new([1,2,3])
|
|
42
|
+
a = Volt::ReactiveArray.new([1, 2, 3])
|
|
43
43
|
|
|
44
44
|
values_at_2 = []
|
|
45
45
|
values_at_3 = []
|
|
@@ -52,18 +52,18 @@ describe Volt::ReactiveArray do
|
|
|
52
52
|
expect(values_at_3).to eq([nil])
|
|
53
53
|
expect(values_at_4).to eq([nil])
|
|
54
54
|
|
|
55
|
-
a.insert(2,1.3,1.7)
|
|
55
|
+
a.insert(2, 1.3, 1.7)
|
|
56
56
|
|
|
57
57
|
Volt::Computation.flush!
|
|
58
58
|
|
|
59
|
-
expect(values_at_2).to eq([3,1.3])
|
|
60
|
-
expect(values_at_3).to eq([nil,1.7])
|
|
61
|
-
expect(values_at_4).to eq([nil,3])
|
|
59
|
+
expect(values_at_2).to eq([3, 1.3])
|
|
60
|
+
expect(values_at_3).to eq([nil, 1.7])
|
|
61
|
+
expect(values_at_4).to eq([nil, 3])
|
|
62
62
|
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
-
describe
|
|
66
|
+
describe 'size dependencies' do
|
|
67
67
|
it 'pushing should trigger changed for size' do
|
|
68
68
|
array = Volt::ReactiveArray.new
|
|
69
69
|
count = 0
|
|
@@ -76,11 +76,11 @@ describe Volt::ReactiveArray do
|
|
|
76
76
|
array << 5
|
|
77
77
|
|
|
78
78
|
Volt::Computation.flush!
|
|
79
|
-
expect(size_values).to eq([0,1])
|
|
79
|
+
expect(size_values).to eq([0, 1])
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
it 'should trigger a size change when deleting' do
|
|
83
|
-
array = Volt::ReactiveArray.new([1,2,3])
|
|
83
|
+
array = Volt::ReactiveArray.new([1, 2, 3])
|
|
84
84
|
|
|
85
85
|
size_values = []
|
|
86
86
|
-> { size_values << array.size }.watch!
|
|
@@ -91,7 +91,7 @@ describe Volt::ReactiveArray do
|
|
|
91
91
|
|
|
92
92
|
expect(size_values).to eq([3])
|
|
93
93
|
Volt::Computation.flush!
|
|
94
|
-
expect(size_values).to eq([3,2])
|
|
94
|
+
expect(size_values).to eq([3, 2])
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
end
|
data/spec/router/routes_spec.rb
CHANGED
|
@@ -7,17 +7,17 @@ def routes(&block)
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
describe Volt::Routes do
|
|
10
|
-
it
|
|
10
|
+
it 'should setup direct routes' do
|
|
11
11
|
routes do
|
|
12
12
|
get '/', _view: 'index'
|
|
13
13
|
get '/page1', _view: 'first_page'
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
direct_routes = @routes.instance_variable_get(:@direct_routes)
|
|
17
|
-
expect(direct_routes).to eq(
|
|
17
|
+
expect(direct_routes).to eq('/' => { _view: 'index' }, '/page1' => { _view: 'first_page' })
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
it
|
|
20
|
+
it 'should setup indiect routes' do
|
|
21
21
|
routes do
|
|
22
22
|
get '/blog/{{ _id }}/edit', _view: 'blog/edit'
|
|
23
23
|
get '/blog/{{ _id }}', _view: 'blog/show'
|
|
@@ -25,22 +25,20 @@ describe Volt::Routes do
|
|
|
25
25
|
|
|
26
26
|
indirect_routes = @routes.instance_variable_get(:@indirect_routes)
|
|
27
27
|
expect(indirect_routes).to eq(
|
|
28
|
-
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
nil => {:_view => "blog/show", :_id => 1}
|
|
35
|
-
}
|
|
28
|
+
'blog' => {
|
|
29
|
+
'*' => {
|
|
30
|
+
'edit' => {
|
|
31
|
+
nil => { _view: 'blog/edit', _id: 1 }
|
|
32
|
+
},
|
|
33
|
+
nil => { _view: 'blog/show', _id: 1 }
|
|
36
34
|
}
|
|
37
35
|
}
|
|
38
36
|
)
|
|
39
37
|
end
|
|
40
38
|
|
|
41
|
-
it
|
|
39
|
+
it 'should match routes' do
|
|
42
40
|
routes do
|
|
43
|
-
get
|
|
41
|
+
get '/blog', _view: 'blog'
|
|
44
42
|
get '/blog/{{ _id }}', _view: 'blog/show'
|
|
45
43
|
get '/blog/{{ _id }}/draft', _view: 'blog/draft', _action: 'draft'
|
|
46
44
|
get '/blog/{{ _id }}/edit', _view: 'blog/edit'
|
|
@@ -49,31 +47,31 @@ describe Volt::Routes do
|
|
|
49
47
|
end
|
|
50
48
|
|
|
51
49
|
params = @routes.url_to_params('/blog')
|
|
52
|
-
expect(params).to eq(
|
|
50
|
+
expect(params).to eq(_view: 'blog')
|
|
53
51
|
|
|
54
52
|
params = @routes.url_to_params('/blog/55/edit')
|
|
55
|
-
expect(params).to eq(
|
|
53
|
+
expect(params).to eq(_view: 'blog/edit', _id: '55')
|
|
56
54
|
|
|
57
55
|
params = @routes.url_to_params('/blog/55')
|
|
58
|
-
expect(params).to eq(
|
|
56
|
+
expect(params).to eq(_view: 'blog/show', _id: '55')
|
|
59
57
|
|
|
60
58
|
params = @routes.url_to_params('/blog/tags/good')
|
|
61
|
-
expect(params).to eq(
|
|
59
|
+
expect(params).to eq(_view: 'blog/tag', _tag: 'good')
|
|
62
60
|
|
|
63
61
|
params = @routes.url_to_params('/blog/55/draft')
|
|
64
|
-
expect(params).to eq(
|
|
62
|
+
expect(params).to eq(_view: 'blog/draft', _id: '55', _action: 'draft')
|
|
65
63
|
|
|
66
64
|
params = @routes.url_to_params('/login/jim/user/10')
|
|
67
|
-
expect(params).to eq(
|
|
65
|
+
expect(params).to eq(_view: 'login', _action: 'user', _name: 'jim', _id: '10')
|
|
68
66
|
|
|
69
67
|
params = @routes.url_to_params('/login/cool')
|
|
70
68
|
expect(params).to eq(false)
|
|
71
69
|
|
|
72
70
|
end
|
|
73
71
|
|
|
74
|
-
it
|
|
72
|
+
it 'should setup param matchers' do
|
|
75
73
|
routes do
|
|
76
|
-
get
|
|
74
|
+
get '/blog', _view: 'blog'
|
|
77
75
|
get '/blog/{{ _id }}', _view: 'blog/show'
|
|
78
76
|
get '/blog/{{ _id }}/edit', _view: 'blog/edit'
|
|
79
77
|
get '/blog/tags/{{ _tag }}', _view: 'blog/tag'
|
|
@@ -81,68 +79,67 @@ describe Volt::Routes do
|
|
|
81
79
|
end
|
|
82
80
|
|
|
83
81
|
param_matches = @routes.instance_variable_get(:@param_matches)
|
|
84
|
-
expect(param_matches.map {|v| v[0] }).to eq([
|
|
85
|
-
{:
|
|
86
|
-
{:
|
|
87
|
-
{:
|
|
88
|
-
{:
|
|
89
|
-
{:
|
|
82
|
+
expect(param_matches.map { |v| v[0] }).to eq([
|
|
83
|
+
{ _view: 'blog' },
|
|
84
|
+
{ _view: 'blog/show', _id: nil },
|
|
85
|
+
{ _view: 'blog/edit', _id: nil },
|
|
86
|
+
{ _view: 'blog/tag', _tag: nil },
|
|
87
|
+
{ _view: 'login', _action: 'user', _name: nil, _id: nil }
|
|
90
88
|
])
|
|
91
89
|
|
|
92
90
|
end
|
|
93
91
|
|
|
94
|
-
it
|
|
92
|
+
it 'should go from params to url' do
|
|
95
93
|
routes do
|
|
96
|
-
get
|
|
94
|
+
get '/blog', _view: 'blog'
|
|
97
95
|
get '/blog/{{ _id }}', _view: 'blog/show'
|
|
98
96
|
get '/blog/{{ _id }}/edit', _view: 'blog/edit'
|
|
99
97
|
get '/blog/tags/{{ _tag }}', _view: 'blog/tag'
|
|
100
98
|
get '/login/{{ _name }}/user/{{ _id }}', _view: 'login', _action: 'user'
|
|
101
99
|
end
|
|
102
100
|
|
|
103
|
-
url, params = @routes.params_to_url(
|
|
101
|
+
url, params = @routes.params_to_url(view: 'blog/show', id: '55')
|
|
104
102
|
expect(url).to eq('/blog/55')
|
|
105
103
|
expect(params).to eq({})
|
|
106
104
|
|
|
107
|
-
|
|
108
|
-
url, params = @routes.params_to_url({view: 'blog/edit', id: '100'})
|
|
105
|
+
url, params = @routes.params_to_url(view: 'blog/edit', id: '100')
|
|
109
106
|
expect(url).to eq('/blog/100/edit')
|
|
110
107
|
expect(params).to eq({})
|
|
111
108
|
|
|
112
|
-
url, params = @routes.params_to_url(
|
|
109
|
+
url, params = @routes.params_to_url(view: 'blog/edit', id: '100', other: 'should_pass')
|
|
113
110
|
expect(url).to eq('/blog/100/edit')
|
|
114
|
-
expect(params).to eq(
|
|
111
|
+
expect(params).to eq(_other: 'should_pass')
|
|
115
112
|
end
|
|
116
113
|
|
|
117
|
-
it
|
|
114
|
+
it 'should test that params match a param matcher' do
|
|
118
115
|
routes = Volt::Routes.new
|
|
119
|
-
match, params = routes.send(:check_params_match, {_view: 'blog', _id: '55'},
|
|
116
|
+
match, params = routes.send(:check_params_match, { _view: 'blog', _id: '55' }, _view: 'blog', _id: nil)
|
|
120
117
|
expect(match).to eq(true)
|
|
121
|
-
expect(params).to eq(
|
|
118
|
+
expect(params).to eq(_id: '55')
|
|
122
119
|
|
|
123
|
-
match, params = routes.send(:check_params_match, {_view: 'blog', _id: '55'},
|
|
120
|
+
match, params = routes.send(:check_params_match, { _view: 'blog', _id: '55' }, _view: 'blog', _id: '20')
|
|
124
121
|
expect(match).to eq(false)
|
|
125
122
|
|
|
126
|
-
match, params = routes.send(:check_params_match, {_view: 'blog', _name: {_title: 'Mr', _name: 'Bob'}, _id: '55'},
|
|
123
|
+
match, params = routes.send(:check_params_match, { _view: 'blog', _name: { _title: 'Mr', _name: 'Bob' }, _id: '55' }, _view: 'blog', _id: nil, _name: { _title: 'Mr', _name: nil })
|
|
127
124
|
expect(match).to eq(true)
|
|
128
|
-
expect(params).to eq(
|
|
125
|
+
expect(params).to eq(_id: '55')
|
|
129
126
|
|
|
130
127
|
# Check with an extra value _name._name
|
|
131
|
-
match, params = routes.send(:check_params_match, {_view: 'blog', _name: {_title: 'Mr', _name: 'Bob'}, _id: '55'},
|
|
128
|
+
match, params = routes.send(:check_params_match, { _view: 'blog', _name: { _title: 'Mr', _name: 'Bob' }, _id: '55' }, _view: 'blog', _id: nil, _name: { _title: 'Mr' })
|
|
132
129
|
expect(match).to eq(true)
|
|
133
|
-
expect(params).to eq(
|
|
130
|
+
expect(params).to eq(_id: '55')
|
|
134
131
|
|
|
135
|
-
match, params = routes.send(:check_params_match, {_view: 'blog', _name: {_title: 'Mr', _name: 'Bob'}, _id: '55'},
|
|
132
|
+
match, params = routes.send(:check_params_match, { _view: 'blog', _name: { _title: 'Mr', _name: 'Bob' }, _id: '55' }, _view: 'blog', _id: nil, _name: { _title: 'Phd' })
|
|
136
133
|
expect(match).to eq(false)
|
|
137
134
|
|
|
138
135
|
# Check to make sure extra values in the params pass it.
|
|
139
|
-
match, params = routes.send(:check_params_match, {_view: 'blog', _id: '55', _extra: 'some value'},
|
|
136
|
+
match, params = routes.send(:check_params_match, { _view: 'blog', _id: '55', _extra: 'some value' }, _view: 'blog', _id: '55')
|
|
140
137
|
expect(match).to eq(true)
|
|
141
|
-
expect(params).to eq(
|
|
138
|
+
expect(params).to eq(_extra: 'some value')
|
|
142
139
|
|
|
143
140
|
end
|
|
144
141
|
|
|
145
|
-
it
|
|
142
|
+
it 'should match routes' do
|
|
146
143
|
params = Volt::Model.new({}, persistor: Volt::Persistors::Params)
|
|
147
144
|
params._controller = 'blog'
|
|
148
145
|
params._index = '5'
|
|
@@ -154,10 +151,10 @@ describe Volt::Routes do
|
|
|
154
151
|
|
|
155
152
|
path, cleaned_params = @routes.params_to_url(params.to_h)
|
|
156
153
|
expect(path).to eq('/blog')
|
|
157
|
-
expect(cleaned_params).to eq(
|
|
154
|
+
expect(cleaned_params).to eq(_index: '5')
|
|
158
155
|
end
|
|
159
156
|
|
|
160
|
-
it
|
|
157
|
+
it 'should handle routes with bindings in them' do
|
|
161
158
|
params = Volt::Model.new({}, persistor: Volt::Persistors::Params)
|
|
162
159
|
|
|
163
160
|
routes do
|