Skip to content

Commit c1ca596

Browse files
committed
closes #60
1 parent 8d80ca1 commit c1ca596

31 files changed

+193
-132
lines changed

ruby/hyper-component/lib/hyperstack/component.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@ def self.included(base)
2828
define_callback(:after_error) { Hyperstack::Internal::Component::ReactWrapper.add_after_error_hook(base) }
2929
end
3030
base.extend(Hyperstack::Internal::Component::ClassMethods)
31+
unless `Opal.__hyperstack_component_original_defn`
32+
%x{
33+
Opal.__hyperstack_component_original_defn = Opal.defn
34+
Opal.defn = function(klass, name, fn) {
35+
#{
36+
if `klass`.respond_to?(:hyper_component?)
37+
if `name == '$render'` && !`klass`.allow_deprecated_render_definition?
38+
Hyperstack.deprecation_warning(`klass`, 'Do not directly define the render method. Use the render macro instead.')
39+
elsif `name == '$__hyperstack_component_render'`
40+
`name = '$render'`
41+
end
42+
end
43+
}
44+
Opal.__hyperstack_component_original_defn(klass, name, fn)
45+
}
46+
}
47+
nil
48+
end
3149
end
3250

3351
def self.mounted_components

ruby/hyper-component/lib/hyperstack/internal/component/class_methods.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ def hyper_component?
2020
true
2121
end
2222

23+
def allow_deprecated_render_definition?
24+
false
25+
end
26+
2327
def mounted_components
2428
Hyperstack::Component.mounted_components.select { |c| c.class <= self }
2529
end
@@ -39,13 +43,14 @@ def append_backtrace(message_array, backtrace)
3943
end
4044

4145
def render(container = nil, params = {}, &block)
46+
Tags.included(self)
4247
if container
4348
container = container.type if container.is_a? Hyperstack::Component::Element
44-
define_method :render do
49+
define_method :__hyperstack_component_render do
4550
RenderingContext.render(container, params) { instance_eval(&block) if block }
4651
end
4752
else
48-
define_method(:render) { instance_eval(&block) }
53+
define_method(:__hyperstack_component_render) { instance_eval(&block) }
4954
end
5055
end
5156

ruby/hyper-component/lib/hyperstack/internal/component/top_level_rails_component.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ def self.search_path
1616

1717
backtrace :off
1818

19+
def self.allow_deprecated_render_definition?
20+
true
21+
end
22+
1923
def render
2024
top_level_render
2125
end

ruby/hyper-component/spec/client_features/base_spec.rb

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
before :each do
66
on_client do
7-
class Foo < Hyperloop::Component
7+
class Foo < HyperComponent
88
before_mount do
9-
@instance_data = ["working"]
9+
@_instance_data = ["working"]
1010
end
11-
def render
12-
@instance_data.first
11+
render do
12+
@_instance_data.first
1313
end
1414
end
1515
end
@@ -24,13 +24,30 @@ def render
2424
mount 'Bar' do
2525
class Bar < Foo
2626
before_mount do
27-
@instance_data << "well"
27+
@_instance_data << "well"
2828
end
29-
def render
30-
@instance_data.join(" ")
29+
render do
30+
@_instance_data.join(" ")
3131
end
3232
end
3333
end
3434
expect(page.body[-50..-19]).to match(/<span>working well<\/span>/)
3535
end
36+
37+
it "can create an inherited component's insert_element alias" do
38+
mount 'Tester' do
39+
module Container
40+
class Base < Foo
41+
end
42+
class Thing < Base
43+
before_mount { @_instance_data << "well"}
44+
render { @_instance_data.join(' ') }
45+
end
46+
end
47+
class Tester < HyperComponent
48+
render { Container::Thing() }
49+
end
50+
end
51+
expect(page).to have_content('working well')
52+
end
3653
end

ruby/hyper-component/spec/client_features/children_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class InitTest
88
def self.get_children
99
component = Class.new do
1010
include Hyperstack::Component
11-
def render
11+
render do
1212
DIV { 'lorem' }
1313
end
1414
end
@@ -62,7 +62,7 @@ class InitTest
6262
def self.get_children
6363
component = Class.new do
6464
include Hyperstack::Component
65-
def render
65+
render do
6666
DIV { 'lorem' }
6767
end
6868
end
@@ -100,7 +100,7 @@ class InitTest
100100
def self.get_children
101101
component = Class.new do
102102
include Hyperstack::Component
103-
def render
103+
render do
104104
DIV { 'lorem' }
105105
end
106106
end

ruby/hyper-component/spec/client_features/component_spec.rb

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Foo
99
def initialize(native = nil)
1010
end
1111

12-
def render
12+
render do
1313
Hyperstack::Component::ReactAPI.create_element('div')
1414
end
1515
end
@@ -36,7 +36,7 @@ class Foo
3636
def self.call_history
3737
@call_history ||= []
3838
end
39-
def render
39+
render do
4040
Hyperstack::Component::ReactAPI.create_element('div') { 'lorem' }
4141
end
4242
end
@@ -79,7 +79,7 @@ def self.call_history
7979
@call_history ||= []
8080
end
8181
def bar2; self.class.call_history << "bar2"; end
82-
def render
82+
render do
8383
Hyperstack::Component::ReactAPI.create_element('div') { 'lorem' }
8484
end
8585
end
@@ -109,7 +109,7 @@ def render
109109
class ErrorFoo
110110
include Hyperstack::Component
111111
param :just
112-
def render
112+
render do
113113
raise 'ErrorFoo Error'
114114
end
115115
end
@@ -122,7 +122,7 @@ def self.get_info
122122
@@info
123123
end
124124

125-
def render
125+
render do
126126
DIV { ErrorFoo(just: :a_param) }
127127
end
128128

@@ -149,7 +149,7 @@ class << self
149149
Foo.render_counter = 0
150150
Foo.instance = self
151151
end
152-
def render
152+
render do
153153
Foo.render_counter += 1
154154
DIV { "I have been rendered #{Foo.render_counter} times" }
155155
end
@@ -170,7 +170,7 @@ class << self
170170
before_mount do
171171
Foo.instance = self
172172
end
173-
def render
173+
render do
174174
DIV { "I have been rendered" }
175175
end
176176
end
@@ -185,7 +185,7 @@ class Bar < Hyperloop::Component
185185
render { DIV { @P.span; children.render } }
186186
end
187187
class Foo < Hyperloop::Component
188-
def render
188+
render do
189189
Bar.insert_element(p: "param") { "child"}
190190
end
191191
end
@@ -221,7 +221,7 @@ class BarChild < Bar
221221
end
222222
class Foo
223223
include Hyperstack::Component
224-
def render
224+
render do
225225
DIV do
226226
Bar(id: 1)
227227
Bar(id: 2)
@@ -259,7 +259,7 @@ def to_s
259259
class Foo
260260
include Hyperstack::Component
261261
include Hyperstack::State::Observable
262-
def render
262+
render do
263263
DIV { @foo }
264264
end
265265
end
@@ -283,7 +283,7 @@ def self.incr_render_count
283283
@@render_count += 1
284284
end
285285

286-
def render
286+
render do
287287
StateFoo.incr_render_count
288288
Hyperstack::Component::ReactAPI.create_element('div') { 'lorem' }
289289
end
@@ -312,7 +312,7 @@ def self.incr_render_count
312312
mutate
313313
end
314314

315-
def render
315+
render do
316316
StateFoo.incr_render_count
317317
Hyperstack::Component::ReactAPI.create_element('div') { 'lorem' }
318318
end
@@ -323,7 +323,7 @@ def render
323323
mutate @foo = 25
324324
end
325325

326-
def render
326+
render do
327327
DIV { StateFoo(drinks: @foo) }
328328
end
329329

@@ -350,7 +350,7 @@ class Foo
350350
mount 'Foo', prop: [{foo: 10}] do
351351
Foo.class_eval do
352352
param :prop
353-
def render
353+
render do
354354
Hyperstack::Component::ReactAPI.create_element('div') { @Prop[0][:foo] }
355355
end
356356
end
@@ -390,7 +390,7 @@ class Lorem; end
390390
optional :bar, type: String
391391
end
392392

393-
def render; DIV {}; end
393+
render { DIV {} }
394394
end
395395
Hyperstack::Component::ReactTestUtils.render_component_into_document(Foo, bar: 10, lorem: Lorem.new)
396396
end
@@ -408,7 +408,7 @@ class Lorem; end
408408
optional :bar, type: String
409409
end
410410

411-
def render; DIV {}; end
411+
render { DIV {} }
412412
end
413413
Hyperstack::Component::ReactTestUtils.render_component_into_document(Foo, foo: 10, bar: '10', lorem: Lorem.new)
414414
end
@@ -426,7 +426,7 @@ class Foo
426426
optional :bar, default: 'bar'
427427
end
428428

429-
def render
429+
render do
430430
DIV { @Foo + '-' + @Bar}
431431
end
432432
end
@@ -444,7 +444,7 @@ def render
444444
evaluate_ruby do
445445
foo = Class.new(Hyperloop::Component)
446446
foo.class_eval do
447-
def render; "hello" end
447+
render { "hello" }
448448
end
449449

450450
Hyperstack::Component::ReactTestUtils.render_component_into_document(foo)
@@ -460,7 +460,7 @@ def render; "hello" end
460460
it "will generate a message if render returns something other than an Element or a String" do
461461
mount 'Foo' do
462462
class Foo < Hyperloop::Component
463-
def render; Hash.new; end
463+
render { Hash.new }
464464
end
465465
end
466466
expect(page.driver.browser.manage.logs.get(:browser).map { |m| m.message.gsub(/\\n/, "\n") }.to_a.join("\n"))
@@ -469,7 +469,7 @@ def render; Hash.new; end
469469
it "will generate a message if render returns a Component class" do
470470
mount 'Foo' do
471471
class Foo < Hyperloop::Component
472-
def render; Foo; end
472+
render { Foo }
473473
end
474474
end
475475
expect(page.driver.browser.manage.logs.get(:browser).map { |m| m.message.gsub(/\\n/, "\n") }.to_a.join("\n"))
@@ -478,7 +478,7 @@ def render; Foo; end
478478
it "will generate a message if more than 1 element is generated" do
479479
mount 'Foo' do
480480
class Foo < Hyperloop::Component
481-
def render; "hello".span; "goodby".span; end
481+
render { "hello".span; "goodby".span }
482482
end
483483
end
484484
expect(page.driver.browser.manage.logs.get(:browser).map { |m| m.message.gsub(/\\n/, "\n") }.to_a.join("\n"))
@@ -487,7 +487,7 @@ def render; "hello".span; "goodby".span; end
487487
it "will generate a message if the element generated is not the element returned" do
488488
mount 'Foo' do
489489
class Foo < Hyperloop::Component
490-
def render; "hello".span; "goodby".span.delete; end
490+
render { "hello".span; "goodby".span.delete }
491491
end
492492
end
493493
expect(page.driver.browser.manage.logs.get(:browser).map { |m| m.message.gsub(/\\n/, "\n") }.to_a.join("\n"))
@@ -501,7 +501,7 @@ def render; "hello".span; "goodby".span.delete; end
501501
class Foo
502502
include Hyperstack::Component
503503
param :foo
504-
def render
504+
render do
505505
DIV do
506506
SPAN { @Foo }
507507
end
@@ -510,7 +510,7 @@ def render
510510

511511
class Bar
512512
include Hyperstack::Component
513-
def render
513+
render do
514514
DIV do
515515
Hyperstack::Internal::Component::RenderingContext.render(Foo, foo: 'astring')
516516
end
@@ -528,7 +528,7 @@ def render
528528
class Foo
529529
include Hyperstack::Component
530530

531-
def render
531+
render do
532532
DIV()
533533
end
534534
end
@@ -543,7 +543,7 @@ def render
543543
class Foo
544544
include Hyperstack::Component
545545

546-
def render
546+
render do
547547
Hyperstack::Component::ReactAPI.create_element('div')
548548
end
549549
end
@@ -697,7 +697,7 @@ def needs_update?(next_params, next_state)
697697
on_client do
698698
class Foo
699699
include Hyperstack::Component
700-
def render
700+
render do
701701
Hyperstack::Component::ReactAPI.create_element('div') { 'lorem' }
702702
end
703703
end

0 commit comments

Comments
 (0)