なるようになるブログ

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

rails commit log流し読み(2015/08/18)

2015/08/18分のコミットです。

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

activerecord/CHANGELOG.md


Merge pull request #21252 from rodzyn/improve_params_parser

actionpack/lib/action_dispatch/middleware/params_parser.rbの修正です。

不要なrequire削除、及びParamsParserクラスについてのdocを追加しています。


Update the Debugging Rails Guide

rails guideのDebugging Rails Applicationsの修正です。

Debugging with the byebug gemの項について、下記修正を行っています。

  • byebug helpの実行結果が古い内容だったのを、最新の内容に更新
  • 既に存在しないexitコマンド についての説明を削除
  • q!コマンドについての説明を追加

typo fix [ci skip]

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

AssetUrlHelper moduleのdoc内の複数のタイポをまとめて修正しています。


fix Docs [ci skip]

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

sanitizer_vendorメソッドのdoc内のタイポを修正しています。


Small fixes [ci skip]

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

Cross-Site Request Forgery (CSRF)の項、CSRFのexampleについて説明している箇所に不要な改行があったのを削除、及びwww.harmless.comのエスケープがなかったのを追加しています。


default pattern to use a joined string

ActionPackの修正です。

Journey::Path::Patternクラスのコンストラクタの引数のdefault separatorsの型を、ArrayからStringに変更しています。

指定されたdefault separatorsを使用する際は、必ずArrayをStringにjoin処理を行ってから使用するので、join処理が一度で済むように、join済みのStringを渡すよう修正したようです。


use predicate methods to avoid is_a? checks

actionpack/lib/action_dispatch/journey/nodes/node.rbactionpack/lib/action_dispatch/journey/route.rbの修正です。

オブジェクトがNodes::Terminalクラスのインスタンスかどうかチェックするのに、is_a?でチェックしていたのを、判別用のterminal?メソッドを追加し、そちらを使用しチェックをするよう修正しています。


Fix master build

actionpack/lib/action_controller/test_case.rbの修正です。

active_support/core_ext/hash/conversionsのrequireが不足していたのを追加しています。


required_defaults is always passed in, remove conditional

actionpack/lib/action_dispatch/journey/route.rbの修正です。

Journey::Routeクラスのコンストラクタで引数のrequired_defaultsnilだった場合に空配列を設定していたのを削除しています。

required_defaultsは必ず設定され、nilになることは無いためとの事です。


pull RegexpOffsets in to a method

actionpack/lib/action_dispatch/journey/path/pattern.rbの修正です。

Journey::Path::RegexpOffsetsクラスを削除し、同クラスで行っていた処理は、クラスを使用していたPattern#offsetsメソッド内で行うよう修正しています。


avoid is_a? checks

actionpack/lib/action_dispatch/journey/nodes/node.rbactionpack/lib/action_dispatch/journey/path/pattern.rbの修正です。

オブジェクトがNodes::Starクラスのインスタンスかどうかチェックするのに、is_a?でチェックしていたのを、判別用のstar?メソッドを追加し、そちらを使用しチェックをするよう修正しています。


drop object allocation during routes setup

actionpack/lib/action_dispatch/journey/nodes/node.rbactionpack/lib/action_dispatch/journey/visitors.rbの修正です。

必要な際に、毎回インスタンスfunctional visitorのインスタンスを生成していたのを、インスタンスの生成は一度だけ行い、以降は作成済みのインスタンスを使いまわすよう修正しています。

functional visitorは状態を保持していない為、使い回しが可能との事です。これにより、routes setup処理の際のobject allocation処理が大分減らせたようです。


introduce an alternate constructor for Route objects

ActionPackの修正です。

Route object生成用のビルダーメソッド(Route.build)を新規に作成し、Routeクラスのインスタンス生成処理にそちらを使用するよう修正しています。

Route classのコンストラクタシグネチャを変更する予定がある為、影響範囲を狭められるようにする為、インスタンス生成処理はビルダーメソッド経由で行うよう修正したようです。


routes are always constructed with a hash for the conditions

ActionPackの修正です。

Routeクラスのコンストラクタを生成する際、constraintsにはnilではなく、必ず値を設定するよう修正しています。


test the verb method on the route, specifically

actionpack/test/controller/resources_test.rbの修正です。

routesのテストで、routeのverbについてのテストを追加しています。


split the verb regex from the constraints hash

ActionPackの修正です。

constraints hashの中に混ぜて管理していた、verbマッチ用の正規表現を、別変数で管理するよう修正しています。

verbマッチ処理はよく使用するものなので、別に切り出したようです。追って、マッチ処理のリファクタリングも行う予定があるとの事。


switch Route constructors and pass in the regexp

actionpack/lib/action_dispatch/routing/mapper.rbの修正です。

add_routeメソッドでRouteのインスタンスを生成する際、verbマッチ用の正規表現をconditions hashに混ぜていたのを、直接正規表現を渡すよう修正しています。

conditions hashに入れておく必要が無いため、直接渡すようにしたとの事です。


use the strategy pattern to match request verbs

actionpack/lib/action_dispatch/journey/route.rbの修正です。

request verbのマッチ処理に、strategy patternを使用するよう修正しています。

元々は全てのrouteでregexpを生成してマッチして行っていたのですが、それだとRegexpオブジェクトの生成が大量に発生してしまう為、Regexpオブジェクトの生成を抑える為、リファクタリングしたとの事です。

これにより、allocation処理が大分減らせるようになり、性能改善につながっているとの事です。コミットログにかかれていたベンチは下記の通り。

require 'action_pack'
require 'action_dispatch'
require 'benchmark/ips'

route_set = ActionDispatch::Routing::RouteSet.new
routes = ActionDispatch::Routing::Mapper.new route_set

routes.resources :foo

route = route_set.routes.first
match = ActionDispatch::Request.new("REQUEST_METHOD" => "GET")
no_match = ActionDispatch::Request.new("REQUEST_METHOD" => "POST")

Benchmark.ips do |x|
  x.report("match") do
    route.matches? match
  end

  x.report("no match") do
    route.matches? no_match
  end
end

__END__

Before:

$ be ruby -rallocation_tracer runtime.rb
Calculating -------------------------------------
               match    17.145k i/100ms
            no match    24.244k i/100ms
-------------------------------------------------
               match    259.708k (± 4.3%) i/s -      1.303M
            no match    453.376k (± 5.9%) i/s -      2.279M

After:

$ be ruby -rallocation_tracer runtime.rb
Calculating -------------------------------------
               match    23.958k i/100ms
            no match    29.402k i/100ms
-------------------------------------------------
               match    465.063k (± 3.8%) i/s -      2.324M
            no match    691.956k (± 4.5%) i/s -      3.469M

大分性能改善になっているのでは、との事。楽しみ。


Merge pull request #21278 from byroot/try-arity-check

activesupport/lib/active_support/core_ext/object/try.rbの修正です。

引数の数が0かどうかのチェックをする際に、zero?メソッドを使用していたのを、== 0を使用するよう修正しています。

-        if b.arity.zero?
+        if b.arity == 0

==の方が高速な為との事です。 ベンチマーク結果。

Calculating -------------------------------------
             0.zero?   137.091k i/100ms
             1.zero?   137.350k i/100ms
              0 == 0   142.207k i/100ms
              1 == 0   144.724k i/100ms
-------------------------------------------------
             0.zero?      8.893M (± 6.5%) i/s -     44.280M
             1.zero?      8.751M (± 6.4%) i/s -     43.677M
              0 == 0     10.033M (± 7.0%) i/s -     49.915M
              1 == 0      9.814M (± 8.0%) i/s -     48.772M

Remove unreached default value

actionpack/lib/action_dispatch/journey/route.rbの修正です。

Route.buildメソッド内で、verb_matcherメソッドの戻り値がnilだった場合に、[]を設定するよう対応していたのですが、verb_matcherメソッドnilを返す事は無く、不要な為[]を設定する処理を削除しています。


Add Docs for ActiveRecord #check_pending [ci skip]

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

check_pending!メソッドにdocを追加しています。


Correct error message in Standard American english and add a test case for the same.

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

preloadメソッドに不正な値を指定された場合に表示されるエラーメッセージにイギリス英語が使われていたのを、他のエラーメッセージ同様アメリカ英語を使用するよう修正しています。

-          raise ArgumentError, "#{association.inspect} was not recognised for preload"
+          raise ArgumentError, "#{association.inspect} was not recognized for preload"

recognisedってイギリス英語なんですねえ。


Add a native JSON data type support in MySQL

ActiveRecordの修正です。

MySQL 5.7.8からMySQLJSON data typeが追加されており、RailsMySQLJSONを使用出来るよう対応しています。

マイグレーションは下記のように書けるよになっています。

create_table :json_data_type do |t|
  t.json :settings
end