volt 0.6.5 → 0.7.0

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 (145) hide show
  1. checksums.yaml +4 -4
  2. data/Readme.md +47 -40
  3. data/VERSION +1 -1
  4. data/app/volt/controllers/notices_controller.rb +3 -3
  5. data/app/volt/tasks/live_query/data_store.rb +2 -2
  6. data/app/volt/tasks/live_query/live_query.rb +20 -20
  7. data/app/volt/tasks/live_query/live_query_pool.rb +6 -6
  8. data/app/volt/tasks/live_query/query_tracker.rb +15 -15
  9. data/app/volt/tasks/query_tasks.rb +13 -13
  10. data/app/volt/tasks/store_tasks.rb +7 -7
  11. data/app/volt/views/notices/index.html +17 -18
  12. data/lib/volt/assets/test.rb +2 -2
  13. data/lib/volt/benchmark/benchmark.rb +25 -23
  14. data/lib/volt/cli/asset_compile.rb +11 -0
  15. data/lib/volt/cli/new_gem.rb +16 -16
  16. data/lib/volt/cli.rb +14 -12
  17. data/lib/volt/console.rb +5 -6
  18. data/lib/volt/controllers/model_controller.rb +18 -18
  19. data/lib/volt/extra_core/array.rb +4 -4
  20. data/lib/volt/extra_core/hash.rb +3 -3
  21. data/lib/volt/extra_core/object.rb +6 -6
  22. data/lib/volt/extra_core/string.rb +6 -6
  23. data/lib/volt/extra_core/symbol.rb +5 -5
  24. data/lib/volt/extra_core/time.rb +4 -4
  25. data/lib/volt/extra_core/true_false.rb +6 -6
  26. data/lib/volt/extra_core/try.rb +9 -9
  27. data/lib/volt/models/array_model.rb +26 -26
  28. data/lib/volt/models/model.rb +35 -35
  29. data/lib/volt/models/model_hash_behaviour.rb +15 -15
  30. data/lib/volt/models/model_helpers.rb +8 -8
  31. data/lib/volt/models/model_wrapper.rb +6 -6
  32. data/lib/volt/models/persistors/array_store.rb +36 -36
  33. data/lib/volt/models/persistors/base.rb +6 -6
  34. data/lib/volt/models/persistors/flash.rb +5 -5
  35. data/lib/volt/models/persistors/model_identity_map.rb +2 -2
  36. data/lib/volt/models/persistors/model_store.rb +22 -22
  37. data/lib/volt/models/persistors/params.rb +3 -3
  38. data/lib/volt/models/persistors/query/query_listener.rb +14 -14
  39. data/lib/volt/models/persistors/query/query_listener_pool.rb +2 -2
  40. data/lib/volt/models/persistors/store.rb +8 -8
  41. data/lib/volt/models/persistors/store_factory.rb +2 -2
  42. data/lib/volt/models/url.rb +37 -37
  43. data/lib/volt/page/bindings/attribute_binding.rb +14 -14
  44. data/lib/volt/page/bindings/base_binding.rb +9 -9
  45. data/lib/volt/page/bindings/component_binding.rb +7 -7
  46. data/lib/volt/page/bindings/content_binding.rb +3 -3
  47. data/lib/volt/page/bindings/each_binding.rb +13 -13
  48. data/lib/volt/page/bindings/event_binding.rb +4 -4
  49. data/lib/volt/page/bindings/if_binding.rb +12 -12
  50. data/lib/volt/page/bindings/template_binding.rb +30 -30
  51. data/lib/volt/page/channel.rb +19 -19
  52. data/lib/volt/page/channel_stub.rb +6 -6
  53. data/lib/volt/page/document.rb +2 -2
  54. data/lib/volt/page/document_events.rb +4 -4
  55. data/lib/volt/page/draw_cycle.rb +3 -3
  56. data/lib/volt/page/memory_test.rb +6 -6
  57. data/lib/volt/page/page.rb +19 -19
  58. data/lib/volt/page/reactive_template.rb +9 -9
  59. data/lib/volt/page/sub_context.rb +5 -5
  60. data/lib/volt/page/targets/attribute_section.rb +9 -9
  61. data/lib/volt/page/targets/attribute_target.rb +3 -3
  62. data/lib/volt/page/targets/base_section.rb +2 -2
  63. data/lib/volt/page/targets/binding_document/component_node.rb +23 -23
  64. data/lib/volt/page/targets/binding_document/html_node.rb +2 -2
  65. data/lib/volt/page/targets/dom_section.rb +40 -38
  66. data/lib/volt/page/targets/dom_target.rb +2 -2
  67. data/lib/volt/page/tasks.rb +12 -12
  68. data/lib/volt/page/template_renderer.rb +4 -4
  69. data/lib/volt/page/url_tracker.rb +6 -6
  70. data/lib/volt/reactive/array_extensions.rb +2 -2
  71. data/lib/volt/reactive/destructive_methods.rb +5 -5
  72. data/lib/volt/reactive/event_chain.rb +25 -25
  73. data/lib/volt/reactive/events.rb +33 -33
  74. data/lib/volt/reactive/object_tracker.rb +21 -21
  75. data/lib/volt/reactive/object_tracking.rb +2 -2
  76. data/lib/volt/reactive/reactive_array.rb +57 -57
  77. data/lib/volt/reactive/reactive_tags.rb +16 -16
  78. data/lib/volt/reactive/reactive_value.rb +72 -72
  79. data/lib/volt/reactive/string_extensions.rb +3 -3
  80. data/lib/volt/router/routes.rb +22 -23
  81. data/lib/volt/server/component_handler.rb +5 -5
  82. data/lib/volt/server/component_templates.rb +14 -11
  83. data/lib/volt/server/html_parser/attribute_scope.rb +116 -0
  84. data/lib/volt/server/html_parser/each_scope.rb +18 -0
  85. data/lib/volt/server/html_parser/if_view_scope.rb +71 -0
  86. data/lib/volt/server/html_parser/sandlebars_parser.rb +219 -0
  87. data/lib/volt/server/html_parser/textarea_scope.rb +31 -0
  88. data/lib/volt/server/html_parser/view_handler.rb +82 -0
  89. data/lib/volt/server/html_parser/view_parser.rb +23 -0
  90. data/lib/volt/server/html_parser/view_scope.rb +145 -0
  91. data/lib/volt/server/rack/asset_files.rb +17 -17
  92. data/lib/volt/server/rack/component_paths.rb +18 -18
  93. data/lib/volt/server/rack/index_files.rb +8 -8
  94. data/lib/volt/server/rack/opal_files.rb +11 -11
  95. data/lib/volt/server/socket_connection_handler.rb +13 -13
  96. data/lib/volt/server/socket_connection_handler_stub.rb +2 -2
  97. data/lib/volt/server.rb +18 -18
  98. data/lib/volt/tasks/dispatcher.rb +5 -5
  99. data/lib/volt/utils/ejson.rb +2 -2
  100. data/lib/volt/utils/generic_counting_pool.rb +8 -8
  101. data/lib/volt/utils/generic_pool.rb +16 -16
  102. data/lib/volt/volt/environment.rb +4 -4
  103. data/lib/volt.rb +6 -6
  104. data/spec/integration/test_integration_spec.rb +2 -2
  105. data/spec/models/event_chain_spec.rb +38 -38
  106. data/spec/models/model_spec.rb +128 -128
  107. data/spec/models/old_model_spec.rb +17 -17
  108. data/spec/models/persistors/params_spec.rb +3 -3
  109. data/spec/models/persistors/store_spec.rb +7 -7
  110. data/spec/models/reactive_array_spec.rb +82 -82
  111. data/spec/models/reactive_generator_spec.rb +11 -11
  112. data/spec/models/reactive_tags_spec.rb +6 -6
  113. data/spec/models/reactive_value_spec.rb +70 -70
  114. data/spec/models/store_spec.rb +4 -4
  115. data/spec/models/string_extensions_spec.rb +13 -13
  116. data/spec/page/bindings/content_binding_spec.rb +6 -6
  117. data/spec/page/sub_context_spec.rb +1 -1
  118. data/spec/router/routes_spec.rb +3 -3
  119. data/spec/server/html_parser/sample_page.html +595 -0
  120. data/spec/server/html_parser/sandlebars_parser_spec.rb +192 -0
  121. data/spec/server/html_parser/view_parser_spec.rb +286 -0
  122. data/spec/server/rack/asset_files_spec.rb +6 -6
  123. data/spec/server/rack/component_paths_spec.rb +5 -5
  124. data/spec/spec_helper.rb +4 -5
  125. data/spec/store/mongo_spec.rb +3 -3
  126. data/spec/tasks/live_query_spec.rb +6 -6
  127. data/spec/tasks/query_tasks.rb +4 -4
  128. data/spec/tasks/query_tracker_spec.rb +20 -20
  129. data/spec/templates/targets/binding_document/component_node_spec.rb +4 -4
  130. data/spec/templates/template_binding_spec.rb +28 -28
  131. data/spec/utils/generic_counting_pool_spec.rb +5 -5
  132. data/spec/utils/generic_pool_spec.rb +14 -14
  133. data/templates/newgem/app/newgem/views/index/index.html +1 -2
  134. data/templates/project/app/home/config/dependencies.rb +1 -1
  135. data/templates/project/app/home/controllers/index_controller.rb +1 -1
  136. data/templates/project/app/home/views/index/about.html +4 -6
  137. data/templates/project/app/home/views/index/home.html +4 -5
  138. data/templates/project/app/home/views/index/index.html +8 -9
  139. data/templates/project/spec/spec_helper.rb +1 -1
  140. metadata +17 -8
  141. data/lib/volt/server/binding_setup.rb +0 -2
  142. data/lib/volt/server/if_binding_setup.rb +0 -31
  143. data/lib/volt/server/scope.rb +0 -43
  144. data/lib/volt/server/template_parser.rb +0 -453
  145. data/spec/server/template_parser_spec.rb +0 -50
@@ -3,20 +3,20 @@ require 'volt/reactive/object_tracking'
3
3
  class ReactiveArray# < Array
4
4
  include ReactiveTags
5
5
  include ObjectTracking
6
-
6
+
7
7
  def initialize(array=[])
8
8
  @array = array
9
9
  end
10
-
10
+
11
11
  # Forward any missing methods to the array
12
12
  def method_missing(method_name, *args, &block)
13
13
  @array.send(method_name, *args, &block)
14
14
  end
15
-
15
+
16
16
  def ==(*args)
17
17
  @array.==(*args)
18
18
  end
19
-
19
+
20
20
  tag_method(:each) do
21
21
  destructive!
22
22
  end
@@ -24,22 +24,22 @@ class ReactiveArray# < Array
24
24
  def each(&block)
25
25
  @array.each(&block)
26
26
  end
27
-
27
+
28
28
  tag_method(:[]=) do
29
29
  pass_reactive!
30
30
  end
31
-
31
+
32
32
  # alias :__old_assign :[]=
33
- def []=(index, value)
34
- index_val = index.cur
33
+ def []=(index, value)
34
+ index_val = index.cur
35
35
  # Clean old value
36
36
  __clear_element(index)
37
-
37
+
38
38
  @array[index.cur] = value
39
-
39
+
40
40
  # Track new value
41
41
  __track_element(index, value)
42
-
42
+
43
43
  # Also track the index if its reactive
44
44
  if index.reactive?
45
45
  # TODO: Need to clean this up when the index changes
@@ -47,38 +47,38 @@ class ReactiveArray# < Array
47
47
  trigger_for_index!(event, index.cur)
48
48
  end
49
49
  end
50
-
50
+
51
51
  # Trigger changed
52
52
  trigger_for_index!('changed', index_val)
53
53
  end
54
-
54
+
55
55
  tag_method(:delete_at) do
56
56
  destructive!
57
57
  end
58
58
  # alias :__old_delete_at :delete_at
59
59
  def delete_at(index)
60
60
  index_val = index.cur
61
-
61
+
62
62
  __clear_element(index)
63
-
63
+
64
64
  model = @array.delete_at(index_val)
65
-
65
+
66
66
  trigger_on_direct_listeners!('removed', index_val)
67
-
68
- # Trigger a changed event for each element in the zone where the
67
+
68
+ # Trigger a changed event for each element in the zone where the
69
69
  # lookup would change
70
70
  index.upto(self.size+1) do |position|
71
71
  trigger_for_index!('changed', position)
72
72
  end
73
-
73
+
74
74
  trigger_size_change!
75
-
75
+
76
76
  @persistor.removed(model) if @persistor
77
-
77
+
78
78
  return model
79
79
  end
80
-
81
-
80
+
81
+
82
82
  # Delete is implemented as part of delete_at
83
83
  tag_method(:delete) do
84
84
  destructive!
@@ -86,7 +86,7 @@ class ReactiveArray# < Array
86
86
  def delete(val)
87
87
  self.delete_at(@array.index(val))
88
88
  end
89
-
89
+
90
90
  # Removes all items in the array model.
91
91
  tag_method(:clear) do
92
92
  destructive!
@@ -102,35 +102,35 @@ class ReactiveArray# < Array
102
102
  # alias :__old_append :<<
103
103
  def <<(value)
104
104
  result = (@array << value)
105
-
105
+
106
106
  # Track new value
107
107
  __track_element(self.size-1, value)
108
-
108
+
109
109
  trigger_for_index!('changed', self.size-1)
110
110
  trigger_on_direct_listeners!('added', self.size-1)
111
-
111
+
112
112
  trigger_size_change!
113
113
 
114
114
  return result
115
115
  end
116
-
117
-
116
+
117
+
118
118
  def +(array)
119
119
  old_size = self.size
120
-
120
+
121
121
  # TODO: += is funky here, might need to make a .plus! method
122
122
  result = ReactiveArray.new(@array.dup + array)
123
-
123
+
124
124
  old_size.upto(result.size-1) do |index|
125
125
  trigger_for_index!('changed', index)
126
126
  trigger_on_direct_listeners!('added', old_size + index)
127
127
  end
128
-
128
+
129
129
  trigger_size_change!
130
-
130
+
131
131
  return result
132
132
  end
133
-
133
+
134
134
  tag_method(:insert) do
135
135
  destructive!
136
136
  end
@@ -145,37 +145,37 @@ class ReactiveArray# < Array
145
145
  objects.size.times do |count|
146
146
  trigger_on_direct_listeners!('added', index+count)
147
147
  end
148
-
148
+
149
149
  trigger_size_change!
150
-
150
+
151
151
  return result
152
152
  end
153
-
153
+
154
154
  def trigger_on_direct_listeners!(event, *args)
155
155
  trigger_by_scope!(event, *args) do |scope|
156
156
  # Only if it is bound directly to us. Don't pass
157
157
  # down the chain
158
158
  !scope || scope[0] == nil
159
159
  end
160
-
160
+
161
161
  end
162
-
162
+
163
163
  def trigger_size_change!
164
164
  trigger_by_scope!('changed') do |scope|
165
165
  # method_name, *args, block = scope
166
166
  method_name, args, block = split_scope(scope)
167
-
167
+
168
168
  result = case method_name && method_name.to_sym
169
169
  when :size, :length
170
170
  true
171
171
  else
172
172
  false
173
173
  end
174
-
174
+
175
175
  result
176
176
  end
177
177
  end
178
-
178
+
179
179
  # TODO: This is an opal work around. Currently there is a bug with destructuring
180
180
  # method_name, *args, block = scope
181
181
  def split_scope(scope)
@@ -183,18 +183,18 @@ class ReactiveArray# < Array
183
183
  scope = scope.dup
184
184
  method_name = scope.shift
185
185
  block = scope.pop
186
-
186
+
187
187
  return method_name, scope, block
188
188
  else
189
189
  return nil,[],nil
190
190
  end
191
191
  end
192
-
193
- # Trigger the changed event to any values fetched either through the
194
- # lookup ([]), #last, or any fetched through the array its self. (sum, max, etc...)
192
+
193
+ # Trigger the changed event to any values fetched either through the
194
+ # lookup ([]), #last, or any fetched through the array its self. (sum, max, etc...)
195
195
  # On an array, when an element is added or removed, we need to trigger change
196
196
  # events on each method that does the following:
197
- # 1. uses the whole array (max, sum, etc...)
197
+ # 1. uses the whole array (max, sum, etc...)
198
198
  # 2. accesses this specific element - array[index]
199
199
  # 3. accesses an element via a method (first, last)
200
200
  def trigger_for_index!(event_name, index, *passed_args)
@@ -202,7 +202,7 @@ class ReactiveArray# < Array
202
202
  # method_name, *args, block = scope
203
203
  method_name, args, block = split_scope(scope)
204
204
  # puts "SCOPE CHECK: TFI: #{method_name.inspect} - #{args.inspect} on #{self.inspect}"
205
-
205
+
206
206
  result = case method_name
207
207
  when nil
208
208
  # no method name means the event was bound directly, we don't
@@ -211,7 +211,7 @@ class ReactiveArray# < Array
211
211
  when :[]
212
212
  # Extract the current index if its reactive
213
213
  arg_index = args[0].cur
214
-
214
+
215
215
  # TODO: we could handle negative indicies better
216
216
  arg_index == index.cur || arg_index < 0
217
217
  when :last
@@ -224,17 +224,17 @@ class ReactiveArray# < Array
224
224
  else
225
225
  true
226
226
  end
227
-
227
+
228
228
  result
229
229
  end
230
- end
231
-
230
+ end
231
+
232
232
  def inspect
233
233
  "#<#{self.class.to_s} #{@array.inspect}>"
234
234
  end
235
-
235
+
236
236
  private
237
-
237
+
238
238
  def __clear_element(index)
239
239
  # Cleanup any tracking on an index
240
240
  if @reactive_element_listeners && self[index].reactive?
@@ -242,11 +242,11 @@ class ReactiveArray# < Array
242
242
  @reactive_element_listeners.delete(index)
243
243
  end
244
244
  end
245
-
245
+
246
246
  def __track_element(index, value)
247
247
  __setup_tracking(index, value) do |event, index, args|
248
248
  trigger_for_index!(event, index, *args)
249
249
  end
250
250
  end
251
-
252
- end
251
+
252
+ end
@@ -1,6 +1,6 @@
1
1
  require 'volt/reactive/destructive_methods'
2
2
 
3
- # ReactiveTags provide an easy way to specify how a class deals with
3
+ # ReactiveTags provide an easy way to specify how a class deals with
4
4
  # reactive events and method calls.als
5
5
  module ReactiveTags
6
6
  class MethodTags
@@ -9,40 +9,40 @@ module ReactiveTags
9
9
 
10
10
  class MethodTagger
11
11
  attr_reader :method_tags
12
-
12
+
13
13
  def initialize
14
14
  @method_tags = MethodTags.new
15
15
  end
16
-
16
+
17
17
  def destructive!(&block)
18
18
  @method_tags.destructive = block || true
19
19
  end
20
-
20
+
21
21
  def pass_reactive!
22
22
  @method_tags.pass_reactive = true
23
23
  end
24
24
  end
25
-
26
- module ClassMethods
25
+
26
+ module ClassMethods
27
27
  def tag_method(method_name, &block)
28
28
  tagger = MethodTagger.new
29
-
29
+
30
30
  tagger.instance_eval(&block)
31
-
31
+
32
32
  @reactive_method_tags ||= {}
33
33
  @reactive_method_tags[method_name.to_sym] = tagger.method_tags
34
-
34
+
35
35
  # Track a destructive method
36
36
  if tagger.method_tags.destructive
37
37
  DestructiveMethods.add_method(method_name)
38
38
  end
39
39
  end
40
-
40
+
41
41
  def tag_all_methods(&block)
42
42
  tagger = MethodTagger.new
43
-
43
+
44
44
  tagger.instance_eval(&block)
45
-
45
+
46
46
  @reactive_method_tags ||= {}
47
47
  @reactive_method_tags[:__all_methods] = tagger.method_tags
48
48
  end
@@ -53,19 +53,19 @@ module ReactiveTags
53
53
  # Check to make sure we haven't gone above a class that has included
54
54
  # ReactiveTags
55
55
  return nil if !klass || !klass.method_defined?(:reactive_method_tag)
56
-
56
+
57
57
  tags = klass.instance_variable_get('@reactive_method_tags')
58
58
 
59
59
  if tags && (tag = tags[method_name.to_sym]) && (tag = tag.send(tag_name))
60
60
  return tag
61
61
  end
62
-
62
+
63
63
  return self.reactive_method_tag(method_name, tag_name, klass.superclass)
64
64
  end
65
-
65
+
66
66
 
67
67
  def self.included(base)
68
68
  base.send(:extend, ClassMethods)
69
69
  base.send(:include, Events)
70
70
  end
71
- end
71
+ end