なるようになるブログ

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

rails commit log流し読み(2017/07/10)

2017/07/10分のコミットです。

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

activesupport/CHANGELOG.md


[ci skip] update MessageEncryptor example to use the key length as returned by OpenSSL

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

MessageEncryptorクラスのdoc内のexampleコードで、keyを生成するのにランダムな値(SecureRandom.random_bytesで生成した値)を使用するよう修正しています。


[ci skip] Updated language on validations.

rails guideのActive Record Basicsの修正です。

Validationsの項のグラマーの修正を行っています。


Use frozen-string-literal in ActiveJob

Action Jobの修正です。

各ファイルの先頭にfrozen_string_literal: trueを追加しています。


Make sidekiq and resque integration tests work in CI

activejob/test/support/integration/adapters/resque.rbactivejob/test/support/integration/adapters/sidekiq.rbの修正です。

Active Jobのintegration testでredisに接続する際に、パスワードを指定するようにしています。

Allows for other common redis options to be in cable.yml, by defaultで、CIで使うredisにデフォルトでパスワードが設定されるようになった為。


Added time helper method freeze_time which is an alias for travel_to Time.now (#29681)

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

Time.nowTimeを固定するfreeze_timeメソッドを追加しています。

Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00
freeze_time
sleep(1)
Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00

中身はtravel_toを呼び出している(travel_to Time.now, &block)だけです。

rails commit log流し読み(2017/07/09)

2017/07/09分のコミットです。

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

railties/CHANGELOG.md

actioncable/CHANGELOG.md

activerecord/CHANGELOG.md


Don’t call register on custom drivers

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

独自に登録したCapybaraのdriversをsystem testで使用した場合に、NoMethodErrorでエラーになってしまうバグがあったのを修正しています。


Merge pull request #29708 from kamipo/fix_current_timestamp_for_mariadb

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

defaultCURRENT_TIMESTAMPが使われているかのチェックを==を使用していたのを、正規表現でチェックするよう修正しています。

-            if type_metadata.type == :datetime && field[:Default] == "CURRENT_TIMESTAMP"
-              default, default_function = nil, field[:Default]
+            if type_metadata.type == :datetime && /\ACURRENT_TIMESTAMP(?:\(\))?\z/i.match?(field[:Default])
+              default, default_function = nil, "CURRENT_TIMESTAMP"

MariaDB 10.2からCURRENT_TIMESTAMPはfunction(current_timestamp())として扱われるようになり、==では正しくチェック出来なくなった為。


Merge pull request #29706 from kamipo/use_information_schema_to_extract_expression

activerecord/lib/active_record/connection_adapters/mysql/schema_dumper.rbの修正です。

MariaDB 10.2.5以降では、Virtual Columnsの情報をinformation_schemaから取得するようにしています。MariaDB 10.2.5以降ではinformation_schemaからVirtual Columnsの情報が取得出来るようになった為。


Merge pull request #29705 from y-yagi/do_not_update_secrets_yml_enc

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

secrets:editコマンドでsecretを編集する際、secretsを更新しなかった場合もsecrets.yml.encが更新されてしまっていたのを、secretsを更新しなかった場合はsecrets.yml.encが更新されないよう修正しています。


Merge pull request #29695 from y-yagi/secrets_show

railties/lib/rails/commands/secrets/secrets_command.rbの修正です。

secretsを表示する為のsecrets:showコマンドを追加しています。


Merge pull request #29495 from eugeneius/_write_attribute

Active Recordの修正です。

AttributeMethods::Write#_write_attributeメソッドを追加しています。基本的にはwrite_attributesメソッドと同じなのですが、こちらはprimary keyとaliasのチェックを行っておらず、その分高速なので、左記チェックが不要な箇所ではこちらのメソッドを使用するよう修正しています。


Merge pull request #29297 from palkan/fix/action-cable-postgres-identifiers-limit

actioncable/lib/action_cable/subscription_adapter/postgresql.rbの修正です。

Action CableのadapterにPostgreSQLを使用している場合に、stream identifierが64文字以上になった場合、SHA1でハッシュ化した値を使用するよう修正しています。

PostgreSQLではidentifiersに指定出来る文字は63文字まで、という制限がある為。


Merge pull request #29692 from fimmtiu/avoid-translating-non-database-exceptions

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

AbstractAdapter#logメソッドでエラーが起きた際に、RuntimeError以外の全てのエラーをActiveRecord::StatementInvalidにまるめていたのを、まるめ処理を行う範囲をDBに関する処理を行う箇所だけにとどめて、その他のエラーはそのままraiseするよう修正しています。


Merge pull request #28867 from eugeneius/skip_query_cache_in_batches

Active Recordの修正です。

batch処理用のメソッド(find_eachfind_in_batchesin_batches)ではquery cachingは行わないよう修正しています。batch処理でrecordがメモリに残ってしまうのを防ぐ為。


Add backticks [ci skip]

activerecord/CHANGELOG.mdの修正です。

クラス名等にバッククォートを追加しています。


Merge pull request #29715 from reverbdotcom/ptd/fix-invalid-uuids

activerecord/lib/active_record/connection_adapters/postgresql/oid/uuid.rbの修正です。

中括弧が開き・閉じどちらかだけあるuuid({a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}等)はinvalidとみなすよう、チェック用の正規表現を修正しています。

-          ACCEPTABLE_UUID = %r{\A\{?([a-fA-F0-9]{4}-?){8}\}?\z}x
+          ACCEPTABLE_UUID = %r{\A(\{)?([a-fA-F0-9]{4}-?){8}(?(1)\}|)\z}

(?(cond)yes-subexp|no-subexp)という書き方が出来るんですねえ。

参考:https://github.com/k-takata/Onigmo/blob/3ddfbfcc469a246f8c5bc50072c7e9cdb1e50b22/doc/RE#L293


Treat secrets as binary

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

encrypted secretsの値を読み書きする際に、File.write / File.readを使用していたのを、IO.binwrite / IO.binreadを使用するよう修正しています。

元々、Rails 5.1.1までは、IO.binwrite / IO.binreadを使用していたのが、5.1.2でFile.write / File.readに変更されていました。しかし、それにより、Rails 5.1.1で作成した encrypted secretsをRails 5.1.2で読み込もうとすると、IO.binreadで読み込んだバイナリデータをFile.writeで書き込む事になり、結果エラー(Encoding::UndefinedConversionError)なっていました。

その為、データの書き込みでエラーになるのを避ける為、5.1.1と同じくIO.binwrite / IO.binreadを使用するよう修正しています。


Load environment file in dbconsole command

railties/lib/rails/commands/dbconsole/dbconsole_command.rbの修正です。

dbconsoleコマンド実行時にenvironment fileを読み込むよう修正しています。database.ymlにenvironment fileに指定した値を使用出来るようにする為。


Use frozen-string-literal in ActiveSupport

Active Supportの修正です。

各ファイルの先頭にfrozen_string_literal: trueを追加しています。


Merge pull request #29655 from kirs/frozen-friendly-ap-ar

Action Pack、Action Viewの修正です。

各ファイルの先頭にfrozen_string_literal: trueを追加、及び、Stringを変更する箇所でdupを呼び出すよう修正しています。

rails commit log流し読み(2017/07/08)

2017/07/08分のコミットです。

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

activemodel/CHANGELOG.md


Add ActiveModel::Errors#merge!

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

ActiveModel::Errorsインスタンスをmergeする為のActiveModel::Errors#merge!メソッドを追加しています。

person = Person.new
person.errors.add(:name, :blank)

errors = ActiveModel::Errors.new(Person.new)
errors.add(:name, :invalid)

person.errors.merge!(errors)
puts person.errors.messages
# => { name: ["can't be blank", "is invalid"] }

Test thor master

Gemfileの修正です。

thorのmasterブランチを使用してテストを実行するよう修正しています。


Clarify i18n guide for how pluralization rules work by default

rails guideのRails Internationalization (I18n) APIの修正です。

transliteration rules についての説明を記載した、Locale-specific rulesの項を追加しています。


Merge pull request #29680 from koic/update_default_app_files_in_app_generator_test

railties/test/generators/app_generator_test.rbの修正です。

app_generator_testに定義されているrails newがデフォルトで定義するファイルの一覧を最新の情報に更新しています。

rails commit log流し読み(2017/07/07)

2017/07/07分のコミットです。

CHANGELOGへの追加はありませんでした。


Fix extracting MariaDB version

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

MariaDBのversionチェック処理をメソッドに切り出しています。

rails commit log流し読み(2017/07/06)

2017/07/06分のコミットです。

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

railties/CHANGELOG.md


Fix warning: `*‘ interpreted as argument prefix

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

delegateのテストでRubyのwarning(“`*‘ interpreted as argument prefix”)が出ていたのを対応しています。


Fix ActiveModel::Type::DateTime#serialize

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

ActiveModel::Type::DateTime#severalメソッドを追加し、引数のcast処理を行うよう修正しています。

datetime型のカラムに対して文字列(e.g. 2017-07-04 14:19:00.5)で取得処理(find_by等)を行った場合に、正しく値が取得出来るようにする為。


Merge pull request #28668 from Dorian/mention-time-parse-argument-error

activesupport/lib/active_support/values/time_zone.rbactivesupport/test/time_zone_test.rbの修正です。

Time.zone.parseの引数に不正な文字列を指定した場合、ArgumentErrorがraiseされる旨docに説明、及び、テストを追加しています。


Merge pull request #29662 from deivid-rodriguez/engine_multiple_mount_points

Action Packの修正です。

一つのRails Engineを異なるlocationにmount出来るよう修正しています。

Bukkits::EngineというRails Engineがあった場合に、

Rails.application.routes.draw do
  scope "/fruits" do
    mount Bukkits::Engine => "/bukkits", as: :fruit_bukkits
  end

  scope "/vegetables" do
    mount Bukkits::Engine => "/bukkits", as: :vegetable_bukkits
  end
end

というように定義出来るようになっています。

rails commit log流し読み(2017/07/05)

2017/07/05分のコミットです。

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

activerecord/CHANGELOG.md


Remove database specific JSON types

Active Recordの修正です。

DB固有のJSON type(MysqlJsonPostgreSQL::OID::Json)を削除しています。

DBに依存しないJSON type(Type::Json)がConsolidate database specific JSON types to Type::Jsonで追加されておりDB固有のJSON typはもう不要な為。


Merge pull request #29653 from kamipo/fix_test_copying_migrations_preserving_magic_comments

Active Recordの修正です。

migrationファイルの先頭にfrozen_string_literal: trueが含まれている場合に、正しくマジックコメントが保持されるよう修正しています。


Commit gemfile.lock

Gemfile.lockの修正です。

Allow the use of Bundler 2.0の対応でGemfile.lockの更新が漏れていたので対応しています。


Load the Parameters configurations on the right time

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

ActionController::Parameters.permit_all_parametersの設定をActionController load時に行うよう修正しています。


Fix end

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

先の対応でendが不足していたのを追加しています。


Merge pull request #29413 from kamipo/fix_association_with_scope_including_joins

Active Recordの修正です。

join処理が含まれるscopeと一緒にassocationをload / preloadした際に、正しいSQLが生成されないバグがあったのを修正しています。


Fix Parameters configuration integration tests

railties/test/application/configuration_test.rbの修正です。

先に行われた、ActionController::Parameters.permit_all_parametersの設定をActionController load時に行うよう修正した対応の影響でコケてしまっていたテストがあったのを修正しています。


Use map in delegate so that actual prefixed method names are returned, if using prefix version.

activesupport/lib/active_support/core_ext/module/delegation.rbの修正です。

Module.delegateメソッドでprefixオプションを使用している場合に、prefixがついた状態のメソッド名の一覧を返すよう修正しています。

class MyClass
  private *delegate(:this, :that, :another, to: :some_method)
end

上記のように、delegateメソッドの戻り値のメソッドをまとめてprivateにするときなどに変換後のメソッド名が必要な為、との事です。

rails commit log流し読み(2017/07/03)

2017/07/03分のコミットです。

CHANGELOGへの追加はありませんでした。


Remove redundant assert_respond_to

各テストから、不要なassert_respond_toの呼び出し(同テスト内の違う箇所で該当のメソッドを呼んでいる)を削除しています。


Merge pull request #29638 from amatsuda/require_relative_2017

コンポーネントrequireの代わりにrequire_relativeを使用するよう修正しています。

require_relativeは、requireよりもはやい($LOAD_PATHをスキャンせず対象のファイルを直接読み込む為)為、require_relativeを使用するようにしたとの事です。また、require_relativerequireと異なり、RubyGemsやBundlerにオーバーライドされてない為、不要なパッチを避ける事が出来る、というのもあるとの事です。


Add backticks [ci skip]

activerecord/CHANGELOG.mdrailties/CHANGELOG.mdの修正です。

メソッド名、ファイル名をバッククォートで囲むよう修正しています。