Rails 4.2.10 (September 27, 2017) ##
Rails 4.2.10 (September 27, 2017)
- No changes.
Rails 4.2.9 (June 26, 2017)
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
Rails 4.2.8 (February 21, 2017)
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
Rails 4.2.7 (July 12, 2016)
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
Rails 4.2.6 (March 07, 2016)
- No changes.
Rails 4.2.5.2 (February 26, 2016)
- No changes.
Rails 4.2.5.1 (January 25, 2015)
- No changes.
Rails 4.2.5 (November 12, 2015)
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
Rails 4.2.4 (August 24, 2015)
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
Rails 4.2.3 (June 25, 2015)
Fix a range of values for parameters of the Time#change
Nikolay Kondratyev
Add some missing
require 'active_support/deprecation'Akira Matsuda
Rails 4.2.2 (June 16, 2015)
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
Rails 4.2.1 (March 19, 2015)
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
Rails 4.2.0 (December 20, 2014)
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.