なるようになるブログ

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

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

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

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


Fix activestorage direct upload on firefox

activestorage/app/javascript/activestorage/blob_upload.jsactivestorage/app/javascript/activestorage/ujs.jsの修正です。

Active Storageのdirect uploadがfirefoxで動作しないバグがあったのを修正しています。

formをsubmitする際に、buttonのclickが正しく動作していなかった為、click処理の前にfocusを呼び出すよう修正しています。

@@ -53,6 +53,7 @@ function submitForm(form) {
   if (button) {
     const { disabled } = button
     button.disabled = false
+    button.focus()
     button.click()
     button.disabled = disabled
   } else {

Fix created_at [ci skip]

rails guideのRuby on Rails Security Guideの修正です。

Session Expiryの項内のcreated_atエスケープするよう修正しています。

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

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

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

activesupport/CHANGELOG.md

railties/CHANGELOG.md


Add credentials using a generic EncryptedConfiguration class (#30067)

秘密情報を保持する為のファイルとして、config/credentials.yml.encを追加しています。

現状、秘密情報を保持する為のファイルが複数(config/secrets.ymlconfig/secrets.yml.enc)あり、かつ、それらのファイルとは別にSECRET_BASE_KEYという環境変数があったりで、少々ややこしい状態になっていました。 そのため、既存の仕組みとは別に、新たに秘密情報を管理する為のファイルを追加し、今後はそこに秘密情報を集約する事にしていく予定との事です。secret_key_baseもデフォルトでconfig/credentials.yml.encに定義されるようになています。なお、secrets.yml.xxxはdeprecateにする予定との事です(このPRではそこまでは含まれていません)。

config/credentials.yml.encにはencrypted secrets同様に編集、及び、値を表示する為のコマンド(credentials:editcredentials:show)が提供されており、encrypted secretsとおなじような形で使用できます。なお、keyファイル名は異なっています(credentialsはconfig/master.keyというファイルを使用しています)。なお、RAILS_MASTER_KEY環境変数は変わらず使用出来ます。

合わせて、EncryptedFileを扱う為の仕組みをActive Supportに切り出して汎用的に使用できるようにする対応、及び、secret_key_baseの設定がdevelopment及びtestで不要になる対応が含まれています。

secret_key_baseがconfig/credentials.yml.encで設定されるようになった、かつ、config/credentials.yml.encはproduction環境でのみ使用する事を想定している事から、secret_key_baseをdevelopment及びtestで設定しないで良いようにしたようです。


Ignore activestorage/test/service/configurations.yml

.gitignoreの修正です。

activestorage/test/service/configurations.ymlをignoreするファイルに追加しています。

上記ファイルはActive Storageのテストの時に使用するファイルで、外部サービス(AWC, GCP, Azure)のアクセスkey等を定義する為のファイルです。で、当然それらの情報はsecretsであり、リポジトリに含むべきではない為、ignoreするようにしています。


Rename activestorage/test/service/configurations.yml to activestorage/test/service/configurations.example.yml

activestorage/test/service/configurations.ymlactivestorage/test/service/configurations.example.ymlにリネームしています。

先のコミットの通り、configurations.ymlはignoreするようになったのですが、exampleが無いとそもそも何書いたら良いかわからないので、configurations.example.ymlが代わりに置かれるようになりました。


Use escaped character in regexp

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

assert_no_matchでテストを行ってる箇所で正規表現を使用する際、".“をエスケープせずに使用している箇所があったのを、”\“でエスケープするよう修正しています。

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

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

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


Remove not used gems by default [ci skip]

rails guideのThe Rails Initialization Processの修正です。

Railsがデフォルトで使用するgemの一覧に既に使用していないgemがあったのを削除しています。


PERF: Incorrect memoization in ActiveRecord::Associations::Preloader::Association.

activerecord/lib/active_record/associations/preloader/association.rbの修正です。

Associations::Preloader::Association#key_conversion_required?メソッドで@key_conversion_requiredのメモ化が正しく行われてなかったのを修正しています。

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

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

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


Use v3 of the AWS SDK

Active Storageの修正です。

S3にファイルをアップロードするのにAWS SDK for Rubyのv2を使用していたのを、v3を使用するよう修正しています。

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

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

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


Remove needless silence_warnings

railtiesのテストの修正です。

environmentファイルのrequire処理をsilence_warningsで囲むようにしていたのを、silence_warningsを削除しています。

元々はSassで大量に発生するRubyのwarning出力を抑止する為だったのですが、現状リリースされているSassではもうwarningは出ないようになっている為。

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

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

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


Fix quote_default_expression for UUID with array default

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

PostgreSQLでmigrationにuuid型をArrayで使用している、かつ、デフォルト値を設定した場合(e.g. add_column :some_table, :some_column, :uuid, array: true, default: [])にmigration実行時にエラーになってしまうバグがあったのを修正しています。


Add an extra assertion to ensure dumping schema default as expected

activerecord/test/cases/adapters/postgresql/uuid_test.rbの修正です。

migrationにuuid型をArrayで使用している、かつ、デフォルト値を設定した場合のテストで、schemaファイルに期待通りのmigrationが出力される事を確認するテストを追加しています。


Remove unused primary_key_type and quoted_table_name in Reflection

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

ActiveRecord::Reflection moduleから、使用していないprimary_key_typeメソッドとquoted_table_nameメソッドを削除しています。


Remove duplicated klass method in AssociationReflection

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

AssociationReflection#klassメソッドを削除しています。親クラス(MacroReflection)にまったく同じ内容のメソッドがもうある為。


Do not install unused gem

Gemfileの修正です。

使用していないqu-redis gemをコメントアウトしています。

Active Jobのqu adapterのテスト用に入れていたのですが、qu adapterのテストは長い事動いておらず(qu gemがRails 5.1に対応していない為)、不要な為インストールしないようにしています。


Remove unnecessary join_type in AssociationScope

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

AssociationScope#join_typeメソッドを削除しています。

上記メソッドはAssociationScope#joinメソッドでtableのcreate_joinの引数として渡すよう使っており、Arel::Nodes::InnerJoinを返すようになっていたのですが、default join klassがArel::Nodes::InnerJoinになっており明示的に値を渡す必要がそもそも無い為、メソッドを削除し引数は指定しないようにしています。


Merge pull request #30524 from tgxworld/recover_plucK_performance

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

QueryMethods::WhereChain#default_value_forメソッドで値を返すのにcase / whenを使用していたのを、事前にHashを作成しておいて、そこから値をfetchするよう修正しています。

+      DEFAULT_VALUES = {
+        create_with: FROZEN_EMPTY_HASH,
+        readonly: false,
+        where: Relation::WhereClause.empty,
+        having: Relation::WhereClause.empty,
+        from: Relation::FromClause.empty
+      }
+
+      Relation::MULTI_VALUE_METHODS.each do |value|
+        DEFAULT_VALUES[value] ||= FROZEN_EMPTY_ARRAY
+      end
+
+      Relation::SINGLE_VALUE_METHODS.each do |value|
+        DEFAULT_VALUES[value] = nil if DEFAULT_VALUES[value].nil?
+      end
+
       def default_value_for(name)
-        case name
-        when :create_with
-          FROZEN_EMPTY_HASH
-        when :readonly
-          false
-        when :where, :having
-          Relation::WhereClause.empty
-        when :from
-          Relation::FromClause.empty
-        when *Relation::MULTI_VALUE_METHODS
-          FROZEN_EMPTY_ARRAY
-        when *Relation::SINGLE_VALUE_METHODS
-          nil
-        else
+        DEFAULT_VALUES.fetch(name) do
           raise ArgumentError, "unknown relation value #{name.inspect}"
         end

Rails 5系になってからpluckメソッドの性能が4系と比べて悪化しており、それを調べていた所case / whenのチェック処理(Symbol#===の呼び出し)で重くなっていたようだった為、上記の対応を行ったという事です。

ベンチマークの結果等はPRを参照。


Merge pull request #30536 from y-yagi/reorganize_secrets_test

railties/test/secrets_test.rbの修正です。

secretsのテストで、本来同時に使うべきではないabstract_unitisolation/abstract_unitを同時に使用していた為、isolation/abstract_unitだけを使用するようテストを整理しています。

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

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

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


:scissors:

actionpack/CHANGELOG.mdの修正です。

不要なスペースを削除しています。


has_many :through with unscope should affect to through scope

activerecord/lib/active_record/associations/association_scope.rbactiverecord/lib/active_record/reflection.rbの修正です。

has_many :through association + unscopeを使用した場合に、through scopeをunscope出来ないバグがあったのを修正しています。


RuntimeReflection is not a subclass of PolymorphicReflection

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

RuntimeReflectionの親クラスをPolymorphicReflectionからAbstractReflectionに変更しています。

PolymorphicReflectionThroughReflectionで使う為のクラスで、RuntimeReflectionAssociationScopeで使う為のクラスであり、そもそも目的が別のクラスなので親子関係になっているのはおかしい、という事で修正されたようです。


Don’t pass table to last_chain_scope and next_chain_scope

activerecord/lib/active_record/associations/association_scope.rbactiverecord/lib/active_record/reflection.rbの修正です。

AssociationScope#last_chain_scope#next_chain_scopeメソッドの引数からtableを削除しています。

tableはメソッドの引数であるreflectionの情報の一部であり、そちらから取得出来る為削除したとの事です。


CI against JRuby 9.1.13.0

.travis.ymlの修正です。

CIで使用するJRubyのバージョンを9.1.13.0に更新しています。