activesupport 6.0.3.7 → 7.0.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +220 -533
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/active_support/actionable_error.rb +1 -1
- data/lib/active_support/array_inquirer.rb +2 -2
- data/lib/active_support/backtrace_cleaner.rb +3 -3
- data/lib/active_support/benchmarkable.rb +3 -3
- data/lib/active_support/cache/file_store.rb +18 -11
- data/lib/active_support/cache/mem_cache_store.rb +143 -37
- data/lib/active_support/cache/memory_store.rb +56 -28
- data/lib/active_support/cache/null_store.rb +10 -2
- data/lib/active_support/cache/redis_cache_store.rb +63 -88
- data/lib/active_support/cache/strategy/local_cache.rb +46 -57
- data/lib/active_support/cache.rb +273 -82
- data/lib/active_support/callbacks.rb +226 -118
- data/lib/active_support/code_generator.rb +65 -0
- data/lib/active_support/concern.rb +49 -5
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
- data/lib/active_support/concurrency/share_lock.rb +2 -2
- data/lib/active_support/configurable.rb +9 -6
- data/lib/active_support/configuration_file.rb +51 -0
- data/lib/active_support/core_ext/array/access.rb +1 -5
- data/lib/active_support/core_ext/array/conversions.rb +9 -7
- data/lib/active_support/core_ext/array/deprecated_conversions.rb +25 -0
- data/lib/active_support/core_ext/array/grouping.rb +6 -6
- data/lib/active_support/core_ext/array.rb +1 -0
- data/lib/active_support/core_ext/benchmark.rb +2 -2
- data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
- data/lib/active_support/core_ext/class/attribute.rb +34 -44
- data/lib/active_support/core_ext/class/subclasses.rb +21 -40
- data/lib/active_support/core_ext/date/blank.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +4 -4
- data/lib/active_support/core_ext/date/conversions.rb +5 -4
- data/lib/active_support/core_ext/date/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/date.rb +1 -0
- data/lib/active_support/core_ext/date_and_time/calculations.rb +13 -0
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +15 -0
- data/lib/active_support/core_ext/date_time/blank.rb +1 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +5 -5
- data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/date_time.rb +1 -0
- data/lib/active_support/core_ext/digest/uuid.rb +39 -13
- data/lib/active_support/core_ext/enumerable.rb +139 -15
- data/lib/active_support/core_ext/file/atomic.rb +1 -1
- data/lib/active_support/core_ext/hash/conversions.rb +2 -2
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +1 -1
- data/lib/active_support/core_ext/hash/except.rb +1 -1
- data/lib/active_support/core_ext/hash/keys.rb +2 -2
- data/lib/active_support/core_ext/hash/slice.rb +3 -2
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
- data/lib/active_support/core_ext/load_error.rb +1 -1
- data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
- data/lib/active_support/core_ext/module/attribute_accessors.rb +25 -29
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +26 -13
- data/lib/active_support/core_ext/module/concerning.rb +8 -2
- data/lib/active_support/core_ext/module/delegation.rb +40 -36
- data/lib/active_support/core_ext/module/introspection.rb +1 -25
- data/lib/active_support/core_ext/name_error.rb +23 -2
- data/lib/active_support/core_ext/numeric/conversions.rb +79 -72
- data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +60 -0
- data/lib/active_support/core_ext/numeric.rb +1 -0
- data/lib/active_support/core_ext/object/blank.rb +2 -2
- data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
- data/lib/active_support/core_ext/object/duplicable.rb +11 -0
- data/lib/active_support/core_ext/object/json.rb +42 -26
- data/lib/active_support/core_ext/object/to_query.rb +2 -2
- data/lib/active_support/core_ext/object/try.rb +20 -20
- data/lib/active_support/core_ext/object/with_options.rb +20 -1
- data/lib/active_support/core_ext/pathname/existence.rb +21 -0
- data/lib/active_support/core_ext/pathname.rb +3 -0
- data/lib/active_support/core_ext/range/compare_range.rb +6 -25
- data/lib/active_support/core_ext/range/conversions.rb +8 -8
- data/lib/active_support/core_ext/range/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/range/each.rb +1 -1
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +4 -20
- data/lib/active_support/core_ext/range.rb +1 -1
- data/lib/active_support/core_ext/regexp.rb +8 -1
- data/lib/active_support/core_ext/string/access.rb +5 -24
- data/lib/active_support/core_ext/string/conversions.rb +1 -0
- data/lib/active_support/core_ext/string/filters.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +39 -5
- data/lib/active_support/core_ext/string/inquiry.rb +1 -0
- data/lib/active_support/core_ext/string/multibyte.rb +2 -2
- data/lib/active_support/core_ext/string/output_safety.rb +69 -45
- data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -2
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +6 -0
- data/lib/active_support/core_ext/symbol.rb +3 -0
- data/lib/active_support/core_ext/time/calculations.rb +26 -6
- data/lib/active_support/core_ext/time/conversions.rb +6 -3
- data/lib/active_support/core_ext/time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/time/zones.rb +4 -19
- data/lib/active_support/core_ext/time.rb +1 -0
- data/lib/active_support/core_ext/uri.rb +3 -23
- data/lib/active_support/core_ext.rb +2 -1
- data/lib/active_support/current_attributes/test_helper.rb +13 -0
- data/lib/active_support/current_attributes.rb +39 -16
- data/lib/active_support/dependencies/interlock.rb +10 -18
- data/lib/active_support/dependencies/require_dependency.rb +28 -0
- data/lib/active_support/dependencies.rb +58 -764
- data/lib/active_support/deprecation/behaviors.rb +19 -3
- data/lib/active_support/deprecation/disallowed.rb +56 -0
- data/lib/active_support/deprecation/instance_delegator.rb +0 -1
- data/lib/active_support/deprecation/method_wrappers.rb +6 -5
- data/lib/active_support/deprecation/proxy_wrappers.rb +4 -4
- data/lib/active_support/deprecation/reporting.rb +50 -7
- data/lib/active_support/deprecation.rb +6 -1
- data/lib/active_support/descendants_tracker.rb +177 -64
- data/lib/active_support/digest.rb +5 -3
- data/lib/active_support/duration/iso8601_parser.rb +3 -3
- data/lib/active_support/duration/iso8601_serializer.rb +24 -10
- data/lib/active_support/duration.rb +134 -55
- data/lib/active_support/encrypted_configuration.rb +11 -1
- data/lib/active_support/encrypted_file.rb +20 -3
- data/lib/active_support/environment_inquirer.rb +20 -0
- data/lib/active_support/error_reporter.rb +117 -0
- data/lib/active_support/evented_file_update_checker.rb +70 -134
- data/lib/active_support/execution_context/test_helper.rb +13 -0
- data/lib/active_support/execution_context.rb +53 -0
- data/lib/active_support/execution_wrapper.rb +30 -4
- data/lib/active_support/executor/test_helper.rb +7 -0
- data/lib/active_support/fork_tracker.rb +71 -0
- data/lib/active_support/gem_version.rb +3 -3
- data/lib/active_support/hash_with_indifferent_access.rb +51 -25
- data/lib/active_support/html_safe_translation.rb +43 -0
- data/lib/active_support/i18n.rb +1 -0
- data/lib/active_support/i18n_railtie.rb +14 -19
- data/lib/active_support/inflector/inflections.rb +24 -9
- data/lib/active_support/inflector/methods.rb +29 -49
- data/lib/active_support/inflector/transliterate.rb +4 -4
- data/lib/active_support/isolated_execution_state.rb +56 -0
- data/lib/active_support/json/decoding.rb +4 -4
- data/lib/active_support/json/encoding.rb +8 -4
- data/lib/active_support/key_generator.rb +19 -2
- data/lib/active_support/locale/en.yml +8 -4
- data/lib/active_support/log_subscriber.rb +21 -3
- data/lib/active_support/logger.rb +1 -1
- data/lib/active_support/logger_silence.rb +2 -26
- data/lib/active_support/logger_thread_safe_level.rb +34 -21
- data/lib/active_support/message_encryptor.rb +12 -10
- data/lib/active_support/message_verifier.rb +50 -18
- data/lib/active_support/messages/metadata.rb +11 -3
- data/lib/active_support/messages/rotation_configuration.rb +2 -1
- data/lib/active_support/messages/rotator.rb +6 -5
- data/lib/active_support/multibyte/chars.rb +13 -52
- data/lib/active_support/multibyte/unicode.rb +1 -87
- data/lib/active_support/multibyte.rb +1 -1
- data/lib/active_support/notifications/fanout.rb +110 -69
- data/lib/active_support/notifications/instrumenter.rb +37 -29
- data/lib/active_support/notifications.rb +47 -26
- data/lib/active_support/number_helper/number_converter.rb +2 -4
- data/lib/active_support/number_helper/number_to_currency_converter.rb +10 -9
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +2 -2
- data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +9 -5
- data/lib/active_support/number_helper/rounding_helper.rb +12 -32
- data/lib/active_support/number_helper.rb +29 -16
- data/lib/active_support/option_merger.rb +9 -16
- data/lib/active_support/ordered_hash.rb +1 -1
- data/lib/active_support/ordered_options.rb +8 -2
- data/lib/active_support/parameter_filter.rb +21 -11
- data/lib/active_support/per_thread_registry.rb +6 -1
- data/lib/active_support/rails.rb +1 -4
- data/lib/active_support/railtie.rb +77 -5
- data/lib/active_support/rescuable.rb +6 -6
- data/lib/active_support/ruby_features.rb +7 -0
- data/lib/active_support/secure_compare_rotator.rb +51 -0
- data/lib/active_support/security_utils.rb +19 -12
- data/lib/active_support/string_inquirer.rb +2 -2
- data/lib/active_support/subscriber.rb +19 -25
- data/lib/active_support/tagged_logging.rb +31 -6
- data/lib/active_support/test_case.rb +9 -21
- data/lib/active_support/testing/assertions.rb +49 -12
- data/lib/active_support/testing/deprecation.rb +52 -1
- data/lib/active_support/testing/isolation.rb +2 -2
- data/lib/active_support/testing/method_call_assertions.rb +5 -5
- data/lib/active_support/testing/parallelization/server.rb +82 -0
- data/lib/active_support/testing/parallelization/worker.rb +103 -0
- data/lib/active_support/testing/parallelization.rb +16 -95
- data/lib/active_support/testing/parallelize_executor.rb +76 -0
- data/lib/active_support/testing/stream.rb +3 -5
- data/lib/active_support/testing/tagged_logging.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +53 -5
- data/lib/active_support/time_with_zone.rb +120 -55
- data/lib/active_support/values/time_zone.rb +49 -18
- data/lib/active_support/xml_mini/jdom.rb +1 -1
- data/lib/active_support/xml_mini/libxml.rb +5 -5
- data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
- data/lib/active_support/xml_mini/nokogiri.rb +4 -4
- data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
- data/lib/active_support/xml_mini/rexml.rb +9 -2
- data/lib/active_support/xml_mini.rb +5 -4
- data/lib/active_support.rb +29 -1
- metadata +46 -45
- data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -5
- data/lib/active_support/core_ext/hash/compact.rb +0 -5
- data/lib/active_support/core_ext/hash/transform_values.rb +0 -5
- data/lib/active_support/core_ext/marshal.rb +0 -24
- data/lib/active_support/core_ext/module/reachable.rb +0 -6
- data/lib/active_support/core_ext/numeric/inquiry.rb +0 -5
- data/lib/active_support/core_ext/range/include_range.rb +0 -9
- data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "yaml"
|
4
|
+
|
3
5
|
require "active_support/duration"
|
4
6
|
require "active_support/values/time_zone"
|
5
7
|
require "active_support/core_ext/object/acts_like"
|
@@ -15,31 +17,38 @@ module ActiveSupport
|
|
15
17
|
# and +in_time_zone+ on Time and DateTime instances.
|
16
18
|
#
|
17
19
|
# Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
|
18
|
-
# Time.zone.local(2007, 2, 10, 15, 30, 45) # => Sat, 10 Feb 2007 15:30:45 EST -05:00
|
19
|
-
# Time.zone.parse('2007-02-10 15:30:45') # => Sat, 10 Feb 2007 15:30:45 EST -05:00
|
20
|
-
# Time.zone.at(1171139445) # => Sat, 10 Feb 2007 15:30:45 EST -05:00
|
21
|
-
# Time.zone.now # => Sun, 18 May 2008 13:07:55 EDT -04:00
|
22
|
-
# Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone # => Sat, 10 Feb 2007 15:30:45 EST -05:00
|
20
|
+
# Time.zone.local(2007, 2, 10, 15, 30, 45) # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
|
21
|
+
# Time.zone.parse('2007-02-10 15:30:45') # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
|
22
|
+
# Time.zone.at(1171139445) # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
|
23
|
+
# Time.zone.now # => Sun, 18 May 2008 13:07:55.754107581 EDT -04:00
|
24
|
+
# Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
|
23
25
|
#
|
24
26
|
# See Time and TimeZone for further documentation of these methods.
|
25
27
|
#
|
26
28
|
# TimeWithZone instances implement the same API as Ruby Time instances, so
|
27
29
|
# that Time and TimeWithZone instances are interchangeable.
|
28
30
|
#
|
29
|
-
# t = Time.zone.now # => Sun, 18 May 2008 13:27:25 EDT -04:00
|
31
|
+
# t = Time.zone.now # => Sun, 18 May 2008 13:27:25.031505668 EDT -04:00
|
30
32
|
# t.hour # => 13
|
31
33
|
# t.dst? # => true
|
32
34
|
# t.utc_offset # => -14400
|
33
35
|
# t.zone # => "EDT"
|
34
|
-
# t.
|
35
|
-
# t + 1.day # => Mon, 19 May 2008 13:27:25 EDT -04:00
|
36
|
-
# t.beginning_of_year # => Tue, 01 Jan 2008 00:00:00 EST -05:00
|
36
|
+
# t.to_formatted_s(:rfc822) # => "Sun, 18 May 2008 13:27:25 -0400"
|
37
|
+
# t + 1.day # => Mon, 19 May 2008 13:27:25.031505668 EDT -04:00
|
38
|
+
# t.beginning_of_year # => Tue, 01 Jan 2008 00:00:00.000000000 EST -05:00
|
37
39
|
# t > Time.utc(1999) # => true
|
38
40
|
# t.is_a?(Time) # => true
|
39
41
|
# t.is_a?(ActiveSupport::TimeWithZone) # => true
|
40
42
|
class TimeWithZone
|
41
43
|
# Report class name as 'Time' to thwart type checking.
|
42
44
|
def self.name
|
45
|
+
ActiveSupport::Deprecation.warn(<<~EOM)
|
46
|
+
ActiveSupport::TimeWithZone.name has been deprecated and
|
47
|
+
from Rails 7.1 will use the default Ruby implementation.
|
48
|
+
You can set `config.active_support.remove_deprecated_time_with_zone_name = true`
|
49
|
+
to enable the new behavior now.
|
50
|
+
EOM
|
51
|
+
|
43
52
|
"Time"
|
44
53
|
end
|
45
54
|
|
@@ -57,12 +66,12 @@ module ActiveSupport
|
|
57
66
|
|
58
67
|
# Returns a <tt>Time</tt> instance that represents the time in +time_zone+.
|
59
68
|
def time
|
60
|
-
@time ||=
|
69
|
+
@time ||= incorporate_utc_offset(@utc, utc_offset)
|
61
70
|
end
|
62
71
|
|
63
72
|
# Returns a <tt>Time</tt> instance of the simultaneous time in the UTC timezone.
|
64
73
|
def utc
|
65
|
-
@utc ||=
|
74
|
+
@utc ||= incorporate_utc_offset(@time, -utc_offset)
|
66
75
|
end
|
67
76
|
alias_method :comparable_time, :utc
|
68
77
|
alias_method :getgm, :utc
|
@@ -104,13 +113,13 @@ module ActiveSupport
|
|
104
113
|
# Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
|
105
114
|
# Time.zone.now.utc? # => false
|
106
115
|
def utc?
|
107
|
-
|
116
|
+
zone == "UTC" || zone == "UCT"
|
108
117
|
end
|
109
118
|
alias_method :gmt?, :utc?
|
110
119
|
|
111
120
|
# Returns the offset from current time to UTC time in seconds.
|
112
121
|
def utc_offset
|
113
|
-
period.
|
122
|
+
period.observed_utc_offset
|
114
123
|
end
|
115
124
|
alias_method :gmt_offset, :utc_offset
|
116
125
|
alias_method :gmtoff, :utc_offset
|
@@ -132,14 +141,14 @@ module ActiveSupport
|
|
132
141
|
# Time.zone = 'Eastern Time (US & Canada)' # => "Eastern Time (US & Canada)"
|
133
142
|
# Time.zone.now.zone # => "EST"
|
134
143
|
def zone
|
135
|
-
period.
|
144
|
+
period.abbreviation
|
136
145
|
end
|
137
146
|
|
138
147
|
# Returns a string of the object's date, time, zone, and offset from UTC.
|
139
148
|
#
|
140
|
-
# Time.zone.now.inspect # => "Thu, 04 Dec 2014 11:00:25 EST -05:00"
|
149
|
+
# Time.zone.now.inspect # => "Thu, 04 Dec 2014 11:00:25.624541392 EST -05:00"
|
141
150
|
def inspect
|
142
|
-
"#{time.strftime('%a, %d %b %Y %H:%M:%S')} #{zone} #{formatted_offset}"
|
151
|
+
"#{time.strftime('%a, %d %b %Y %H:%M:%S.%9N')} #{zone} #{formatted_offset}"
|
143
152
|
end
|
144
153
|
|
145
154
|
# Returns a string of the object's date and time in the ISO 8601 standard
|
@@ -172,12 +181,11 @@ module ActiveSupport
|
|
172
181
|
end
|
173
182
|
end
|
174
183
|
|
175
|
-
def init_with(coder)
|
184
|
+
def init_with(coder) # :nodoc:
|
176
185
|
initialize(coder["utc"], coder["zone"], coder["time"])
|
177
186
|
end
|
178
187
|
|
179
|
-
def encode_with(coder)
|
180
|
-
coder.tag = "!ruby/object:ActiveSupport::TimeWithZone"
|
188
|
+
def encode_with(coder) # :nodoc:
|
181
189
|
coder.map = { "utc" => utc, "zone" => time_zone, "time" => time }
|
182
190
|
end
|
183
191
|
|
@@ -194,25 +202,53 @@ module ActiveSupport
|
|
194
202
|
#
|
195
203
|
# Time.zone.now.rfc2822 # => "Tue, 01 Jan 2013 04:51:39 +0000"
|
196
204
|
def rfc2822
|
197
|
-
|
205
|
+
to_formatted_s(:rfc822)
|
198
206
|
end
|
199
207
|
alias_method :rfc822, :rfc2822
|
200
208
|
|
209
|
+
NOT_SET = Object.new # :nodoc:
|
210
|
+
|
211
|
+
# Returns a string of the object's date and time.
|
212
|
+
def to_s(format = NOT_SET)
|
213
|
+
if format == :db
|
214
|
+
ActiveSupport::Deprecation.warn(
|
215
|
+
"TimeWithZone#to_s(:db) is deprecated. Please use TimeWithZone#to_formatted_s(:db) instead."
|
216
|
+
)
|
217
|
+
utc.to_formatted_s(format)
|
218
|
+
elsif formatter = ::Time::DATE_FORMATS[format]
|
219
|
+
ActiveSupport::Deprecation.warn(
|
220
|
+
"TimeWithZone#to_s(#{format.inspect}) is deprecated. Please use TimeWithZone#to_formatted_s(#{format.inspect}) instead."
|
221
|
+
)
|
222
|
+
formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
|
223
|
+
elsif format == NOT_SET
|
224
|
+
"#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby Time#to_s format
|
225
|
+
else
|
226
|
+
ActiveSupport::Deprecation.warn(
|
227
|
+
"TimeWithZone#to_s(#{format.inspect}) is deprecated. Please use TimeWithZone#to_formatted_s(#{format.inspect}) instead."
|
228
|
+
)
|
229
|
+
"#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby Time#to_s format
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
201
233
|
# Returns a string of the object's date and time.
|
234
|
+
#
|
235
|
+
# This method is aliased to <tt>to_fs</tt>.
|
236
|
+
#
|
202
237
|
# Accepts an optional <tt>format</tt>:
|
203
238
|
# * <tt>:default</tt> - default value, mimics Ruby Time#to_s format.
|
204
239
|
# * <tt>:db</tt> - format outputs time in UTC :db time. See Time#to_formatted_s(:db).
|
205
240
|
# * Any key in <tt>Time::DATE_FORMATS</tt> can be used. See active_support/core_ext/time/conversions.rb.
|
206
|
-
def
|
241
|
+
def to_formatted_s(format = :default)
|
207
242
|
if format == :db
|
208
|
-
utc.
|
243
|
+
utc.to_formatted_s(format)
|
209
244
|
elsif formatter = ::Time::DATE_FORMATS[format]
|
210
245
|
formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
|
211
246
|
else
|
212
|
-
|
247
|
+
# Change to to_s when deprecation is gone.
|
248
|
+
"#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}"
|
213
249
|
end
|
214
250
|
end
|
215
|
-
alias_method :
|
251
|
+
alias_method :to_fs, :to_formatted_s
|
216
252
|
|
217
253
|
# Replaces <tt>%Z</tt> directive with +zone before passing to Time#strftime,
|
218
254
|
# so that zone information is correct.
|
@@ -245,6 +281,20 @@ module ActiveSupport
|
|
245
281
|
time.today?
|
246
282
|
end
|
247
283
|
|
284
|
+
# Returns true if the current object's time falls within
|
285
|
+
# the next day (tomorrow).
|
286
|
+
def tomorrow?
|
287
|
+
time.tomorrow?
|
288
|
+
end
|
289
|
+
alias :next_day? :tomorrow?
|
290
|
+
|
291
|
+
# Returns true if the current object's time falls within
|
292
|
+
# the previous day (yesterday).
|
293
|
+
def yesterday?
|
294
|
+
time.yesterday?
|
295
|
+
end
|
296
|
+
alias :prev_day? :yesterday?
|
297
|
+
|
248
298
|
# Returns true if the current object's time is in the future.
|
249
299
|
def future?
|
250
300
|
utc.future?
|
@@ -263,8 +313,8 @@ module ActiveSupport
|
|
263
313
|
# value as a new TimeWithZone object.
|
264
314
|
#
|
265
315
|
# Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
|
266
|
-
# now = Time.zone.now # => Sun, 02 Nov 2014 01:26:28 EDT -04:00
|
267
|
-
# now + 1000 # => Sun, 02 Nov 2014 01:43:08 EDT -04:00
|
316
|
+
# now = Time.zone.now # => Sun, 02 Nov 2014 01:26:28.725182881 EDT -04:00
|
317
|
+
# now + 1000 # => Sun, 02 Nov 2014 01:43:08.725182881 EDT -04:00
|
268
318
|
#
|
269
319
|
# If we're adding a Duration of variable length (i.e., years, months, days),
|
270
320
|
# move forward from #time, otherwise move forward from #utc, for accuracy
|
@@ -273,8 +323,8 @@ module ActiveSupport
|
|
273
323
|
# For instance, a time + 24.hours will advance exactly 24 hours, while a
|
274
324
|
# time + 1.day will advance 23-25 hours, depending on the day.
|
275
325
|
#
|
276
|
-
# now + 24.hours # => Mon, 03 Nov 2014 00:26:28 EST -05:00
|
277
|
-
# now + 1.day # => Mon, 03 Nov 2014 01:26:28 EST -05:00
|
326
|
+
# now + 24.hours # => Mon, 03 Nov 2014 00:26:28.725182881 EST -05:00
|
327
|
+
# now + 1.day # => Mon, 03 Nov 2014 01:26:28.725182881 EST -05:00
|
278
328
|
def +(other)
|
279
329
|
if duration_of_variable_length?(other)
|
280
330
|
method_missing(:+, other)
|
@@ -287,13 +337,13 @@ module ActiveSupport
|
|
287
337
|
alias_method :in, :+
|
288
338
|
|
289
339
|
# Subtracts an interval of time and returns a new TimeWithZone object unless
|
290
|
-
# the other value
|
340
|
+
# the other value +acts_like?+ time. Then it will return a Float of the difference
|
291
341
|
# between the two times that represents the difference between the current
|
292
342
|
# object's time and the +other+ time.
|
293
343
|
#
|
294
344
|
# Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
|
295
|
-
# now = Time.zone.now # => Mon, 03 Nov 2014 00:26:28 EST -05:00
|
296
|
-
# now - 1000 # => Mon, 03 Nov 2014 00:09:48 EST -05:00
|
345
|
+
# now = Time.zone.now # => Mon, 03 Nov 2014 00:26:28.725182881 EST -05:00
|
346
|
+
# now - 1000 # => Mon, 03 Nov 2014 00:09:48.725182881 EST -05:00
|
297
347
|
#
|
298
348
|
# If subtracting a Duration of variable length (i.e., years, months, days),
|
299
349
|
# move backward from #time, otherwise move backward from #utc, for accuracy
|
@@ -302,8 +352,8 @@ module ActiveSupport
|
|
302
352
|
# For instance, a time - 24.hours will go subtract exactly 24 hours, while a
|
303
353
|
# time - 1.day will subtract 23-25 hours, depending on the day.
|
304
354
|
#
|
305
|
-
# now - 24.hours # => Sun, 02 Nov 2014 01:26:28 EDT -04:00
|
306
|
-
# now - 1.day # => Sun, 02 Nov 2014 00:26:28 EDT -04:00
|
355
|
+
# now - 24.hours # => Sun, 02 Nov 2014 01:26:28.725182881 EDT -04:00
|
356
|
+
# now - 1.day # => Sun, 02 Nov 2014 00:26:28.725182881 EDT -04:00
|
307
357
|
#
|
308
358
|
# If both the TimeWithZone object and the other value act like Time, a Float
|
309
359
|
# will be returned.
|
@@ -325,8 +375,8 @@ module ActiveSupport
|
|
325
375
|
# the result as a new TimeWithZone object.
|
326
376
|
#
|
327
377
|
# Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
|
328
|
-
# now = Time.zone.now # => Mon, 03 Nov 2014 00:26:28 EST -05:00
|
329
|
-
# now.ago(1000) # => Mon, 03 Nov 2014 00:09:48 EST -05:00
|
378
|
+
# now = Time.zone.now # => Mon, 03 Nov 2014 00:26:28.725182881 EST -05:00
|
379
|
+
# now.ago(1000) # => Mon, 03 Nov 2014 00:09:48.725182881 EST -05:00
|
330
380
|
#
|
331
381
|
# If we're subtracting a Duration of variable length (i.e., years, months,
|
332
382
|
# days), move backward from #time, otherwise move backward from #utc, for
|
@@ -336,8 +386,8 @@ module ActiveSupport
|
|
336
386
|
# while <tt>time.ago(1.day)</tt> will move back 23-25 hours, depending on
|
337
387
|
# the day.
|
338
388
|
#
|
339
|
-
# now.ago(24.hours) # => Sun, 02 Nov 2014 01:26:28 EDT -04:00
|
340
|
-
# now.ago(1.day) # => Sun, 02 Nov 2014 00:26:28 EDT -04:00
|
389
|
+
# now.ago(24.hours) # => Sun, 02 Nov 2014 01:26:28.725182881 EDT -04:00
|
390
|
+
# now.ago(1.day) # => Sun, 02 Nov 2014 00:26:28.725182881 EDT -04:00
|
341
391
|
def ago(other)
|
342
392
|
since(-other)
|
343
393
|
end
|
@@ -353,12 +403,12 @@ module ActiveSupport
|
|
353
403
|
# or <tt>:nsec</tt>, not both. Similarly, pass either <tt>:zone</tt> or
|
354
404
|
# <tt>:offset</tt>, not both.
|
355
405
|
#
|
356
|
-
# t = Time.zone.now # => Fri, 14 Apr 2017 11:45:15 EST -05:00
|
357
|
-
# t.change(year: 2020) # => Tue, 14 Apr 2020 11:45:15 EST -05:00
|
358
|
-
# t.change(hour: 12) # => Fri, 14 Apr 2017 12:00:00 EST -05:00
|
359
|
-
# t.change(min: 30) # => Fri, 14 Apr 2017 11:30:00 EST -05:00
|
360
|
-
# t.change(offset: "-10:00") # => Fri, 14 Apr 2017 11:45:15 HST -10:00
|
361
|
-
# t.change(zone: "Hawaii") # => Fri, 14 Apr 2017 11:45:15 HST -10:00
|
406
|
+
# t = Time.zone.now # => Fri, 14 Apr 2017 11:45:15.116992711 EST -05:00
|
407
|
+
# t.change(year: 2020) # => Tue, 14 Apr 2020 11:45:15.116992711 EST -05:00
|
408
|
+
# t.change(hour: 12) # => Fri, 14 Apr 2017 12:00:00.116992711 EST -05:00
|
409
|
+
# t.change(min: 30) # => Fri, 14 Apr 2017 11:30:00.116992711 EST -05:00
|
410
|
+
# t.change(offset: "-10:00") # => Fri, 14 Apr 2017 11:45:15.116992711 HST -10:00
|
411
|
+
# t.change(zone: "Hawaii") # => Fri, 14 Apr 2017 11:45:15.116992711 HST -10:00
|
362
412
|
def change(options)
|
363
413
|
if options[:zone] && options[:offset]
|
364
414
|
raise ArgumentError, "Can't change both :offset and :zone at the same time: #{options.inspect}"
|
@@ -391,14 +441,14 @@ module ActiveSupport
|
|
391
441
|
# accuracy when moving across DST boundaries.
|
392
442
|
#
|
393
443
|
# Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
|
394
|
-
# now = Time.zone.now # => Sun, 02 Nov 2014 01:26:28 EDT -04:00
|
395
|
-
# now.advance(seconds: 1) # => Sun, 02 Nov 2014 01:26:29 EDT -04:00
|
396
|
-
# now.advance(minutes: 1) # => Sun, 02 Nov 2014 01:27:28 EDT -04:00
|
397
|
-
# now.advance(hours: 1) # => Sun, 02 Nov 2014 01:26:28 EST -05:00
|
398
|
-
# now.advance(days: 1) # => Mon, 03 Nov 2014 01:26:28 EST -05:00
|
399
|
-
# now.advance(weeks: 1) # => Sun, 09 Nov 2014 01:26:28 EST -05:00
|
400
|
-
# now.advance(months: 1) # => Tue, 02 Dec 2014 01:26:28 EST -05:00
|
401
|
-
# now.advance(years: 1) # => Mon, 02 Nov 2015 01:26:28 EST -05:00
|
444
|
+
# now = Time.zone.now # => Sun, 02 Nov 2014 01:26:28.558049687 EDT -04:00
|
445
|
+
# now.advance(seconds: 1) # => Sun, 02 Nov 2014 01:26:29.558049687 EDT -04:00
|
446
|
+
# now.advance(minutes: 1) # => Sun, 02 Nov 2014 01:27:28.558049687 EDT -04:00
|
447
|
+
# now.advance(hours: 1) # => Sun, 02 Nov 2014 01:26:28.558049687 EST -05:00
|
448
|
+
# now.advance(days: 1) # => Mon, 03 Nov 2014 01:26:28.558049687 EST -05:00
|
449
|
+
# now.advance(weeks: 1) # => Sun, 09 Nov 2014 01:26:28.558049687 EST -05:00
|
450
|
+
# now.advance(months: 1) # => Tue, 02 Dec 2014 01:26:28.558049687 EST -05:00
|
451
|
+
# now.advance(years: 1) # => Mon, 02 Nov 2015 01:26:28.558049687 EST -05:00
|
402
452
|
def advance(options)
|
403
453
|
# If we're advancing a value of variable length (i.e., years, weeks, months, days), advance from #time,
|
404
454
|
# otherwise advance from #utc, for accuracy when moving across DST boundaries
|
@@ -420,13 +470,13 @@ module ActiveSupport
|
|
420
470
|
# Returns Array of parts of Time in sequence of
|
421
471
|
# [seconds, minutes, hours, day, month, year, weekday, yearday, dst?, zone].
|
422
472
|
#
|
423
|
-
# now = Time.zone.now # => Tue, 18 Aug 2015 02:29:27 UTC +00:00
|
473
|
+
# now = Time.zone.now # => Tue, 18 Aug 2015 02:29:27.485278555 UTC +00:00
|
424
474
|
# now.to_a # => [27, 29, 2, 18, 8, 2015, 2, 230, false, "UTC"]
|
425
475
|
def to_a
|
426
476
|
[time.sec, time.min, time.hour, time.day, time.mon, time.year, time.wday, time.yday, dst?, zone]
|
427
477
|
end
|
428
478
|
|
429
|
-
# Returns the object's date and time as a floating
|
479
|
+
# Returns the object's date and time as a floating-point number of seconds
|
430
480
|
# since the Epoch (January 1, 1970 00:00 UTC).
|
431
481
|
#
|
432
482
|
# Time.zone.now.to_f # => 1417709320.285418
|
@@ -520,10 +570,20 @@ module ActiveSupport
|
|
520
570
|
def method_missing(sym, *args, &block)
|
521
571
|
wrap_with_time_zone time.__send__(sym, *args, &block)
|
522
572
|
rescue NoMethodError => e
|
523
|
-
raise e, e.message.sub(time.inspect, inspect), e.backtrace
|
573
|
+
raise e, e.message.sub(time.inspect, inspect).sub("Time", "ActiveSupport::TimeWithZone"), e.backtrace
|
524
574
|
end
|
525
575
|
|
526
576
|
private
|
577
|
+
SECONDS_PER_DAY = 86400
|
578
|
+
|
579
|
+
def incorporate_utc_offset(time, offset)
|
580
|
+
if time.kind_of?(Date)
|
581
|
+
time + Rational(offset, SECONDS_PER_DAY)
|
582
|
+
else
|
583
|
+
time + offset
|
584
|
+
end
|
585
|
+
end
|
586
|
+
|
527
587
|
def get_period_and_ensure_valid_local_time(period)
|
528
588
|
# we don't want a Time.local instance enforcing its own DST rules as well,
|
529
589
|
# so transfer time values to a utc constructor if necessary
|
@@ -544,7 +604,7 @@ module ActiveSupport
|
|
544
604
|
end
|
545
605
|
|
546
606
|
def duration_of_variable_length?(obj)
|
547
|
-
ActiveSupport::Duration === obj && obj.
|
607
|
+
ActiveSupport::Duration === obj && obj.variable?
|
548
608
|
end
|
549
609
|
|
550
610
|
def wrap_with_time_zone(time)
|
@@ -559,3 +619,8 @@ module ActiveSupport
|
|
559
619
|
end
|
560
620
|
end
|
561
621
|
end
|
622
|
+
|
623
|
+
# These prevent Psych from calling `ActiveSupport::TimeWithZone.name`
|
624
|
+
# and triggering the deprecation warning about the change in Rails 7.1.
|
625
|
+
YAML.load_tags["!ruby/object:ActiveSupport::TimeWithZone"] = "ActiveSupport::TimeWithZone"
|
626
|
+
YAML.dump_tags[ActiveSupport::TimeWithZone] = "!ruby/object:ActiveSupport::TimeWithZone"
|
@@ -203,7 +203,7 @@ module ActiveSupport
|
|
203
203
|
end
|
204
204
|
|
205
205
|
def find_tzinfo(name)
|
206
|
-
TZInfo::Timezone.
|
206
|
+
TZInfo::Timezone.get(MAPPING[name] || name)
|
207
207
|
end
|
208
208
|
|
209
209
|
alias_method :create, :new
|
@@ -229,12 +229,16 @@ module ActiveSupport
|
|
229
229
|
# Returns +nil+ if no such time zone is known to the system.
|
230
230
|
def [](arg)
|
231
231
|
case arg
|
232
|
+
when self
|
233
|
+
arg
|
232
234
|
when String
|
233
235
|
begin
|
234
236
|
@lazy_zones_map[arg] ||= create(arg)
|
235
237
|
rescue TZInfo::InvalidTimezoneIdentifier
|
236
238
|
nil
|
237
239
|
end
|
240
|
+
when TZInfo::Timezone
|
241
|
+
@lazy_zones_map[arg.name] ||= create(arg.name, nil, arg)
|
238
242
|
when Numeric, ActiveSupport::Duration
|
239
243
|
arg *= 3600 if arg.abs <= 13
|
240
244
|
all.find { |z| z.utc_offset == arg.to_i }
|
@@ -256,7 +260,7 @@ module ActiveSupport
|
|
256
260
|
@country_zones[code] ||= load_country_zones(code)
|
257
261
|
end
|
258
262
|
|
259
|
-
def clear
|
263
|
+
def clear # :nodoc:
|
260
264
|
@lazy_zones_map = Concurrent::Map.new
|
261
265
|
@country_zones = Concurrent::Map.new
|
262
266
|
@zones = nil
|
@@ -273,7 +277,7 @@ module ActiveSupport
|
|
273
277
|
memo
|
274
278
|
end
|
275
279
|
else
|
276
|
-
create(tz_id, nil, TZInfo::Timezone.
|
280
|
+
create(tz_id, nil, TZInfo::Timezone.get(tz_id))
|
277
281
|
end
|
278
282
|
end.sort!
|
279
283
|
end
|
@@ -302,11 +306,7 @@ module ActiveSupport
|
|
302
306
|
|
303
307
|
# Returns the offset of this time zone from UTC in seconds.
|
304
308
|
def utc_offset
|
305
|
-
|
306
|
-
@utc_offset
|
307
|
-
else
|
308
|
-
tzinfo.current_period.utc_offset if tzinfo && tzinfo.current_period
|
309
|
-
end
|
309
|
+
@utc_offset || tzinfo&.current_period&.base_utc_offset
|
310
310
|
end
|
311
311
|
|
312
312
|
# Returns a formatted string of the offset from UTC, or an alternative
|
@@ -334,6 +334,13 @@ module ActiveSupport
|
|
334
334
|
re === name || re === MAPPING[name]
|
335
335
|
end
|
336
336
|
|
337
|
+
# Compare #name and TZInfo identifier to a supplied regexp, returning +true+
|
338
|
+
# if a match is found.
|
339
|
+
def match?(re)
|
340
|
+
(re == name) || (re == MAPPING[name]) ||
|
341
|
+
((Regexp === re) && (re.match?(name) || re.match?(MAPPING[name])))
|
342
|
+
end
|
343
|
+
|
337
344
|
# Returns a textual representation of this time zone.
|
338
345
|
def to_s
|
339
346
|
"(GMT#{formatted_offset}) #{name}"
|
@@ -378,14 +385,28 @@ module ActiveSupport
|
|
378
385
|
# If the string is invalid then an +ArgumentError+ will be raised unlike +parse+
|
379
386
|
# which usually returns +nil+ when given an invalid date string.
|
380
387
|
def iso8601(str)
|
388
|
+
# Historically `Date._iso8601(nil)` returns `{}`, but in the `date` gem versions `3.2.1`, `3.1.2`, `3.0.2`,
|
389
|
+
# and `2.0.1`, `Date._iso8601(nil)` raises `TypeError` https://github.com/ruby/date/issues/39
|
390
|
+
# Future `date` releases are expected to revert back to the original behavior.
|
391
|
+
raise ArgumentError, "invalid date" if str.nil?
|
392
|
+
|
381
393
|
parts = Date._iso8601(str)
|
382
394
|
|
383
|
-
|
395
|
+
year = parts.fetch(:year)
|
396
|
+
|
397
|
+
if parts.key?(:yday)
|
398
|
+
ordinal_date = Date.ordinal(year, parts.fetch(:yday))
|
399
|
+
month = ordinal_date.month
|
400
|
+
day = ordinal_date.day
|
401
|
+
else
|
402
|
+
month = parts.fetch(:mon)
|
403
|
+
day = parts.fetch(:mday)
|
404
|
+
end
|
384
405
|
|
385
406
|
time = Time.new(
|
386
|
-
|
387
|
-
|
388
|
-
|
407
|
+
year,
|
408
|
+
month,
|
409
|
+
day,
|
389
410
|
parts.fetch(:hour, 0),
|
390
411
|
parts.fetch(:min, 0),
|
391
412
|
parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0),
|
@@ -397,6 +418,9 @@ module ActiveSupport
|
|
397
418
|
else
|
398
419
|
TimeWithZone.new(nil, self, time)
|
399
420
|
end
|
421
|
+
|
422
|
+
rescue Date::Error, KeyError
|
423
|
+
raise ArgumentError, "invalid date"
|
400
424
|
end
|
401
425
|
|
402
426
|
# Method for creating new ActiveSupport::TimeWithZone instance in time zone
|
@@ -500,10 +524,17 @@ module ActiveSupport
|
|
500
524
|
end
|
501
525
|
|
502
526
|
# Adjust the given time to the simultaneous time in the time zone
|
503
|
-
# represented by +self+. Returns a
|
504
|
-
# ActiveSupport::TimeWithZone instance, use
|
527
|
+
# represented by +self+. Returns a local time with the appropriate offset
|
528
|
+
# -- if you want an ActiveSupport::TimeWithZone instance, use
|
529
|
+
# Time#in_time_zone() instead.
|
530
|
+
#
|
531
|
+
# As of tzinfo 2, utc_to_local returns a Time with a non-zero utc_offset.
|
532
|
+
# See the +utc_to_local_returns_utc_offset_times+ config for more info.
|
505
533
|
def utc_to_local(time)
|
506
|
-
tzinfo.utc_to_local(time)
|
534
|
+
tzinfo.utc_to_local(time).yield_self do |t|
|
535
|
+
ActiveSupport.utc_to_local_returns_utc_offset_times ?
|
536
|
+
t : Time.utc(t.year, t.month, t.day, t.hour, t.min, t.sec, t.sec_fraction * 1_000_000)
|
537
|
+
end
|
507
538
|
end
|
508
539
|
|
509
540
|
# Adjust the given time to the simultaneous time in UTC. Returns a
|
@@ -524,15 +555,15 @@ module ActiveSupport
|
|
524
555
|
tzinfo.period_for_local(time, dst) { |periods| periods.last }
|
525
556
|
end
|
526
557
|
|
527
|
-
def periods_for_local(time)
|
558
|
+
def periods_for_local(time) # :nodoc:
|
528
559
|
tzinfo.periods_for_local(time)
|
529
560
|
end
|
530
561
|
|
531
|
-
def init_with(coder)
|
562
|
+
def init_with(coder) # :nodoc:
|
532
563
|
initialize(coder["name"])
|
533
564
|
end
|
534
565
|
|
535
|
-
def encode_with(coder)
|
566
|
+
def encode_with(coder) # :nodoc:
|
536
567
|
coder.tag = "!ruby/object:#{self.class}"
|
537
568
|
coder.map = { "name" => tzinfo.name }
|
538
569
|
end
|
@@ -5,7 +5,7 @@ require "active_support/core_ext/object/blank"
|
|
5
5
|
require "stringio"
|
6
6
|
|
7
7
|
module ActiveSupport
|
8
|
-
module XmlMini_LibXML
|
8
|
+
module XmlMini_LibXML # :nodoc:
|
9
9
|
extend self
|
10
10
|
|
11
11
|
# Parse an XML Document string or IO into a simple hash using libxml.
|
@@ -25,15 +25,15 @@ module ActiveSupport
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
module LibXML
|
29
|
-
module Conversions
|
30
|
-
module Document
|
28
|
+
module LibXML # :nodoc:
|
29
|
+
module Conversions # :nodoc:
|
30
|
+
module Document # :nodoc:
|
31
31
|
def to_hash
|
32
32
|
root.to_hash
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
module Node
|
36
|
+
module Node # :nodoc:
|
37
37
|
CONTENT_ROOT = "__content__"
|
38
38
|
|
39
39
|
# Convert XML document to hash.
|
@@ -10,7 +10,7 @@ require "active_support/core_ext/object/blank"
|
|
10
10
|
require "stringio"
|
11
11
|
|
12
12
|
module ActiveSupport
|
13
|
-
module XmlMini_Nokogiri
|
13
|
+
module XmlMini_Nokogiri # :nodoc:
|
14
14
|
extend self
|
15
15
|
|
16
16
|
# Parse an XML Document string or IO into a simple hash using libxml / nokogiri.
|
@@ -30,14 +30,14 @@ module ActiveSupport
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
module Conversions
|
34
|
-
module Document
|
33
|
+
module Conversions # :nodoc:
|
34
|
+
module Document # :nodoc:
|
35
35
|
def to_hash
|
36
36
|
root.to_hash
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
module Node
|
40
|
+
module Node # :nodoc:
|
41
41
|
CONTENT_ROOT = "__content__"
|
42
42
|
|
43
43
|
# Convert XML document to hash.
|
@@ -5,7 +5,7 @@ require "active_support/core_ext/object/blank"
|
|
5
5
|
require "stringio"
|
6
6
|
|
7
7
|
module ActiveSupport
|
8
|
-
module XmlMini_REXML
|
8
|
+
module XmlMini_REXML # :nodoc:
|
9
9
|
extend self
|
10
10
|
|
11
11
|
CONTENT_KEY = "__content__"
|
@@ -25,7 +25,7 @@ module ActiveSupport
|
|
25
25
|
if data.eof?
|
26
26
|
{}
|
27
27
|
else
|
28
|
-
|
28
|
+
require_rexml unless defined?(REXML::Document)
|
29
29
|
doc = REXML::Document.new(data)
|
30
30
|
|
31
31
|
if doc.root
|
@@ -38,6 +38,13 @@ module ActiveSupport
|
|
38
38
|
end
|
39
39
|
|
40
40
|
private
|
41
|
+
def require_rexml
|
42
|
+
silence_warnings { require "rexml/document" }
|
43
|
+
rescue LoadError => e
|
44
|
+
$stderr.puts "You don't have rexml installed in your application. Please add it to your Gemfile and run bundle install"
|
45
|
+
raise e
|
46
|
+
end
|
47
|
+
|
41
48
|
# Convert an XML element and merge into the hash
|
42
49
|
#
|
43
50
|
# hash::
|
@@ -19,7 +19,7 @@ module ActiveSupport
|
|
19
19
|
|
20
20
|
# This module decorates files deserialized using Hash.from_xml with
|
21
21
|
# the <tt>original_filename</tt> and <tt>content_type</tt> methods.
|
22
|
-
module FileLike
|
22
|
+
module FileLike # :nodoc:
|
23
23
|
attr_writer :original_filename, :content_type
|
24
24
|
|
25
25
|
def original_filename
|
@@ -50,10 +50,11 @@ module ActiveSupport
|
|
50
50
|
"Hash" => "hash"
|
51
51
|
}
|
52
52
|
end
|
53
|
+
TYPE_NAMES["ActiveSupport::TimeWithZone"] = TYPE_NAMES["Time"]
|
53
54
|
|
54
55
|
FORMATTING = {
|
55
56
|
"symbol" => Proc.new { |symbol| symbol.to_s },
|
56
|
-
"date" => Proc.new { |date| date.
|
57
|
+
"date" => Proc.new { |date| date.to_formatted_s(:db) },
|
57
58
|
"dateTime" => Proc.new { |time| time.xmlschema },
|
58
59
|
"binary" => Proc.new { |binary| ::Base64.encode64(binary) },
|
59
60
|
"yaml" => Proc.new { |yaml| yaml.to_yaml }
|
@@ -180,11 +181,11 @@ module ActiveSupport
|
|
180
181
|
end
|
181
182
|
|
182
183
|
def current_thread_backend
|
183
|
-
|
184
|
+
IsolatedExecutionState[:xml_mini_backend]
|
184
185
|
end
|
185
186
|
|
186
187
|
def current_thread_backend=(name)
|
187
|
-
|
188
|
+
IsolatedExecutionState[:xml_mini_backend] = name && cast_backend_name_to_module(name)
|
188
189
|
end
|
189
190
|
|
190
191
|
def cast_backend_name_to_module(name)
|