なるようになるブログ

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

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

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

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

activesupport/CHANGELOG.md


Merge pull request #30821 from GBH/active-storage-readme

activestorage/README.mdの修正です。

Installationの項を追加し、rails active_storage:installタスクについての説明を追加しています。

Remove unnedded Active Storage installation stepsで一度削除された内容なんですよねえ。Active Storageの自動インストール対応がまだマージされてないので必要は必要なのですが。


Add changelog entry about new allow_other_host option for redirect_back method [ci skip]

actionpack/CHANGELOG.mdの修正です。

redirect_backメソッドにallow_other_hostオプションを追加した対応(Add allow_other_host option to redirect_back method)についてCHANGELOGにエントリーを追加しています。


Extract metadata from images and videos

Active Storageの修正です。

blobからメタデータを取得する為の仕組みを追加しています。

取得処理はAnalyzerクラスを使用して行われるようになっており、デフォルトでimageとvideoのメタデータを取得出来るようになっています。

# blobがimageの場合
ActiveStorage::Analyzer::ImageAnalyzer.new(blob).metadata
# => { width: 4104, height: 2736 }

# blobがvideoの場合
ActiveStorage::VideoAnalyzer.new(blob).metadata
# => { width: 640, height: 480, duration: 5.0, angle: 0, aspect_ratio: [4, 3] }

blob保存時にafter_create_commit callbackでメタデータ取得処理が実行される(メタデータ取得処理はActive Job経由で行われるので、基本的には非同期)ようになっています。また、デフォルトで対応しているフォーマット以外のメタデータを取得したい場合、自分でAnalyzerを作成しそれを使用するようにすれば良いようになっています。


Fix links [ci skip]

activestorage/lib/active_storage/analyzer/image_analyzer.rbのdocの修正です。

Analyzer::ImageAnalyzerクラスのdoc内、リンクのフォーマットが崩れていたのを修正しています。


Place MocktailDesigner in test/models/drink_designer.rb

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

MocktailDesignerクラスの定義ファイルをactiverecord/test/models/mocktail_designer.rbからactiverecord/test/models/drink_designer.rbに移動しています。

MocktailDesignerDrinkDesignerクラスの子クラスであり、MocktailDesigner単体で使用する事は無い為、DrinkDesignerと同じファイルに定義するようにしたとの事です。


Use the indicative mood consistently [ci skip]

activestorage/lib/active_storage/downloading.rbのdocの修正です。

ActiveStorage::Downloading#download_blob_to_tempfileメソッドのdocのグラマーの修正を行っています。


Fix #to_json for unreadable IO objects, fixes #26132

activesupport/lib/active_support/core_ext/object/json.rbの修正です。

IOオブジェクトをJSONに変換出来るよう、IOクラスにas_jsonメソッドを追加しています。メソッドの実装は下記の通り。

class IO
  def as_json(options = nil) #:nodoc:
    to_s
  end
end

Ensure associations doesn't table name collide with string joins

activerecord/lib/active_record/associations/alias_tracker.rbactiverecord/test/cases/associations/inner_join_association_test.rbの修正です。

associationとjoinにStringで指定したテーブル名(e.g. joins("JOIN people agents_people ON agents_people.primary_contact_id = people.id"))が衝突しない事を確認するテストを追加しています。


Fix duplicate aliases when using both INNER/LEFT JOINs

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

joinsleft_outer_joinsに同じassociationを指定した場合に、同じaliasが定義されてしまうバグがあったのを修正しています。

# before
User.joins(:posts).left_outer_joins(:posts).count
#=> SELECT COUNT(*) FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"

# after
User.joins(:posts).left_outer_joins(:posts).count
#=> SELECT COUNT(*) FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" LEFT OUTER JOIN "posts" "posts_users" ON "posts_users"."user_id" = "users"."id"

Remove CHANGELOT entry for the change that was backported to 5-1-stable [ci skip]

activejob/CHANGELOG.mdの修正です。

Rails 5.1にバックポートされている対応のエントリーを削除しています。

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

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

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


Avoid slicing from Thor's original HWIA

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

オプションのパース処理にsliceメソッドを使用していたのを、使用しないよう修正しています。

-      opts = (options || {}).slice(*PASSTHROUGH_OPTIONS)
+      opts = (options.dup || {}).keep_if {|k, | PASSTHROUGH_OPTIONS.map(&:to_s).include?(k) }

ここでのoptionsThor::CoreExt::HashWithIndifferentAccessクラスのインスタンスなのですが、Let Hash#slice return a Hashの影響(Hash#sliceの戻り値が必ずHashになった)で、sliceを使用すると戻り値がHashインスタンスになってしまい以降の処理でエラーになってしまう為、Hash#sliceは使用しないようにしています。


Merge pull request #29710 from padi/rails-ujs-docs

actionview/app/assets/javascripts/rails-ujs/utils/dom.coffeeactionview/app/assets/javascripts/rails-ujs/utils/event.coffeeのdocの修正です。

rails-ujsの、Rails.matchesRails.fire及びRails.delegateメソッドにdocを追加しています。

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

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

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

activesupport/CHANGELOG.md


Add test cases for type and foreign_type in the reflections

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

reflectionsのtypeforeign_typeが正しく取得出来る事を確認するテストを追加しています。


Hash#slice is in Ruby 2.5+

activesupport/lib/active_support/core_ext/hash/slice.rbの修正です。

Hashsliceメソッドが定義されていない場合のみメソッドを定義するように修正しています。Ruby 2.5ではRuby本体にHash#sliceメソッドが定義されている為。

参考:hash.c: Add Hash#slice


Move HWIA specific logic for slice and slice! to HWIA class

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

Hash#slice#slice!メソッドにselfがHashWithIndifferentAccessの場合の対応が含まれていたのを削除し、代わりにHashWithIndifferentAccess#sliceHashWithIndifferentAccess#slice!メソッドを追加し、そちらで対応するよう修正しています。


Let Hash#slice return a Hash

activesupport/lib/active_support/core_ext/hash/slice.rbの修正です。

Hash#sliceメソッドが必ずHashクラスのインスタンスを返すよう修正しています。

-    keys.each_with_object(self.class.new) { |k, hash| hash[k] = self[k] if has_key?(k) }
+    keys.each_with_object(Hash.new) { |k, hash| hash[k] = self[k] if has_key?(k) }

元々はself.classを返すようになっていたのですが、Rubyに組み込みのHash#sliceと挙動を合わせる為との事です。挙動が非互換なのですが、恐らく問題になるであるHashWithIndifferentAccessについては対応がされている(先のコミットでメソッドが追加されている)ので、大丈夫だろうという事で対応されています。


[Railties] require_relative => require

railtiesの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。

requireよりrequire_relativeの方が高速な為、Using require_relative in the Rails codebaseで使える箇所は一通りrequire_relativeを使うよう対応がされました。ただ、2.4までのRubyだと、require_relativeシンボリックリンク先のファイルをロード出来ない(Rubyのインストール先がシンボリックリンクを使用している場合ファイルをロード出来ずエラーになる)、という問題があった為、require_relativeを使用するのをやめるようにしています。

なお、上記ファイルロードの問題はRuby 2.5で対応済みです。

参考:

以降各コンポーネントに対して同様の対応が行われています。


[Active Support] require_relative => require

Active Supportの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Active Model] require => require_relative

Active Modelの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Active Record] require => require_relative

Active Recordの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Action Pack] require => require_relative

Action Packの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Action View] require_relative => require

Action Viewの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Action Mailer] require_relative => require

Action Mailerの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Active Job] require_relative => require

Active Jobの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Action Cable] require_relative => require

Action Cableの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。


[Active Storage] require_relative => require

Active Storageの修正です。

コンポーネント内のファイルのロードにrequire_relativeを使用していたのを、requireを使用するよう修正しています。

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

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

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


Merge pull request #30930 from rails/replace-phantomjs-with-chrome

CIでrails-ujsのテストを実行するのにphantomjsを使用していたのを、Selenium + Chrome headlessを使用するよう修正しています。

Chrome headlessの登場により phantomjsはプロジェクトが終了する為。

参考:Please add notice that PhantomJS is abandoned


Keep :api: plugin methods in the doc [ci skip]

actionpack/lib/abstract_controller/rendering.rbactionpack/lib/action_controller/metal/instrumentation.rbのdocの修正です。

Remove :api: tag that has leaked on the doc directly [ci skip]でpublicじゃないメソッドをAPI docに表示しないようにしたのですが、実際は幾つかのメソッドはpublicだった(responders gemで使用していた)為、:doc:を指定してAPI docにメソッドが表示されるよう修正しています。


Remove obsolete documentation [ci skip]

activesupport/lib/active_support/core_ext/string/output_safety.rbのdocの修正です。

html_escapeメソッドのdocにアンセーフなコンテンツを表示する場合hメソッドでescapeする必要がある旨説明が記載されていたのを削除しています。今は自動でescape処理が行われ、明示的に行う必要は無い為。


Return correct exit status of ujs test

actionview/Rakefileの修正です。

rails-ujsのテスト実行用タスクで正しいexit statusを返していなかったのを修正しています。


Convert ignored_columns to a list of string

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

ignored_columnsにStringのリストしか指定出来なかったのを、Symbolのリストも指定出来るよう修正しています。


bundle lock --add-platform java

Gemfile.lockの修正です。

Gemfile.lockjava platformの情報を追加(bundle lock --add-platform javaを実行)しています。

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

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

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

activerecord/CHANGELOG.md


Enable hstore extention disabled at the end of InvertibleMigrationTest#test_migrate_enable_and_disable_extension

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

test_migrate_enable_and_disable_extensionテストの後処理で、hstore extentionを有効化するよう修正しています。

テストの中でhstoreを無効化しているのですが、無効化したままだと他のテストに影響が出てしまう為。


Improve out-of-box experience with System tests including chromedriver-helper by default

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

デフォルトで生成されるGemfileにchromedriver-helperを追加しています。

System testでChromeを使用する際に役に立つ(自動でchromedriverをインストールしたり使用するようにしてくれる)為。


Merge pull request #30579 from bogdanvlviv/fix_ar_internal_metadata_for_a_test_database

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

db:setup及びdb:test:prepare taskで、ar_internal_metadata tableに誤った値(test用DBのenvironmentdevelopmentが設定されてしまっていた)が設定されてしまうバグがあったのを修正しています。


Remove unused FixtureTemplate class

actionview/test/template/digestor_test.rbの修正です。

使用していないFixtureTemplateクラスを削除しています。


Test ignored_columns value is inheritable by subclasses

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

ignored_columnsが子クラスにも影響がある事を確認するテストを追加しています。


Merge pull request #29127 from DmytroVasin/rails-ujs-remote-callbacks

actionview/app/assets/javascripts/rails-ujs/features/remote.coffeeactionview/app/assets/javascripts/rails-ujs/utils/ajax.coffeeの修正です。

ajax:beforeSend callbackに渡したfunction内でfalseをreturnした場合そのajax requestは停止すべきなのですが、実際は停止せず送信処理が行われてしまうバグがあったのを修正しています。

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

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

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

actionpack/CHANGELOG.md


Merge pull request #30876 from y-yagi/selenium_chrome_headless

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

System testにheadless chromeのサポートを追加しています。driven_byメソッドのusingオプションに:headless_chromeを指定すると headless chromeが使用されるようになています。


compatibility - use int instead of bigint

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

Rails 4.2で作られたmigrationファイルでreferencesメソッドを使用した際に、primary key typeにbigintが使われてしまっていたのを、作成したときと同じくintegerが使われるよう修正しています。


Should test LegacyPrimaryKeyTest to both V5_0 and V4_2

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

古いRailsで作られたmigrationファイルのprimary keyの型をチェックするテストを、Rails 4.2と5.0それぞれのバージョンで作成されたmigrationについてテストするよう修正しています。


Fix typo in allow_failure argument [ci skip]

railties/test/isolation/abstract_unit.rbのdocの修正です。

allow_failure引数をallow_failuresにタイポしていたのを修正しています。


Remove unnecessary allow_failure: true option

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

routes taskを実行する際に、allow_failure: trueを指定していたのを削除しています。

routes taskは必ずexit statusが0に設定され、taskが失敗(exit statusが0以外)する事は無い為。


Remove unused UnknownController class

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

使用していないUnknownControllerクラスを削除しています。


Add mention how to delete several records in bulk to Active Record Basics Guides [ci skip]

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

Deleteの項にdestroy_allメソッドについての説明を追加しています。


Set proper migration' version in bug report templates

guides/bug_report_templates/active_record_migrations_gem.rbguides/bug_report_templates/active_record_migrations_master.rbの修正です。

migrationファイルのバージョンを5.0 -> 5.1に更新しています。

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

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

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


Merge pull request #30901 from aditya-kapoor/fix-range-to-s

activesupport/lib/active_support/core_ext/range/conversions.rbの修正です。

アルファベットを指定したRangeオブジェクトに対してto_s(:db)メソッドを呼び出すとエラーになってしまっていたのを修正しています。

("a".."z").to_s(:db)
# => "BETWEEN 'a' AND 'z'

Update mailing list URL in I18n guide [ci skip]

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

rails-i18n mailing listのリンクが古いままになっていたのを修正しています。