merb_helpers 0.9.2 → 0.9.3
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/README +1 -24
- data/Rakefile +2 -2
- data/lib/merb_helpers/date_time_helpers.rb +32 -66
- data/lib/merb_helpers/form_helpers.rb +20 -9
- data/lib/merb_helpers/ordinalize.rb +23 -0
- data/lib/merb_helpers/time_dsl.rb +58 -0
- data/lib/merb_helpers.rb +9 -2
- metadata +5 -4
- data/lib/merb_helpers/form_model.rb +0 -5
data/README
CHANGED
@@ -13,27 +13,4 @@ dependency "merb_helpers"
|
|
13
13
|
|
14
14
|
#...
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
You can selectively include/exclude modules from this list to keep you app lean if you like.
|
19
|
-
The inclusions/exclusions are relative to all modules.
|
20
|
-
|
21
|
-
\:include: will only include the specified modules.
|
22
|
-
|
23
|
-
\:exclude: will include all except the specified modules.
|
24
|
-
|
25
|
-
Do not use :include: and :exclude: options at the same time or an error will be raised.
|
26
|
-
|
27
|
-
To set this up in config/plugins.yml
|
28
|
-
|
29
|
-
To Include specified helpers
|
30
|
-
|
31
|
-
\:merb_helpers:
|
32
|
-
\:include: - date_time_helpers
|
33
|
-
- form_helpers
|
34
|
-
|
35
|
-
To Exclude specified helpers
|
36
|
-
|
37
|
-
\:merb_helpers:
|
38
|
-
\:exclude: - date_time_helpers
|
39
|
-
- form_helpers
|
16
|
+
# TODO: describe date_time_helpers, form_helpers, tag_helpers
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'spec/rake/spectask'
|
|
5
5
|
|
6
6
|
PLUGIN = "merb_helpers"
|
7
7
|
NAME = "merb_helpers"
|
8
|
-
VERSION = "0.9.
|
8
|
+
VERSION = "0.9.3"
|
9
9
|
AUTHOR = "Yehuda Katz"
|
10
10
|
EMAIL = "wycats@gmail.com"
|
11
11
|
HOMEPAGE = "http://merb.rubyforge.org/"
|
@@ -26,7 +26,7 @@ spec = Gem::Specification.new do |s|
|
|
26
26
|
s.author = AUTHOR
|
27
27
|
s.email = EMAIL
|
28
28
|
s.homepage = HOMEPAGE
|
29
|
-
s.add_dependency("merb-core", ">=0.9.
|
29
|
+
s.add_dependency("merb-core", ">=0.9.3")
|
30
30
|
s.require_path = 'lib'
|
31
31
|
s.autorequire = PLUGIN
|
32
32
|
s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,specs}/**/*")
|
@@ -1,68 +1,22 @@
|
|
1
|
-
module TimeDSL
|
2
|
-
{:second => 1,
|
3
|
-
:minute => 60,
|
4
|
-
:hour => 3600,
|
5
|
-
:day => [24,:hours],
|
6
|
-
:week => [7,:days],
|
7
|
-
:month => [30,:days],
|
8
|
-
:year => [364.25, :days]}.each do |meth, amount|
|
9
|
-
define_method meth do
|
10
|
-
amount = amount.is_a?(Array) ? amount[0].send(amount[1]) : amount
|
11
|
-
self * amount
|
12
|
-
end
|
13
|
-
alias_method "#{meth}s".intern, meth
|
14
|
-
end
|
15
|
-
|
16
|
-
# Reads best without arguments: 10.minutes.ago
|
17
|
-
def ago(time = ::Time.now)
|
18
|
-
time - self
|
19
|
-
end
|
20
|
-
alias :until :ago
|
21
|
-
|
22
|
-
# Reads best with argument: 10.minutes.since(time)
|
23
|
-
def since(time = ::Time.now)
|
24
|
-
time + self
|
25
|
-
end
|
26
|
-
alias :from_now :since
|
27
|
-
end
|
28
1
|
|
29
|
-
class Integer
|
30
|
-
# Ordinalize turns a number into an ordinal string used to denote the
|
31
|
-
# position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
|
32
|
-
#
|
33
|
-
# Examples
|
34
|
-
# 1.ordinalize # => "1st"
|
35
|
-
# 2.ordinalize # => "2nd"
|
36
|
-
# 1002.ordinalize # => "1002nd"
|
37
|
-
# 1003.ordinalize # => "1003rd"
|
38
|
-
def ordinalize
|
39
|
-
if (11..13).include?(self % 100)
|
40
|
-
"#{self}th"
|
41
|
-
else
|
42
|
-
case self % 10
|
43
|
-
when 1; "#{self}st"
|
44
|
-
when 2; "#{self}nd"
|
45
|
-
when 3; "#{self}rd"
|
46
|
-
else "#{self}th"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
Numeric.send :include, TimeDSL
|
53
2
|
# Everything above here has pretty much been implemented in the assistance gem...
|
54
3
|
|
55
4
|
# Time.now.to_ordinalized_s :long
|
56
5
|
# => "February 28th, 2006 21:10"
|
57
6
|
module OrdinalizedFormatting
|
7
|
+
|
8
|
+
def self.extended(obj)
|
9
|
+
include Merb::Helpers::DateAndTime
|
10
|
+
end
|
11
|
+
|
58
12
|
def to_ordinalized_s(format = :default)
|
59
|
-
format = Merb::Helpers::DateAndTime
|
60
|
-
return
|
13
|
+
format = Merb::Helpers::DateAndTime.date_formats[format]
|
14
|
+
return self.to_s if format.nil?
|
61
15
|
strftime_ordinalized(format)
|
62
16
|
end
|
63
17
|
|
64
18
|
def strftime_ordinalized(fmt)
|
65
|
-
strftime(fmt.gsub(
|
19
|
+
strftime(fmt.gsub(/(^|[^-])%d/, '\1_%d_')).gsub(/_(\d+)_/) { |s| s.to_i.ordinalize }
|
66
20
|
end
|
67
21
|
end
|
68
22
|
|
@@ -103,15 +57,15 @@ module Merb
|
|
103
57
|
# The key methods are `relative_date`, `relative_date_span`, and `relative_time_span`. This also gives
|
104
58
|
# you the Rails style Time DSL for working with numbers eg. 3.months.ago or 5.days.until(1.year.from_now)
|
105
59
|
module DateAndTime
|
106
|
-
|
107
|
-
|
60
|
+
@@time_class = Time
|
61
|
+
@@time_output = {
|
108
62
|
:today => 'today',
|
109
63
|
:yesterday => 'yesterday',
|
110
64
|
:tomorrow => 'tomorrow',
|
111
65
|
:initial_format => '%b %d',
|
112
66
|
:year_format => ', %Y'
|
113
67
|
}
|
114
|
-
|
68
|
+
@@date_formats = {
|
115
69
|
:db => "%Y-%m-%d %H:%M:%S",
|
116
70
|
:time => "%H:%M",
|
117
71
|
:short => "%d %b %H:%M",
|
@@ -120,6 +74,18 @@ module Merb
|
|
120
74
|
:rfc822 => "%a, %d %b %Y %H:%M:%S %z"
|
121
75
|
}
|
122
76
|
|
77
|
+
def self.time_class
|
78
|
+
@@time_class
|
79
|
+
end
|
80
|
+
|
81
|
+
def time_output
|
82
|
+
@@time_output
|
83
|
+
end
|
84
|
+
|
85
|
+
def date_formats
|
86
|
+
@@date_formats
|
87
|
+
end
|
88
|
+
|
123
89
|
# Gives you a relative date in an attractive format
|
124
90
|
#
|
125
91
|
# ==== Parameters
|
@@ -134,16 +100,16 @@ module Merb
|
|
134
100
|
# relative_date(1.year.ago) => "March 10th, 2007"
|
135
101
|
def relative_date(time)
|
136
102
|
date = time.to_date
|
137
|
-
today =
|
103
|
+
today = DateAndTime.time_class.now.to_date
|
138
104
|
if date == today
|
139
|
-
|
105
|
+
DateAndTime.time_output[:today]
|
140
106
|
elsif date == (today - 1)
|
141
|
-
|
107
|
+
DateAndTime.time_output[:yesterday]
|
142
108
|
elsif date == (today + 1)
|
143
|
-
|
109
|
+
DateAndTime.time_output[:tomorrow]
|
144
110
|
else
|
145
|
-
fmt =
|
146
|
-
fmt <<
|
111
|
+
fmt = DateAndTime.time_output[:initial_format].dup
|
112
|
+
fmt << DateAndTime.time_output[:year_format] unless date.year == today.year
|
147
113
|
time.strftime_ordinalized(fmt)
|
148
114
|
end
|
149
115
|
end
|
@@ -167,7 +133,7 @@ module Merb
|
|
167
133
|
if times.first == times.last
|
168
134
|
relative_date(times.first)
|
169
135
|
else
|
170
|
-
first = times.first; last = times.last; now =
|
136
|
+
first = times.first; last = times.last; now = DateAndTime.time_class.now
|
171
137
|
arr = [first.strftime_ordinalized('%b %d')]
|
172
138
|
arr << ", #{first.year}" unless first.year == last.year
|
173
139
|
arr << ' - '
|
@@ -201,7 +167,7 @@ module Merb
|
|
201
167
|
"#{prettier_time(times.first, !same_half)} - #{prettier_time(times.last)} #{relative_date(times.first)}"
|
202
168
|
|
203
169
|
else
|
204
|
-
first = times.first; last = times.last; now =
|
170
|
+
first = times.first; last = times.last; now = DateAndTime.time_class.now
|
205
171
|
arr = [prettier_time(first)]
|
206
172
|
arr << ' '
|
207
173
|
arr << first.strftime_ordinalized('%b %d')
|
@@ -273,4 +239,4 @@ end
|
|
273
239
|
|
274
240
|
class Merb::Controller #:nodoc:
|
275
241
|
include Merb::Helpers::DateAndTime
|
276
|
-
end
|
242
|
+
end
|
@@ -54,25 +54,34 @@ module Merb #:nodoc:
|
|
54
54
|
# <%= error_messages_for :person, lambda{|error| "<li class='aieeee'>#{error.join(' ')}"} %>
|
55
55
|
# <%= error_messages_for :person, nil, 'bad_mojo' %>
|
56
56
|
def error_messages_for(obj, build_li = nil, html_class='error')
|
57
|
+
obj = self.instance_variable_get("@#{obj}") if obj.kind_of?(Symbol)
|
58
|
+
|
57
59
|
return "" unless obj.respond_to?(:errors) && ! obj.errors.empty?
|
60
|
+
|
61
|
+
if obj.errors.respond_to?(:each) # AR & DM
|
62
|
+
build_li ||= lambda{|err| "<li>#{err.join(' ')}</li>"}
|
63
|
+
error_collection = obj.errors
|
64
|
+
else # Sequel
|
65
|
+
build_li ||= lambda{|msg| "<li>#{msg}</li>"}
|
66
|
+
error_collection = obj.errors.full_messages
|
67
|
+
end
|
68
|
+
error_count = error_collection.size
|
58
69
|
|
59
70
|
header_message = if block_given?
|
60
71
|
yield(obj.errors)
|
61
72
|
else
|
62
|
-
error_plurality = (
|
63
|
-
"<h2>Form submittal failed because of #{
|
73
|
+
error_plurality = (error_count == 1 ? 'problem' : 'problems')
|
74
|
+
"<h2>Form submittal failed because of #{error_count} #{error_plurality}</h2>"
|
64
75
|
end
|
65
76
|
|
66
|
-
build_li ||= lambda{|err| "<li>#{err.join(' ')}</li>"}
|
67
|
-
|
68
77
|
markup = %Q{
|
69
78
|
<div class='#{html_class}'>
|
70
79
|
#{header_message}
|
71
80
|
<ul>
|
72
81
|
}
|
73
82
|
|
74
|
-
|
75
|
-
|
83
|
+
error_collection.each {|error, message| markup << build_li.call([error, message])}
|
84
|
+
|
76
85
|
markup << %Q{
|
77
86
|
</ul>
|
78
87
|
</div>
|
@@ -232,9 +241,11 @@ module Merb #:nodoc:
|
|
232
241
|
# <%= checkbox_control :is_activated, :label => "Activated?" %>
|
233
242
|
def checkbox_control(col, attrs = {}, hidden_attrs={})
|
234
243
|
errorify_field(attrs, col)
|
235
|
-
|
244
|
+
method_name = @_obj.respond_to?(col) ? col : :"#{col}?"
|
245
|
+
attrs.merge!(:checked => "checked") if col_val_to_bool(@_obj.send(method_name))
|
236
246
|
attrs.merge!(:id => control_id(col))
|
237
|
-
|
247
|
+
attrs = {:name => control_name(col), :value => control_value(method_name)}.merge(attrs)
|
248
|
+
checkbox_field(attrs, hidden_attrs)
|
238
249
|
end
|
239
250
|
|
240
251
|
# Provides a generic HTML checkbox input tag.
|
@@ -440,7 +451,7 @@ module Merb #:nodoc:
|
|
440
451
|
end
|
441
452
|
else
|
442
453
|
collection.each do |value,text|
|
443
|
-
options = selected.
|
454
|
+
options = Array(selected).include?(value) ? {:selected => 'selected'} : {}
|
444
455
|
ret << tag( 'option', text, {:value => value}.merge(options) )
|
445
456
|
end
|
446
457
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ordinalize
|
2
|
+
# Ordinalize turns a number into an ordinal string used to denote the
|
3
|
+
# position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
|
4
|
+
#
|
5
|
+
# Examples
|
6
|
+
# 1.ordinalize # => "1st"
|
7
|
+
# 2.ordinalize # => "2nd"
|
8
|
+
# 1002.ordinalize # => "1002nd"
|
9
|
+
# 1003.ordinalize # => "1003rd"
|
10
|
+
def ordinalize
|
11
|
+
if (11..13).include?(self % 100)
|
12
|
+
"#{self}th"
|
13
|
+
else
|
14
|
+
case self % 10
|
15
|
+
when 1; "#{self}st"
|
16
|
+
when 2; "#{self}nd"
|
17
|
+
when 3; "#{self}rd"
|
18
|
+
else "#{self}th"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
Integer.send :include, Ordinalize
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# Provides a a simple way of calling time units and to see the elapsed time between 2 moments
|
2
|
+
# ==== Examples
|
3
|
+
# 142.minutes => returns a value in seconds
|
4
|
+
# 7.days => returns a value in seconds
|
5
|
+
# 1.week => returns a value in seconds
|
6
|
+
# 2.weeks.ago => returns a date
|
7
|
+
# 1.year.since(time) => returns a date
|
8
|
+
# 5.months.since(2.weeks.from_now) => returns a date
|
9
|
+
module TimeDSL
|
10
|
+
|
11
|
+
def second
|
12
|
+
self * 1
|
13
|
+
end
|
14
|
+
alias_method :seconds, :second
|
15
|
+
|
16
|
+
def minute
|
17
|
+
self * 60
|
18
|
+
end
|
19
|
+
alias_method :minutes, :minute
|
20
|
+
|
21
|
+
def hour
|
22
|
+
self * 3600
|
23
|
+
end
|
24
|
+
alias_method :hours, :hour
|
25
|
+
|
26
|
+
def day
|
27
|
+
self * 86400
|
28
|
+
end
|
29
|
+
alias_method :days, :day
|
30
|
+
|
31
|
+
def week
|
32
|
+
self * 604800
|
33
|
+
end
|
34
|
+
alias_method :weeks, :week
|
35
|
+
|
36
|
+
def month
|
37
|
+
self * 2592000
|
38
|
+
end
|
39
|
+
alias_method :months, :month
|
40
|
+
|
41
|
+
def year
|
42
|
+
self * 31471200
|
43
|
+
end
|
44
|
+
alias_method :years, :year
|
45
|
+
|
46
|
+
# Reads best without arguments: 10.minutes.ago
|
47
|
+
def ago(time = ::Time.now)
|
48
|
+
time - self
|
49
|
+
end
|
50
|
+
alias :until :ago
|
51
|
+
|
52
|
+
# Reads best with argument: 10.minutes.since(time)
|
53
|
+
def since(time = ::Time.now)
|
54
|
+
time + self
|
55
|
+
end
|
56
|
+
alias :from_now :since
|
57
|
+
end
|
58
|
+
Numeric.send :include, TimeDSL
|
data/lib/merb_helpers.rb
CHANGED
@@ -9,6 +9,13 @@ module Merb
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.load
|
12
|
+
require HELPERS_DIR + '/time_dsl'
|
13
|
+
require HELPERS_DIR + '/ordinalize'
|
14
|
+
# TODO remove with and without and only allow 2 options:
|
15
|
+
# config[:load]
|
16
|
+
# if defined then load the modules passed along
|
17
|
+
# otherwise load everything
|
18
|
+
|
12
19
|
if Merb::Plugins.config[:merb_helpers]
|
13
20
|
config = Merb::Plugins.config[:merb_helpers]
|
14
21
|
raise "With and Without options cannot be used with merb_helpers plugin configuration" if config[:with] && config[:without]
|
@@ -31,5 +38,5 @@ module Merb
|
|
31
38
|
end
|
32
39
|
|
33
40
|
Merb::BootLoader.before_app_loads do
|
34
|
-
Merb::Helpers.load
|
35
|
-
end
|
41
|
+
Merb::Helpers.load
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yehuda Katz
|
@@ -9,7 +9,7 @@ autorequire: merb_helpers
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-05-04 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.9.
|
22
|
+
version: 0.9.3
|
23
23
|
version:
|
24
24
|
description: Helper support for merb (similar to the Rails form helpers)
|
25
25
|
email: wycats@gmail.com
|
@@ -39,8 +39,9 @@ files:
|
|
39
39
|
- lib/merb_helpers
|
40
40
|
- lib/merb_helpers/date_time_helpers.rb
|
41
41
|
- lib/merb_helpers/form_helpers.rb
|
42
|
-
- lib/merb_helpers/
|
42
|
+
- lib/merb_helpers/ordinalize.rb
|
43
43
|
- lib/merb_helpers/tag_helpers.rb
|
44
|
+
- lib/merb_helpers/time_dsl.rb
|
44
45
|
- lib/merb_helpers.rb
|
45
46
|
has_rdoc: true
|
46
47
|
homepage: http://merb.rubyforge.org/
|