reactive-ruby 0.7.19 → 0.7.20
Sign up to get free protection for your applications and to get access to all the features.
- 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
|