volt 0.8.14 → 0.8.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/Readme.md +8 -2
- data/VERSION +1 -1
- data/app/volt/controllers/notices_controller.rb +1 -1
- data/app/volt/models/user.rb +2 -2
- data/app/volt/tasks/live_query/live_query_pool.rb +1 -1
- data/app/volt/tasks/query_tasks.rb +1 -1
- data/app/volt/tasks/store_tasks.rb +1 -1
- data/app/volt/tasks/user_tasks.rb +2 -2
- data/lib/volt/boot.rb +2 -2
- data/lib/volt/cli/asset_compile.rb +31 -27
- data/lib/volt/cli.rb +64 -65
- data/lib/volt/config.rb +25 -23
- data/lib/volt/console.rb +17 -16
- data/lib/volt/controllers/model_controller.rb +82 -80
- data/lib/volt/data_stores/data_store.rb +2 -2
- data/lib/volt/data_stores/mongo_driver.rb +2 -2
- data/lib/volt/extra_core/inflections.rb +2 -2
- data/lib/volt/extra_core/inflector/inflections.rb +185 -183
- data/lib/volt/extra_core/inflector/methods.rb +50 -48
- data/lib/volt/extra_core/string.rb +2 -2
- data/lib/volt/models/array_model.rb +93 -92
- data/lib/volt/models/cursor.rb +3 -2
- data/lib/volt/models/model.rb +248 -251
- data/lib/volt/models/model_hash_behaviour.rb +44 -44
- data/lib/volt/models/model_helpers.rb +38 -36
- data/lib/volt/models/model_state.rb +16 -17
- data/lib/volt/models/model_wrapper.rb +25 -24
- data/lib/volt/models/persistors/array_store.rb +145 -143
- data/lib/volt/models/persistors/base.rb +18 -16
- data/lib/volt/models/persistors/flash.rb +24 -22
- data/lib/volt/models/persistors/local_store.rb +46 -44
- data/lib/volt/models/persistors/model_identity_map.rb +10 -8
- data/lib/volt/models/persistors/model_store.rb +76 -76
- data/lib/volt/models/persistors/params.rb +19 -17
- data/lib/volt/models/persistors/query/query_listener.rb +65 -63
- data/lib/volt/models/persistors/query/query_listener_pool.rb +12 -10
- data/lib/volt/models/persistors/store.rb +28 -28
- data/lib/volt/models/persistors/store_factory.rb +12 -10
- data/lib/volt/models/persistors/store_state.rb +33 -31
- data/lib/volt/models/url.rb +96 -104
- data/lib/volt/models/validations.rb +56 -54
- data/lib/volt/models/validators/length_validator.rb +24 -22
- data/lib/volt/models/validators/presence_validator.rb +14 -12
- data/lib/volt/page/bindings/attribute_binding.rb +106 -106
- data/lib/volt/page/bindings/base_binding.rb +23 -21
- data/lib/volt/page/bindings/component_binding.rb +3 -1
- data/lib/volt/page/bindings/content_binding.rb +34 -34
- data/lib/volt/page/bindings/each_binding.rb +113 -113
- data/lib/volt/page/bindings/event_binding.rb +38 -34
- data/lib/volt/page/bindings/if_binding.rb +56 -54
- data/lib/volt/page/bindings/template_binding/grouped_controllers.rb +24 -22
- data/lib/volt/page/bindings/template_binding.rb +182 -185
- data/lib/volt/page/channel.rb +79 -77
- data/lib/volt/page/channel_stub.rb +29 -27
- data/lib/volt/page/document.rb +6 -5
- data/lib/volt/page/document_events.rb +54 -52
- data/lib/volt/page/page.rb +139 -138
- data/lib/volt/page/string_template_renderer.rb +36 -36
- data/lib/volt/page/sub_context.rb +26 -25
- data/lib/volt/page/targets/attribute_section.rb +27 -25
- data/lib/volt/page/targets/attribute_target.rb +7 -6
- data/lib/volt/page/targets/base_section.rb +27 -26
- data/lib/volt/page/targets/binding_document/base_node.rb +3 -1
- data/lib/volt/page/targets/binding_document/component_node.rb +85 -82
- data/lib/volt/page/targets/binding_document/html_node.rb +11 -9
- data/lib/volt/page/targets/dom_section.rb +78 -77
- data/lib/volt/page/targets/dom_target.rb +8 -6
- data/lib/volt/page/targets/dom_template.rb +90 -88
- data/lib/volt/page/targets/helpers/comment_searchers.rb +51 -49
- data/lib/volt/page/tasks.rb +59 -57
- data/lib/volt/page/template_renderer.rb +17 -14
- data/lib/volt/page/url_tracker.rb +26 -24
- data/lib/volt/reactive/computation.rb +87 -88
- data/lib/volt/reactive/dependency.rb +30 -28
- data/lib/volt/reactive/eventable.rb +64 -62
- data/lib/volt/reactive/hash_dependency.rb +25 -23
- data/lib/volt/reactive/reactive_accessors.rb +34 -32
- data/lib/volt/reactive/reactive_array.rb +162 -162
- data/lib/volt/reactive/reactive_hash.rb +37 -35
- data/lib/volt/router/routes.rb +99 -101
- data/lib/volt/server/component_handler.rb +20 -21
- data/lib/volt/server/component_templates.rb +72 -70
- data/lib/volt/server/html_parser/attribute_scope.rb +109 -99
- data/lib/volt/server/html_parser/each_scope.rb +17 -16
- data/lib/volt/server/html_parser/if_view_scope.rb +51 -49
- data/lib/volt/server/html_parser/sandlebars_parser.rb +184 -177
- data/lib/volt/server/html_parser/textarea_scope.rb +24 -22
- data/lib/volt/server/html_parser/view_handler.rb +66 -65
- data/lib/volt/server/html_parser/view_parser.rb +23 -21
- data/lib/volt/server/html_parser/view_scope.rb +142 -141
- data/lib/volt/server/rack/asset_files.rb +81 -79
- data/lib/volt/server/rack/component_code.rb +17 -15
- data/lib/volt/server/rack/component_html_renderer.rb +14 -12
- data/lib/volt/server/rack/component_paths.rb +72 -71
- data/lib/volt/server/rack/index_files.rb +36 -39
- data/lib/volt/server/rack/opal_files.rb +43 -41
- data/lib/volt/server/rack/source_map_server.rb +23 -21
- data/lib/volt/server/socket_connection_handler.rb +46 -45
- data/lib/volt/server/socket_connection_handler_stub.rb +21 -19
- data/lib/volt/server.rb +60 -58
- data/lib/volt/spec/setup.rb +3 -3
- data/lib/volt/tasks/dispatcher.rb +24 -23
- data/lib/volt/tasks/task_handler.rb +35 -33
- data/lib/volt/utils/ejson.rb +8 -6
- data/lib/volt/utils/generic_counting_pool.rb +33 -31
- data/lib/volt/utils/generic_pool.rb +73 -70
- data/lib/volt/utils/local_storage.rb +42 -38
- data/lib/volt/volt/environment.rb +1 -1
- data/lib/volt.rb +44 -42
- data/spec/apps/kitchen_sink/app/main/assets/css/todos.css +28 -0
- data/spec/apps/kitchen_sink/app/main/config/routes.rb +1 -0
- data/spec/apps/kitchen_sink/app/main/controllers/main_controller.rb +2 -2
- data/spec/apps/kitchen_sink/app/main/controllers/todos_controller.rb +17 -0
- data/spec/apps/kitchen_sink/app/main/views/main/main.html +1 -0
- data/spec/apps/kitchen_sink/app/main/views/todos/index.html +24 -0
- data/spec/apps/kitchen_sink/config.ru +1 -1
- data/spec/controllers/reactive_accessors_spec.rb +5 -5
- data/spec/extra_core/inflector_spec.rb +2 -2
- data/spec/integration/list_spec.rb +68 -0
- data/spec/models/model_spec.rb +57 -57
- data/spec/models/persistors/params_spec.rb +6 -6
- data/spec/models/persistors/store_spec.rb +7 -7
- data/spec/models/validations_spec.rb +3 -3
- data/spec/page/bindings/content_binding_spec.rb +7 -7
- data/spec/page/bindings/template_binding_spec.rb +4 -5
- data/spec/page/sub_context_spec.rb +2 -2
- data/spec/reactive/computation_spec.rb +10 -10
- data/spec/reactive/dependency_spec.rb +2 -2
- data/spec/reactive/eventable_spec.rb +4 -4
- data/spec/reactive/reactive_array_spec.rb +13 -13
- data/spec/router/routes_spec.rb +5 -5
- data/spec/server/html_parser/sandlebars_parser_spec.rb +9 -9
- data/spec/server/html_parser/view_parser_spec.rb +27 -27
- data/spec/server/rack/asset_files_spec.rb +5 -5
- data/spec/server/rack/component_paths_spec.rb +2 -2
- data/spec/tasks/live_query_spec.rb +2 -2
- data/spec/tasks/query_tasks.rb +1 -1
- data/spec/tasks/query_tracker_spec.rb +1 -1
- data/spec/templates/targets/binding_document/component_node_spec.rb +2 -2
- data/spec/utils/generic_counting_pool_spec.rb +2 -2
- data/spec/utils/generic_pool_spec.rb +2 -2
- data/templates/component/controllers/main_controller.rb +1 -1
- data/templates/model/model.rb.tt +2 -2
- data/templates/newgem/app/newgem/controllers/main_controller.rb.tt +2 -2
- data/templates/project/app/main/controllers/main_controller.rb +1 -1
- data/templates/project/config.ru +1 -1
- metadata +10 -3
- data/app/volt/assets/js/vertxbus.js +0 -216
data/lib/volt.rb
CHANGED
@@ -8,47 +8,49 @@ else
|
|
8
8
|
require 'volt/data_stores/data_store'
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
if RUBY_PLATFORM == 'opal'
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
module Volt
|
12
|
+
@in_browser = if RUBY_PLATFORM == 'opal'
|
13
|
+
`!!document && !window.OPAL_SPEC_PHANTOM`
|
14
|
+
else
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
include Volt::Config unless RUBY_PLATFORM == 'opal'
|
20
|
+
def root
|
21
|
+
@root ||= File.expand_path(Dir.pwd)
|
22
|
+
end
|
23
|
+
|
24
|
+
def root=(val)
|
25
|
+
@root = val
|
26
|
+
end
|
27
|
+
|
28
|
+
def server?
|
29
|
+
!!ENV['SERVER']
|
30
|
+
end
|
31
|
+
|
32
|
+
def client?
|
33
|
+
!ENV['SERVER']
|
34
|
+
end
|
35
|
+
|
36
|
+
def source_maps?
|
37
|
+
!!ENV['MAPS']
|
38
|
+
end
|
39
|
+
|
40
|
+
def env
|
41
|
+
@env ||= Volt::Environment.new
|
42
|
+
end
|
43
|
+
|
44
|
+
def logger
|
45
|
+
@logger ||= Logger.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def logger=(val)
|
49
|
+
@logger = val
|
50
|
+
end
|
51
|
+
|
52
|
+
def in_browser?
|
53
|
+
@in_browser
|
54
|
+
end
|
16
55
|
end
|
17
|
-
|
18
|
-
def self.root
|
19
|
-
@root ||= File.expand_path(Dir.pwd)
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.root=(val)
|
23
|
-
@root = val
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.server?
|
27
|
-
!!ENV['SERVER']
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.client?
|
31
|
-
!ENV['SERVER']
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.source_maps?
|
35
|
-
!!ENV['MAPS']
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.env
|
39
|
-
@env ||= Volt::Environment.new
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.logger
|
43
|
-
@logger ||= Logger.new
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.logger=(val)
|
47
|
-
@logger = val
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.in_browser?
|
51
|
-
@@in_browser
|
52
|
-
end
|
53
|
-
|
54
56
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
.todo-table {
|
2
|
+
width: auto;
|
3
|
+
}
|
4
|
+
|
5
|
+
.todo-table td {
|
6
|
+
padding: 5px;
|
7
|
+
border-top: 1px solid #EEEEEE;
|
8
|
+
}
|
9
|
+
|
10
|
+
.complete, tr.selected td.complete {
|
11
|
+
text-decoration: line-through;
|
12
|
+
color: #CCCCCC;
|
13
|
+
}
|
14
|
+
|
15
|
+
tr.selected td {
|
16
|
+
background-color: #428bca;
|
17
|
+
color: #FFFFFF;
|
18
|
+
}
|
19
|
+
|
20
|
+
|
21
|
+
textarea {
|
22
|
+
height: 140px;
|
23
|
+
width: 400px;
|
24
|
+
}
|
25
|
+
|
26
|
+
tr.selected td button {
|
27
|
+
color: #000000;
|
28
|
+
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class MainController < ModelController
|
1
|
+
class MainController < Volt::ModelController
|
2
2
|
model :page
|
3
3
|
|
4
4
|
private
|
@@ -8,4 +8,4 @@ class MainController < ModelController
|
|
8
8
|
def main_path
|
9
9
|
params._controller.or('main') + "/" + params._action.or('index')
|
10
10
|
end
|
11
|
-
end
|
11
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class TodosController < Volt::ModelController
|
2
|
+
model :page
|
3
|
+
|
4
|
+
def add_todo
|
5
|
+
self._todos << {name: self._new_todo}
|
6
|
+
self._new_todo = ''
|
7
|
+
end
|
8
|
+
|
9
|
+
def remove_todo(todo)
|
10
|
+
self._todos.delete(todo)
|
11
|
+
end
|
12
|
+
|
13
|
+
def completed
|
14
|
+
self._todos.count {|t| t._completed }
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<:Title>
|
2
|
+
Todos
|
3
|
+
|
4
|
+
<:Body>
|
5
|
+
<h1>Todos Example</h1>
|
6
|
+
|
7
|
+
<div id="count">{{ completed }} of {{ _todos.size }}</div>
|
8
|
+
|
9
|
+
<table id="todos-table" class="table">
|
10
|
+
{{ _todos.each do |todo| }}
|
11
|
+
<tr>
|
12
|
+
<td><input type="checkbox" checked="{{ todo._completed }}"></td>
|
13
|
+
<td class="name {{ if todo._completed }}complete{{ end }}">{{todo._name}}</td>
|
14
|
+
<td><button e-click="remove_todo(todo)">X</button></td>
|
15
|
+
</tr>
|
16
|
+
{{ end }}
|
17
|
+
</table>
|
18
|
+
|
19
|
+
<form e-submit="add_todo" role="form">
|
20
|
+
<div class="form-group">
|
21
|
+
<label>Todo</label>
|
22
|
+
<input class="form-control" id="newtodo" type="text" value="{{ page._new_todo }}" />
|
23
|
+
</div>
|
24
|
+
</form>
|
@@ -2,12 +2,12 @@ require 'spec_helper'
|
|
2
2
|
require 'volt/reactive/reactive_accessors'
|
3
3
|
|
4
4
|
class TestReactiveAccessors
|
5
|
-
include ReactiveAccessors
|
5
|
+
include Volt::ReactiveAccessors
|
6
6
|
|
7
7
|
reactive_accessor :_name
|
8
8
|
end
|
9
9
|
|
10
|
-
describe ReactiveAccessors do
|
10
|
+
describe Volt::ReactiveAccessors do
|
11
11
|
it "should assign a reactive value" do
|
12
12
|
inst = TestReactiveAccessors.new
|
13
13
|
|
@@ -30,11 +30,11 @@ describe ReactiveAccessors do
|
|
30
30
|
expect(values).to eq([nil])
|
31
31
|
|
32
32
|
inst._name = 'Ryan'
|
33
|
-
Computation.flush!
|
33
|
+
Volt::Computation.flush!
|
34
34
|
expect(values).to eq([nil,'Ryan'])
|
35
35
|
|
36
36
|
inst._name = 'Stout'
|
37
|
-
Computation.flush!
|
37
|
+
Volt::Computation.flush!
|
38
38
|
expect(values).to eq([nil,'Ryan','Stout'])
|
39
39
|
end
|
40
|
-
end
|
40
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'volt/extra_core/inflector'
|
3
3
|
|
4
|
-
describe Inflector do
|
4
|
+
describe Volt::Inflector do
|
5
5
|
it "should pluralize correctly" do
|
6
6
|
expect('car'.pluralize).to eq('cars')
|
7
7
|
# expect('database'.pluralize).to eq('database')
|
8
8
|
end
|
9
|
-
end
|
9
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
if ENV['BROWSER'] == 'firefox'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe "todo example spec", :type => :feature do
|
5
|
+
before do
|
6
|
+
visit '/'
|
7
|
+
|
8
|
+
click_link 'Todos'
|
9
|
+
|
10
|
+
|
11
|
+
fill_in('newtodo', :with => "Item 1\n")
|
12
|
+
fill_in('newtodo', :with => "Item 2\n")
|
13
|
+
fill_in('newtodo', :with => "Item 3\n")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should add items to the list" do
|
17
|
+
expect(find('#todos-table')).to have_content('Item 1')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should strikethrough when the checkbox is checked' do
|
21
|
+
box = all(:css, "#todos-table input[type=checkbox]")[0]
|
22
|
+
|
23
|
+
expect(find('#todos-table')).to_not have_css('td.name.complete')
|
24
|
+
|
25
|
+
box.set(true)
|
26
|
+
expect(find('#todos-table')).to have_css('td.name.complete')
|
27
|
+
|
28
|
+
box.set(false)
|
29
|
+
expect(find('#todos-table')).to_not have_css('td.name.complete')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should delete items' do
|
33
|
+
expect(find('#todos-table')).to have_content('Item 1')
|
34
|
+
expect(find('#todos-table')).to have_content('Item 2')
|
35
|
+
expect(find('#todos-table')).to have_content('Item 3')
|
36
|
+
|
37
|
+
# Click the middle one
|
38
|
+
all(:css, "#todos-table button")[1].click
|
39
|
+
|
40
|
+
expect(find('#todos-table')).to have_content('Item 1')
|
41
|
+
expect(find('#todos-table')).to_not have_content('Item 2')
|
42
|
+
expect(find('#todos-table')).to have_content('Item 3')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should track the number of todos and the numbers that are complete' do
|
46
|
+
count = find('#count')
|
47
|
+
|
48
|
+
expect(count).to have_content('0 of 3')
|
49
|
+
|
50
|
+
box1 = all(:css, "#todos-table input[type=checkbox]")[0]
|
51
|
+
box1.set(true)
|
52
|
+
|
53
|
+
expect(count).to have_content('1 of 3')
|
54
|
+
|
55
|
+
all(:css, "#todos-table button")[0].click
|
56
|
+
expect(count).to have_content('0 of 2')
|
57
|
+
|
58
|
+
box1 = all(:css, "#todos-table input[type=checkbox]")[0]
|
59
|
+
box1.set(true)
|
60
|
+
expect(count).to have_content('1 of 2')
|
61
|
+
|
62
|
+
box2 = all(:css, "#todos-table input[type=checkbox]")[1]
|
63
|
+
box2.set(true)
|
64
|
+
|
65
|
+
expect(count).to have_content('2 of 2')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|