merb_helpers 0.9.3 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +58 -36
- data/lib/merb_helpers/core_ext.rb +31 -0
- data/lib/merb_helpers/date_time_helpers.rb +23 -63
- data/lib/merb_helpers/form_helpers.rb +37 -14
- data/lib/merb_helpers/ordinalize.rb +32 -1
- data/lib/merb_helpers/tag_helpers.rb +2 -2
- data/lib/merb_helpers/time_dsl.rb +1 -0
- data/lib/merb_helpers.rb +16 -19
- metadata +10 -8
data/Rakefile
CHANGED
@@ -1,61 +1,72 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake/gempackagetask'
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rake/rdoctask"
|
4
|
+
require "extlib"
|
5
|
+
require 'merb-core/tasks/merb_rake_helper'
|
6
|
+
require "spec/rake/spectask"
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
##############################################################################
|
9
|
+
# Package && release
|
10
|
+
##############################################################################
|
11
|
+
RUBY_FORGE_PROJECT = "merb"
|
12
|
+
PROJECT_URL = "http://merbivore.com"
|
13
|
+
PROJECT_SUMMARY = "Helper support for merb (similar to the Rails form helpers)"
|
14
|
+
PROJECT_DESCRIPTION = PROJECT_SUMMARY
|
13
15
|
|
14
|
-
|
16
|
+
GEM_AUTHOR = "Yehuda Katz"
|
17
|
+
GEM_EMAIL = "ykatz@engineyard.com"
|
15
18
|
|
16
|
-
|
19
|
+
GEM_NAME = "merb_helpers"
|
20
|
+
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
21
|
+
GEM_VERSION = (Merb::MORE_VERSION rescue "0.9.4") + PKG_BUILD
|
22
|
+
|
23
|
+
RELEASE_NAME = "REL #{GEM_VERSION}"
|
24
|
+
|
25
|
+
require "extlib/tasks/release"
|
17
26
|
|
18
27
|
spec = Gem::Specification.new do |s|
|
19
|
-
s.
|
20
|
-
s.
|
28
|
+
s.rubyforge_project = RUBY_FORGE_PROJECT
|
29
|
+
s.name = GEM_NAME
|
30
|
+
s.version = GEM_VERSION
|
21
31
|
s.platform = Gem::Platform::RUBY
|
22
32
|
s.has_rdoc = true
|
23
33
|
s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
|
24
|
-
s.summary =
|
25
|
-
s.description =
|
26
|
-
s.author =
|
27
|
-
s.email =
|
28
|
-
s.homepage =
|
29
|
-
s.add_dependency(
|
34
|
+
s.summary = PROJECT_SUMMARY
|
35
|
+
s.description = PROJECT_DESCRIPTION
|
36
|
+
s.author = GEM_AUTHOR
|
37
|
+
s.email = GEM_EMAIL
|
38
|
+
s.homepage = PROJECT_URL
|
39
|
+
s.add_dependency('merb-core', '>= 0.9.4')
|
30
40
|
s.require_path = 'lib'
|
31
|
-
s.autorequire = PLUGIN
|
32
41
|
s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,specs}/**/*")
|
33
42
|
end
|
34
43
|
|
35
|
-
|
36
44
|
Rake::GemPackageTask.new(spec) do |pkg|
|
37
45
|
pkg.gem_spec = spec
|
38
46
|
end
|
39
47
|
|
40
|
-
|
48
|
+
##############################################################################
|
49
|
+
# Installation
|
50
|
+
##############################################################################
|
51
|
+
desc "Install the gem"
|
41
52
|
task :install => [:package] do
|
42
|
-
sh %{#{
|
53
|
+
sh %{#{sudo} gem install #{install_home} pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources}
|
43
54
|
end
|
44
55
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
rdoc.title = 'Merb Helper Docs'
|
51
|
-
rdoc.rdoc_dir = 'doc/rdoc'
|
52
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
56
|
+
namespace :jruby do
|
57
|
+
desc "Run :package and install the resulting .gem with jruby"
|
58
|
+
task :install => :package do
|
59
|
+
sh %{#{sudo} jruby -S gem install #{install_home} pkg/#{GEM_NAME}-#{GEM_VERSION}.gem --no-rdoc --no-ri}
|
60
|
+
end
|
53
61
|
end
|
54
62
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
63
|
+
##############################################################################
|
64
|
+
# Specs
|
65
|
+
##############################################################################
|
66
|
+
desc "Run all specs"
|
67
|
+
Spec::Rake::SpecTask.new("specs") do |t|
|
68
|
+
t.spec_opts = ["--format", "specdoc", "--colour"]
|
69
|
+
t.spec_files = Dir["spec/**/*_spec.rb"].sort
|
59
70
|
end
|
60
71
|
|
61
72
|
desc "Run all specs and generate an rcov report"
|
@@ -67,4 +78,15 @@ Spec::Rake::SpecTask.new('rcov') do |t|
|
|
67
78
|
t.rcov_opts = ['--exclude', 'gems', '--exclude', 'spec']
|
68
79
|
end
|
69
80
|
|
70
|
-
|
81
|
+
##############################################################################
|
82
|
+
# Documentation
|
83
|
+
##############################################################################
|
84
|
+
Rake::RDocTask.new do |rdoc|
|
85
|
+
files = ['README', 'LICENSE',
|
86
|
+
'lib/**/*.rb']
|
87
|
+
rdoc.rdoc_files.add(files)
|
88
|
+
rdoc.main = 'README'
|
89
|
+
rdoc.title = 'Merb Helper Docs'
|
90
|
+
rdoc.rdoc_dir = 'doc/rdoc'
|
91
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
92
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Date
|
2
|
+
include OrdinalizedFormatting
|
3
|
+
|
4
|
+
# Converts a Date instance to a Time, where the time is set to the beginning of the day.
|
5
|
+
# The timezone can be either :local or :utc (default :utc).
|
6
|
+
#
|
7
|
+
# ==== Examples:
|
8
|
+
# date = Date.new(2007, 11, 10)
|
9
|
+
# date.to_s # => 2007-11-10
|
10
|
+
#
|
11
|
+
# date.to_time # => Sat Nov 10 00:00:00 UTC 2007
|
12
|
+
# date.to_time(:utc) # => Sat Nov 10 00:00:00 UTC 2007
|
13
|
+
# date.to_time(:local) # => Sat Nov 10 00:00:00 -0800 2007
|
14
|
+
#
|
15
|
+
def to_time(form = :utc)
|
16
|
+
::Time.send("#{form}", year, month, day)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_date; self; end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Time
|
23
|
+
include OrdinalizedFormatting
|
24
|
+
|
25
|
+
# Ruby 1.8-cvs and 1.9 define private Time#to_date
|
26
|
+
%w(to_date to_datetime).each do |method|
|
27
|
+
public method if private_instance_methods.include?(method)
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_time; self; end
|
31
|
+
end
|
@@ -1,52 +1,3 @@
|
|
1
|
-
|
2
|
-
# Everything above here has pretty much been implemented in the assistance gem...
|
3
|
-
|
4
|
-
# Time.now.to_ordinalized_s :long
|
5
|
-
# => "February 28th, 2006 21:10"
|
6
|
-
module OrdinalizedFormatting
|
7
|
-
|
8
|
-
def self.extended(obj)
|
9
|
-
include Merb::Helpers::DateAndTime
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_ordinalized_s(format = :default)
|
13
|
-
format = Merb::Helpers::DateAndTime.date_formats[format]
|
14
|
-
return self.to_s if format.nil?
|
15
|
-
strftime_ordinalized(format)
|
16
|
-
end
|
17
|
-
|
18
|
-
def strftime_ordinalized(fmt)
|
19
|
-
strftime(fmt.gsub(/(^|[^-])%d/, '\1_%d_')).gsub(/_(\d+)_/) { |s| s.to_i.ordinalize }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
class Date
|
24
|
-
include OrdinalizedFormatting
|
25
|
-
# Converts a Date instance to a Time, where the time is set to the beginning of the day.
|
26
|
-
# The timezone can be either :local or :utc (default :utc).
|
27
|
-
#
|
28
|
-
# ==== Examples:
|
29
|
-
# date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
|
30
|
-
#
|
31
|
-
# date.to_time # => Sat Nov 10 00:00:00 0800 2007
|
32
|
-
# date.to_time(:local) # => Sat Nov 10 00:00:00 0800 2007
|
33
|
-
#
|
34
|
-
# date.to_time(:utc) # => Sat Nov 10 00:00:00 UTC 2007
|
35
|
-
def to_time(form = :utc)
|
36
|
-
::Time.send("#{form}_time", year, month, day)
|
37
|
-
end
|
38
|
-
def to_date; self; end
|
39
|
-
end
|
40
|
-
|
41
|
-
class Time
|
42
|
-
include OrdinalizedFormatting
|
43
|
-
# Ruby 1.8-cvs and 1.9 define private Time#to_date
|
44
|
-
%w(to_date to_datetime).each do |method|
|
45
|
-
public method if private_instance_methods.include?(method)
|
46
|
-
end
|
47
|
-
def to_time; self; end
|
48
|
-
end
|
49
|
-
|
50
1
|
module Merb
|
51
2
|
module Helpers
|
52
3
|
# Provides a number of methods for displaying and dealing with dates and times
|
@@ -78,11 +29,17 @@ module Merb
|
|
78
29
|
@@time_class
|
79
30
|
end
|
80
31
|
|
81
|
-
|
82
|
-
|
32
|
+
# ==== Parameters
|
33
|
+
# format<Symbol>:: time format to use
|
34
|
+
# locale<String, Symbol>:: An optional value which can be used by localization plugins
|
35
|
+
#
|
36
|
+
# ==== Returns
|
37
|
+
# String:: a string used to format time using #strftime
|
38
|
+
def self.time_output(format, locale=nil)
|
39
|
+
@@time_output[format]
|
83
40
|
end
|
84
41
|
|
85
|
-
def date_formats
|
42
|
+
def self.date_formats
|
86
43
|
@@date_formats
|
87
44
|
end
|
88
45
|
|
@@ -90,27 +47,28 @@ module Merb
|
|
90
47
|
#
|
91
48
|
# ==== Parameters
|
92
49
|
# time<~to_date>:: The Date or Time to test
|
50
|
+
# locale<String, Symbol>:: An optional value which can be used by localization plugins
|
93
51
|
#
|
94
52
|
# ==== Returns
|
95
|
-
# String::
|
53
|
+
# String:: Relative date
|
96
54
|
#
|
97
55
|
# ==== Examples
|
98
56
|
# relative_date(Time.now.utc) => "today"
|
99
57
|
# relative_date(5.days.ago) => "March 5th"
|
100
58
|
# relative_date(1.year.ago) => "March 10th, 2007"
|
101
|
-
def relative_date(time)
|
59
|
+
def relative_date(time, locale=nil)
|
102
60
|
date = time.to_date
|
103
61
|
today = DateAndTime.time_class.now.to_date
|
104
62
|
if date == today
|
105
|
-
DateAndTime.time_output
|
63
|
+
DateAndTime.time_output(:today, locale)
|
106
64
|
elsif date == (today - 1)
|
107
|
-
DateAndTime.time_output
|
65
|
+
DateAndTime.time_output(:yesterday, locale)
|
108
66
|
elsif date == (today + 1)
|
109
|
-
DateAndTime.time_output
|
67
|
+
DateAndTime.time_output(:tomorrow, locale)
|
110
68
|
else
|
111
|
-
fmt = DateAndTime.time_output
|
112
|
-
fmt << DateAndTime.time_output
|
113
|
-
time.strftime_ordinalized(fmt)
|
69
|
+
fmt = DateAndTime.time_output(:initial_format, locale).dup
|
70
|
+
fmt << DateAndTime.time_output(:year_format, locale) unless date.year == today.year
|
71
|
+
time.strftime_ordinalized(fmt, locale)
|
114
72
|
end
|
115
73
|
end
|
116
74
|
|
@@ -188,6 +146,7 @@ module Merb
|
|
188
146
|
# from_time<~to_time>:: The Date or Time to start from
|
189
147
|
# to_time<~to_time>:: The Date or Time to go to, Defaults to Time.now.utc
|
190
148
|
# include_seconds<Boolean>:: Count the seconds initially, Defaults to false
|
149
|
+
# locale<String, Symbol>:: An optional value which can be used by localization plugins
|
191
150
|
#
|
192
151
|
# ==== Returns
|
193
152
|
# String:: The time distance
|
@@ -199,7 +158,7 @@ module Merb
|
|
199
158
|
# time_lost_in_words(Time.now) # => less than a minute
|
200
159
|
# time_lost_in_words(Time.now, Time.now, true) # => less than 5 seconds
|
201
160
|
#
|
202
|
-
def time_lost_in_words(from_time, to_time = Time.now.utc, include_seconds = false)
|
161
|
+
def time_lost_in_words(from_time, to_time = Time.now.utc, include_seconds = false, locale=nil)
|
203
162
|
from_time = from_time.to_time if from_time.respond_to?(:to_time)
|
204
163
|
to_time = to_time.to_time if to_time.respond_to?(:to_time)
|
205
164
|
distance_in_minutes = (((to_time - from_time).abs)/60).round
|
@@ -230,13 +189,14 @@ module Merb
|
|
230
189
|
end
|
231
190
|
alias :time_ago_in_words :time_lost_in_words
|
232
191
|
|
233
|
-
def prettier_time(time, ampm=true)
|
192
|
+
def prettier_time(time, ampm=true, locale=nil)
|
234
193
|
time.strftime("%I:%M#{" %p" if ampm}").sub(/^0/, '')
|
235
194
|
end
|
236
195
|
end
|
237
196
|
end
|
238
197
|
end
|
239
198
|
|
240
|
-
class Merb::Controller
|
199
|
+
class Merb::Controller
|
241
200
|
include Merb::Helpers::DateAndTime
|
242
201
|
end
|
202
|
+
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/tag_helpers"
|
2
2
|
|
3
|
-
module Merb
|
3
|
+
module Merb
|
4
4
|
|
5
5
|
# Merb helpers include several helpers used for simplifying view creation.
|
6
6
|
# The available helpers currently include form tag helpers for both resource based and generic HTML form tag creation
|
@@ -46,7 +46,7 @@ module Merb #:nodoc:
|
|
46
46
|
# Provides a HTML formatted display of resource errors in an unordered list with a h2 form submission error
|
47
47
|
# ==== Options
|
48
48
|
# +build_li+:: Block for generating a list item for an error. It receives an instance of the error.
|
49
|
-
# +html_class+:: Set for custom error div class default is <tt>
|
49
|
+
# +html_class+:: Set for custom error div class default is <tt>submission_failed<tt>
|
50
50
|
#
|
51
51
|
# ==== Examples
|
52
52
|
# <%= error_messages_for :person %>
|
@@ -71,7 +71,7 @@ module Merb #:nodoc:
|
|
71
71
|
yield(obj.errors)
|
72
72
|
else
|
73
73
|
error_plurality = (error_count == 1 ? 'problem' : 'problems')
|
74
|
-
"<h2>Form
|
74
|
+
"<h2>Form submission failed because of #{error_count} #{error_plurality}</h2>"
|
75
75
|
end
|
76
76
|
|
77
77
|
markup = %Q{
|
@@ -88,7 +88,7 @@ module Merb #:nodoc:
|
|
88
88
|
}
|
89
89
|
end
|
90
90
|
|
91
|
-
def obj_from_ivar_or_sym(obj)
|
91
|
+
def obj_from_ivar_or_sym(obj)
|
92
92
|
obj.is_a?(Symbol) ? instance_variable_get("@#{obj}") : obj
|
93
93
|
end
|
94
94
|
|
@@ -164,19 +164,19 @@ module Merb #:nodoc:
|
|
164
164
|
@_obj, @_block, @_object_name = old_obj, old_block, old_object_name
|
165
165
|
end
|
166
166
|
|
167
|
-
def control_name(col)
|
167
|
+
def control_name(col)
|
168
168
|
"#{@_object_name}[#{col}]"
|
169
169
|
end
|
170
170
|
|
171
|
-
def control_id(col)
|
171
|
+
def control_id(col)
|
172
172
|
"#{@_object_name}_#{col}"
|
173
173
|
end
|
174
174
|
|
175
|
-
def control_value(col)
|
175
|
+
def control_value(col)
|
176
176
|
escape_xml(@_obj.send(col))
|
177
177
|
end
|
178
178
|
|
179
|
-
def control_name_value(col, attrs)
|
179
|
+
def control_name_value(col, attrs)
|
180
180
|
{:name => control_name(col), :value => control_value(col)}.merge(attrs)
|
181
181
|
end
|
182
182
|
|
@@ -212,7 +212,7 @@ module Merb #:nodoc:
|
|
212
212
|
def password_control(col, attrs = {})
|
213
213
|
attrs.merge!(:name => control_name(col), :id => control_id(col))
|
214
214
|
errorify_field(attrs, col)
|
215
|
-
password_field(
|
215
|
+
password_field({:name => control_name(col)}.merge(attrs))
|
216
216
|
end
|
217
217
|
|
218
218
|
# Provides a generic HTML password input tag.
|
@@ -221,7 +221,6 @@ module Merb #:nodoc:
|
|
221
221
|
# <%= password_field :name => :password, :label => "Password" %>
|
222
222
|
# # => <label for="password">Password</label><input type="password" name="password" id="password"/>
|
223
223
|
def password_field(attrs = {})
|
224
|
-
attrs.delete(:value)
|
225
224
|
attrs.merge!(:type => 'password')
|
226
225
|
attrs.add_html_class!("password")
|
227
226
|
optional_label(attrs) { self_closing_tag("input", attrs) }
|
@@ -229,7 +228,7 @@ module Merb #:nodoc:
|
|
229
228
|
|
230
229
|
# translate column values from the db to boolean
|
231
230
|
# nil, false, 0 and '0' are false. All others are true
|
232
|
-
def col_val_to_bool(val)
|
231
|
+
def col_val_to_bool(val)
|
233
232
|
!(val == "0" || val == 0 || !val)
|
234
233
|
end
|
235
234
|
private :col_val_to_bool
|
@@ -305,6 +304,20 @@ module Merb #:nodoc:
|
|
305
304
|
self_closing_tag("input", attrs)
|
306
305
|
end
|
307
306
|
|
307
|
+
# Provides a HTML radio input tag based on a resource attribute.
|
308
|
+
#
|
309
|
+
# ==== Example
|
310
|
+
# <% form_for :person, :action => url(:people) do %>
|
311
|
+
# <%= radio_control :first_name %>
|
312
|
+
# <% end %>
|
313
|
+
def radio_control(col, attrs = {})
|
314
|
+
errorify_field(attrs, col)
|
315
|
+
attrs.merge!(:id => control_id(col))
|
316
|
+
val = @_obj.send(col)
|
317
|
+
attrs.merge!(:checked => "checked") if val.to_s == attrs[:value]
|
318
|
+
optional_label(attrs) { radio_field(control_name_value(col, attrs)) }
|
319
|
+
end
|
320
|
+
|
308
321
|
# Provides a radio group based on a resource attribute.
|
309
322
|
# This is generally used within a resource block such as +form_for+.
|
310
323
|
#
|
@@ -334,8 +347,10 @@ module Merb #:nodoc:
|
|
334
347
|
# ==== Example
|
335
348
|
# <%= radio_field :name => "radio_options", :value => "1", :label => "One" %>
|
336
349
|
# <%= radio_field :name => "radio_options", :value => "2", :label => "Two" %>
|
350
|
+
# <%= radio_field :name => "radio_options", :value => "3", :label => "Three", :checked => true %>
|
337
351
|
def radio_field(attrs = {})
|
338
352
|
attrs.merge!(:type => "radio")
|
353
|
+
attrs.delete(:checked) unless attrs[:checked]
|
339
354
|
attrs.add_html_class!("radio")
|
340
355
|
optional_label(attrs){self_closing_tag("input", attrs)}
|
341
356
|
end
|
@@ -559,6 +574,7 @@ module Merb #:nodoc:
|
|
559
574
|
# Generates a delete button inside of a form.
|
560
575
|
#
|
561
576
|
# <%= delete_button :news_post, @news_post, 'Remove' %>
|
577
|
+
# <%= delete_button('/posts/24/comments/10') %>
|
562
578
|
#
|
563
579
|
# The HTML generated for this would be:
|
564
580
|
#
|
@@ -566,10 +582,17 @@ module Merb #:nodoc:
|
|
566
582
|
# <input type="hidden" value="delete" name="_method"/>
|
567
583
|
# <button type="submit">Remove</button>
|
568
584
|
# </form>
|
569
|
-
|
585
|
+
#
|
586
|
+
# <form method="post" action="/posts/24/comments/10">
|
587
|
+
# <input type="hidden" value="delete" name="_method"/>
|
588
|
+
# <button type="submit">Remove</button>
|
589
|
+
# </form>
|
590
|
+
def delete_button(symbol_or_string, obj = nil, contents = 'Delete', form_attrs = {}, button_attrs = {})
|
591
|
+
obj ||= instance_variable_get("@#{symbol_or_string}") if symbol_or_string.kind_of?(Symbol)
|
592
|
+
|
570
593
|
button_attrs[:type] = :submit
|
571
594
|
|
572
|
-
form_attrs.merge! :action => url(
|
595
|
+
form_attrs.merge! :action => symbol_or_string.kind_of?(Symbol) ? url(symbol_or_string, obj) : symbol_or_string, :method => :delete
|
573
596
|
|
574
597
|
fake_form_method = set_form_method(form_attrs, obj)
|
575
598
|
|
@@ -627,6 +650,6 @@ module Merb #:nodoc:
|
|
627
650
|
end
|
628
651
|
end
|
629
652
|
|
630
|
-
class Merb::Controller
|
653
|
+
class Merb::Controller
|
631
654
|
include Merb::Helpers::Form
|
632
655
|
end
|
@@ -20,4 +20,35 @@ module Ordinalize
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
|
+
Integer.send :include, Ordinalize
|
25
|
+
|
26
|
+
# Time.now.to_ordinalized_s :long
|
27
|
+
# => "February 28th, 2006 21:10"
|
28
|
+
module OrdinalizedFormatting
|
29
|
+
|
30
|
+
def self.extended(obj)
|
31
|
+
include Merb::Helpers::DateAndTime
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_ordinalized_s(format = :default)
|
35
|
+
format = Merb::Helpers::DateAndTime.date_formats[format]
|
36
|
+
return self.to_s if format.nil?
|
37
|
+
strftime_ordinalized(format)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Gives you a relative date in an attractive format
|
41
|
+
#
|
42
|
+
# ==== Parameters
|
43
|
+
# format<String>:: strftime string used to formatt a time/date object
|
44
|
+
# locale<String, Symbol>:: An optional value which can be used by localization plugins
|
45
|
+
#
|
46
|
+
# ==== Returns
|
47
|
+
# String:: Ordinalized time/date object
|
48
|
+
#
|
49
|
+
# ==== Examples
|
50
|
+
# 5.days.ago.strftime_ordinalized('%b %d, %Y') # =>
|
51
|
+
def strftime_ordinalized(fmt, format=nil)
|
52
|
+
strftime(fmt.gsub(/(^|[^-])%d/, '\1_%d_')).gsub(/_(\d+)_/) { |s| s.to_i.ordinalize }
|
53
|
+
end
|
54
|
+
end
|
@@ -26,7 +26,7 @@ module Merb
|
|
26
26
|
# # <div class="class">content</div>
|
27
27
|
#
|
28
28
|
def tag(name, contents = nil, attrs = {}, &block)
|
29
|
-
attrs = contents if contents.is_a?(Hash)
|
29
|
+
attrs, contents = contents, nil if contents.is_a?(Hash)
|
30
30
|
contents = capture(&block) if block_given?
|
31
31
|
open_tag(name, attrs) + contents.to_s + close_tag(name)
|
32
32
|
end
|
@@ -56,6 +56,6 @@ module Merb
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
class Merb::Controller
|
59
|
+
class Merb::Controller
|
60
60
|
include Merb::Helpers::Tag
|
61
61
|
end
|
data/lib/merb_helpers.rb
CHANGED
@@ -1,42 +1,39 @@
|
|
1
1
|
module Merb
|
2
2
|
|
3
3
|
module Helpers
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def self.load_helpers(helpers = HELPERS_FILES)
|
8
|
-
helpers.each {|h| Kernel.load(File.join(HELPERS_DIR, "#{h}.rb") )} # using load here allows specs to work
|
9
|
-
end
|
4
|
+
|
5
|
+
@@helpers_dir = File.dirname(__FILE__) / 'merb_helpers'
|
6
|
+
@@helpers_files = Dir["#{@@helpers_dir}/*_helpers.rb"].collect {|h| h.match(/\/(\w+)\.rb/)[1]}
|
10
7
|
|
11
8
|
def self.load
|
12
|
-
require
|
13
|
-
require
|
14
|
-
|
15
|
-
# config[:load]
|
16
|
-
# if defined then load the modules passed along
|
17
|
-
# otherwise load everything
|
9
|
+
require @@helpers_dir + '/time_dsl'
|
10
|
+
require @@helpers_dir + '/ordinalize'
|
11
|
+
require @@helpers_dir + '/core_ext'
|
18
12
|
|
19
13
|
if Merb::Plugins.config[:merb_helpers]
|
20
14
|
config = Merb::Plugins.config[:merb_helpers]
|
21
|
-
raise "With and Without options
|
22
|
-
|
15
|
+
raise "With and Without options have been deprecated" if config[:with] || config[:without]
|
16
|
+
|
17
|
+
if config[:include] && !config[:include].empty?
|
23
18
|
load_helpers(config[:include])
|
24
|
-
elsif config[:exclude]
|
25
|
-
load_helpers(HELPERS_FILES.reject {|h| config[:exclude].include? h})
|
26
19
|
else
|
27
20
|
# This is in case someone defines an entry in the config,
|
28
21
|
# but doesn't put in a with or without option
|
29
22
|
load_helpers
|
30
23
|
end
|
24
|
+
|
31
25
|
else
|
32
26
|
load_helpers
|
33
27
|
end
|
34
28
|
end
|
35
29
|
|
30
|
+
# Load only specific helpers instead of loading all the helpers
|
31
|
+
def self.load_helpers(helpers = @@helpers_files)
|
32
|
+
helpers.each {|helper| Kernel.load(File.join(@@helpers_dir, "#{helper}.rb") )} # using load here allows specs to work
|
33
|
+
end
|
34
|
+
|
36
35
|
end
|
37
36
|
|
38
37
|
end
|
39
38
|
|
40
|
-
Merb::
|
41
|
-
Merb::Helpers.load
|
42
|
-
end
|
39
|
+
Merb::Helpers.load
|
metadata
CHANGED
@@ -1,28 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb_helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yehuda Katz
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-08-03 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: merb-core
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
20
21
|
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.9.
|
23
|
+
version: 0.9.4
|
23
24
|
version:
|
24
25
|
description: Helper support for merb (similar to the Rails form helpers)
|
25
|
-
email:
|
26
|
+
email: ykatz@engineyard.com
|
26
27
|
executables: []
|
27
28
|
|
28
29
|
extensions: []
|
@@ -37,6 +38,7 @@ files:
|
|
37
38
|
- Rakefile
|
38
39
|
- TODO
|
39
40
|
- lib/merb_helpers
|
41
|
+
- lib/merb_helpers/core_ext.rb
|
40
42
|
- lib/merb_helpers/date_time_helpers.rb
|
41
43
|
- lib/merb_helpers/form_helpers.rb
|
42
44
|
- lib/merb_helpers/ordinalize.rb
|
@@ -44,7 +46,7 @@ files:
|
|
44
46
|
- lib/merb_helpers/time_dsl.rb
|
45
47
|
- lib/merb_helpers.rb
|
46
48
|
has_rdoc: true
|
47
|
-
homepage: http://
|
49
|
+
homepage: http://merbivore.com
|
48
50
|
post_install_message:
|
49
51
|
rdoc_options: []
|
50
52
|
|
@@ -64,8 +66,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
66
|
version:
|
65
67
|
requirements: []
|
66
68
|
|
67
|
-
rubyforge_project:
|
68
|
-
rubygems_version: 1.0
|
69
|
+
rubyforge_project: merb
|
70
|
+
rubygems_version: 1.2.0
|
69
71
|
signing_key:
|
70
72
|
specification_version: 2
|
71
73
|
summary: Helper support for merb (similar to the Rails form helpers)
|