fortitude 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +19 -19
- data/CHANGES.md +31 -0
- data/Gemfile +1 -0
- data/README-erector.md +1 -1
- data/lib/fortitude/erector.rb +32 -0
- data/lib/fortitude/method_templates/tag_method_template.rb.smpl +6 -6
- data/lib/fortitude/method_templates/text_method_template.rb.smpl +3 -3
- data/lib/fortitude/rails/railtie.rb +6 -4
- data/lib/fortitude/rails/renderer.rb +7 -4
- data/lib/fortitude/rails/template_handler.rb +18 -3
- data/lib/fortitude/rendering_context.rb +20 -2
- data/lib/fortitude/tags/render_widget_placeholder.rb +19 -0
- data/lib/fortitude/tags/tag.rb +18 -4
- data/lib/fortitude/tags/tag_return_value.rb +1 -1
- data/lib/fortitude/tags/tag_store.rb +4 -0
- data/lib/fortitude/tilt/fortitude_template.rb +6 -128
- data/lib/fortitude/version.rb +1 -1
- data/lib/fortitude/widget.rb +2 -0
- data/lib/fortitude/widget/files.rb +162 -0
- data/lib/fortitude/widget/integration.rb +5 -3
- data/lib/fortitude/widget/modules_and_subclasses.rb +17 -0
- data/lib/fortitude/widget/rendering.rb +12 -5
- data/lib/fortitude/widget/start_and_end_comments.rb +4 -2
- data/lib/fortitude/widget/tags.rb +6 -1
- data/lib/fortitude/widget/widget_class_inheritable_attributes.rb +7 -0
- data/spec/helpers/rails_server.rb +4 -0
- data/spec/rails/basic_rails_system_spec.rb +4 -0
- data/spec/rails/erector_coexistence_system_spec.rb +33 -0
- data/spec/rails/rendering_context_system_spec.rb +19 -3
- data/spec/rails/rendering_system_spec.rb +6 -0
- data/spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb +5 -0
- data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_one.rb +5 -0
- data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_three.rb +5 -0
- data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_two.rb +9 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/controllers/erector_coexistence_system_spec_controller.rb +19 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/v/views/erector_coexistence_system_spec/erector_widget_in_app_v_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/v/views/erector_coexistence_system_spec/fortitude_widget_in_app_v_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/views/erector_coexistence_system_spec/erector_widget_in_app_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/views/erector_coexistence_system_spec/fortitude_widget_in_app_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/config/application.rb +25 -0
- data/spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb +2 -2
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_current_element_nesting_intermediate.html.erb +3 -0
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/current_element_nesting_child.rb +13 -0
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/current_element_nesting_toplevel.rb +9 -0
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials.rb +2 -2
- data/spec/system/convenience_methods_system_spec.rb +22 -0
- data/spec/system/inline_system_spec.rb +2 -2
- data/spec/system/record_tag_emission_system_spec.rb +71 -0
- data/spec/system/rendering_context_system_spec.rb +21 -0
- data/spec/system/setting_inheritance_system_spec.rb +52 -0
- data/spec/system/tag_return_value_system_spec.rb +7 -0
- data/spec/system/tilt_system_spec.rb +13 -18
- data/spec/system/widget_class_from_spec.rb +240 -0
- data/spec/system/widget_method_system_spec.rb +52 -0
- metadata +37 -2
@@ -139,6 +139,30 @@ describe "Fortitude setting inheritance", :type => :system do
|
|
139
139
|
end
|
140
140
|
|
141
141
|
|
142
|
+
def record_tag_emission_should_be(expected_result, *klasses)
|
143
|
+
klasses.each do |klass|
|
144
|
+
expect(klass.record_tag_emission).to eq(expected_result)
|
145
|
+
send("record_tag_emission_should_be_#{expected_result}", klass)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def record_tag_emission_should_be_true(klass)
|
150
|
+
instance = klass.new
|
151
|
+
expect(render(instance)).to eq("<p><div></div></p>")
|
152
|
+
nesting = instance.inner_element_nesting
|
153
|
+
expect(nesting.shift).to be(instance)
|
154
|
+
expect(nesting.map(&:name)).to eq([ :p, :div ])
|
155
|
+
end
|
156
|
+
|
157
|
+
def record_tag_emission_should_be_false(klass)
|
158
|
+
instance = klass.new
|
159
|
+
expect(render(instance)).to eq("<p><div></div></p>")
|
160
|
+
nesting = instance.inner_element_nesting
|
161
|
+
expect(nesting.shift).to be(instance)
|
162
|
+
expect(nesting).to eq([ ])
|
163
|
+
end
|
164
|
+
|
165
|
+
|
142
166
|
def format_output_should_be(expected_result, *klasses)
|
143
167
|
klasses.each do |klass|
|
144
168
|
expect(klass.format_output).to eq(expected_result)
|
@@ -405,6 +429,34 @@ describe "Fortitude setting inheritance", :type => :system do
|
|
405
429
|
enforce_element_nesting_rules_should_be(true, @parent1, @child11, @child12)
|
406
430
|
end
|
407
431
|
|
432
|
+
it "should properly inherit record_tag_emission" do
|
433
|
+
@grandparent.class_eval do
|
434
|
+
attr_reader :inner_element_nesting
|
435
|
+
|
436
|
+
def content
|
437
|
+
p { div { @inner_element_nesting = rendering_context.current_element_nesting.dup } }
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
record_tag_emission_should_be(false, @grandparent, @parent1, @child11, @child12, @parent2, @child21, @child22)
|
442
|
+
|
443
|
+
@parent1.record_tag_emission true
|
444
|
+
record_tag_emission_should_be(false, @grandparent, @parent2, @child21, @child22)
|
445
|
+
record_tag_emission_should_be(true, @parent1, @child11, @child12)
|
446
|
+
|
447
|
+
@parent2.record_tag_emission false
|
448
|
+
record_tag_emission_should_be(false, @grandparent, @parent2, @child21, @child22)
|
449
|
+
record_tag_emission_should_be(true, @parent1, @child11, @child12)
|
450
|
+
|
451
|
+
@grandparent.record_tag_emission true
|
452
|
+
record_tag_emission_should_be(false, @parent2, @child21, @child22)
|
453
|
+
record_tag_emission_should_be(true, @grandparent, @parent1, @child11, @child12)
|
454
|
+
|
455
|
+
@grandparent.record_tag_emission false
|
456
|
+
record_tag_emission_should_be(false, @grandparent, @parent2, @child21, @child22)
|
457
|
+
record_tag_emission_should_be(true, @parent1, @child11, @child12)
|
458
|
+
end
|
459
|
+
|
408
460
|
it "should properly inherit translation_base" do
|
409
461
|
@grandparent.class_eval do
|
410
462
|
def content
|
@@ -38,4 +38,11 @@ describe "Fortitude tag return values", :type => :system do
|
|
38
38
|
expect_nrv(:foo) { p("foo", :foo => :bar) { text "whatever" }.foo }
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
context "should not blow up when calling" do
|
43
|
+
it "#is_a?" do
|
44
|
+
wc = widget_class_with_content { text("value: #{p.is_a?(String).inspect}") }
|
45
|
+
expect(render(wc)).to eq("<p></p>value: false")
|
46
|
+
end
|
47
|
+
end
|
41
48
|
end
|
@@ -308,14 +308,14 @@ EOS
|
|
308
308
|
end
|
309
309
|
|
310
310
|
it "should fail with a nice message if it can't figure out which class to render" do
|
311
|
-
e = capture_exception(Fortitude::
|
311
|
+
e = capture_exception(Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
312
312
|
render_text_with_tilt("random_#{rand(1_000_000)}.rb", impossible_to_find_class_name_text(5), context_object, { })
|
313
313
|
end
|
314
314
|
|
315
315
|
expect(e).to be
|
316
316
|
expect(e.tried_class_names).to eq([ ])
|
317
|
-
expect(e.message).to match(
|
318
|
-
expect(e.message).to match(/:
|
317
|
+
expect(e.message).to match(/fortitude_tilt_class/)
|
318
|
+
expect(e.message).to match(/:class_names_to_try/)
|
319
319
|
end
|
320
320
|
|
321
321
|
it "should allow overriding the class that's defined in the module explicitly with an option" do
|
@@ -325,32 +325,29 @@ EOS
|
|
325
325
|
end
|
326
326
|
|
327
327
|
it "should fail with a nice message if you tell it to use something that doesn't exist, using an option" do
|
328
|
-
e = capture_exception(Fortitude::
|
328
|
+
e = capture_exception(Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
329
329
|
render_text_with_tilt("random_#{rand(1_000_000)}.rb", impossible_to_find_class_name_text(7), context_object, { },
|
330
330
|
{ :fortitude_class => "NonExistent" })
|
331
331
|
end
|
332
|
-
expect(e.
|
333
|
-
expect(e.actual_object).to be_nil
|
332
|
+
expect(e.tried_class_names).to be_include("NonExistent")
|
334
333
|
expect(e.message).to match(/NonExistent/)
|
335
334
|
end
|
336
335
|
|
337
336
|
it "should fail with a nice message if you tell it to use something that isn't a class, using an option" do
|
338
|
-
e = capture_exception(Fortitude::
|
337
|
+
e = capture_exception(Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
339
338
|
render_text_with_tilt("random_#{rand(1_000_000)}.rb", impossible_to_find_class_name_text(8), context_object, { },
|
340
339
|
{ :fortitude_class => 12345 })
|
341
340
|
end
|
342
|
-
expect(e.
|
343
|
-
expect(e.actual_object).to eq(12345)
|
341
|
+
expect(e.tried_class_names).to be_include(12345)
|
344
342
|
expect(e.message).to match(/12345/)
|
345
343
|
end
|
346
344
|
|
347
345
|
it "should fail with a nice message if you tell it to use something that isn't a widget class, using an option" do
|
348
|
-
e = capture_exception(Fortitude::
|
346
|
+
e = capture_exception(Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
349
347
|
render_text_with_tilt("random_#{rand(1_000_000)}.rb", impossible_to_find_class_name_text(9), context_object, { },
|
350
348
|
{ :fortitude_class => "String" })
|
351
349
|
end
|
352
|
-
expect(e.
|
353
|
-
expect(e.actual_object).to eq(String)
|
350
|
+
expect(e.tried_class_names).to be_include("String")
|
354
351
|
expect(e.message).to match(/String/)
|
355
352
|
end
|
356
353
|
|
@@ -361,22 +358,20 @@ EOS
|
|
361
358
|
end
|
362
359
|
|
363
360
|
it "should fail with a nice message if you tell it to use something that isn't a class, using a comment in the template" do
|
364
|
-
e = capture_exception(Fortitude::
|
361
|
+
e = capture_exception(Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
365
362
|
render_text_with_tilt("random_#{rand(1_000_000)}.rb",
|
366
363
|
impossible_to_find_class_name_text(11, "#!fortitude_tilt_class: 12345"), context_object, { })
|
367
364
|
end
|
368
|
-
expect(e.
|
369
|
-
expect(e.actual_object).to be_nil
|
365
|
+
expect(e.tried_class_names).to be_include("12345")
|
370
366
|
expect(e.message).to match(/12345/)
|
371
367
|
end
|
372
368
|
|
373
369
|
it "should fail with a nice message if you tell it to use something that isn't a widget class, using a comment in the template" do
|
374
|
-
e = capture_exception(Fortitude::
|
370
|
+
e = capture_exception(Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
375
371
|
render_text_with_tilt("random_#{rand(1_000_000)}.rb",
|
376
372
|
impossible_to_find_class_name_text(12, "#!fortitude_tilt_class: String"), context_object, { })
|
377
373
|
end
|
378
|
-
expect(e.
|
379
|
-
expect(e.actual_object).to eq(String)
|
374
|
+
expect(e.tried_class_names).to be_include("String")
|
380
375
|
expect(e.message).to match(/String/)
|
381
376
|
end
|
382
377
|
end
|
@@ -0,0 +1,240 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
describe "Fortitude widget-class-from-(file|source) support", :type => :system do
|
4
|
+
def tempdir
|
5
|
+
@tempdir ||= begin
|
6
|
+
out = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'tmp', 'spec', 'widget_class_from_spec')
|
7
|
+
FileUtils.rm_rf(out)
|
8
|
+
FileUtils.mkdir_p(out)
|
9
|
+
out
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def splat!(filename, text)
|
14
|
+
full_path = File.join(tempdir, filename)
|
15
|
+
FileUtils.mkdir_p(File.dirname(full_path))
|
16
|
+
File.open(full_path, 'w') { |f| f << text }
|
17
|
+
full_path
|
18
|
+
end
|
19
|
+
|
20
|
+
def wcfs(*args)
|
21
|
+
::Fortitude::Widget.widget_class_from_source(*args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def wcff(filename, *args)
|
25
|
+
filename = File.join(tempdir, filename)
|
26
|
+
::Fortitude::Widget.widget_class_from_file(filename, *args)
|
27
|
+
end
|
28
|
+
|
29
|
+
context "with no hints" do
|
30
|
+
it "should return a widget subclass that's already been evaluated" do
|
31
|
+
text = "class WidgetFromClass1 < Fortitude::Widget; end"
|
32
|
+
::Object.class_eval(text)
|
33
|
+
expect(wcfs(text)).to eq(::WidgetFromClass1)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should automatically evaluate the source, if needed" do
|
37
|
+
text = "class WidgetFromClass2 < Fortitude::Widget; end"
|
38
|
+
expect(wcfs(text)).to eq(::WidgetFromClass2)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should fail if given source code it can't guess the class name from" do
|
42
|
+
expect do
|
43
|
+
wcfs("cname = 'WidgetFromCla' + 'ss3'; eval('class ' + cname + ' < ::Fortitude::Widget; end')")
|
44
|
+
end.to raise_error(::Fortitude::Widget::Files::CannotDetermineWidgetClassNameError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should fail if the source code contains something that isn't a widget class" do
|
48
|
+
cdne = capture_exception(::Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
49
|
+
wcfs("class WidgetFromClass11; end")
|
50
|
+
end
|
51
|
+
expect(cdne.tried_class_names).to be_include("WidgetFromClass11")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should work if given something that's a grandchild of Fortitude::Widget, not a direct child" do
|
55
|
+
::Object.class_eval("class WidgetFromClass12Parent < ::Fortitude::Widget; end")
|
56
|
+
expect(wcfs("class WidgetFromClass12 < WidgetFromClass12Parent; end")).to eq(WidgetFromClass12)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should be able to guess the class name of a class namespaced in a module" do
|
60
|
+
module ::Wcfs1; end
|
61
|
+
expect(wcfs("class Wcfs1::WidgetFromClass6 < ::Fortitude::Widget; end")).to eq(Wcfs1::WidgetFromClass6)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should be able to guess the class name of a class nested in a module" do
|
65
|
+
expect(wcfs("module Wcfs2; class WidgetFromClass7 < ::Fortitude::Widget; end; end")).to eq(Wcfs2::WidgetFromClass7)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should be able to guess the class name of a class nested in a module several levels deep" do
|
69
|
+
expect(wcfs("module Wcfs3; module Wcfs4; class WidgetFromClass8 < ::Fortitude::Widget; end; end; end")).to eq(Wcfs3::Wcfs4::WidgetFromClass8)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should be able to guess the class name of a class nested in a module several levels deep, using newlines" do
|
73
|
+
expect(wcfs(%{module Wcfs5
|
74
|
+
module Wcfs6
|
75
|
+
class WidgetFromClass9 < ::Fortitude::Widget
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end})).to eq(Wcfs5::Wcfs6::WidgetFromClass9)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should be able to guess the class name of a class with both nesting and namespacing" do
|
82
|
+
::Object.class_eval %{module Wcfs7; module Wcfs8; module Wcfs9; end; end; end}
|
83
|
+
|
84
|
+
expect(wcfs(%{module Wcfs7
|
85
|
+
module Wcfs8
|
86
|
+
class Wcfs9::WidgetFromClass10 < ::Fortitude::Widget
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end})).to eq(Wcfs7::Wcfs8::Wcfs9::WidgetFromClass10)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "with an explicit class name provided" do
|
94
|
+
it "should be able to get a widget class, even if it can't get it by parsing the source code" do
|
95
|
+
result = wcfs("cname = 'WidgetFromCla' + 'ss4'; eval('class ' + cname + ' < ::Fortitude::Widget; end')",
|
96
|
+
:class_names_to_try => [ 'WidgetFromClass4' ])
|
97
|
+
expect(result).to eq(WidgetFromClass4)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should be able to get a widget class, even if it can't get it by parsing the source code, if passed in among a bunch of other crap" do
|
101
|
+
result = wcfs("cname = 'WidgetFromCla' + 'ss5'; eval('class ' + cname + ' < ::Fortitude::Widget; end')",
|
102
|
+
:class_names_to_try => [ 'String', 'Integer', 'Foo::Bar::Baz', 'WidgetFromClass5', 'Baz::Quux' ])
|
103
|
+
expect(result).to eq(WidgetFromClass5)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context "with a magic comment provided" do
|
108
|
+
it "should be able to get a widget class, even if it can't get it by parsing the source code" do
|
109
|
+
result = wcfs(%{#!fortitude_class: WidgetFromClass13
|
110
|
+
cname = 'WidgetFromCla' + 'ss13'; eval('class ' + cname + ' < ::Fortitude::Widget; end')})
|
111
|
+
expect(result).to eq(WidgetFromClass13)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should be able to get a widget class, even if it can't get it by parsing the source code, using an alternate magic comment text" do
|
115
|
+
result = wcfs(%{#!foo_bar_baz: WidgetFromClass14
|
116
|
+
cname = 'WidgetFromCla' + 'ss14'; eval('class ' + cname + ' < ::Fortitude::Widget; end')},
|
117
|
+
:magic_comment_text => %w{bar_baz_quux foo_bar_baz foo_Bar})
|
118
|
+
expect(result).to eq(WidgetFromClass14)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should be able to get a widget class, even if it can't get it by parsing the source code, using a standard magic comment text, even if an alternate is provided" do
|
122
|
+
result = wcfs(%{#!fortitude_class: WidgetFromClass20
|
123
|
+
cname = 'WidgetFromCla' + 'ss20'; eval('class ' + cname + ' < ::Fortitude::Widget; end')},
|
124
|
+
:magic_comment_text => %w{bar_baz_quux foo_bar_baz foo_Bar})
|
125
|
+
expect(result).to eq(WidgetFromClass20)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should be able to get a widget class, even if it can't get it by parsing the source code, even at the end" do
|
129
|
+
result = wcfs(%{
|
130
|
+
cname = 'WidgetFromCla' + 'ss15'; eval('class ' + cname + ' < ::Fortitude::Widget; end')
|
131
|
+
#!fortitude_class: WidgetFromClass15})
|
132
|
+
expect(result).to eq(WidgetFromClass15)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should not fail if it's wrong (something that doesn't exist)" do
|
136
|
+
text = %{#!fortitude_class: Whatever
|
137
|
+
class WidgetFromClass16 < Fortitude::Widget; end}
|
138
|
+
expect(wcfs(text)).to eq(::WidgetFromClass16)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should not fail if it's wrong (something that isn't a widget class)" do
|
142
|
+
text = %{#!fortitude_class: String
|
143
|
+
class WidgetFromClass17 < Fortitude::Widget; end}
|
144
|
+
expect(wcfs(text)).to eq(::WidgetFromClass17)
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should tell you the magic comment texts it was looking for in the error if it can't find a class" do
|
148
|
+
cdne = capture_exception(::Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
149
|
+
wcfs(%{class WidgetFromClass18; end})
|
150
|
+
end
|
151
|
+
expect(cdne.magic_comment_texts).to eq(%w{fortitude_class})
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should tell you the magic comment texts it was looking for in the error if it can't find a class and custom magic texts were provided" do
|
155
|
+
cdne = capture_exception(::Fortitude::Widget::Files::CannotDetermineWidgetClassNameError) do
|
156
|
+
wcfs(%{class WidgetFromClass19; end}, :magic_comment_text => %w{foo_bar bar_baz})
|
157
|
+
end
|
158
|
+
expect(cdne.magic_comment_texts).to be_include('fortitude_class')
|
159
|
+
expect(cdne.magic_comment_texts).to be_include('foo_bar')
|
160
|
+
expect(cdne.magic_comment_texts).to be_include('bar_baz')
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context "when given a file" do
|
165
|
+
it "should still be able to guess the class name correctly" do
|
166
|
+
splat!('widget_from_file_1.rb', %{class WidgetFromClass21 < Fortitude::Widget; end})
|
167
|
+
expect(wcff('widget_from_file_1.rb')).to eq(WidgetFromClass21)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should still be able to use magic comments" do
|
171
|
+
splat!('widget_from_file_2.rb', %{#!fortitude_class: WidgetFromClass22\ncname = 'WidgetFromCla' + 'ss22'; eval('class ' + cname + ' < ::Fortitude::Widget; end')})
|
172
|
+
expect(wcff('widget_from_file_2.rb')).to eq(WidgetFromClass22)
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should be able to use a root directory to infer a class name" do
|
176
|
+
::Object.class_eval("module Wcfs10; module Wcfs11; end; end")
|
177
|
+
splat!('wcfs10/wcfs_11/widget_from_class_23.rb', %{cname = 'WidgetFromCla' + 'ss23'; eval('class Wcfs10::Wcfs11::' + cname + ' < ::Fortitude::Widget; end')})
|
178
|
+
expect(wcff('wcfs10/wcfs_11/widget_from_class_23.rb', :root_dirs => tempdir)).to eq(Wcfs10::Wcfs11::WidgetFromClass23)
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should be able to use an array of root directories to infer a class name, and find the right one" do
|
182
|
+
::Object.class_eval("module Wcfs10; module Wcfs11; end; end")
|
183
|
+
splat!('bar/wcfs10/wcfs_11/widget_from_class_23.rb', %{cname = 'WidgetFromCla' + 'ss23'; eval('class Wcfs10::Wcfs11::' + cname + ' < ::Fortitude::Widget; end')})
|
184
|
+
expect(wcff('bar/wcfs10/wcfs_11/widget_from_class_23.rb', :root_dirs => [ "#{tempdir}/foo", "#{tempdir}/bar" ])).to eq(Wcfs10::Wcfs11::WidgetFromClass23)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should prioritize a magic comment above class names you told it to try or directory-based names or scanned source text" do
|
189
|
+
splat!('widget_baz.rb', %{
|
190
|
+
#!fortitude_class: WidgetFoo
|
191
|
+
|
192
|
+
eval('class WidgetB' +
|
193
|
+
'az < Fortitud' +
|
194
|
+
'e::Widget; end')
|
195
|
+
eval('class WidgetB' +
|
196
|
+
'ar < Fortitud' +
|
197
|
+
'e::Widget; end')
|
198
|
+
class WidgetQuux < Fortitude::Widget; end
|
199
|
+
eval('class WidgetF' +
|
200
|
+
'oo < Fortitud' +
|
201
|
+
'e::Widget; end')
|
202
|
+
})
|
203
|
+
|
204
|
+
expect(wcff('widget_baz.rb', :root_dirs => tempdir, :class_names_to_try => %w{WidgetBar})).to eq(WidgetFoo)
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should prioritize class names you told it to try above directory-based names or scanned source text" do
|
208
|
+
splat!('widget_baz.rb', %{
|
209
|
+
eval('class WidgetB' +
|
210
|
+
'az < Fortitud' +
|
211
|
+
'e::Widget; end')
|
212
|
+
eval('class WidgetB' +
|
213
|
+
'ar < Fortitud' +
|
214
|
+
'e::Widget; end')
|
215
|
+
class WidgetQuux < Fortitude::Widget; end
|
216
|
+
eval('class WidgetF' +
|
217
|
+
'oo < Fortitud' +
|
218
|
+
'e::Widget; end')
|
219
|
+
})
|
220
|
+
|
221
|
+
expect(wcff('widget_baz.rb', :root_dirs => tempdir, :class_names_to_try => %w{WidgetBar})).to eq(WidgetBar)
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should prioritize directory-based names above scanned source text" do
|
225
|
+
splat!('widget_baz.rb', %{
|
226
|
+
eval('class WidgetB' +
|
227
|
+
'az < Fortitud' +
|
228
|
+
'e::Widget; end')
|
229
|
+
eval('class WidgetB' +
|
230
|
+
'ar < Fortitud' +
|
231
|
+
'e::Widget; end')
|
232
|
+
class WidgetQuux < Fortitude::Widget; end
|
233
|
+
eval('class WidgetF' +
|
234
|
+
'oo < Fortitud' +
|
235
|
+
'e::Widget; end')
|
236
|
+
})
|
237
|
+
|
238
|
+
expect(wcff('widget_baz.rb', :root_dirs => tempdir)).to eq(WidgetBaz)
|
239
|
+
end
|
240
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
describe "Fortitude::Widget#widget method", :type => :system do
|
2
|
+
let(:child_widget_class) do
|
3
|
+
widget_class do
|
4
|
+
needs :value => nil
|
5
|
+
|
6
|
+
def content
|
7
|
+
p "child widget: #{value.inspect}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def parent_widget_class(&block)
|
13
|
+
out = widget_class do
|
14
|
+
class << self
|
15
|
+
attr_accessor :child_widget_class
|
16
|
+
end
|
17
|
+
|
18
|
+
def child_widget_class
|
19
|
+
self.class.child_widget_class
|
20
|
+
end
|
21
|
+
|
22
|
+
define_method(:content, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
out.child_widget_class = child_widget_class
|
26
|
+
out
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should let you render one widget from another by specifying it as an instance" do
|
30
|
+
expect(render(parent_widget_class { text "before"; widget child_widget_class.new; text "after" })).to eq(
|
31
|
+
"before<p>child widget: nil</p>after")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should let you render one widget from another by specifying it as an instance, passing parameters" do
|
35
|
+
expect(render(parent_widget_class { text "before"; widget child_widget_class.new(:value => 123); text "after" })).to eq(
|
36
|
+
"before<p>child widget: 123</p>after")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should let you render one widget from another by specifying it as just a class" do
|
40
|
+
expect(render(parent_widget_class { text "before"; widget child_widget_class; text "after" })).to eq(
|
41
|
+
"before<p>child widget: nil</p>after")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should let you render one widget from another by specifying it as a class, and a hash of parameters" do
|
45
|
+
expect(render(parent_widget_class { text "before"; widget child_widget_class, :value => 123; text "after" })).to eq(
|
46
|
+
"before<p>child widget: 123</p>after")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not let you specify anything but a Hash as the second parameter" do
|
50
|
+
expect { render(parent_widget_class { text "before"; widget child_widget_class, 123; text "after" }) }.to raise_error
|
51
|
+
end
|
52
|
+
end
|