なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2016/11/01)

2016/11/01分のコミットです。

CHANGELOGにのったコミットは以下の通りです。

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md


allow ActiveRecord::Core#slice to use array arg

activerecord/lib/active_record/core.rbの修正です。

ActiveRecord::Core#sliceの引数にArrayを渡せるよう修正しています。メソッドの中で引数をflattenで展開してから使用するようにしています。

    def slice(*methods)
-      Hash[methods.map! { |method| [method, public_send(method)] }].with_indifferent_access
+      Hash[methods.flatten.map! { |method| [method, public_send(method)] }].with_indifferent_access
     end

Ensure duration parsing is consistent across DST changes

activesupport/lib/active_support/duration.rbの修正です。

ActiveSupport::Duration.parse が、DSTをまたぐ期間を指定した場合に、正しい値を返さないバグがあったのを修正しています。

# before
d = ActiveSupport::Duration.parse("P7D") #=> 7 days and 0 hours
d == 1.week #=> false
1.week.to_i #=> 604800
d.to_i #=> 608400

# after
d = ActiveSupport::Duration.parse("P7D")
d == 1.week #=> true
1.week.to_i #=> 604800
d.to_i #=> 604800

修正内容は下記の通り

+   EPOCH = ::Time.utc(2000)

    def self.parse(iso8601duration)
       parts = ISO8601Parser.new(iso8601duration).parse!
-      time  = ::Time.current
-      new(time.advance(parts) - time, parts)
+      new(EPOCH.advance(parts) - EPOCH, parts)
     end

元々はTime.currentTime#advanceを使用して秒の値を計算しようとしていたのですが、Time#advance自体がDST境界を考慮した値を返す為、現在時刻を元にして処理を行ってしまうと本来欲しい値と事なる値が返ってきてしまっていました(DST分がずれてしまう)。

で、それを避ける為に、現在時刻ではなくエポックを使用するようにしたようです。多分。むずい。


fix typo in Rails Test Runner section

rails guideのA Guide to Testing Rails Applicationsの修正です。

The Rails Test Runnerの項のグラマーの修正を行っています。