sinatra_more 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -167,6 +167,11 @@ methods should be very familiar to anyone who has used rails view helpers.
167
167
  * <tt>radio_button_tag(name, options={})</tt>
168
168
  * Constructs a radio button input from the given options
169
169
  * <tt>radio_button_tag :gender, :value => 'male'</tt>
170
+ * <tt>select_tag(name, settings={})</tt>
171
+ * Constructs a select tag with options from the given settings
172
+ * <tt>select_tag(:favorite_color, :options => ['1', '2', '3'], :selected => '1')</tt>
173
+ * <tt>select_tag(:more_color, :options => [['label', '1'], ['label2', '2']])</tt>
174
+ * <tt>select_tag(:multiple_color, :options => [...], :multiple => true)</tt>
170
175
  * <tt>file_field_tag(name, options={})</tt>
171
176
  * Constructs a file field input from the given options
172
177
  * <tt>file_field_tag :photo, :class => 'long'</tt>
@@ -188,6 +193,9 @@ A form_tag might look like:
188
193
  %p
189
194
  = label_tag :password, :class => 'first'
190
195
  = password_field_tag :password, :value => params[:password]
196
+ %p
197
+ = label_tag :strategy
198
+ = select_tag :strategy, :options => ['delete', 'destroy'], :selected => 'delete'
191
199
  %p
192
200
  = check_box_tag :confirm_delete
193
201
  - field_set_tag(:class => 'buttons') do
@@ -225,6 +233,8 @@ The following are fields provided by AbstractFormBuilder that can be used within
225
233
  * <tt>f.file_field :photo, :class => 'long'</tt>
226
234
  * <tt>submit(caption, options={})</tt>
227
235
  * <tt>f.submit "Update", :class => 'long'</tt>
236
+ * <tt>image_submit(source, options={})</tt>
237
+ * <tt>f.submit "submit.png", :class => 'long'</tt>
228
238
 
229
239
  A form_for using these basic fields might look like:
230
240
 
@@ -257,6 +267,8 @@ There is also a StandardFormBuilder which builds on the abstract fields that can
257
267
  * <tt>file_field_block(:photo, :class => 'big')</tt>
258
268
  * <tt>submit_block(caption, options={})</tt>
259
269
  * <tt>submit_block(:username, :class => 'big')</tt>
270
+ * <tt>image_submit_block(source, options={})</tt>
271
+ * <tt>image_submit_block('submit.png', :class => 'big')</tt>
260
272
 
261
273
  A form_for using these standard fields might look like:
262
274
 
data/TODO CHANGED
@@ -6,8 +6,7 @@
6
6
  * Make warden password strategy support a callback which explains what to do with username, password
7
7
  * WardenPlugin.authenticate_callback { |username, password| User.authenticate(username, password) }
8
8
  * Add support for fields_for tag in formbuilder
9
- * Add support for missing formhelpers/fields (radio_button_tag, select_tag)
10
- * Add support for missing formbuilder fields (radio_button, select, and standard_form_builder methods i.e check_box_group)
9
+ * Add support for missing formbuilder fields (select, and standard_form_builder methods i.e check_box_group)
11
10
  * Look into creating sinatra generators using rubigen (http://github.com/drnic/rubigen)
12
11
  * http://github.com/quirkey/sinatra-gen
13
12
  * http://github.com/monkrb/monk
@@ -20,6 +19,8 @@
20
19
 
21
20
  = COMPLETED
22
21
 
22
+ * Add support for missing formhelpers/fields (radio_button_tag, select_tag)
23
+ * Add support for select_tag :multiple => true
23
24
  * Add support for forms with method => put, delete using hidden field
24
25
  * Remove dependency on activesupport! and enumerate dependencies in rakefile (as much as possible, need inflectors)
25
26
  * Pull from sinatra-helpers and make erb templates work (and credit keldredd)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -82,6 +82,17 @@ module SinatraMore
82
82
  input_tag(:password, options)
83
83
  end
84
84
 
85
+ # Constructs a check_box from the given options
86
+ # options = [['caption', 'value'], ['Green', 'green1'], ['Blue', 'blue1'], ['Black', "black1"]]
87
+ # options = ['option', 'red', 'yellow' ]
88
+ # select_tag(:favorite_color, :options => ['red', 'yellow'], :selected => 'green1')
89
+ def select_tag(name, options={})
90
+ options.reverse_merge!(:name => name)
91
+ select_options_html = options_for_select(options.delete(:options), options.delete(:selected))
92
+ options.merge!(:name => "#{options[:name]}[]") if options[:multiple]
93
+ content_tag(:select, select_options_html, options)
94
+ end
95
+
85
96
  # Constructs a check_box from the given options
86
97
  # check_box_tag :remember_me, :value => 'Yes'
87
98
  def check_box_tag(name, options={})
@@ -119,6 +130,14 @@ module SinatraMore
119
130
 
120
131
  protected
121
132
 
133
+ # Returns the options tags for a select based on the given option items
134
+ def options_for_select(option_items, selected_value=nil)
135
+ return '' if option_items.blank?
136
+ option_items.collect do |caption, value|
137
+ content_tag(:option, caption, :value => (value || caption), :selected => (selected_value == (value || caption)))
138
+ end
139
+ end
140
+
122
141
  # returns the hidden method field for 'put' and 'delete' forms
123
142
  # Only 'get' and 'post' are allowed within browsers;
124
143
  # 'put' and 'delete' are just specified using hidden fields with form action still 'put'.
@@ -4,7 +4,6 @@ module SinatraMore
4
4
  # input_tag :text, :class => "test"
5
5
  def input_tag(type, options = {})
6
6
  options.reverse_merge!(:type => type)
7
- [:checked, :disabled].each { |attr| options[attr] = attr.to_s if options[attr] }
8
7
  tag(:input, options)
9
8
  end
10
9
 
@@ -25,9 +24,17 @@ module SinatraMore
25
24
  # tag(:p, :content => "hello", :class => 'large')
26
25
  def tag(name, options={})
27
26
  content = options.delete(:content)
27
+ identity_tag_attributes.each { |attr| options[attr] = attr.to_s if options[attr] }
28
28
  html_attrs = options.collect { |a, v| v.blank? ? nil : "#{a}=\"#{v}\"" }.compact.join(" ")
29
29
  base_tag = (html_attrs.present? ? "<#{name} #{html_attrs}" : "<#{name}")
30
30
  base_tag << (content ? ">#{content}</#{name}>" : " />")
31
31
  end
32
+
33
+ protected
34
+
35
+ # Returns a list of attributes which can only contain an identity value (i.e selected)
36
+ def identity_tag_attributes
37
+ [:checked, :disabled, :selected, :multiple]
38
+ end
32
39
  end
33
40
  end
data/sinatra_more.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sinatra_more}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nathan Esquenazi"]
@@ -8,6 +8,8 @@
8
8
  <%= password_field_tag :password %>
9
9
  <%= check_box_tag :remember_me %>
10
10
  <%= label_tag :gender %>
11
+ <%= label_tag :color %>
12
+ <%= select_tag :color, :options => ['green', 'orange', 'purple'] %>
11
13
  <%= radio_button_tag :gender, :value => 'male' %>
12
14
  <%= radio_button_tag :gender, :value => 'female' %>
13
15
  <%= submit_tag %>
@@ -39,6 +41,10 @@
39
41
  <%= radio_button_tag :gender, :value => 'male', :checked => true %>
40
42
  <%= radio_button_tag :remember_me, :value => 'female' %>
41
43
  <p>
44
+ <p>
45
+ <%= label_tag :fav_color %>
46
+ <%= select_tag :fav_color, :options => [ ['green', '1'], ['orange', '2'], ['purple', '3'] ], :selected => '2' %>
47
+ </p>
42
48
  <p>
43
49
  <%= check_box_tag :remember_me, :value => '1', :checked => true %>
44
50
  <p>
@@ -6,7 +6,9 @@
6
6
  = text_field_tag :username
7
7
  = label_tag :password
8
8
  = password_field_tag :password
9
- = label_tag :gender
9
+ = label_tag :color
10
+ = select_tag :color, :options => ['green', 'orange', 'purple']
11
+ = label_tag :gender
10
12
  = radio_button_tag :gender, :value => 'male'
11
13
  = radio_button_tag :gender, :value => 'female'
12
14
  = check_box_tag :remember_me
@@ -32,6 +34,9 @@
32
34
  %p
33
35
  = label_tag :photo, :class => 'photo'
34
36
  = file_field_tag :photo, :class => 'upload'
37
+ %p
38
+ = label_tag :fav_color
39
+ = select_tag :fav_color, :options => [ ['green', '1'], ['orange', '2'], ['purple', '3'] ], :selected => '2'
35
40
  %p
36
41
  = check_box_tag :remember_me, :value => "1", :checked => true
37
42
  - field_set_tag(:class => 'buttons') do
@@ -113,14 +113,14 @@ class TestFormHelpers < Test::Unit::TestCase
113
113
 
114
114
  should "display label tag in erb for simple form" do
115
115
  visit '/erb/form_tag'
116
- assert_have_selector 'form.simple-form label', :count => 3
116
+ assert_have_selector 'form.simple-form label', :count => 4
117
117
  assert_have_selector 'form.simple-form label', :content => "Username", :for => 'username'
118
118
  assert_have_selector 'form.simple-form label', :content => "Password", :for => 'password'
119
119
  assert_have_selector 'form.simple-form label', :content => "Gender", :for => 'gender'
120
120
  end
121
121
  should "display label tag in erb for advanced form" do
122
122
  visit '/erb/form_tag'
123
- assert_have_selector 'form.advanced-form label', :count => 5
123
+ assert_have_selector 'form.advanced-form label', :count => 6
124
124
  assert_have_selector 'form.advanced-form label.first', :content => "Nickname", :for => 'username'
125
125
  assert_have_selector 'form.advanced-form label.first', :content => "Password", :for => 'password'
126
126
  assert_have_selector 'form.advanced-form label.about', :content => "About Me", :for => 'about'
@@ -130,14 +130,14 @@ class TestFormHelpers < Test::Unit::TestCase
130
130
 
131
131
  should "display label tag in haml for simple form" do
132
132
  visit '/haml/form_tag'
133
- assert_have_selector 'form.simple-form label', :count => 3
133
+ assert_have_selector 'form.simple-form label', :count => 4
134
134
  assert_have_selector 'form.simple-form label', :content => "Username", :for => 'username'
135
135
  assert_have_selector 'form.simple-form label', :content => "Password", :for => 'password'
136
136
  assert_have_selector 'form.simple-form label', :content => "Gender", :for => 'gender'
137
137
  end
138
138
  should "display label tag in haml for advanced form" do
139
139
  visit '/haml/form_tag'
140
- assert_have_selector 'form.advanced-form label', :count => 5
140
+ assert_have_selector 'form.advanced-form label', :count => 6
141
141
  assert_have_selector 'form.advanced-form label.first', :content => "Nickname", :for => 'username'
142
142
  assert_have_selector 'form.advanced-form label.first', :content => "Password", :for => 'password'
143
143
  assert_have_selector 'form.advanced-form label.about', :content => "About Me", :for => 'about'
@@ -289,6 +289,60 @@ class TestFormHelpers < Test::Unit::TestCase
289
289
  end
290
290
  end
291
291
 
292
+ context "for #select_tag method" do
293
+ should "display select tag in ruby" do
294
+ actual_html = select_tag(:favorite_color, :options => ['green', 'blue', 'black'])
295
+ assert_has_tag(:select, :name => 'favorite_color') { actual_html }
296
+ assert_has_tag('select option', :content => 'green', :value => 'green') { actual_html }
297
+ assert_has_tag('select option', :content => 'blue', :value => 'blue') { actual_html }
298
+ assert_has_tag('select option', :content => 'black', :value => 'black') { actual_html }
299
+ end
300
+
301
+ should "display select tag in ruby with extended attributes" do
302
+ actual_html = select_tag(:favorite_color, :disabled => true, :options => ['only', 'option'])
303
+ assert_has_tag(:select, :disabled => 'disabled') { actual_html }
304
+ end
305
+
306
+ should "display select tag in ruby with multiple attribute" do
307
+ actual_html = select_tag(:favorite_color, :multiple => true, :options => ['only', 'option'])
308
+ assert_has_tag(:select, :multiple => 'multiple', :name => 'favorite_color[]') { actual_html }
309
+ end
310
+
311
+ should "display options with values and selected" do
312
+ options = [['Green', 'green1'], ['Blue', 'blue1'], ['Black', "black1"]]
313
+ actual_html = select_tag(:favorite_color, :options => options, :selected => 'green1')
314
+ assert_has_tag(:select, :name => 'favorite_color') { actual_html }
315
+ assert_has_tag('select option', :selected => 'selected', :count => 1) { actual_html }
316
+ assert_has_tag('select option', :content => 'Green', :value => 'green1', :selected => 'selected') { actual_html }
317
+ assert_has_tag('select option', :content => 'Blue', :value => 'blue1') { actual_html }
318
+ assert_has_tag('select option', :content => 'Black', :value => 'black1') { actual_html }
319
+ end
320
+
321
+ should "display select tag in erb" do
322
+ visit '/erb/form_tag'
323
+ assert_have_selector 'form.simple-form select', :count => 1, :name => 'color'
324
+ assert_have_selector('select option', :content => 'green', :value => 'green')
325
+ assert_have_selector('select option', :content => 'orange', :value => 'orange')
326
+ assert_have_selector('select option', :content => 'purple', :value => 'purple')
327
+ assert_have_selector 'form.advanced-form select', :name => 'fav_color'
328
+ assert_have_selector('select option', :content => 'green', :value => '1')
329
+ assert_have_selector('select option', :content => 'orange', :value => '2', :selected => 'selected')
330
+ assert_have_selector('select option', :content => 'purple', :value => '3')
331
+ end
332
+
333
+ should "display select tag in haml" do
334
+ visit '/haml/form_tag'
335
+ assert_have_selector 'form.simple-form select', :count => 1, :name => 'color'
336
+ assert_have_selector('select option', :content => 'green', :value => 'green')
337
+ assert_have_selector('select option', :content => 'orange', :value => 'orange')
338
+ assert_have_selector('select option', :content => 'purple', :value => 'purple')
339
+ assert_have_selector 'form.advanced-form select', :name => 'fav_color'
340
+ assert_have_selector('select option', :content => 'green', :value => '1')
341
+ assert_have_selector('select option', :content => 'orange', :value => '2', :selected => 'selected')
342
+ assert_have_selector('select option', :content => 'purple', :value => '3')
343
+ end
344
+ end
345
+
292
346
  context 'for #submit_tag method' do
293
347
  should "display submit tag in ruby" do
294
348
  actual_html = submit_tag("Update", :class => 'success')
@@ -11,9 +11,13 @@ class TestTagHelpers < Test::Unit::TestCase
11
11
  assert_has_tag(:br) { tag(:br) }
12
12
  end
13
13
  should("support tags with no content with attributes") do
14
- actual_html = tag(:br, :style => 'clear:both', :class => 'yellow')
14
+ actual_html = tag(:br, :style => 'clear:both', :class => 'yellow')
15
15
  assert_has_tag(:br, :class => 'yellow', :style=>'clear:both') { actual_html }
16
16
  end
17
+ should "support selected attribute by using 'selected' if true" do
18
+ actual_html = tag(:option, :selected => true)
19
+ assert_has_tag('option', :selected => 'selected') { actual_html }
20
+ end
17
21
  should "support tags with content no attributes" do
18
22
  assert_has_tag(:p, :content => "Demo String") { tag(:p, :content => "Demo String") }
19
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra_more
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Esquenazi