なるようになるブログ

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

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

2014/08/18分のコミットです。 今日は、多かったです…。

ActiveJob / DeliverLater / GlobalIDのマージ、 respond_withのresponders gemへの切り出し等、割と大きな対応が行われています。

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

actionpack/CHANGELOG.md

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md

actionmailer/CHANGELOG.md


Allow usage of bundle local config for rack by specifying the branch

Gemfileの修正です。

rackについて、branchを指定するよう対応しています。

-gem 'rack', github: 'rack/rack'
+gem 'rack', github: 'rack/rack', branch: 'master'

Move respond_with to the responders gem

respond_withrespond_toメソッドをrespondersというgemに切り出しています。

それに伴い、rails内のrespond_withrespond_toメソッド及びその関連をばっさり削除しています。

respondersはこちら。割と大きい対応が。


Remove usafe of respond_to in ActionView tests

actionview/test/activerecord/controller_runtime_test.rbの修正です。

respond_torespond_withメソッドを使用している箇所を削除しています。


Remove more references to respond_with

各テストのfixturesの修正です。

respond_withが削除された事により、不要になったfixturesを削除しています。


Prepare for partial release.

actionpack/actionviewの修正です。

HTML Sanitizerとしてrails-html-sanitizerというgemがあり、今後はそちらを使用するようguideに追加、及び下位互換の為に、railsの中ではrails-deprecated_sanitizerというgemを読むこむよう修正しています。

rails-deprecated_sanitizerはrails5まで保守されるようです。


Merge pull request #16484 from strzalek/remove-redundant-null-serializer

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

不要なActionDispatch::Cookies::NullSerializerクラスを削除しています。


Merge pull request #16467 from strzalek/cookies-digest-config-option2

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

cookies digestに使用するアルゴリズムを指定出来るようになりました。

action_dispatch.cookies_digest = 'SHA256'

デフォルトはSHA1のままなので、そのまま使用する場合は、特に変更してないでもOKです。


Fixed broken reference caused by 14965ba

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

ActionDispatch::Cookies::NullSerializerクラス削除に伴いコケてたテストを修正しています。


Raise a more helpful error for people who are using these extracted features

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

respond_torespond_withメソッドを再定義して、メソッドを使用した際はrespondergemを使用してね、というエラーメッセージを出力よう修正しています。


The gem is called 'responders'

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

responderresponderに修正しています。


Merge pull request #16458 from chancancode/ar_fix_reserved_inheritance

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

親クラスで定義したcustom accessor methodsを子クラスで再定義した場合に問題があったのを修正しています。


responders 1.x won't do it. Told you to RTFM for details!

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

respondersの1.x系では動作しないので、エラーメッセージにgem 'responders', '~> 2.0'を指定してね、というのを追加しています。


format

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

不要な改行・スペースの削除、を行っています。


Preload UnicodeDatabase outside the loop

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

multibyte_chars_testのテストがが1.9.3で失敗するらしく、そのための対応として、apply_mappingメソッドdatabase.codepointsを追加しています。

因みに、コミットログには"I don't know why the tests fail. And I really don't know why this fixes."と記載されており、何でこの対応が必要かは、不明なようです。


Use AS::JSON for (de)serializing cookies

cookiesのserializing/deserializing処理にActiveSupport::JSON.decodeActiveSupport::JSON.encodeメソッドを使用するよう修正しています。

これにより、cookiesにシリアライズした任意のRuby Objectを設定出来るようになります。

サンプル。

 class JSONWrapper
   def initialize(obj)
     @obj = obj
   end

   def as_json(options = nil)
     "wrapped: #{@obj.as_json(options)}"
   end
 end

こんな感じで、as_jsonメソッドが定義されてればOKのようです。


Fix rounding errors with #travel_to by resetting the usec on any passed time to zero, so we only travel with per-second precision, not anything deeper than that.

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

travel_toメソッドにusecの値を設定した場合にエラーになっていたのを対応しています。travel_toメソッドとしては、usecについては対応しない方針となっていて、usecの値が渡された場合、強制的に0になるよう対応しています。


Lock web-console to 2.0.0.beta1 for the first 4.2 beta

railties/lib/rails/generators/rails/app/templates/Gemfileの修正です。

web-consoleについて、バージョンを'2.0.0.beta1'に固定するよう対応しています。


Merge pull request #16485 from seuros/activejob

ActiveJob / DeliverLater / GlobalIDがrails本体にマージされました。

以下簡単な説明を。詳細はActive Job Basicsのguideをご参考。

ActiveJob

ActiveJobはバックグラウンドジョブ実行の為の仕組みです。

ActiveJob::Baseクラスを継承してJob用のクラスを作成する事が出来ます

class GuestsCleanupJob < ActiveJob::Base
  queue_as :default

  def perform
    # Do something later
  end
end
MyJob.enqueue record  # Enqueue a job to be performed as soon the queueing system is free.
MyJob.enqueue_at Date.tomorrow.noon, record  # Enqueue a job to be performed tomorrow at noon.
MyJob.enqueue_in 1.week, record # Enqueue a job to be performed 1 week from now.

バックエンドにはDelayed Job、Sidekiq等の既存のキューシステムを使用する事が出来ます。対応している バックエンドが下記の通りです。

  • Backburner
  • Delayed Job
  • Qu
  • Que
  • QueueClassic
  • Resque 1.x
  • Sidekiq
  • Sneakers
  • Sucker Punch

それぞれに出来る事出来ない事があるので、用件に合わせて選択するのが良さそう。詳細は上記ガイド参照。

DeliverLater 名前の通りで、emailを非同期送信出来る仕組み。

# Instead of the classic
UserMailer.welcome(@user).deliver

# use #deliver later to send the email async
UserMailer.welcome(@user).deliver_later

deliver_laterメソッドを使用するだけ。簡単。

GlobalID

GlobalIDとは modelのインスタンスをユニークに特定するためのURIgemはこちら

フォーマットはgid://YourApp/Some::Model/id

ActiveJobは引数にGlobalIDを受け付けるようになっている。GlobalIDを使用する事で、以下のような書き方が可能になる。

# before
class TrashableCleanupJob
  def perform(trashable_class, trashable_id, depth)
    trashable = trashable_class.constantize.find(trashable_id)
    trashable.cleanup(depth)
  end
end

# after
class TrashableCleanupJob
  def perform(trashable, depth)
    trashable.cleanup(depth)
  end
end

元々クラス名とidを渡していたのを、GlobalID一つにまとめられるようになる。


Add CHANGELOG entry for #deliver_later

DeliverLaterで追加された#deliver_laterメソッドについてCHANGELOGに追記しています。


Merge pull request #16294 from bf4/code_tools

各toolの修正です。

を実施しています。


Merge pull request #16481 from sgrif/sg-change-default-timestamps

activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb及び各schemaの修正です。

rails 5からtimestampsのデフォルトがnull: trueからnull: falseに変わる事に伴い、null: xxが設定されてない場合にwarningsが出力されるよう対応しています。

元々の挙動を引き継ぎたい場合は、null: trueを明示的に指定する必要があります。


Use the release gems and point application gemfile to right loofah

Gemfilerailties/lib/rails/generators/rails/app/templates/Gemfileの修正です。

loofahの読み込み位置をrails-html-sanitizerの下に移動しています。


Deprecate NamedRouteCollection#helpers.

NamedRouteCollection#helpersメソッドを呼び出した際に、deprecateメッセージを出力するよう対応しています。

元々はこのコミットで削除されていたのですが、third partyのgemがこのメソッドを使用してい為、deprecateメッセージを出力する形に修正しています。


Use released arel

Gemfileactiverecord/activerecord.gemspecの修正です。

github: 'rails/arel'を指定していたのを削除しています。最近、arelの6.0.0.beta1がリリースされたので、そちらのバージョンを使用すればOKな為ですね。


Merge pull request #15889 from carnesmedia/model-name

ActionPack/ActionViewの修正です。

モデル名を取得する際、クラスメソッドではなくインスタンスメソッドを使用するよう修正しています。

このPRActiveModel::Namingインスタンスメソッドとして#model_nameを追加しており、その対応の続きです。


No need to check model_name anymore

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

model_nameメソッドのチェック処理を削除しています。


Fix ActiveJob isolation tests.

activejob/test/cases/rescue_test.rbの修正です。

足りてなかったrequireを追加しています。


Expectations first

activesupport/test/core_ext/string_ext_test.rbの修正です。

assert_equalメソッドの引数の順番を入れ替えています。最初の引数が期待する値ですね。


Expectations first

activesupport/test/core_ext/string_ext_test.rbの修正です。

先ほどのコミットと同じ対応です。


Fix rails-html_sanitizer in Gemfile template

railties/lib/rails/generators/rails/app/templates/Gemfileの修正です。

'rails-html-sanitizer'のgithubのパスが誤っていたのを修正しています。


"warning: `*' interpreted as argument prefix"

ActiveJobのテストの修正です。

引数が*の場合、()が無いとwarningが出てしまうので、その対応です。

-            job_name.constantize.new.execute *args
+            job_name.constantize.new.execute(*args)

Merge pull request #16528 from byroot/add-test-case-for-nested-array-in-where-conditions

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

ネストした空の配列をwhereに指定した場合のテストケースを追加しています。

def test_where_with_table_name_and_nested_empty_array
  assert_equal [], Post.where(:id => [[]]).to_a
end