activesupport 3.2.3 → 3.2.4.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- data/CHANGELOG.md +66 -2
- data/README.rdoc +1 -1
- data/lib/active_support/benchmarkable.rb +1 -1
- data/lib/active_support/core_ext/class/attribute_accessors.rb +111 -23
- data/lib/active_support/core_ext/date_time/calculations.rb +11 -0
- data/lib/active_support/core_ext/hash/deep_dup.rb +7 -0
- data/lib/active_support/core_ext/hash/deep_merge.rb +7 -2
- data/lib/active_support/core_ext/hash/keys.rb +9 -2
- data/lib/active_support/core_ext/integer/multiple.rb +4 -0
- data/lib/active_support/core_ext/object/duplicable.rb +13 -0
- data/lib/active_support/core_ext/object/try.rb +4 -0
- data/lib/active_support/core_ext/string/conversions.rb +12 -0
- data/lib/active_support/core_ext/string/exclude.rb +6 -1
- data/lib/active_support/core_ext/time/calculations.rb +15 -1
- data/lib/active_support/core_ext/time/zones.rb +1 -0
- data/lib/active_support/json/decoding.rb +17 -3
- data/lib/active_support/testing/performance/ruby.rb +1 -1
- data/lib/active_support/values/time_zone.rb +4 -2
- data/lib/active_support/version.rb +2 -2
- metadata +22 -20
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,19 @@
|
|
1
|
-
## Rails 3.2.
|
1
|
+
## Rails 3.2.4 (unreleased) ##
|
2
|
+
|
3
|
+
* Added #beginning_of_hour and #end_of_hour to Time and DateTime core
|
4
|
+
extensions. *Mark J. Titorenko*
|
5
|
+
|
6
|
+
|
7
|
+
## Rails 3.2.3 (March 30, 2012) ##
|
2
8
|
|
3
9
|
* No changes.
|
4
10
|
|
11
|
+
|
5
12
|
## Rails 3.2.2 (March 1, 2012) ##
|
6
13
|
|
7
14
|
* No changes.
|
8
15
|
|
16
|
+
|
9
17
|
## Rails 3.2.1 (January 26, 2012) ##
|
10
18
|
|
11
19
|
* Documentation fixes and improvements.
|
@@ -90,6 +98,36 @@
|
|
90
98
|
filehandle, or tune your filesystem.
|
91
99
|
|
92
100
|
|
101
|
+
## Rails 3.1.4 (March 1, 2012) ##
|
102
|
+
|
103
|
+
* No changes
|
104
|
+
|
105
|
+
|
106
|
+
## Rails 3.1.3 (November 20, 2011) ##
|
107
|
+
|
108
|
+
* No changes
|
109
|
+
|
110
|
+
|
111
|
+
## Rails 3.1.2 (November 18, 2011) ##
|
112
|
+
|
113
|
+
* No changes
|
114
|
+
|
115
|
+
|
116
|
+
## Rails 3.1.1 (October 7, 2011) ##
|
117
|
+
|
118
|
+
* ruby193: String#prepend is also unsafe *Akira Matsuda*
|
119
|
+
|
120
|
+
* Fix obviously breakage of Time.=== for Time subclasses *jeremyevans*
|
121
|
+
|
122
|
+
* Added fix so that file store does not raise an exception when cache dir does
|
123
|
+
not exist yet. This can happen if a delete_matched is called before anything
|
124
|
+
is saved in the cache. *Philippe Huibonhoa*
|
125
|
+
|
126
|
+
* Fixed performance issue where TimeZone lookups would require tzinfo each time *Tim Lucas*
|
127
|
+
|
128
|
+
* ActiveSupport::OrderedHash is now marked as extractable when using Array#extract_options! *Prem Sichanugrist*
|
129
|
+
|
130
|
+
|
93
131
|
## Rails 3.1.0 (August 30, 2011) ##
|
94
132
|
|
95
133
|
* ActiveSupport::Dependencies#load and ActiveSupport::Dependencies#require now
|
@@ -132,12 +170,38 @@
|
|
132
170
|
* JSON decoding now uses the multi_json gem which also vendors a json engine called OkJson. The yaml backend has been removed in favor of OkJson as a default engine for 1.8.x, while the built in 1.9.x json implementation will be used by default. *Josh Kalderimis*
|
133
171
|
|
134
172
|
|
173
|
+
## Rails 3.0.12 (March 1, 2012) ##
|
174
|
+
|
175
|
+
* No changes.
|
176
|
+
|
177
|
+
|
178
|
+
## Rails 3.0.11 (November 18, 2011) ##
|
179
|
+
|
180
|
+
* No changes.
|
181
|
+
|
182
|
+
|
183
|
+
## Rails 3.0.10 (August 16, 2011) ##
|
184
|
+
|
185
|
+
* Delayed backtrace scrubbing in `load_missing_constant` until we actually
|
186
|
+
raise the exception
|
187
|
+
|
188
|
+
|
189
|
+
## Rails 3.0.9 (June 16, 2011) ##
|
190
|
+
|
191
|
+
* No changes.
|
192
|
+
|
193
|
+
|
194
|
+
## Rails 3.0.8 (June 7, 2011) ##
|
195
|
+
|
196
|
+
* No changes.
|
197
|
+
|
198
|
+
|
135
199
|
## Rails 3.0.7 (April 18, 2011) ##
|
136
200
|
|
137
201
|
* Hash.from_xml no longer loses attributes on tags containing only whitespace *André Arko*
|
138
202
|
|
139
203
|
|
140
|
-
|
204
|
+
## Rails 3.0.6 (April 5, 2011)
|
141
205
|
|
142
206
|
* No changes.
|
143
207
|
|
data/README.rdoc
CHANGED
@@ -14,7 +14,7 @@ The latest version of Active Support can be installed with RubyGems:
|
|
14
14
|
|
15
15
|
Source code can be downloaded as part of the Rails project on GitHub
|
16
16
|
|
17
|
-
* https://github.com/rails/rails/tree/
|
17
|
+
* https://github.com/rails/rails/tree/3-2-stable/activesupport
|
18
18
|
|
19
19
|
|
20
20
|
== License
|
@@ -35,7 +35,7 @@ module ActiveSupport
|
|
35
35
|
options[:level] ||= :info
|
36
36
|
|
37
37
|
result = nil
|
38
|
-
ms = Benchmark.ms { result = options[:silence] ?
|
38
|
+
ms = Benchmark.ms { result = options[:silence] ? silence { yield } : yield }
|
39
39
|
logger.send(options[:level], '%s (%.1fms)' % [ message, ms ])
|
40
40
|
result
|
41
41
|
else
|
@@ -2,30 +2,33 @@ require 'active_support/core_ext/array/extract_options'
|
|
2
2
|
|
3
3
|
# Extends the class object with class and instance accessors for class attributes,
|
4
4
|
# just like the native attr* accessors for instance attributes.
|
5
|
-
#
|
6
|
-
# Note that unlike +class_attribute+, if a subclass changes the value then that would
|
7
|
-
# also change the value for parent class. Similarly if parent class changes the value
|
8
|
-
# then that would change the value of subclasses too.
|
9
|
-
#
|
10
|
-
# class Person
|
11
|
-
# cattr_accessor :hair_colors
|
12
|
-
# end
|
13
|
-
#
|
14
|
-
# Person.hair_colors = [:brown, :black, :blonde, :red]
|
15
|
-
# Person.hair_colors # => [:brown, :black, :blonde, :red]
|
16
|
-
# Person.new.hair_colors # => [:brown, :black, :blonde, :red]
|
17
|
-
#
|
18
|
-
# To opt out of the instance writer method, pass :instance_writer => false.
|
19
|
-
# To opt out of the instance reader method, pass :instance_reader => false.
|
20
|
-
# To opt out of both instance methods, pass :instance_accessor => false.
|
21
|
-
#
|
22
|
-
# class Person
|
23
|
-
# cattr_accessor :hair_colors, :instance_writer => false, :instance_reader => false
|
24
|
-
# end
|
25
|
-
#
|
26
|
-
# Person.new.hair_colors = [:brown] # => NoMethodError
|
27
|
-
# Person.new.hair_colors # => NoMethodError
|
28
5
|
class Class
|
6
|
+
# Defines a class attribute if it's not defined and creates a reader method that
|
7
|
+
# returns the attribute value.
|
8
|
+
#
|
9
|
+
# class Person
|
10
|
+
# cattr_reader :hair_colors
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# Person.class_variable_set("@@hair_colors", [:brown, :black])
|
14
|
+
# Person.hair_colors # => [:brown, :black]
|
15
|
+
# Person.new.hair_colors # => [:brown, :black]
|
16
|
+
#
|
17
|
+
# The attribute name must be a valid method name in Ruby.
|
18
|
+
#
|
19
|
+
# class Person
|
20
|
+
# cattr_reader :"1_Badname "
|
21
|
+
# end
|
22
|
+
# # => NameError: invalid attribute name
|
23
|
+
#
|
24
|
+
# If you want to opt out the instance reader method, you can pass <tt>:instance_reader => false</tt>
|
25
|
+
# or <tt>:instance_accessor => false</tt>.
|
26
|
+
#
|
27
|
+
# class Person
|
28
|
+
# cattr_reader :hair_colors, :instance_reader => false
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# Person.new.hair_colors # => NoMethodError
|
29
32
|
def cattr_reader(*syms)
|
30
33
|
options = syms.extract_options!
|
31
34
|
syms.each do |sym|
|
@@ -49,6 +52,43 @@ class Class
|
|
49
52
|
end
|
50
53
|
end
|
51
54
|
|
55
|
+
# Defines a class attribute if it's not defined and creates a writer method to allow
|
56
|
+
# assignment to the attribute.
|
57
|
+
#
|
58
|
+
# class Person
|
59
|
+
# cattr_writer :hair_colors
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# Person.hair_colors = [:brown, :black]
|
63
|
+
# Person.class_variable_get("@@hair_colors") # => [:brown, :black]
|
64
|
+
# Person.new.hair_colors = [:blonde, :red]
|
65
|
+
# Person.class_variable_get("@@hair_colors") # => [:blonde, :red]
|
66
|
+
#
|
67
|
+
# The attribute name must be a valid method name in Ruby.
|
68
|
+
#
|
69
|
+
# class Person
|
70
|
+
# cattr_writer :"1_Badname "
|
71
|
+
# end
|
72
|
+
# # => NameError: invalid attribute name
|
73
|
+
#
|
74
|
+
# If you want to opt out the instance writer method, pass <tt>:instance_writer => false</tt>
|
75
|
+
# or <tt>:instance_accessor => false</tt>.
|
76
|
+
#
|
77
|
+
# class Person
|
78
|
+
# cattr_writer :hair_colors, :instance_writer => false
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# Person.new.hair_colors = [:blonde, :red] # => NoMethodError
|
82
|
+
#
|
83
|
+
# Also, you can pass a block to set up the attribute with a default value.
|
84
|
+
#
|
85
|
+
# class Person
|
86
|
+
# cattr_writer :hair_colors do
|
87
|
+
# [:brown, :black, :blonde, :red]
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
52
92
|
def cattr_writer(*syms)
|
53
93
|
options = syms.extract_options!
|
54
94
|
syms.each do |sym|
|
@@ -73,6 +113,54 @@ class Class
|
|
73
113
|
end
|
74
114
|
end
|
75
115
|
|
116
|
+
# Defines both class and instance accessors for class attributes.
|
117
|
+
#
|
118
|
+
# class Person
|
119
|
+
# cattr_accessor :hair_colors
|
120
|
+
# end
|
121
|
+
#
|
122
|
+
# Person.hair_colors = [:brown, :black, :blonde, :red]
|
123
|
+
# Person.hair_colors # => [:brown, :black, :blonde, :red]
|
124
|
+
# Person.new.hair_colors # => [:brown, :black, :blonde, :red]
|
125
|
+
#
|
126
|
+
# If a subclass changes the value then that would also change the value for
|
127
|
+
# parent class. Similarly if parent class changes the value then that would
|
128
|
+
# change the value of subclasses too.
|
129
|
+
#
|
130
|
+
# class Male < Person
|
131
|
+
# end
|
132
|
+
#
|
133
|
+
# Male.hair_colors << :blue
|
134
|
+
# Person.hair_colors # => [:brown, :black, :blonde, :red, :blue]
|
135
|
+
#
|
136
|
+
# To opt out of the instance writer method, pass <tt>:instance_writer => false</tt>.
|
137
|
+
# To opt out of the instance reader method, pass <tt>:instance_reader => false</tt>.
|
138
|
+
#
|
139
|
+
# class Person
|
140
|
+
# cattr_accessor :hair_colors, :instance_writer => false, :instance_reader => false
|
141
|
+
# end
|
142
|
+
#
|
143
|
+
# Person.new.hair_colors = [:brown] # => NoMethodError
|
144
|
+
# Person.new.hair_colors # => NoMethodError
|
145
|
+
#
|
146
|
+
# Or pass <tt>:instance_accessor => false</tt>, to opt out both instance methods.
|
147
|
+
#
|
148
|
+
# class Person
|
149
|
+
# cattr_accessor :hair_colors, :instance_accessor => false
|
150
|
+
# end
|
151
|
+
#
|
152
|
+
# Person.new.hair_colors = [:brown] # => NoMethodError
|
153
|
+
# Person.new.hair_colors # => NoMethodError
|
154
|
+
#
|
155
|
+
# Also you can pass a block to set up the attribute with a default value.
|
156
|
+
#
|
157
|
+
# class Person
|
158
|
+
# cattr_accessor :hair_colors do
|
159
|
+
# [:brown, :black, :blonde, :red]
|
160
|
+
# end
|
161
|
+
# end
|
162
|
+
#
|
163
|
+
# Person.class_variable_get("@@hair_colors") #=> [:brown, :black, :blonde, :red]
|
76
164
|
def cattr_accessor(*syms, &blk)
|
77
165
|
cattr_reader(*syms)
|
78
166
|
cattr_writer(*syms, &blk)
|
@@ -81,6 +81,17 @@ class DateTime
|
|
81
81
|
change(:hour => 23, :min => 59, :sec => 59)
|
82
82
|
end
|
83
83
|
|
84
|
+
# Returns a new DateTime representing the start of the hour (hh:00:00)
|
85
|
+
def beginning_of_hour
|
86
|
+
change(:min => 0)
|
87
|
+
end
|
88
|
+
alias :at_beginning_of_hour :beginning_of_hour
|
89
|
+
|
90
|
+
# Returns a new DateTime representing the end of the hour (hh:59:59)
|
91
|
+
def end_of_hour
|
92
|
+
change(:min => 59, :sec => 59)
|
93
|
+
end
|
94
|
+
|
84
95
|
# 1.9.3 defines + and - on DateTime, < 1.9.3 do not.
|
85
96
|
if DateTime.public_instance_methods(false).include?(:+)
|
86
97
|
def plus_with_duration(other) #:nodoc:
|
@@ -1,11 +1,16 @@
|
|
1
1
|
class Hash
|
2
2
|
# Returns a new hash with +self+ and +other_hash+ merged recursively.
|
3
|
+
#
|
4
|
+
# h1 = {:x => {:y => [4,5,6]}, :z => [7,8,9]}
|
5
|
+
# h2 = {:x => {:y => [7,8,9]}, :z => "xyz"}
|
6
|
+
#
|
7
|
+
# h1.deep_merge(h2) #=> { :x => {:y => [7, 8, 9]}, :z => "xyz" }
|
8
|
+
# h2.deep_merge(h1) #=> { :x => {:y => [4, 5, 6]}, :z => [7, 8, 9] }
|
3
9
|
def deep_merge(other_hash)
|
4
10
|
dup.deep_merge!(other_hash)
|
5
11
|
end
|
6
12
|
|
7
|
-
#
|
8
|
-
# Modifies the receiver in place.
|
13
|
+
# Same as +deep_merge+, but modifies +self+.
|
9
14
|
def deep_merge!(other_hash)
|
10
15
|
other_hash.each_pair do |k,v|
|
11
16
|
tv = self[k]
|
@@ -1,10 +1,14 @@
|
|
1
1
|
class Hash
|
2
2
|
# Return a new hash with all keys converted to strings.
|
3
|
+
#
|
4
|
+
# { :name => 'Rob', :years => '28' }.stringify_keys
|
5
|
+
# #=> { "name" => "Rob", "years" => "28" }
|
3
6
|
def stringify_keys
|
4
7
|
dup.stringify_keys!
|
5
8
|
end
|
6
9
|
|
7
|
-
# Destructively convert all keys to strings.
|
10
|
+
# Destructively convert all keys to strings. Same as
|
11
|
+
# +stringify_keys+, but modifies +self+.
|
8
12
|
def stringify_keys!
|
9
13
|
keys.each do |key|
|
10
14
|
self[key.to_s] = delete(key)
|
@@ -14,12 +18,15 @@ class Hash
|
|
14
18
|
|
15
19
|
# Return a new hash with all keys converted to symbols, as long as
|
16
20
|
# they respond to +to_sym+.
|
21
|
+
#
|
22
|
+
# { 'name' => 'Rob', 'years' => '28' }.symbolize_keys
|
23
|
+
# #=> { :name => "Rob", :years => "28" }
|
17
24
|
def symbolize_keys
|
18
25
|
dup.symbolize_keys!
|
19
26
|
end
|
20
27
|
|
21
28
|
# Destructively convert all keys to symbols, as long as they respond
|
22
|
-
# to +to_sym+.
|
29
|
+
# to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
|
23
30
|
def symbolize_keys!
|
24
31
|
keys.each do |key|
|
25
32
|
self[(key.to_sym rescue key) || key] = delete(key)
|
@@ -104,3 +104,16 @@ class Module
|
|
104
104
|
false
|
105
105
|
end
|
106
106
|
end
|
107
|
+
|
108
|
+
require 'bigdecimal'
|
109
|
+
class BigDecimal
|
110
|
+
begin
|
111
|
+
BigDecimal.new('4.56').dup
|
112
|
+
|
113
|
+
def duplicable?
|
114
|
+
true
|
115
|
+
end
|
116
|
+
rescue TypeError
|
117
|
+
# can't dup, so use superclass implementation
|
118
|
+
end
|
119
|
+
end
|
@@ -7,6 +7,10 @@ class Object
|
|
7
7
|
#
|
8
8
|
# If try is called without a method to call, it will yield any given block with the object.
|
9
9
|
#
|
10
|
+
# Please also note that +try+ is defined on +Object+, therefore it won't work with
|
11
|
+
# subclasses of +BasicObject+. For example, using try with +SimpleDelegator+ will
|
12
|
+
# delegate +try+ to target instead of calling it on delegator itself.
|
13
|
+
#
|
10
14
|
# ==== Examples
|
11
15
|
#
|
12
16
|
# Without +try+
|
@@ -40,11 +40,23 @@ class String
|
|
40
40
|
::Time.send("#{form}_time", *d[0..6]) - d[7]
|
41
41
|
end
|
42
42
|
|
43
|
+
# Converts a string to a Date value.
|
44
|
+
#
|
45
|
+
# "1-1-2012".to_date #=> Sun, 01 Jan 2012
|
46
|
+
# "01/01/2012".to_date #=> Sun, 01 Jan 2012
|
47
|
+
# "2012-12-13".to_date #=> Thu, 13 Dec 2012
|
48
|
+
# "12/13/2012".to_date #=> ArgumentError: invalid date
|
43
49
|
def to_date
|
44
50
|
return nil if self.blank?
|
45
51
|
::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
|
46
52
|
end
|
47
53
|
|
54
|
+
# Converts a string to a DateTime value.
|
55
|
+
#
|
56
|
+
# "1-1-2012".to_datetime #=> Sun, 01 Jan 2012 00:00:00 +0000
|
57
|
+
# "01/01/2012 23:59:59".to_datetime #=> Sun, 01 Jan 2012 23:59:59 +0000
|
58
|
+
# "2012-12-13 12:50".to_datetime #=> Thu, 13 Dec 2012 12:50:00 +0000
|
59
|
+
# "12/13/2012".to_datetime #=> ArgumentError: invalid date
|
48
60
|
def to_datetime
|
49
61
|
return nil if self.blank?
|
50
62
|
d = ::Date._parse(self, false).values_at(:year, :mon, :mday, :hour, :min, :sec, :zone, :sec_fraction).map { |arg| arg || 0 }
|
@@ -1,5 +1,10 @@
|
|
1
1
|
class String
|
2
|
-
# The inverse of <tt>String#include?</tt>. Returns true if the string
|
2
|
+
# The inverse of <tt>String#include?</tt>. Returns true if the string
|
3
|
+
# does not include the other string.
|
4
|
+
#
|
5
|
+
# "hello".exclude? "lo" #=> false
|
6
|
+
# "hello".exclude? "ol" #=> true
|
7
|
+
# "hello".exclude? ?h #=> false
|
3
8
|
def exclude?(string)
|
4
9
|
!include?(string)
|
5
10
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'active_support/duration'
|
2
|
-
require 'active_support/core_ext/time/zones'
|
3
2
|
require 'active_support/core_ext/time/conversions'
|
4
3
|
|
5
4
|
class Time
|
@@ -219,6 +218,21 @@ class Time
|
|
219
218
|
change(:hour => 23, :min => 59, :sec => 59, :usec => 999999.999)
|
220
219
|
end
|
221
220
|
|
221
|
+
# Returns a new Time representing the start of the hour (x:00)
|
222
|
+
def beginning_of_hour
|
223
|
+
change(:min => 0)
|
224
|
+
end
|
225
|
+
alias :at_beginning_of_hour :beginning_of_hour
|
226
|
+
|
227
|
+
# Returns a new Time representing the end of the hour, x:59:59.999999 (.999999999 in ruby1.9)
|
228
|
+
def end_of_hour
|
229
|
+
change(
|
230
|
+
:min => 59,
|
231
|
+
:sec => 59,
|
232
|
+
:usec => 999999.999
|
233
|
+
)
|
234
|
+
end
|
235
|
+
|
222
236
|
# Returns a new Time representing the start of the month (1st of the month, 0:00)
|
223
237
|
def beginning_of_month
|
224
238
|
#self - ((self.mday-1).days + self.seconds_since_midnight)
|
@@ -9,7 +9,13 @@ module ActiveSupport
|
|
9
9
|
module JSON
|
10
10
|
class << self
|
11
11
|
def decode(json, options ={})
|
12
|
-
|
12
|
+
# Can't reliably detect whether MultiJson responds to load, since it's
|
13
|
+
# a reserved word. Use adapter as a proxy for new features.
|
14
|
+
data = if MultiJson.respond_to?(:adapter)
|
15
|
+
MultiJson.load(json, options)
|
16
|
+
else
|
17
|
+
MultiJson.decode(json, options)
|
18
|
+
end
|
13
19
|
if ActiveSupport.parse_json_times
|
14
20
|
convert_dates_from(data)
|
15
21
|
else
|
@@ -18,12 +24,20 @@ module ActiveSupport
|
|
18
24
|
end
|
19
25
|
|
20
26
|
def engine
|
21
|
-
MultiJson.
|
27
|
+
if MultiJson.respond_to?(:adapter)
|
28
|
+
MultiJson.adapter
|
29
|
+
else
|
30
|
+
MultiJson.engine
|
31
|
+
end
|
22
32
|
end
|
23
33
|
alias :backend :engine
|
24
34
|
|
25
35
|
def engine=(name)
|
26
|
-
MultiJson.
|
36
|
+
if MultiJson.respond_to?(:use)
|
37
|
+
MultiJson.use name
|
38
|
+
else
|
39
|
+
MultiJson.engine = name
|
40
|
+
end
|
27
41
|
end
|
28
42
|
alias :backend= :engine=
|
29
43
|
|
@@ -36,7 +36,7 @@ module ActiveSupport
|
|
36
36
|
RubyProf.pause
|
37
37
|
full_profile_options[:runs].to_i.times { run_test(@metric, :profile) }
|
38
38
|
@data = RubyProf.stop
|
39
|
-
@total = @data.threads.
|
39
|
+
@total = @data.threads.sum(0) { |thread| thread.methods.max.total_time }
|
40
40
|
end
|
41
41
|
|
42
42
|
def record
|
@@ -28,7 +28,7 @@ module ActiveSupport
|
|
28
28
|
MAPPING = {
|
29
29
|
"International Date Line West" => "Pacific/Midway",
|
30
30
|
"Midway Island" => "Pacific/Midway",
|
31
|
-
"Samoa"
|
31
|
+
"American Samoa" => "Pacific/Pago_Pago",
|
32
32
|
"Hawaii" => "Pacific/Honolulu",
|
33
33
|
"Alaska" => "America/Juneau",
|
34
34
|
"Pacific Time (US & Canada)" => "America/Los_Angeles",
|
@@ -167,7 +167,9 @@ module ActiveSupport
|
|
167
167
|
"Marshall Is." => "Pacific/Majuro",
|
168
168
|
"Auckland" => "Pacific/Auckland",
|
169
169
|
"Wellington" => "Pacific/Auckland",
|
170
|
-
"Nuku'alofa" => "Pacific/Tongatapu"
|
170
|
+
"Nuku'alofa" => "Pacific/Tongatapu",
|
171
|
+
"Tokelau Is." => "Pacific/Fakaofo",
|
172
|
+
"Samoa" => "Pacific/Apia"
|
171
173
|
}.each { |name, zone| name.freeze; zone.freeze }
|
172
174
|
MAPPING.freeze
|
173
175
|
|
metadata
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activesupport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: -2577822930
|
5
|
+
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 3
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
|
9
|
+
- 4
|
10
|
+
- rc
|
11
|
+
- 1
|
12
|
+
version: 3.2.4.rc1
|
11
13
|
platform: ruby
|
12
14
|
authors:
|
13
15
|
- David Heinemeier Hansson
|
@@ -15,11 +17,12 @@ autorequire:
|
|
15
17
|
bindir: bin
|
16
18
|
cert_chain: []
|
17
19
|
|
18
|
-
date: 2012-
|
19
|
-
default_executable:
|
20
|
+
date: 2012-05-28 00:00:00 Z
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
+
name: i18n
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
26
|
none: false
|
24
27
|
requirements:
|
25
28
|
- - ~>
|
@@ -29,12 +32,12 @@ dependencies:
|
|
29
32
|
- 0
|
30
33
|
- 6
|
31
34
|
version: "0.6"
|
32
|
-
requirement: *id001
|
33
35
|
type: :runtime
|
34
|
-
|
35
|
-
prerelease: false
|
36
|
+
version_requirements: *id001
|
36
37
|
- !ruby/object:Gem::Dependency
|
37
|
-
|
38
|
+
name: multi_json
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
41
|
none: false
|
39
42
|
requirements:
|
40
43
|
- - ~>
|
@@ -44,10 +47,8 @@ dependencies:
|
|
44
47
|
- 1
|
45
48
|
- 0
|
46
49
|
version: "1.0"
|
47
|
-
requirement: *id002
|
48
50
|
type: :runtime
|
49
|
-
|
50
|
-
prerelease: false
|
51
|
+
version_requirements: *id002
|
51
52
|
description: A toolkit of support libraries and Ruby core extensions extracted from the Rails framework. Rich support for multibyte strings, internationalization, time zones, and testing.
|
52
53
|
email: david@loudthinking.com
|
53
54
|
executables: []
|
@@ -270,7 +271,6 @@ files:
|
|
270
271
|
- lib/active_support/xml_mini/rexml.rb
|
271
272
|
- lib/active_support/xml_mini.rb
|
272
273
|
- lib/active_support.rb
|
273
|
-
has_rdoc: true
|
274
274
|
homepage: http://www.rubyonrails.org
|
275
275
|
licenses: []
|
276
276
|
|
@@ -294,16 +294,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
294
294
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
295
295
|
none: false
|
296
296
|
requirements:
|
297
|
-
- - "
|
297
|
+
- - ">"
|
298
298
|
- !ruby/object:Gem::Version
|
299
|
-
hash:
|
299
|
+
hash: 25
|
300
300
|
segments:
|
301
|
-
-
|
302
|
-
|
301
|
+
- 1
|
302
|
+
- 3
|
303
|
+
- 1
|
304
|
+
version: 1.3.1
|
303
305
|
requirements: []
|
304
306
|
|
305
307
|
rubyforge_project:
|
306
|
-
rubygems_version: 1.
|
308
|
+
rubygems_version: 1.8.22
|
307
309
|
signing_key:
|
308
310
|
specification_version: 3
|
309
311
|
summary: A toolkit of support libraries and Ruby core extensions extracted from the Rails framework.
|