なるようになるブログ

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

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

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

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

activerecord/CHANGELOG.md


Match destroyed_by_association for has_one to has_many

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

has_one associationをdependent: destroyで削除した際に、destroyed_by_associationをtrueを設定するよう修正しています。has_many associationsと挙動を合わせる為。


Revert “Extract bind_param and bind_attribute into ActiveRecord::TestCase

各テストそれぞれで独自に行っていた、Arel::Nodes::BindParamActiveRecord::Relation::QueryAttributeの生成処理をActiveRecord::TestCaseで行うよう修正した、Extract bind_param and bind_attribute into ActiveRecord::TestCaseをrevertしています。

上記処理が必要なテストは多くなく、TestCaseクラスに含む必要は無い為、というのが理由のようです。


Merge pull request #29732 from kirs/frozen-activerecord

Active Recordの修正です。

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


Merge pull request #29869 from kamipo/make_type_map_to_private

Active Recordの修正です。

AbstractAdapter#type_mapメソッドの可視性をprivateにしています。

type_mapメソッドはconnection adapterでしか使用しておらず、publicである必要は無い為。


Merge pull request #29858 from y-yagi/use_argument_error_instead_of_own_error_class

activejob/lib/active_job/test_helper.rbactivejob/test/cases/test_helper_test.rbの修正です。

Active Jobのテスト用ヘルパーメソッド(assert_enqueued_jobs, assert_performed_jobs等)にonlyexceptオプションを同時に指定した場合にraiseするエラークラスを、独自のエラークラス(InvalidOptionsError)からArgumentErrorに修正しています。

引数エラーの場合にraiseされるエラーなので、独自エラークラスよりArgumentErrorの方が的確な為。


Merge pull request #29870 from kamipo/use_true_false_literals

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

MySQL adapterのboolean serialization処理を独自に定義していたのを、abstract adapterで定義されているserialization処理を使用するよう修正しています。

Change sqlite3 boolean serialization to use 1 and 0でabstract adapterのboolean serializationでTRUEFALSEリテラルが使われるようになったのですが、MySQLでも左記リテラルをサポートしている為、abstract adapterのserialization処理を使用するようにしています。

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

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

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


Merge pull request #29851 from printercu/patch-1

railties/lib/rails/tasks/yarn.rakeの修正です。

yarn:yarn:install task実行時に--productionオプションを指定するよう修正しています。dev dependenciesを無視する為。


Remove log directory in test postprocessing

actionview/Rakefileの修正です。

rail-ujsのテストの後処理で、logディレクトリを削除するのに、FileUtils.rm_fを使用していたのを、FileUtils.rm_rfを使用するよう修正しています。


Updates Rails upgrade guide for 4.2 to 5.0 regarding the removal of ActionView::Helpers::RecordTagHelper

rails guideのA Guide for Upgrading Ruby on Railsの修正です。

ActionView::Helpers::RecordTagHelper moved to external gem (record_tag_helper)"の項を追加し、content_tag_fordiv_forメソッドが外部gem(record_tag_helper)になった事についての説明を追加しています。


Suppress documentation for content_tag_for and div_for since they were removed already

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

div_forcontent_tag_forメソッドに:nodoc:を指定して、API docに表示されないよう修正しています。外部gemに切り出されている為。


Fix false positive test related to wrong app root path.

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

Rails.application.config.read_encrypted_secretsfalseを指定した場合にsecretesのparse処理が行われない事を確認するテストが正しく動作しないなかったのを修正しています。

Rails.application.config.rootの指定に誤りがあり、read_encrypted_secretsの値にかかわらずsecretesのparse処理が行われない状態になってしまっていた為、Rails.application.config.rootに正しいpathを指定するようにしています。

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

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

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


Move back to @matthewd’s close io fixed rb-inotify.

Gemfileの修正です。

forkしたrb-inotifyを使用するよう修正しています。

rb-inotifyにRuby 2.2.5でエラーになってしまう問題があり(Ensure the IO always gets closed, exactly once)、少し前(Fixes FIXME: rb-inotify 0.99 has been released)まで、このforkした方のrb-inotifyを使用していました。

その後、先にあげたPRがマージされた為、リリースされたrb-inotifyが使用するようになっていたのですが、どうもPRが正しくマージされてなかったらしくまだ問題が残っている為、再度forkした方を使用するようにしたとの事です。


add metadata support to message verifier

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

ActiveSupport::MessageVerifierメタデータ(purposeexpires_atexpires_in)を扱えるよう修正しています。Add expires_at, expires_in, and purpose meta_data to messages.の続き。


Add jQuery to test vendor files

actionview/test/ujs/views/layouts/application.html.erbactionview/test/ujs/public/vendor/jquery-2.2.0.jsの修正です。

public/vendor配下にjQuery 2.2.0を丸々保持するようにしています。元々はhttp://code.jquery.com/jquery-2.2.0.jsを直接参照していたのですが、これだとネットワークが使えない環境でテストがエラーになってしまう為、ファイルをローカルに保持するようにしたとの事です。

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

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

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

activerecord/CHANGELOG.md


Fix typo s/rause/raise/

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

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


Don’t convert dates to strings when using prepared statements in mysql

`activerecord/lib/active_record/connection_adapters/mysql/quoting.rb

MySQLでprepared statements を使用している場合、Date、Time等の値をStringに変換しないよう修正しています。

mysql2 gemの方でDateをそのまま扱える、かつ、そちらの方が高速な為、との事です。


Merge pull request #29834 from kamipo/fix_unscoping_default_scope_with_sti_association

Active Recordの修正です。

Post.joins(:users) should not be affected by `User.current_scope`の対応の影響で、STI associationsのdefault_scopeをunscope出来なくなってしまっていたのを、再度出来るよう修正しています。


Merge pull request #29815 from posthumanism/add-except-option

activejob/lib/active_job/queue_adapters/test_adapter.rbactivejob/lib/active_job/test_helper.rbの修正です。

Active Jobのテスト用ヘルパーメソッド(assert_enqueued_jobs, assert_performed_jobs等)でexceptオプションを使用出来るよう修正しています。onlyオプションの逆で、除外するJob Classを指定する為のオプションです。

perform_enqueued_jobs(except: HelloJob) do
  MyJob.perform_later(1, 2, 3) # will be performed
  HelloJob.perform_later(1, 2, 3) # will not be performed
end

assert_performed_jobs 1

Merge pull request #29785 from cswilliams/rescue_postgres_connection_errors_on_dealloc

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

DEALLOCATE処理でエラーになった場合に、何も処理をせずエラーを無視するよう修正しています。

          def dealloc(key)
             @connection.query "DEALLOCATE #{key}" if connection_active?
+          rescue PG::Error
           end

このDEALLOCATEでエラーになるのはconnectionが停止している / 切断されている時で、その状態でエラーになっても何も処理を行う必要が無い為、エラーを無視するようにしたようです。

因みに、connection_active?メソッドはconnectionが停止 / 切断 している時にtrueを返す事があるとの事です。参考:PostgreSQL adapter: reconnection problem


Merge pull request #29780 from MaxLap/fix_unscope_where_column_with_or

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

unscoped(where: [columns])を使用した場合に、誤ったbind valuesを削除してしまうケースがあったのを修正しています。

Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql

# before
# => SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)

# after
# => SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)

Merge pull request #29775 from yui-knk/assign_once

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

DataStreaming#send_file_headers!メソッドで複数回行われていたcontent_typeの設定処理を、一度だけ行うようリファクタリングしています。


Fix type casting a time for MariaDB

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

Don’t convert dates to strings when using prepared statements in mysqlMySQLでDate、Time等の値をStringに変換しないよう修正してたのですが、MariaDBではまだTimeのtype castが必要そう、という事で、Timeについては再度type castするよう修正しています。


Merge pull request #29033 from kamipo/make_preload_query_to_prepared_statements

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

preload queryもprepared statementsに出来るよう修正しています。


Fix warning: circular argument reference

activejob/lib/active_job/test_helper.rbの修正です。

warning: circular argument reference - exceptのwarningが出ていたので、不要な引数の参照を削除しています。


Create rails@localhost user on travis ci

ci/travis.rbの修正です。

CIでMySQLのテストを実行する前に、rails@localhostユーザを作成、及び、rails@localhostユーザに権限を付与するようにしています。

CIでAccess deniedのエラーが出るようになった為、明示的にユーザを作成するようにしたとの事です。これ何でいきなり出るようになったんでしょうねえ。


[ci skip]Replace jquery-ujs with rails-ujs

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

csrf_meta_tagsメソッドのdocにjquery-railsについての説明があったのを、rails-ujsに修正しています。


Add expires_at, expires_in, and purpose meta_data to messages.

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

Message Encryptorで生成するencrypted messageにメタデータ(purposeexpires_atexpires_in)を含められるよう修正しています。

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

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

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

activerecord/CHANGELOG.md

railties/CHANGELOG.md


Allow multiparameter assigned attributes to be used with text_field

Active Model, Active Recordの修正です。

multi-parameter assignmentで構築された値(e.g. written_on(1i)written_on(2i)written_on(3i))をtext_fieldhidden_fieldで使用出来るよう(使用した値をARで受け取れるよう)修正しています。


Merge pull request #27662 from nhorton/patch-1

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

Adding Member Routesの項にあるroutes helperのexampleで、メソッド名に誤りがあったのを修正しています。


Scrub the invalid paramter value before using it in the error

actionpack/lib/action_dispatch/request/utils.rbの修正です。

paramsのencodingが不正な値だった場合のエラーの、エラーメッセージの修正、及び、対象のparamsscrubした値をメッセージに含むよう修正しています。

-            raise Rack::Utils::InvalidParameterError, "Non UTF-8 value: #{params}"
+            raise Rack::Utils::InvalidParameterError, "Invalid encoding for parameter: #{params.scrub}"

不正なencodingが含まれたままエラーメッセージを生成しようとすると、エラーメッセージ生成の際に違うEncodingエラーが発生してしまう為、scrubメソッドを使用して不正なバイト列を削除しています。


Add bootsnap to default Gemfile

railtiesの修正です。

デフォルトで生成されるGemfilebootsnapを含むよう修正しています。

config/boot.rbでbootsnapのsetup処理がrequireされるようになっています。


Merge pull request #29788 from kamipo/remove_unused_mutex_m

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

不要なmutex_mのrequireを削除しています。


Persistence#delete should not be affected by scoping

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

Persistence#deleteメソッドがscopingの影響を受け無いよう修正しています。


Fix where with a custom table

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

custom tableを使用している場合に、whereメソッドがエラーを返してしまうバグがあったのを修正しています。


Fix HashWithIndifferentAccess#default when include?(nil)

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

HashWithIndifferentAccessのデフォルト値にブロックを与えている時に、HashWithIndifferentAccess#defaultメソッドを引数無しで呼び出した場合、Hash#defaultメソッド同様にnilを返すよう修正しています。


Merge pull request #25564 from brewski/serializable_hash_fix

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

ActiveRecord::Serialization#serializable_hashにfreezeした値を渡した際に正常に動作する事を確認するテストを追加しています。


Merge pull request #29799 from kamipo/remove_outdated_test_scoped_responds_to_delegated_methods

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

RelationArrayarel_tabledelegateする事を確認するテストを削除しています。

Arrayへのdelegateはもう行われていない、delegateを確認する為に使われているメソッド(insertupdate等)はRelationに定義されており、もう意味が無いため削除したとの事です。


Merge pull request #29801 from kamipo/extract_null_relation_test

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

NullRelationに関するテストを別ファイルに切り出しています。


Rename helper to force_lazy_load_hooks.

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

load hookを実行する為だけのメソッドの名前をlazy_loadからforce_lazy_load_hooksに修正しています。


support - as an argument to rails runner

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

rails runnerコマンドで-引数を指定出来るようにしています。-を指定した場合はstdinから値を読むこむようになります。

# bin/count_users.rb
puts User.count

上記のようなスクリプトがあった場合に、cat bin/count_users.rb | bin/rails runner - のような使い方が出来るようになっています。

docker使っている場合に、cat script.rb | docker exec -it <container_id> rails runner -みたいな使い方が出来るなら便利かもですねえ。


[ci skip] CodeTriage badge

README.mdの修正です。

READMEにCodeTriageのbadgeを追加しています。


Merge pull request #29828 from kamipo/fix_using_custom_table_with_joins

Active Recordの修正です。

custom tableを使用しているmodelにjoin処理を行った場合に、エラーになってしまうバグがあったのを修正しています。


Remove incorrect comment

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

ActiveRecord::AttributeSetattributesがprotectedになっている理由は、privateにしてしまうとRuby 2.2系でwarning(private attribute?)が出てしまう為とのコメントがあったのですが、ここではprotectedにしているのは左記とは別の理由のため、該当のコメントを削除しています。


Remove deprecated code concerning dirty methods in after callbacks

Active Recordの修正です。

deprecatedになっていたafter callbacksでdirty methodsを使用した場合の為の処理を削除しています。


Remove deprecated code concerning non-attributes and *_will_change!

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

deprecatedになっていたattribute_will_change!にvirtual attributesを指定した場合の処理を削除しています。

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

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

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

activesupport/CHANGELOG.md

activerecord/CHANGELOG.md


Fix code formatting for QueryMethods#select

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

QueryMethods#selectメソッドのdocのフォーマットの修正を行っています。


explain why require_relative is not used here [ci skip]

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

retrieve_store_classメソッドでrequire_relativeではなくrequireを使用している理由についての説明を追加しています。


Fix root not being defined on Travis.

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

TestUnitReporter#app_rootメソッドでRails.rootを取得する前に、Railsrootメソッドが定義されているか確認するよう修正しています。

railsの各コンポーネントのテストを実行する際、Rails moduleは定義されているが、rootメソッドが定義されていない事がありえる為。


Merge pull request #29819 from kirs/frozen-activemodel

Active Modelの修正です。

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


Set RAILS_ENV before load application file

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

require_application_and_environment!メソッドを呼び出す前に

ENV["RAILS_ENV"]に値を設定するよう修正しています。RAILS_ENVに値を設定する前にconfig/applicationを読み込みむとデフォルトのenv(development)のファイルが読み込まれてしまう為。


Enable Layout/FirstParameterIndentation cop

.rubocop.ymlLayout/FirstParameterIndentation copを追加、及び各ファイルにcopを反映しています。


Remove useless arel_engine

Active Recordの修正です。

不要なarel_engineメソッドを削除しています。

元々、arel_engineメソッドはFinderMethods#raise_record_not_found_exception!メソッドでのみ使用していたのですが、engineではなくklass.connectionを渡しても正常に動作する為、削除したとの事です。


Merge pull request #28077 from Erol/make-reverse-merge-bang-order-consistent

activesupport/lib/active_support/core_ext/hash/reverse_merge.rbactivesupport/lib/active_support/hash_with_indifferent_access.rbの修正です。

Hash#reverse_merge!メソッドの結果のオーダーが、Hash#reverse_mergeHashWithIndifferentAccess#reverse_merge、#reverse_merge!`と異なっていたのを、全て同じオーダーになるよう修正しています。

# before
ab = {a: 1, b: 2}
c = {c: 3}

indifferent_ab = HashWithIndifferentAccess.new(a: 1, b: 2)
indifferent_c = HashWithIndifferentAccess.new(c: 3)

ab.reverse_merge(c) #=> {c: 3, a: 1, b: 2}
ab.reverse_merge!(c) #=> {a: 1, b: 2, c: 3}
indifferent_ab.reverse_merge(c) #=> {c: 3, a: 1, b: 2}
indifferent_ab.reverse_merge!(c) #=> {c: 3, a: 1, b: 2}

# after
ab.reverse_merge!(c) #=> {c: 3, a: 1, b: 2}

Post.joins(:users) should not be affected by User.current_scope

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

Relation#joinsでtarget modelのcurrent_scopeに影響を受けないよう修正しています。ただ、unscopedの情報については使用されるようになっています。


Add documentation for class_attribute options

activesupport/lib/active_support/core_ext/class/attribute.rbのdocの修正です。

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

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

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

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

railties/CHANGELOG.md


Remove redundant instances of the word ‘simply’ from documentation, on the basis that if it was simple, the user wouldn’t be reading the docs

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

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


Merge pull request #29770 from y-yagi/fix_boolean_column_migration_script

Active Recordの修正です。

SQLite 3 adapterでbooleanの値を保持するのにStringのt / fを使用していたのを、Integer(1 / 0)を使用するよう移行する為のスクリプトにタイポがあったのを修正しています。


Merge pull request #29769 from kamipo/remove_extra_order_for_first

Active Recordのテストの修正です。

テストでレコードの最初の行を取得するのに、all.merge!(order: "id").firstorderしていたのを、単純にfirstを使用するよう修正しています。

Made `first` finder consistent among database engines by adding a default order clause からRelation#firstはprimary keyでorderした値を返すようになっており、明示的にorderする必要は無い為。


Merge pull request #29679 from kamipo/add_test_case_for_27724

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

associationに既に存在しているconditionを上書き出来る事を確認するテストを追加しています。


Remove blank lines in setup

railties/lib/rails/generators/rails/app/templates/bin/setup.ttの修正です。

bin/setupbin/yarnを実行する処理の後に不要な空行があったのを削除しています。


Do not generate unused components contents in app:update task

railtiesの修正です。

app:update taskで、使用していないコンポーネントに関するファイル、configは生成しないよう修正しています。

元々はアプリの状態に関わらず全てのファイル、configを生成するようになっていたのですが、例えば--skip-action-cableを指定して作成したアプリの場合、Action Cablenに関するファイル、configは生成しないようになります。


Merge pull request #29771 from kamipo/fix_create_with_using_both_string_and_symbol

Active Recordの修正です。

create_withに同じkeyをString、Symbolでそれぞれで指定した場合に、後から設定した値が正しく反映されないバグがあったのを修正しています。


Merge pull request #29809 from kamipo/remove_unused_ivars

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

ActiveRecord::Relation#resetメソッドから使用していない変数を削除しています。


Remove unused requires

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

使用していないファイルのrequireを削除しています。


Set represent_boolean_as_integer via configuration

Active Recordの修正です。

SQLite 3 adapterでbooleanの値を保持するのに、String又はIntegerを使用するかを指定する為のフラグをconfig経由で指定出来るよう修正しています。

元々はActiveRecord::ConnectionAdapters::SQLite3Adapterのattributeを直接参照するようになっていたのですが、ActiveRecord::ConnectionAdapters::SQLite3Adapterはinitiaiizer実行時点ではloadされておらず、initiaiizerから値が設定出来ない為、config経由で値を指定出来るようにしています。


add helper method for explicit lazy load

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

lazy load hookを呼び出す為のヘルパーメソッドを追加しています。


Fix create_with with multiparameter attributes

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

create_withメソッドにmultiparameter attributes(date型のwritten_on(1i)written_on(2i)等)を指定出来るよう修正しています。


Don’t cache scope_for_create

Active Recordの修正です。

scope_for_createの結果をcacheしていたのを、cacheしないよう修正しています。通常の処理でcacheされたscope_for_createが使われる事は無く、cacheする意味が無いため。


Allow to pass a connection to the dbconsole command

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

dbconsoleコマンドでconnection name(DB configファイルの3階層目の値)を指定出来るよう修正しています。

bin/rails dbconsole -c replicaのように、-cオプション経由で指定出来るようになっています。


Deprecate environment as an argument for dbconsole and console

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

dbconsoleconsoleコマンドのregular argumentとしてenvironment’s nameを指定するのがdeprecateになりました。今後はenvironment’s nameを指定するのに必ず-eオプションを指定する必要があります。

# before
$ bin/rails dbconsole production

# after
$ bin/rails dbconsole -e production

Properly expand the environment’s name

railtiesの修正です。

dbconsoleconsoleコマンドの-eオプションでenvironment’s nameを指定する際に、自動で補完(prodと指定した場合、productionにしてくれる)するよう修正しています。


Replace Erubis with Erubi in a part of guide [ci skip]

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

Railsが依存しているgemの一覧にerubisが残っていたのを、erubiに修正しています。