なるようになるブログ

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

rails commit log流し読み(2019/04/19)

2019/04/19分のコミットです。

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

activesupport/CHANGELOG.md

railties/CHANGELOG.md

actionpack/CHANGELOG.md


Ensure active record can load without Railties

activerecord/lib/active_record/railties/databases.rakeactiverecord/lib/active_record/tasks/database_tasks.rbの修正です。

Active RecordのDB関係のタスク内でRais.envを直接参照しないよう修正、及び、Rails定数を参照する前に定義されているかチェックするよう修正しています。

Rails外の環境でActive Recordを使用する場合にエラーになるのを避ける為。なお、複数DB対応はrailtiesに依存している為、現状Active Record単体では使用出来ないようになっています。


If exception occurs during setup, add to each test executed

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

parallel testingの前処理(parallelize_setup)でexceptionがraiseされた場合も、テストが成功扱いになってしまっていたのを、正しく失敗扱いとなるよう修正しています。


Preserve html_safe? status on ActiveSupport::SafeBuffer#*

activesupport/lib/active_support/core_ext/string/output_safety.rbの修正です。

ActiveSupport::SafeBuffer#*メソッドでhtml_safeの状態を保持するようになっていなかったのを、他のメソッド同様状態を保持するよう修正しています。

# Before:
("<br />".html_safe * 2).html_safe? #=> nil

# After:
("<br />".html_safe * 2).html_safe? #=> true

Document redis: Object option

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

ActiveSupport::Cache::RedisCacheStore#initializeのdocに記載されているRedis cache storeのオプションについての説明で、説明が不足しているオプションがあったのを追加しています。


Fix yarn.lock

yarn.lockの修正です。yarn.lockの内容を最新の内容に更新しています。


Help command for visible commands should be hidden

railties/lib/rails/commands/dev/dev_command.rbの修正です。

devコマンドのhelpメソッドがrailsコマンドのhelpに表示されてしまっていたのを、他のコマンド同様helpメソッドは表示されないようにしています。


Revert renamed GeneratedAttributeMethods

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

GeneratedAttributeMethods moduleをmodelのnamespace配下で生成するよう修正したGive GeneratedAttributeMethods module a nameで、attribute method用のクラスのクラス名をGeneratedAttributeMethodsからGeneratedAttributeMethodsBuilderに変更していたのを、GeneratedAttributeMethodsに戻しています。元のclass名の方が適切な為。


Give GeneratedRelationMethods module a name

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

GeneratedAttributeMethods moduleをmodelのnamespace配下で生成するよう修正したGive GeneratedAttributeMethods module a nameと同様に、relation methodについてはmodelのnamespace配下でGeneratedRelationMethodsを生成するよう修正しています。


Fix const Post leakage in test/cases/base_test.rb

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

テスト内で生成した定数をテストの後処理で削除するよう修正しています。他のテストに影響が出ないようにする為。


Merge pull request #36019 from abhaynikam/35845-add-webpacker-gem-to-update-task

actiontext/lib/templates/installer.rbの修正です。

Action Textのインストール時に、webpackerを使用していない場合trix@rails/actiontextのrequireを自分で追加する必要がある旨メッセージを出力するよう修正しています。


Refactor ActiveSupport::Deprecation.deprecate_methods not to expose internal methods

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

ActiveSupport::Deprecation.deprecate_methodsメソッドを、deprecate用の内部メソッドをexposeしないようリファクタリングしています。

A regression in deprecate_methods was introduced in a982a42:で、deprecate_methodsメソッドではprependを使わずalias_method_chainをエミュレートするよう修正しました。その際、alias_method_chainと同様の挙動になるよう内部メソッドをexposeするようにしていました。

が、Make deprecate work for non-exists methodsで再度、特定の場合はprependを使うよう修正しました。そのprependを使う処理の場合だと、内部メソッドはexposeしないようになりました。

これにより、行う処理によって内部メソッドの扱いが変わってしまいました。ただ、そもそも内部メソッドをexposeするのは、明確な仕様、という訳ではなかったので、全ての処理で内部メソッドをexposeしないよう修正するようにしています。


Merge pull request #34788 from gsamokovarov/actionable-errors

Action Pack、Active Supportの修正です。

まずActive SupportにActiveSupport::ActionableErrorというクラスを追加しています。これは、特定のエラーが発生した際に、そのエラーを解決するための"action"を定義出来るようにするためのクラスです。

例えば、PendingMigrationErrorが発生した場合に、migrateという"action"を実行したい場合、下記のように定義します。

class PendingMigrationError < MigrationError #:nodoc:
  include ActiveSupport::ActionableError
  action "Run pending migrations" do
    ActiveRecord::Tasks::DatabaseTasks.migrate
  end
end

合わせて、Action PackにActionDispatch::ActionableExceptionsというmiddlewareを追加しています。このmiddlewareでは、先のActiveSupport::ActionableErrorで指定した"action"を、railsのエラー画面上から実行出来るようにする為のmiddlewareです。

"action"が指定されているエラーが発生した場合、railsのエラー画面上にその"action"を実行する為のボタンが表示され、そのボタンを押下する事で"action"を実行出来るようになっています(下記の"Run pending migrations"ボタン)。

f:id:y_yagi_2:20190420065553p:plain

なお、先にあげたPendingMigrationErrorに関する処理はRails側で行っており、PendingMigrationErrorが発生した場合ブラウザでボタンを押下するだけでmigrateが実行されるようになっています。


Deprecate collection_cache_key which is private API

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

collection_cache_keyメソッドをdeprecateにしています。

元々private APIだったのですが、API docに出てしまっていたのでpublic APIとしてメンテしていました。ただ、そのdocもMerge pull request #34378 'collection-cache-versioning'で削除されてしまった為、deprecateにしています。

が、どうやらAction Viewで使っていた為、後ほどRevertしています。


Merge pull request #35998 from itsWill/add_documentation_for_add_index

activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rbのdocの修正です。

add_index / remove_index メソッドのdocにalgorithmオプションについての説明を追加しています。


Merge pull request #36000 from JosiMcClellan/fix-screenshot-filenames

actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rbの修正です。

system testingでテスト失敗時に取得するスクリーンショットのファイル名を、自動で225文字にトランケートするよう修正しています。長過ぎるとファイル生成時にErrno::ENAMETOOLONGでエラーになってしまう為。


Add null: false constraint by default for belongs_to associations

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

model generatorで、belongs_to / references associationが指定された場合に、migrationファイルのassociation用のカラムにnull: falseを指定するよう修正しています。

modelのバリデーションにrequiredが指定されている場合、DBでもnull: falseの指定があるべきだとう、という事で修正されました。なお、null: falseが指定されるのは、config.active_record.belongs_to_required_by_defaultがtrueのときのみ。


Revert "Deprecate collection_cache_key which is private API"

collection_cache_keyメソッドをdeprecateにした、Deprecate collection_cache_key which is private API をrevertしています。理由は前述。