public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Refactor DateHelper and improve test coverage [#665 state:resolved]

Signed-off-by: Joshua Peek <josh@joshpeek.com>
clemens (author)
Mon Jul 21 10:57:15 -0700 2008
josh (committer)
Mon Jul 21 10:57:15 -0700 2008
commit  ff9f6fcc75526d9fd89be834982dec8624c909c5
tree    a9ea376ed8cc84c0952ac4641765c572287b84b3
parent  5bec5848b22527ee77c007565f7eea336e5c864f
...
3
4
5
6
7
 
 
8
9
10
 
 
11
12
13
 
 
 
14
15
16
...
67
68
69
70
 
71
72
73
...
91
92
93
94
 
95
96
97
...
107
108
109
110
111
112
113
114
115
116
 
 
 
 
 
 
 
 
 
117
118
 
 
119
120
121
...
133
134
135
136
 
137
138
139
...
155
156
157
158
159
 
 
160
161
162
...
180
181
182
183
184
 
 
185
186
187
188
 
 
189
190
191
...
193
194
195
196
197
 
 
198
199
200
201
202
203
 
 
 
204
205
206
...
208
209
210
211
 
212
213
214
215
216
 
 
217
218
219
220
 
 
221
222
223
...
227
228
229
230
231
232
 
 
 
 
233
234
235
...
250
251
252
253
 
 
 
 
 
 
254
255
256
...
261
262
263
264
 
265
266
267
...
283
284
285
286
 
287
288
289
 
 
 
 
290
291
292
293
294
295
 
296
297
298
299
300
301
302
 
 
 
303
304
305
306
 
307
308
309
...
318
319
320
321
 
322
323
324
...
331
332
333
334
 
 
335
336
337
...
346
347
348
349
 
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
 
 
 
369
370
371
...
381
382
383
384
 
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
 
 
 
 
404
405
406
...
415
416
417
418
 
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
 
 
438
439
440
...
449
450
451
452
 
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
 
 
 
 
472
473
474
475
476
477
478
479
480
481
 
 
 
 
 
 
 
 
482
483
484
...
490
491
492
493
 
494
495
496
...
506
507
508
509
 
510
511
512
513
 
514
515
516
...
534
535
536
537
 
538
539
 
540
541
542
543
544
 
 
 
 
 
545
546
547
...
562
563
564
565
 
566
567
568
 
569
570
 
571
572
573
574
 
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
 
 
 
 
 
 
 
 
 
 
 
590
591
592
593
 
 
 
 
 
 
 
 
 
 
 
 
 
594
595
596
 
 
597
598
599
...
603
604
605
606
607
 
 
608
609
610
611
 
612
613
614
615
616
617
618
619
620
621
...
641
642
643
644
 
645
646
647
648
 
649
650
651
...
654
655
656
657
 
658
659
660
661
662
663
 
664
665
666
 
667
668
669
 
670
671
672
673
674
675
676
 
 
 
 
 
677
678
679
...
682
683
684
685
 
686
687
688
...
708
709
710
711
 
712
713
714
...
3
4
5
 
 
6
7
8
 
 
9
10
11
 
 
12
13
14
15
16
17
...
68
69
70
 
71
72
73
74
...
92
93
94
 
95
96
97
98
...
108
109
110
 
 
 
 
 
 
 
111
112
113
114
115
116
117
118
119
120
 
121
122
123
124
125
...
137
138
139
 
140
141
142
143
...
159
160
161
 
 
162
163
164
165
166
...
184
185
186
 
 
187
188
189
190
 
 
191
192
193
194
195
...
197
198
199
 
 
200
201
202
203
204
205
 
 
206
207
208
209
210
211
...
213
214
215
 
216
217
218
219
 
 
220
221
222
223
 
 
224
225
226
227
228
...
232
233
234
 
 
 
235
236
237
238
239
240
241
...
256
257
258
 
259
260
261
262
263
264
265
266
267
...
272
273
274
 
275
276
277
278
...
294
295
296
 
297
298
299
300
301
302
303
304
305
306
307
308
309
 
310
311
312
 
 
 
 
 
313
314
315
316
317
318
 
319
320
321
322
...
331
332
333
 
334
335
336
337
...
344
345
346
 
347
348
349
350
351
...
360
361
362
 
363
364
365
366
367
368
369
 
 
 
 
 
 
 
 
 
 
 
 
 
370
371
372
373
374
375
...
385
386
387
 
388
389
390
391
392
393
394
 
 
 
 
 
 
 
 
 
 
 
 
 
395
396
397
398
399
400
401
...
410
411
412
 
413
414
415
416
417
418
419
 
 
 
 
 
 
 
 
 
 
 
 
 
420
421
422
423
424
...
433
434
435
 
436
437
438
439
440
441
442
 
 
 
 
 
 
 
 
 
 
 
 
 
443
444
445
446
447
448
 
 
 
 
 
 
 
 
449
450
451
452
453
454
455
456
457
458
459
...
465
466
467
 
468
469
470
471
...
481
482
483
 
484
485
486
487
 
488
489
490
491
...
509
510
511
 
512
513
 
514
515
 
 
 
 
516
517
518
519
520
521
522
523
...
538
539
540
 
541
542
543
 
544
545
 
546
547
548
549
 
550
551
 
 
 
 
 
 
 
 
 
 
 
 
 
 
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
 
 
581
582
583
584
585
...
589
590
591
 
 
592
593
594
595
596
 
597
598
599
600
 
 
 
 
601
602
603
...
623
624
625
 
626
627
628
629
 
630
631
632
633
...
636
637
638
 
639
640
641
642
643
644
 
645
646
647
 
648
649
650
 
651
652
653
654
655
656
657
 
658
659
660
661
662
663
664
665
...
668
669
670
 
671
672
673
674
...
694
695
696
 
697
698
699
700
0
@@ -3,14 +3,15 @@ require 'action_view/helpers/tag_helper'
0
 
0
 module ActionView
0
   module Helpers
0
-    # The Date Helper primarily creates select/option tags for different kinds of dates and date elements. All of the select-type methods
0
-    # share a number of common options that are as follows:
0
+    # The Date Helper primarily creates select/option tags for different kinds of dates and date elements. All of the
0
+    # select-type methods share a number of common options that are as follows:
0
     #
0
-    # * <tt>:prefix</tt> - overwrites the default prefix of "date" used for the select names. So specifying "birthday" would give
0
-    #   birthday[month] instead of date[month] if passed to the select_month method.
0
+    # * <tt>:prefix</tt> - overwrites the default prefix of "date" used for the select names. So specifying "birthday"
0
+    # would give birthday[month] instead of date[month] if passed to the select_month method.
0
     # * <tt>:include_blank</tt> - set to true if it should be possible to set an empty date.
0
-    # * <tt>:discard_type</tt> - set to true if you want to discard the type part of the select name. If set to true, the select_month
0
-    #   method would use simply "date" (which can be overwritten using <tt>:prefix</tt>) instead of "date[month]".
0
+    # * <tt>:discard_type</tt> - set to true if you want to discard the type part of the select name. If set to true,
0
+    #   the select_month method would use simply "date" (which can be overwritten using <tt>:prefix</tt>) instead of
0
+    #   "date[month]".
0
     module DateHelper
0
       include ActionView::Helpers::TagHelper
0
       DEFAULT_PREFIX = 'date' unless const_defined?('DEFAULT_PREFIX')
0
@@ -67,7 +68,7 @@ module ActionView
0
         I18n.with_options :locale => options[:locale], :scope => :'datetime.distance_in_words' do |locale|
0
           case distance_in_minutes
0
             when 0..1
0
-              return distance_in_minutes == 0 ? 
0
+              return distance_in_minutes == 0 ?
0
                      locale.t(:less_than_x_minutes, :count => 1) :
0
                      locale.t(:x_minutes, :count => distance_in_minutes) unless include_seconds
0
 
0
@@ -91,7 +92,7 @@ module ActionView
0
             else                      locale.t :over_x_years,   :count => (distance_in_minutes / 525600).round
0
           end
0
         end
0
-      end      
0
+      end
0
 
0
       # Like distance_of_time_in_words, but where <tt>to_time</tt> is fixed to <tt>Time.now</tt>.
0
       #
0
@@ -107,15 +108,18 @@ module ActionView
0
 
0
       alias_method :distance_of_time_in_words_to_now, :time_ago_in_words
0
 
0
-      # Returns a set of select tags (one for year, month, and day) pre-selected for accessing a specified date-based attribute (identified by
0
-      # +method+) on an object assigned to the template (identified by +object+). It's possible to tailor the selects through the +options+ hash,
0
-      # which accepts all the keys that each of the individual select builders do (like <tt>:use_month_numbers</tt> for select_month) as well as a range of
0
-      # discard options. The discard options are <tt>:discard_year</tt>, <tt>:discard_month</tt> and <tt>:discard_day</tt>. Set to true, they'll
0
-      # drop the respective select. Discarding the month select will also automatically discard the day select. It's also possible to explicitly
0
-      # set the order of the tags using the <tt>:order</tt> option with an array of symbols <tt>:year</tt>, <tt>:month</tt> and <tt>:day</tt> in
0
-      # the desired order. Symbols may be omitted and the respective select is not included.
0
+      # Returns a set of select tags (one for year, month, and day) pre-selected for accessing a specified date-based
0
+      # attribute (identified by +method+) on an object assigned to the template (identified by +object+). It's
0
+      # possible to tailor the selects through the +options+ hash, which accepts all the keys that each of the
0
+      # individual select builders do (like <tt>:use_month_numbers</tt> for select_month) as well as a range of discard
0
+      # options. The discard options are <tt>:discard_year</tt>, <tt>:discard_month</tt> and <tt>:discard_day</tt>. Set
0
+      # to true, they'll drop the respective select. Discarding the month select will also automatically discard the
0
+      # day select. It's also possible to explicitly set the order of the tags using the <tt>:order</tt> option with an
0
+      # array of symbols <tt>:year</tt>, <tt>:month</tt> and <tt>:day</tt> in the desired order. Symbols may be omitted
0
+      # and the respective select is not included.
0
       #
0
-      # Pass the <tt>:default</tt> option to set the default date. Use a Time object or a Hash of <tt>:year</tt>, <tt>:month</tt>, <tt>:day</tt>, <tt>:hour</tt>, <tt>:minute</tt>, and <tt>:second</tt>.
0
+      # Pass the <tt>:default</tt> option to set the default date. Use a Time object or a Hash of <tt>:year</tt>,
0
+      # <tt>:month</tt>, <tt>:day</tt>, <tt>:hour</tt>, <tt>:minute</tt>, and <tt>:second</tt>.
0
       #
0
       # Passing <tt>:disabled => true</tt> as part of the +options+ will make elements inaccessible for change.
0
       #
0
@@ -133,7 +137,7 @@ module ActionView
0
       #
0
       #   # Generates a date select that when POSTed is stored in the post variable, in the written_on attribute,
0
       #   # with the year in the year drop down box starting at 1995, numbers used for months instead of words,
0
-      #   # and without a day select box. 
0
+      #   # and without a day select box.
0
       #   date_select("post", "written_on", :start_year => 1995, :use_month_numbers => true,
0
       #                                     :discard_day => true, :include_blank => true)
0
       #
0
@@ -155,8 +159,8 @@ module ActionView
0
       #
0
       # The selects are prepared for multi-parameter assignment to an Active Record object.
0
       #
0
-      # Note: If the day is not included as an option but the month is, the day will be set to the 1st to ensure that all month
0
-      # choices are valid.
0
+      # Note: If the day is not included as an option but the month is, the day will be set to the 1st to ensure that
0
+      # all month choices are valid.
0
       def date_select(object_name, method, options = {}, html_options = {})
0
         InstanceTag.new(object_name, method, self, options.delete(:object)).to_date_select_tag(options, html_options)
0
       end
0
@@ -180,12 +184,12 @@ module ActionView
0
       #   # Creates a time select tag that, when POSTed, will be stored in the mail variable in the sent_at attribute
0
       #   time_select("mail", "sent_at")
0
       #
0
-      #   # Creates a time select tag with a seconds field that, when POSTed, will be stored in the post variables in 
0
-      #   # the sunrise attribute. 
0
+      #   # Creates a time select tag with a seconds field that, when POSTed, will be stored in the post variables in
0
+      #   # the sunrise attribute.
0
       #   time_select("post", "start_time", :include_seconds => true)
0
       #
0
-      #   # Creates a time select tag with a seconds field that, when POSTed, will be stored in the entry variables in 
0
-      #   # the submission_time attribute. 
0
+      #   # Creates a time select tag with a seconds field that, when POSTed, will be stored in the entry variables in
0
+      #   # the submission_time attribute.
0
       #   time_select("entry", "submission_time", :include_seconds => true)
0
       #
0
       #   # You can set the :minute_step to 15 which will give you: 00, 15, 30 and 45.
0
@@ -193,14 +197,15 @@ module ActionView
0
       #
0
       # The selects are prepared for multi-parameter assignment to an Active Record object.
0
       #
0
-      # Note: If the day is not included as an option but the month is, the day will be set to the 1st to ensure that all month
0
-      # choices are valid.
0
+      # Note: If the day is not included as an option but the month is, the day will be set to the 1st to ensure that
0
+      # all month choices are valid.
0
       def time_select(object_name, method, options = {}, html_options = {})
0
         InstanceTag.new(object_name, method, self, options.delete(:object)).to_time_select_tag(options, html_options)
0
       end
0
 
0
-      # Returns a set of select tags (one for year, month, day, hour, and minute) pre-selected for accessing a specified datetime-based
0
-      # attribute (identified by +method+) on an object assigned to the template (identified by +object+). Examples:
0
+      # Returns a set of select tags (one for year, month, day, hour, and minute) pre-selected for accessing a
0
+      # specified datetime-based attribute (identified by +method+) on an object assigned to the template (identified
0
+      # by +object+). Examples:
0
       #
0
       # If anything is passed in the html_options hash it will be applied to every select tag in the set.
0
       #
0
@@ -208,16 +213,16 @@ module ActionView
0
       #   # Generates a datetime select that, when POSTed, will be stored in the post variable in the written_on attribute
0
       #   datetime_select("post", "written_on")
0
       #
0
-      #   # Generates a datetime select with a year select that starts at 1995 that, when POSTed, will be stored in the 
0
+      #   # Generates a datetime select with a year select that starts at 1995 that, when POSTed, will be stored in the
0
       #   # post variable in the written_on attribute.
0
       #   datetime_select("post", "written_on", :start_year => 1995)
0
       #
0
-      #   # Generates a datetime select with a default value of 3 days from the current time that, when POSTed, will be stored in the 
0
-      #   # trip variable in the departing attribute.
0
+      #   # Generates a datetime select with a default value of 3 days from the current time that, when POSTed, will
0
+      #   # be stored in the trip variable in the departing attribute.
0
       #   datetime_select("trip", "departing", :default => 3.days.from_now)
0
       #
0
-      #   # Generates a datetime select that discards the type that, when POSTed, will be stored in the post variable as the written_on
0
-      #   # attribute.
0
+      #   # Generates a datetime select that discards the type that, when POSTed, will be stored in the post variable
0
+      #   # as the written_on attribute.
0
       #   datetime_select("post", "written_on", :discard_type => true)
0
       #
0
       # The selects are prepared for multi-parameter assignment to an Active Record object.
0
@@ -227,9 +232,10 @@ module ActionView
0
 
0
       # Returns a set of html select-tags (one for year, month, day, hour, and minute) pre-selected with the +datetime+.
0
       # It's also possible to explicitly set the order of the tags using the <tt>:order</tt> option with an array of
0
-      # symbols <tt>:year</tt>, <tt>:month</tt> and <tt>:day</tt> in the desired order. If you do not supply a Symbol, it
0
-      # will be appended onto the <tt>:order</tt> passed in. You can also add <tt>:date_separator</tt> and <tt>:time_separator</tt>
0
-      # keys to the +options+ to control visual display of the elements.
0
+      # symbols <tt>:year</tt>, <tt>:month</tt> and <tt>:day</tt> in the desired order. If you do not supply a Symbol,
0
+      # it will be appended onto the <tt>:order</tt> passed in. You can also add <tt>:date_separator</tt>,
0
+      # <tt>:datetime_separator</tt> and <tt>:time_separator</tt> keys to the +options+ to control visual display of
0
+      # the elements.
0
       #
0
       # If anything is passed in the html_options hash it will be applied to every select tag in the set.
0
       #
0
@@ -250,7 +256,12 @@ module ActionView
0
       #   # with a '/' between each date field.
0
       #   select_datetime(my_date_time, :date_separator => '/')
0
       #
0
-      #   # Generates a datetime select that discards the type of the field and defaults to the datetime in 
0
+      #   # Generates a datetime select that defaults to the datetime in my_date_time (four days after today)
0
+      #   # with a date fields separated by '/', time fields separated by '' and the date and time fields
0
+      #   # separated by a comma (',').
0
+      #   select_datetime(my_date_time, :date_separator => '/', :time_separator => '', :datetime_separator => ',')
0
+      #
0
+      #   # Generates a datetime select that discards the type of the field and defaults to the datetime in
0
       #   # my_date_time (four days after today)
0
       #   select_datetime(my_date_time, :discard_type => true)
0
       #
0
@@ -261,7 +272,7 @@ module ActionView
0
       def select_datetime(datetime = Time.current, options = {}, html_options = {})
0
         separator = options[:datetime_separator] || ''
0
         select_date(datetime, options, html_options) + separator + select_time(datetime, options, html_options)
0
-       end
0
+      end
0
 
0
       # Returns a set of html select-tags (one for year, month, and day) pre-selected with the +date+.
0
       # It's possible to explicitly set the order of the tags using the <tt>:order</tt> option with an array of
0
@@ -283,27 +294,29 @@ module ActionView
0
       #   # with the fields ordered year, month, day rather than month, day, year.
0
       #   select_date(my_date, :order => [:year, :month, :day])
0
       #
0
-      #   # Generates a date select that discards the type of the field and defaults to the date in 
0
+      #   # Generates a date select that discards the type of the field and defaults to the date in
0
       #   # my_date (six days after today)
0
       #   select_date(my_date, :discard_type => true)
0
       #
0
+      #   # Generates a date select that defaults to the date in my_date,
0
+      #   # which has fields separated by '/'
0
+      #   select_date(my_date, :date_separator => '/')
0
+      #
0
       #   # Generates a date select that defaults to the datetime in my_date (six days after today)
0
       #   # prefixed with 'payday' rather than 'date'
0
       #   select_date(my_date, :prefix => 'payday')
0
       #
0
       def select_date(date = Date.current, options = {}, html_options = {})
0
-        options[:order] ||= []
0
+        options.reverse_merge!(:order => [], :date_separator => '')
0
         [:year, :month, :day].each { |o| options[:order].push(o) unless options[:order].include?(o) }
0
 
0
-        select_date = ''
0
-        options[:order].each do |o|
0
-          select_date << self.send("select_#{o}", date, options, html_options)
0
-        end
0
-        select_date
0
+        options[:order].inject([]) { |s, o|
0
+          s << self.send("select_#{o}", date, options, html_options)
0
+        }.join(options[:date_separator])
0
       end
0
 
0
       # Returns a set of html select-tags (one for hour and minute)
0
-      # You can set <tt>:time_separator</tt> key to format the output, and 
0
+      # You can set <tt>:time_separator</tt> key to format the output, and
0
       # the <tt>:include_seconds</tt> option to include an input for seconds.
0
       #
0
       # If anything is passed in the html_options hash it will be applied to every select tag in the set.
0
@@ -318,7 +331,7 @@ module ActionView
0
       #   select_time()
0
       #
0
       #   # Generates a time select that defaults to the time in my_time,
0
-      #   # which has fields separated by ':' 
0
+      #   # which has fields separated by ':'
0
       #   select_time(my_time, :time_separator => ':')
0
       #
0
       #   # Generates a time select that defaults to the time in my_time,
0
@@ -331,7 +344,8 @@ module ActionView
0
       #
0
       def select_time(datetime = Time.current, options = {}, html_options = {})
0
         separator = options[:time_separator] || ''
0
-        select_hour(datetime, options, html_options) + separator + select_minute(datetime, options, html_options) + (options[:include_seconds] ? separator + select_second(datetime, options, html_options) : '')
0
+        select_hour(datetime, options, html_options) + separator + select_minute(datetime, options, html_options) +
0
+          (options[:include_seconds] ? separator + select_second(datetime, options, html_options) : '')
0
       end
0
 
0
       # Returns a select tag with options for each of the seconds 0 through 59 with the current second selected.
0
@@ -346,26 +360,16 @@ module ActionView
0
       #
0
       #   # Generates a select field for seconds that defaults to the number given
0
       #   select_second(33)
0
-      # 
0
+      #
0
       #   # Generates a select field for seconds that defaults to the seconds for the time in my_time
0
       #   # that is named 'interval' rather than 'second'
0
       #   select_second(my_time, :field_name => 'interval')
0
       #
0
       def select_second(datetime, options = {}, html_options = {})
0
         val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.sec) : ''
0
-        if options[:use_hidden]
0
-          options[:include_seconds] ? hidden_html(options[:field_name] || 'second', val, options) : ''
0
-        else
0
-          second_options = []
0
-          0.upto(59) do |second|
0
-            second_options << ((val == second) ?
0
-              content_tag(:option, leading_zero_on_single_digits(second), :value => leading_zero_on_single_digits(second), :selected => "selected") :
0
-              content_tag(:option, leading_zero_on_single_digits(second), :value => leading_zero_on_single_digits(second))
0
-            )
0
-            second_options << "\n"
0
-          end
0
-          select_html(options[:field_name] || 'second', second_options.join, options, html_options)
0
-        end
0
+        options[:use_hidden] ?
0
+          (options[:include_seconds] ? _date_hidden_html(options[:field_name] || 'second', val, options) : '') :
0
+          _date_select_html(options[:field_name] || 'second', _date_build_options(val), options, html_options)
0
       end
0
 
0
       # Returns a select tag with options for each of the minutes 0 through 59 with the current minute selected.
0
@@ -381,26 +385,17 @@ module ActionView
0
       #
0
       #   # Generates a select field for minutes that defaults to the number given
0
       #   select_minute(14)
0
-      # 
0
+      #
0
       #   # Generates a select field for minutes that defaults to the minutes for the time in my_time
0
       #   # that is named 'stride' rather than 'second'
0
       #   select_minute(my_time, :field_name => 'stride')
0
       #
0
       def select_minute(datetime, options = {}, html_options = {})
0
         val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.min) : ''
0
-        if options[:use_hidden]
0
-          hidden_html(options[:field_name] || 'minute', val, options)
0
-        else
0
-          minute_options = []
0
-          0.step(59, options[:minute_step] || 1) do |minute|
0
-            minute_options << ((val == minute) ?
0
-              content_tag(:option, leading_zero_on_single_digits(minute), :value => leading_zero_on_single_digits(minute), :selected => "selected") :
0
-              content_tag(:option, leading_zero_on_single_digits(minute), :value => leading_zero_on_single_digits(minute))
0
-            )
0
-            minute_options << "\n"
0
-          end
0
-          select_html(options[:field_name] || 'minute', minute_options.join, options, html_options)
0
-         end
0
+        options[:use_hidden] ?
0
+          _date_hidden_html(options[:field_name] || 'minute', val, options) :
0
+          _date_select_html(options[:field_name] || 'minute',
0
+            _date_build_options(val, :step => options[:minute_step]), options, html_options)
0
       end
0
 
0
       # Returns a select tag with options for each of the hours 0 through 23 with the current hour selected.
0
@@ -415,26 +410,15 @@ module ActionView
0
       #
0
       #   # Generates a select field for minutes that defaults to the number given
0
       #   select_minute(14)
0
-      # 
0
+      #
0
       #   # Generates a select field for minutes that defaults to the minutes for the time in my_time
0
       #   # that is named 'stride' rather than 'second'
0
       #   select_minute(my_time, :field_name => 'stride')
0
       #
0
       def select_hour(datetime, options = {}, html_options = {})
0
         val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.hour) : ''
0
-        if options[:use_hidden]
0
-          hidden_html(options[:field_name] || 'hour', val, options)
0
-        else
0
-          hour_options = []
0
-          0.upto(23) do |hour|
0
-            hour_options << ((val == hour) ?
0
-              content_tag(:option, leading_zero_on_single_digits(hour), :value => leading_zero_on_single_digits(hour), :selected => "selected") :
0
-              content_tag(:option, leading_zero_on_single_digits(hour), :value => leading_zero_on_single_digits(hour))
0
-            )
0
-            hour_options << "\n"
0
-          end
0
-          select_html(options[:field_name] || 'hour', hour_options.join, options, html_options)
0
-        end
0
+        options[:use_hidden] ? _date_hidden_html(options[:field_name] || 'hour', val, options) :
0
+          _date_select_html(options[:field_name] || 'hour', _date_build_options(val, :end => 23), options, html_options)
0
       end
0
 
0
       # Returns a select tag with options for each of the days 1 through 31 with the current day selected.
0
@@ -449,36 +433,27 @@ module ActionView
0
       #
0
       #   # Generates a select field for days that defaults to the number given
0
       #   select_day(5)
0
-      # 
0
+      #
0
       #   # Generates a select field for days that defaults to the day for the date in my_date
0
       #   # that is named 'due' rather than 'day'
0
       #   select_day(my_time, :field_name => 'due')
0
       #
0
       def select_day(date, options = {}, html_options = {})
0
         val = date ? (date.kind_of?(Fixnum) ? date : date.day) : ''
0
-        if options[:use_hidden]
0
-          hidden_html(options[:field_name] || 'day', val, options)
0
-        else
0
-          day_options = []
0
-          1.upto(31) do |day|
0
-            day_options << ((val == day) ?
0
-              content_tag(:option, day, :value => day, :selected => "selected") :
0
-              content_tag(:option, day, :value => day)
0
-            )
0
-            day_options << "\n"
0
-          end
0
-          select_html(options[:field_name] || 'day', day_options.join, options, html_options)
0
-        end
0
+        options[:use_hidden] ? _date_hidden_html(options[:field_name] || 'day', val, options) :
0
+          _date_select_html(options[:field_name] || 'day',
0
+            _date_build_options(val, :start => 1, :end => 31, :leading_zeros => false),
0
+            options, html_options)
0
       end
0
 
0
-      # Returns a select tag with options for each of the months January through December with the current month selected.
0
-      # The month names are presented as keys (what's shown to the user) and the month numbers (1-12) are used as values
0
-      # (what's submitted to the server). It's also possible to use month numbers for the presentation instead of names --
0
-      # set the <tt>:use_month_numbers</tt> key in +options+ to true for this to happen. If you want both numbers and names,
0
-      # set the <tt>:add_month_numbers</tt> key in +options+ to true. If you would prefer to show month names as abbreviations,
0
-      # set the <tt>:use_short_month</tt> key in +options+ to true. If you want to use your own month names, set the
0
-      # <tt>:use_month_names</tt> key in +options+ to an array of 12 month names. Override the field name using the 
0
-      # <tt>:field_name</tt> option, 'month' by default.
0
+      # Returns a select tag with options for each of the months January through December with the current month
0
+      # selected. The month names are presented as keys (what's shown to the user) and the month numbers (1-12) are
0
+      # used as values (what's submitted to the server). It's also possible to use month numbers for the presentation
0
+      # instead of names -- set the <tt>:use_month_numbers</tt> key in +options+ to true for this to happen. If you
0
+      # want both numbers and names, set the <tt>:add_month_numbers</tt> key in +options+ to true. If you would prefer
0
+      # to show month names as abbreviations, set the <tt>:use_short_month</tt> key in +options+ to true. If you want
0
+      # to use your own month names, set the <tt>:use_month_names</tt> key in +options+ to an array of 12 month names.
0
+      # Override the field name using the <tt>:field_name</tt> option, 'month' by default.
0
       #
0
       # ==== Examples
0
       #   # Generates a select field for months that defaults to the current month that
0
@@ -490,7 +465,7 @@ module ActionView
0
       #   select_month(Date.today, :field_name => 'start')
0
       #
0
       #   # Generates a select field for months that defaults to the current month that
0
-      #   # will use keys like "1", "3".       
0
+      #   # will use keys like "1", "3".
0
       #   select_month(Date.today, :use_month_numbers => true)
0
       #
0
       #   # Generates a select field for months that defaults to the current month that
0
@@ -506,11 +481,11 @@ module ActionView
0
       #   select_month(Date.today, :use_month_names => %w(Januar Februar Marts ...))
0
       #
0
       def select_month(date, options = {}, html_options = {})
0
-        locale = options[:locale] 
0
+        locale = options[:locale]
0
 
0
         val = date ? (date.kind_of?(Fixnum) ? date : date.month) : ''
0
         if options[:use_hidden]
0
-          hidden_html(options[:field_name] || 'month', val, options)
0
+          _date_hidden_html(options[:field_name] || 'month', val, options)
0
         else
0
           month_options = []
0
           month_names = options[:use_month_names] || begin
0
@@ -534,14 +509,15 @@ module ActionView
0
             )
0
             month_options << "\n"
0
           end
0
-          select_html(options[:field_name] || 'month', month_options.join, options, html_options)
0
+          _date_select_html(options[:field_name] || 'month', month_options.join, options, html_options)
0
         end
0
-      end      
0
+      end
0
 
0
-      # Returns a select tag with options for each of the five years on each side of the current, which is selected. The five year radius
0
-      # can be changed using the <tt>:start_year</tt> and <tt>:end_year</tt> keys in the +options+. Both ascending and descending year
0
-      # lists are supported by making <tt>:start_year</tt> less than or greater than <tt>:end_year</tt>. The <tt>date</tt> can also be
0
-      # substituted for a year given as a number.  Override the field name using the <tt>:field_name</tt> option, 'year' by default.
0
+      # Returns a select tag with options for each of the five years on each side of the current, which is selected.
0
+      # The five year radius can be changed using the <tt>:start_year</tt> and <tt>:end_year</tt> keys in the
0
+      # +options+. Both ascending and descending year lists are supported by making <tt>:start_year</tt> less than or
0
+      # greater than <tt>:end_year</tt>. The <tt>date</tt> can also be substituted for a year given as a number.
0
+      # Override the field name using the <tt>:field_name</tt> option, 'year' by default.
0
       #
0
       # ==== Examples
0
       #   # Generates a select field for years that defaults to the current year that
0
@@ -562,38 +538,48 @@ module ActionView
0
       #
0
       def select_year(date, options = {}, html_options = {})
0
         if !date || date == 0
0
-          value = ''
0
+          val = ''
0
           middle_year = Date.today.year
0
         elsif date.kind_of?(Fixnum)
0
-          value = middle_year = date
0
+          val = middle_year = date
0
         else
0
-          value = middle_year = date.year
0
+          val = middle_year = date.year
0
         end
0
 
0
         if options[:use_hidden]
0
-          hidden_html(options[:field_name] || 'year', value, options)
0
+          _date_hidden_html(options[:field_name] || 'year', val, options)
0
         else
0
-          year_options = ''
0
-          start_year   = options[:start_year] || middle_year - 5
0
-          end_year     = options[:end_year]   || middle_year + 5
0
-          step_val     = start_year < end_year ? 1 : -1
0
-
0
-          start_year.step(end_year, step_val) do |year|
0
-            if value == year
0
-              year_options << content_tag(:option, year, :value => year, :selected => "selected")
0
-            else
0
-              year_options << content_tag(:option, year, :value => year)
0
-            end
0
-            year_options << "\n"
0
-          end
0
-          select_html(options[:field_name] || 'year', year_options, options, html_options)
0
+          options[:start_year] ||= middle_year - 5
0
+          options[:end_year]   ||= middle_year + 5
0
+          step                   = options[:start_year] < options[:end_year] ? 1 : -1
0
+
0
+          _date_select_html(options[:field_name] || 'year',
0
+            _date_build_options(val,
0
+              :start => options[:start_year],
0
+              :end => options[:end_year],
0
+              :step => step,
0
+              :leading_zeros => false
0
+            ), options, html_options)
0
         end
0
       end
0
 
0
       private
0
+        def _date_build_options(selected, options={})
0
+          options.reverse_merge!(:start => 0, :end => 59, :step => 1, :leading_zeros => true)
0
+
0
+          select_options = []
0
+          (options[:start] || 0).step((options[:end] || 59), options[:step] || 1) do |i|
0
+            value = options[:leading_zeros] ? sprintf("%02d", i) : i
0
+            tag_options = { :value => value }
0
+            tag_options[:selected] = "selected" if selected == i
0
+
0
+            select_options << content_tag(:option, value, tag_options)
0
+          end
0
+          select_options.join("\n") + "\n"
0
+        end
0
 
0
-        def select_html(type, html_options, options, select_tag_options = {})
0
-          name_and_id_from_options(options, type)
0
+        def _date_select_html(type, html_options, options, select_tag_options = {})
0
+          _date_name_and_id_from_options(options, type)
0
           select_options = {:id => options[:id], :name => options[:name]}
0
           select_options.merge!(:disabled => 'disabled') if options[:disabled]
0
           select_options.merge!(select_tag_options) unless select_tag_options.empty?
0
@@ -603,19 +589,15 @@ module ActionView
0
           content_tag(:select, select_html, select_options) + "\n"
0
         end
0
 
0
-        def hidden_html(type, value, options)
0
-          name_and_id_from_options(options, type)
0
+        def _date_hidden_html(type, value, options)
0
+          _date_name_and_id_from_options(options, type)
0
           hidden_html = tag(:input, :type => "hidden", :id => options[:id], :name => options[:name], :value => value) + "\n"
0
         end
0
 
0
-        def name_and_id_from_options(options, type)
0
+        def _date_name_and_id_from_options(options, type)
0
           options[:name] = (options[:prefix] || DEFAULT_PREFIX) + (options[:discard_type] ? '' : "[#{type}]")
0
           options[:id] = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '')
0
         end
0
-
0
-        def leading_zero_on_single_digits(number)
0
-          number > 9 ? number : "0#{number}"
0
-        end
0
     end
0
 
0
     class InstanceTag #:nodoc:
0
@@ -641,11 +623,11 @@ module ActionView
0
           options  = defaults.merge(options)
0
           datetime = value(object)
0
           datetime ||= default_time_from_options(options[:default]) unless options[:include_blank]
0
-    
0
+
0
           position = { :year => 1, :month => 2, :day => 3, :hour => 4, :minute => 5, :second => 6 }
0
 
0
           order = options[:order] ||= I18n.translate(:'date.order', :locale => locale)
0
-    
0
+
0
           # Discard explicit and implicit by not being included in the :order
0
           discard = {}
0
           discard[:year]   = true if options[:discard_year] or !order.include?(:year)
0
@@ -654,26 +636,30 @@ module ActionView
0
           discard[:hour]   = true if options[:discard_hour]
0
           discard[:minute] = true if options[:discard_minute] or discard[:hour]
0
           discard[:second] = true unless options[:include_seconds] && !discard[:minute]
0
-    
0
+
0
           # If the day is hidden and the month is visible, the day should be set to the 1st so all month choices are valid
0
           # (otherwise it could be 31 and february wouldn't be a valid date)
0
           if datetime && discard[:day] && !discard[:month]
0
             datetime = datetime.change(:day => 1)
0
           end
0
-    
0
+
0
           # Maintain valid dates by including hidden fields for discarded elements
0
           [:day, :month, :year].each { |o| order.unshift(o) unless order.include?(o) }
0
-    
0
+
0
           # Ensure proper ordering of :hour, :minute and :second
0
           [:hour, :minute, :second].each { |o| order.delete(o); order.push(o) }
0
-    
0
+
0
           date_or_time_select = ''
0
           order.reverse.each do |param|
0
             # Send hidden fields for discarded elements once output has started
0
             # This ensures AR can reconstruct valid dates using ParseDate
0
             next if discard[param] && (date_or_time_select.empty? || options[:ignore_date])
0
 
0
-            date_or_time_select.insert(0, self.send("select_#{param}", datetime, options_with_prefix(position[param], options.merge(:use_hidden => discard[param])), html_options))
0
+            date_or_time_select.insert(0,
0
+              self.send("select_#{param}",
0
+                datetime,
0
+                options_with_prefix(position[param], options.merge(:use_hidden => discard[param])),
0
+                html_options))
0
             date_or_time_select.insert(0,
0
               case param
0
                 when :hour then (discard[:year] && discard[:day] ? "" : " &mdash; ")
0
@@ -682,7 +668,7 @@ module ActionView
0
                 else ""
0
               end)
0
           end
0
-    
0
+
0
           date_or_time_select
0
         end
0
 
0
@@ -708,7 +694,7 @@ module ActionView
0
               default[:sec] ||= default[:second]
0
 
0
               time = Time.current
0
-                
0
+
0
               [:year, :month, :day, :hour, :min, :sec].each do |key|
0
                 default[key] ||= time.send(key)
0
               end
...
17
18
19
20
 
21
22
23
...
86
87
88
89
 
90
91
92
93
94
95
 
96
97
98
...
100
101
102
103
 
104
105
106
107
108
109
 
110
111
112
...
757
758
759
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
760
761
762
...
857
858
859
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
860
861
862
...
933
934
935
936
 
937
938
939
...
942
943
944
945
 
946
947
948
...
950
951
952
953
 
954
955
956
...
1188
1189
1190
1191
 
1192
1193
1194
1195
 
1196
1197
1198
...
1203
1204
1205
1206
 
1207
1208
1209
1210
 
1211
1212
1213
...
1222
1223
1224
1225
 
1226
1227
1228
1229
 
1230
1231
1232
1233
 
1234
1235
1236
...
1245
1246
1247
1248
 
1249
1250
1251
1252
 
1253
1254
1255
...
1268
1269
1270
1271
 
1272
1273
1274
1275
 
1276
1277
1278
...
1306
1307
1308
1309
 
1310
1311
1312
...
1370
1371
1372
1373
1374
 
1375
1376
1377
...
1388
1389
1390
1391
1392
 
1393
1394
1395
...
1405
1406
1407
1408
1409
 
1410
1411
1412
...
1422
1423
1424
1425
1426
 
1427
1428
1429
...
1530
1531
1532
1533
 
1534
1535
1536
1537
 
1538
1539
1540
1541
 
1542
1543
1544
...
1559
1560
1561
1562
 
1563
1564
1565
1566
 
1567
1568
1569
...
1582
1583
1584
1585
 
1586
1587
1588
1589
 
1590
1591
1592
...
1601
1602
1603
1604
 
1605
1606
1607
1608
 
1609
1610
1611
...
1628
1629
1630
1631
 
1632
1633
1634
1635
 
1636
1637
1638
...
1653
1654
1655
1656
 
1657
1658
1659
1660
 
1661
1662
1663
...
1680
1681
1682
1683
 
1684
1685
1686
1687
 
1688
1689
1690
...
1727
1728
1729
1730
 
1731
1732
1733
1734
 
1735
1736
1737
...
1780
1781
1782
1783
 
1784
1785
1786
1787
1788
1789
1790
 
1791
1792
1793
1794
1795
1796
1797
 
1798
...
17
18
19
 
20
21
22
23
...
86
87
88
 
89
90
91
92
93
94
 
95
96
97
98
...
100
101
102
 
103
104
105
106
107
108
 
109
110
111
112
...
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
...
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
...
985
986
987
 
988
989
990
991
...
994
995
996
 
997
998
999
1000
...
1002
1003
1004
 
1005
1006
1007
1008
...
1240
1241
1242
 
1243
1244
1245
1246
 
1247
1248
1249
1250
...
1255
1256
1257
 
1258
1259
1260
1261
 
1262
1263
1264
1265
...
1274
1275
1276
 
1277
1278
1279
1280
 
1281
1282
1283
1284
 
1285
1286
1287
1288
...
1297
1298
1299
 
1300
1301
1302
1303
 
1304
1305
1306
1307
...
1320
1321
1322
 
1323
1324
1325
1326
 
1327
1328
1329
1330
...
1358
1359
1360
 
1361
1362
1363
1364
...
1422
1423
1424
 
 
1425
1426
1427
1428
...
1439
1440
1441
 
 
1442
1443
1444
1445
...
1455
1456
1457
 
 
1458
1459
1460
1461
...
1471
1472
1473
 
 
1474
1475
1476
1477
...
1578
1579
1580
 
1581
1582
1583
1584
 
1585
1586
1587
1588
 
1589
1590
1591
1592
...
1607
1608
1609
 
1610
1611
1612
1613
 
1614
1615
1616
1617
...
1630
1631
1632
 
1633
1634
1635
1636
 
1637
1638
1639
1640
...
1649
1650
1651
 
1652
1653
1654
1655
 
1656
1657
1658
1659
...
1676
1677
1678
 
1679
1680
1681
1682
 
1683
1684
1685
1686
...
1701
1702
1703
 
1704
1705
1706
1707
 
1708
1709
1710
1711
...
1728
1729
1730
 
1731
1732
1733
1734
 
1735
1736
1737
1738
...
1775
1776
1777
 
1778
1779
1780
1781
 
1782
1783
1784
1785
...
1828
1829
1830
 
1831
1832
1833
1834
1835
1836
1837
 
1838
1839
1840
1841
1842
1843
1844
 
1845
1846
0
@@ -17,7 +17,7 @@ class DateHelperTest < ActionView::TestCase
0
       end
0
     end
0
   end
0
-  
0
+
0
   def assert_distance_of_time_in_words(from, to=nil)
0
     to ||= from
0
 
0
@@ -86,13 +86,13 @@ class DateHelperTest < ActionView::TestCase
0
     from = Time.mktime(2004, 6, 6, 21, 45, 0)
0
     assert_distance_of_time_in_words(from)
0
   end
0
-  
0
+
0
   def test_distance_in_words_with_time_zones
0
     from = Time.mktime(2004, 6, 6, 21, 45, 0)
0
     assert_distance_of_time_in_words(from.in_time_zone('Alaska'))
0
     assert_distance_of_time_in_words(from.in_time_zone('Hawaii'))
0
   end
0
-  
0
+
0
   def test_distance_in_words_with_different_time_zones
0
     from = Time.mktime(2004, 6, 6, 21, 45, 0)
0
     assert_distance_of_time_in_words(
0
@@ -100,13 +100,13 @@ class DateHelperTest < ActionView::TestCase
0
       from.in_time_zone('Hawaii')
0
     )
0
   end
0
-  
0
+
0
   def test_distance_in_words_with_dates
0
     start_date = Date.new 1975, 1, 31
0
     end_date = Date.new 1977, 1, 31
0
     assert_equal("over 2 years", distance_of_time_in_words(start_date, end_date))
0
   end
0
-  
0
+
0
   def test_distance_in_words_with_integers
0
     assert_equal "less than a minute", distance_of_time_in_words(59)
0
     assert_equal "about 1 hour", distance_of_time_in_words(60*60)
0
@@ -757,6 +757,26 @@ class DateHelperTest < ActionView::TestCase
0
     assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), {:start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => "selector")
0
   end
0
 
0
+  def test_select_date_with_separator
0
+    expected =  %(<select id="date_first_year" name="date[first][year]">\n)
0
+    expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    expected << " / "
0
+
0
+    expected << %(<select id="date_first_month" name="date[first][month]">\n)
0
+    expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    expected << " / "
0
+
0
+    expected << %(<select id="date_first_day" name="date[first][day]">\n)
0
+    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16" selected="selected">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), { :date_separator => " / ", :start_year => 2003, :end_year => 2005, :prefix => "date[first]"})
0
+  end
0
+
0
   def test_select_datetime
0
     expected =  %(<select id="date_first_year" name="date[first][year]">\n)
0
     expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n)
0
@@ -857,6 +877,38 @@ class DateHelperTest < ActionView::TestCase
0
     assert_dom_equal expected, select_datetime(Time.mktime(2003, 8, 16, 8, 4, 18), {:start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => 'selector')
0
   end
0
 
0
+  def test_select_datetime_with_all_separators
0
+    expected =  %(<select id="date_first_year" name="date[first][year]" class="selector">\n)
0
+    expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    expected << "/"
0
+
0
+    expected << %(<select id="date_first_month" name="date[first][month]" class="selector">\n)
0
+    expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    expected << "/"
0
+
0
+    expected << %(<select id="date_first_day" name="date[first][day]" class="selector">\n)
0
+    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16" selected="selected">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    expected << "&mdash;"
0
+
0
+    expected << %(<select id="date_first_hour" name="date[first][hour]" class="selector">\n)
0
+    expected << %(<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08" selected="selected">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    expected << ":"
0
+
0
+    expected << %(<select id="date_first_minute" name="date[first][minute]" class="selector">\n)
0
+    expected << %(<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04" selected="selected">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n)
0
+    expected << "</select>\n"
0
+
0
+    assert_dom_equal expected, select_datetime(Time.mktime(2003, 8, 16, 8, 4, 18), { :datetime_separator => "&mdash;", :date_separator => "/", :time_separator => ":", :start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => 'selector')
0
+  end
0
+
0
   def test_select_time
0
     expected = %(<select id="date_hour" name="date[hour]">\n)
0
     expected << %(<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08" selected="selected">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n)
0
@@ -933,7 +985,7 @@ class DateHelperTest < ActionView::TestCase
0
     assert_dom_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector')
0
     assert_dom_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), {:include_seconds => false}, :class => 'selector')
0
   end
0
-  
0
+
0
   uses_mocha 'TestDatetimeAndTimeSelectUseTimeCurrentAsDefault' do
0
     def test_select_datetime_uses_time_current_as_default
0
       time = stub(:year => 2004, :month => 6, :day => 15, :hour => 16, :min => 35, :sec => 0)
0
@@ -942,7 +994,7 @@ class DateHelperTest < ActionView::TestCase
0
       expects(:select_time).with(time, anything, anything).returns('')
0
       select_datetime
0
     end
0
-    
0
+
0
     def test_select_time_uses_time_current_as_default
0
       time = stub(:year => 2004, :month => 6, :day => 15, :hour => 16, :min => 35, :sec => 0)
0
       Time.expects(:current).returns time
0
@@ -950,7 +1002,7 @@ class DateHelperTest < ActionView::TestCase
0
       expects(:select_minute).with(time, anything, anything).returns('')
0
       select_time
0
     end
0
-    
0
+
0
     def test_select_date_uses_date_current_as_default
0
       date = stub(:year => 2004, :month => 6, :day => 15)
0
       Date.expects(:current).returns date
0
@@ -1188,11 +1240,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
0
 
0
     expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]">\n)
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]">\n)
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, time_select("post", "written_on")
0
@@ -1203,11 +1255,11 @@ class DateHelperTest < ActionView::TestCase
0
     @post.written_on = Time.local(2004, 6, 15, 15, 16, 35)
0
 
0
     expected = %(<select id="post_written_on_4i" name="post[written_on(4i)]">\n)
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]">\n)
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, time_select("post", "written_on", :ignore_date => true)
0
@@ -1222,15 +1274,15 @@ class DateHelperTest < ActionView::TestCase
0
     expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
0
 
0
     expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]">\n)
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]">\n)
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %(<select id="post_written_on_6i" name="post[written_on(6i)]">\n)
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 35}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 35}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, time_select("post", "written_on", :include_seconds => true)
0
@@ -1245,11 +1297,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
0
 
0
     expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]" class="selector">\n)
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]" class="selector">\n)
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, time_select("post", "written_on", {}, :class => 'selector')
0
@@ -1268,11 +1320,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
0
 
0
     expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]" class="selector">\n)
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]" class="selector">\n)
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, output_buffer
0
@@ -1306,7 +1358,7 @@ class DateHelperTest < ActionView::TestCase
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at")
0
   end
0
-  
0
+
0
   uses_mocha 'TestDatetimeSelectDefaultsToTimeZoneNowWhenConfigTimeZoneIsSet' do
0
     def test_datetime_select_defaults_to_time_zone_now_when_config_time_zone_is_set
0
       time = stub(:year => 2004, :month => 6, :day => 15, :hour => 16, :min => 35, :sec => 0)
0
@@ -1370,8 +1422,7 @@ class DateHelperTest < ActionView::TestCase
0
     expected << "</select>\n"
0
 
0
     expected << %(<select id="date_first_day" name="date[first][day]">\n)
0
-    expected <<
0
-%(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
+    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, select_date(0, :end_year => Date.today.year+1, :prefix => "date[first]")
0
@@ -1388,8 +1439,7 @@ class DateHelperTest < ActionView::TestCase
0
     expected << "</select>\n"
0
 
0
     expected << %(<select id="date_first_day" name="date[first][day]">\n)
0
-    expected <<
0
-%(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
+    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, select_date(0, :start_year => 2003, :prefix => "date[first]")
0
@@ -1405,8 +1455,7 @@ class DateHelperTest < ActionView::TestCase
0
     expected << "</select>\n"
0
 
0
     expected << %(<select id="date_first_day" name="date[first][day]">\n)
0
-    expected <<
0
-%(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
+    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, select_date(0, :prefix => "date[first]")
0
@@ -1422,8 +1471,7 @@ class DateHelperTest < ActionView::TestCase
0
     expected << "</select>\n"
0
 
0
     expected << %(<select id="date_first_day" name="date[first][day]">\n)
0
-    expected <<
0
-%(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
+    expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, select_date(nil, :prefix => "date[first]")
0
@@ -1530,15 +1578,15 @@ class DateHelperTest < ActionView::TestCase
0
     expected << " &mdash; "
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_6i" name="post[updated_at(6i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 35}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 35}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :include_seconds => true)
0
@@ -1559,11 +1607,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << " &mdash; "
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :discard_year => true)
0
@@ -1582,11 +1630,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << " &mdash; "
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :discard_month => true)
0
@@ -1601,11 +1649,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << %{<input type="hidden" id="post_updated_at_3i" name="post[updated_at(3i)]" value="15" />\n}
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :discard_year => true, :discard_month => true)
0
@@ -1628,11 +1676,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << " &mdash; "
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :order => [:minute, :day, :hour, :month, :year, :second])
0
@@ -1653,11 +1701,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << " &mdash; "
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :order => [:day, :month])
0
@@ -1680,11 +1728,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << " &mdash; "
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :default => Time.local(2006, 9, 19, 15, 16, 35))
0
@@ -1727,11 +1775,11 @@ class DateHelperTest < ActionView::TestCase
0
     expected << " &mdash; "
0
 
0
     expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
0
-    0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 9}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 9}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
     expected << " : "
0
     expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
0
-    0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 42}>#{leading_zero_on_single_digits(i)}</option>\n) }
0
+    0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 42}>#{sprintf("%02d", i)}</option>\n) }
0
     expected << "</select>\n"
0
 
0
     assert_dom_equal expected, datetime_select("post", "updated_at", :default => { :month => 10, :minute => 42, :hour => 9 })
0
@@ -1780,19 +1828,19 @@ class DateHelperTest < ActionView::TestCase
0
         assert_equal 2, dummy_instance_tag.send!(:default_time_from_options, :hour => 2).hour
0
       end
0
     end
0
-    
0
+
0
     def test_instance_tag_default_time_from_options_handles_far_future_date
0
       dummy_instance_tag = ActionView::Helpers::InstanceTag.new(1,2,3)
0
       time = dummy_instance_tag.send!(:default_time_from_options, :year => 2050, :month => 2, :day => 10, :hour => 15, :min => 30, :sec => 45)
0
       assert_equal 2050, time.year
0
     end
0
   end
0
-  
0
+
0
   protected
0
     def with_env_tz(new_tz = 'US/Eastern')
0
       old_tz, ENV['TZ'] = ENV['TZ'], new_tz
0
       yield
0
     ensure
0
       old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
0
-    end  
0
+    end
0
 end

Comments