なるようになるブログ

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

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

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

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


Merge pull request #29979 from kamipo/use_build_bind_attribute

Active Recordの修正です。

Arel::Nodes::BindParamを生成する処理を独自に行っていたのを、build_bind_attributeメソッドを使用するよう修正しています。


Merge pull request #29946 from kamipo/passing_arel_to_where_is_boundable

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

UniquenessValidatorから不要になっているRelation::WhereClauseの生成処理を削除しています。


Use frozen string literal in actionpack/

Action Packの修正です。

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

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

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

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

activesupport/CHANGELOG.md


Eager load the association classes on boot

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

association classes(BelongsToAssociationHasManyAssociation等)をboot時にeager loadするよう修正しています。

元々association classesはautoloadの対象になっており、参照された際に自動でloadするようになってはいたのですが、複数スレッドで同時にautoloadした際に、一つのスレッドはloadに成功するがもう一つの方はloadに失敗し、結果エラー(NameError)になってしまう、という問題があった為、boot時にeager loadするようにしたようです。

関連:Bug #12688: Thread unsafety in autoload

が、今のMRIのautoloadはスレッドセーフになっている、という指摘もあり、実際何が原因かは正確にはわかってなさそうな感じです。


[ci skip] update routing guide

rails guideのRails Routing from the Outside Inの修正です。

HTTP Verb Constraintsの項、"GET"がシングルクォートで囲まれていたのを、バッククォートで囲むよう修正しています。code blockで表示されるようにする為。


Squashed commit of the following:

rails guideのRails Routing from the Outside Inの修正です。

各項でメソッド名等をバッククォートで囲むよう修正しています。


Add missing support for modulo operations on durations

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

Durationの剰余演算で結果が正しく取得出来ないバグがあったのを修正しています。

# before

5.minutes % 120
# => 60
5.minutes % 2.minutes
# => -18000 minutesと300 seconds


# after

5.minutes % 120
# => 1 minute
5.minutes % 2.minutes
# => 1 minute

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

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

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

activesupport/CHANGELOG.md


Fix search input’s type & placeholder conflict in Routing Error page

actionpack/lib/action_dispatch/middleware/templates/routes/_table.html.erbの修正です。

Routing Error Pageの検索用inputに-webkit-appearance: textfield;を指定しています。

ブラウザがデフォルトで設定するplaceholderとhtmlで設定しているplaceholderがコンフリクトしてしまっていた為、ブラウザ側のplaceholderを表示しないようにする為設定したようです。

before

28632623-ec89dfd8-7239-11e7-8b88-e4e321fdb3e1.png (661×830)

after

28632633-f01b898a-7239-11e7-9dc6-664a7d39c896.png (660×831)


Use _relation_for_itself wherever possible

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

自身のrelationを取得する処理を独自に行っていたのを、_relation_for_itselfメソッドを使用するよう修正しています。_relation_for_itselfメソッドはその為のメソッドの為。


Merge pull request #28695 from koic/integer_type_has_precision_option_in_oracle

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

schema dumpにcommentが含まれる事を確認するテストがOracle adapterでコケてしまっていたのを修正しています。

+      if current_adapter?(:OracleAdapter)
+        assert_match %r[t\.integer\s+"rating",\s+precision: 38,\s+comment: "I am running out of imagination"], output
+      else
+        assert_match %r[t\.integer\s+"rating",\s+comment: "I am running out of imagination"], output
+      end

Oracle adapterの場合、precisionの指定が無くてもdumpにprecisionが出力されてしまうからのようです。


Fix division where a duration is the denominator

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

Fix implicit calculations with scalars and durationsの影響で、分母にDurationを使用した除算の結果がおかしくなってしまっていたのを修正しています。

# before
86400 / 1.hour
# => 86400 hours

1.day / 1.hour
# => 0 days


# after
86400 / 1.hour
# => 24

1.day / 1.hour
# => 24

5.1.1までと同じように、Integerの結果がかえるようになっています。

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

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

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

activerecord/CHANGELOG.md


Require alpha arel

activerecord/activerecord.gemspecの修正です。

Arelのバージョンを9.0.0.alphaに更新しています。

-  s.add_dependency "arel", "~> 8.0"
+  s.add_dependency "arel", "9.0.0.alpha"

~> だとalphaバージョンをインストールしてくれない為、のようです。


Update Gemfile.lock to reflect arel 9.0.0.alpha

Gemfile.lockの修正です。

先のgemspecの修正でGemfile.lockの更新が漏れていたのを対応しています。


Remove single element array preprocess

activerecord/lib/active_record/associations/preloader/association.rbactiverecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rbの修正です。

Refactor Active Record to let Arel manage bind paramsの対応により不要になった、idsの要素が一つだった場合の前処理を削除しています。


Allow Relation#or to accept a relation with different references

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

referencesの値だけが異なるrelationに対して、Relation#orメソッドが正常に動作するよう修正しています。

joined = User.joins(:posts).references(:posts)
joined.where(posts: { name: 'example' }).or(joined.where(name: 'example'))

上記のようなケース。


Clarify add_column limit documentation

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

add_columnメソッドのlimitオプションについて説明している箇所に、幾つかのDBではこのオプションは無視される旨注記を追加しています。具体的にはPostgreSQLでは無視されます。


Allow bin/rails test task to take absolute paths as arguments

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

test runnerにテストを行うファイルを絶対パスで渡した場合に正常に動作しないバグがあったのを修正しています。


Require arel master in the benchmark template

guides/bug_report_templates/benchmark.rbの修正です。

使用するgemにarelを追加しています。今のRailsのmasterブランチを動作させるにはarelのmasterを参照する必要がある為。


Use exact Rails version when verifying.

tasks/release.rbの修正です。

release後のverify taskで、直前にreleaseしたバージョンのRailsでアプリを作成するよう修正しています。

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

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

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

activerecord/CHANGELOG.md


Fix test failures when prepared statements are disabled

Active Recordの修正です。

先日行われたActive Recordのリファクタリング(Refactor Active Record to let Arel manage bind params)の影響で、prepared statementsをdiableにした場合にテストがコケていたのを修正しています。

partial queryを管理するためのcolletor classを作ったりして、まだちょっとリファクタリングを行っています。


Include rack-mini-profiler by default

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

デフォルトで生成されるGemfileMiniProfiler/rack-mini-profilerを追加しています。

が、まだ議論がされきってないのと、rack-mini-profilerはモンキーパッチだらけで良くないのではという事で、後ほどrevertされています。


Revert “Include rack-mini-profiler by default”

というわけで、直前のrack-mini-profilerをデフォルトのgemに追加した対応をrevertしています。


Merge pull request #29765 from lugray/fix_counter_cache

activerecord/lib/active_record/associations/builder/belongs_to.rbactiverecord/lib/active_record/counter_cache.rbの修正です。

after_create callbackの中でupdate_attributesを使用した、かつ、複数のbelongs_to assocationがあり、それぞれcounter cachesを使用している場合に、更新処理でcounter cachecが一度しかインクリメントされない事を確認するテストを追加しています。

元々は、上記条件の場合に2回インクリメントがされてしまっていたのですが、そちらのバグは違うコミットで直ってしまっていたので、このコミットではリグレッションテストだけを追加しています。


Merge pull request #29792 from lugray/delegate_respond_to

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

ActionView::Helpers::ControllerHelper moduleにrespond_to?メソッドを定義し、ControllerHelperがcontrollerにdelegateするメソッド(request_forgery_protection_tokenparams等)については、controllerに対してrespond_to?を行うよう修正しています。


Merge pull request #29853 from lugray/move_generator_namespacing_to_base

railties/lib/rails/generators/base.rbrailties/lib/rails/generators/named_base.rbの修正です。

NamedBaseクラスに定義されていたnamespaceに関するメソッドを、Baseクラスに移動しています。namespaceを正しく扱えてないgeneratorでnamesapceを扱えるようにする為、との事です。んー、メソッド移動せず、NamedBaseクラスを使用するよう修正する、で良さそうな気もしたのですが…。


Merge pull request #29902 from y-yagi/fix_29880

railties/lib/rails/commands/server/server_command.rbの修正です。

Pumaを使用している際、rails serverの起動メッセージにURLの情報(e.g. Rails 5.1.2 application starting in development on http://localhost:3000on http://localhost:3000の部分)を出力しないよう修正しています。

PumaはPuma自体で独自のconfigを持てる、かつ、そこでhostやportの情報が定義出来てしまい、rails serverでは実際に起動する際にしようするhostやportの情報を正しく知る事が出来ない為。


Fix warning: assigned but unused variable - comment

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

test_multiple_counter_cache_with_after_create_updateから、使用していない変数を削除しています。


Merge pull request #29848 from kamipo/fix_distinct_count_with_order_and_limit

Active Recordの修正です。

Avoid unscope(:order) when limit_value is presented for countで、limit_valueが指定されている場合はunscope(:order)`を行わないよう修正したのですが、その影響でDISTINCT + COUNT + ORDER BY + LIMITを実行した場合に、不正なSQLが生成されてしまいエラーになってしまうバグがあったのを修正しています。

# before
User.distinct.order(updated_at: :desc).limit(10).count
# SELECT COUNT(DISTINCT count_column) FROM (SELECT  DISTINCT "users"."id" AS count_column FROM "users" ORDER BY "users"."updated_at" DESC LIMIT $1) subquery_for_count  [["LIMIT", 10]]
# ActiveRecord::StatementInvalid: PG::InvalidColumnReference: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...users"."id" AS count_column FROM "users" ORDER BY "users"."u...
# : SELECT COUNT(DISTINCT count_column) FROM (SELECT  DISTINCT "users"."id" AS count_column FROM "users" ORDER BY "users"."updated_at" DESC LIMIT $1) subquery_for_count


# after
User.distinct.order(updated_at: :desc).limit(10).count
# SELECT COUNT(*) FROM (SELECT  DISTINCT "users".* FROM "users" ORDER BY "users"."updated_at" DESC LIMIT $1) subquery_for_count  [["LIMIT", 10]]

Merge pull request #29897 from kirs/frozen-actionview

Action Viewの修正です。

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


Suppress warning from actionview controller helper.

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

ActionView::Helpers::ControllerHelper moduleでRubyのwarning(`*' interpreted as argument prefix)が出ていたのをで、中括弧を追加し対応しています。


Merge pull request #29859 from dwightwatson/feature/rack-test

actionpack/actionpack.gemspecの修正です。

rack-testのが0.6系を使用するよう固定されていたのを、バージョンの上限ロックを行わないよう修正しています。

-  s.add_dependency "rack-test", "~> 0.6.3"
+  s.add_dependency "rack-test", ">= 0.6.3"

remove depreciated assertion to eliminate warning

activesupport/test/hash_with_indifferent_access_test.rbの修正です。

assert_equalメソッドのexpected引数にnilを指定していたテストを、assert_nilを使用するよう修正しています。

Minitest 5.10から上記使い方がdeprecateになり、nilを期待する場合はassert_nilが使用する必要がある為。


Merge pull request #29898 from deivid-rodriguez/follow_up_to_multiple_location_engine_mounting

actionpack/lib/action_dispatch/routing/mapper.rbactionpack/lib/action_dispatch/routing/routes_proxy.rbの修正です。

一つのRails Engineを異なるlocationにmount出来るよう修正した、Allow mounting the same engine several times in different locations.の影響で、engineの route helpersを使用した際に正しいpathが取得出来ないバグが出来てしまっていたのを修正しています。


Merge pull request #29866 from rlue/master

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

ActionController::Parameters#deleteメソッドのdocで、引数に指定されたkeyが存在しなかった場合の挙動の説明が実際の挙動と異なっていた(説明には、keyが存在しなかったからdefault valueを返すと書かれていたのが、実際返ってくるのはnil)のを修正しています。


Fix warning: ambiguous first argument

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

db:schema:loadのテストでRubyのwarning(warning: ambiguous first argument; put parentheses or a space even after)が出ていたので、中括弧を追加し対応しています。


Merge pull request #29919 from kirs/actionpack-frozen-friendly

Action Packの修正です。

ファイルの先頭にfrozen_string_literal: trueを追加、及び、Stringを変更する箇所でdupを呼び出す等行い、エラーにならないよう対応しています。


Stop creating ApplicationRecord on model generation

Active Record、railtiesの修正です。

application_record.rbが存在しない場合に、model generatorが自動でapplication_record.rbを生成するようにしていたのを、生成しないよう修正しています。

元々Rails 5.0でapplication_record.rbが導入された際に、移行用に自動で生成するようになっていたのですが、もう移行は不要だろうという事で生成しないようになっています。

代わりに、application_record.rbを生成する為のgeneratorが追加されたので、今後application_record.rbが必要になった場合は、そちらを使用する事で対応可能です。


Fix test_add_column_with_timestamp_type when using Oracle

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

test_add_column_with_timestamp_typeのテストがOracle adapterでエラーになっていたのを修正しています。


Extract assert_output and available_pty? into ConsoleHelpers module

railtiesのテストの修正です。

各テストクラスで独自に定義していたconsole test用のヘルパーメソッドをmodule(ConsoleHelpers)に切り出しています。


Suppress deprecated warning in Action Cable

Gemfile.lockの修正です。

event_emitter gemのバージョンを0.2.6に更新しています。0.2.6でFixnumに関する対応を行われており、deprecateメッセージが出ないようになっている為。

参考:Fix Fixnum warning on Ruby 2.4+


[ci skip] Add documentation for after_create_commit and after_update_commit callbacks

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

Transaction Callbacksの項に、after_create_commitafter_update_commitを同じmodelに同時に定義した場合、後勝ち(後で定義した方のみ実行される)になってしまう事についての説明を追加しています。


Remove useless JoinInformation

Active Recordの修正です。

Refactor Active Record to let Arel manage bind paramsの対応により不要になったJoinInformation Structを削除しています。


Remove unused queries_predicates

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

Refactor Active Record to let Arel manage bind paramsの対応により不要になったqueries_predicatesメソッドを削除しています。


Fix dbconsole test when tempdir is a long path

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

dbconsoleのテストで、DB名を取得するのに.databasesを使用していたのを、pragma database_list;を使用するよう修正しています。

.databasesだとpathが長い場合に適当なサイズに結果がトランケートされてしまい、正しく値が取得されない事がありました。しかしpragma database_listだと結果がトランケートされない為、そちらを使用するようにしたとの事です。


Fix failing tests

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

Arelにdelegateするメソッドの一覧からbind_valuesを削除しています。

bind_valuesもう使わなくなった為。参考:Remove unused bind_values

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

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

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

activesupport/CHANGELOG.md


Use frozen string literal in actionmailer/

Action Mailerの修正です。

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


Make actionview ready for frozen strings

actionview/lib/action_view/renderer/streaming_template_renderer.rbの修正です。

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


Make actioncable ready for frozen strings

actioncable/lib/action_cable/channel/base.rbの修正です。

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


Use frozen string literal in actioncable/

Action Cableの修正です。

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


Merge pull request #29860 from georgeclaghorn/travel-back-automatically

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

TimeHelpers moduleでafter_teardownメソッドを定義し、テスト終了時に自動でtravel_backを呼び出すよう修正しています。

これにより、block無しのtraveltravel_toを使用した場合に、明示的にtravel_backを呼ぶ必要は無くなります。 Remove automatic removal of Date/Time stubs after each test caseで一度同様の対応が削除された事があったのですが、自動でtravel_backした方が便利だろう、という事で再度入ったようです。


document metadata support added to message encryptor and message verifier

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

ActiveSupport::MessageEncryptorクラス、ActiveSupport::MessageVerifierクラスのdocにpurposeオプションやメッセージにexpireを設定する場合の方法についてのドキュメントを追加しています。


add to changelog: purpose and expiry support

MessageVerifierMessageEncryptorpurposeexpires_inexpires_atオプションを設定出来るようにした対応(Add purpose and expiry to messages encrypted using Message EncryptorAdd Expiry & Purpose to Message Verifier)についてエントリーを追加しています。

purposeオプションはメッセージの生成時 / 確認時に指定する事が出来、purposeの値が一致しないと、メッセージの確認が出来ないようになっています。

token = @verifier.generate("this is the chair", purpose: :login)

@verifier.verified(token, purpose: :login)    # => "this is the chair"
@verifier.verified(token, purpose: :shipping) # => nil
@verifier.verified(token)                     # => nil

expires_inexpires_atは名前の通りでメッセージに対してexpireする日付・期間を指定する事ができます。指定された日付を超えた場合、そのメッセージは確認出来なくなります。


[ci skip] Remove superfluous paragraphs; fully qualify constants.

activesupport/CHANGELOG.mdの修正です。

先のMessageVerifierMessageEncryptorの対応についてのエントリーを整理しています。


add metadata tests: verify method

activesupport/test/message_verifier_test.rbの修正です。

ActiveSupport::MessageVerifier#verifyメソッドについてのテストを追加しています。


Fix test failure in message verifier tests

activesupport/test/message_verifier_test.rbの修正です。

ActiveSupport::MessageVerifierクラスのテストで現在時刻を取得するのにTime.localを使用していたのを、Time.utcを使用するよう修正しています。Time.localだとテストを実行する環境のTimezoneに結果が依存してしまい、環境によってはテストがコケてしまう為。


Fix warnings in railties tests

Gemfileの修正です。

sass-rails gemを使用するのに、リリース済みのgemではなく、GitHubのブランチを指定するよう修正しています。

リリース済みのsass-railsだとasset_data_urlの再定義に関するwarningが出てしまうのですが、上記ブランチだとその問題が解決済みな為。


Merge pull request #29894 from eugeneius/check_schema_file_dup_string

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

check_schema_fileメソッドでschema fileが存在しない場合に出力するメッセージをdupするよう修正しています。

-          message = %{#{filename} doesn't exist yet. Run `rails db:migrate` to create it, then try again.}
+          message = %{#{filename} doesn't exist yet. Run `rails db:migrate` to create it, then try again.}.dup
           message << %{ If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded.} if defined?(::Rails.root)

直後にmessage変数に値を追加しており、dupしないとfrozen_string_literaltrueを指定している場合にエラーになってしまう為。


Refactor Active Record to let Arel manage bind params

Active Recordの修正です。

Active Recordで行っていたbind paramsの管理をArelで行うようリファクタリングしています。

ASTと、ASTに深く関連しているbind paramsを別に管理しようとして、コードが複雑、かつ、バグが多い状態になっていました。これを、ASTで直接bind paramsを保持するようリファクタリングし、Arel側で生成されるSQLとbind params両方を管理出来るようにした、という事のようです。多分。

その為、Arel側でも諸々修正が行われています。このあたり


Fix build failures on MySQL

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

先のActive Recordのリファクタの影響でコケてしまったテストを修正しています。


Merge pull request #29905 from kamipo/remove_duplicated_assertion

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

count + joinのテストで、同じ内容のassertionがあったのを削除しています。


Fix build failures on PG

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

先のActive Recordのリファクタの影響でコケてしまったテストを修正しています。

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

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

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


Merge pull request #29768 from janpieper/sort-enabled-extensions-in-dump

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

schema dumpにextensionsを出力する際に、sortした値を出力するよう修正しています。実行する度にdumpにdiffが出てしまう(sortしてないと、出力順が不定の為)のを避ける為。


Add task to verify a release.

Rakefiletasks/release.rbの修正です。

リリース作業で生成したgemファイルが問題無いか確認する為のverify taskを作成しています。

中身はrails newrails generate等のコマンドを実際に実行し、動作する事を確認するようになっています。


Support multiple versions in release announcement.

tasks/release.rbtasks/release_announcement_draft.erbの修正です。

複数バージョンのリリースアナウンスを同時に行えるよう、リリースアナウンス生成処理をリファクタしています。


Update release instructions in light of new tasks.

RELEASING_RAILS.mdの修正です。

先のコミットで修正した内容に合わせてReleasing Railsの説明を修正しています。


Remove dependency on from_now extension.

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

Messages::Metadata#pick_expiryメソッドでexpireする時間を取得するのにfrom_nowメソッドを使用していたのを、使用しないよう修正しています。

-              expires_in.from_now.utc.iso8601(3)
+              Time.now.utc.advance(seconds: expires_in).iso8601(3)

Durationクラスへの依存を無くす為、ですかねえ。


Let Metadata instance handle purpose coercion.

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

Messages::Metadata#initializeメソッドで引数のpurposeをStringに変換するよう修正しています。Metadataクラスの各クラスでpurposeを使用する際に、毎回Stringに変換するのを避ける為。


Merge pull request #29867 from koic/fix_a_failed_ar_test_when_using_oracle

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

quoted_table_namequoted_primary_keyを取得するテストがOracle adapterでエラーになっていたのを修正しています。

-    assert_equal ["comments"], scope.references_values
+    if current_adapter?(:OracleAdapter)
+      assert_equal ["COMMENTS"], scope.references_values
+    else
+      assert_equal ["comments"], scope.references_values
+    end

Oracle adapterではquoted_table_namequoted_primary_keyの戻り値が大文字になっている為とのこと。