volt 0.9.1.pre4 → 0.9.1.pre5

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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/CONTRIBUTING.md +1 -1
  4. data/README.md +1 -0
  5. data/app/volt/tasks/query_tasks.rb +4 -3
  6. data/app/volt/tasks/store_tasks.rb +1 -1
  7. data/lib/volt/boot.rb +8 -7
  8. data/lib/volt/cli/asset_compile.rb +1 -1
  9. data/lib/volt/cli/console.rb +14 -3
  10. data/lib/volt/cli/new_gem.rb +3 -3
  11. data/lib/volt/cli.rb +3 -3
  12. data/lib/volt/config.rb +7 -1
  13. data/lib/volt/data_stores/base.rb +7 -0
  14. data/lib/volt/data_stores/data_store.rb +10 -3
  15. data/lib/volt/data_stores/mongo_driver.rb +58 -7
  16. data/lib/volt/models/associations.rb +2 -2
  17. data/lib/volt/models/persistors/array_store.rb +24 -6
  18. data/lib/volt/models/persistors/base.rb +4 -0
  19. data/lib/volt/models/persistors/model_store.rb +4 -15
  20. data/lib/volt/page/bindings/attribute_binding.rb +17 -15
  21. data/lib/volt/page/bindings/each_binding.rb +14 -17
  22. data/lib/volt/page/bindings/view_binding/controller_handler.rb +24 -0
  23. data/lib/volt/page/bindings/view_binding.rb +10 -30
  24. data/lib/volt/page/document_events.rb +7 -4
  25. data/lib/volt/page/page.rb +19 -13
  26. data/lib/volt/page/path_string_renderer.rb +41 -0
  27. data/lib/volt/page/targets/dom_section.rb +5 -2
  28. data/lib/volt/reactive/computation.rb +3 -1
  29. data/lib/volt/reactive/reactive_accessors.rb +8 -7
  30. data/lib/volt/reactive/reactive_array.rb +2 -0
  31. data/lib/volt/server/component_handler.rb +3 -3
  32. data/lib/volt/server/component_templates.rb +32 -6
  33. data/lib/volt/server/forking_server.rb +4 -2
  34. data/lib/volt/server/rack/asset_files.rb +5 -1
  35. data/lib/volt/server/rack/component_paths.rb +6 -4
  36. data/lib/volt/server/rack/opal_files.rb +16 -11
  37. data/lib/volt/server/rack/quiet_common_logger.rb +1 -1
  38. data/lib/volt/server.rb +1 -1
  39. data/lib/volt/spec/setup.rb +1 -1
  40. data/lib/volt/version.rb +5 -0
  41. data/lib/volt/volt/app.rb +12 -2
  42. data/spec/apps/kitchen_sink/app/main/views/mailers/welcome.email +12 -0
  43. data/spec/integration/http_endpoints_spec.rb +1 -3
  44. data/spec/integration/user_spec.rb +0 -10
  45. data/spec/models/associations_spec.rb +0 -3
  46. data/spec/models/model_spec.rb +13 -0
  47. data/spec/models/persistors/flash_spec.rb +45 -0
  48. data/spec/models/validators/phone_number_validator_spec.rb +2 -2
  49. data/spec/page/bindings/template_binding/view_lookup_for_path_spec.rb +0 -5
  50. data/spec/page/path_string_renderer_spec.rb +23 -0
  51. data/spec/page/sub_context_spec.rb +1 -0
  52. data/spec/router/routes_spec.rb +24 -5
  53. data/spec/server/html_parser/view_handler_spec.rb +20 -0
  54. data/spec/server/rack/quite_common_logger_spec.rb +3 -3
  55. data/spec/spec_helper.rb +0 -4
  56. data/spec/tasks/query_tracker_spec.rb +30 -0
  57. data/templates/newgem/lib/newgem/version.rb.tt +7 -0
  58. data/templates/newgem/newgem.gemspec.tt +2 -4
  59. data/templates/project/Gemfile.tt +5 -2
  60. data/templates/project/config/app.rb.tt +49 -1
  61. data/volt.gemspec +12 -10
  62. metadata +24 -28
  63. data/VERSION +0 -1
  64. data/app/volt/tasks/live_query/data_store.rb +0 -33
  65. data/templates/newgem/VERSION +0 -1
@@ -98,6 +98,7 @@ module Volt
98
98
  # Called when the next template is ready to render
99
99
  def render_next_template(full_path, path)
100
100
  begin
101
+ # stop_waiting_for_load
101
102
  remove_current_controller_and_template
102
103
 
103
104
  # Switch the current template
@@ -107,7 +108,6 @@ module Volt
107
108
  # Also track the current controller directly
108
109
  @controller = @current_controller_handler.controller if full_path
109
110
 
110
- @waiting_for_load = nil
111
111
  render_template(full_path || path)
112
112
  rescue => e
113
113
  Volt.logger.error("Error during render of template at #{path}: #{e.inspect}")
@@ -115,6 +115,13 @@ module Volt
115
115
  end
116
116
  end
117
117
 
118
+ def stop_waiting_for_load
119
+ if @waiting_for_load
120
+ @waiting_for_load.stop
121
+ @waiting_for_load = nil
122
+ end
123
+ end
124
+
118
125
  # On the next tick, we clear the grouped controller so that any changes to template paths
119
126
  # will create a new controller and trigger the action.
120
127
  def queue_clear_grouped_controller
@@ -164,9 +171,7 @@ module Volt
164
171
  def remove_starting_controller
165
172
  # Clear any previously running wait for loads. This is for when the path changes
166
173
  # before the view actually renders.
167
- if @waiting_for_load
168
- @waiting_for_load.stop
169
- end
174
+ stop_waiting_for_load
170
175
 
171
176
  if @starting_controller_handler
172
177
  # Only call the after_..._removed because the dom never loaded.
@@ -181,8 +186,7 @@ module Volt
181
186
  args = [SubContext.new(@arguments, nil, true)]
182
187
 
183
188
  # get the controller class and action
184
- controller_class, action = get_controller(controller_path)
185
- controller_class ||= ModelController
189
+ controller_class, action = ControllerHandler.get_controller_and_action(controller_path)
186
190
 
187
191
  generated_new = false
188
192
  new_controller = Proc.new do
@@ -255,29 +259,5 @@ module Volt
255
259
 
256
260
  super
257
261
  end
258
-
259
- private
260
- # Fetch the controller class
261
- def get_controller(controller_path)
262
- raise "Invalid controller path: #{controller_path.inspect}" unless controller_path && controller_path.size > 0
263
-
264
- action = controller_path[-1]
265
-
266
- # Get the constant parts
267
- parts = controller_path[0..-2].map { |v| v.tr('-', '_').camelize }
268
-
269
- # Do const lookups starting at object and working our way down.
270
- # So Volt::ProgressBar would lookup Volt, then ProgressBar on Volt.
271
- obj = Object
272
- parts.each do |part|
273
- if obj.const_defined?(part)
274
- obj = obj.const_get(part)
275
- else
276
- return nil
277
- end
278
- end
279
-
280
- [obj, action]
281
- end
282
262
  end
283
263
  end
@@ -27,7 +27,7 @@ module Volt
27
27
  end
28
28
 
29
29
  def handle(event_name, event, target)
30
- element = Element.find(target)
30
+ element = `$(#{target})`
31
31
 
32
32
  loop do
33
33
  # Lookup the handler, make sure to not assume the group
@@ -35,7 +35,10 @@ module Volt
35
35
  # TODO: Sometimes the event doesn't exist, but we still get
36
36
  # an event.
37
37
  handlers = @events[event_name]
38
- handlers = handlers[element.id] if handlers
38
+
39
+ element_id = `(element && element[0] && element[0].id) || ''`
40
+
41
+ handlers = handlers[element_id] if handlers
39
42
 
40
43
  if handlers
41
44
  handlers.values.each do |handler|
@@ -44,10 +47,10 @@ module Volt
44
47
  end
45
48
  end
46
49
 
47
- if element.size == 0
50
+ if `element.length` == 0
48
51
  break
49
52
  else
50
- element = element.parent
53
+ `element = element.parent()`
51
54
  end
52
55
  end
53
56
 
@@ -1,7 +1,4 @@
1
1
  require 'opal'
2
- if RUBY_PLATFORM == 'opal'
3
- require 'opal-jquery'
4
- end
5
2
  require 'volt/models'
6
3
  require 'volt/controllers/model_controller'
7
4
  require 'volt/tasks/task_handler'
@@ -33,7 +30,7 @@ require 'volt/page/tasks'
33
30
 
34
31
  module Volt
35
32
  class Page
36
- attr_reader :url, :params, :page, :templates, :routes, :events
33
+ attr_reader :url, :params, :page, :routes, :events
37
34
 
38
35
  def initialize
39
36
  # Run the code to setup the page
@@ -42,6 +39,7 @@ module Volt
42
39
  @url = URL.new
43
40
  @params = @url.params
44
41
  @url_tracker = UrlTracker.new(self)
42
+ @templates = {}
45
43
 
46
44
  @events = DocumentEvents.new
47
45
 
@@ -140,8 +138,6 @@ module Volt
140
138
  attr_reader :events
141
139
 
142
140
  def add_template(name, template, bindings)
143
- @templates ||= {}
144
-
145
141
  # First template gets priority. The backend will load templates in order so
146
142
  # that local templates come in before gems (so they can be overridden).
147
143
  #
@@ -153,6 +149,22 @@ module Volt
153
149
  end
154
150
  end
155
151
 
152
+ # On the server, we can delay loading the views until they are actually requeted. This
153
+ # sets up an instance variable to call to load.
154
+ def template_loader=(callback)
155
+ @template_loader = callback
156
+ end
157
+
158
+ def templates
159
+ if @template_loader
160
+ # Load the templates
161
+ @template_loader.call
162
+ @template_loader = nil
163
+ end
164
+
165
+ @templates
166
+ end
167
+
156
168
  def add_routes(&block)
157
169
  @routes ||= Routes.new
158
170
  @routes.define(&block)
@@ -161,7 +173,7 @@ module Volt
161
173
 
162
174
  def start
163
175
  # Setup to render template
164
- Element.find('body').html = '<!-- $CONTENT --><!-- $/CONTENT -->'
176
+ `$('body').html('<!-- $CONTENT --><!-- $/CONTENT -->');`
165
177
 
166
178
  load_stored_page
167
179
 
@@ -208,12 +220,6 @@ module Volt
208
220
  if Volt.client?
209
221
  $page = Page.new
210
222
 
211
- # Call start once the page is loaded
212
- # Document.ready? do
213
- # $page.start
214
- # end
215
-
216
- # For some reason Document.ready? (using opal-jquery) quit working.
217
223
  `$(document).ready(function() {`
218
224
  $page.start
219
225
  `});`
@@ -0,0 +1,41 @@
1
+ # The PathRenderer is a simple way to render a string of the contents of a view
2
+ # at the passed in path.
3
+
4
+ require 'volt/page/bindings/view_binding/view_lookup_for_path'
5
+ require 'volt/page/bindings/view_binding/controller_handler'
6
+ require 'volt/page/string_template_renderer'
7
+
8
+ module Volt
9
+ class ViewLookupException < Exception ; end
10
+ class PathStringRenderer
11
+ attr_reader :html
12
+ def initialize(path, attrs=nil, page=nil, render_from_path=nil)
13
+ # use the global page if one is not passed in
14
+ page ||= $page
15
+
16
+ # where to do the path lookup from
17
+ render_from_path ||= "main/main/main/body"
18
+
19
+ # Make path into a full path
20
+ @view_lookup = Volt::ViewLookupForPath.new(page, render_from_path)
21
+ full_path, controller_path = @view_lookup.path_for_template(path, nil)
22
+
23
+ if full_path == nil
24
+ raise ViewLookupException, "Unable to find view at `#{path}`"
25
+ end
26
+
27
+ controller_class, action = ControllerHandler.get_controller_and_action(controller_path)
28
+
29
+ controller = controller_class.new#(SubContext.new(attrs, nil, true))
30
+ controller.model = SubContext.new(attrs, nil, true)
31
+
32
+ renderer = StringTemplateRenderer.new(page, controller, full_path)
33
+
34
+ @html = renderer.html
35
+
36
+ # remove when done
37
+ renderer.remove
38
+ end
39
+
40
+ end
41
+ end
@@ -41,12 +41,15 @@ module Volt
41
41
  end
42
42
 
43
43
  def insert_anchor_before_end(binding_name)
44
- Element.find(@end_node).before("<!-- $#{binding_name} --><!-- $/#{binding_name} -->")
44
+ binding_str = "<!-- $#{binding_name} --><!-- $/#{binding_name} -->"
45
+ `$(#{@end_node}).before(#{binding_str})`
45
46
  end
46
47
 
47
48
  def insert_anchor_before(binding_name, insert_after_binding)
48
49
  node = find_by_comment("$#{insert_after_binding}")
49
- Element.find(node).before("<!-- $#{binding_name} --><!-- $/#{binding_name} -->")
50
+
51
+ binding_str = "<!-- $#{binding_name} --><!-- $/#{binding_name} -->"
52
+ `$(#{node}).before(#{binding_str})`
50
53
  end
51
54
 
52
55
  # Takes in an array of dom nodes and replaces the current content
@@ -154,7 +154,9 @@ class Proc
154
154
  # Values match
155
155
 
156
156
  # call the block
157
- block.call
157
+ Volt::Computation.run_without_tracking do
158
+ block.call
159
+ end
158
160
 
159
161
  # stop the computation
160
162
  comp.stop
@@ -4,18 +4,13 @@ module Volt
4
4
  # Create a method to read a reactive value from an instance value. If it
5
5
  # is not setup, create it so it can be updated through the reactive value
6
6
  # at a later point.
7
- def __reactive_dependency_get(var_name)
8
- value_dep = instance_variable_get(:"@__#{var_name}_dependency")
9
- value_dep ||= instance_variable_set(:"@__#{var_name}_dependency", Dependency.new)
10
- end
11
-
12
7
  def reactive_reader(*names)
13
8
  names.each do |name|
14
9
  var_name = :"@#{name}"
15
10
  define_method(name.to_sym) do
16
11
  value = instance_variable_get(var_name)
17
12
 
18
- self.class.__reactive_dependency_get(name).depend
13
+ __reactive_dependency_get(name).depend
19
14
 
20
15
  value
21
16
  end
@@ -28,7 +23,7 @@ module Volt
28
23
  define_method("#{name}=") do |new_value|
29
24
  instance_variable_set(var_name, new_value)
30
25
 
31
- self.class.__reactive_dependency_get(name).changed!
26
+ __reactive_dependency_get(name).changed!
32
27
  end
33
28
  end
34
29
  end
@@ -42,5 +37,11 @@ module Volt
42
37
  def self.included(base)
43
38
  base.send :extend, ClassMethods
44
39
  end
40
+
41
+ def __reactive_dependency_get(var_name)
42
+ value_dep = instance_variable_get(:"@__#{var_name}_dependency")
43
+ value_dep ||= instance_variable_set(:"@__#{var_name}_dependency", Dependency.new)
44
+ end
45
+
45
46
  end
46
47
  end
@@ -181,6 +181,8 @@ module Volt
181
181
  end
182
182
  end
183
183
 
184
+ @persistor.clear if @persistor
185
+
184
186
  # clear the array
185
187
  @array = []
186
188
  end
@@ -18,13 +18,13 @@ module Volt
18
18
  # TODO: Sanatize template path
19
19
  component_name = path.gsub(/^\/components\//, '').gsub(/[.](js|map)$/, '')
20
20
 
21
- javascript_code = compile_for_component(component_name, request_source_map)
21
+ javascript_code = compile_for_component(component_name, true, request_source_map)
22
22
 
23
23
  [200, { 'Content-Type' => 'application/javascript; charset=utf-8' }, StringIO.new(javascript_code)]
24
24
  end
25
25
 
26
- def compile_for_component(component_name, map=false)
27
- code = ComponentCode.new(component_name, @component_paths).code
26
+ def compile_for_component(component_name, for_client, map=false)
27
+ code = ComponentCode.new(component_name, @component_paths, for_client).code
28
28
 
29
29
  # Compile the code
30
30
  # javascript_code = Opal.compile(code)
@@ -16,24 +16,33 @@ module Volt
16
16
  code = generate_routes_code + generate_view_code
17
17
  if @client
18
18
  # On the backend, we just need the views
19
- code << generate_controller_code + generate_model_code + generate_tasks_code
19
+ code << generate_controller_code + generate_model_code + generate_tasks_code + generate_initializers_code
20
20
  end
21
21
 
22
22
  code
23
23
  end
24
24
 
25
25
  def page_reference
26
- '$page'
26
+ if @client
27
+ '$page'
28
+ else
29
+ 'page'
30
+ end
27
31
  end
28
32
 
29
33
  def generate_view_code
30
34
  code = ''
31
35
  views_path = "#{@component_path}/views/"
32
36
 
37
+ exts = ['html']
38
+
39
+ # Only load email templates on the server
40
+ exts << 'email' unless @client
41
+
33
42
  # Load all templates in the folder
34
- Dir["#{views_path}*/*.html"].sort.each do |view_path|
43
+ Dir["#{views_path}*/*.{#{exts.join(',')}}"].sort.each do |view_path|
35
44
  # Get the path for the template, supports templates in folders
36
- template_path = view_path[views_path.size..((-1 * ('.html'.size + 1)))]
45
+ template_path = view_path[views_path.size..-1].gsub(/[.](#{exts.join('|')})$/, '')
37
46
  template_path = "#{@component_name}/#{template_path}"
38
47
 
39
48
  all_templates = ViewParser.new(File.read(view_path), template_path)
@@ -96,8 +105,25 @@ module Volt
96
105
 
97
106
  def generate_tasks_code
98
107
  Task.known_handlers.map do |handler|
99
- "class #{handler.name} < Volt::Task; end"
100
- end.join "\n"
108
+ # Split into modules and class
109
+ klass_parts = handler.name.split('::')
110
+
111
+ # Start with the inner class
112
+ parts = ["class #{klass_parts.pop} < Volt::Task; end"]
113
+
114
+ # Work backwards on the modules
115
+ klass_parts.reverse.each do |kpart|
116
+ parts.unshift("module #{kpart}")
117
+ parts.push("end")
118
+ end
119
+
120
+ # Combine the parts
121
+ parts.join("\n")
122
+ end.join "\n" # combine all into one string
123
+ end
124
+
125
+ def generate_initializers_code
126
+ "\nrequire_tree '#{@component_path}/config/initializers/'\n"
101
127
  end
102
128
  end
103
129
  end
@@ -63,7 +63,7 @@ module Volt
63
63
 
64
64
  # Set the drb object locally
65
65
  @dispatcher = Dispatcher.new
66
- drb_object = DRb.start_service(nil, [self, @dispatcher])
66
+ drb_object = DRb.start_service('drbunix:', [self, @dispatcher])
67
67
 
68
68
  @writer.puts(drb_object.uri)
69
69
 
@@ -122,7 +122,9 @@ module Volt
122
122
  if @exiting
123
123
  [500, {}, 'Server Exiting']
124
124
  else
125
- @server_proxy.call_on_child(env)
125
+ status, headers, body_str = @server_proxy.call_on_child(env)
126
+
127
+ [status, headers, StringIO.new(body_str)]
126
128
  end
127
129
  end
128
130
  end
@@ -8,7 +8,11 @@ module Volt
8
8
  @included_components = {}
9
9
  @components = []
10
10
 
11
- component('volt')
11
+ # Include each of the default included components
12
+ Volt.config.default_components.each do |def_comp_name|
13
+ component(def_comp_name)
14
+ end
15
+
12
16
  component(component_name)
13
17
  end
14
18
 
@@ -55,7 +55,7 @@ module Volt
55
55
  end
56
56
 
57
57
  # Makes each components classes available on the load path, require classes.
58
- def require_in_components
58
+ def require_in_components(page)
59
59
  if RUBY_PLATFORM == 'opal'
60
60
  else
61
61
  app_folders do |app_folder|
@@ -68,15 +68,16 @@ module Volt
68
68
  end
69
69
  end
70
70
 
71
- load_views_and_routes
71
+ # Delay the loading of views
72
+ page.template_loader = -> { load_views_and_routes(page) }
72
73
  end
73
74
  end
74
75
 
75
- def load_views_and_routes
76
+ def load_views_and_routes(page)
76
77
  component_names = []
77
78
  app_folders do |app_folder|
78
79
  Dir["#{app_folder}/*"].map { |cp| cp[/[^\/]+$/] }.each do |component_name|
79
- component_names << component_name if File.directory?(component_name)
80
+ component_names << component_name
80
81
  end
81
82
  end
82
83
 
@@ -84,6 +85,7 @@ module Volt
84
85
  # TODO: Nested components listed twice are are loaded multiple times
85
86
  component_names.uniq.each do |component_name|
86
87
  code = Volt::ComponentCode.new(component_name, self, false).code
88
+ # Evaluate returned code, the ```page``` variable is set for access.
87
89
  eval(code)
88
90
  end
89
91
  end
@@ -1,8 +1,11 @@
1
1
  require 'volt/server/rack/source_map_server'
2
- if Volt.env.production?
3
- # Compress assets in production
4
- require 'uglifier'
5
- end
2
+
3
+ # There is currently a weird issue with therubyracer
4
+ # https://github.com/rails/execjs/issues/15
5
+ # https://github.com/middleman/middleman/issues/1367
6
+ #
7
+ # To get around this, we just force Node for the time being
8
+ ENV['EXECJS_RUNTIME'] = 'Node'
6
9
 
7
10
  # Sets up the maps for the opal assets, and source maps if enabled.
8
11
  module Volt
@@ -43,10 +46,16 @@ module Volt
43
46
 
44
47
  environment.cache = Sprockets::Cache::FileStore.new('./tmp')
45
48
 
46
- if Volt.env.production?
47
- # Compress in production
49
+ # Compress in production
50
+ if Volt.config.compress_javascript
51
+ require 'uglifier'
48
52
  environment.js_compressor = Sprockets::UglifierCompressor
49
- environment.css_compressor = Sprockets::YUICompressor
53
+ end
54
+
55
+ if Volt.config.compress_css
56
+ require 'ruby-clean-css'
57
+ require 'ruby-clean-css/sprockets'
58
+ RubyCleanCSS::Sprockets.register(environment)
50
59
  end
51
60
 
52
61
  server.append_path(app_path)
@@ -61,10 +70,6 @@ module Volt
61
70
  server.append_path(path)
62
71
  end
63
72
 
64
- # opal-jquery gem
65
- spec = Gem::Specification.find_by_name('opal-jquery')
66
- server.append_path(spec.gem_dir + '/lib')
67
-
68
73
  builder.map '/assets' do
69
74
  run server
70
75
  end
@@ -5,7 +5,7 @@ class QuietCommonLogger < Rack::CommonLogger
5
5
  @@ignore_extensions = %w(png jpg jpeg ico gif woff tff svg eot css js)
6
6
 
7
7
  def call(env)
8
- path = env['REQUEST_PATH']
8
+ path = env['PATH_INFO']
9
9
  began_at = Time.now
10
10
  status, header, body = @app.call(env)
11
11
  header = Utils::HeaderHash.new(header)
data/lib/volt/server.rb CHANGED
@@ -35,7 +35,7 @@ module Rack
35
35
  def call(env)
36
36
  status, headers, body = @app.call(env)
37
37
 
38
- if status == 304 && env['HTTP_CONNECTION'].downcase == 'keep-alive'
38
+ if status == 304 && env['HTTP_CONNECTION'] && env['HTTP_CONNECTION'].downcase == 'keep-alive'
39
39
  headers['Connection'] = 'keep-alive'
40
40
  end
41
41
 
@@ -49,7 +49,7 @@ module Volt
49
49
  # Clear the database after each spec where we use store
50
50
  # @@db ||= Volt::DataStore.fetch
51
51
  # @@db.drop_database
52
- ::DataStore.new.drop_database
52
+ Volt::DataStore.fetch.drop_database
53
53
 
54
54
  $page.instance_variable_set('@store', nil)
55
55
  end
@@ -0,0 +1,5 @@
1
+ module Volt
2
+ module Version
3
+ STRING = '0.9.1.pre5'
4
+ end
5
+ end
data/lib/volt/volt/app.rb CHANGED
@@ -1,11 +1,21 @@
1
1
  module Volt
2
2
  class App
3
- attr_reader :component_paths, :router
3
+ attr_reader :component_paths, :router, :page
4
4
 
5
5
  def initialize(app_path)
6
6
  # Setup root path
7
7
  Volt.root = app_path
8
8
 
9
+ # Run the app config to load all users config files
10
+ unless RUBY_PLATFORM == 'opal'
11
+ if Volt.server?
12
+ @page = Page.new
13
+
14
+ # Setup a global for now
15
+ $page = @page unless defined?($page)
16
+ end
17
+ end
18
+
9
19
  # Require in app and initializers
10
20
  unless RUBY_PLATFORM == 'opal'
11
21
  Volt.run_app_and_initializers
@@ -13,7 +23,7 @@ module Volt
13
23
 
14
24
  # Load component paths
15
25
  @component_paths = ComponentPaths.new(app_path)
16
- @component_paths.require_in_components
26
+ @component_paths.require_in_components(@page || $page)
17
27
 
18
28
  unless RUBY_PLATFORM == 'opal'
19
29
  setup_router
@@ -0,0 +1,12 @@
1
+ <:Subject>
2
+ Welcome to the site!
3
+
4
+ <:Html>
5
+ <h1>Welcome {{ name }}</h1>
6
+
7
+ <p>Glad you signed up!</p>
8
+
9
+ <:Text>
10
+ Welcome
11
+
12
+ Glad you signed up!
@@ -7,11 +7,9 @@ describe 'http endpoints', type: :feature, sauce: true do
7
7
  end
8
8
 
9
9
  it 'should have access to the store' do
10
- DataStore.new.drop_database
11
- $page.store._simple_http_tests << { name: 'hello' }
10
+ store._simple_http_tests << { name: 'hello' }
12
11
  visit '/simple_http/store'
13
12
  expect(page).to have_content('You had me at hello')
14
- DataStore.new.drop_database
15
13
  end
16
14
 
17
15
  it 'should upload and store a file' do
@@ -1,16 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'user accounts', type: :feature, sauce: true do
4
- before(:each) do
5
- # Clear out db
6
- DataStore.new.drop_database
7
- end
8
-
9
- after(:each) do
10
- # Clear out db
11
- DataStore.new.drop_database
12
- end
13
-
14
4
  it 'should create an account' do
15
5
  visit '/'
16
6
 
@@ -11,9 +11,6 @@ end
11
11
  describe Volt::Associations do
12
12
  if RUBY_PLATFORM != 'opal'
13
13
  before do
14
- # DataStore.new.drop_database
15
- # $page.instance_variable_set('@store', nil)
16
-
17
14
  store._people! << {name: 'Jimmy'}
18
15
  @person = store._people[0]
19
16
  @person._addresses! << {city: 'Bozeman'}
@@ -540,5 +540,18 @@ describe Volt::Model do
540
540
 
541
541
  expect(count).to eq(1)
542
542
  end
543
+
544
+ it 'should query twice and return twice' do
545
+ store._items << {name: 'One'}
546
+ store._items << {name: 'Two'}
547
+
548
+ a = store._items.fetch.sync
549
+ b = store._items.fetch.sync
550
+
551
+ expect(a.size).to eq(2)
552
+ expect(b.size).to eq(2)
553
+
554
+ expect(a.to_a).to eq(b.to_a)
555
+ end
543
556
  end
544
557
  end