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
@@ -32,7 +32,7 @@ class TemplateRenderer < BaseBinding
32
32
 
33
33
  # Remove all of the sub-bindings
34
34
  # @sub_bindings.each(&:remove)
35
-
35
+
36
36
  @sub_bindings.each do |binding|
37
37
  # puts "REMOVE: #{binding.inspect}"
38
38
  binding.remove
@@ -40,11 +40,11 @@ class TemplateRenderer < BaseBinding
40
40
  end
41
41
 
42
42
  @sub_bindings = []
43
-
43
+
44
44
  super
45
45
  end
46
-
46
+
47
47
  def remove_anchors
48
48
  section.remove_anchors
49
49
  end
50
- end
50
+ end
@@ -4,14 +4,14 @@
4
4
  class UrlTracker
5
5
  def initialize(page)
6
6
  @page = page
7
-
7
+
8
8
  if Volt.client?
9
9
  page.params.on('child_changed') do
10
10
  @page.url.update!
11
11
  end
12
12
 
13
13
  that = self
14
-
14
+
15
15
  # Setup popstate on the dom ready event. Prevents an extra
16
16
  # popstate trigger
17
17
  %x{
@@ -20,17 +20,17 @@ class UrlTracker
20
20
  if (first === false) {
21
21
  that.$url_updated();
22
22
  }
23
-
23
+
24
24
  first = false;
25
-
25
+
26
26
  return true;
27
27
  });
28
28
  }
29
29
  end
30
30
  end
31
-
31
+
32
32
  def url_updated(first_call=false)
33
33
  @page.url.parse(`document.location.href`)
34
34
  @page.url.update! unless first_call
35
35
  end
36
- end
36
+ end
@@ -7,7 +7,7 @@ class Array
7
7
  if val.reactive? && !result.reactive?
8
8
  result = ReactiveValue.new(result)
9
9
  end
10
-
10
+
11
11
  return result
12
12
  end
13
- end
13
+ end
@@ -1,19 +1,19 @@
1
- # DestructiveMethods tracks the names of all methods that are marked as
2
- # destructive. This lets us do an optimization where we don't need to
1
+ # DestructiveMethods tracks the names of all methods that are marked as
2
+ # destructive. This lets us do an optimization where we don't need to
3
3
  # check any methods with names that aren't here, we can be sure that they
4
4
  # are not destructive. If the method is tracked here, we need to check
5
5
  # it on its current class.
6
6
  class DestructiveMethods
7
7
  @@method_names = {}
8
-
8
+
9
9
  def self.add_method(method_name)
10
10
  @@method_names[method_name] = true
11
11
  end
12
-
12
+
13
13
  # Check to see if a method might be destructive. If this returns
14
14
  # false, then we can guarentee that it won't be destructive and
15
15
  # we can skip a destructive check.
16
16
  def self.might_be_destructive?(method_name)
17
17
  return @@method_names[method_name]
18
18
  end
19
- end
19
+ end
@@ -2,29 +2,29 @@ CHAIN_DEBUG = false
2
2
 
3
3
  class ChainListener
4
4
  attr_reader :object, :callback
5
-
5
+
6
6
  def initialize(event_chain, object, callback)
7
7
  @event_chain = event_chain
8
8
  @object = object
9
9
  @callback = callback
10
-
10
+
11
11
  if RUBY_PLATFORM == 'opal' && CHAIN_DEBUG
12
12
  `window.chain_listeners = window.chain_listeners || 0;`
13
13
  `window.chain_listeners += 1;`
14
14
  `console.log('chain listeners: ', window.chain_listeners)`
15
15
  end
16
16
  end
17
-
17
+
18
18
  def remove
19
19
  raise "event chain already removed" if @removed
20
20
  @removed = true
21
21
  @event_chain.remove_object(self)
22
-
22
+
23
23
  # We need to clear these to free memory
24
24
  @event_chain = nil
25
25
  @object = nil
26
26
  @callback = nil
27
-
27
+
28
28
  if RUBY_PLATFORM == 'opal' && CHAIN_DEBUG
29
29
  `window.chain_listeners -= 1;`
30
30
  end
@@ -37,7 +37,7 @@ class EventChain
37
37
  @main_object = main_object
38
38
  @event_counts = {}
39
39
  end
40
-
40
+
41
41
  # Register an event listener that chains from object to self
42
42
  def setup_listener(event, chain_listener)
43
43
  return chain_listener.object.on(event, @main_object) do |filter, *args|
@@ -45,73 +45,73 @@ class EventChain
45
45
  callback.call(event, filter, *args)
46
46
  else
47
47
  # Trigger on this value, when it happens on the parent
48
-
48
+
49
49
  # Only pass the filter from non-reactive to reactive? This
50
50
  # lets us scope the calls on a proxied object.
51
- # Filters limit which listeners are triggered, passing them to
51
+ # Filters limit which listeners are triggered, passing them to
52
52
  # the ReactiveValue's from non-reactive lets us filter at the
53
53
  # reactive level as well.
54
54
  filter = nil unless !chain_listener.object.reactive? && @main_object.reactive?
55
-
55
+
56
56
  @main_object.trigger!(event, filter, *args)
57
57
  end
58
58
  end
59
59
  end
60
-
60
+
61
61
  # We can chain our events to any other object that includes
62
62
  # Events
63
- def add_object(object, &block)
64
- # puts "ADD OBJECT: #{object.inspect} to #{self.inspect}"
65
-
63
+ def add_object(object, &block)
64
+ # puts "ADD OBJECT: #{object.inspect} to #{self.inspect}"
65
+
66
66
  chain_listener = ChainListener.new(self, object, block)
67
67
 
68
68
  listeners = {}
69
-
69
+
70
70
  @main_object.listeners.keys.each do |event|
71
71
  # Create a listener for each event
72
72
  listeners[event] = setup_listener(event, chain_listener)
73
73
  end
74
-
74
+
75
75
  @event_chain[chain_listener] = listeners
76
-
76
+
77
77
  return chain_listener
78
78
  end
79
-
80
-
79
+
80
+
81
81
  def remove_object(chain_listener)
82
82
  @event_chain[chain_listener].each_pair do |event,listener|
83
83
  # Unbind each listener
84
84
  listener.remove
85
85
  end
86
-
86
+
87
87
  @event_chain.delete(chain_listener)
88
88
  end
89
-
89
+
90
90
  def add_event(event)
91
91
  unless @event_counts[event]
92
92
  @event_chain.each_pair do |chain_listener,listeners|
93
- # Only add if we haven't already chained this event
93
+ # Only add if we haven't already chained this event
94
94
  unless listeners[event]
95
95
  listeners[event] = setup_listener(event, chain_listener)
96
96
  end
97
97
  end
98
98
  end
99
-
99
+
100
100
  @event_counts[event] ||= 0
101
101
  @event_counts[event] += 1
102
102
  end
103
-
103
+
104
104
  # Removes the event from all events in all objects
105
105
  def remove_event(event)
106
106
  if @event_counts[event]
107
107
  count = @event_counts[event] -= 1
108
-
108
+
109
109
  if count == 0
110
110
  @event_chain.each_pair do |chain_listener,listeners|
111
111
  listeners[event].remove# if listeners[event]
112
112
  listeners.delete(event)
113
113
  end
114
-
114
+
115
115
  # Also remove the event count
116
116
  @event_counts.delete(event)
117
117
  end
@@ -7,7 +7,7 @@ DEBUG = false
7
7
  # used to clear the event listener.
8
8
  class Listener
9
9
  attr_reader :scope_provider, :klass
10
-
10
+
11
11
  def initialize(klass, event, scope_provider, callback)
12
12
  @klass = klass
13
13
  @event = event
@@ -18,41 +18,41 @@ class Listener
18
18
  # puts "e: #{event} on #{klass.inspect}"
19
19
  @@all_events ||= []
20
20
  @@all_events << self
21
-
21
+
22
22
  # counts = {}
23
23
  # @@all_events.each do |ev|
24
24
  # scope = (ev.scope_provider && ev.scope_provider.scope) || nil
25
- #
25
+ #
26
26
  # # puts `typeof(scope)`
27
27
  # if `typeof(scope) !== 'undefined'`
28
28
  # counts[scope] ||= 0
29
29
  # counts[scope] += 1
30
30
  # end
31
31
  # end
32
- #
32
+ #
33
33
  # puts counts.inspect
34
-
34
+
35
35
  `window.total_listeners = window.total_listeners || 0;`
36
36
  `window.total_listeners += 1;`
37
37
  `console.log(window.total_listeners);`
38
38
  end
39
39
  end
40
-
40
+
41
41
  def internal?
42
42
  @internal
43
43
  end
44
-
44
+
45
45
  def scope
46
46
  @scope_provider && scope_provider.respond_to?(:scope) && @scope_provider.scope
47
47
  end
48
-
48
+
49
49
  def call(*args)
50
50
  # raise "Triggered on removed: #{@event} on #{@klass2.inspect}" if @removed
51
51
  if @removed
52
52
  puts "Triggered on a removed event: #{@event}"
53
53
  return
54
54
  end
55
-
55
+
56
56
  # Queue a live value update
57
57
  if @klass.reactive?
58
58
  # We are working with a reactive value. Its receiving an event meaning
@@ -60,7 +60,7 @@ class Listener
60
60
  @klass.object_tracker.queue_update
61
61
  # puts "Queued: #{ObjectTracker.queue.inspect}"
62
62
  end
63
-
63
+
64
64
  @callback.call(*args)
65
65
  end
66
66
 
@@ -68,16 +68,16 @@ class Listener
68
68
  def remove
69
69
  # puts "FAIL:" if @removed
70
70
  raise "event #{@event} already removed" if @removed
71
-
71
+
72
72
  # puts "e rem: #{@event} on #{@klass.inspect}"
73
73
  if DEBUG && RUBY_PLATFORM == 'opal'
74
74
  @@all_events.delete(self) if @@all_events
75
-
75
+
76
76
  `window.total_listeners -= 1;`
77
77
  `console.log("Rem", window.total_listeners);`
78
78
  end
79
-
80
-
79
+
80
+
81
81
  @removed = true
82
82
  @klass.remove_listener(@event, self)
83
83
 
@@ -91,7 +91,7 @@ class Listener
91
91
  # @event = nil
92
92
 
93
93
  end
94
-
94
+
95
95
  def inspect
96
96
  "<Listener:#{object_id} event=#{@event} scope=#{scope.inspect}#{' internal' if internal?}>"
97
97
  end
@@ -99,26 +99,26 @@ end
99
99
 
100
100
  module Events
101
101
  # Add a listener for an event
102
- def on(event, scope_provider=nil, &block)
102
+ def on(event, scope_provider=nil, &block)
103
+
103
104
 
104
-
105
105
  # if reactive? && [:added, :removed].include?(event)
106
106
  # self.object_tracker.queue_update
107
107
  # ObjectTracker.process_queue
108
108
  # end
109
109
 
110
110
 
111
- # puts "Register: #{event} on #{self.inspect}"
111
+ # puts "Register: #{event} on #{self.inspect}"
112
112
  event = event.to_sym
113
-
113
+
114
114
  new_listener = Listener.new(self, event, scope_provider, block)
115
-
115
+
116
116
  @listeners ||= {}
117
117
  @listeners[event] ||= []
118
118
  @listeners[event] << new_listener
119
119
 
120
120
  first = @listeners[event].size == 1
121
-
121
+
122
122
  # When events get added, we need to notify event chains so they
123
123
  # can update and chain any new events.
124
124
  event_chain.add_event(event) if first
@@ -132,7 +132,7 @@ module Events
132
132
 
133
133
  return new_listener
134
134
  end
135
-
135
+
136
136
  def event_chain
137
137
  @event_chain ||= EventChain.new(self)
138
138
  end
@@ -146,9 +146,9 @@ module Events
146
146
  # a listener
147
147
  def remove_listener(event, listener)
148
148
  event = event.to_sym
149
-
149
+
150
150
  raise "Unable to delete #{event} from #{self.inspect}" unless @listeners && @listeners[event]
151
-
151
+
152
152
  # if @listeners && @listeners[event]
153
153
  @listeners[event].delete(listener)
154
154
 
@@ -169,14 +169,14 @@ module Events
169
169
  end
170
170
  # end
171
171
  end
172
-
172
+
173
173
  def trigger!(event, filter=nil, *args)
174
174
  are_reactive = reactive?
175
175
  # puts "TRIGGER FOR: #{event} on #{self.inspect}" if !reactive?
176
176
  ObjectTracker.process_queue if !are_reactive# && !respond_to?(:skip_current_queue_flush)
177
-
177
+
178
178
  event = event.to_sym
179
-
179
+
180
180
  if @listeners && @listeners[event]
181
181
  # puts "LISTENERS FOR #{event} on #{self.inspect} - #{@listeners[event].inspect}"
182
182
  # TODO: We have to dup here because one trigger might remove another
@@ -187,7 +187,7 @@ module Events
187
187
  # if we aren't reactive, we should pass to all of our reactive listeners, since they
188
188
  # just proxy us.
189
189
  # If the filter exists, check it
190
- # puts "CHECK #{listener.inspect} : #{self.inspect} -- #{listener.klass.inspect}"
190
+ # puts "CHECK #{listener.inspect} : #{self.inspect} -- #{listener.klass.inspect}"
191
191
  if (!filter || (!are_reactive && listener.scope_provider.reactive?) || filter.call(listener.scope))
192
192
  listener.call(filter, *args)
193
193
  end
@@ -196,19 +196,19 @@ module Events
196
196
 
197
197
  nil
198
198
  end
199
-
200
- # Takes a block, which passes in
199
+
200
+ # Takes a block, which passes in
201
201
  def trigger_by_scope!(event, *args, &block)
202
202
  trigger!(event, block, *args)
203
203
  end
204
-
204
+
205
205
  # Takes an event and a list of method names, and triggers the event for each listener
206
206
  # coming off of those methods.
207
207
  def trigger_for_methods!(event, *method_names)
208
208
  trigger_by_scope!(event, [], nil) do |scope|
209
209
  if scope
210
210
  method_name = scope.first
211
-
211
+
212
212
  method_names.include?(method_name)
213
213
  else
214
214
  false
@@ -216,4 +216,4 @@ module Events
216
216
  end
217
217
  end
218
218
 
219
- end
219
+ end
@@ -3,50 +3,50 @@ class ObjectTracker
3
3
  @@queue = {}
4
4
  @@cache_enabled = false
5
5
  @@cache_version = 0
6
-
6
+
7
7
  def self.cache_enabled
8
8
  @@cache_enabled
9
9
  end
10
-
10
+
11
11
  def self.enable_cache
12
12
  clear_cache
13
13
  @@cache_enabled = true
14
14
  end
15
-
15
+
16
16
  def self.disable_cache
17
17
  @@cache_enabled = false
18
18
  end
19
-
19
+
20
20
  def self.cache_version
21
21
  @@cache_version
22
22
  end
23
-
23
+
24
24
  def self.clear_cache
25
25
  @@cache_version = (@@cache_version || 0) + 1
26
26
  end
27
-
27
+
28
28
  def initialize(main_object)
29
29
  @main_object = main_object
30
30
  @enabled = false
31
31
  end
32
-
32
+
33
33
  def self.queue
34
34
  @@queue
35
35
  end
36
-
36
+
37
37
  def queue_update
38
38
  # puts "Queue: #{@main_object.inspect}"
39
39
  @@queue[self] = true
40
40
  end
41
-
41
+
42
42
  # Run through the queue and update the followers for each
43
43
  def self.process_queue
44
44
  return if @@queue.size == 0
45
45
  # puts "PROCESS QUEUE: #{@@queue.size}"
46
46
  queue = @@queue
47
47
 
48
- # puts "Update Followers #{@@queue.size}"
49
-
48
+ # puts "Update Followers #{@@queue.size}"
49
+
50
50
  # Clear before running incase someone adds during
51
51
  @@queue = {}
52
52
  # self.enable_cache
@@ -54,19 +54,19 @@ class ObjectTracker
54
54
  queue.each_pair do |object_tracker,val|
55
55
  object_tracker.update_followers
56
56
  end
57
-
57
+
58
58
  # self.disable_cache
59
-
59
+
60
60
  # puts "UPDATED FOLLOWERS"
61
61
  end
62
-
62
+
63
63
  def enable!
64
64
  unless @enabled
65
65
  @enabled = true
66
66
  queue_update
67
67
  end
68
68
  end
69
-
69
+
70
70
  def disable!
71
71
  remove_followers
72
72
  @@queue.delete(self)
@@ -76,12 +76,12 @@ class ObjectTracker
76
76
  def update_followers
77
77
  if @enabled
78
78
  current_obj = @main_object.cur#(true)
79
-
79
+
80
80
  # puts "UPDATE ON #{current_obj.inspect}"
81
-
81
+
82
82
  if !@cached_current_obj || current_obj.object_id != @cached_current_obj.object_id
83
83
  remove_followers
84
-
84
+
85
85
  # Add to current
86
86
  should_attach = current_obj.respond_to?(:on)
87
87
  if should_attach
@@ -93,15 +93,15 @@ class ObjectTracker
93
93
  else
94
94
  end
95
95
  end
96
-
96
+
97
97
  # Remove follower
98
98
  def remove_followers
99
99
  # Remove from previous
100
100
  if @cached_current_obj
101
101
  @current_obj_chain_listener.remove
102
102
  @current_obj_chain_listener = nil
103
-
103
+
104
104
  @cached_current_obj = nil
105
105
  end
106
106
  end
107
- end
107
+ end
@@ -1,7 +1,7 @@
1
1
  # Provides methods for objects that store reactive value's to trigger
2
2
  module ObjectTracking
3
3
  def __setup_tracking(key, value)
4
- if value.reactive?
4
+ if value.reactive?
5
5
  # TODO: We should build this in so it fires just for the current index.
6
6
  # Currently this is a big performance hit.
7
7
  chain_listener = event_chain.add_object(value.reactive_manager) do |event, *args|
@@ -11,4 +11,4 @@ module ObjectTracking
11
11
  @reactive_element_listeners[key] = chain_listener
12
12
  end
13
13
  end
14
- end
14
+ end