kelredd-useful 0.1.1 → 0.1.2

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.
@@ -0,0 +1,18 @@
1
+ module Useful
2
+ module RubyExtensions
3
+ module Date
4
+
5
+ def week_days_until(end_date)
6
+ week_days = (1..5)
7
+ raise ::ArgumentError, "End date cannot be nil." if end_date.nil?
8
+ raise ::ArgumentError, "End date cannot come before questioned date." if end_date < self
9
+ (self..end_date).to_a.select{|date| week_days.include?(date.wday)}.length
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+
16
+ class Date
17
+ include Useful::RubyExtensions::Date
18
+ end
@@ -0,0 +1,19 @@
1
+ module Useful
2
+ module RubyExtensions
3
+ module FalseClass
4
+
5
+ def to_affirmative
6
+ "No"
7
+ end
8
+
9
+ def to_i
10
+ 0
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+
17
+ class FalseClass
18
+ include Useful::RubyExtensions::FalseClass
19
+ end
@@ -20,7 +20,7 @@ module Useful
20
20
  end
21
21
  value
22
22
  end
23
-
23
+
24
24
  end
25
25
  end
26
26
  end
@@ -1,5 +1,3 @@
1
- require 'cgi'
2
-
3
1
  module Useful
4
2
  module RubyExtensions
5
3
  module Hash
@@ -11,18 +9,6 @@ module Useful
11
9
 
12
10
  module ClassMethods
13
11
 
14
- # inspired by ActiveSupport::CoreExtensions::Hash::Keys (http://api.rubyonrails.org/)
15
- def stringify_keys(hash)
16
- hash.keys.each{ |key| hash[(key.to_s rescue key)] ||= hash.delete(key) }
17
- hash
18
- end
19
-
20
- # inspired by from ActiveSupport::CoreExtensions::Hash::Keys (http://api.rubyonrails.org/)
21
- def symbolize_keys(hash)
22
- hash.keys.each{ |key| hash[(key.to_sym rescue key)] ||= hash.delete(key) }
23
- hash
24
- end
25
-
26
12
  def only(hash, *keys)
27
13
  hash.delete_if{ |k,v| !keys.flatten.include?(k) }
28
14
  hash
@@ -35,24 +21,6 @@ module Useful
35
21
 
36
22
  end
37
23
 
38
- # Return a new hash with all keys converted to strings.
39
- def stringify_keys
40
- self.class.stringify_keys(self.clone)
41
- end
42
- # Destructively convert all keys to strings.
43
- def stringify_keys!
44
- self.class.stringify_keys(self)
45
- end
46
-
47
- # Return a new hash with all keys converted to strings.
48
- def symbolize_keys
49
- self.class.symbolize_keys(self.clone)
50
- end
51
- # Destructively convert all keys to strings.
52
- def symbolize_keys!
53
- self.class.symbolize_keys(self)
54
- end
55
-
56
24
  # Return a new hash with only keys in *keys
57
25
  def only(*keys)
58
26
  self.class.only(self.clone, keys)
@@ -87,11 +55,12 @@ module Useful
87
55
 
88
56
  # Returns string formatted for HTTP URL encoded name-value pairs.
89
57
  # For example,
90
- # {:id => 'thomas_hardy'}.to_http_str
91
- # # => "id=thomas_hardy"
92
- # {:id => 23423, :since => Time.now}.to_http_str
93
- # # => "since=Thu,%2021%20Jun%202007%2012:10:05%20-0500&id=23423"
58
+ # {:id => 'thomas_hardy'}.to_http_query_str
59
+ # # => "?id=thomas_hardy"
60
+ # {:id => 23423, :since => Time.now}.to_http_query_str
61
+ # # => "?since=Thu,%2021%20Jun%202007%2012:10:05%20-0500&id=23423"
94
62
  def to_http_query_str(opts = {})
63
+ require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
95
64
  opts[:prepend] ||= '?'
96
65
  opts[:append] ||= ''
97
66
  self.empty? ? '' : "#{opts[:prepend]}#{self.collect{|key, val| "#{key.to_s}=#{CGI.escape(val.to_s)}"}.join('&')}#{opts[:append]}"
@@ -1,10 +1,10 @@
1
- require File.join(File.dirname(__FILE__), 'object')
2
- require File.join(File.dirname(__FILE__), 'string')
3
- require File.join(File.dirname(__FILE__), 'hash')
1
+ require File.join(File.dirname(__FILE__), '..', 'ruby_extensions_from_rails', 'object') unless Object.new.respond_to?(:blank?)
2
+ require File.join(File.dirname(__FILE__), '..', 'ruby_extensions_from_rails', 'hash') unless Hash.new.respond_to?(:symbolize_keys!)
3
+ require File.join(File.dirname(__FILE__), '..', 'ruby_extensions_from_rails', 'string') unless String.new.respond_to?(:starts_with?)
4
4
 
5
5
  module Useful
6
6
  module RubyExtensions
7
- module Numeric #:nodoc:
7
+ module Numeric
8
8
 
9
9
  LOCALES = {
10
10
  :en => {
@@ -144,6 +144,7 @@ module Useful
144
144
  # 1234567890.50.to_currency(:unit => "&pound;", :separator => ",", :delimiter => "", :format => "%n %u")
145
145
  # # => 1234567890,50 &pound;
146
146
  def to_currency(opts = {})
147
+ return opts[:zero_display] if opts[:zero_display] && self == 0
147
148
  opts.symbolize_keys!
148
149
  opts[:locale] ||= :en
149
150
  locale = LOCALES[opts.delete(:locale)]
@@ -10,10 +10,6 @@ module Useful
10
10
  self == true
11
11
  end
12
12
 
13
- def blank?
14
- self.nil? || self.empty? rescue false
15
- end
16
-
17
13
  end
18
14
  end
19
15
  end
@@ -30,10 +30,6 @@ module Useful
30
30
  !self.match(pattern).nil?
31
31
  end
32
32
 
33
- def starts_with?(string)
34
- self.match?(Regexp.new("\\A#{string}"))
35
- end
36
-
37
33
  def show_regexp(re)
38
34
  if self =~ re
39
35
  "#{$`}<<#{$&}>>#{$'}"
@@ -0,0 +1,19 @@
1
+ module Useful
2
+ module RubyExtensions
3
+ module TrueClass
4
+
5
+ def to_affirmative
6
+ "Yes"
7
+ end
8
+
9
+ def to_i
10
+ 1
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+
17
+ class TrueClass
18
+ include Useful::RubyExtensions::TrueClass
19
+ end
@@ -1,7 +1,3 @@
1
- $:.unshift File.dirname(__FILE__)
2
- require 'ruby_extensions/array'
3
- require 'ruby_extensions/hash'
4
- require 'ruby_extensions/string'
5
- require 'ruby_extensions/fixnum'
6
- require 'ruby_extensions/numeric'
7
- require 'ruby_extensions/object'
1
+ Dir[File.join(File.dirname(__FILE__), "ruby_extensions" ,"*.rb")].each do |file|
2
+ require file
3
+ end
@@ -0,0 +1,244 @@
1
+ require File.join(File.dirname(__FILE__), 'object') unless Object.new.respond_to?(:acts_like?)
2
+ require File.join(File.dirname(__FILE__), 'duration')
3
+
4
+ module Useful
5
+ module RubyExtensionsFromRails
6
+ module Date
7
+
8
+ DATE_FORMATS = {
9
+ :short => "%e %b",
10
+ :long => "%B %e, %Y",
11
+ :db => "%Y-%m-%d",
12
+ :number => "%Y%m%d",
13
+ :long_ordinal => lambda { |date| date.strftime("%B #{date.day.ordinalize}, %Y") }, # => "April 25th, 2007"
14
+ :rfc822 => "%e %b %Y"
15
+ }
16
+
17
+ module ClassMethods; end
18
+ def self.included(klass)
19
+ klass.extend(ClassMethods) if klass.kind_of?(Class)
20
+
21
+ klass.instance_eval do
22
+ alias_method :to_default_s, :to_s
23
+ alias_method :to_s, :to_formatted_s
24
+ alias_method :default_inspect, :inspect
25
+ alias_method :inspect, :readable_inspect
26
+
27
+ # Ruby 1.9 has Date#to_time which converts to localtime only.
28
+ remove_method :to_time if klass.instance_methods.include?(:to_time)
29
+
30
+ # Ruby 1.9 has Date#xmlschema which converts to a string without the time component.
31
+ remove_method :xmlschema if klass.instance_methods.include?(:xmlschema)
32
+ end
33
+ end
34
+
35
+ module ClassMethods
36
+
37
+ # Returns a new Date representing the date 1 day ago (i.e. yesterday's date).
38
+ def yesterday
39
+ ::Date.today.yesterday
40
+ end
41
+
42
+ # Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).
43
+ def tomorrow
44
+ ::Date.today.tomorrow
45
+ end
46
+
47
+ # Returns Date.today.
48
+ def current
49
+ ::Date.today
50
+ end
51
+
52
+ end
53
+
54
+ # Enable more predictable duck-typing on Date-like classes. See
55
+ # Object#acts_like?.
56
+ def acts_like_date?
57
+ true
58
+ end
59
+
60
+ # Tells whether the Date object's date lies in the past
61
+ def past?
62
+ self < ::Date.current
63
+ end
64
+
65
+ # Tells whether the Date object's date is today
66
+ def today?
67
+ self.to_date == ::Date.current # we need the to_date because of DateTime
68
+ end
69
+
70
+ # Tells whether the Date object's date lies in the future
71
+ def future?
72
+ self > ::Date.current
73
+ end
74
+
75
+ # Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
76
+ # any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
77
+ def advance(options)
78
+ d = self
79
+ d = d >> options.delete(:years) * 12 if options[:years]
80
+ d = d >> options.delete(:months) if options[:months]
81
+ d = d + options.delete(:weeks) * 7 if options[:weeks]
82
+ d = d + options.delete(:days) if options[:days]
83
+ d
84
+ end
85
+
86
+ # Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
87
+ #
88
+ # Examples:
89
+ #
90
+ # Date.new(2007, 5, 12).change(:day => 1) # => Date.new(2007, 5, 1)
91
+ # Date.new(2007, 5, 12).change(:year => 2005, :month => 1) # => Date.new(2005, 1, 12)
92
+ def change(options)
93
+ ::Date.new(
94
+ options[:year] || self.year,
95
+ options[:month] || self.month,
96
+ options[:day] || self.day
97
+ )
98
+ end
99
+
100
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
101
+ def beginning_of_day
102
+ to_time
103
+ end
104
+ alias :midnight :beginning_of_day
105
+ alias :at_midnight :beginning_of_day
106
+ alias :at_beginning_of_day :beginning_of_day
107
+
108
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
109
+ def end_of_day
110
+ to_time.end_of_day
111
+ end
112
+ alias :at_end_of_day :end_of_day
113
+
114
+ # Returns a new Date representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00)
115
+ def beginning_of_week
116
+ days_to_monday = self.wday!=0 ? self.wday-1 : 6
117
+ self - days_to_monday
118
+ end
119
+ alias :monday :beginning_of_week
120
+ alias :at_beginning_of_week :beginning_of_week
121
+
122
+ # Returns a new Date representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59)
123
+ def end_of_week
124
+ days_to_sunday = self.wday!=0 ? 7-self.wday : 0
125
+ self + days_to_sunday.days
126
+ end
127
+ alias :at_end_of_week :end_of_week
128
+
129
+ # Returns a new Date representing the start of the given day in next week (default is Monday).
130
+ def next_week(day = :monday)
131
+ days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
132
+ (self + 7).beginning_of_week + days_into_week[day]
133
+ end
134
+
135
+ # Returns a new Date representing the start of the month (1st of the month)
136
+ def beginning_of_month
137
+ change(:day => 1)
138
+ end
139
+ alias :at_beginning_of_month :beginning_of_month
140
+
141
+ # Returns a new Date representing the end of the month (last day of the month)
142
+ def end_of_month
143
+ change(:day => ::Time.days_in_month( self.month, self.year ))
144
+ end
145
+ alias :at_end_of_month :end_of_month
146
+
147
+ # Returns a new Date/DateTime representing the start of the quarter (1st of january, april, july, october; DateTime objects will have time set to 0:00)
148
+ def beginning_of_quarter
149
+ beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
150
+ end
151
+ alias :at_beginning_of_quarter :beginning_of_quarter
152
+
153
+ # Returns a new Date/DateTime representing the end of the quarter (last day of march, june, september, december; DateTime objects will have time set to 23:59:59)
154
+ def end_of_quarter
155
+ beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
156
+ end
157
+ alias :at_end_of_quarter :end_of_quarter
158
+
159
+ # Returns a new Date/DateTime representing the start of the year (1st of january; DateTime objects will have time set to 0:00)
160
+ def beginning_of_year
161
+ change(:month => 1, :day => 1)
162
+ end
163
+ alias :at_beginning_of_year :beginning_of_year
164
+
165
+ # Returns a new Time representing the end of the year (31st of december; DateTime objects will have time set to 23:59:59)
166
+ def end_of_year
167
+ change(:month => 12, :day => 31)
168
+ end
169
+ alias :at_end_of_year :end_of_year
170
+
171
+ # Convenience method which returns a new Date/DateTime representing the time 1 day ago
172
+ def yesterday
173
+ self - 1
174
+ end
175
+
176
+ # Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time
177
+ def tomorrow
178
+ self + 1
179
+ end
180
+
181
+ # Convert to a formatted string. See DATE_FORMATS for predefined formats.
182
+ #
183
+ # This method is aliased to <tt>to_s</tt>.
184
+ #
185
+ # ==== Examples
186
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
187
+ #
188
+ # date.to_formatted_s(:db) # => "2007-11-10"
189
+ # date.to_s(:db) # => "2007-11-10"
190
+ #
191
+ # date.to_formatted_s(:short) # => "10 Nov"
192
+ # date.to_formatted_s(:long) # => "November 10, 2007"
193
+ # date.to_formatted_s(:long_ordinal) # => "November 10th, 2007"
194
+ # date.to_formatted_s(:rfc822) # => "10 Nov 2007"
195
+ #
196
+ # == Adding your own time formats to to_formatted_s
197
+ # You can add your own formats to the Date::DATE_FORMATS hash.
198
+ # Use the format name as the hash key and either a strftime string
199
+ # or Proc instance that takes a date argument as the value.
200
+ #
201
+ # # config/initializers/time_formats.rb
202
+ # Date::DATE_FORMATS[:month_and_year] = "%B %Y"
203
+ # Date::DATE_FORMATS[:short_ordinal] = lambda { |date| date.strftime("%B #{date.day.ordinalize}") }
204
+ def to_formatted_s(format = :default)
205
+ if formatter = DATE_FORMATS[format]
206
+ if formatter.respond_to?(:call)
207
+ formatter.call(self).to_s
208
+ else
209
+ strftime(formatter)
210
+ end
211
+ else
212
+ to_default_s
213
+ end
214
+ end
215
+
216
+ # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005"
217
+ def readable_inspect
218
+ strftime("%a, %d %b %Y")
219
+ end
220
+
221
+ # Converts a Date instance to a Time, where the time is set to the beginning of the day.
222
+ # The timezone can be either :local or :utc (default :local).
223
+ #
224
+ # ==== Examples
225
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
226
+ #
227
+ # date.to_time # => Sat Nov 10 00:00:00 0800 2007
228
+ # date.to_time(:local) # => Sat Nov 10 00:00:00 0800 2007
229
+ #
230
+ # date.to_time(:utc) # => Sat Nov 10 00:00:00 UTC 2007
231
+ def to_time(form = :local)
232
+ ::Time.send("#{form}_time", year, month, day)
233
+ end
234
+
235
+ def xmlschema
236
+ to_time.xmlschema
237
+ end
238
+ end
239
+ end
240
+ end
241
+
242
+ class Date
243
+ include Useful::RubyExtensionsFromRails::Date
244
+ end
@@ -0,0 +1,99 @@
1
+ module Useful
2
+ module RubyExtensionsFromRails
3
+ # Provides accurate date and time measurements using Date#advance and
4
+ # Time#advance, respectively. It mainly supports the methods on Numeric,
5
+ # such as in this example:
6
+ #
7
+ # 1.month.ago # equivalent to Time.now.advance(:months => -1)
8
+ class Duration
9
+ attr_accessor :value, :parts
10
+
11
+ def initialize(value, parts) #:nodoc:
12
+ @value, @parts = value, parts
13
+ end
14
+
15
+ # Adds another Duration or a Numeric to this Duration. Numeric values
16
+ # are treated as seconds.
17
+ def +(other)
18
+ if Duration === other
19
+ Duration.new(value + other.value, @parts + other.parts)
20
+ else
21
+ Duration.new(value + other, @parts + [[:seconds, other]])
22
+ end
23
+ end
24
+
25
+ # Subtracts another Duration or a Numeric from this Duration. Numeric
26
+ # values are treated as seconds.
27
+ def -(other)
28
+ self + (-other)
29
+ end
30
+
31
+ def -@ #:nodoc:
32
+ Duration.new(-value, parts.map { |type,number| [type, -number] })
33
+ end
34
+
35
+ def is_a?(klass) #:nodoc:
36
+ klass == Duration || super
37
+ end
38
+
39
+ # Returns true if <tt>other</tt> is also a Duration instance with the
40
+ # same <tt>value</tt>, or if <tt>other == value</tt>.
41
+ def ==(other)
42
+ if Duration === other
43
+ other.value == value
44
+ else
45
+ other == value
46
+ end
47
+ end
48
+
49
+ def self.===(other) #:nodoc:
50
+ other.is_a?(Duration) rescue super
51
+ end
52
+
53
+ # Calculates a new Time or Date that is as far in the future
54
+ # as this Duration represents.
55
+ def since(time = ::Time.current)
56
+ sum(1, time)
57
+ end
58
+ alias :from_now :since
59
+
60
+ # Calculates a new Time or Date that is as far in the past
61
+ # as this Duration represents.
62
+ def ago(time = ::Time.current)
63
+ sum(-1, time)
64
+ end
65
+ alias :until :ago
66
+
67
+ def inspect #:nodoc:
68
+ consolidated = parts.inject(::Hash.new(0)) { |h,part| h[part.first] += part.last; h }
69
+ [:years, :months, :days, :minutes, :seconds].map do |length|
70
+ n = consolidated[length]
71
+ "#{n} #{n == 1 ? length.to_s.singularize : length.to_s}" if n.nonzero?
72
+ end.compact.join(',')
73
+ end
74
+
75
+ protected
76
+
77
+ def sum(sign, time = ::Time.current) #:nodoc:
78
+ parts.inject(time) do |t,(type,number)|
79
+ if t.acts_like?(:time) || t.acts_like?(:date)
80
+ if type == :seconds
81
+ t.since(sign * number)
82
+ else
83
+ t.advance(type => sign * number)
84
+ end
85
+ else
86
+ raise ::ArgumentError, "expected a time or date, got #{time.inspect}"
87
+ end
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ def method_missing(method, *args, &block) #:nodoc:
94
+ value.send(method, *args)
95
+ end
96
+
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,32 @@
1
+ module Useful
2
+ module RubyExtensionsFromRails
3
+ module Fixnum
4
+
5
+ # Turns a number into an ordinal string used to denote the position in an
6
+ # ordered sequence such as 1st, 2nd, 3rd, 4th.
7
+ #
8
+ # Examples:
9
+ # 1.ordinalize # => "1st"
10
+ # 2.ordinalize # => "2nd"
11
+ # 1003.ordinalize # => "1003rd"
12
+ # 1004.ordinalize # => "1004th"
13
+ def ordinalize
14
+ if (11..13).include?(self.to_i % 100)
15
+ "#{number}th"
16
+ else
17
+ case self.to_i % 10
18
+ when 1; "#{number}st"
19
+ when 2; "#{number}nd"
20
+ when 3; "#{number}rd"
21
+ else "#{number}th"
22
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+
30
+ class Fixnum
31
+ include Useful::RubyExtensionsFromRails::Fixnum
32
+ end
@@ -0,0 +1,50 @@
1
+ module Useful
2
+ module RubyExtensionsFromRails
3
+ module Hash
4
+
5
+ module ClassMethods; end
6
+ def self.included(klass)
7
+ klass.extend(ClassMethods) if klass.kind_of?(Class)
8
+ end
9
+
10
+ module ClassMethods
11
+
12
+ # inspired by ActiveSupport::CoreExtensions::Hash::Keys (http://api.rubyonrails.org/)
13
+ def stringify_keys(hash)
14
+ hash.keys.each{ |key| hash[(key.to_s rescue key)] ||= hash.delete(key) }
15
+ hash
16
+ end
17
+
18
+ # inspired by from ActiveSupport::CoreExtensions::Hash::Keys (http://api.rubyonrails.org/)
19
+ def symbolize_keys(hash)
20
+ hash.keys.each{ |key| hash[(key.to_sym rescue key)] ||= hash.delete(key) }
21
+ hash
22
+ end
23
+
24
+ end
25
+
26
+ # Return a new hash with all keys converted to strings.
27
+ def stringify_keys
28
+ self.class.stringify_keys(self.clone)
29
+ end
30
+ # Destructively convert all keys to strings.
31
+ def stringify_keys!
32
+ self.class.stringify_keys(self)
33
+ end
34
+
35
+ # Return a new hash with all keys converted to strings.
36
+ def symbolize_keys
37
+ self.class.symbolize_keys(self.clone)
38
+ end
39
+ # Destructively convert all keys to strings.
40
+ def symbolize_keys!
41
+ self.class.symbolize_keys(self)
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+
48
+ class Hash
49
+ include Useful::RubyExtensionsFromRails::Hash
50
+ end
@@ -0,0 +1,60 @@
1
+ require File.join(File.dirname(__FILE__), 'duration')
2
+
3
+ module Useful
4
+ module RubyExtensionsFromRails
5
+ module Numeric
6
+
7
+ def seconds
8
+ Useful::RubyExtensionsFromRails::Duration.new(self, [[:seconds, self]])
9
+ end
10
+ alias :second :seconds
11
+
12
+ def minutes
13
+ Useful::RubyExtensionsFromRails::Duration.new(self * 60, [[:seconds, self * 60]])
14
+ end
15
+ alias :minute :minutes
16
+
17
+ def hours
18
+ Useful::RubyExtensionsFromRails::Duration.new(self * 3600, [[:seconds, self * 3600]])
19
+ end
20
+ alias :hour :hours
21
+
22
+ def days
23
+ Useful::RubyExtensionsFromRails::Duration.new(self * 24.hours, [[:days, self]])
24
+ end
25
+ alias :day :days
26
+
27
+ def weeks
28
+ Useful::RubyExtensionsFromRails::Duration.new(self * 7.days, [[:days, self * 7]])
29
+ end
30
+ alias :week :weeks
31
+
32
+ def fortnights
33
+ Useful::RubyExtensionsFromRails::Duration.new(self * 2.weeks, [[:days, self * 14]])
34
+ end
35
+ alias :fortnight :fortnights
36
+
37
+ # Reads best without arguments: 10.minutes.ago
38
+ def ago(time = ::Time.now)
39
+ time - self
40
+ end
41
+
42
+ # Reads best with argument: 10.minutes.until(time)
43
+ alias :until :ago
44
+
45
+ # Reads best with argument: 10.minutes.since(time)
46
+ def since(time = ::Time.now)
47
+ time + self
48
+ end
49
+
50
+ # Reads best without arguments: 10.minutes.from_now
51
+ alias :from_now :since
52
+
53
+ end
54
+ end
55
+ end
56
+
57
+
58
+ class Numeric
59
+ include Useful::RubyExtensionsFromRails::Numeric
60
+ end
@@ -0,0 +1,79 @@
1
+ module Useful
2
+ module RubyExtensionsFromRails
3
+ module Object
4
+
5
+ def blank?
6
+ self.nil? || (self.respond_to?(:empty?) ? self.empty? : false)
7
+ end
8
+
9
+ # Returns +value+ after yielding +value+ to the block. This simplifies the
10
+ # process of constructing an object, performing work on the object, and then
11
+ # returning the object from a method. It is a Ruby-ized realization of the K
12
+ # combinator, courtesy of Mikael Brockman.
13
+ #
14
+ # ==== Examples
15
+ #
16
+ # # Without returning
17
+ # def foo
18
+ # values = []
19
+ # values << "bar"
20
+ # values << "baz"
21
+ # return values
22
+ # end
23
+ #
24
+ # foo # => ['bar', 'baz']
25
+ #
26
+ # # returning with a local variable
27
+ # def foo
28
+ # returning values = [] do
29
+ # values << 'bar'
30
+ # values << 'baz'
31
+ # end
32
+ # end
33
+ #
34
+ # foo # => ['bar', 'baz']
35
+ #
36
+ # # returning with a block argument
37
+ # def foo
38
+ # returning [] do |values|
39
+ # values << 'bar'
40
+ # values << 'baz'
41
+ # end
42
+ # end
43
+ #
44
+ # foo # => ['bar', 'baz']
45
+ def returning(value)
46
+ yield(value)
47
+ value
48
+ end
49
+
50
+ # Yields <code>x</code> to the block, and then returns <code>x</code>.
51
+ # The primary purpose of this method is to "tap into" a method chain,
52
+ # in order to perform operations on intermediate results within the chain.
53
+ #
54
+ # (1..10).tap { |x| puts "original: #{x.inspect}" }.to_a.
55
+ # tap { |x| puts "array: #{x.inspect}" }.
56
+ # select { |x| x%2 == 0 }.
57
+ # tap { |x| puts "evens: #{x.inspect}" }.
58
+ # map { |x| x*x }.
59
+ # tap { |x| puts "squares: #{x.inspect}" }
60
+ def tap
61
+ yield self
62
+ self
63
+ end unless ::Object.respond_to?(:tap)
64
+
65
+ # A duck-type assistant method. For example, Active Support extends Date
66
+ # to define an acts_like_date? method, and extends Time to define
67
+ # acts_like_time?. As a result, we can do "x.acts_like?(:time)" and
68
+ # "x.acts_like?(:date)" to do duck-type-safe comparisons, since classes that
69
+ # we want to act like Time simply need to define an acts_like_time? method.
70
+ def acts_like?(duck)
71
+ respond_to? "acts_like_#{duck}?"
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ class Object
78
+ include Useful::RubyExtensionsFromRails::Object
79
+ end
@@ -0,0 +1,166 @@
1
+ module Useful
2
+ module RubyExtensionsFromRails
3
+ module String
4
+
5
+ module ClassMethods; end
6
+ def self.included(klass)
7
+ klass.extend(ClassMethods) if klass.kind_of?(Class)
8
+ end
9
+
10
+ module ClassMethods
11
+
12
+ # By default, +camelize+ converts strings to UpperCamelCase. If the argument to +camelize+
13
+ # is set to <tt>:lower</tt> then +camelize+ produces lowerCamelCase.
14
+ #
15
+ # +camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.
16
+ #
17
+ # Examples:
18
+ # "active_record".camelize # => "ActiveRecord"
19
+ # "active_record".camelize(:lower) # => "activeRecord"
20
+ # "active_record/errors".camelize # => "ActiveRecord::Errors"
21
+ # "active_record/errors".camelize(:lower) # => "activeRecord::Errors"
22
+ def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
23
+ if first_letter_in_uppercase
24
+ lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
25
+ else
26
+ lower_case_and_underscored_word.first.downcase + camelize(lower_case_and_underscored_word)[1..-1]
27
+ end
28
+ end
29
+
30
+ # The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
31
+ #
32
+ # Changes '::' to '/' to convert namespaces to paths.
33
+ #
34
+ # Examples:
35
+ # "ActiveRecord".underscore # => "active_record"
36
+ # "ActiveRecord::Errors".underscore # => active_record/errors
37
+ def underscore(camel_cased_word)
38
+ camel_cased_word.to_s.gsub(/::/, '/').
39
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
40
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
41
+ tr("-", "_").
42
+ downcase
43
+ end
44
+
45
+ # Replaces underscores with dashes in the string.
46
+ #
47
+ # Example:
48
+ # "puni_puni" # => "puni-puni"
49
+ def dasherize(underscored_word)
50
+ underscored_word.gsub(/_/, '-')
51
+ end
52
+
53
+ # Removes the module part from the expression in the string.
54
+ #
55
+ # Examples:
56
+ # "ActiveRecord::CoreExtensions::String::Inflections".demodulize # => "Inflections"
57
+ # "Inflections".demodulize # => "Inflections"
58
+ def demodulize(class_name_in_module)
59
+ class_name_in_module.to_s.gsub(/^.*::/, '')
60
+ end
61
+
62
+ # Create a class name from a string like Rails does for table names to models.
63
+ # Note that this returns a string and not a Class. (To convert to an actual class
64
+ # follow +classify+ with +constantize+.)
65
+ #
66
+ # Examples:
67
+ # "egg_and_hams".classify # => "EggAndHam"
68
+ # "posts".classify # => "Post"
69
+ #
70
+ # Singular names are not handled correctly:
71
+ # "business".classify # => "Busines"
72
+ def classify(class_str)
73
+ # strip out any leading schema name
74
+ camelize(class_str.to_s.sub(/.*\./, ''))
75
+ end
76
+
77
+ # Ruby 1.9 introduces an inherit argument for Module#const_get and
78
+ # #const_defined? and changes their default behavior.
79
+ if Module.method(:const_get).arity == 1
80
+ # Tries to find a constant with the name specified in the argument string:
81
+ #
82
+ # "Module".constantize # => Module
83
+ # "Test::Unit".constantize # => Test::Unit
84
+ #
85
+ # The name is assumed to be the one of a top-level constant, no matter whether
86
+ # it starts with "::" or not. No lexical context is taken into account:
87
+ #
88
+ # C = 'outside'
89
+ # module M
90
+ # C = 'inside'
91
+ # C # => 'inside'
92
+ # "C".constantize # => 'outside', same as ::C
93
+ # end
94
+ #
95
+ # NameError is raised when the name is not in CamelCase or the constant is
96
+ # unknown.
97
+ def constantize(camel_cased_word)
98
+ names = camel_cased_word.split('::')
99
+ names.shift if names.empty? || names.first.empty?
100
+
101
+ constant = ::Object
102
+ names.each do |name|
103
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
104
+ end
105
+ constant
106
+ end
107
+ else
108
+ def constantize(camel_cased_word) #:nodoc:
109
+ names = camel_cased_word.split('::')
110
+ names.shift if names.empty? || names.first.empty?
111
+
112
+ constant = ::Object
113
+ names.each do |name|
114
+ constant = constant.const_get(name, false) || constant.const_missing(name)
115
+ end
116
+ constant
117
+ end
118
+ end
119
+
120
+ end #ClassMethods
121
+
122
+ def camelize(first_letter = :upper)
123
+ case first_letter
124
+ when :upper then String.camelize(self, true)
125
+ when :lower then String.camelize(self, false)
126
+ end
127
+ end
128
+ alias_method :camelcase, :camelize
129
+
130
+ def underscore
131
+ self.class.underscore(self)
132
+ end
133
+
134
+ def dasherize
135
+ self.class.dasherize(self)
136
+ end
137
+
138
+ def demodulize
139
+ self.class.demodulize(self)
140
+ end
141
+
142
+ def classify
143
+ self.class.classify(self)
144
+ end
145
+
146
+ def constantize
147
+ self.class.constantize(self)
148
+ end
149
+
150
+ def ends_with?(suffix)
151
+ suffix = suffix.to_s
152
+ self[-suffix.length, suffix.length] == suffix
153
+ end
154
+
155
+ def starts_with?(prefix)
156
+ prefix = prefix.to_s
157
+ self[0, prefix.length] == prefix
158
+ end
159
+
160
+ end
161
+ end
162
+ end
163
+
164
+ class String
165
+ include Useful::RubyExtensionsFromRails::String
166
+ end
@@ -0,0 +1,320 @@
1
+ require File.join(File.dirname(__FILE__), 'object') unless Object.new.respond_to?(:acts_like?)
2
+ require File.join(File.dirname(__FILE__), 'duration')
3
+ require File.join(File.dirname(__FILE__), 'numeric')
4
+
5
+ module Useful
6
+ module RubyExtensionsFromRails
7
+ module Time
8
+
9
+ def self.included(base) #:nodoc:
10
+ base.extend ClassMethods
11
+ base.class_eval do
12
+ alias_method :to_default_s, :to_s
13
+ alias_method :to_s, :to_formatted_s
14
+ end
15
+ end
16
+
17
+ COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
18
+ DATE_FORMATS = {
19
+ :db => "%Y-%m-%d %H:%M:%S",
20
+ :number => "%Y%m%d%H%M%S",
21
+ :time => "%H:%M",
22
+ :short => "%d %b %H:%M",
23
+ :long => "%B %d, %Y %H:%M",
24
+ :long_ordinal => lambda { |time| time.strftime("%B #{time.day.ordinalize}, %Y %H:%M") },
25
+ :rfc822 => lambda { |time| time.strftime("%a, %d %b %Y %H:%M:%S #{time.formatted_offset(false)}") }
26
+ }
27
+
28
+ module ClassMethods
29
+ # Return the number of days in the given month.
30
+ # If no year is specified, it will use the current year.
31
+ def days_in_month(month, year = now.year)
32
+ return 29 if month == 2 && ::Date.gregorian_leap?(year)
33
+ COMMON_YEAR_DAYS_IN_MONTH[month]
34
+ end
35
+
36
+ # Returns a new Time if requested year can be accommodated by Ruby's Time class
37
+ # (i.e., if year is within either 1970..2038 or 1902..2038, depending on system architecture);
38
+ # otherwise returns a DateTime
39
+ def time_with_datetime_fallback(utc_or_local, year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
40
+ ::Time.send(utc_or_local, year, month, day, hour, min, sec, usec)
41
+ end
42
+
43
+ # Wraps class method +time_with_datetime_fallback+ with +utc_or_local+ set to <tt>:utc</tt>.
44
+ def utc_time(*args)
45
+ time_with_datetime_fallback(:utc, *args)
46
+ end
47
+
48
+ # Wraps class method +time_with_datetime_fallback+ with +utc_or_local+ set to <tt>:local</tt>.
49
+ def local_time(*args)
50
+ time_with_datetime_fallback(:local, *args)
51
+ end
52
+
53
+ # Returns Time.now
54
+ def current
55
+ ::Time.now
56
+ end
57
+
58
+ end
59
+
60
+ # Enable more predictable duck-typing on Time-like classes. See
61
+ # Object#acts_like?.
62
+ def acts_like_time?
63
+ true
64
+ end
65
+
66
+ # Tells whether the Time object's time lies in the past
67
+ def past?
68
+ self < ::Time.current
69
+ end
70
+
71
+ # Tells whether the Time object's time is today
72
+ def today?
73
+ self.to_date == ::Date.current
74
+ end
75
+
76
+ # Tells whether the Time object's time lies in the future
77
+ def future?
78
+ self > ::Time.current
79
+ end
80
+
81
+ # Seconds since midnight: Time.now.seconds_since_midnight
82
+ def seconds_since_midnight
83
+ self.to_i - self.change(:hour => 0).to_i + (self.usec/1.0e+6)
84
+ end
85
+
86
+ # Returns a new Time where one or more of the elements have been changed according to the +options+ parameter. The time options
87
+ # (hour, minute, sec, usec) reset cascadingly, so if only the hour is passed, then minute, sec, and usec is set to 0. If the hour and
88
+ # minute is passed, then sec and usec is set to 0.
89
+ def change(options)
90
+ ::Time.send(
91
+ self.utc? ? :utc_time : :local_time,
92
+ options[:year] || self.year,
93
+ options[:month] || self.month,
94
+ options[:day] || self.day,
95
+ options[:hour] || self.hour,
96
+ options[:min] || (options[:hour] ? 0 : self.min),
97
+ options[:sec] || ((options[:hour] || options[:min]) ? 0 : self.sec),
98
+ options[:usec] || ((options[:hour] || options[:min] || options[:sec]) ? 0 : self.usec)
99
+ )
100
+ end
101
+
102
+ # Uses Date to provide precise Time calculations for years, months, and days.
103
+ # The +options+ parameter takes a hash with any of these keys: <tt>:years</tt>,
104
+ # <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>, <tt>:hours</tt>,
105
+ # <tt>:minutes</tt>, <tt>:seconds</tt>.
106
+ def advance(options)
107
+ unless options[:weeks].nil?
108
+ options[:weeks], partial_weeks = options[:weeks].divmod(1)
109
+ options[:days] = (options[:days] || 0) + 7 * partial_weeks
110
+ end
111
+
112
+ unless options[:days].nil?
113
+ options[:days], partial_days = options[:days].divmod(1)
114
+ options[:hours] = (options[:hours] || 0) + 24 * partial_days
115
+ end
116
+
117
+ d = to_date.advance(options)
118
+ time_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
119
+ seconds_to_advance = (options[:seconds] || 0) + (options[:minutes] || 0) * 60 + (options[:hours] || 0) * 3600
120
+ seconds_to_advance == 0 ? time_advanced_by_date : time_advanced_by_date.since(seconds_to_advance)
121
+ end
122
+
123
+ # Returns a new Time representing the time a number of seconds ago, this is basically a wrapper around the Numeric extension
124
+ def ago(seconds)
125
+ self.since(-seconds)
126
+ end
127
+
128
+ # Returns a new Time representing the time a number of seconds since the instance time, this is basically a wrapper around
129
+ # the Numeric extension.
130
+ def since(seconds)
131
+ f = seconds.since(self)
132
+ if Useful::RubyExtensionsFromRails::Duration === seconds
133
+ f
134
+ else
135
+ initial_dst = self.dst? ? 1 : 0
136
+ final_dst = f.dst? ? 1 : 0
137
+ (seconds.abs >= 86400 && initial_dst != final_dst) ? f + (initial_dst - final_dst).hours : f
138
+ end
139
+ end
140
+ alias :in :since
141
+
142
+ # Returns a new Time representing the time a number of specified months ago
143
+ def months_ago(months)
144
+ advance(:months => -months)
145
+ end
146
+
147
+ # Returns a new Time representing the time a number of specified months in the future
148
+ def months_since(months)
149
+ advance(:months => months)
150
+ end
151
+
152
+ # Returns a new Time representing the time a number of specified years ago
153
+ def years_ago(years)
154
+ advance(:years => -years)
155
+ end
156
+
157
+ # Returns a new Time representing the time a number of specified years in the future
158
+ def years_since(years)
159
+ advance(:years => years)
160
+ end
161
+
162
+ # Short-hand for years_ago(1)
163
+ def last_year
164
+ years_ago(1)
165
+ end
166
+
167
+ # Short-hand for years_since(1)
168
+ def next_year
169
+ years_since(1)
170
+ end
171
+
172
+ # Short-hand for months_ago(1)
173
+ def last_month
174
+ months_ago(1)
175
+ end
176
+
177
+ # Short-hand for months_since(1)
178
+ def next_month
179
+ months_since(1)
180
+ end
181
+
182
+ # Returns a new Time representing the start of the day (0:00)
183
+ def beginning_of_day
184
+ (self - self.seconds_since_midnight).change(:usec => 0)
185
+ end
186
+ alias :midnight :beginning_of_day
187
+ alias :at_midnight :beginning_of_day
188
+ alias :at_beginning_of_day :beginning_of_day
189
+
190
+ # Returns a new Time representing the end of the day (23:59:59)
191
+ def end_of_day
192
+ change(:hour => 23, :min => 59, :sec => 59)
193
+ end
194
+ alias :at_end_of_day :end_of_day
195
+
196
+ # Returns a new Time representing the "start" of this week (Monday, 0:00)
197
+ def beginning_of_week
198
+ days_to_monday = self.wday!=0 ? self.wday-1 : 6
199
+ (self - days_to_monday.days).midnight
200
+ end
201
+ alias :monday :beginning_of_week
202
+ alias :at_beginning_of_week :beginning_of_week
203
+
204
+ # Returns a new Time representing the end of this week (Sunday, 23:59:59)
205
+ def end_of_week
206
+ days_to_sunday = self.wday!=0 ? 7-self.wday : 0
207
+ (self + days_to_sunday.days).end_of_day
208
+ end
209
+ alias :at_end_of_week :end_of_week
210
+
211
+ # Returns a new Time representing the start of the given day in next week (default is Monday).
212
+ def next_week(day = :monday)
213
+ days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
214
+ since(1.week).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
215
+ end
216
+
217
+ # Returns a new Time representing the start of the month (1st of the month, 0:00)
218
+ def beginning_of_month
219
+ #self - ((self.mday-1).days + self.seconds_since_midnight)
220
+ change(:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
221
+ end
222
+ alias :at_beginning_of_month :beginning_of_month
223
+
224
+ # Returns a new Time representing the end of the month (last day of the month, 0:00)
225
+ def end_of_month
226
+ #self - ((self.mday-1).days + self.seconds_since_midnight)
227
+ last_day = ::Time.days_in_month( self.month, self.year )
228
+ change(:day => last_day, :hour => 23, :min => 59, :sec => 59, :usec => 0)
229
+ end
230
+ alias :at_end_of_month :end_of_month
231
+
232
+ # Returns a new Time representing the start of the quarter (1st of january, april, july, october, 0:00)
233
+ def beginning_of_quarter
234
+ beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
235
+ end
236
+ alias :at_beginning_of_quarter :beginning_of_quarter
237
+
238
+ # Returns a new Time representing the end of the quarter (last day of march, june, september, december, 23:59:59)
239
+ def end_of_quarter
240
+ beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
241
+ end
242
+ alias :at_end_of_quarter :end_of_quarter
243
+
244
+ # Returns a new Time representing the start of the year (1st of january, 0:00)
245
+ def beginning_of_year
246
+ change(:month => 1,:day => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
247
+ end
248
+ alias :at_beginning_of_year :beginning_of_year
249
+
250
+ # Returns a new Time representing the end of the year (31st of december, 23:59:59)
251
+ def end_of_year
252
+ change(:month => 12,:day => 31,:hour => 23, :min => 59, :sec => 59)
253
+ end
254
+ alias :at_end_of_year :end_of_year
255
+
256
+ # Convenience method which returns a new Time representing the time 1 day ago
257
+ def yesterday
258
+ advance(:days => -1)
259
+ end
260
+
261
+ # Convenience method which returns a new Time representing the time 1 day since the instance time
262
+ def tomorrow
263
+ advance(:days => 1)
264
+ end
265
+
266
+ # Converts to a formatted string. See DATE_FORMATS for builtin formats.
267
+ #
268
+ # This method is aliased to <tt>to_s</tt>.
269
+ #
270
+ # time = Time.now # => Thu Jan 18 06:10:17 CST 2007
271
+ #
272
+ # time.to_formatted_s(:time) # => "06:10:17"
273
+ # time.to_s(:time) # => "06:10:17"
274
+ #
275
+ # time.to_formatted_s(:db) # => "2007-01-18 06:10:17"
276
+ # time.to_formatted_s(:number) # => "20070118061017"
277
+ # time.to_formatted_s(:short) # => "18 Jan 06:10"
278
+ # time.to_formatted_s(:long) # => "January 18, 2007 06:10"
279
+ # time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10"
280
+ # time.to_formatted_s(:rfc822) # => "Thu, 18 Jan 2007 06:10:17 -0600"
281
+ #
282
+ # == Adding your own time formats to +to_formatted_s+
283
+ # You can add your own formats to the Time::DATE_FORMATS hash.
284
+ # Use the format name as the hash key and either a strftime string
285
+ # or Proc instance that takes a time argument as the value.
286
+ #
287
+ # # config/initializers/time_formats.rb
288
+ # Time::DATE_FORMATS[:month_and_year] = "%B %Y"
289
+ # Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") }
290
+ def to_formatted_s(format = :default)
291
+ return to_default_s unless formatter = DATE_FORMATS[format]
292
+ formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
293
+ end
294
+
295
+ # Returns the UTC offset as an +HH:MM formatted string.
296
+ #
297
+ # Time.local(2000).formatted_offset # => "-06:00"
298
+ # Time.local(2000).formatted_offset(false) # => "-0600"
299
+ def formatted_offset(colon = true, alternate_utc_string = nil)
300
+ utc? && alternate_utc_string || utc_offset.to_utc_offset_s(colon)
301
+ end
302
+
303
+ # Converts a Time object to a Date, dropping hour, minute, and second precision.
304
+ #
305
+ # my_time = Time.now # => Mon Nov 12 22:59:51 -0500 2007
306
+ # my_time.to_date # => Mon, 12 Nov 2007
307
+ #
308
+ # your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
309
+ # your_time.to_date # => Tue, 13 Jan 2009
310
+ def to_date
311
+ ::Date.new(year, month, day)
312
+ end
313
+
314
+ end
315
+ end
316
+ end
317
+
318
+ class Time
319
+ include Useful::RubyExtensionsFromRails::Time
320
+ end
@@ -0,0 +1,3 @@
1
+ Dir[File.join(File.dirname(__FILE__), "ruby_extensions_from_rails" ,"*.rb")].each do |file|
2
+ require file
3
+ end
@@ -1,4 +1,3 @@
1
- $:.unshift File.dirname(__FILE__)
2
- require 'sinatra_helpers/environment_tests'
3
- require 'sinatra_helpers/erb'
4
- require 'sinatra_helpers/tags'
1
+ Dir[File.join(File.dirname(__FILE__), "sinatra_helpers" ,"*.rb")].each do |file|
2
+ require file
3
+ end
@@ -3,7 +3,7 @@ module Useful
3
3
 
4
4
  MAJOR = 0
5
5
  MINOR = 1
6
- TINY = 1
6
+ TINY = 2
7
7
 
8
8
  def self.to_s # :nodoc:
9
9
  [MAJOR, MINOR, TINY].join('.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kelredd-useful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelredd
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-02 00:00:00 -07:00
12
+ date: 2009-06-16 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -27,12 +27,25 @@ files:
27
27
  - lib/useful
28
28
  - lib/useful/ruby_extensions
29
29
  - lib/useful/ruby_extensions/array.rb
30
+ - lib/useful/ruby_extensions/date.rb
31
+ - lib/useful/ruby_extensions/false_class.rb
30
32
  - lib/useful/ruby_extensions/fixnum.rb
31
33
  - lib/useful/ruby_extensions/hash.rb
32
34
  - lib/useful/ruby_extensions/numeric.rb
33
35
  - lib/useful/ruby_extensions/object.rb
34
36
  - lib/useful/ruby_extensions/string.rb
37
+ - lib/useful/ruby_extensions/true_class.rb
35
38
  - lib/useful/ruby_extensions.rb
39
+ - lib/useful/ruby_extensions_from_rails
40
+ - lib/useful/ruby_extensions_from_rails/date.rb
41
+ - lib/useful/ruby_extensions_from_rails/duration.rb
42
+ - lib/useful/ruby_extensions_from_rails/fixnum.rb
43
+ - lib/useful/ruby_extensions_from_rails/hash.rb
44
+ - lib/useful/ruby_extensions_from_rails/numeric.rb
45
+ - lib/useful/ruby_extensions_from_rails/object.rb
46
+ - lib/useful/ruby_extensions_from_rails/string.rb
47
+ - lib/useful/ruby_extensions_from_rails/time.rb
48
+ - lib/useful/ruby_extensions_from_rails.rb
36
49
  - lib/useful/sinatra_helpers
37
50
  - lib/useful/sinatra_helpers/environment_tests.rb
38
51
  - lib/useful/sinatra_helpers/erb