reactive-ruby 0.7.17 → 0.7.18
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/lib/reactive-ruby/component.rb +52 -52
- data/lib/reactive-ruby/state.rb +34 -21
- data/lib/reactive-ruby/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bb53545fea7cc396c074b19f9b6ea356cb75e3f
|
4
|
+
data.tar.gz: 0219c73e5aa24c6b43ffaa1349555f422029121d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6edeec42272d3fd8d32d15366c04473c8cd1be7903cabe4b2f4f40d21a3d6fa3eda38bee50420b785cd1261cf3b4dd33b0b1f97b79b3785c139b7a97f28ecaae
|
7
|
+
data.tar.gz: 259820d440ffce2e671bbfcd40b0f990c7cad408d795f27efaa5cd4d7717eb4b6422ced7261153adcb548cf157cf2f4ea988f8af4dccee92d0f4d581e2577013
|
@@ -10,7 +10,7 @@ require 'native'
|
|
10
10
|
|
11
11
|
module React
|
12
12
|
module Component
|
13
|
-
|
13
|
+
|
14
14
|
def self.included(base)
|
15
15
|
base.include(API)
|
16
16
|
base.include(React::Callbacks)
|
@@ -22,11 +22,11 @@ module React
|
|
22
22
|
define_callback :before_update
|
23
23
|
define_callback :after_update
|
24
24
|
define_callback :before_unmount
|
25
|
-
|
25
|
+
|
26
26
|
def render
|
27
27
|
raise "no render defined"
|
28
28
|
end unless method_defined? :render
|
29
|
-
|
29
|
+
|
30
30
|
def children
|
31
31
|
nodes = `#{@native}.props.children` || []
|
32
32
|
class << nodes
|
@@ -58,23 +58,23 @@ module React
|
|
58
58
|
|
59
59
|
nodes
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
end
|
63
63
|
base.extend(ClassMethods)
|
64
|
-
|
64
|
+
|
65
65
|
if base.name
|
66
66
|
#puts "getting parent of #{base.name}"
|
67
|
-
parent = base.name.split("::").inject([Module]) { |nesting, next_const| nesting + [nesting.last.const_get(next_const)] }[-2]
|
67
|
+
parent = base.name.split("::").inject([Module]) { |nesting, next_const| nesting + [nesting.last.const_get(next_const)] }[-2]
|
68
68
|
#puts "defining method missing for module #{parent}"
|
69
69
|
|
70
70
|
class << parent #.class_eval do
|
71
|
-
|
72
|
-
|
71
|
+
|
72
|
+
|
73
73
|
|
74
74
|
def method_missing(n, *args, &block)
|
75
75
|
#puts "method missing for #{n} called"
|
76
76
|
name = n
|
77
|
-
if name =~ /_as_node$/
|
77
|
+
if name =~ /_as_node$/
|
78
78
|
node_only = true
|
79
79
|
name = name.gsub(/_as_node$/, "")
|
80
80
|
end
|
@@ -92,7 +92,7 @@ module React
|
|
92
92
|
message = "#{base.name}.#{n} method_missing handler exception raised: #{e}"
|
93
93
|
`console.error(#{message})`
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
@@ -100,7 +100,7 @@ module React
|
|
100
100
|
def initialize(native_element)
|
101
101
|
@native = native_element
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
def params
|
105
105
|
Hash.new(`#{@native}.props`)
|
106
106
|
end
|
@@ -113,9 +113,9 @@ module React
|
|
113
113
|
raise "No native ReactComponent associated" unless @native
|
114
114
|
Hash.new(`#{@native}.state`)
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
def update_react_js_state(object, name, value)
|
118
|
-
set_state({"#{object.class.to_s+'.' unless object == self}name" => value}) rescue nil
|
118
|
+
set_state({"#{object.class.to_s+'.' unless object == self}name" => value}) rescue nil
|
119
119
|
end
|
120
120
|
|
121
121
|
def emit(event_name, *args)
|
@@ -133,7 +133,7 @@ module React
|
|
133
133
|
|
134
134
|
def component_did_mount
|
135
135
|
React::State.set_state_context_to(self) do
|
136
|
-
self.run_callback(:after_mount)
|
136
|
+
self.run_callback(:after_mount)
|
137
137
|
React::State.update_states_to_observe
|
138
138
|
end
|
139
139
|
rescue Exception => e
|
@@ -160,7 +160,7 @@ module React
|
|
160
160
|
rescue Exception => e
|
161
161
|
self.class.process_exception(e, self)
|
162
162
|
end
|
163
|
-
|
163
|
+
|
164
164
|
|
165
165
|
def component_did_update(prev_props, prev_state)
|
166
166
|
React::State.set_state_context_to(self) do
|
@@ -172,7 +172,7 @@ module React
|
|
172
172
|
end
|
173
173
|
|
174
174
|
def component_will_unmount
|
175
|
-
React::State.set_state_context_to(self) do
|
175
|
+
React::State.set_state_context_to(self) do
|
176
176
|
self.run_callback(:before_unmount)
|
177
177
|
React::State.remove
|
178
178
|
end
|
@@ -187,12 +187,12 @@ module React
|
|
187
187
|
Kernel.p(*args)
|
188
188
|
end
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
191
|
def component?(name)
|
192
192
|
name_list = name.split("::")
|
193
193
|
scope_list = self.class.name.split("::").inject([Module]) { |nesting, next_const| nesting + [nesting.last.const_get(next_const)] }.reverse
|
194
194
|
scope_list.each do |scope|
|
195
|
-
component = name_list.inject(scope) do |scope, class_name|
|
195
|
+
component = name_list.inject(scope) do |scope, class_name|
|
196
196
|
scope.const_get(class_name)
|
197
197
|
end rescue nil
|
198
198
|
return component if component and component.method_defined? :render
|
@@ -203,7 +203,7 @@ module React
|
|
203
203
|
def method_missing(n, *args, &block)
|
204
204
|
return params[n] if params.key? n
|
205
205
|
name = n
|
206
|
-
if name =~ /_as_node$/
|
206
|
+
if name =~ /_as_node$/
|
207
207
|
node_only = true
|
208
208
|
name = name.gsub(/_as_node$/, "")
|
209
209
|
end
|
@@ -211,32 +211,32 @@ module React
|
|
211
211
|
return super
|
212
212
|
end
|
213
213
|
|
214
|
-
if name == "present"
|
214
|
+
if name == "present"
|
215
215
|
name = args.shift
|
216
216
|
end
|
217
217
|
|
218
218
|
if name == "_p_tag"
|
219
219
|
name = "p"
|
220
220
|
end
|
221
|
-
|
222
|
-
if node_only
|
221
|
+
|
222
|
+
if node_only
|
223
223
|
React::RenderingContext.build { React::RenderingContext.render(name, *args, &block) }.to_n
|
224
224
|
else
|
225
225
|
React::RenderingContext.render(name, *args, &block)
|
226
226
|
end
|
227
|
-
|
227
|
+
|
228
228
|
end
|
229
|
-
|
229
|
+
|
230
230
|
def watch(value, &on_change)
|
231
231
|
React::Observable.new(value, on_change)
|
232
232
|
end
|
233
|
-
|
233
|
+
|
234
234
|
def define_state(*args, &block)
|
235
235
|
React::State.initialize_states(self, self.class.define_state(*args, &block))
|
236
236
|
end
|
237
|
-
|
237
|
+
|
238
238
|
attr_reader :waiting_on_resources
|
239
|
-
|
239
|
+
|
240
240
|
def _render_wrapper
|
241
241
|
React::State.set_state_context_to(self) do
|
242
242
|
RenderingContext.render(nil) {render || ""}.tap { |element| @waiting_on_resources = element.waiting_on_resources if element.respond_to? :waiting_on_resources }
|
@@ -246,16 +246,16 @@ module React
|
|
246
246
|
end
|
247
247
|
|
248
248
|
module ClassMethods
|
249
|
-
|
249
|
+
|
250
250
|
def backtrace(*args)
|
251
251
|
@backtrace_on = (args.count == 0 or (args[0] != :off and args[0]))
|
252
252
|
end
|
253
|
-
|
253
|
+
|
254
254
|
def process_exception(e, component, reraise = nil)
|
255
255
|
message = ["Exception raised while rendering #{component}"]
|
256
256
|
if @backtrace_on
|
257
257
|
message << " #{e.backtrace[0]}"
|
258
|
-
message += e.backtrace[1..-1].collect { |line| line }
|
258
|
+
message += e.backtrace[1..-1].collect { |line| line }
|
259
259
|
else
|
260
260
|
message[0] += ": #{e.message}"
|
261
261
|
end
|
@@ -263,11 +263,11 @@ module React
|
|
263
263
|
`console.error(message)`
|
264
264
|
raise e if reraise
|
265
265
|
end
|
266
|
-
|
266
|
+
|
267
267
|
def validator
|
268
268
|
@validator ||= React::Validator.new
|
269
269
|
end
|
270
|
-
|
270
|
+
|
271
271
|
def prop_types
|
272
272
|
if self.validator
|
273
273
|
{
|
@@ -291,7 +291,7 @@ module React
|
|
291
291
|
def params(&block)
|
292
292
|
validator.build(&block)
|
293
293
|
end
|
294
|
-
|
294
|
+
|
295
295
|
def define_param_method(name, param_type)
|
296
296
|
if param_type == React::Observable
|
297
297
|
(@two_way_params ||= []) << name
|
@@ -325,27 +325,27 @@ module React
|
|
325
325
|
end
|
326
326
|
end
|
327
327
|
end
|
328
|
-
|
328
|
+
|
329
329
|
def required_param(name, options = {})
|
330
330
|
validator.requires(name, options)
|
331
331
|
define_param_method(name, options[:type])
|
332
332
|
end
|
333
|
-
|
333
|
+
|
334
334
|
alias_method :require_param, :required_param
|
335
|
-
|
335
|
+
|
336
336
|
def optional_param(name, options = {})
|
337
337
|
validator.optional(name, options)
|
338
338
|
define_param_method(name, options[:type]) unless name == :params
|
339
|
-
end
|
340
|
-
|
339
|
+
end
|
340
|
+
|
341
341
|
def collect_other_params_as(name)
|
342
342
|
validator.all_others(name)
|
343
343
|
define_method(name) do
|
344
344
|
@_all_others ||= self.class.validator.collect_all_others(params)
|
345
345
|
end
|
346
346
|
end
|
347
|
-
|
348
|
-
def define_state(*states, &block)
|
347
|
+
|
348
|
+
def define_state(*states, &block)
|
349
349
|
default_initial_value = (block and block.arity == 0) ? yield : nil
|
350
350
|
states_hash = (states.last.is_a? Hash) ? states.pop : {}
|
351
351
|
states.each { |name| states_hash[name] = default_initial_value }
|
@@ -354,8 +354,8 @@ module React
|
|
354
354
|
define_state_methods(self, name, &block)
|
355
355
|
end
|
356
356
|
end
|
357
|
-
|
358
|
-
def export_state(*states, &block)
|
357
|
+
|
358
|
+
def export_state(*states, &block)
|
359
359
|
default_initial_value = (block and block.arity == 0) ? yield : nil
|
360
360
|
states_hash = (states.last.is_a? Hash) ? states.pop : {}
|
361
361
|
states.each { |name| states_hash[name] = default_initial_value }
|
@@ -365,7 +365,7 @@ module React
|
|
365
365
|
define_state_methods(singleton_class, name, self, &block)
|
366
366
|
end
|
367
367
|
end
|
368
|
-
|
368
|
+
|
369
369
|
def define_state_methods(this, name, from = nil, &block)
|
370
370
|
this.define_method("#{name}") do
|
371
371
|
React::State.get_state(from || self, name)
|
@@ -385,36 +385,36 @@ module React
|
|
385
385
|
current_state = React::State.get_state(from || self, name)
|
386
386
|
yield name, React::State.get_state(from || self, name), current_state if block and block.arity > 0
|
387
387
|
React::State.set_state(from || self, name, current_state)
|
388
|
-
React::Observable.new(current_state) do |new_value|
|
388
|
+
React::Observable.new(current_state) do |new_value|
|
389
389
|
yield name, React::State.get_state(from || self, name), new_value if block and block.arity > 0
|
390
390
|
React::State.set_state(from || self, name, new_value)
|
391
391
|
end
|
392
392
|
end
|
393
393
|
end
|
394
394
|
end
|
395
|
-
|
395
|
+
|
396
396
|
def native_mixin(item)
|
397
397
|
native_mixins << item
|
398
398
|
end
|
399
|
-
|
399
|
+
|
400
400
|
def native_mixins
|
401
401
|
@native_mixins ||= []
|
402
402
|
end
|
403
|
-
|
403
|
+
|
404
404
|
def static_call_back(name, &block)
|
405
405
|
static_call_backs[name] = block
|
406
406
|
end
|
407
|
-
|
407
|
+
|
408
408
|
def static_call_backs
|
409
409
|
@static_call_backs ||= {}
|
410
410
|
end
|
411
|
-
|
411
|
+
|
412
412
|
def export_component(opts = {})
|
413
413
|
export_name = (opts[:as] || name).split("::")
|
414
414
|
first_name = export_name.first
|
415
415
|
Native(`window`)[first_name] = add_item_to_tree(Native(`window`)[first_name], [React::API.create_native_react_class(self)] + export_name[1..-1].reverse).to_n
|
416
416
|
end
|
417
|
-
|
417
|
+
|
418
418
|
def add_item_to_tree(current_tree, new_item)
|
419
419
|
if Native(current_tree).class != Native::Object or new_item.length == 1
|
420
420
|
new_item.inject do |memo, sub_name| {sub_name => memo} end
|
@@ -423,7 +423,7 @@ module React
|
|
423
423
|
current_tree
|
424
424
|
end
|
425
425
|
end
|
426
|
-
|
426
|
+
|
427
427
|
end
|
428
428
|
|
429
429
|
module API
|
@@ -469,6 +469,6 @@ module React
|
|
469
469
|
}
|
470
470
|
end
|
471
471
|
end
|
472
|
-
|
472
|
+
|
473
473
|
end
|
474
474
|
end
|
data/lib/reactive-ruby/state.rb
CHANGED
@@ -1,33 +1,46 @@
|
|
1
1
|
module React
|
2
|
-
|
2
|
+
|
3
3
|
class State
|
4
|
-
|
4
|
+
|
5
5
|
class << self
|
6
|
-
|
6
|
+
|
7
7
|
attr_reader :current_observer
|
8
|
-
|
8
|
+
|
9
9
|
def initialize_states(object, initial_values) # initialize objects' name/value pairs
|
10
10
|
states[object].merge!(initial_values || {})
|
11
11
|
end
|
12
12
|
|
13
|
-
def get_state(object, name, current_observer = @current_observer)
|
13
|
+
def get_state(object, name, current_observer = @current_observer)
|
14
14
|
# get current value of name for object, remember that the current object depends on this state, current observer can be overriden with last param
|
15
15
|
new_observers[current_observer][object] << name if current_observer and !new_observers[current_observer][object].include? name
|
16
16
|
states[object][name]
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
states[object][name] = value
|
19
|
+
def set_state2(object, name, value) # set object's name state to value, tell all observers it has changed. Observers must implement update_react_js_state
|
21
20
|
observers_by_name[object][name].dup.each do |observer|
|
22
21
|
observer.update_react_js_state(object, name, value)
|
23
22
|
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_state(object, name, value)
|
26
|
+
states[object][name] = value
|
27
|
+
if name == "!CHANGED!" and @current_observer
|
28
|
+
puts "changing !CHANGED! to #{value} with a current observer - actual change will be delayed"
|
29
|
+
after(0.01) do
|
30
|
+
value = "#{value}@#{Time.now}"
|
31
|
+
puts "NOW setting !CHANGED! to #{value}"
|
32
|
+
set_state2(object, name, value)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
set_state2(object, name, value)
|
36
|
+
end
|
24
37
|
value
|
25
38
|
end
|
26
|
-
|
39
|
+
|
27
40
|
def will_be_observing?(object, name, current_observer)
|
28
41
|
current_observer and new_observers[current_observer][object].include?(name)
|
29
42
|
end
|
30
|
-
|
43
|
+
|
31
44
|
def is_observing?(object, name, current_observer)
|
32
45
|
current_observer and observers_by_name[object][name].include?(current_observer)
|
33
46
|
end
|
@@ -35,7 +48,7 @@ module React
|
|
35
48
|
def update_states_to_observe(current_observer = @current_observer) # should be called after the last after_render callback, currently called after components render method
|
36
49
|
raise "update_states_to_observer called outside of watch block" unless current_observer
|
37
50
|
current_observers[current_observer].each do |object, names|
|
38
|
-
names.each do |name|
|
51
|
+
names.each do |name|
|
39
52
|
observers_by_name[object][name].delete(current_observer)
|
40
53
|
end
|
41
54
|
end
|
@@ -47,11 +60,11 @@ module React
|
|
47
60
|
end
|
48
61
|
end
|
49
62
|
end
|
50
|
-
|
63
|
+
|
51
64
|
def remove # call after component is unmounted
|
52
65
|
raise "remove called outside of watch block" unless @current_observer
|
53
66
|
current_observers[@current_observer].each do |object, names|
|
54
|
-
names.each do |name|
|
67
|
+
names.each do |name|
|
55
68
|
observers_by_name[object][name].delete(@current_observer)
|
56
69
|
end
|
57
70
|
end
|
@@ -66,25 +79,25 @@ module React
|
|
66
79
|
@current_observer = saved_current_observer
|
67
80
|
return_value
|
68
81
|
end
|
69
|
-
|
82
|
+
|
70
83
|
def states
|
71
|
-
@states ||= Hash.new { |h, k| h[k] = {} }
|
84
|
+
@states ||= Hash.new { |h, k| h[k] = {} }
|
72
85
|
end
|
73
|
-
|
86
|
+
|
74
87
|
def new_observers
|
75
88
|
@new_observers ||= Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = [] } }
|
76
89
|
end
|
77
|
-
|
90
|
+
|
78
91
|
def current_observers
|
79
92
|
@current_observers ||= Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = [] } }
|
80
93
|
end
|
81
|
-
|
94
|
+
|
82
95
|
def observers_by_name
|
83
96
|
@observers_by_name ||= Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = [] } }
|
84
97
|
end
|
85
|
-
|
98
|
+
|
86
99
|
end
|
87
|
-
|
100
|
+
|
88
101
|
end
|
89
|
-
|
90
|
-
end
|
102
|
+
|
103
|
+
end
|
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.18
|
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-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opal
|