- No changes.
- No changes.
- No changes.
- No changes.
- No changes.
-
Fixed bug in
DateAndTime::Compatibility#to_timethat caused it to raiseRuntimeError: can't modify frozen Timewhen called on any frozenTime. Properly pass through the frozenTimeorActiveSupport::TimeWithZoneobject when calling#to_time.Kevin McPhillips & Andrew White
-
Restore the return type of
DateTime#utcIn Rails 5.0 the return type of
DateTime#utcwas changed toTimeto be consistent with the newDateTime#localtimemethod. When these changes were backported in #27553 this inadvertently changed the return type in a patcn release. SinceDateTime#localtimewas new in Rails 4.2.8 it's okay to restore the return type ofDateTime#utcbut keepDateTime#localtimeas returningTimewithout breaking backwards compatibility.Andrew White
-
In Core Extensions, make
MarshalWithAutoloading#loadpass through the second, optional argument forMarshal#load( source [, proc] ). This way we don't have to doMarshal.method(:load).super_method.call(sourse, proc)just to be able to pass a proc.Jeff Latz
-
Cache
ActiveSupport::TimeWithZone#to_datetimebefore freezing.Adam Rice
-
AS::Testing::TimeHelpers#travel_tonow changesDateTime.nowas well asTime.nowandDate.today.Yuki Nishijima
-
Make
getlocalandgetutcalways return instances ofTimeforActiveSupport::TimeWithZoneandDateTime. This eliminates a possible stack level too deep error into_timewhereActiveSupport::TimeWithZonewas wrapping aDateTimeinstance. As a consequence of this the internal time value inActiveSupport::TimeWithZoneis now always an instance ofTimein the UTC timezone, whether that's as the UTC time directly or a representation of the local time in the timezone. There should be no consequences of this internal change and if there are it's a bug due to leaky abstractions.Andrew White
-
Add
DateTime#subsecto return the fraction of a second as aRational.Andrew White
-
Add additional aliases for
DateTime#utcto mirror the ones onActiveSupport::TimeWithZoneandTime.Andrew White
-
Add
DateTime#localtimeto return an instance ofTimein the system's local timezone. Also aliased togetlocal.Andrew White, Yuichiro Kaneko
-
Add
Time#sec_fractionto return the fraction of a second as aRational.Andrew White
-
Add
ActiveSupport.to_time_preserves_timezoneconfig option to control howto_timehandles timezones. In Ruby 2.4+ the behavior will change from converting to the local system timezone, to preserving the timezone of the receiver. This config option defaults to false so that apps made with earlier versions of Rails are not affected when upgrading, e.g:>> ENV['TZ'] = 'US/Eastern' >> "2016-04-23T10:23:12.000Z".to_time => "2016-04-23T06:23:12.000-04:00" >> ActiveSupport.to_time_preserves_timezone = true >> "2016-04-23T10:23:12.000Z".to_time => "2016-04-23T10:23:12.000Z"Fixes #24617.
Andrew White
-
Add
init_withtoActiveSupport::TimeWithZoneandActiveSupport::TimeZoneIt is helpful to be able to run apps concurrently written in successive versions of Rails to aid migration, e.g. run Rails 4.2 and 5.0 variants of your application at the same time to carry out A/B testing.
To do this serialization formats need to be cross compatible and the change in 3aa26cf didn't meet this criteria because the Psych loader checks for the existence of
init_withbefore setting the instance variables and the wrapping behavior ofActiveSupport::TimeWithZonetries to see if theTimeinstance responds toinit_withbefore the@timevariable is set.To fix this we backported just the
init_withbehavior from the change in 3aa26cf. If the revived instance is then written out to YAML again it will revert to the default Rails 4.2 behavior of converting it to a UTC timestamp string.Fixes #26296.
Andrew White
-
Fix
ActiveSupport::TimeWithZone#inacross DST boundaries.Previously calls to
inwere being sent to the non-DST aware methodTime#sinceviamethod_missing. It is now aliased to the DST awareActiveSupport::TimeWithZone#sincewhich handles transitions across DST boundaries, e.g:Time.zone = "US/Eastern" t = Time.zone.local(2016,11,6,1) # => Sun, 06 Nov 2016 01:00:00 EDT -05:00 t.in(1.hour) # => Sun, 06 Nov 2016 01:00:00 EST -05:00Fixes #26580.
Thomas Balthazar
-
Fixed
ActiveSupport::Logger.broadcastso that calls to#silencenow properly delegate to all loggers. Silencing now properly suppresses logging to both the log and the console.Kevin McPhillips
-
Backported
ActiveSupport::LoggerThreadSafeLevel. Assigning theRails.logger.levelis now thread safe.Kevin McPhillips
-
Fixed a problem with ActiveSupport::SafeBuffer.titleize calling capitalize on nil.
Brian McManus
-
Time zones: Ensure that the UTC offset reflects DST changes that occurred since the app started. Removes UTC offset caching, reducing performance, but this is still relatively quick and isn't in any hot paths.
Alexey Shein
-
Prevent
Marshal.loadfrom looping infinitely when trying to autoload a constant which resolves to a different name.Olek Janiszewski
- No changes.
- No changes.
- No changes.
-
Fix
TimeWithZone#eql?to properly handleTimeWithZonecreated fromDateTime: twz = DateTime.now.in_time_zone twz.eql?(twz.dup) => trueFixes #14178.
Roque Pinel
-
Handle invalid UTF-8 characters in
MessageVerifier.verify.Roque Pinel, Grey Baker
-
Fix a
SystemStackErrorwhen encoding anEnumerablewithjsongem and with the Active Support JSON encoder loaded.Fixes #20775.
Sammy Larbi, Prathamesh Sonpatki
-
Fix not calling
#defaultonHashWithIndifferentAcess#to_hashwhen onlydefault_procis set, which could raise.Simon Eskildsen
-
Fix setting
default_proconHashWithIndifferentAccess#dupSimon Eskildsen
-
Fix a range of values for parameters of the Time#change
Nikolay Kondratyev
-
Add some missing
require 'active_support/deprecation'Akira Matsuda
-
Fix XSS vulnerability in
ActiveSupport::JSON.encodemethod.CVE-2015-3226.
Rafael Mendonça França
-
Fix denial of service vulnerability in the XML processing.
CVE-2015-3227.
Aaron Patterson
-
Fixed a problem where String#truncate_words would get stuck with a complex string.
Henrik Nygren
-
Fixed a roundtrip problem with AS::SafeBuffer where primitive-like strings will be dumped as primitives:
Before:
YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello" YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => true YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => false YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => 1 YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => 1.1After:
YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello" YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => "true" YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => "false" YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => "1" YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => "1.1"Godfrey Chan
-
Replace fixed
:enwithI18n.default_localeinDuration#inspect.Dominik Masur
-
Add missing time zone definitions for Russian Federation and sync them with
zone.tabfile from tzdata version 2014j (latest).Andrey Novikov
-
The decorated
loadandrequiremethods are now kept private.Fixes #17553.
Xavier Noria
-
String#removeandString#remove!accept multiple arguments.Pavel Pravosud
-
TimeWithZone#strftimenow delegates every directive toTime#strftimeexcept for '%Z', it also now correctly handles escaped '%' characters placed just before time zone related directives.Pablo Herrero
-
Corrected
Inflector#underscorehandling of multiple successive acroynms.James Le Cuirot
-
Delegation now works with ruby reserved words passed to
:tooption.Fixes #16956.
Agis Anastasopoulos
-
Added method
#eql?toActiveSupport::Duration, in addition to#==.Currently, the following returns
false, contrary to expectation:1.minute.eql?(1.minute)Adding method
#eql?will make this behave like expected. Method#eql?is just a bit stricter than#==, as it checks whether the argument is also a duration. Their parts may be different though.1.minute.eql?(60.seconds) # => true 1.minute.eql?(60) # => falseJoost Lubach
-
Time#changecan now change nanoseconds (:nsec) as a higher-precision alternative to microseconds (:usec).Agis Anastasooulos
-
MessageVerifier.newraises an appropriate exception if the secret isnil. This preventsMessageVerifier#generatefrom raising a cryptic error later on.Kostiantyn Kahanskyi
-
Introduced new configuration option
active_support.test_orderfor specifying the order in which test cases are executed. This option currently defaults to:sortedbut will be changed to:randomin Rails 5.0.Akira Matsuda, Godfrey Chan
-
Fixed a bug in
Inflector#underscorewhere acroynms in nested constant names are incorrectly parsed as camelCase.Fixes #8015.
Fred Wu, Matthew Draper
-
Make
Time#changethrow an exception if the:usecoption is out of range and the time has an offset other than UTC or local.Agis Anastasopoulos
-
Methodobjects now report themselves as notduplicable?. This allows hashes and arrays containingMethodobjects to bedeep_duped.Peter Jaros
-
determine_constant_from_test_namedoes no longer shadowNameErrors which happens during constant autoloading.Fixes #9933.
Guo Xiang Tan
-
Added instance_eval version to Object#try and Object#try!, so you can do this:
person.try { name.first }instead of:
person.try { |person| person.name.first }DHH, Ari Pollak
-
Fix the
ActiveSupport::Duration#instance_of?method to return the right value with the class itself since it was previously delegated to the internal value.Robin Dupret
-
Fix rounding errors with
#travel_toby resetting the usec on any passed time to zero, so we only travel with per-second precision, not anything deeper than that.DHH
-
Fix DateTime comparison with
DateTime::Infinityobject.Rafael Mendonça França
-
Added Object#itself which returns the object itself. Useful when dealing with a chaining scenario, like Active Record scopes:
Event.public_send(state.presence_in([ :trashed, :drafted ]) || :itself).order(:created_at)DHH
-
Object#with_optionsexecutes block in merging option context when explicit receiver in not passed.Pavel Pravosud
-
Fixed a compatibility issue with the
Ojgem when cherry-picking the fileactive_support/core_ext/object/jsonwithout requiringactive_support/json.Fixes #16131.
Godfrey Chan
-
Make
Hash#with_indifferent_accesscopy the default proc too.arthurnn, Xanders
-
Add
String#truncate_wordsto truncate a string by a number of words.Mohamed Osama
-
Deprecate
captureandquietly.These methods are not thread safe and may cause issues when used in threaded environments. To avoid problems we are deprecating them.
Tom Meier
-
DateTime#to_fnow preserves the fractional seconds instead of always rounding to.0.Fixes #15994.
John Paul Ashenfelter
-
Add
Hash#transform_valuesto simplify a common pattern where the values of a hash must change, but the keys are left the same.Sean Griffin
-
Always instrument
ActiveSupport::Cache.Since
ActiveSupport::Notificationsonly instruments items when there are attached subscribers, we don't need to disable instrumentation.Peter Wagenet
-
Make the
apply_inflectionsmethod case-insensitive when checking whether a word is uncountable or not.Robin Dupret
-
Make Dependencies pass a name to NameError error.
arthurnn
-
Fixed
ActiveSupport::Cache::FileStoreexploding with long paths.Adam Panzer, Michael Grosser
-
Fixed
ActiveSupport::TimeWithZone#-so precision is not unnecessarily lost when working with objects with a nanosecond component.ActiveSupport::TimeWithZone#-should return the same result as if we were usingTime#-:Time.now.end_of_day - Time.now.beginning_of_day # => 86399.999999999Before:
Time.zone.now.end_of_day.nsec # => 999999999 Time.zone.now.end_of_day - Time.zone.now.beginning_of_day # => 86400.0After:
Time.zone.now.end_of_day - Time.zone.now.beginning_of_day # => 86399.999999999Gordon Chan
-
Fixed precision error in NumberHelper when using Rationals.
Before:
ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2 # => "330.00"After:
ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2 # => "333.33"See #15379.
Juanjo Bazán
-
Removed deprecated
Numeric#agoand friendsReplacements:
5.ago => 5.seconds.ago 5.until => 5.seconds.until 5.since => 5.seconds.since 5.from_now => 5.seconds.from_nowSee #12389 for the history and rationale behind this.
Godfrey Chan
-
DateTime
advancenow supports partial days.Before:
DateTime.now.advance(days: 1, hours: 12)After:
DateTime.now.advance(days: 1.5)Fixes #12005.
Shay Davidson
-
Hash#deep_transform_keysandHash#deep_transform_keys!now transform hashes in nested arrays. This change also applies toHash#deep_stringify_keys,Hash#deep_stringify_keys!,Hash#deep_symbolize_keysandHash#deep_symbolize_keys!.OZAWA Sakuro
-
Fixed confusing
DelegationErrorinModule#delegate.See #15186.
Vladimir Yarotsky
-
Fixed
ActiveSupport::Subscriberso that no duplicate subscriber is created when a subscriber method is redefined.Dennis Schön
-
Remove deprecated string based terminators for
ActiveSupport::Callbacks.Eileen M. Uchitelle
-
Fixed an issue when using
ActiveSupport::NumberHelper::NumberToDelimitedConverterto convert a value that is anActiveSupport::SafeBufferintroduced in 2da9d67.See #15064.
Mark J. Titorenko
-
TimeZone#parsedefaults the day of the month to '1' if any other date components are specified. This is more consistent with the behavior ofTime#parse.Ulysse Carion
-
humanizestrips leading underscores, if any.Before:
'_id'.humanize # => ""After:
'_id'.humanize # => "Id"Xavier Noria
-
Fixed backward compatibility issues introduced in 326e652.
Empty Hash or Array should not be present in serialization result.
{a: []}.to_query # => "" {a: {}}.to_query # => ""For more info see #14948.
Bogdan Gusiev
-
Add
Digest::UUID::uuid_v3andDigest::UUID::uuid_v5to support stable UUID fixtures on PostgreSQL.Roderick van Domburg
-
Fixed
ActiveSupport::Duration#eql?so that1.second.eql?(1.second)is true.This fixes the current situation of:
1.second.eql?(1.second) # => falseeql?also requires that the other object is anActiveSupport::Duration. This requirement makesActiveSupport::Duration's behavior consistent with the behavior of Ruby's numeric types:1.eql?(1.0) # => false 1.0.eql?(1) # => false 1.second.eql?(1) # => false (was true) 1.eql?(1.second) # => false { 1 => "foo", 1.0 => "bar" } # => { 1 => "foo", 1.0 => "bar" } { 1 => "foo", 1.second => "bar" } # now => { 1 => "foo", 1.second => "bar" } # was => { 1 => "bar" }And though the behavior of these hasn't changed, for reference:
1 == 1.0 # => true 1.0 == 1 # => true 1 == 1.second # => true 1.second == 1 # => trueEmily Dobervich
-
ActiveSupport::SafeBuffer#prependacts likeString#prependand modifies instance in-place, returning self.ActiveSupport::SafeBuffer#prepend!is deprecated.Pavel Pravosud
-
HashWithIndifferentAccessbetter respects#to_hashon objects it receives. In particular,.new,#update,#merge, and#replaceaccept objects which respond to#to_hash, even if those objects are not hashes directly.Peter Jaros
-
Deprecate
Class#superclass_delegating_accessor, useClass#class_attributeinstead.Akshay Vishnoi
-
Ensure classes which
include Enumerableget#to_jsonin addition to#as_json.Sammy Larbi
-
Change the signature of
fetch_multito return a hash rather than an array. This makes it consistent with the output ofread_multi.Parker Selbert
-
Introduce
Concern#class_methodsas a sleek alternative to clunkymodule ClassMethods. AddKernel#concernto define at the toplevel without chunkymodule Foo; extend ActiveSupport::Concernboilerplate.# app/models/concerns/authentication.rb concern :Authentication do included do after_create :generate_private_key end class_methods do def authenticate(credentials) # ... end end def generate_private_key # ... end end # app/models/user.rb class User < ActiveRecord::Base include Authentication endJeremy Kemper
Please check 4-1-stable for previous changes.