なるようになるブログ

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

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

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

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


Generate keys instead of keys_to_names

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

RedisCacheStore#read_multi_mgetメソッドでmgetする際にnameとノーマライズしたkeyのペアのHashを生成していたのを、keyの配列だけ生成するよう修正しています。ペアで使用する事が無かった為。


Fix ASt CI failure with rack-test 0.7.1

activestorage/test/models/attachments_test.rbの修正です。

UploadedFileを使用したテストで、Rack::Test::UploadedFile.newの引数にPathnameインスタンスを渡していたのを、pathのStringを渡すよう修正しています。

rack-test 0.7.1からPathnameインスタンスを渡せなくなってしまった為のようです。

参考:Add the ability to create Test::UploadedFile instances without the fi…


Fix test_session_store_with_expire_after failure with rack-test 0.7.1

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

cookieの指定が不足していた部分があったのを修正しています。こちらもrack-test 0.7.1の影響。


Prevent extra spawn to make klass.all faster (#29009)

activerecord/lib/active_record/core.rbactiverecord/lib/active_record/scoping/default.rbの修正です。

klass.allを使用した際に、spawnの呼び出しを減らせるようリファクタリングしています。

一部抜粋。

-            relation.where(type_condition).create_with(inheritance_column.to_s => sti_name)
+            relation.where!(type_condition)
+            relation.create_with!(inheritance_column.to_s => sti_name)

wherecreate_withの代わりにwhere!create_with!を使用して、自身を直接変更するようにしています。高速化の為。STIを使用している場合、30%程度allがはやくなっているとの事です。


Permit attaching files to new records

activestorage/lib/active_storage/attached/many.rbactivestorage/lib/active_storage/attached/one.rbの修正です。

新規に作成したオブジェクト(まだレコードが保存されていない)からattachmentsを参照した場合、エラーになってしまうバグがあったのを修正しています。


Merge pull request #31170 from PHedkvist/system_testing_guides

rails guideのA Guide to Testing Rails Applicationsの修正です。

System Testingの項に、headless_chromeを使用する場合の設定方法について追記しています。


Pass over Execution guide[ci skip]

rails guideのThreading and Code Execution in Railsの修正です。

guide全体のグラマー、タイポの修正を行っています。

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

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

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


Fix formatting of credentials and encrypted [ci skip]

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

Rails::Application#credentialsメソッド及びencryptedメソッドのdocのフォーマットの修正を行っています。

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

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

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

railties/CHANGELOG.md


Deprecate an after_bundle callback in Rails plugin templates

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

Rails plugin用のtemplateファイルでafter_bundle callbackを使用するのがdeprecateになりました。

after_bundle callbackは元々bundle install後に実行されるcallbackなのですが、Do not run bundle install when generating a new plugin.以降、Rails pluginでは生成時にbundle installが実行されなくなり、callback名と実際の動作があってないのでdeprecateになりました。


Fix "warning: assigned but unused variable - key"

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

read_multi_mgetメソッドでRubyのwarning("assigned but unused variable - key")が出ていたのを対応しています。

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

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

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


Allow test_ignored_columns_not_included_in_SELECT column names case

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

ignored_columnsのテストでqueryの中身をテストする前に、queryを小文字にするよう修正しています。

Oracleではidentifierがすべて大文字になっているので、queryをそのまま使用すると値が一致しない為。


Go through a single credentials instance.

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

credentialのconfig path及びkey pathを定数で保持していたのを、ActiveSupport::EncryptedConfiguration経由で保持するよう修正しています。


Merge branch 'freeletics-manage-multiple-credential-files'

railtiesの修正です。

暗号化された設定ファイルと扱う為のencrypted:edit、及び、encrypted:showコマンドを追加しています。credentialsとは別。

credentialsとの違いとして、コマンドに設定ファイル名、及び、暗号に使用するkeyを指定する事が出来ます(keyの指定は任意。指定が無ければconfig/master.keyが使われる)。

$ EDITOR=vim bin/rails encrypted:edit config/staging-credentials.yml.enc
$ EDITOR=vim bin/rails encrypted:show config/staging-credentials.yml.enc
aws:
 access_key_id: 123
 secret_access_key: 345

また、上記コマンドで作成した設定ファイルは、encryptedメソッド経由で値を取得する事ができます。

Rails.application.encrypted("config/staging-credentials.yml.enc")
# => #<ActiveSupport::EncryptedConfiguration:0x00562f5cfb8fd8 @key_path=#<Pathname:/home/yaginuma/program/rails/master/config/master.key>, @content_path=#<Pathname:/home/yaginuma/program/rails/master/config/staging-credentials.yml.enc>, @env_key="RAILS_MASTER_KEY">

Pass options onto key file generator.

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

EncryptionKeyFileGeneratorにoptionsを渡すよう修正しています。先のコミットの対応漏れ。


Bump resque-scheduler ahead of a new gem release

Gemfile.lockの修正です

resque-schedulerのrevisionを更新しています。forkしたgemを利用しているのですが、そちらでrebaseが行われた為。


Add master key to gitignore on rails new

railtiesの修正です。

rails newコマンドで新規にrailsアプリを作成する際に、.gitignoreconfig/master.keyを追加するようにしています。

rails newコマンドでconfig/master.keyは生成されるようになっており、gitignoreに追加しておかないと誤ってmaster keyをコミットしてしまう可能性がある為。


Fixed example of Rails.application.encrypted method usage

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

encryptedメソッドのdoc内exampleで暗号化されたファイルの拡張子が誤っていたのを修正しています。


Start on a guide for the Executor & Load Interlock

Railsのスレッディング及びコード実行について説明した、Threading and Code Execution in Rails guideを追加しています。

並行処理やコードリロード時の挙動等についての説明がされています。


Add more detail on how the framework is actually configured by default

rails guideのThreading and Code Execution in Raisの修正です。

各項に詳細な説明を追加しています。

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

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

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

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md


Introduce ActiveStorage::Attached::{One,Many}#detach

activestorage/lib/active_storage/attached/many.rbactivestorage/lib/active_storage/attached/one.rbの修正です。

blobはそのままでattachementだけを削除する、ActiveStorage::Attached::One#detach及びAttached#Many#detachメソッドを追加しています。

attachementのリプレイス処理で使う為のようです。それ以外でも使うのかなあ。


CI against JRuby 9.1.14.0

.travis.ymlの修正です。

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


Add a #populate method to migrations (#31082)

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

migrationにupのときだけ使用出来るup_onlyメソッドを追加しています。

class AddPublishedToPosts < ActiveRecord::Migration[5.3]
  def change
    add_column :posts, :published, :boolean, default: false
    up_only do
      execute "update posts set published = 'true'"
    end
  end
end

上記のような感じで、カラムの追加をした時だけ何かを行う、という場合に使うことを想定しるようです


Merge pull request #30963 from q-centrix/performance-improvements-add_method_to_attributes

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

UrlHelper#add_method_to_attributes!でhttp methodがgetかどうかを判定する為に毎回String#to_s + String#downcaseを呼び出していたのを、methodのHashを保持し、それとマッチするかどうかチェックするよう修正しています。

-          if method && method.to_s.downcase != "get" && html_options["rel"] !~ /nofollow/
+          if method_not_get_method?(method) && html_options["rel"] !~ /nofollow/
             if html_options["rel"].blank?
               html_options["rel"] = "nofollow"
             else
@@ -599,6 +599,19 @@ def add_method_to_attributes!(html_options, method)
           html_options["data-method"] = method
         end

+        STRINGIFIED_COMMON_METHODS = {
+          get:    "get",
+          delete: "delete",
+          patch:  "patch",
+          post:   "post",
+          put:    "put",
+        }.freeze
+
+        def method_not_get_method?(method)
+          return false unless method
+          (STRINGIFIED_COMMON_METHODS[method] || method.to_s.downcase) != "get"
+        end

これで(STRINGIFIED_COMMON_METHODSに一致するケースであれば)不要なString objectの生成が減るので、ちょっと性能改善になっている、との事です。


Use released arel

GemfileGemfile.lockの修正です。

arelを使用するのにGitHubのmaterブランチを直接指定していたのを、リリース済みのgemを使用するよう修正しています。arel 9.0がリリースされた為、


Use released sass-rails

GemfileGemfile.lockの修正です。

sass-railsを使用するのにGitHubを直接指定していたのを、リリース済みのgemを使用するよう修正しています。


Fix migration version in doc of #up_only

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

up_onlyメソッドのdoc内のexampleコードで、migration versionが5.3になっていたのを5.2に修正しています。


Fix activesupport/CHANGELOG.md [ci skip]

activesupport/CHANGELOG.mdの修正です。

Redis cache storeのサポートを追加した対応のエントリーのフォーマットを修正しています。


Merge pull request #30004 from npenzin/patch-1

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

rails plugin作成時のディレクトリがrails application配下だった場合、自動でrails applicationのGemfileにそのpluginを追加するのですが、その際に先頭に改行を追加するよう修正しています。

-        entry = "gem '#{name}', path: '#{relative_path}'"
+        entry = "\ngem '#{name}', path: '#{relative_path}'"

元のGemfileの終端が空行じゃなかった場合に、Gemfileのフォーマットが崩れてしまう為。


Fix typo s/only_up/up_only/ [ci skip]

activerecord/CHANGELOG.mdの修正です。

up_onlyonly_upにタイポしていたのを修正しています。


Fix CI failure due to invalid up_only for MySQL

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

up_onlyメソッドのテストがMySQLで通ってなかったのを修正しています。


Fix asset url examples [ci skip]

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

javascript_urlstylesheet_urlメソッド等assets url helperのdoc内のexampleの実行結果が、実際の結果と異なっていたのを修正しています。


Update configuring.md

rails guideのConfiguring Rails Applicationsの修正です。

Using Initializer Filesの項で、initializer間に依存がある場合に、アルファベット順にロードされる事を利用してファイル名を調整する(e.g. 01_critical.rb等)事を推奨していたのを、依存関係があるコードは同じファイルに記載するよう修正しています。

ファイル名の変更を減らせるのと、その方が依存関係がわかりやすい為、との事です。


Use released arel

bug report templatesの修正です。

リリース済みのarelを使用するよう修正しています。


These strings should already be frozen where ruby accepts the magic-comment

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

instance_execのテストで、Stringをdupした値を使用するよう修正しています。

  def test_instance_exec_passes_arguments_to_block
-    assert_equal %w(hello goodbye), "hello".instance_exec("goodbye") { |v| [self, v] }
+    assert_equal %w(hello goodbye), "hello".dup.instance_exec("goodbye") { |v| [self, v] }
   end

Stringがfrozenされた時の為の対応という風にコミットログからは読み取れるのですが、この場合、オブジェクト自身を変える訳では無いのでdup無くても大丈夫そうな気が…。


Handle TZInfo::AmbiguousTime errors

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

Europe/Moscowのようにタイムゾーンが複数ある値を指定した場合に、TZInfo::AmbiguousTimeが発生していたのを、発生しないよう修正しています。

# before
"2014-10-26 01:00:00".in_time_zone("Moscow")
# => TZInfo::AmbiguousTime: 26/10/2014 01:00 is an ambiguous local time.

# after
"2014-10-26 01:00:00".in_time_zone("Moscow")
# => Sun, 26 Oct 2014 01:00:00 MSK +03:00

Rubyの挙動(後の期間を使用する)と合わせる為。


Merge pull request #29776 from mrj/fix-idlw-timezone

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

International Date Line West timezoneの値が誤っていたのを修正しています。

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

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

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

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md


Use .tt extension to all the template files

railtiesの修正です。

generatorで使用するtemplates filesの拡張子をまとめてttに更新しています。

元はttだったりrbだったりjsだったり色々混ざっていたのですが、rbjsだとエディタで開いた時や静的解析のときに困る(拡張子的には正しいRubyやJSのファイルのように思えるが、実際の中身は違う為)ので、すべてThorのtemplateである事を表すttを使用するようにしています。


Merge pull request #30980 from sobrinho/sobrinho/arel-star-ignored-columns

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

ignored_columnsに指定したcolumnに対するattribute methodsが、modelのreload後に定義されてしまうバグがあったのを修正しています。


Properly cast input in update_all

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

update_allの引数に指定された値をType#serializeに渡す前にcastするよう修正しています。

これにより、update_all(foo: 'true')のようにStringの"true"を渡した際にb、ooleanのtrueとして評価されるようになります。


Merge pull request #31117 from renuo/fix_errors_added

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

ActiveModel::Errors#added?メソッドが、message引数にSymbolを指定した、かつ、既に同じattributeで別のエラーメッセージが格納されている場合にtrueを返してしまうバグがあったのを修正しています。


Preserve existing metadata when analyzing a blob

activestorage/app/models/active_storage/blob.rbの修正です。

blobのanalyze処理を行った際に、元々保持していたmetadataが失われしまった(analyze処理で設定されたmetadataで上書きされてしまっていた)のを、元のmetadataも保持するよう修正しています。


Sort mailer previews

actionmailer/lib/action_mailer/preview.rbの修正です。

mailer preivewを表示する際に、アルファベット順にソートした値を表示するよう修正しています。


Merge pull request #30782 from NickLaMuro/improve_performance_of_inflections

Active Supportの修正です。

ActiveSupport::Inflector.inflectionsで使用する正規表現を、メソッド呼び出しごとに毎回生成していたのを、変数で保持して値をキャッシュするよう修正しています。

合わせて、不要なActiveSupport::Inflector.inflections.acronym_regex attributeをdeprecateにしています。内部でだけで使用している想定のattributeだったのですが、どうにも誤ってdocに乗ってしまった為、削除前にdeprecateにしています。


Built-in Redis cache store

Active Supportの修正です。

Railsがデフォルトでサポートするcache storeに、Redis cache storeを追加しています。

他のcache store同様に、:namespace、:compress、:compress_threshold, :expires_in, :race_condition_tool等のオプションが指定出来るようになっています。

また、driverが指定出来るようになっており、redis-rbだけでなく、hiredis, Redis::Distributedが指定出来るようになっています。

config.cache_store = :redis_cache_store, driver: :hiredis,
  namespace: 'myapp-cache', compress: true, timeout: 1,
  url: "redis://:#{cache_password}@myapp-cache-1:6379/0"

rails guideのCaching with Rails: An Overviewに説明が追加されているので、詳細はそちらを参照。Caching with Rails: An Overview


Add environment as dependency of load_config (#31135)

activerecord/lib/active_record/railties/databases.rakeの修正です。

load_config taskのdependencyenvironment taskを追加しています。

元々一部taskではenvironment taskが実行されていなかった(environmentファイルがロードされてなかった)のですが、それだと、例えばdatabase.ymlにencrypted secretsを使用している場合に問題になる(environmentファイルがロードされない、という事はread_encrypted_secretsがtrueになる事が無い)為、一通りのtaskでenvironmentファイルのロード処理が行われるようにする為に、load_config taskのdependencyenvironment taskを追加しています。


Cache: Enable compression by default for values > 1kB.

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

cache storeで、cacheされる値が1kb以上の場合デフォルトでcompress処理を行うよう修正しています。

元々はCPUコストを気にしてデフォルトはdisableになっていたのですが、今はそこのコストが低くなったのを、よくcacheに入れるHTMLやJSONは圧縮率が良い為、デフォルトでenableにした、との事です。


Merge pull request #27947 from mastahyeti/unsafe_raw_sql

Active Recordの修正です。

orderpluckの引数に生SQLをそのまま渡すのがdeprecateになりました。

User.order("LENGTH(name)")
# => DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "LENGTH(name)". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql().

上記のような事をやりたい場合、Arel.sqlメソッドでラップしてあげる必要があります。

User.order(Arel.sql("LENGTH(name)"))

Article.order(params[:my_order])のような形でquery methodを使用した場合に、SQL injectionが起こるのを防ぐ為、との事です。

5.2時点ではdeprecateメッセージが表示されるだけですが、6.0ではUnknownAttributeReferenceがraiseされるようになります。引続き生SQLを渡すようにしたい場合、ActiveRecord::Base.allow_unsafe_raw_sql:disabledを指定すればOKになっています。


Update layouts_and_rendering.md [ci skip]

rails guideのLayouts and Rendering in Railsの修正です。

Local Variablesの項のcounter変数についての説明の言い回しを修正しています。


Update exists? documentation

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

exists?メソッドのdocにrelationとチェインして使用した場合のexample(Person.where(name: 'Spartacus', rating: 4).exists?)を追加しています。

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

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

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

activerecord/CHANGELOG.md


Deprecate encrypted secrets in favor of credentials.

railtiesの修正です。

secrets:setupを実行した際、secrets:setupはdeprecateである旨メッセージを表示するよう修正しています。

$ EDITOR=vim ./bin/rails secrets:setup
Encrypted secrets is deprecated in favor of credentials. Run:
bin/rails credentials --help

secretsの編集はまだ出来る状態ですが、基本的にはcredentialsの方を使うのが推奨、という状態です。


Revert displaying master key generation info on rails new.

railtiesの修正です。

rails newで新規にアプリを作成した際に、master key生成についての詳細情報(生成に関するメッセージ、及び、生成したkey)を表示していたのを、表示しないよう修正しています。

master keyの生成はアプリのデフォルトの挙動なので、その挙動をわざわざ誇示する必要は無い為、との事です。


Merge pull request #30791 from felipecvo/nested-attributes-doc

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

accepts_nested_attributes_forメソッドのdocにupdate_onlyオプションを指定した場合の説明を追加しています。


Merge pull request #30773 from y-yagi/fix_30765

activerecord/lib/active_record/migration.rbrailties/lib/rails/tasks/engine.rakeの修正です。

rails engineでtest dbの自動同期が正しく動作していなかったのを修正しています。


Action Cable: run Redis tests against a default config without a password

.travis.ymlactioncable/test/subscription_adapter/redis_test.rbの修正です。

Action CableのテストでRedisを使用する際に、Redisの接続情報にpasswordを指定いたのを、passwordの指定しないよう修正しています。

cable.ymlにpasswordを指定出来るようにした対応(Merge pull request #29528 from padi/actioncable_redis_alt_config_with_password)の動作確認用にpasswordを指定していたのですが、Active SupportにRedis cache storeのサポートを追加する対応のテストをシンプルにする為に、passwordを無しにしたかったので修正したとの事です。cable.ymlの方のテストはstubで確認するようにしています。


Verify credentials format before saving

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

credentialsを保存する前に、フォーマットがYAMLとして正しいか確認するよう修正しています。

不正なフォーマットの値が保存されてしまうと、credentials編集時にエラーになって編集出来なくなってしまう為、保存時にもフォーマットのチェック行うようにしています。


Move touch method from Skipping Callbacks section to Running Callbacks section [ci skip]

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

callbackがスキップされるメソッドの一覧にtouchメソッドがのっていたのですが、実際はtouchメソッド実行後はcallbackは実行される為、callbackが実行されるメソッドの一覧の方に移動しています。


Add new error class StatementTimeout which will be raised when statement timeout exceeded (#31129)

Active Recordの修正です。

statement timeoutを超過した場合にraiseするようのStatementTimeoutクラスを追加、及び、実際に超過した場合にStatementTimeoutをraiseするよう修正しています。


Return a non zero code when can not connect to redis in CI

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

sidekiq及びresqueを使用してたintegrationテストでRedisに接続出来ないとき、CIではnon zeroを返すよう修正しています。

redisに接続出来ないのは基本的に何か設定が間違えているときなので、その状態をすぐ検知出来るようにする為。


Make sidekiq and resque integration tests work in CI

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

Redisに接続する際にpasswordを指定していたのを、指定しないよう修正しています。

Action Cable: run Redis tests against a default config without a passwordの対応でCI上のRedisの設定からpasswordが削除された為、passwordの指定があると接続出来ない為。