なるようになるブログ

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

rails commit log流し読み(2014/07/18)

2014/07/18分のコミットです。

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

activemodel/CHANGELOG.md

activerecord/CHANGELOG.md

Dont swallow errors on compute_type when having a bad alias_method on a class.


docs, select and friends with multiple=true include a blank string.

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

selectタグでmultiple: trueを使用する場合、必ず空文字が含まれてしまう旨注意事項を追加しています。


helper methods are public, so we can just call them

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

ヘルパーメソッドの呼び出しをsend経由ではなく、普通のメソッド呼び出しに修正しています。ヘルパーメソッドはpublicなので、普通に呼べるから、ですね。


use a strategy object for generating urls in named helpers

routingのリファクタリングです。

URLの生成処理にstrategy objectを使用するよう修正しています。

PATH    = ->(options) { ActionDispatch::Http::URL.path_for(options) }
FULL    = ->(options) { ActionDispatch::Http::URL.full_url_for(options) }
UNKNOWN = ->(options) { ActionDispatch::Http::URL.url_for(options) } 

こんな感じで。


Make restore_attributes public

activemodel/lib/active_model/dirty.rbの修正です。

restore_attributesメソッドをprivate -> publicに修正しています。

model.name = 'Dmitry'
@model.color = 'Red'
@model.save
@model.name = 'Bob'
@model.color = 'White'

@model.restore_attributes(['name'])

assert @model.changed?
assert_equal 'Dmitry', @model.name
assert_equal 'White', @model.color

restore_attributes、普通に便利そうであるのですが、何でprivateだったんだろう。


pass the route name to define_url_helper

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

define_url_helperメソッドにroute name引数が追加されています。

この修正で、Hashの生成を2つ避けれるようです。性能改善の一環ですかね。


recall should be path_parameters, also make it required

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

generateメソッドの第三引数は元々任意だったのですが、必須にするよう修正しています。


[EXPERIMENTAL] run actionpack tests in parallel

actionpack/test/abstract_unit.rb

actionpackのテストがparallelに実行されるよう改修しています。

drbを使って処理行われていますねえ。

EXPERIMENTALとなっているので、問題が起きたらrevertするようです。


Prefer if/else for this case

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

case/whenで記載されていた処理をif/elseに修正しています。

-        case value
-        when ::Numeric, ::String
+        if value.is_a?(::Numeric) || value.is_a?(::String)
           BigDecimal(value, precision.to_i)
-        when proc { value.respond_to?(:to_d) }
+        elsif value.respond_to?(:to_d) 

when procはちょっと解りづらいですねえ。


Disable some tests on SQLite

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

幾つかのテストをSQLiteの場合無効にしています。

decimalなど、SQLiteで対応してないケースですね。


only parallelize on forking systems

actionpack/test/abstract_unit.rbの修正です。

parallel処理について、forkが出来る環境かどうかチェック処理を入れています。Windows以外ですかね。


do not restart the service, just stop it

actionpack/test/abstract_unit.rbの修正です。

stop処理に何故かあったDRb start処理を削除しています。


fix filesystem race condition

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

tmpファイルのpath生成処理にDir::Tmpname.make_tmpnameメソッドを使用するよう修正しています。


Merge pull request #16210 from sonnym/assert_valid_keys_in_validate

activemodel/lib/active_model/validations.rbの修正です。

validateメソッドで引数のチェックを行うよう修正しています。

class User < ActiveRecord::Base
  validate :name, presence: true 
  # validates :name, presence: true  が正しい
end

上記の用にクラス定義を行った際、

s = User.new
# ArgumentError: Unknown key: :presence. Valid keys are: :on, :if, :unless 

上記の用にArgumentErrorが発生するよう修正しています。

validatesメソッドを使用しなくてはならないのに、validateメソッドを使用していますミスを防ぐ為との事です。最初の頃混乱してたので、これは良い修正ですね。


pass the test reporter by reference

actionpack/test/abstract_unit.rbの修正です。

test reporterをキューに渡す際、参照渡しするよう修正しています。

-    def << o; @queue << o; end
+    def << o
+      o[2] = DRbObject.new(o[2]) if o
+      @queue << o
+    end 

drbが良く解らない…。勉強しなくては…。


fix thread safety issues

activesupport/test/multibyte_conformance_test.rbの修正です。

setupメソッドで行っていたファイルのダウンロード処理をクラスロード時に行うよう修正しています。

マルチスレッド対策。


%i doesn't work on 1.9

activemodel/lib/active_model/validations.rbの修正です。

%i記法していた箇所があったのを修正しています。1.9系だと使えないですよねえ。

因みに、Rails 5では1.9は対応しないようです。


reporting is only done in one thread, so we can safely remove the lock

actionpack/test/abstract_unit.rbの修正です。

レポーティング処理からthreadロックを削除しています。

レポーティング処理は1スレッドでしか行われない為との事です。


Prefer to pass block when logging.

各moduleのログ出力処理の修正です。

ログ出力処理をブロックで囲むよう修正しています。

rails guideにも記載があるのですが、ログ出力処理はブロックで囲む事を推奨しています。ロード時ではなく、実行時にString Objectを生成処理を行われるようにする為との事。


Merge pull request #15762 from arthurnn/better_error_on_bad_alias_method

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

compute_typeメソッド誤ったalias_methodがあった場合に、エラー情報を隠蔽してしまっていたのを修正しています。