merb_helpers 0.4.0 → 0.5

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.
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: merb_helpers
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.0
7
- date: 2007-11-05 00:00:00 -08:00
6
+ version: "0.5"
7
+ date: 2008-01-09 00:00:00 -08:00
8
8
  summary: Helper support for merb (similar to the Rails form helpers)
9
9
  require_paths:
10
10
  - lib
@@ -33,13 +33,13 @@ files:
33
33
  - README
34
34
  - Rakefile
35
35
  - TODO
36
- - lib/form_helpers.rb
37
- - lib/form_model.rb
38
36
  - lib/merb_helpers
39
- - lib/merb_helpers/merbtasks.rb
40
37
  - lib/merb_helpers.rb
41
- - specs/merb_helpers_spec.rb
42
- - specs/spec_helper.rb
38
+ - lib/tasks
39
+ - lib/merb_helpers/date_time_helpers.rb
40
+ - lib/merb_helpers/form_helpers.rb
41
+ - lib/merb_helpers/form_model.rb
42
+ - lib/tasks/merb_tasks.rb
43
43
  test_files: []
44
44
 
45
45
  rdoc_options: []
@@ -52,8 +52,8 @@ executables: []
52
52
 
53
53
  extensions: []
54
54
 
55
- requirements:
56
- - merb
55
+ requirements: []
56
+
57
57
  dependencies:
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: merb
@@ -62,5 +62,5 @@ dependencies:
62
62
  requirements:
63
63
  - - ">="
64
64
  - !ruby/object:Gem::Version
65
- version: "0.4"
65
+ version: "0.5"
66
66
  version:
data/lib/form_helpers.rb DELETED
@@ -1,183 +0,0 @@
1
- module Merb
2
- module Helpers
3
- module Form
4
-
5
- def error_messages_for(obj, error_li = nil, html_class='submittal_failed')
6
- return "" unless obj.errors
7
- header_message = block_given? ? yield(obj.errors) : "<h2>Form submittal failed because of #{obj.errors.size} problems</h2>"
8
- ret = %Q{
9
- <div class='#{html_class}'>
10
- #{header_message}
11
- <ul>
12
- }
13
- obj.errors.each {|err| ret << (error_li ? error_li.call(err) : "<li>#{err[0]} #{err[1]}</li>") }
14
- ret << %Q{
15
- </ul>
16
- </div>
17
- }
18
- end
19
-
20
- def obj_from_ivar_or_sym(obj)
21
- obj.is_a?(Symbol) ? instance_variable_get("@#{obj}") : obj
22
- end
23
-
24
- def tag(tag_name, contents, attrs = {})
25
- open_tag(tag_name, attrs) + contents + "</#{tag_name}>"
26
- end
27
-
28
- def form_tag(attrs = {}, &block)
29
- attrs.merge!( :enctype => "multipart/form-data" ) if attrs.delete(:multipart)
30
- fake_form_method = set_form_method(attrs)
31
- concat(open_tag("form", attrs), block.binding)
32
- concat(generate_fake_form_method(fake_form_method), block.binding) if fake_form_method
33
- concat(capture(&block), block.binding)
34
- concat("</form>", block.binding)
35
- end
36
-
37
- def form_for(obj, attrs={}, &block)
38
- obj = obj_from_ivar_or_sym(obj)
39
- fake_form_method = set_form_method(attrs, obj)
40
- concat(open_tag("form", attrs), block.binding)
41
- concat(generate_fake_form_method(fake_form_method), block.binding) if fake_form_method
42
- fields_for(obj, attrs, &block)
43
- concat("</form>", block.binding)
44
- end
45
-
46
- def fields_for(obj, attrs=nil, &block)
47
- obj = obj_from_ivar_or_sym(obj)
48
- old_obj, @_obj = @_obj, obj
49
- @_object_name = "#{@_obj.class}".snake_case
50
- old_block, @_block = @_block, block
51
-
52
- concat(capture(&block), block.binding)
53
-
54
- @_obj, @_block = old_obj, old_block
55
- end
56
-
57
- def control_name(col)
58
- "#{@_object_name}[#{col}]"
59
- end
60
-
61
- def control_value(col)
62
- @_obj.send(col)
63
- end
64
-
65
- def control_name_value(col, attrs)
66
- {:name => control_name(col), :value => control_value(col)}.merge(attrs)
67
- end
68
-
69
- def text_control(col, attrs = {})
70
- errorify_field(attrs, col)
71
- text_field(control_name_value(col, attrs))
72
- end
73
-
74
- def text_field(attrs = {})
75
- attrs.merge!(:type => "text")
76
- optional_label(attrs) { self_closing_tag("input", attrs) }
77
- end
78
-
79
- def checkbox_control(col, attrs = {})
80
- errorify_field(attrs, col)
81
- val = @_obj.send(col)
82
- attrs.merge!(:value => val ? "1" : "0")
83
- attrs.merge!(:checked => "checked") if val
84
- checkbox_field(control_name_value(col, attrs))
85
- end
86
-
87
- def checkbox_field(attrs = {})
88
- attrs.merge!(:type => :checkbox)
89
- attrs.add_html_class!("checkbox")
90
- optional_label(attrs){self_closing_tag("input", attrs)}
91
- end
92
-
93
- def hidden_control(col, attrs = {})
94
- attrs.delete(:label)
95
- errorify_field(attrs, col)
96
- hidden_field(control_name_value(col, attrs))
97
- end
98
-
99
- def hidden_field(attrs = {})
100
- attrs.delete(:label)
101
- attrs.merge!(:type => :hidden)
102
- self_closing_tag("input", attrs)
103
- end
104
-
105
- def radio_group_control(col, options = {}, attrs = {})
106
- errorify_field(attrs, col)
107
- val = @_obj.send(col)
108
- ret = ""
109
- options.each do |opt|
110
- hash = {:name => "#{@_object_name}[#{col}]", :value => opt, :label => opt}
111
- hash.merge!(:selected => "selected") if val.to_s == opt.to_s
112
- ret << radio_field(hash)
113
- end
114
- ret
115
- end
116
-
117
- def radio_field(attrs = {})
118
- attrs.merge!(:type => "radio")
119
- attrs.add_html_class!("radio")
120
- optional_label(attrs){self_closing_tag("input", attrs)}
121
- end
122
-
123
- def text_area_control(col, attrs = {})
124
- attrs ||= {}
125
- errorify_field(attrs, col)
126
- text_area_field(control_value(col), attrs.merge(:name => control_name(col)))
127
- end
128
-
129
- def text_area_field(val, attrs = {})
130
- val ||=""
131
- optional_label(attrs) do
132
- open_tag("textarea", attrs) +
133
- val +
134
- "</textarea>"
135
- end
136
- end
137
-
138
- def submit_button(contents, attrs = {})
139
- attrs.merge!(:type => "submit")
140
- tag("button", contents, attrs)
141
- end
142
-
143
- def label(name, contents = "", attrs = {})
144
- tag("label", name.to_s + contents, attrs)
145
- end
146
-
147
- private
148
- # Fake out the browser to send back the method for RESTful stuff.
149
- # Fall silently back to post if a method is given that is not supported here
150
- def set_form_method(options = {}, obj = nil)
151
- options[:method] ||= (!obj || obj.new_record? ? :post : :put)
152
- if ![:get,:post].include?(options[:method])
153
- fake_form_method = options[:method] if [:put, :delete].include?(options[:method])
154
- options[:method] = :post
155
- end
156
- fake_form_method
157
- end
158
-
159
- def generate_fake_form_method(fake_form_method)
160
- fake_form_method ? hidden_field(:name => "_method", :value => "#{fake_form_method}") : ""
161
- end
162
-
163
- def optional_label(attrs = {})
164
- label = attrs.delete(:label) if attrs
165
- if label
166
- title = label.is_a?(Hash) ? label.delete(:title) : label
167
- label(title, yield, label.is_a?(Hash) ? label : {})
168
- else
169
- yield
170
- end
171
- end
172
-
173
- def errorify_field(attrs, col)
174
- attrs.add_html_class!("error") if !@_obj.valid? && @_obj.errors.on(col)
175
- end
176
-
177
- end
178
- end
179
- end
180
-
181
- class Merb::ViewContext
182
- include Merb::Helpers::Form
183
- end
@@ -1,412 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
- require 'merb_helpers'
3
-
4
- include Merb::ViewContextMixin
5
- include Merb::ErubisCaptureMixin
6
- include Merb::Helpers::Form
7
-
8
- describe "error_messages_for" do
9
- before :each do
10
- @obj = Object.new
11
- def @obj.errors() [["foo", "bar"], ["baz", "bat"]] end
12
- end
13
-
14
- it "should build default error messages" do
15
- errs = error_messages_for(@obj)
16
- errs.should include("<h2>Form submittal failed because of 2 problems</h2>")
17
- errs.should include("<li>foo bar</li>")
18
- errs.should include("<li>baz bat</li>")
19
- end
20
-
21
- it "should accept a custom HTML class" do
22
- errs = error_messages_for(@obj, nil, "foo")
23
- errs.should include("<div class='foo'>")
24
- end
25
-
26
- it "should accept a custom header block" do
27
- errs = error_messages_for(@obj) {|errs| "<h3>Failure: #{errs.size} issues</h3>"}
28
- errs.should include("<h3>Failure: 2 issues</h3>")
29
- end
30
-
31
- it "should accept a custom error list item block" do
32
- errs = error_messages_for(@obj, proc {|err| "<li>#{err[0]} column: #{err[1]}</li>"})
33
- errs.should include("<li>foo column: bar</li>")
34
- end
35
-
36
- end
37
-
38
- describe "form_tag" do
39
- it_should_behave_like "FakeBufferConsumer"
40
-
41
- it "should use the post method by default" do
42
- form_tag do
43
- _buffer << "CONTENT"
44
- end
45
- _buffer.should match_tag(:form, :method => "post")
46
- _buffer.should include("CONTENT")
47
- end
48
-
49
- it "should use the get method if set" do
50
- form_tag :method => :get do
51
- _buffer << "CONTENT"
52
- end
53
- _buffer.should match_tag(:form, :method => "get")
54
- _buffer.should include("CONTENT")
55
- end
56
-
57
- it "should fake out the put method if set" do
58
- form_tag :method => :put do
59
- _buffer << "CONTENT"
60
- end
61
- _buffer.should match_tag(:form, :method => "post")
62
- _buffer.should match_tag(:input, :type => "hidden", :name => "_method", :value => "put")
63
- end
64
-
65
- it "should fake out the delete method if set" do
66
- form_tag :method => :delete do
67
- _buffer << "CONTENT"
68
- end
69
- _buffer.should match_tag(:form, :method => "post")
70
- _buffer.should match_tag(:input, :type => "hidden", :name => "_method", :value => "delete")
71
- end
72
-
73
- it "should silently set method to post if an unsupported method is used" do
74
- form_tag :method => :dodgy do
75
- _buffer << "CONTENT"
76
- end
77
- _buffer.should match_tag(:form, :method => "post")
78
- _buffer.should_not match_tag(:input, :type => "hidden", :name => "_method", :value => "dodgy")
79
- end
80
-
81
- it "should take create a form" do
82
- form_tag(:action => "foo", :method => :post) do
83
- _buffer << "Hello"
84
- end
85
- _buffer.should match_tag(:form, :action => "foo", :method => "post")
86
- _buffer.should include("Hello")
87
- end
88
-
89
- it "should set a form to be mutlipart" do
90
- form_tag( :action => "foo", :method => :post, :multipart => true ) do
91
- _buffer << "CONTENT"
92
- end
93
- _buffer.should match_tag( :form, :action => "foo", :method => "post", :enctype => "multipart/form-data")
94
- _buffer.should include("CONTENT")
95
- end
96
- end
97
-
98
- describe "form_for" do
99
- it_should_behave_like "FakeBufferConsumer"
100
-
101
- it "should wrap the contents in a form tag" do
102
- form_for(:obj) do
103
- _buffer << "Hello"
104
- end
105
- _buffer.should match_tag(:form, :method => "post")
106
- _buffer.should match_tag(:input, :type => "hidden", :value => "put", :name => "_method")
107
- end
108
-
109
- it "should set the method to post be default" do
110
- @obj2 = FakeModel2.new
111
- form_for(:obj2) do
112
- end
113
- _buffer.should match_tag(:form, :method => "post")
114
- _buffer.should_not match_tag(:input, :type => "hidden", :name => "_method")
115
- end
116
-
117
- it "should support PUT if the object passed in is not a new_record? via a hidden field" do
118
- form_for(:obj) do
119
- end
120
- _buffer.should match_tag(:form, :method => "post")
121
- _buffer.should match_tag(:input, :type => "hidden", :value => "put", :name => "_method")
122
- end
123
-
124
- end
125
-
126
- describe "fields_for" do
127
- it_should_behave_like "FakeBufferConsumer"
128
-
129
- it "should dump the contents in the context of the object" do
130
- fields_for(:obj) do
131
- text_control(:foo).should match_tag(:input, :type => "text", :value => "foowee")
132
- _buffer << "Hello"
133
- end
134
- _buffer.should == "Hello"
135
- end
136
-
137
- it "should be able to modify the context midstream" do
138
- @obj2 = FakeModel2.new
139
- form_for(:obj) do
140
- text_control(:foo).should match_tag(:input, :type => "text", :value => "foowee")
141
- fields_for(:obj2) do
142
- text_control(:foo).should match_tag(:input, :name => "fake_model2[foo]", :type => "text", :value => "foowee2")
143
- end
144
- text_control(:foo).should match_tag(:input, :type => "text", :value => "foowee")
145
- end
146
- end
147
-
148
- it "should handle an explicit nil attribute" do
149
- fields_for(:obj, nil) do
150
- _buffer << text_control(:foo)
151
- end
152
- _buffer.should match_tag(:input, :name => "fake_model[foo]", :value => "foowee", :type => "text")
153
- end
154
-
155
- end
156
-
157
- describe "text_field (basic)" do
158
- it_should_behave_like "FakeBufferConsumer"
159
-
160
- it "should return a basic text field based on the values passed in" do
161
- text_field(:name => "foo", :value => "bar").should match_tag( :input, :type => "text", :name => "foo", :value => "bar")
162
- end
163
-
164
- it "should wrap the field in a label if the :label option is passed to the text_field" do
165
- result = text_field(:label => "LABEL" )
166
- result.should match(/<label>LABEL<input type="text"\s*\/><\/label>/)
167
- end
168
- end
169
-
170
- describe "text_control (data bound)" do
171
- it_should_behave_like "FakeBufferConsumer"
172
-
173
- it "should take a string object and return a useful text control" do
174
- f = form_for :obj do
175
- text_control(:foo).should match_tag(:input, :type => "text", :name => "fake_model[foo]", :value => "foowee")
176
- end
177
- end
178
-
179
- it "should take additional attributes and use them" do
180
- form_for :obj do
181
- text_control(:foo, :bar => "7").should match_tag(:input, :type => "text", :name => "fake_model[foo]", :value => "foowee", :bar => "7")
182
- end
183
- end
184
-
185
- it "should wrap the text_control in a label if the :label option is passed in" do
186
- form_for :obj do
187
- _buffer << text_control(:foo, :label => "LABEL")
188
- end
189
- _buffer.should match(/<label>LABEL<input/)
190
- res = _buffer.scan(/<[^>]*>/)
191
- res[2].should_not match_tag(:input, :label => "LABEL")
192
- end
193
- end
194
-
195
- describe "checkbox_field (basic)" do
196
- it "should return a basic checkbox based on the values passed in" do
197
- checkbox_field(:name => "foo", :checked => "checked").should match_tag(:input, :class => "checkbox", :name => "foo", :checked => "checked")
198
- end
199
-
200
- it "should wrap the checkbox_field in a label if the :label option is passed in" do
201
- result = checkbox_field(:label => "LABEL" )
202
- result.should match(/<label>LABEL<input/)
203
- res = result.scan(/<[^>]*>/)
204
- res[2].should_not match_tag(:input, :label => "LABEL")
205
- end
206
- end
207
-
208
- describe "checkbox_control (data bound)" do
209
- it_should_behave_like "FakeBufferConsumer"
210
-
211
- it "should take a string and return a useful checkbox control" do
212
- form_for :obj do
213
- checkbox_control(:baz).should match_tag(:input, :type =>"checkbox", :name => "fake_model[baz]", :class => "checkbox", :value => "1", :checked => "checked")
214
- checkbox_control(:bat).should match_tag(:input, :type =>"checkbox", :name => "fake_model[bat]", :class => "checkbox", :value => "0")
215
- end
216
- end
217
-
218
- it "should render controls with errors if their attribute contains an error" do
219
- form_for :obj do
220
- checkbox_control(:bazbad).should match_tag(:input, :type =>"checkbox", :name => "fake_model[bazbad]",
221
- :class => "error checkbox", :value => "1", :checked => "checked")
222
- checkbox_control(:batbad).should match_tag(:input, :type =>"checkbox", :name => "fake_model[batbad]",
223
- :class => "error checkbox", :value => "0")
224
- end
225
- end
226
-
227
- it "should wrap the checkbox_control in a label if the label option is passed in" do
228
- form_for :obj do
229
- _buffer << checkbox_control(:foo, :label => "LABEL")
230
- end
231
- _buffer.should match( /<label>LABEL<input/ )
232
- res = _buffer.scan(/<[^>]*>/)
233
- res[2].should_not match_tag(:input, :label => "LABEL")
234
- end
235
- end
236
-
237
- describe "hidden_field (basic)" do
238
-
239
- it "should return a basic checkbox based on the values passed in" do
240
- hidden_field(:name => "foo", :value => "bar").should match_tag(:input, :type => "hidden", :name => "foo", :value => "bar")
241
- end
242
-
243
- it "should not render a label if the :label option is passed in" do
244
- res = hidden_field(:label => "LABEL")
245
- res.should_not match(/<label>LABEL/)
246
- res.should_not match_tag(:input, :label=> "LABEL")
247
- end
248
- end
249
-
250
- describe "hidden_control (data bound)" do
251
- it_should_behave_like "FakeBufferConsumer"
252
-
253
- it "should take a string and return a useful checkbox control" do
254
- form_for :obj do
255
- hidden_control(:foo).should match_tag(:input, :type =>"hidden", :name => "fake_model[foo]", :value => "foowee")
256
- end
257
- end
258
-
259
- it "should render controls with errors if their attribute contains an error" do
260
- form_for :obj do
261
- hidden_control(:foobad).should match_tag(:input, :type =>"hidden", :name => "fake_model[foobad]", :value => "foowee", :class => "error")
262
- end
263
- end
264
-
265
- it "should not render a label if the :label option is passed in" do
266
- form_for :obj do
267
- res = hidden_control(:foo, :label => "LABEL")
268
- res.should_not match(/<label>LABEL/)
269
- res.should_not match_tag(:input, :label=> "LABEL")
270
- end
271
- end
272
-
273
- end
274
-
275
- describe "radio button (basic)" do
276
- it "should should return a basic radio button based on the values passed in" do
277
- radio_field(:name => "foo", :value => "bar").should match_tag(:input, :type => "radio", :name => "foo", :value => "bar")
278
- end
279
-
280
- it "should render a label when the label is passed in" do
281
- result = radio_field(:name => "foo", :value => "bar", :label => "LABEL")
282
- result.should match(/<label>LABEL<input/)
283
- res = result.scan(/<[^>]*>/)
284
- res[2].should_not match_tag(:input, :label => "LABEL")
285
- end
286
-
287
- end
288
-
289
- describe "radio button groups (data bound)" do
290
- it_should_behave_like "FakeBufferConsumer"
291
-
292
- it "should return a group of radio buttons" do
293
- form_for :obj do
294
- radio = radio_group_control(:foo, [:foowee, :baree]).scan(/<[^>]*>/)
295
- radio[1].should match_tag(:input, :type => "radio", :name => "fake_model[foo]", :value => "foowee", :selected => "selected")
296
- radio[4].should match_tag(:input, :type => "radio", :name => "fake_model[foo]", :value => "baree")
297
- radio[2].should not_match_tag(:selected => "selected")
298
- end
299
- end
300
-
301
- it "should wrap the each radio button in the group in a label corresponding to the options" do
302
- form_for :obj do
303
- radio = radio_group_control(:foo, [:foowee, :baree])
304
- radio.scan( /<label>(foowee|baree)<input/ ).size.should == 2
305
- radio = radio.scan(/<[^>]*>/)
306
- radio[1].should_not match_tag(:input, :label => "LABEL")
307
- radio[4].should_not match_tag(:input, :label => "LABEL")
308
- end
309
- end
310
- end
311
-
312
- describe "text area (basic)" do
313
- it "should should return a basic text area based on the values passed in" do
314
- text_area_field("foo", :name => "foo").should match_tag(:textarea, :name => "foo")
315
- end
316
-
317
- it "should handle a nil content" do
318
- text_area_field(nil, :name => "foo").should == "<textarea name=\"foo\"></textarea>"
319
- end
320
-
321
- it "should handle a nil attributes hash" do
322
- text_area_field("CONTENT", nil).should == "<textarea>CONTENT</textarea>"
323
- end
324
-
325
- it "should render a label when the label is passed in" do
326
- result = text_area_field( "CONTENT", :name => "foo", :value => "bar", :label => "LABEL")
327
- result.should match(/<label>LABEL<textarea/)
328
- res = result.scan(/<[^>]*>/)
329
- res[1].should_not match_tag(:textarea, :label => "LABEL")
330
- end
331
- end
332
-
333
- describe "text area (data bound)" do
334
- it_should_behave_like "FakeBufferConsumer"
335
-
336
- it "should return a bound text area" do
337
- form_for :obj do
338
- ta = text_area_control(:foo)
339
- tab = text_area_control(:foobad)
340
- ta.should match_tag(:textarea, :name => "fake_model[foo]")
341
- tab.should match_tag(:textarea, :name => "fake_model[foobad]", :class => "error")
342
- ta.should include("foowee")
343
- end
344
- end
345
-
346
- it "should handle a nil content value" do
347
- @obj.nothing.should be_nil
348
- form_for :obj do
349
- text_area_control(:nothing).should match_tag(:textarea, :name => "fake_model[nothing]")
350
- end
351
- end
352
-
353
- it "should handle a nil attribute hash" do
354
- form_for :obj do
355
- text_area_control(:nothing, nil).should match_tag(:textarea, :name => "fake_model[nothing]")
356
- end
357
- end
358
-
359
- it "should render a label when the label is passed in" do
360
- form_for :obj do
361
- result = text_area_control( :foo, :label => "LABEL")
362
- result.should match(/<label>LABEL<textarea/)
363
- res = result.scan(/<[^>]*>/)
364
- res[1].should_not match_tag(:textarea, :label => "LABEL")
365
- end
366
- end
367
-
368
- end
369
-
370
- describe "form helper supporting methods for controls" do
371
- it_should_behave_like "FakeBufferConsumer"
372
-
373
- it "should give class_name[colname] for control_name" do
374
- form_for :obj do
375
- text_control( :foo ).should match_tag( :input, :type => "text", :name => "fake_model[foo]")
376
- end
377
- end
378
-
379
- it "should provide value=method_value for the control_value method" do
380
- form_for :obj do
381
- text_control( :foo ).should match_tag( :input, :type => "text", :value => "foowee")
382
- end
383
- end
384
-
385
- it "should give name and value for a call to control_name_value" do
386
- form_for :obj do
387
- control_name_value(:foo, :attribute => "ATTRIBUTE" ).should == { :name => "fake_model[foo]",
388
- :value => "foowee",
389
- :attribute => "ATTRIBUTE"}
390
- end
391
- end
392
- end
393
-
394
- describe "submit_button" do
395
- it_should_behave_like "FakeBufferConsumer"
396
-
397
- it "should produce a simple submit button" do
398
- submit_button("Foo").should == "<button type=\"submit\">Foo</button>"
399
- end
400
- end
401
-
402
- describe "label helpers" do
403
- it_should_behave_like "FakeBufferConsumer"
404
-
405
- it "should add a label to arbitrary markup in a template" do
406
- result = label("Name:", text_field(:name => "name_value"))
407
- result.should == "<label>Name:<input type=\"text\" name=\"name_value\"/></label>"
408
-
409
- end
410
-
411
- end
412
-