erector 0.5.1 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/README.txt +6 -5
  2. data/VERSION.yml +5 -0
  3. data/bin/{erect → erector} +0 -0
  4. data/lib/erector.rb +3 -1
  5. data/lib/erector/erect.rb +1 -1
  6. data/lib/erector/erected.rb +1 -1
  7. data/lib/erector/rails.rb +2 -1
  8. data/lib/erector/rails/extensions/action_controller.rb +25 -7
  9. data/lib/erector/rails/extensions/rails_widget.rb +38 -0
  10. data/lib/erector/rails/extensions/{widget.rb → rails_widget/helpers.rb} +2 -9
  11. data/lib/erector/rails/rails_version.rb +6 -0
  12. data/lib/erector/rails/template_handlers/action_view_template_handler.rb +43 -11
  13. data/lib/erector/version.rb +4 -2
  14. data/lib/erector/widget.rb +221 -74
  15. data/lib/erector/widgets/table.rb +34 -8
  16. data/spec/erector/indentation_spec.rb +39 -24
  17. data/spec/erector/widget_spec.rb +197 -64
  18. data/spec/erector/widgets/table_spec.rb +3 -3
  19. data/spec/spec.opts +1 -0
  20. data/spec/spec_helper.rb +2 -4
  21. data/spec/spec_suite.rb +6 -12
  22. metadata +24 -70
  23. data/lib/erector/rails/extensions/action_controller/1.2.5/action_controller.rb +0 -17
  24. data/lib/erector/rails/extensions/action_controller/2.2.0/action_controller.rb +0 -26
  25. data/lib/erector/rails/extensions/widget/1.2.5/widget.rb +0 -18
  26. data/lib/erector/rails/extensions/widget/2.2.0/widget.rb +0 -23
  27. data/lib/erector/rails/supported_rails_versions.rb +0 -13
  28. data/lib/erector/rails/template_handlers/1.2.5/action_view_template_handler.rb +0 -32
  29. data/lib/erector/rails/template_handlers/2.0.0/action_view_template_handler.rb +0 -36
  30. data/lib/erector/rails/template_handlers/2.1.0/action_view_template_handler.rb +0 -31
  31. data/lib/erector/rails/template_handlers/2.2.0/action_view_template_handler.rb +0 -46
  32. data/spec/erect/erect_spec.rb +0 -145
  33. data/spec/erect/erected_spec.rb +0 -80
  34. data/spec/erect/rhtml_parser_spec.rb +0 -318
@@ -1,145 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
2
-
3
- module Erector
4
- describe Erect do
5
- it "parses an empty command line" do
6
- erect = Erect.new([])
7
- erect.files.should == []
8
- end
9
-
10
- it "parses a command line with one filename on it" do
11
- erect = Erect.new(["foo.html"])
12
- erect.files.should == ["foo.html"]
13
- end
14
-
15
- it "parses a command line with several filenames on it" do
16
- erect = Erect.new(["foo.html", "bar/baz.html"])
17
- erect.files.should == ["foo.html", "bar/baz.html"]
18
- end
19
-
20
- it "is verbose by default, but quiet when told" do
21
- Erect.new([]).verbose.should be_true
22
- Erect.new(["-q"]).verbose.should be_false
23
- end
24
-
25
- it "parses a command line with several filenames and an option on it" do
26
- erect = Erect.new(["-q", "foo.html", "bar/baz.html"])
27
- erect.files.should == ["foo.html", "bar/baz.html"]
28
- end
29
-
30
- def capture
31
- output = StringIO.new
32
- $stdout = output
33
- yield
34
- output.string
35
- ensure
36
- $stdout = STDOUT
37
- end
38
-
39
- it "exits immediately from help" do
40
- output = capture do
41
- lambda {
42
- erect = Erect.new(["-h"])
43
- }.should raise_error(SystemExit)
44
- end
45
- output.should =~ /^Usage/
46
- end
47
-
48
- it "exits immediately from --version" do
49
- output = capture do
50
- lambda {
51
- erect = Erect.new(["--version"])
52
- }.should raise_error(SystemExit)
53
- end
54
- output.should == Erector::VERSION + "\n"
55
- end
56
-
57
- it "changes to html output" do
58
- erect = Erect.new(["--to-html"])
59
- erect.mode.should == :to_html
60
- end
61
-
62
- end
63
-
64
- describe "Erect functionally" do
65
-
66
- attr_reader :dir, :fred_html, :wilma_rhtml, :barney_html_erb, :fred_rb
67
-
68
- def create(file, body="hi")
69
- File.open(file, "w") do |f|
70
- f.puts(body)
71
- end
72
- end
73
-
74
- before :all do
75
- @dir = Dir.tmpdir + "/#{Time.now.to_i}" + "/explode"
76
- @fred_html = "#{dir}/fred.html"
77
- @wilma_rhtml = "#{dir}/wilma.rhtml"
78
- @barney_html_erb = "#{dir}/barney.html.erb"
79
- @fred_rb = "#{dir}/fred.rb"
80
-
81
- FileUtils.mkdir_p(dir)
82
- create(fred_html)
83
- create(wilma_rhtml)
84
- create(barney_html_erb)
85
- create(fred_rb, "class Fred < Erector::Widget\ndef render\ndiv 'dino'\nend\nend")
86
- end
87
-
88
- it "explodes dirs into .html etc. files when in to-rb mode" do
89
- erect = Erect.new(["--to-erector", dir])
90
- erect.files.sort.should == [barney_html_erb, fred_html, wilma_rhtml]
91
- end
92
-
93
- it "explodes dirs into .rb files when in to-html mode" do
94
- erect = Erect.new(["--to-html", dir])
95
- erect.files.should == [fred_rb]
96
- end
97
-
98
- it "outputs .rb files in the same directory as the input .html files" do
99
- erect = Erect.new(["--to-erector", "-q", fred_html])
100
- erect.run
101
- File.exist?(fred_rb).should be_true
102
- File.read(fred_rb).should include("text 'hi'")
103
- end
104
-
105
- it "outputs .html files in the same directory as the input .rb files" do
106
- betty_rb = "#{dir}/betty.rb"
107
- betty_html = "#{dir}/betty.html"
108
- create(betty_rb, "class Betty < Erector::Widget\ndef render\ndiv 'bam bam'\nend\nend")
109
-
110
- erect = Erect.new(["--to-html", "-q", betty_rb])
111
- erect.run
112
- File.exist?(betty_html).should be_true
113
- File.read(betty_html).should == "<div>bam bam</div>\n"
114
- end
115
-
116
- it "outputs .html files in the given directory" do
117
- create(fred_rb, "class Fred < Erector::Widget\ndef render\ndiv 'dino'\nend\nend")
118
-
119
-
120
- out_dir = "#{dir}/out"
121
- out_file = "#{out_dir}/fred.html"
122
- Erect.new([]).output_dir.should be_nil
123
- erect = Erect.new(["--to-html", "-o", "#{out_dir}", "-q", fred_rb])
124
- erect.output_dir.should == out_dir
125
- erect.run
126
- File.exist?(out_file).should be_true
127
- File.read(out_file).should == "<div>dino</div>\n"
128
- end
129
-
130
- it "supports the --add-to-svn option"
131
- it "supports the --delete-original option"
132
-
133
- it "skips rendering classes that aren't widgets" do
134
- mr_slate_rb = "#{dir}/mr_slate.rb"
135
- mr_slate_html = "#{dir}/mr_slate.html"
136
- create(mr_slate_rb, "class MrSlate\nend")
137
- erect = Erect.new(["-q", "--to-html", mr_slate_rb])
138
- erect.run
139
- File.exist?(mr_slate_html).should be_false
140
- end
141
-
142
- it "properly indents lines beginning with for, unless, etc."
143
- it "escapes single quotes inside text strings"
144
- end
145
- end
@@ -1,80 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
2
-
3
- module Erector
4
- describe Erected do
5
-
6
- it "picks the right file name" do
7
- Erected.new("foo.html.erb").filename.should == "foo.rb"
8
- Erected.new("foo.html").filename.should == "foo.rb"
9
- Erected.new("foo.bar.html").filename.should == "foo.rb"
10
- Erected.new("foo_bar.html.erb").filename.should == "foo_bar.rb"
11
- Erected.new("stuff/foo_bar.html.erb").filename.should == "stuff/foo_bar.rb"
12
- end
13
-
14
- it "picks a nice class name" do
15
- Erected.new("foo.html.erb").classname.should == "Foo"
16
- Erected.new("foo.html").classname.should == "Foo"
17
- Erected.new("foo.bar.html").classname.should == "Foo"
18
- Erected.new("foo_bar.html.erb").classname.should == "FooBar"
19
- Erected.new("stuff/foo_bar.html.erb").classname.should == "FooBar"
20
- end
21
-
22
- it "picks an even nicer class name if it's in a views dir" do
23
- Erected.new("app/views/stuff/foo_bar.html.erb").classname.should == "Views::Stuff::FooBar"
24
- Erected.new("views/stuff/foo_bar.html.erb").classname.should == "Views::Stuff::FooBar"
25
- end
26
-
27
- def convert(dir, input, output)
28
- dir = Dir.tmpdir + "/#{Time.now.to_i}" + "/#{dir}"
29
-
30
- FileUtils.mkdir_p(dir)
31
- html = "#{dir}/dummy.html"
32
- rb = "#{dir}/dummy.rb"
33
-
34
- File.open(html, "w") do |f|
35
- f.puts(input)
36
- end
37
-
38
- @e = Erected.new(html)
39
- @e.convert
40
-
41
- File.read(rb).should == output
42
- end
43
-
44
- it "converts a normal file" do
45
- convert(".",
46
- "<div>hello</div>",
47
- "class Dummy < Erector::Widget\n" +
48
- " def render\n" +
49
- " div do\n" +
50
- " text 'hello'\n" +
51
- " end\n" +
52
- " end\n" +
53
- "end\n"
54
- )
55
- end
56
-
57
- it "converts a views file" do
58
- convert("app/views/foos",
59
- "<div>hello</div>",
60
- "class Views::Foos::Dummy < Erector::Widget\n" +
61
- " def render\n" +
62
- " div do\n" +
63
- " text 'hello'\n" +
64
- " end\n" +
65
- " end\n" +
66
- "end\n"
67
- )
68
- end
69
-
70
- # todo: figure out if there is any such thing as unparsable HTML anymore
71
- # it "raises an exception if given unparsable HTML" do
72
- # begin
73
- # convert(".", "<", "")
74
- # rescue => e
75
- # e.to_s.should include("Could not parse")
76
- # end
77
- # end
78
-
79
- end
80
- end
@@ -1,318 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
2
-
3
- module ParserTestHelper
4
- def assert_evals_to_self(input)
5
- assert_evals_to(input, input)
6
- end
7
-
8
- def parse(input)
9
- result = @parser.parse(input)
10
- if result
11
- result.set_indent(0) if result.respond_to? :set_indent
12
- else
13
- puts @parser.failure_reason
14
- puts @parser.terminal_failures.join("\n")
15
- result.should_not be_nil
16
- end
17
- result
18
- end
19
- end
20
-
21
- describe RhtmlParser do
22
- include ParserTestHelper
23
-
24
- before :each do
25
- @parser = RhtmlParser.new
26
- end
27
-
28
- it "converts text" do
29
- parse("hello").convert.should == "text 'hello'\n"
30
- parse("hello maude!").convert.should == "text 'hello maude!'\n"
31
- parse(" hello ").convert.should == "text 'hello'\n"
32
- end
33
-
34
- it "unescapes HTML entities in text" do
35
- parse("&lt;").convert.should == "text '<'\n"
36
- parse("5 &gt; 2").convert.should == "text '5 > 2'\n"
37
- end
38
-
39
- it "converts self-closing tags" do
40
- parse("<br/>").convert.should == "br\n"
41
- parse("<br />").convert.should == "br\n"
42
- end
43
-
44
- it "converts open tag" do
45
- parse("<div>").convert.should == "div do\n"
46
- parse("<h1>").convert.should == "h1 do\n"
47
- end
48
-
49
- it "converts close tag" do
50
- parse("</div>").convert.should == "end\n"
51
- parse("</h1>").convert.should == "end\n"
52
- end
53
-
54
- it "converts two nested divs" do
55
- parse("<div><div></div></div>").convert.should ==
56
- "div do\n" +
57
- " div do\n" +
58
- " end\n" +
59
- "end\n"
60
- end
61
-
62
- it "converts two nested divs with whitespace" do
63
- parse("<div> <div> </div> </div>").convert.should ==
64
- "div do\n" +
65
- " div do\n" +
66
- " end\n" +
67
- "end\n"
68
- end
69
-
70
- it "converts no open, text, and no close tag" do
71
- parse("hello</div>").convert.should == "text 'hello'\nend\n"
72
- end
73
-
74
- it "converts open, text, and no close tag" do
75
- parse("<div>hello").convert.should == "div do\n text 'hello'\n"
76
- end
77
-
78
- it "converts open, text, close" do
79
- parse("<div>hello</div>").convert.should == "div do\n text 'hello'\nend\n"
80
- end
81
-
82
- it "autocloses an img tag" do
83
- parse("<img src='foo'>").convert.should == "img :src => 'foo'\n"
84
- end
85
-
86
- it "converts a scriptlet" do
87
- parse("<% foo %>").convert.should == "foo\n"
88
- end
89
-
90
- it "converts open, text, scriptlet, text, close" do
91
- parse("<div>hello <% 5.times do %> very <% end %> much</div>").convert.should ==
92
- "div do\n" +
93
- " text 'hello'\n" +
94
- " 5.times do\n" +
95
- " text 'very'\n" +
96
- " end\n" +
97
- " text 'much'\n" +
98
- "end\n"
99
- end
100
-
101
- it "converts open, scriptlet, text, close" do
102
- parse("<div><% 5.times do %> very <% end %> much</div>").convert.should ==
103
- "div do\n" +
104
- " 5.times do\n" +
105
- " text 'very'\n" +
106
- " end\n" +
107
- " text 'much'\n" +
108
- "end\n"
109
- end
110
-
111
- it "converts open, text, scriptlet, close" do
112
- parse("<div>hello <% 5.times do %> very <% end %></div>").convert.should ==
113
- "div do\n" +
114
- " text 'hello'\n" +
115
- " 5.times do\n" +
116
- " text 'very'\n" +
117
- " end\n" +
118
- "end\n"
119
- end
120
-
121
- it "converts printlets into rawtext statements" do
122
- parse("<%= 1+1 %>").convert.should == "rawtext 1+1\n"
123
- parse("<%= link_to \"mom\" %>").convert.should == "rawtext link_to(\"mom\")\n"
124
- end
125
-
126
- it "converts h-printlets into text statements" do
127
- parse("<%=h foo %>").convert.should == "text foo\n"
128
- parse("<%= h \"mom\" %>").convert.should == "text \"mom\"\n"
129
- end
130
-
131
- it "allows naked percent signs inside scriptlets" do
132
- parse("<% x = 10 % 5 %>").convert.should == "x = 10 % 5\n"
133
- end
134
-
135
- it "indents" do
136
- i = Erector::Indenting.new(nil, nil)
137
- i.line("foo").should == "foo\n"
138
- i.line_in("bar").should == "bar\n"
139
- i.line_in("baz").should == " baz\n"
140
- i.line("baf").should == " baf\n"
141
- i.line_out("end").should == " end\n"
142
- i.line_out("end").should == "end\n"
143
- end
144
-
145
- it "indents extra when told to" do
146
- parse("<div>hello</div>").set_indent(2).convert.should ==
147
- " div do\n" +
148
- " text 'hello'\n" +
149
- " end\n"
150
- end
151
-
152
- it "indents scriptlets ending with do and end" do
153
- parse("<% form_for :foo do |x,y| %><% 5.times do %>hello<% end %><% end %>bye").convert.should ==
154
- "form_for :foo do |x,y|\n" +
155
- " 5.times do\n" +
156
- " text 'hello'\n" +
157
- " end\n" +
158
- "end\n" +
159
- "text 'bye'\n"
160
- end
161
-
162
- it "converts HTML attributes" do
163
- parse("<div id='foo'/>").convert.should == "div :id => 'foo'\n"
164
- parse("<div id='foo' class='bar'/>").convert.should == "div :id => 'foo', :class => 'bar'\n"
165
- parse("<div id='foo'>bar</div>").convert.should == "div :id => 'foo' do\n text 'bar'\nend\n"
166
- end
167
-
168
- it "escapes single quotes inside attribute values" do
169
- @parser.root = :attribute
170
- parse("a=\"don't worry\"").convert.should == ":a => 'don\\'t worry'"
171
- end
172
-
173
- it "allows newlines where whitespace is allowed" do
174
- parse("<img src='foo' \nalt='bar' />").convert.should == "img :src => 'foo', :alt => 'bar'\n"
175
- end
176
-
177
- it "treats tab characters the same as spaces" do
178
- parse("<div \t />").convert.should == "div\n"
179
- end
180
-
181
- it "deals with HTML entities in text" do
182
- parse("&lt;").convert.should == "text '<'\n"
183
- end
184
-
185
- it "deals with a naked less-than or greater-than sign inside text" do
186
- parse("if x > 2 or x< 5 then").convert.should == "text 'if x > 2 or x< 5 then'\n"
187
- end
188
-
189
- it "wraps printlets in parens if necessary, to avoid warning: parenthesize argument(s) for future version" do
190
- parse("<%= h \"mom\" %>").convert.should == "text \"mom\"\n"
191
- parse("<%= h hi \"mom\" %>").convert.should == "text hi(\"mom\")\n"
192
-
193
- parse("<%= \"mom\" %>").convert.should == "rawtext \"mom\"\n"
194
- parse("<%= \"hi mom\" %>").convert.should == "rawtext \"hi mom\"\n"
195
- parse("<%= hi \"mom\" %>").convert.should == "rawtext hi(\"mom\")\n"
196
-
197
- parse("<%= link_to blah %>").convert.should == "rawtext link_to(blah)\n"
198
- parse("<%= link_to blah blah %>").convert.should == "rawtext link_to(blah blah)\n"
199
- parse("<%= link_to blah(blah) %>").convert.should == "rawtext link_to(blah(blah))\n"
200
-
201
- parse("<%= link_to(blah) %>").convert.should == "rawtext link_to(blah)\n"
202
- end
203
-
204
- it "won't parenthesize expressions" do
205
- parse("<%= h foo / bar %>").convert.should == "text foo / bar\n"
206
- end
207
-
208
- it "converts yield so layouts work" do
209
- pending("easy enough to make this pass, but the result doesn't seem to work as a layout")
210
- parse("<%= yield %>").convert.should == "rawtext @content\n"
211
- parse("<%= \"yield\" %>").convert.should == "rawtext \"yield\"\n"
212
- parse("<%= \"the yield is good\" %>").convert.should == "rawtext \"the yield is good\"\n"
213
- end
214
-
215
- it "parses quoted strings" do
216
- @parser.root = :quoted
217
- parse("'foo'").value.should == "foo"
218
- parse("\"foo\"").value.should == "foo"
219
- end
220
-
221
- it "converts attributes in isolation" do
222
- @parser.root = :attribute
223
- parse("a='foo'").convert.should == ":a => 'foo'"
224
- parse("a=\"foo\"").convert.should == ":a => 'foo'"
225
- end
226
-
227
- it "parses a set of attributes" do
228
- @parser.root = :attributes
229
- parse("a='foo' b='bar'").convert.should == " :a => 'foo', :b => 'bar'"
230
- end
231
-
232
- it "works with namespaced attributes" do
233
- @parser.root = :attribute
234
- parse('xml:lang="en"').convert.should == "'xml:lang' => 'en'"
235
- end
236
-
237
- it "deals with HTML entities in attribute values" do
238
- @parser.root = :attribute
239
- parse("foo='b<r'").convert.should == ":foo => 'b<r'"
240
- parse("foo='b&lt;r'").convert.should == ":foo => 'b<r'"
241
- end
242
-
243
- it "converts DOCTYPEs" do
244
- html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
245
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
246
- parse(html).convert.should == "rawtext '#{html}'\n"
247
- end
248
-
249
- ## More functional-type specs below here
250
-
251
- it "ignores spaces, tabs and newlines" do
252
- parse(" <div>\t\n" + "\thello !" + "\n\t</div>").convert.should ==
253
- "div do\n" +
254
- " text 'hello !'\n" +
255
- "end\n"
256
- end
257
-
258
- it "parses some scaffolding" do
259
- parse("<p>
260
- <b>Name:</b>
261
- <%=h @foo.name %>
262
- </p>").convert.should ==
263
- "p do\n" +
264
- " b do\n" +
265
- " text 'Name:'\n" +
266
- " end\n" +
267
- " text @foo.name\n" +
268
- "end\n"
269
- end
270
-
271
- it "parses edit.erb.html" do
272
- parse("<h1>Editing foo</h1>
273
-
274
- <%= error_messages_for :foo %>
275
-
276
- <% form_for(@foo) do |f| %>
277
- <p>
278
- <b>Name</b><br />
279
- <%= f.text_field :name %>
280
- </p>
281
-
282
- <p>
283
- <b>Age</b><br />
284
- <%= f.text_field :age %>
285
- </p>
286
-
287
- <p>
288
- <%= f.submit \"Update\" %>
289
- </p>
290
- <% end %>
291
-
292
- <%= link_to 'Show', @foo %> |
293
- <%= link_to 'Back', foos_path %>
294
- ")
295
- end
296
-
297
- it "parses show.html.erb" do
298
- parse("<p>
299
- <b>Name:</b>
300
- <%=h @foo.name %>
301
- </p>
302
-
303
- <p>
304
- <b>Age:</b>
305
- <%=h @foo.age %>
306
- </p>
307
-
308
-
309
- <%= link_to 'Edit', edit_foo_path(@foo) %> |
310
- <%= link_to 'Back', foos_path %>
311
- ")
312
- end
313
-
314
- it "does meta" do
315
- parse('<meta http-equiv="content-type" content="text/html;charset=UTF-8" />').convert.should ==
316
- "meta 'http-equiv' => 'content-type', :content => 'text/html;charset=UTF-8'\n"
317
- end
318
- end