なるようになるブログ

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

rails commit log流し読み(2017/05/21)

2017/05/21分のコミットです。

CHANGELOGへの追加はありませんでした。


bundle up redis to the one that does not warn about ::Fixnum deprecation

Gemfile.lockの修正です。

redisのバージョンを3.3.3に更新しています。


identifiers is already defined via Connection::Identification module

actioncable/lib/action_cable/remote_connections.rbの修正です。

RemoteConnectionクラスでidentifiersメソッドを定義する際に、redefine_methodメソッドを使用するよう修正しています。

-        def identifiers
+        redefine_method :identifiers do
           server.connection_identifiers
         end

identifiersメソッドはConnection::Identification moduleで既に定義されており、defで普通に定義するとメソッド再定義のwarningが出てしまう為。


Fix typo in guides

rails guideのWorking with JavaScript in Railsの修正です。

Customize remote elementsの項のタイポを修正しています。


bundle up sidekiq to the one with safer integration with Rails 5

Gemfile.lockの修正です。

sidekiqのバージョンを5.0.0に更新しています。


Fix broken external link in security guide.

rails guideのRuby on Rails Security Guideの修正です。

MySpace Samy wormへのリンクが壊れてしまっていたのを修正しています。

rails commit log流し読み(2017/05/20)

2017/05/20分のコミットです。

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

actionview/CHANGELOG.md


Fix warning: assigned but unused variable - timestamp

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

Integration#cache_versionメソッドで使用する変数名を誤っている箇所があったのを修正しています。


Make VALID_DIRECTIONS to Set

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

VALID_DIRECTIONS定数をArrayで保持していたのを、Setで保持するよう修正しています。

orderに使用出来る値かどうかをチェックする為に、指定された値をVALID_DIRECTIONS.include?でチェックしているのですが、Set#include?の方がArray#include?より高速な為変更したとの事です。

ベンチマーク

require "benchmark/ips"
require "set"

array = [:asc, :desc, :ASC, :DESC, "asc", "desc", "ASC", "DESC"]
set   = array.to_set
item  = "DESC"

Benchmark.ips do |x|
  x.report "array" do
    array.include?(item)
  end
  x.report "set" do
    set.include?(item)
  end
end
% ruby array_vs_set.rb
Warming up --------------------------------------
               array   188.441k i/100ms
                 set   229.531k i/100ms
Calculating -------------------------------------
               array      3.508M (± 9.0%) i/s -     17.525M in   5.043058s
                 set      5.134M (± 7.6%) i/s -     25.707M in   5.038921s

Add :json type to auto_discovery_link_tag

actionview/lib/action_view/helpers/asset_tag_helper.rbの修正です。

auto_discovery_link_tagメソッドに:json typeを指定出来るよう修正しています。

JSON Feed: Version 1 というのがあり、それをサポートする為との事です。


Unused variable

railties/lib/rails/generators/rails/app/app_generator.rbの修正です。

config_when_updatingメソッドから使用していない変数を削除しています。


Remove unused mismatch payload attribute

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

使用していないmismatch payload attributeを削除しています。


Update ‘Rails on Rack’ guide [ci skip]

rails guideのRails on Rackの修正です。

Inspecting Middleware Stackの項のbin/rails middlewareの実行結果を最新の内容に更新、不足していたSprockets::Rails::QuietAssets middlewareの説明を追加を行っています。

rails commit log流し読み(2017/05/19)

2017/05/19分のコミットです。

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

actionpack/CHANGELOG.md

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md


Use recyclable cache keys (#29092)

fragments cachingのcache keyのフォーマットを、再利用可能なフォーマットに変更しています。

元々、デフォルトではcache keyにassocationのversion(timestamp)も含むようになっていました(e.g. projects/1-20170202145500)。デフォルトだとassociationのversionはupdated_atな為、レコードが更新される度に新しいkeyが生成されていました(当然その度に新しいcacheが生成されている)。

これを、cache keyとcache versionをわけて管理する事にして、cache keyを再利用可能にしています。具体的には、先のassocation versionはcache versionとして管理され、keyには含まれなくなります(cacheデータの中に含まれる)。

fragment cache keyのフォーマットは下記のように変更になります。

# before

views/users/index:6e20170b482b34f88f6398ebcfa817c5/users/2-20170518223821145914
^template path    ^template tree digest            ^class ^id ^version

# after
views/users/index:6e20170b482b34f88f6398ebcfa817c5/users/2
^template path    ^template tree digest            ^class ^id

version情報はcacheの中に含まれるので、cache取得後、versionが違えばcacheが更新される、という形になっています。cache keyが無駄に生成されなくなるので、良さそう。


Merge pull request #29020 from stevenchanin/master

rails guideのActive Job Basicsの修正です。

Action Mailerの項に、asynchronous queue をRake taskから使うと正しく処理が行わない旨説明を追加しています。asynchronous queueはスレッドで処理が行われるのですが、Rake taskはtaskが終了するとプロセスが終了してしまい、スレッドがqueueを処理する前になくなってしまう場合がある為。


Cleanup CHANGELOGs [ci skip]

CHANGELOGのインデントの修正、メソッド名をバッククォートで囲むよう修正等を行っています。


Clarified description of formats [ci skip]

actionpack/lib/abstract_controller/base.rbのdocの修正です。

AbstractController::Base#formatsのdocの言い回しを修正しています。


bundle mail 2.6.5 that includes fix for ::Fixnum warning

Gemfile.lockの修正です。

mail gemのバージョンを2.6.5に更新しています。


mathn has been gemified in ruby 2.5

Gemfileの修正です。

Ruby 2.5の場合、mathn gemをインストールするよう修正しています。 Ruby 2.5でmathnはgem化されて、本体から外された為、


ERB::Util.url_encode no longer escapes ~ since ruby 2.5

actionview/test/template/url_helper_test.rbの修正です。

ERB::Util.url_encodeメソッドがRuby 2.5から~エスケープしなくなった為、その変更に合わせてテストを修正しています。

参考:Bug #6696: [PATCH] ERB::Util.url_encode should not escape unreserved characters - Ruby trunk - Ruby Issue Tracking System

因みにエスケープされなくなったのは、~はUnreserved Charactersに含まれていなかった為との事です。もういっこ参考:RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax


Add cache_key_with_version and use it in ActiveSupport::Cache.expand_cache_key

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

cache keyとversionを合わせて返すcache_key_with_versionメソッドを追加し、ActiveSupport::Cache.expand_cache_keyメソッドでそちらを使用するよう修正しています。


Merge pull request #29057 from koic/suppress_warning_assigned_but_unused_variable

actioncable/Rakefileactionview/Rakefileの修正です。

assets::verify taskから使用していない変数を削除しています。


Merge pull request #29134 from joshaidan/document-action-name

AbstractController::Base#response_body#action_name#formatsメソッドにdocを追加し、API docに表示されるよう修正しています。

rails commit log流し読み(2017/05/18)

2017/05/18分のコミットです。

CHANGELOGへの追加はありませんでした。


Merge pull request #29063 from sepehr500/master

actionpack/lib/action_dispatch/http/upload.rbの修正です。

ActionDispatch::Http::UploadedFile#initializeでfilenameに対してencode!を呼び出す前に、値をdupするよう修正しています。frozen stringを指定している場合に、元の値をそのまま使用すると、encode!でエラーになってしまう為。

rails commit log流し読み(2017/05/17)

2017/05/17分のコミットです。

CHANGELOGへの追加はありませんでした。


Fix association documentation

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

associationに関するexampleコードで、associationメソッドにブロックを渡した際のexampleコードに誤りがあった(渡されるオブジェクトがassociated class前提のコードになっていた。実際はassocationを定義しているclass)のを修正しています。


Merge pull request #29089 from yahonda/address_29021

activerecord/test/cases/log_subscriber_test.rbの修正です。

loggerの実行時間の出力がintegerでもテストが通るよう修正しています。

-      assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0\.0ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)
+      assert_match(/#{REGEXP_BOLD}#{REGEXP_MAGENTA} \(0(?:\.0)?ms\)#{REGEXP_CLEAR}/i, logger.debugs.last)

Ruby 2.5.0でInteger#round, Integer#floor, Integer#ceil, Integer#truncate などで引数で丸める桁数を指定した時に、Float に変換せずにそのままIntegerを返すようにする対応が入り、その影響との事です。

参考:ruby-trunk-changes r58583 - r58591 - PB memo


Merge pull request #29117 from yahonda/another_29021

activerecord/test/cases/log_subscriber_test.rbの修正です。

先ほどの修正のからみで、そもそも実行時間に0ではなく、少数点を含む値(0.9)を渡すよう修正しています。


Remove unneeded association.respond_to?(:reset_scope)

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

不要なreset_scopeメソッドのチェックを削除しています。

-          association.reset_scope if association.respond_to?(:reset_scope)
+          association.reset_scope

現状、全てのassociationにreset_scopeが定義されている為。


CI against JRuby 9.1.9.0

.travis.ymlの修正です。

CIで使用するJRubyのバージョンを9.1.9.0に更新しています。

rails commit log流し読み(2017/05/16)

2017/05/16分のコミットです。

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

activerecord/CHANGELOG.md


Merge pull request #29086 from mikeycgto/message-encryptor-auth-tag-check

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

MessageEncryptor#_decryptメソッド内のauth_tagのチェック処理でauth_tagがnilの場合のケアを追加しています。

-        raise InvalidMessage if aead_mode? && auth_tag.bytes.length != 16
+        raise InvalidMessage if aead_mode? && (auth_tag.nil? || auth_tag.bytes.length != 16)

CBC-HMACのように異なるモードから生成された文字列を復号する際に、auth_tagがnilになるケースがある為、との事です。へー。


Bump rack version

Gemfile.lockの修正です。

rackのバージョンを2.0.3に更新しています。


Fix TestInvalidUrls with rack 2.0.3

actionpack/test/dispatch/routing_test.rbの修正です。

URLのpathに不正なUTF-8 encoding の値を指定した場合のテストがコケていたのを修正しています。

元々は不正なUTF-8 encodingの値を指定した場合、ActionController::BadRequesをraiseするようになっていたのですが、rack側でenv valuesを必ずASCII 8BITとして扱う、という対応が入り、invalid encodingと判定される事が無くなってしまった為、不正なUTF-8 encodingの値の場合も正常に値を扱うようテストを修正しています。


Merge pull request #29077 from rails/ignore-tables-in-sql-dump

Active Recordの修正です。

db:structure:dump taskで、SchemaDumper.ignore_tablesに指定されているtableはdumpファイルに含まないよう修正しています。


Merge pull request #29056 from juliusdelta/29055-missing-links-in-activesupport-railsguide

guides/rails_guides/markdown/renderer.rbの修正です。

rails guideからGitHubへのリンクを生成する際に、パスを含むファイルへのリンクが正しく生成出来ないバグがあったのを修正しています。

rails commit log流し読み(2017/05/15)

2017/05/15分のコミットです。

CHANGELOGへの追加はありませんでした。


explain why guide translations need a fork [ci skip]

rails guideのContributing to Ruby on Railsの修正です。

Translating Rails Guidesの項に、翻訳したドキュメントはRailsレポジトリにsubmitする必要は無い旨説明を追加しています。


Don’t cache locally if unless_exist was passed

activesupport/lib/active_support/cache/strategy/local_cache.rbの修正です。

unless_existオプションを指定した場合、データを書き込む際にlocal cacheから値を削除するよう修正しています。

          def write_entry(key, entry, options)
-            local_cache.write_entry(key, entry, options) if local_cache
+            if options[:unless_exist]
+              local_cache.delete_entry(key, options) if local_cache
+            else
+              local_cache.write_entry(key, entry, options) if local_cache
+            end
+
             super
           end

元々は必ず値を書き込むようになっていたのですが、unless_existオプションを指定している場合は同じkeyが存在していたら値が上書きされない為、結果誤った値がcacheに保持されてしまっていました。値がどうなるかはbackendに依存する為、値を保持するのではなく削除する(次値を取得する際に必ずbackendから値を取得する)ように対応していまs.