2015/08/18分のコミットです。
CHANGELOGにのったコミットは以下の通りです。
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!
コマンドについての説明を追加
actionview/lib/action_view/helpers/asset_url_helper.rb
のdocの修正です。
AssetUrlHelper
moduleのdoc内の複数のタイポをまとめて修正しています。
actionview/lib/action_view/helpers/sanitize_helper.rb
のdocの修正です。
sanitizer_vendor
メソッドのdoc内のタイポを修正しています。
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.rb
、
actionpack/lib/action_dispatch/journey/route.rb
の修正です。
オブジェクトがNodes::Terminal
クラスのインスタンスかどうかチェックするのに、is_a?
でチェックしていたのを、判別用のterminal?
メソッドを追加し、そちらを使用しチェックをするよう修正しています。
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_defaults
がnilだった場合に空配列を設定していたのを削除しています。
required_defaults
は必ず設定され、nilになることは無いためとの事です。
pull RegexpOffsets in to a method
actionpack/lib/action_dispatch/journey/path/pattern.rb
の修正です。
Journey::Path::RegexpOffsets
クラスを削除し、同クラスで行っていた処理は、クラスを使用していたPattern#offsets
メソッド内で行うよう修正しています。
actionpack/lib/action_dispatch/journey/nodes/node.rb
、
actionpack/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.rb
、
actionpack/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からMySQLもJSON data typeが追加されており、RailsでMySQLのJSONを使用出来るよう対応しています。
マイグレーションは下記のように書けるよになっています。
create_table :json_data_type do |t| t.json :settings end