reactive-ruby 0.7.28 → 0.7.29

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +6 -0
  3. data/Gemfile.lock +4 -1
  4. data/README.md +132 -68
  5. data/Rakefile +5 -2
  6. data/example/examples/Gemfile +0 -2
  7. data/example/rails-tutorial/Gemfile +3 -2
  8. data/lib/generators/reactive_ruby/test_app/templates/application.rb +11 -0
  9. data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/application.rb +2 -0
  10. data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb +3 -0
  11. data/lib/generators/reactive_ruby/test_app/templates/boot.rb +6 -0
  12. data/lib/generators/reactive_ruby/test_app/templates/script/rails +5 -0
  13. data/lib/generators/reactive_ruby/test_app/templates/views/components/hello_world.rb +11 -0
  14. data/lib/generators/reactive_ruby/test_app/templates/views/components/todo.rb +14 -0
  15. data/lib/generators/reactive_ruby/test_app/test_app_generator.rb +105 -0
  16. data/lib/rails-helpers/top_level_rails_component.rb +9 -16
  17. data/lib/{reactive-ruby → react}/api.rb +8 -65
  18. data/lib/{reactive-ruby → react}/callbacks.rb +0 -0
  19. data/lib/react/component.rb +266 -0
  20. data/lib/react/component/api.rb +48 -0
  21. data/lib/react/component/class_methods.rb +183 -0
  22. data/lib/{reactive-ruby → react}/element.rb +10 -11
  23. data/lib/{reactive-ruby → react}/event.rb +0 -0
  24. data/lib/{reactive-ruby → react}/ext/hash.rb +0 -0
  25. data/lib/{reactive-ruby → react}/ext/string.rb +0 -0
  26. data/lib/react/native_library.rb +57 -0
  27. data/lib/{reactive-ruby → react}/observable.rb +0 -4
  28. data/lib/{reactive-ruby → react}/rendering_context.rb +0 -6
  29. data/lib/{reactive-ruby → react}/state.rb +3 -6
  30. data/lib/{reactive-ruby → react}/top_level.rb +2 -3
  31. data/lib/react/validator.rb +127 -0
  32. data/lib/reactive-ruby.rb +20 -20
  33. data/lib/reactive-ruby/version.rb +1 -1
  34. data/{opal-spec/reactjs → spec}/index.html.erb +1 -1
  35. data/{opal-spec → spec/react}/callbacks_spec.rb +8 -9
  36. data/{opal-spec → spec/react}/component_spec.rb +170 -120
  37. data/spec/react/dsl_spec.rb +16 -0
  38. data/{opal-spec → spec/react}/element_spec.rb +7 -20
  39. data/{opal-spec → spec/react}/event_spec.rb +3 -1
  40. data/spec/react/native_library_spec.rb +10 -0
  41. data/spec/react/param_declaration_spec.rb +18 -0
  42. data/{opal-spec → spec/react}/react_spec.rb +3 -2
  43. data/spec/react/react_state_spec.rb +22 -0
  44. data/spec/react/top_level_component_spec.rb +68 -0
  45. data/{opal-spec → spec/react}/tutorial/tutorial_spec.rb +11 -13
  46. data/{opal-spec → spec/react}/validator_spec.rb +50 -4
  47. data/spec/reactive-ruby/isomorphic_helpers_spec.rb +22 -4
  48. data/spec/spec_helper.rb +51 -0
  49. data/spec/support/react/spec_helpers.rb +57 -0
  50. data/spec/vendor/es5-shim.min.js +6 -0
  51. metadata +56 -24
  52. data/lib/reactive-ruby/component.rb +0 -502
  53. data/lib/reactive-ruby/validator.rb +0 -99
  54. data/old-readme +0 -220
  55. data/opal-spec/spec_helper.rb +0 -29
data/lib/reactive-ruby.rb CHANGED
@@ -1,25 +1,25 @@
1
1
  if RUBY_ENGINE == 'opal'
2
- require "sources/react.js"
3
- require "reactive-ruby/top_level"
4
- require "reactive-ruby/component"
5
- require "reactive-ruby/element"
6
- require "reactive-ruby/event"
7
- require "reactive-ruby/version"
8
- require "reactive-ruby/api"
9
- require "reactive-ruby/validator"
10
- require "reactive-ruby/observable"
11
- require "reactive-ruby/rendering_context"
12
- require "reactive-ruby/state"
13
- require "reactive-ruby/isomorphic_helpers"
14
- require "rails-helpers/top_level_rails_component"
2
+ require 'sources/react.js'
3
+ require 'react/top_level'
4
+ require 'react/component'
5
+ require 'react/element'
6
+ require 'react/event'
7
+ require 'react/api'
8
+ require 'react/validator'
9
+ require 'react/observable'
10
+ require 'react/rendering_context'
11
+ require 'react/state'
12
+ require 'reactive-ruby/isomorphic_helpers'
13
+ require 'rails-helpers/top_level_rails_component'
14
+ require 'reactive-ruby/version'
15
15
  else
16
- require "opal"
17
- require "opal-browser"
18
- require "opal-activesupport"
19
- require "reactive-ruby/version"
20
- require "reactive-ruby/rails" if defined?(Rails)
21
- require "reactive-ruby/isomorphic_helpers"
22
- require "reactive-ruby/serializers"
16
+ require 'opal'
17
+ require 'opal-browser'
18
+ require 'opal-activesupport'
19
+ require 'reactive-ruby/version'
20
+ require 'reactive-ruby/rails' if defined?(Rails)
21
+ require 'reactive-ruby/isomorphic_helpers'
22
+ require 'reactive-ruby/serializers'
23
23
 
24
24
  Opal.append_path File.expand_path('../', __FILE__).untaint
25
25
  end
@@ -1,3 +1,3 @@
1
1
  module React
2
- VERSION = "0.7.28"
2
+ VERSION = "0.7.29"
3
3
  end
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  </head>
5
5
  <body>
6
- <%= javascript_include_tag 'react' %>
6
+ <%= javascript_include_tag 'es5-shim.min' %>
7
7
  <%= javascript_include_tag @server.main %>
8
8
  <div id="placeholder" style="display: none"></div>
9
9
  <div id="render_here"></div>
@@ -1,17 +1,15 @@
1
- require "spec_helper"
2
- require "react/callbacks"
1
+ require 'spec_helper'
3
2
 
3
+ if opal?
4
4
  describe React::Callbacks do
5
- it "should be able to define callback" do
5
+ it 'defines callback' do
6
6
  stub_const 'Foo', Class.new
7
7
  Foo.class_eval do
8
8
  include React::Callbacks
9
9
  define_callback :before_dinner
10
-
11
10
  before_dinner :wash_hand
12
11
 
13
12
  def wash_hand
14
-
15
13
  end
16
14
  end
17
15
 
@@ -19,7 +17,7 @@ describe React::Callbacks do
19
17
  Foo.new.run_callback(:before_dinner)
20
18
  end
21
19
 
22
- it "should be able to define multiple callbacks" do
20
+ it 'defines multiple callbacks' do
23
21
  stub_const 'Foo', Class.new
24
22
  Foo.class_eval do
25
23
  include React::Callbacks
@@ -37,7 +35,7 @@ describe React::Callbacks do
37
35
  Foo.new.run_callback(:before_dinner)
38
36
  end
39
37
 
40
- it "should be able to define block callback" do
38
+ it 'defines block callback' do
41
39
  stub_const 'Foo', Class.new
42
40
  Foo.class_eval do
43
41
  include React::Callbacks
@@ -60,7 +58,7 @@ describe React::Callbacks do
60
58
  expect(foo.b).to eq(20)
61
59
  end
62
60
 
63
- it "should be able to define multiple callback group" do
61
+ it 'defines multiple callback group' do
64
62
  stub_const 'Foo', Class.new
65
63
  Foo.class_eval do
66
64
  include React::Callbacks
@@ -80,7 +78,7 @@ describe React::Callbacks do
80
78
  expect(foo.a).to eq(10)
81
79
  end
82
80
 
83
- it "should be able to receive args as callback" do
81
+ it 'receives args as callback' do
84
82
  stub_const 'Foo', Class.new
85
83
  Foo.class_eval do
86
84
  include React::Callbacks
@@ -105,3 +103,4 @@ describe React::Callbacks do
105
103
  expect(foo.lorem).to eq('1-2')
106
104
  end
107
105
  end
106
+ end
@@ -1,46 +1,47 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
+ if opal?
3
4
  describe React::Component do
4
5
  after(:each) do
5
6
  React::API.clear_component_class_cache
6
7
  end
7
8
 
8
- it "should define component spec methods" do
9
+ it 'defines component spec methods' do
9
10
  stub_const 'Foo', Class.new
10
11
  Foo.class_eval do
11
12
  include React::Component
12
13
  def render
13
- React.create_element("div")
14
+ React.create_element('div')
14
15
  end
15
16
  end
16
17
 
17
18
  # Class Methods
18
- expect(Foo).to respond_to("initial_state")
19
- expect(Foo).to respond_to("default_props")
20
- expect(Foo).to respond_to("prop_types")
19
+ expect(Foo).to respond_to('initial_state')
20
+ expect(Foo).to respond_to('default_props')
21
+ expect(Foo).to respond_to('prop_types')
21
22
 
22
23
  # Instance method
23
- expect(Foo.new).to respond_to("component_will_mount")
24
- expect(Foo.new).to respond_to("component_did_mount")
25
- expect(Foo.new).to respond_to("component_will_receive_props")
26
- expect(Foo.new).to respond_to("should_component_update?")
27
- expect(Foo.new).to respond_to("component_will_update")
28
- expect(Foo.new).to respond_to("component_did_update")
29
- expect(Foo.new).to respond_to("component_will_unmount")
24
+ expect(Foo.new).to respond_to('component_will_mount')
25
+ expect(Foo.new).to respond_to('component_did_mount')
26
+ expect(Foo.new).to respond_to('component_will_receive_props')
27
+ expect(Foo.new).to respond_to('should_component_update?')
28
+ expect(Foo.new).to respond_to('component_will_update')
29
+ expect(Foo.new).to respond_to('component_did_update')
30
+ expect(Foo.new).to respond_to('component_will_unmount')
30
31
  end
31
32
 
32
- describe "Life Cycle" do
33
+ describe 'Life Cycle' do
33
34
  before(:each) do
34
35
  stub_const 'Foo', Class.new
35
36
  Foo.class_eval do
36
37
  include React::Component
37
38
  def render
38
- React.create_element("div") { "lorem" }
39
+ React.create_element('div') { 'lorem' }
39
40
  end
40
41
  end
41
42
  end
42
43
 
43
- it "should invoke `before_mount` registered methods when `componentWillMount()`" do
44
+ it 'invokes `before_mount` registered methods when `componentWillMount()`' do
44
45
  Foo.class_eval do
45
46
  before_mount :bar, :bar2
46
47
  def bar; end
@@ -53,7 +54,7 @@ describe React::Component do
53
54
  renderToDocument(Foo)
54
55
  end
55
56
 
56
- it "should invoke `after_mount` registered methods when `componentDidMount()`" do
57
+ it 'invokes `after_mount` registered methods when `componentDidMount()`' do
57
58
  Foo.class_eval do
58
59
  after_mount :bar3, :bar4
59
60
  def bar3; end
@@ -66,7 +67,7 @@ describe React::Component do
66
67
  renderToDocument(Foo)
67
68
  end
68
69
 
69
- it "should allow multiple class declared life cycle hooker" do
70
+ it 'allows multiple class declared life cycle hooker' do
70
71
  stub_const 'FooBar', Class.new
71
72
  Foo.class_eval do
72
73
  before_mount :bar
@@ -78,7 +79,7 @@ describe React::Component do
78
79
  after_mount :bar2
79
80
  def bar2; end
80
81
  def render
81
- React.create_element("div") { "lorem" }
82
+ React.create_element('div') { 'lorem' }
82
83
  end
83
84
  end
84
85
 
@@ -87,45 +88,45 @@ describe React::Component do
87
88
  renderToDocument(Foo)
88
89
  end
89
90
 
90
- it "should allow block for life cycle callback" do
91
+ it 'allows block for life cycle callback' do
91
92
  Foo.class_eval do
92
- define_state(:foo)
93
+ export_state(:foo)
93
94
 
94
95
  before_mount do
95
- self.foo = "bar"
96
+ foo! 'bar'
96
97
  end
97
98
  end
98
99
 
99
100
  element = renderToDocument(Foo)
100
- expect(element.state.foo).to be("bar")
101
+ expect(Foo.foo).to be('bar')
101
102
  end
102
103
  end
103
104
 
104
- describe "State setter & getter" do
105
+ describe 'State setter & getter' do
105
106
  before(:each) do
106
107
  stub_const 'Foo', Class.new
107
108
  Foo.class_eval do
108
109
  include React::Component
109
110
  def render
110
- React.create_element("div") { "lorem" }
111
+ React.create_element('div') { 'lorem' }
111
112
  end
112
113
  end
113
114
  end
114
115
 
115
- it "should define setter using `define_state`" do
116
+ it 'defines setter using `define_state`' do
116
117
  Foo.class_eval do
117
118
  define_state :foo
118
119
  before_mount :set_up
119
120
  def set_up
120
- self.foo = "bar"
121
+ self.foo = 'bar'
121
122
  end
122
123
  end
123
124
 
124
125
  element = renderToDocument(Foo)
125
- expect(element.state.foo).to be("bar")
126
+ expect(element.state.foo).to be('bar')
126
127
  end
127
128
 
128
- it "should define init state by passing a block to `define_state`" do
129
+ it 'defines init state by passing a block to `define_state`' do
129
130
  Foo.class_eval do
130
131
  define_state(:foo) { 10 }
131
132
  end
@@ -134,7 +135,7 @@ describe React::Component do
134
135
  expect(element.state.foo).to be(10)
135
136
  end
136
137
 
137
- it "should define getter using `define_state`" do
138
+ it 'defines getter using `define_state`' do
138
139
  Foo.class_eval do
139
140
  define_state(:foo) { 10 }
140
141
  before_mount :bump
@@ -147,7 +148,7 @@ describe React::Component do
147
148
  expect(element.state.foo).to be(30)
148
149
  end
149
150
 
150
- it "should define multiple state accessor by passing symols array to `define_state`" do
151
+ it 'defines multiple state accessors by passing array to `define_state`' do
151
152
  Foo.class_eval do
152
153
  define_state :foo, :foo2
153
154
  before_mount :set_up
@@ -162,7 +163,7 @@ describe React::Component do
162
163
  expect(element.state.foo2).to be(20)
163
164
  end
164
165
 
165
- it "should invoke `define_state` multiple times to define states" do
166
+ it 'invokes `define_state` multiple times to define states' do
166
167
  Foo.class_eval do
167
168
  define_state(:foo) { 30 }
168
169
  define_state(:foo2) { 40 }
@@ -173,54 +174,66 @@ describe React::Component do
173
174
  expect(element.state.foo2).to be(40)
174
175
  end
175
176
 
176
- it "should raise error if multiple states and block given at the same time" do
177
- expect {
178
- Foo.class_eval do
179
- define_state(:foo, :foo2) { 30 }
180
- end
181
- }.to raise_error
177
+ it 'can initialize multiple state variables with a block' do
178
+ Foo.class_eval do
179
+ define_state(:foo, :foo2) { 30 }
180
+ end
181
+ element = renderToDocument(Foo)
182
+ expect(element.state.foo).to be(30)
183
+ expect(element.state.foo2).to be(30)
184
+ end
185
+
186
+ it 'can mix multiple state variables with initializers and a block' do
187
+ Foo.class_eval do
188
+ define_state(:x, :y, foo: 1, bar: 2) {3}
189
+ end
190
+ element = renderToDocument(Foo)
191
+ expect(element.state.x).to be(3)
192
+ expect(element.state.y).to be(3)
193
+ expect(element.state.foo).to be(1)
194
+ expect(element.state.bar).to be(2)
182
195
  end
183
196
 
184
- it "should get state in render method" do
197
+ it 'gets state in render method' do
185
198
  Foo.class_eval do
186
199
  define_state(:foo) { 10 }
187
200
  def render
188
- React.create_element("div") { self.foo }
201
+ React.create_element('div') { self.foo }
189
202
  end
190
203
  end
191
204
 
192
205
  element = renderToDocument(Foo)
193
- expect(element.getDOMNode.textContent).to eq("10")
206
+ expect(element.getDOMNode.textContent).to eq('10')
194
207
  end
195
208
 
196
- it "should support original `setState` as `set_state` method" do
209
+ it 'supports original `setState` as `set_state` method' do
197
210
  Foo.class_eval do
198
211
  before_mount do
199
- self.set_state(foo: "bar")
212
+ self.set_state(foo: 'bar')
200
213
  end
201
214
  end
202
215
 
203
216
  element = renderToDocument(Foo)
204
- expect(element.state.foo).to be("bar")
217
+ expect(element.state.foo).to be('bar')
205
218
  end
206
219
 
207
- it "should support original `replaceState` as `set_state!` method" do
220
+ it 'supports original `replaceState` as `set_state!` method' do
208
221
  Foo.class_eval do
209
222
  before_mount do
210
- self.set_state(foo: "bar")
211
- self.set_state!(bar: "lorem")
223
+ self.set_state(foo: 'bar')
224
+ self.set_state!(bar: 'lorem')
212
225
  end
213
226
  end
214
227
 
215
228
  element = renderToDocument(Foo)
216
229
  expect(element.state.foo).to be_nil
217
- expect(element.state.bar).to eq("lorem")
230
+ expect(element.state.bar).to eq('lorem')
218
231
  end
219
232
 
220
- it "should support originl `state` method" do
233
+ it 'supports original `state` method' do
221
234
  Foo.class_eval do
222
235
  before_mount do
223
- self.set_state(foo: "bar")
236
+ self.set_state(foo: 'bar')
224
237
  end
225
238
 
226
239
  def render
@@ -228,15 +241,15 @@ describe React::Component do
228
241
  end
229
242
  end
230
243
 
231
- expect(React.render_to_static_markup(React.create_element(Foo))).to eq("<div>bar</div>")
244
+ expect(React.render_to_static_markup(React.create_element(Foo))).to eq('<div>bar</div>')
232
245
  end
233
246
 
234
- it "should transform state getter to Ruby object" do
247
+ it 'transforms state getter to Ruby object' do
235
248
  Foo.class_eval do
236
249
  define_state :foo
237
250
 
238
251
  before_mount do
239
- self.foo = [{a: 10}]
252
+ self.foo = [{a: "Hello"}]
240
253
  end
241
254
 
242
255
  def render
@@ -244,12 +257,12 @@ describe React::Component do
244
257
  end
245
258
  end
246
259
 
247
- expect(React.render_to_static_markup(React.create_element(Foo))).to eq("<div>10</div>")
260
+ expect(React.render_to_static_markup(React.create_element(Foo))).to eq('<div>Hello</div>')
248
261
  end
249
262
  end
250
263
 
251
- describe "Props" do
252
- describe "this.props could be accessed through `params` method" do
264
+ describe 'Props' do
265
+ describe 'this.props could be accessed through `params` method' do
253
266
  before do
254
267
  stub_const 'Foo', Class.new
255
268
  Foo.class_eval do
@@ -257,30 +270,30 @@ describe React::Component do
257
270
  end
258
271
  end
259
272
 
260
- it "should read from parent passed properties through `params`" do
273
+ it 'reads from parent passed properties through `params`' do
261
274
  Foo.class_eval do
262
275
  def render
263
- React.create_element("div") { params[:prop] }
276
+ React.create_element('div') { params[:prop] }
264
277
  end
265
278
  end
266
279
 
267
- element = renderToDocument(Foo, prop: "foobar")
268
- expect(element.getDOMNode.textContent).to eq("foobar")
280
+ element = renderToDocument(Foo, prop: 'foobar')
281
+ expect(element.getDOMNode.textContent).to eq('foobar')
269
282
  end
270
283
 
271
- it "should access nested params as orignal Ruby object" do
284
+ it 'accesses nested params as orignal Ruby object' do
272
285
  Foo.class_eval do
273
286
  def render
274
- React.create_element("div") { params[:prop][0][:foo] }
287
+ React.create_element('div') { params[:prop][0][:foo] }
275
288
  end
276
289
  end
277
290
 
278
291
  element = renderToDocument(Foo, prop: [{foo: 10}])
279
- expect(element.getDOMNode.textContent).to eq("10")
292
+ expect(element.getDOMNode.textContent).to eq('10')
280
293
  end
281
294
  end
282
295
 
283
- describe "Props Updating" do
296
+ describe 'Props Updating' do
284
297
  before do
285
298
  stub_const 'Foo', Class.new
286
299
  Foo.class_eval do
@@ -288,32 +301,32 @@ describe React::Component do
288
301
  end
289
302
  end
290
303
 
291
- it "should support original `setProps` as method `set_props`" do
304
+ it 'supports original `setProps` as method `set_props`' do
292
305
  Foo.class_eval do
293
306
  def render
294
- React.create_element("div") { params[:foo] }
307
+ React.create_element('div') { params[:foo] }
295
308
  end
296
309
  end
297
310
 
298
311
  element = renderToDocument(Foo, {foo: 10})
299
312
  element.set_props(foo: 20)
300
- expect(element.dom_node.innerHTML).to eq('20')
313
+ expect(`#{element.dom_node}.innerHTML`).to eq('20')
301
314
  end
302
315
 
303
- it "should support original `replaceProps` as method `set_props!`" do
316
+ it 'supports original `replaceProps` as method `set_props!`' do
304
317
  Foo.class_eval do
305
318
  def render
306
- React.create_element("div") { params[:foo] ? "exist" : "null" }
319
+ React.create_element('div') { params[:foo] ? 'exist' : 'null' }
307
320
  end
308
321
  end
309
322
 
310
323
  element = renderToDocument(Foo, {foo: 10})
311
324
  element.set_props!(bar: 20)
312
- expect(element.dom_node.innerHTML).to eq('null')
325
+ expect(element.getDOMNode.innerHTML).to eq('null')
313
326
  end
314
327
  end
315
328
 
316
- describe "Prop validation" do
329
+ describe 'Prop validation' do
317
330
  before do
318
331
  stub_const 'Foo', Class.new
319
332
  Foo.class_eval do
@@ -321,7 +334,7 @@ describe React::Component do
321
334
  end
322
335
  end
323
336
 
324
- it "should specify validation rules using `params` class method" do
337
+ it 'specifies validation rules using `params` class method' do
325
338
  Foo.class_eval do
326
339
  params do
327
340
  requires :foo, type: String
@@ -332,7 +345,7 @@ describe React::Component do
332
345
  expect(Foo.prop_types).to have_key(:_componentValidator)
333
346
  end
334
347
 
335
- it "should log error in warning if validation failed" do
348
+ it 'logs error in warning if validation failed' do
336
349
  stub_const 'Lorem', Class.new
337
350
  Foo.class_eval do
338
351
  params do
@@ -351,10 +364,10 @@ describe React::Component do
351
364
  }
352
365
  renderToDocument(Foo, bar: 10, lorem: Lorem.new)
353
366
  `window.console = org_console;`
354
- expect(`log`).to eq(["Warning: Failed propType: In component `Foo`\nRequired prop `foo` was not specified\nProvided prop `bar` was not the specified type `String`"])
367
+ expect(`log`).to eq(["Warning: Failed propType: In component `Foo`\nRequired prop `foo` was not specified\nProvided prop `bar` could not be converted to String"])
355
368
  end
356
369
 
357
- it "should not log anything if validation pass" do
370
+ it 'should not log anything if validation pass' do
358
371
  stub_const 'Lorem', Class.new
359
372
  Foo.class_eval do
360
373
  params do
@@ -371,34 +384,34 @@ describe React::Component do
371
384
  var org_console = window.console;
372
385
  window.console = {warn: function(str){log.push(str)}}
373
386
  }
374
- renderToDocument(Foo, foo: 10, bar: "10", lorem: Lorem.new)
387
+ renderToDocument(Foo, foo: 10, bar: '10', lorem: Lorem.new)
375
388
  `window.console = org_console;`
376
389
  expect(`log`).to eq([])
377
390
  end
378
391
  end
379
392
 
380
- describe "Default props" do
381
- it "should set default props using validation helper" do
393
+ describe 'Default props' do
394
+ it 'sets default props using validation helper' do
382
395
  stub_const 'Foo', Class.new
383
396
  Foo.class_eval do
384
397
  include React::Component
385
398
  params do
386
- optional :foo, default: "foo"
387
- optional :bar, default: "bar"
399
+ optional :foo, default: 'foo'
400
+ optional :bar, default: 'bar'
388
401
  end
389
402
 
390
403
  def render
391
- div { params[:foo] + "-" + params[:bar]}
404
+ div { params[:foo] + '-' + params[:bar]}
392
405
  end
393
406
  end
394
407
 
395
- expect(React.render_to_static_markup(React.create_element(Foo, foo: "lorem"))).to eq("<div>lorem-bar</div>")
396
- expect(React.render_to_static_markup(React.create_element(Foo))).to eq("<div>foo-bar</div>")
408
+ expect(React.render_to_static_markup(React.create_element(Foo, foo: 'lorem'))).to eq('<div>lorem-bar</div>')
409
+ expect(React.render_to_static_markup(React.create_element(Foo))).to eq('<div>foo-bar</div>')
397
410
  end
398
411
  end
399
412
  end
400
413
 
401
- describe "Event handling" do
414
+ describe 'Event handling' do
402
415
  before do
403
416
  stub_const 'Foo', Class.new
404
417
  Foo.class_eval do
@@ -406,12 +419,12 @@ describe React::Component do
406
419
  end
407
420
  end
408
421
 
409
- it "should work in render method" do
422
+ it 'works in render method' do
410
423
  Foo.class_eval do
411
424
  define_state(:clicked) { false }
412
425
 
413
426
  def render
414
- React.create_element("div").on(:click) do
427
+ React.create_element('div').on(:click) do
415
428
  self.clicked = true
416
429
  end
417
430
  end
@@ -423,46 +436,46 @@ describe React::Component do
423
436
  expect(instance.state.clicked).to eq(true)
424
437
  end
425
438
 
426
- it "should invoke handler on `this.props` using emit" do
439
+ it 'invokes handler on `this.props` using emit' do
427
440
  Foo.class_eval do
428
441
  after_mount :setup
429
442
 
430
443
  def setup
431
- self.emit(:foo_submit, "bar")
444
+ self.emit(:foo_submit, 'bar')
432
445
  end
433
446
 
434
447
  def render
435
- React.create_element("div")
448
+ React.create_element('div')
436
449
  end
437
450
  end
438
451
 
439
452
  expect { |b|
440
453
  element = React.create_element(Foo).on(:foo_submit, &b)
441
454
  renderElementToDocument(element)
442
- }.to yield_with_args("bar")
455
+ }.to yield_with_args('bar')
443
456
  end
444
457
 
445
- it "should invoke handler with multiple params using emit" do
458
+ it 'invokes handler with multiple params using emit' do
446
459
  Foo.class_eval do
447
460
  after_mount :setup
448
461
 
449
462
  def setup
450
- self.emit(:foo_invoked, [1,2,3], "bar")
463
+ self.emit(:foo_invoked, [1,2,3], 'bar')
451
464
  end
452
465
 
453
466
  def render
454
- React.create_element("div")
467
+ React.create_element('div')
455
468
  end
456
469
  end
457
470
 
458
471
  expect { |b|
459
472
  element = React.create_element(Foo).on(:foo_invoked, &b)
460
473
  renderElementToDocument(element)
461
- }.to yield_with_args([1,2,3], "bar")
474
+ }.to yield_with_args([1,2,3], 'bar')
462
475
  end
463
476
  end
464
477
 
465
- describe "Refs" do
478
+ describe '#refs' do
466
479
  before do
467
480
  stub_const 'Foo', Class.new
468
481
  Foo.class_eval do
@@ -470,10 +483,10 @@ describe React::Component do
470
483
  end
471
484
  end
472
485
 
473
- it "should correctly assign refs" do
486
+ it 'correctly assigns refs' do
474
487
  Foo.class_eval do
475
488
  def render
476
- React.create_element("input", type: :text, ref: :field)
489
+ React.create_element('input', type: :text, ref: :field)
477
490
  end
478
491
  end
479
492
 
@@ -481,11 +494,11 @@ describe React::Component do
481
494
  expect(element.refs.field).not_to be_nil
482
495
  end
483
496
 
484
- it "should access refs through `refs` method" do
497
+ it 'accesses refs through `refs` method' do
485
498
  Foo.class_eval do
486
499
  def render
487
- React.create_element("input", type: :text, ref: :field).on(:click) do
488
- refs[:field].value = "some_stuff"
500
+ React.create_element('input', type: :text, ref: :field).on(:click) do
501
+ refs[:field].value = 'some_stuff'
489
502
  end
490
503
  end
491
504
  end
@@ -493,12 +506,12 @@ describe React::Component do
493
506
  element = renderToDocument(Foo)
494
507
  simulateEvent(:click, element)
495
508
 
496
- expect(element.refs.field.value).to eq("some_stuff")
509
+ expect(element.refs.field.value).to eq('some_stuff')
497
510
  end
498
511
  end
499
512
 
500
- describe "Render" do
501
- it "should support element building helpers" do
513
+ describe '#render' do
514
+ it 'supports element building helpers' do
502
515
  stub_const 'Foo', Class.new
503
516
  Foo.class_eval do
504
517
  include React::Component
@@ -515,15 +528,15 @@ describe React::Component do
515
528
  include React::Component
516
529
  def render
517
530
  div do
518
- present Foo, foo: "astring"
531
+ present Foo, foo: 'astring'
519
532
  end
520
533
  end
521
534
  end
522
535
 
523
- expect(React.render_to_static_markup(React.create_element(Bar))).to eq("<div><div><span>astring</span></div></div>")
536
+ expect(React.render_to_static_markup(React.create_element(Bar))).to eq('<div><div><span>astring</span></div></div>')
524
537
  end
525
538
 
526
- it "should build single node in top-level render without providing a block" do
539
+ it 'builds single node in top-level render without providing a block' do
527
540
  stub_const 'Foo', Class.new
528
541
  Foo.class_eval do
529
542
  include React::Component
@@ -534,38 +547,39 @@ describe React::Component do
534
547
  end
535
548
 
536
549
  element = React.create_element(Foo)
537
- expect(React.render_to_static_markup(element)).to eq("<div></div>")
550
+ expect(React.render_to_static_markup(element)).to eq('<div></div>')
538
551
  end
539
552
 
540
- it "should redefine `p` to make method missing work" do
553
+ it 'redefines `p` to make method missing work' do
541
554
  stub_const 'Foo', Class.new
542
555
  Foo.class_eval do
543
556
  include React::Component
544
557
 
545
558
  def render
546
- p(class_name: "foo") do
559
+ p(class_name: 'foo') do
547
560
  p
548
- div { "lorem ipsum" }
549
- p(id: "10")
561
+ div { 'lorem ipsum' }
562
+ p(id: '10')
550
563
  end
551
564
  end
552
565
  end
553
566
 
554
567
  element = React.create_element(Foo)
555
- expect(React.render_to_static_markup(element)).to eq("<p class=\"foo\"><p></p><div>lorem ipsum</div><p id=\"10\"></p></p>")
568
+ markup = '<p class="foo"><p></p><div>lorem ipsum</div><p id="10"></p></p>'
569
+ expect(React.render_to_static_markup(element)).to eq(markup)
556
570
  end
557
571
 
558
- it "should only override `p` in render context" do
572
+ it 'only overrides `p` in render context' do
559
573
  stub_const 'Foo', Class.new
560
574
  Foo.class_eval do
561
575
  include React::Component
562
576
 
563
577
  before_mount do
564
- p "first"
578
+ p 'first'
565
579
  end
566
580
 
567
581
  after_mount do
568
- p "second"
582
+ p 'second'
569
583
  end
570
584
 
571
585
  def render
@@ -573,20 +587,20 @@ describe React::Component do
573
587
  end
574
588
  end
575
589
 
576
- expect(Kernel).to receive(:p).with("first")
577
- expect(Kernel).to receive(:p).with("second")
590
+ expect(Kernel).to receive(:p).with('first')
591
+ expect(Kernel).to receive(:p).with('second')
578
592
  renderToDocument(Foo)
579
593
  end
580
594
  end
581
595
 
582
- describe "isMounted()" do
583
- it "should return true if after mounted" do
596
+ describe 'isMounted()' do
597
+ it 'returns true if after mounted' do
584
598
  stub_const 'Foo', Class.new
585
599
  Foo.class_eval do
586
600
  include React::Component
587
601
 
588
602
  def render
589
- React.create_element("div")
603
+ React.create_element('div')
590
604
  end
591
605
  end
592
606
 
@@ -594,4 +608,40 @@ describe React::Component do
594
608
  expect(component.mounted?).to eq(true)
595
609
  end
596
610
  end
611
+
612
+ describe '#children' do
613
+ before(:each) do
614
+ stub_const 'Foo', Class.new
615
+ Foo.class_eval do
616
+ include React::Component
617
+ export_state :the_children
618
+ before_mount do
619
+ the_children! children
620
+ end
621
+ def render
622
+ React.create_element('div') { 'lorem' }
623
+ end
624
+ end
625
+ end
626
+
627
+ it 'returns an Enumerable' do
628
+ ele = React.create_element(Foo) {
629
+ [React.create_element('a'), React.create_element('li')]
630
+ }
631
+ renderElementToDocument(ele)
632
+ nodes = Foo.the_children.map { |ele| ele.element_type }
633
+ expect(nodes).to eq(['a', 'li'])
634
+ end
635
+
636
+ it 'returns an Enumerator when not providing a block' do
637
+ ele = React.create_element(Foo) {
638
+ [React.create_element('a'), React.create_element('li')]
639
+ }
640
+ renderElementToDocument(ele)
641
+ nodes = Foo.the_children.each
642
+ expect(nodes).to be_a(Enumerator)
643
+ expect(nodes.size).to eq(2)
644
+ end
645
+ end
646
+ end
597
647
  end