volt 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -2
- data/Readme.md +97 -56
- data/VERSION +1 -1
- data/app/volt/assets/js/sockjs-0.3.4.min.js +27 -0
- data/app/volt/assets/js/vertxbus.js +216 -0
- data/app/volt/tasks/live_query/live_query.rb +5 -5
- data/app/volt/tasks/live_query/live_query_pool.rb +1 -1
- data/app/volt/tasks/query_tasks.rb +5 -0
- data/app/volt/tasks/store_tasks.rb +44 -18
- data/docs/WHY.md +10 -0
- data/lib/volt/cli.rb +18 -7
- data/lib/volt/controllers/model_controller.rb +30 -8
- data/lib/volt/extra_core/inflections.rb +63 -0
- data/lib/volt/extra_core/inflector/inflections.rb +203 -0
- data/lib/volt/extra_core/inflector/methods.rb +63 -0
- data/lib/volt/extra_core/inflector.rb +4 -0
- data/lib/volt/extra_core/object.rb +9 -0
- data/lib/volt/extra_core/string.rb +10 -14
- data/lib/volt/models/array_model.rb +45 -27
- data/lib/volt/models/cursor.rb +6 -0
- data/lib/volt/models/model.rb +127 -12
- data/lib/volt/models/model_hash_behaviour.rb +8 -5
- data/lib/volt/models/model_helpers.rb +4 -4
- data/lib/volt/models/model_state.rb +22 -0
- data/lib/volt/models/persistors/array_store.rb +49 -35
- data/lib/volt/models/persistors/base.rb +3 -3
- data/lib/volt/models/persistors/model_store.rb +17 -6
- data/lib/volt/models/persistors/query/query_listener.rb +0 -2
- data/lib/volt/models/persistors/store.rb +0 -4
- data/lib/volt/models/persistors/store_state.rb +27 -0
- data/lib/volt/models/url.rb +2 -2
- data/lib/volt/models/validations/errors.rb +0 -0
- data/lib/volt/models/validations/length.rb +13 -0
- data/lib/volt/models/validations/validations.rb +82 -0
- data/lib/volt/models.rb +1 -1
- data/lib/volt/page/bindings/attribute_binding.rb +29 -14
- data/lib/volt/page/bindings/base_binding.rb +2 -2
- data/lib/volt/page/bindings/component_binding.rb +29 -25
- data/lib/volt/page/bindings/content_binding.rb +1 -0
- data/lib/volt/page/bindings/each_binding.rb +25 -33
- data/lib/volt/page/bindings/event_binding.rb +0 -1
- data/lib/volt/page/bindings/if_binding.rb +3 -1
- data/lib/volt/page/bindings/template_binding.rb +61 -28
- data/lib/volt/page/document_events.rb +3 -1
- data/lib/volt/page/draw_cycle.rb +22 -0
- data/lib/volt/page/page.rb +10 -1
- data/lib/volt/page/reactive_template.rb +23 -16
- data/lib/volt/page/sub_context.rb +1 -1
- data/lib/volt/page/targets/attribute_section.rb +3 -2
- data/lib/volt/page/targets/attribute_target.rb +0 -4
- data/lib/volt/page/targets/base_section.rb +25 -0
- data/lib/volt/page/targets/binding_document/component_node.rb +13 -14
- data/lib/volt/page/targets/binding_document/html_node.rb +4 -0
- data/lib/volt/page/targets/dom_section.rb +16 -67
- data/lib/volt/page/targets/dom_template.rb +99 -0
- data/lib/volt/page/targets/helpers/comment_searchers.rb +29 -0
- data/lib/volt/page/template_renderer.rb +2 -14
- data/lib/volt/reactive/array_extensions.rb +0 -1
- data/lib/volt/reactive/event_chain.rb +9 -2
- data/lib/volt/reactive/events.rb +44 -37
- data/lib/volt/reactive/object_tracking.rb +1 -1
- data/lib/volt/reactive/reactive_array.rb +18 -0
- data/lib/volt/reactive/reactive_count.rb +108 -0
- data/lib/volt/reactive/reactive_generator.rb +44 -0
- data/lib/volt/reactive/reactive_value.rb +73 -73
- data/lib/volt/reactive/string_extensions.rb +1 -1
- data/lib/volt/router/routes.rb +205 -88
- data/lib/volt/server/component_handler.rb +3 -1
- data/lib/volt/server/html_parser/view_parser.rb +20 -4
- data/lib/volt/server/rack/component_paths.rb +13 -10
- data/lib/volt/server/rack/index_files.rb +4 -4
- data/lib/volt/server/socket_connection_handler.rb +5 -1
- data/lib/volt/server.rb +10 -3
- data/spec/apps/kitchen_sink/.gitignore +8 -0
- data/spec/apps/kitchen_sink/Gemfile +32 -0
- data/spec/apps/kitchen_sink/app/home/views/index/index.html +3 -5
- data/spec/apps/kitchen_sink/config.ru +4 -0
- data/spec/apps/kitchen_sink/public/index.html +2 -2
- data/spec/extra_core/inflector_spec.rb +8 -0
- data/spec/models/event_chain_spec.rb +18 -0
- data/spec/models/model_buffers_spec.rb +9 -0
- data/spec/models/model_spec.rb +22 -9
- data/spec/models/reactive_array_spec.rb +26 -1
- data/spec/models/reactive_call_times_spec.rb +28 -0
- data/spec/models/reactive_value_spec.rb +19 -0
- data/spec/models/validations_spec.rb +39 -0
- data/spec/page/bindings/content_binding_spec.rb +1 -0
- data/spec/{templates → page/bindings}/template_binding_spec.rb +54 -0
- data/spec/router/routes_spec.rb +156 -8
- data/spec/server/html_parser/sandlebars_parser_spec.rb +55 -47
- data/spec/server/html_parser/view_parser_spec.rb +3 -0
- data/spec/server/rack/asset_files_spec.rb +1 -1
- data/spec/spec_helper.rb +25 -11
- data/spec/templates/targets/binding_document/component_node_spec.rb +12 -0
- data/templates/project/Gemfile.tt +11 -0
- data/templates/project/app/home/config/routes.rb +1 -1
- data/templates/project/app/home/controllers/index_controller.rb +5 -5
- data/templates/project/app/home/views/index/index.html +6 -6
- data/volt.gemspec +5 -6
- metadata +34 -76
- data/app/volt/assets/js/sockjs-0.2.1.min.js +0 -27
- data/lib/volt/reactive/object_tracker.rb +0 -107
data/spec/router/routes_spec.rb
CHANGED
@@ -7,18 +7,166 @@ def routes(&block)
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe Routes do
|
10
|
+
it "should setup direct routes" do
|
11
|
+
routes do
|
12
|
+
get '/', _view: 'index'
|
13
|
+
get '/page1', _view: 'first_page'
|
14
|
+
end
|
15
|
+
|
16
|
+
direct_routes = @routes.instance_variable_get(:@direct_routes)
|
17
|
+
expect(direct_routes).to eq({"/" => {:_view => "index"}, "/page1" => {:_view => "first_page"}})
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should setup indiect routes" do
|
21
|
+
routes do
|
22
|
+
get '/blog/{_id}/edit', _view: 'blog/edit'
|
23
|
+
get '/blog/{_id}', _view: 'blog/show'
|
24
|
+
end
|
25
|
+
|
26
|
+
indirect_routes = @routes.instance_variable_get(:@indirect_routes)
|
27
|
+
expect(indirect_routes).to eq(
|
28
|
+
{
|
29
|
+
"blog" => {
|
30
|
+
"*" => {
|
31
|
+
"edit" => {
|
32
|
+
nil => {:_view => "blog/edit", :_id => 1}
|
33
|
+
},
|
34
|
+
nil => {:_view => "blog/show", :_id => 1}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
10
41
|
it "should match routes" do
|
11
|
-
|
12
|
-
|
13
|
-
|
42
|
+
routes do
|
43
|
+
get "/blog", _view: 'blog'
|
44
|
+
get '/blog/{_id}', _view: 'blog/show'
|
45
|
+
get '/blog/{_id}/draft', _view: 'blog/draft', _action: 'draft'
|
46
|
+
get '/blog/{_id}/edit', _view: 'blog/edit'
|
47
|
+
get '/blog/tags/{_tag}', _view: 'blog/tag'
|
48
|
+
get '/login/{_name}/user/{_id}', _view: 'login', _action: 'user'
|
49
|
+
end
|
50
|
+
|
51
|
+
params = @routes.url_to_params('/blog')
|
52
|
+
expect(params).to eq({:_view => "blog"})
|
53
|
+
|
54
|
+
params = @routes.url_to_params('/blog/55/edit')
|
55
|
+
expect(params).to eq({:_view => "blog/edit", :_id => "55"})
|
56
|
+
|
57
|
+
params = @routes.url_to_params('/blog/55')
|
58
|
+
expect(params).to eq({:_view => "blog/show", :_id => "55"})
|
14
59
|
|
60
|
+
params = @routes.url_to_params('/blog/tags/good')
|
61
|
+
expect(params).to eq({:_view => "blog/tag", :_tag => "good"})
|
62
|
+
|
63
|
+
params = @routes.url_to_params('/blog/55/draft')
|
64
|
+
expect(params).to eq({:_view => "blog/draft", :_id => "55", :_action => "draft"})
|
65
|
+
|
66
|
+
params = @routes.url_to_params('/login/jim/user/10')
|
67
|
+
expect(params).to eq({:_view => "login", :_action => "user", :_name => "jim", :_id => "10"})
|
68
|
+
|
69
|
+
params = @routes.url_to_params('/login/cool')
|
70
|
+
expect(params).to eq(false)
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should setup param matchers" do
|
75
|
+
routes do
|
76
|
+
get "/blog", _view: 'blog'
|
77
|
+
get '/blog/{_id}', _view: 'blog/show'
|
78
|
+
get '/blog/{_id}/edit', _view: 'blog/edit'
|
79
|
+
get '/blog/tags/{_tag}', _view: 'blog/tag'
|
80
|
+
get '/login/{_name}/user/{_id}', _view: 'login', _action: 'user'
|
81
|
+
end
|
82
|
+
|
83
|
+
param_matches = @routes.instance_variable_get(:@param_matches)
|
84
|
+
expect(param_matches.map {|v| v[0] }).to eq([
|
85
|
+
{:_view => "blog"},
|
86
|
+
{:_view => "blog/show", :_id => nil},
|
87
|
+
{:_view => "blog/edit", :_id => nil},
|
88
|
+
{:_view => "blog/tag", :_tag => nil},
|
89
|
+
{:_view => "login", :_action => "user",:_name => nil, :_id => nil}
|
90
|
+
])
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should go from params to url" do
|
15
95
|
routes do
|
16
|
-
get
|
17
|
-
get '/blog',
|
96
|
+
get "/blog", _view: 'blog'
|
97
|
+
get '/blog/{_id}', _view: 'blog/show'
|
98
|
+
get '/blog/{_id}/edit', _view: 'blog/edit'
|
99
|
+
get '/blog/tags/{_tag}', _view: 'blog/tag'
|
100
|
+
get '/login/{_name}/user/{_id}', _view: 'login', _action: 'user'
|
18
101
|
end
|
19
102
|
|
20
|
-
|
21
|
-
expect(
|
22
|
-
expect(
|
103
|
+
url, params = @routes.params_to_url({_view: 'blog/show', _id: '55'})
|
104
|
+
expect(url).to eq('/blog/55')
|
105
|
+
expect(params).to eq({})
|
106
|
+
|
107
|
+
|
108
|
+
url, params = @routes.params_to_url({_view: 'blog/edit', _id: '100'})
|
109
|
+
expect(url).to eq('/blog/100/edit')
|
110
|
+
expect(params).to eq({})
|
111
|
+
|
112
|
+
url, params = @routes.params_to_url({_view: 'blog/edit', _id: '100', _other: 'should_pass'})
|
113
|
+
expect(url).to eq('/blog/100/edit')
|
114
|
+
expect(params).to eq({_other: 'should_pass'})
|
23
115
|
end
|
116
|
+
|
117
|
+
it "should test that params match a param matcher" do
|
118
|
+
routes = Routes.new
|
119
|
+
match, params = routes.send(:check_params_match, {_view: 'blog', _id: '55'}, {_view: 'blog', _id: nil})
|
120
|
+
expect(match).to eq(true)
|
121
|
+
expect(params).to eq({_id: '55'})
|
122
|
+
|
123
|
+
match, params = routes.send(:check_params_match, {_view: 'blog', _id: '55'}, {_view: 'blog', _id: '20'})
|
124
|
+
expect(match).to eq(false)
|
125
|
+
|
126
|
+
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
|
+
expect(match).to eq(true)
|
128
|
+
expect(params).to eq({_id: '55'})
|
129
|
+
|
130
|
+
# Check with an extra value _name._name
|
131
|
+
match, params = routes.send(:check_params_match, {_view: 'blog', _name: {_title: 'Mr', _name: 'Bob'}, _id: '55'}, {_view: 'blog', _id: nil, _name: {_title: 'Mr'}})
|
132
|
+
expect(match).to eq(true)
|
133
|
+
expect(params).to eq({_id: '55'})
|
134
|
+
|
135
|
+
match, params = routes.send(:check_params_match, {_view: 'blog', _name: {_title: 'Mr', _name: 'Bob'}, _id: '55'}, {_view: 'blog', _id: nil, _name: {_title: 'Phd'}})
|
136
|
+
expect(match).to eq(false)
|
137
|
+
|
138
|
+
# 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'}, {_view: 'blog', _id: '55'})
|
140
|
+
expect(match).to eq(true)
|
141
|
+
expect(params).to eq({_extra: 'some value'})
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
# it "should match routes" do
|
146
|
+
# params = Model.new({}, persistor: Persistors::Params)
|
147
|
+
# params._controller = 'blog'
|
148
|
+
# params._index = '5'
|
149
|
+
#
|
150
|
+
# routes do
|
151
|
+
# get '/', _controller: 'index'
|
152
|
+
# get '/blog', _controller: 'blog'
|
153
|
+
# end
|
154
|
+
#
|
155
|
+
# path, cleaned_params = @routes.params_to_url(params)
|
156
|
+
# expect(path).to eq('/blog')
|
157
|
+
# expect(cleaned_params).to eq({_index: '5'})
|
158
|
+
# end
|
159
|
+
#
|
160
|
+
# it "should handle routes with bindings in them" do
|
161
|
+
# params = Model.new({}, persistor: Persistors::Params)
|
162
|
+
#
|
163
|
+
# routes do
|
164
|
+
# get '/', _controller: 'index'
|
165
|
+
# get '/blog/{_id}', _controller: 'blog'
|
166
|
+
# end
|
167
|
+
#
|
168
|
+
# params = @routes.url_to_params('/blog/20')
|
169
|
+
# puts params.inspect
|
170
|
+
#
|
171
|
+
# end
|
24
172
|
end
|
@@ -1,25 +1,27 @@
|
|
1
|
+
if RUBY_PLATFORM == 'opal'
|
2
|
+
else
|
1
3
|
require 'benchmark'
|
2
4
|
require 'volt/server/html_parser/sandlebars_parser'
|
3
5
|
|
4
6
|
class HTMLHandler
|
5
7
|
attr_reader :html
|
6
|
-
|
8
|
+
|
7
9
|
def initialize
|
8
10
|
@html = ''
|
9
11
|
end
|
10
|
-
|
12
|
+
|
11
13
|
def comment(comment)
|
12
14
|
@html << "<!--#{comment}-->"
|
13
15
|
end
|
14
|
-
|
16
|
+
|
15
17
|
def text(text)
|
16
18
|
@html << text
|
17
19
|
end
|
18
|
-
|
20
|
+
|
19
21
|
def binding(binding)
|
20
22
|
@html << "{#{binding}}"
|
21
23
|
end
|
22
|
-
|
24
|
+
|
23
25
|
def start_tag(tag_name, attributes, unary)
|
24
26
|
attr_str = attributes.map {|v| "#{v[0]}=\"#{v[1]}\"" }.join(' ')
|
25
27
|
if attr_str.size > 0
|
@@ -28,7 +30,7 @@ class HTMLHandler
|
|
28
30
|
end
|
29
31
|
@html << "<#{tag_name}#{attr_str}#{unary ? ' /' : ''}>"
|
30
32
|
end
|
31
|
-
|
33
|
+
|
32
34
|
def end_tag(tag_name)
|
33
35
|
@html << "</#{tag_name}>"
|
34
36
|
end
|
@@ -37,14 +39,14 @@ end
|
|
37
39
|
def parse_url(url)
|
38
40
|
require 'open-uri'
|
39
41
|
html = open("http://#{url}").read
|
40
|
-
|
42
|
+
|
41
43
|
# html = File.read("/Users/ryanstout/Desktop/tests/#{url}1.html")
|
42
|
-
|
44
|
+
|
43
45
|
File.open("/Users/ryanstout/Desktop/tests/#{url}1.html", 'w') {|f| f.write(html) }
|
44
|
-
|
46
|
+
|
45
47
|
handler = HTMLHandler.new
|
46
48
|
SandlebarsParser.new(html, handler)
|
47
|
-
|
49
|
+
|
48
50
|
File.open("/Users/ryanstout/Desktop/tests/#{url}2.html", 'w') {|f| f.write(handler.html) }
|
49
51
|
end
|
50
52
|
|
@@ -52,141 +54,147 @@ describe SandlebarsParser do
|
|
52
54
|
def test_html(html, match=nil)
|
53
55
|
handler = HTMLHandler.new
|
54
56
|
parser = SandlebarsParser.new(html, handler)
|
55
|
-
|
57
|
+
|
56
58
|
expect(handler.html).to eq(match || html)
|
57
59
|
end
|
58
|
-
|
60
|
+
|
59
61
|
it "should handle a doctype" do
|
60
62
|
html = "<!DOCTYPE html><p>text</p>"
|
61
|
-
|
63
|
+
|
62
64
|
test_html(html)
|
63
65
|
end
|
64
|
-
|
66
|
+
|
65
67
|
it "should parse comments" do
|
66
68
|
html = "<!-- my comment -->"
|
67
69
|
test_html(html)
|
68
70
|
end
|
69
|
-
|
71
|
+
|
70
72
|
it "should handle text" do
|
71
73
|
html = "some text, <!-- a comment -->, some more text"
|
72
74
|
test_html(html)
|
73
75
|
end
|
74
|
-
|
76
|
+
|
75
77
|
it "should handle tags" do
|
76
78
|
html = "<a name=\"cool\"></a>"
|
77
79
|
test_html(html)
|
78
80
|
end
|
79
|
-
|
81
|
+
|
80
82
|
it "should close tags" do
|
81
83
|
html = "<div><p>test</p>"
|
82
84
|
match = "<div><p>test</p></div>"
|
83
|
-
|
85
|
+
|
84
86
|
test_html(html, match)
|
85
87
|
end
|
86
|
-
|
88
|
+
|
87
89
|
it "should handle a script tag with html in it" do
|
88
90
|
html = "<script><!-- some js code <a>cool</a> here --></script>"
|
89
91
|
match = "<script> some js code <a>cool</a> here </script>"
|
90
92
|
test_html(html, match)
|
91
93
|
end
|
92
|
-
|
94
|
+
|
93
95
|
it "should handle bindings" do
|
94
96
|
html = "<p>some cool {text} is {awesome}</p>"
|
95
97
|
test_html(html)
|
96
98
|
end
|
97
|
-
|
99
|
+
|
98
100
|
it "should handle bindings with nested { and }" do
|
99
101
|
html = "<p>testing with {nested { 'binding stuff' }}</p>"
|
100
102
|
test_html(html)
|
101
103
|
end
|
102
|
-
|
104
|
+
|
103
105
|
it "should raise an exception on an unclosed binding at the end of the document" do
|
104
106
|
html = "<p>testing with {nested"
|
105
|
-
|
107
|
+
|
106
108
|
handler = HTMLHandler.new
|
107
109
|
expect { SandlebarsParser.new(html, handler) }.to raise_error(HTMLParseError)
|
108
110
|
end
|
109
|
-
|
111
|
+
|
110
112
|
it "should raise an exception on an unclosed binding" do
|
111
113
|
html = "<p>testing with {nested </p>\n<p>ok</p>"
|
112
|
-
|
114
|
+
|
113
115
|
handler = HTMLHandler.new
|
114
|
-
expect { SandlebarsParser.new(html, handler) }.to raise_error(HTMLParseError)
|
116
|
+
expect { SandlebarsParser.new(html, handler) }.to raise_error(HTMLParseError)
|
115
117
|
end
|
116
|
-
|
118
|
+
|
117
119
|
it "should report the line number" do
|
118
120
|
html = "\n\n<p>some paragraph</p>\n\n<p>testing with {nested </p>\n<p>ok</p>"
|
119
|
-
|
121
|
+
|
120
122
|
handler = HTMLHandler.new
|
121
|
-
expect { SandlebarsParser.new(html, handler) }.to raise_error(HTMLParseError, "unclosed binding: {nested </p> on line: 5")
|
123
|
+
expect { SandlebarsParser.new(html, handler) }.to raise_error(HTMLParseError, "unclosed binding: {nested </p> on line: 5")
|
122
124
|
end
|
123
|
-
|
125
|
+
|
124
126
|
it "should handle a bunch of things" do
|
125
127
|
html = <<-END
|
126
128
|
<p class="some class">This is my text <a href="something.com">something.com</a></p>
|
127
129
|
END
|
128
|
-
|
130
|
+
|
129
131
|
test_html(html)
|
130
132
|
end
|
131
|
-
|
133
|
+
|
132
134
|
it "should not jump between script tags" do
|
133
135
|
html = "\n<script>some text</script>\n\n<script>inside 2</script>\n"
|
134
|
-
|
136
|
+
|
135
137
|
test_html(html)
|
136
138
|
end
|
137
|
-
|
139
|
+
|
138
140
|
it "should not jump bindings" do
|
139
141
|
html = "<p>{some} text {binding}</p>"
|
140
142
|
test_html(html)
|
141
143
|
end
|
142
|
-
|
144
|
+
|
143
145
|
it "should handle escaping things in a tripple escape" do
|
144
146
|
html = "this is my {{{ tripple escape }}}"
|
145
147
|
match = "this is my tripple escape "
|
146
|
-
test_html(html, match)
|
148
|
+
test_html(html, match)
|
147
149
|
end
|
148
|
-
|
150
|
+
|
149
151
|
it "should let you escape { and }" do
|
150
152
|
html = "should escape {{{{}}} and {{{}}}}"
|
151
153
|
match = "should escape { and }"
|
152
|
-
test_html(html, match)
|
154
|
+
test_html(html, match)
|
153
155
|
end
|
154
|
-
|
156
|
+
|
155
157
|
it "should handle sandlebar tags" do
|
156
158
|
html = "custom tag <:awesome name=\"yes\" />"
|
157
|
-
test_html(html)
|
159
|
+
test_html(html)
|
158
160
|
end
|
159
|
-
|
161
|
+
|
160
162
|
it "should keep the text after script" do
|
161
163
|
html = "<ul><li>\n\n<script>\n\nsome js code\n\nmore\n\n</script> \n </li> \n \n </ul>"
|
162
164
|
test_html(html)
|
163
165
|
end
|
164
|
-
|
166
|
+
|
165
167
|
it "should handle dashes in attributes" do
|
166
168
|
html = "<form accept-charset=\"UTF-8\"></form>"
|
167
169
|
test_html(html)
|
168
170
|
end
|
169
|
-
|
171
|
+
|
170
172
|
it "should handle conditional comments for IE" do
|
171
173
|
html = "<!--[if ie6]>some ie only stuff<![endif]-->\n<br />"
|
172
174
|
test_html(html)
|
173
175
|
end
|
174
|
-
|
176
|
+
|
175
177
|
it "should be fast" do
|
176
178
|
html = File.read(File.join(File.dirname(__FILE__), 'sample_page.html'))
|
177
179
|
handler = HTMLHandler.new
|
178
180
|
time = Benchmark.measure do
|
179
181
|
SandlebarsParser.new(html, handler)
|
180
182
|
end
|
181
|
-
|
183
|
+
|
182
184
|
# Less than 100ms
|
183
185
|
expect(time.total).to be < 0.1
|
184
186
|
end
|
185
|
-
|
187
|
+
|
188
|
+
it "should parse nested components" do
|
189
|
+
html = "custom tag <:awesome:cool name=\"yes\" />"
|
190
|
+
test_html(html)
|
191
|
+
end
|
192
|
+
|
186
193
|
# it "should warn you when you over close tags" do
|
187
194
|
# html = "<div><p>test</p></div></div>"
|
188
|
-
#
|
195
|
+
#
|
189
196
|
# handler = HTMLHandler.new
|
190
197
|
# expect { SandlebarsParser.new(html, handler) }.to raise_error(HTMLParseError)
|
191
198
|
# end
|
199
|
+
end
|
192
200
|
end
|
@@ -19,7 +19,7 @@ if RUBY_PLATFORM != 'opal'
|
|
19
19
|
it "should list all JS files" do
|
20
20
|
main = AssetFiles.new("main", @component_paths)
|
21
21
|
|
22
|
-
expect(main.javascript_files(nil)).to eq(["/assets/js/jquery-2.0.3.js", "/assets/js/sockjs-0.
|
22
|
+
expect(main.javascript_files(nil)).to eq(["/assets/js/jquery-2.0.3.js", "/assets/js/sockjs-0.3.4.min.js", "/assets/js/vertxbus.js", "/assets/js/bootstrap.js", "/assets/js/test2.js", "/assets/js/test3.js", "/assets/js/test1.js", "/assets/volt/page/page.js", "/components/home.js"])
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,16 +5,20 @@
|
|
5
5
|
#
|
6
6
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
7
|
|
8
|
+
ENV['SERVER'] = 'true'
|
8
9
|
ENV['SAUCE_USERNAME'] = 'ryanstout'
|
9
10
|
ENV['SAUCE_ACCESS_KEY'] = 'a537b01d-33ed-4028-9e80-eeb602748a5f'
|
10
11
|
|
11
12
|
if ENV['IN_BROWSER']
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
if RUBY_PLATFORM == 'opal'
|
14
|
+
else
|
15
|
+
require 'capybara/rspec'
|
16
|
+
# Needed at the moment to get chrome tests working
|
17
|
+
require 'chromedriver2/helper'
|
18
|
+
require 'capybara/poltergeist'
|
19
|
+
# require "sauce/capybara"
|
20
|
+
# require 'sauce/connect'
|
21
|
+
end
|
18
22
|
end
|
19
23
|
|
20
24
|
require 'volt'
|
@@ -36,15 +40,25 @@ require 'volt'
|
|
36
40
|
# Capybara::Selenium::Driver.new(app, :browser => :chrome)
|
37
41
|
# end
|
38
42
|
|
39
|
-
# Capybara.default_driver = :selenium
|
40
43
|
if ENV['IN_BROWSER']
|
41
|
-
|
44
|
+
if RUBY_PLATFORM == 'opal'
|
45
|
+
else
|
46
|
+
require 'volt/server'
|
47
|
+
|
42
48
|
|
49
|
+
kitchen_sink_path = File.expand_path(File.join(File.dirname(__FILE__), "apps/kitchen_sink"))
|
50
|
+
Capybara.app = Server.new(kitchen_sink_path).app
|
43
51
|
|
44
|
-
|
45
|
-
Capybara.app = Server.new(kitchen_sink_path).app
|
52
|
+
Capybara.default_driver = :poltergeist
|
46
53
|
|
47
|
-
|
54
|
+
# Capybara.register_driver :chrome do |app|
|
55
|
+
# Capybara::Selenium::Driver.new(app, :browser => :chrome)
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# Capybara.default_driver = :chrome
|
59
|
+
|
60
|
+
# Capybara.default_driver = :selenium
|
61
|
+
end
|
48
62
|
end
|
49
63
|
|
50
64
|
|
@@ -15,4 +15,16 @@ describe ComponentNode do
|
|
15
15
|
expect(@component.find_by_binding_id(0).to_html).to eq('Before Inside After')
|
16
16
|
|
17
17
|
end
|
18
|
+
|
19
|
+
# it "should render if blocks" do
|
20
|
+
# view = <<-END
|
21
|
+
# {#if _show}show{/} title
|
22
|
+
# END
|
23
|
+
#
|
24
|
+
# page = Page.new
|
25
|
+
#
|
26
|
+
# template = ViewParser.new(view, 'home/index/index/title')
|
27
|
+
#
|
28
|
+
# page.add_template
|
29
|
+
# end
|
18
30
|
end
|
@@ -12,6 +12,17 @@ gem 'volt-bootstrap'
|
|
12
12
|
gem 'volt-bootstrap-jumbotron-theme'
|
13
13
|
|
14
14
|
|
15
|
+
# Server for MRI
|
16
|
+
platform :mri do
|
17
|
+
gem 'thin', '~> 1.6.0'
|
18
|
+
gem 'bson_ext', '~> 1.9.0'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Server for jruby
|
22
|
+
platform :jruby do
|
23
|
+
gem 'jubilee'
|
24
|
+
end
|
25
|
+
|
15
26
|
|
16
27
|
#---------------------
|
17
28
|
# Needed at the moment
|
@@ -1,19 +1,19 @@
|
|
1
1
|
<:Title>
|
2
|
-
{#template params.
|
2
|
+
{#template params._controller.or('home') + '/' + params._action.or(''), "title"}
|
3
3
|
|
4
4
|
<:Body>
|
5
5
|
<div class="container">
|
6
6
|
<div class="header">
|
7
7
|
<ul class="nav nav-pills pull-right">
|
8
|
-
<:nav
|
9
|
-
<:nav
|
8
|
+
<:nav controller="" text="Home" />
|
9
|
+
<:nav controller="about" text="About" />
|
10
10
|
</ul>
|
11
11
|
<h3 class="text-muted">Project name</h3>
|
12
12
|
</div>
|
13
13
|
|
14
14
|
<:volt:notices />
|
15
15
|
|
16
|
-
{#template params.
|
16
|
+
{#template params._controller.or('home') + '/' + params._action.or('')}
|
17
17
|
|
18
18
|
<div class="footer">
|
19
19
|
<p>© Company 2014</p>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
|
25
25
|
<:Nav>
|
26
|
-
<li class="{#if params.
|
27
|
-
<a href="/{
|
26
|
+
<li class="{#if params._controller.or('') == @controller}active{/}">
|
27
|
+
<a href="/{@controller}">{@text}</a>
|
28
28
|
</li>
|
29
29
|
|
data/volt.gemspec
CHANGED
@@ -22,19 +22,18 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency "thor", "~> 0.18.0"
|
23
23
|
spec.add_dependency "pry", "~> 0.9.12.0"
|
24
24
|
spec.add_dependency "rspec", "3.0.0.beta1"
|
25
|
-
spec.add_dependency "nokogiri", "~> 1.6.0"
|
26
25
|
spec.add_dependency "rack", "~> 1.5.0"
|
27
26
|
spec.add_dependency "sprockets-sass", "~> 1.0.0"
|
28
27
|
spec.add_dependency "sass", "~> 3.2.5"
|
29
28
|
spec.add_dependency "mongo", "~> 1.9.0"
|
30
|
-
spec.add_dependency "bson_ext", "~> 1.9.0"
|
31
|
-
spec.add_dependency "thin", "~> 1.6.0"
|
32
|
-
spec.add_dependency "multi_json", "~> 1.8.2"
|
33
|
-
spec.add_dependency "oj", "~> 2.5.0"
|
29
|
+
# spec.add_dependency "bson_ext", "~> 1.9.0"
|
30
|
+
# spec.add_dependency "thin", "~> 1.6.0"
|
34
31
|
spec.add_dependency "rake", "~> 10.0.4"
|
35
32
|
spec.add_dependency "listen", "~> 2.4.0"
|
36
33
|
spec.add_dependency "uglifier", "~> 2.4.0"
|
37
34
|
spec.add_dependency "yui-compressor", "~> 0.12.0"
|
35
|
+
# spec.add_dependency "promise.rb", "~> 0.6.1"
|
36
|
+
|
38
37
|
# spec.add_dependency "rack-colorized_logger", "~> 1.0.4"
|
39
38
|
|
40
39
|
|
@@ -49,5 +48,5 @@ Gem::Specification.new do |spec|
|
|
49
48
|
spec.add_development_dependency "poltergeist", "~> 1.5.0"
|
50
49
|
spec.add_development_dependency "sauce", "~> 3.3.0"
|
51
50
|
spec.add_development_dependency "sauce-connect", "~> 3.3.0"
|
52
|
-
|
51
|
+
|
53
52
|
end
|