reactive-ruby 0.7.19 → 0.7.20
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.
- checksums.yaml +4 -4
- data/example/examples/Gemfile.lock +1 -1
- data/example/examples/app/rerendering.rb +72 -0
- data/example/examples/app/show.rb +3 -0
- data/lib/reactive-ruby/component.rb +27 -13
- data/lib/reactive-ruby/state.rb +11 -0
- data/lib/reactive-ruby/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ca98468e40f18b1764978546a1a3436390ebc84
|
4
|
+
data.tar.gz: 70b9057c1a7924574a881d312c62551a8cb72adb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6800c763a8cc32f967fd89277eb9f365de027ec052feae35facd86f06a155e2173f90b5e636f97bb12bda4936ed27b1f25ad5da3dd749608a10d2166a5f4f20
|
7
|
+
data.tar.gz: ea5cc3ffdee3bbbfb778833338392e598de397638a7b48df10dedd3bfed61c7ddebe514dea54edbd0d16d9547c6e072720b655c3911e98207b2a52045a52da59
|
@@ -0,0 +1,72 @@
|
|
1
|
+
class Rerendering
|
2
|
+
|
3
|
+
include React::Component
|
4
|
+
|
5
|
+
class Child
|
6
|
+
|
7
|
+
include React::Component
|
8
|
+
|
9
|
+
define_state state_changes: 0
|
10
|
+
require_param :param
|
11
|
+
|
12
|
+
before_mount do
|
13
|
+
@render_count = 0
|
14
|
+
@render_difference = -1
|
15
|
+
@render_saves = []
|
16
|
+
end
|
17
|
+
|
18
|
+
after_mount do
|
19
|
+
@start_time = Time.now.to_i
|
20
|
+
every(7) { puts "state changes actual ticks = #{Time.now.to_i-@start_time}, calculated = #{(state_changes+1)*7}"; state_changes! state_changes+1}
|
21
|
+
end
|
22
|
+
|
23
|
+
def render
|
24
|
+
puts "child rendering"
|
25
|
+
@render_count = @render_count+1
|
26
|
+
puts "ticks = #{(state_changes)*7} / #{(param)*11} / #{(Rerendering.exported_state_changes)*12}"
|
27
|
+
if param + state_changes + Rerendering.exported_state_changes != @render_count + @render_difference
|
28
|
+
@render_difference = param + state_changes + Rerendering.exported_state_changes - @render_count
|
29
|
+
save = "Skipped a render @ #{Time.now.to_i-@start_time} secs when param = #{param} * 11, state_changes = #{state_changes} * 7, exported = #{Rerendering.exported_state_changes} * 12"
|
30
|
+
@render_saves << save
|
31
|
+
puts save
|
32
|
+
end
|
33
|
+
table do
|
34
|
+
tr { "ticks = #{(state_changes)*7} / #{(param)*11} / #{(Rerendering.exported_state_changes)*12}".td(col_span: 3) }
|
35
|
+
@render_saves.each do |save|
|
36
|
+
tr { save.td(col_span: 3) }
|
37
|
+
end
|
38
|
+
tr { "child param has changed".td; param.td; "times.".td }
|
39
|
+
tr { "internal state has changed".td; state_changes.td; "times.".td }
|
40
|
+
tr { "external state has changed".td; Rerendering.exported_state_changes.td; "times.".td }
|
41
|
+
tr { "that's a total of".td; (param + state_changes + Rerendering.exported_state_changes).td; "changes".td }
|
42
|
+
tr { "And I have rendered a total of".td; (@render_count).td; "times".td }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
define_state parent_state_changes: 0
|
49
|
+
define_state param_changes: 0
|
50
|
+
export_state exported_state_changes: 0
|
51
|
+
|
52
|
+
before_mount do
|
53
|
+
@render_count = 0
|
54
|
+
end
|
55
|
+
|
56
|
+
after_mount do
|
57
|
+
start_time = Time.now.to_i
|
58
|
+
every(5) { parent_state_changes! parent_state_changes+1 }
|
59
|
+
every(11) { puts "param changes actual ticks = #{Time.now.to_i-start_time}, calculated = #{(param_changes+1)*11}"; param_changes! param_changes+1 }
|
60
|
+
every(12) { puts "export changes actual ticks = #{Time.now.to_i-start_time}, calculated = #{(exported_state_changes+1)*11}"; exported_state_changes! exported_state_changes + 1 }
|
61
|
+
end
|
62
|
+
|
63
|
+
def render
|
64
|
+
puts "master_rendering"
|
65
|
+
@render_count = @render_count+1
|
66
|
+
div do
|
67
|
+
"master has changed state a total of #{parent_state_changes + param_changes} times, and has rendered #{@render_count} times".br
|
68
|
+
Child(param: param_changes)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -9,6 +9,7 @@ require 'reactive-router'
|
|
9
9
|
require 'basics'
|
10
10
|
require 'reuse'
|
11
11
|
require 'items'
|
12
|
+
require 'rerendering'
|
12
13
|
|
13
14
|
|
14
15
|
class Show
|
@@ -20,6 +21,7 @@ class Show
|
|
20
21
|
routes(path: "/") do
|
21
22
|
route(path: "basics", name: "basics", handler: Basics)
|
22
23
|
route(path: "reuse", name: "reuse", handler: Reuse)
|
24
|
+
route(path: "rerendering", name: "rerendering", handler: Rerendering)
|
23
25
|
redirect(from: "/", to: "basics")
|
24
26
|
end
|
25
27
|
|
@@ -29,6 +31,7 @@ class Show
|
|
29
31
|
div do
|
30
32
|
link(to: "basics") { "Basics" }; br
|
31
33
|
link(to: "reuse") { "Reusable Components" }; br
|
34
|
+
link(to: "rerendering") { "Rerendering Test" }; br
|
32
35
|
end
|
33
36
|
route_handler
|
34
37
|
end
|
@@ -63,23 +63,17 @@ module React
|
|
63
63
|
base.extend(ClassMethods)
|
64
64
|
|
65
65
|
if base.name
|
66
|
-
#puts "getting parent of #{base.name}"
|
67
66
|
parent = base.name.split("::").inject([Module]) { |nesting, next_const| nesting + [nesting.last.const_get(next_const)] }[-2]
|
68
|
-
#puts "defining method missing for module #{parent}"
|
69
|
-
|
70
|
-
class << parent #.class_eval do
|
71
|
-
|
72
67
|
|
68
|
+
class << parent
|
73
69
|
|
74
70
|
def method_missing(n, *args, &block)
|
75
|
-
#puts "method missing for #{n} called"
|
76
71
|
name = n
|
77
72
|
if name =~ /_as_node$/
|
78
73
|
node_only = true
|
79
74
|
name = name.gsub(/_as_node$/, "")
|
80
75
|
end
|
81
76
|
unless name = const_get(name) and name.method_defined? :render
|
82
|
-
#puts "can't find render method"
|
83
77
|
return super
|
84
78
|
end
|
85
79
|
if node_only
|
@@ -114,7 +108,7 @@ module React
|
|
114
108
|
end
|
115
109
|
|
116
110
|
def update_react_js_state(object, name, value)
|
117
|
-
set_state({"#{object.class.to_s+'.' unless object == self}name" => value}) rescue nil
|
111
|
+
set_state({"***_state_updated_at-***" => Time.now.to_f, "#{object.class.to_s+'.' unless object == self}#{name}" => value}) rescue nil
|
118
112
|
end
|
119
113
|
|
120
114
|
def emit(event_name, *args)
|
@@ -148,10 +142,30 @@ module React
|
|
148
142
|
self.class.process_exception(e, self)
|
149
143
|
end
|
150
144
|
|
145
|
+
def props_changed?(next_props)
|
146
|
+
return true unless params.keys.sort == next_props.keys.sort
|
147
|
+
params.detect { |k, v| `#{next_props[k]} != #{params[k]}`}
|
148
|
+
end
|
149
|
+
|
151
150
|
def should_component_update?(next_props, next_state)
|
152
|
-
React::State.set_state_context_to(self)
|
153
|
-
|
154
|
-
|
151
|
+
React::State.set_state_context_to(self) do
|
152
|
+
next_props = Hash.new(next_props)
|
153
|
+
if self.respond_to?(:needs_update?)
|
154
|
+
!!self.needs_update?(next_props, Hash.new(next_state))
|
155
|
+
elsif false # switch to true to force updates per standard react
|
156
|
+
true
|
157
|
+
elsif props_changed? next_props
|
158
|
+
true
|
159
|
+
elsif `!next_state != !#{@native}.state`
|
160
|
+
true
|
161
|
+
elsif `!next_state && !#{@native}.state`
|
162
|
+
false
|
163
|
+
elsif `next_state["***_state_updated_at-***"] != #{@native}.state["***_state_updated_at-***"]`
|
164
|
+
true
|
165
|
+
else
|
166
|
+
false
|
167
|
+
end.to_n
|
168
|
+
end
|
155
169
|
end
|
156
170
|
|
157
171
|
def component_will_update(next_props, next_state)
|
@@ -247,12 +261,12 @@ module React
|
|
247
261
|
module ClassMethods
|
248
262
|
|
249
263
|
def backtrace(*args)
|
250
|
-
@
|
264
|
+
@backtrace_off = (args[0] == :off)
|
251
265
|
end
|
252
266
|
|
253
267
|
def process_exception(e, component, reraise = nil)
|
254
268
|
message = ["Exception raised while rendering #{component}"]
|
255
|
-
if
|
269
|
+
if !@backtrace_off
|
256
270
|
message << " #{e.backtrace[0]}"
|
257
271
|
message += e.backtrace[1..-1].collect { |line| line }
|
258
272
|
else
|
data/lib/reactive-ruby/state.rb
CHANGED
@@ -72,11 +72,22 @@ module React
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def set_state_context_to(observer) # wrap all execution that may set or get states in a block so we know which observer is executing
|
75
|
+
if `typeof window.reactive_ruby_timing !== 'undefined'`
|
76
|
+
@nesting_level = (@nesting_level || 0) + 1
|
77
|
+
start_time = Time.now.to_f
|
78
|
+
observer_name = (observer.class.respond_to?(:name) ? observer.class.name : observer.to_s) rescue "object:#{observer.object_id}"
|
79
|
+
puts "#{' ' * @nesting_level} Timing #{observer_name} Execution"
|
80
|
+
end
|
75
81
|
saved_current_observer = @current_observer
|
76
82
|
@current_observer = observer
|
77
83
|
return_value = yield
|
84
|
+
if `typeof window.reactive_ruby_timing !== 'undefined'`
|
85
|
+
puts "#{' ' * @nesting_level} Timing #{observer_name} Completed in #{'%.04f' % (Time.now.to_f-start_time)} seconds"
|
86
|
+
end
|
87
|
+
return_value
|
78
88
|
ensure
|
79
89
|
@current_observer = saved_current_observer
|
90
|
+
@nesting_level = [0, @nesting_level - 1].max if `typeof window.reactive_ruby_timing !== 'undefined'`
|
80
91
|
return_value
|
81
92
|
end
|
82
93
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reactive-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Chang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opal
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- example/examples/app/items.rb
|
100
100
|
- example/examples/app/jquery.js
|
101
101
|
- example/examples/app/react-router.js
|
102
|
+
- example/examples/app/rerendering.rb
|
102
103
|
- example/examples/app/reuse.rb
|
103
104
|
- example/examples/app/show.rb
|
104
105
|
- example/examples/config.ru
|