hyper-react 0.10.0 → 0.11.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.
- checksums.yaml +4 -4
- data/.travis.yml +26 -4
- data/Appraisals +3 -2
- data/CHANGELOG.md +19 -0
- data/README.md +3 -3
- data/config.ru +2 -1
- data/gemfiles/opal_0.10_react_13.gemfile +13 -0
- data/gemfiles/opal_0.10_react_14.gemfile +13 -0
- data/gemfiles/opal_0.10_react_15.gemfile +13 -0
- data/gemfiles/opal_0.8_react_15.gemfile +1 -1
- data/gemfiles/opal_0.9_react_15.gemfile +1 -1
- data/hyper-react.gemspec +1 -1
- data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb +0 -1
- data/lib/hyper-react.rb +2 -1
- data/lib/react/api.rb +3 -2
- data/lib/react/component/class_methods.rb +2 -2
- data/lib/react/component/props_wrapper.rb +2 -2
- data/lib/react/element.rb +1 -1
- data/lib/react/ext/opal-jquery/element.rb +26 -0
- data/lib/react/state.rb +6 -5
- data/lib/react/test/matchers/render_html_matcher.rb +5 -0
- data/lib/react/test/session.rb +14 -23
- data/lib/react/test/utils.rb +25 -0
- data/lib/react/top_level.rb +12 -28
- data/lib/react/top_level_render.rb +29 -0
- data/lib/reactive-ruby/isomorphic_helpers.rb +2 -2
- data/lib/reactive-ruby/version.rb +1 -1
- data/spec/index.html.erb +1 -0
- data/spec/react/children_spec.rb +1 -1
- data/spec/react/component/base_spec.rb +2 -2
- data/spec/react/component_spec.rb +74 -73
- data/spec/react/dsl_spec.rb +24 -21
- data/spec/react/element_spec.rb +7 -7
- data/spec/react/event_spec.rb +2 -2
- data/spec/react/native_library_spec.rb +20 -24
- data/spec/react/observable_spec.rb +36 -1
- data/spec/react/opal_jquery_extensions_spec.rb +48 -46
- data/spec/react/param_declaration_spec.rb +8 -8
- data/spec/react/react_spec.rb +41 -28
- data/spec/react/test/rspec_spec.rb +1 -1
- data/spec/react/test/session_spec.rb +8 -20
- data/spec/react/test/utils_spec.rb +11 -28
- data/spec/react/top_level_component_spec.rb +7 -2
- data/spec/react/tutorial/tutorial_spec.rb +2 -2
- data/spec/reactive-ruby/component_loader_spec.rb +10 -4
- data/spec/reactive-ruby/isomorphic_helpers_spec.rb +6 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/support/react/spec_helpers.rb +1 -21
- metadata +12 -6
data/spec/react/dsl_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
if opal?
|
4
|
-
describe 'the React DSL' do
|
4
|
+
describe 'the React DSL', type: :component do
|
5
5
|
|
6
6
|
context "render macro" do
|
7
7
|
|
@@ -14,7 +14,7 @@ describe 'the React DSL' do
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
expect(
|
17
|
+
expect(Foo).to render_static_html('<div class="foo">hello</div>')
|
18
18
|
end
|
19
19
|
|
20
20
|
it "can define the render method with the render macro without a container" do
|
@@ -26,7 +26,7 @@ describe 'the React DSL' do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
expect(
|
29
|
+
expect(Foo).to render_static_html('<span>hello</span>')
|
30
30
|
end
|
31
31
|
|
32
32
|
it "can define the render method with the render macro with a application defined container" do
|
@@ -40,7 +40,7 @@ describe 'the React DSL' do
|
|
40
40
|
render Bar, p1: "fred"
|
41
41
|
end
|
42
42
|
|
43
|
-
expect(
|
43
|
+
expect(Foo).to render_static_html('<span>hello fred</span>')
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -53,7 +53,7 @@ describe 'the React DSL' do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
expect(
|
56
|
+
expect(Foo).to render_static_html('<div>hello</div>')
|
57
57
|
end
|
58
58
|
|
59
59
|
it "will pass converted props through event handlers" do
|
@@ -77,7 +77,7 @@ describe 'the React DSL' do
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
expect(
|
80
|
+
expect(Foo).to render_static_html('<div>hello</div>')
|
81
81
|
end
|
82
82
|
|
83
83
|
it "has a .span short hand String method" do
|
@@ -89,7 +89,7 @@ describe 'the React DSL' do
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
-
expect(
|
92
|
+
expect(Foo).to render_static_html('<div><span>hello</span><span>goodby</span></div>')
|
93
93
|
end
|
94
94
|
|
95
95
|
it "has a .br short hand String method" do
|
@@ -113,7 +113,7 @@ describe 'the React DSL' do
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
expect(
|
116
|
+
expect(Foo).to render_static_html('<table><tr><td>hello</td></tr></table>')
|
117
117
|
end
|
118
118
|
|
119
119
|
it "has a .para short hand String method" do
|
@@ -125,7 +125,7 @@ describe 'the React DSL' do
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
expect(
|
128
|
+
expect(Foo).to render_static_html('<div><p>hello</p></div>')
|
129
129
|
end
|
130
130
|
|
131
131
|
it 'can do a method call on a class name that is not a direct sibling' do
|
@@ -141,8 +141,8 @@ describe 'the React DSL' do
|
|
141
141
|
Comp()
|
142
142
|
end
|
143
143
|
end
|
144
|
-
expect(
|
145
|
-
.to
|
144
|
+
expect(Mod::NestedMod::NestedComp)
|
145
|
+
.to render_static_html('<span>Mod::Comp</span>')
|
146
146
|
end
|
147
147
|
|
148
148
|
it 'raises a meaningful error if a Constant Name is not actually a component' do
|
@@ -187,7 +187,7 @@ describe 'the React DSL' do
|
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
|
-
expect(
|
190
|
+
expect(Foo).to render_static_html('<span>a man walks into a bar</span>')
|
191
191
|
end
|
192
192
|
|
193
193
|
it "can add class names by the haml .class notation" do
|
@@ -206,7 +206,7 @@ describe 'the React DSL' do
|
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
|
-
expect(
|
209
|
+
expect(Foo).to render_static_html('<span class="other-class the-class">a man walks into a bar</span>')
|
210
210
|
end
|
211
211
|
|
212
212
|
it "can use the 'class' keyword for classes" do
|
@@ -218,7 +218,7 @@ describe 'the React DSL' do
|
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
221
|
-
expect(
|
221
|
+
expect(Foo).to render_static_html('<span class="the-class">hello</span>')
|
222
222
|
end
|
223
223
|
|
224
224
|
it "can generate a unrendered node using the .as_node method" do # div { "hello" }.as_node
|
@@ -230,7 +230,8 @@ describe 'the React DSL' do
|
|
230
230
|
end
|
231
231
|
end
|
232
232
|
|
233
|
-
expect(
|
233
|
+
expect(Foo)
|
234
|
+
.to render_static_html('<span data-size="12">React::Element</span>')
|
234
235
|
end
|
235
236
|
|
236
237
|
it "can use the dangerously_set_inner_HTML param" do
|
@@ -242,7 +243,7 @@ describe 'the React DSL' do
|
|
242
243
|
end
|
243
244
|
end
|
244
245
|
|
245
|
-
expect(
|
246
|
+
expect(Foo).to render_static_html('<div>Hello Goodby</div>')
|
246
247
|
end
|
247
248
|
|
248
249
|
it 'should convert a hash param to hyphenated html attributes if in React::HASH_ATTRIBUTES' do
|
@@ -254,8 +255,8 @@ describe 'the React DSL' do
|
|
254
255
|
end
|
255
256
|
end
|
256
257
|
|
257
|
-
expect(
|
258
|
-
.to
|
258
|
+
expect(Foo)
|
259
|
+
.to render_static_html('<div data-foo="bar" aria-foo-bar="foo"></div>')
|
259
260
|
end
|
260
261
|
|
261
262
|
it 'should not convert a hash param to hyphenated html attributes if not in React::HASH_ATTRIBUTES' do
|
@@ -267,8 +268,10 @@ describe 'the React DSL' do
|
|
267
268
|
end
|
268
269
|
end
|
269
270
|
|
270
|
-
expect(
|
271
|
-
.to
|
271
|
+
expect(Foo)
|
272
|
+
.to render_static_html(
|
273
|
+
'<div title="{"bar"=>"foo"}"></div>'
|
274
|
+
)
|
272
275
|
end
|
273
276
|
|
274
277
|
it "will remove all elements passed as params from the rendering buffer" do
|
@@ -290,7 +293,7 @@ describe 'the React DSL' do
|
|
290
293
|
end
|
291
294
|
end
|
292
295
|
|
293
|
-
expect(
|
296
|
+
expect(Test).to render_static_html('<div><b>hello</b><b>hello</b></div>')
|
294
297
|
end
|
295
298
|
end
|
296
299
|
end
|
data/spec/react/element_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
if opal?
|
4
4
|
# require 'reactrb/new-event-name-convention' # this require will get rid of any error messages but
|
5
5
|
# the on method will no longer attach to the param prefixed with _on
|
6
|
-
describe React::Element do
|
6
|
+
describe React::Element, type: :component do
|
7
7
|
it 'bridges `type` of native React.Element attributes' do
|
8
8
|
element = React.create_element('div')
|
9
9
|
expect(element.element_type).to eq("div")
|
@@ -110,20 +110,20 @@ describe React::Element do
|
|
110
110
|
it 'is subscribable through `on(:event_name)` method' do
|
111
111
|
expect { |b|
|
112
112
|
element = React.create_element("div").on(:click, &b)
|
113
|
-
|
114
|
-
|
113
|
+
dom_node = React::Test::Utils.render_into_document(element)
|
114
|
+
React::Test::Utils.simulate(:click, dom_node)
|
115
115
|
}.to yield_with_args(React::Event)
|
116
116
|
|
117
117
|
expect { |b|
|
118
118
|
element = React.create_element("div").on(:key_down, &b)
|
119
|
-
|
120
|
-
|
119
|
+
dom_node = React::Test::Utils.render_into_document(element)
|
120
|
+
React::Test::Utils.simulate(:keyDown, dom_node, {key: "Enter"})
|
121
121
|
}.to yield_control
|
122
122
|
|
123
123
|
expect { |b|
|
124
124
|
element = React.create_element("form").on(:submit, &b)
|
125
|
-
|
126
|
-
|
125
|
+
dom_node = React::Test::Utils.render_into_document(element)
|
126
|
+
React::Test::Utils.simulate(:submit, dom_node)
|
127
127
|
}.to yield_control
|
128
128
|
end
|
129
129
|
|
data/spec/react/event_spec.rb
CHANGED
@@ -17,8 +17,8 @@ describe React::Event do
|
|
17
17
|
expect(event).to respond_to(:prevent_default)
|
18
18
|
expect(event).to respond_to(:stop_propagation)
|
19
19
|
end
|
20
|
-
|
21
|
-
|
20
|
+
dom_node = React::Test::Utils.render_into_document(element)
|
21
|
+
React::Test::Utils.simulate(:click, dom_node)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -17,7 +17,7 @@ module NativeLibraryTestModule
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
describe "React::NativeLibrary" do
|
20
|
+
describe "React::NativeLibrary", type: :component do
|
21
21
|
|
22
22
|
after(:each) do
|
23
23
|
%x{
|
@@ -52,8 +52,7 @@ describe "React::NativeLibrary" do
|
|
52
52
|
Foo.class_eval do
|
53
53
|
imports "NativeLibrary.FunctionalComponent"
|
54
54
|
end
|
55
|
-
expect(
|
56
|
-
React.create_element(Foo, name: "There"))).to eq('<div>Hello There</div>')
|
55
|
+
expect(Foo).to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
57
56
|
end
|
58
57
|
end
|
59
58
|
|
@@ -69,7 +68,7 @@ describe "React::NativeLibrary" do
|
|
69
68
|
expect(React::API.native_react_component?(`window.NativeComponent`)).to be_truthy
|
70
69
|
expect(React::API.native_react_component?(`{render: function render() {}}`)).to be_falsy
|
71
70
|
expect(React::API.native_react_component?(`window.DoesntExist`)).to be_falsy
|
72
|
-
expect(React::API.native_react_component?(
|
71
|
+
expect(React::API.native_react_component?()).to be_falsy
|
73
72
|
end
|
74
73
|
|
75
74
|
it "will import a React.js library into the Ruby name space" do
|
@@ -87,8 +86,8 @@ describe "React::NativeLibrary" do
|
|
87
86
|
Foo.class_eval do
|
88
87
|
imports "NativeLibrary"
|
89
88
|
end
|
90
|
-
expect(
|
91
|
-
|
89
|
+
expect(Foo::NativeComponent)
|
90
|
+
.to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
92
91
|
end
|
93
92
|
|
94
93
|
it "will import a nested React.js library into the Ruby name space" do
|
@@ -107,8 +106,8 @@ describe "React::NativeLibrary" do
|
|
107
106
|
Foo.class_eval do
|
108
107
|
imports "NativeLibrary"
|
109
108
|
end
|
110
|
-
expect(
|
111
|
-
|
109
|
+
expect(Foo::NestedLibrary::NativeComponent)
|
110
|
+
.to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
112
111
|
end
|
113
112
|
|
114
113
|
it "will rename an imported a React.js component" do
|
@@ -127,8 +126,8 @@ describe "React::NativeLibrary" do
|
|
127
126
|
imports "NativeLibrary"
|
128
127
|
rename "NativeComponent" => "Bar"
|
129
128
|
end
|
130
|
-
expect(
|
131
|
-
|
129
|
+
expect(Foo::Bar)
|
130
|
+
.to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
132
131
|
end
|
133
132
|
|
134
133
|
it "will give a reasonable error when failing to import a renamed component" do
|
@@ -164,8 +163,8 @@ describe "React::NativeLibrary" do
|
|
164
163
|
Foo.class_eval do
|
165
164
|
imports "NativeComponent"
|
166
165
|
end
|
167
|
-
expect(
|
168
|
-
|
166
|
+
expect(Foo)
|
167
|
+
.to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
169
168
|
|
170
169
|
end
|
171
170
|
|
@@ -184,8 +183,8 @@ describe "React::NativeLibrary" do
|
|
184
183
|
Foo.class_eval do
|
185
184
|
imports "NativeLibrary.NativeComponent"
|
186
185
|
end
|
187
|
-
expect(
|
188
|
-
|
186
|
+
expect(Foo)
|
187
|
+
.to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
189
188
|
|
190
189
|
end
|
191
190
|
|
@@ -234,8 +233,7 @@ describe "React::NativeLibrary" do
|
|
234
233
|
}
|
235
234
|
})
|
236
235
|
}
|
237
|
-
expect(
|
238
|
-
React.create_element(Foo))).to eq('<div>Hello There</div>')
|
236
|
+
expect(Foo).to render_static_html('<div>Hello There</div>')
|
239
237
|
end
|
240
238
|
|
241
239
|
it 'will automatically import a React.js component when referenced in another component with the _as_node suffix' do
|
@@ -254,8 +252,7 @@ describe "React::NativeLibrary" do
|
|
254
252
|
}
|
255
253
|
})
|
256
254
|
}
|
257
|
-
expect(
|
258
|
-
React.create_element(Foo))).to eq('<div><div>Hello There</div><div>Hello There</div></div>')
|
255
|
+
expect(Foo).to render_static_html('<div><div>Hello There</div><div>Hello There</div></div>')
|
259
256
|
end
|
260
257
|
|
261
258
|
it "will automatically import a React.js component in a library when referenced in another component with the _as_node suffix" do
|
@@ -276,8 +273,7 @@ describe "React::NativeLibrary" do
|
|
276
273
|
})
|
277
274
|
}
|
278
275
|
}
|
279
|
-
expect(
|
280
|
-
React.create_element(Foo))).to eq('<div><div>Hello There</div><div>Hello There</div></div>')
|
276
|
+
expect(Foo).to render_static_html('<div><div>Hello There</div><div>Hello There</div></div>')
|
281
277
|
end
|
282
278
|
|
283
279
|
it "will automatically import a React.js component when referenced as a constant" do
|
@@ -289,8 +285,8 @@ describe "React::NativeLibrary" do
|
|
289
285
|
}
|
290
286
|
})
|
291
287
|
}
|
292
|
-
expect(
|
293
|
-
|
288
|
+
expect(NativeComponent)
|
289
|
+
.to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
294
290
|
end
|
295
291
|
|
296
292
|
it "will automatically import a native library containing a React.js component" do
|
@@ -322,8 +318,8 @@ describe "React::NativeLibrary" do
|
|
322
318
|
})
|
323
319
|
}
|
324
320
|
}
|
325
|
-
expect(
|
326
|
-
|
321
|
+
expect(NativeLibrary::NativeComponent)
|
322
|
+
.to render_static_html('<div>Hello There</div>').with_params(name: "There")
|
327
323
|
end
|
328
324
|
|
329
325
|
it "will produce a sensible error if the component is not in the library" do
|
@@ -1,7 +1,42 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
if opal?
|
4
|
+
|
4
5
|
describe 'React::Observable' do
|
5
|
-
|
6
|
+
it "allows to set value on Observable" do
|
7
|
+
stub_const 'Zoo', Class.new {
|
8
|
+
include React::Component
|
9
|
+
param :foo, type: React::Observable
|
10
|
+
before_mount do
|
11
|
+
params.foo! 4
|
12
|
+
end
|
13
|
+
|
14
|
+
def render
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
}
|
18
|
+
|
19
|
+
stub_const 'Foo', Class.new
|
20
|
+
Foo.class_eval do
|
21
|
+
include React::Component
|
22
|
+
|
23
|
+
def render
|
24
|
+
div do
|
25
|
+
Zoo(foo: state.foo! )
|
26
|
+
span { state.foo.to_s }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
instance = React::Test::Utils.render_into_document(React.create_element(Foo))
|
32
|
+
html = `#{instance.dom_node}.innerHTML`
|
33
|
+
# data-reactid appear in earlier versions of reactjs
|
34
|
+
%x{
|
35
|
+
var REGEX_REMOVE_IDS = /\s?data-reactid="[^"]+"/g;
|
36
|
+
html = html.replace(REGEX_REMOVE_IDS, '');
|
37
|
+
}
|
38
|
+
expect(html).to eq('<span></span><span>4</span>')
|
39
|
+
end
|
6
40
|
end
|
41
|
+
|
7
42
|
end
|
@@ -1,66 +1,68 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
if opal?
|
4
|
-
describe '
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
describe 'opal-jquery extensions' do
|
5
|
+
describe 'Element' do
|
6
|
+
after(:each) do
|
7
|
+
React::API.clear_component_class_cache
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
it 'will reuse the wrapper componet class for the same Element' do
|
11
|
+
stub_const 'Foo', Class.new(React::Component::Base)
|
12
|
+
Foo.class_eval do
|
13
|
+
param :name
|
14
|
+
def render
|
15
|
+
"hello #{params.name}"
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
+
def component_will_unmount
|
18
19
|
|
20
|
+
end
|
19
21
|
end
|
20
|
-
end
|
21
22
|
|
22
|
-
|
23
|
+
expect_any_instance_of(Foo).to_not receive(:component_will_unmount)
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
test_div = Element.new(:div)
|
26
|
+
test_div.render { Foo(name: 'fred') }
|
27
|
+
test_div.render { Foo(name: 'freddy') }
|
28
|
+
expect(Element[test_div].find('span').html).to eq('hello freddy')
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
it 'renders a top level component using render with a block' do
|
32
|
+
stub_const 'Foo', Class.new(React::Component::Base)
|
33
|
+
Foo.class_eval do
|
34
|
+
param :name
|
35
|
+
def render
|
36
|
+
"hello #{params.name}"
|
37
|
+
end
|
36
38
|
end
|
39
|
+
test_div = Element.new(:div)
|
40
|
+
test_div.render { Foo(name: 'fred') }
|
41
|
+
expect(Element[test_div].find('span').html).to eq('hello fred')
|
37
42
|
end
|
38
|
-
test_div = Element.new(:div)
|
39
|
-
test_div.render { Foo(name: 'fred') }
|
40
|
-
expect(Element[test_div].find('span').html).to eq('hello fred')
|
41
|
-
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
it 'renders a top level component using render with a container and params ' do
|
45
|
+
test_div = Element.new(:div)
|
46
|
+
test_div.render(:span, id: :render_test_span) { 'hello' }
|
47
|
+
expect(Element[test_div].find('#render_test_span').html).to eq('hello')
|
48
|
+
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
it 'will find the DOM node given a react element' do
|
51
|
+
stub_const 'Foo', Class.new(React::Component::Base)
|
52
|
+
Foo.class_eval do
|
53
|
+
def render
|
54
|
+
div { 'hello' }
|
55
|
+
end
|
54
56
|
end
|
55
|
-
end
|
56
57
|
|
57
|
-
|
58
|
-
|
58
|
+
expect(Element[renderToDocument(Foo)].html).to eq('hello')
|
59
|
+
end
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
it "accepts plain js object as selector" do
|
62
|
+
expect {
|
63
|
+
Element[`window`]
|
64
|
+
}.not_to raise_error
|
65
|
+
end
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|