なるようになるブログ

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

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

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

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


Merge pull request #28712 from kamipo/tweaks_28678

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

schema.rbの先頭に表示するschemaのバージョンをフォーマットした値を表示するよう修正した、Merge pull request #28678 from hedgesky/use_formatted_number_as_schema_versionのフォローアップとして、

  • formatted_versionメソッドのコメントの内容が実際の結果と違っていたのを修正
  • version Stringの生成処理をメソッドに切り出し
  • 重複していたガード処理を削除

を行っています。


Merge pull request #28726 from matthewd/transaction-locking

Active Recordの修正です。

DBトランザクション処理全体に対して、スレッドのロック処理を追加しています。

一部diff。

      def begin_transaction(options = {})
-        run_commit_callbacks = !current_transaction.joinable?
-        transaction =
-          if @stack.empty?
-            RealTransaction.new(@connection, options, run_commit_callbacks: run_commit_callbacks)
-          else
-            SavepointTransaction.new(@connection, "active_record_#{@stack.size}", options,
-                                     run_commit_callbacks: run_commit_callbacks)
-          end
+        @connection.lock.synchronize do
+          run_commit_callbacks = !current_transaction.joinable?
+          transaction =
+            if @stack.empty?
+              RealTransaction.new(@connection, options, run_commit_callbacks: run_commit_callbacks)
+            else
+              SavepointTransaction.new(@connection, "active_record_#{@stack.size}", options,
+                                       run_commit_callbacks: run_commit_callbacks)
+            end

-        @stack.push(transaction)
-        transaction
+          @stack.push(transaction)
+          transaction
+        end
       end

(@connection.lockはMonitorクラスのインスタンス)

Merge pull request #28083 from eileencodes/ensure-test-threads-shared-db-connで、テスト実行時に異なるスレッドで同じDB connectionを使うようにしたになったのですが、その影響でデッドロックが発生する場合がある為、スレッドロックを追加したようです。


:scissors:

各ファイルの先頭から不要な空行を削除しています。

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

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

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

actionpack/CHANGELOG.md


Update routing doc on the get to: option [ci skip]

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

Singular Resourcesの項で、getメソッドのオプションに既に存在しないtoオプションを使用している箇所があったのを、actionオプションを使用するよう修正しています。


Don’t freeze input strings

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

ActiveModel::Type::String#cast_valueメソッドがfreezeした値を返すようになっていたのを、freezeしないよう修正しています。

# before
name = 'John'
name.frozen?  # => false
user = User.new name: name
user.save
name.frozen? #=> true

# after
name = 'John'
name.frozen?  # => false
user = User.new name: name
user.save
name.frozen? #=> false

メモリ使用量削減の為にfreezeするようになっていたのですが、ユーザ側で使用している変数もfreezeされてしまう事なる為、それは良くないだろうという事で修正されたようです。

参考:Add an immutable string type to opt out of string duping


Merge pull request #28722 from DmytroVasin/rails-ujs-default-url

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

ajax requestsを投げる際に、デフォルトでurlオプションが設定されてなかったのを設定するよう修正しています。 urlの指定が無いとrails-ujs内でエラーになってしまう為。


Merge pull request #28402 from jules2689/action-controller-api-base-hooks

actionpack/lib/action_controller/api.rbactionpack/lib/action_controller/base.rbの修正です。

action_controller_apiaction_controller_base load hookを追加しています。名前の通りで、それぞれActionController::APIActionController::Baseがloadされた時に実行されるhookです。

合わせて、Getting Started with Engines guideにActive Support On Load Hooksの項を追加し、load hookについての詳細な説明を追加しています。


Fix rubocop violations

actionview/lib/action_view/digestor.rbrailties/lib/rails/generators/named_base.rbの修正です。

rubocopの設定に違反している箇所があったのを、まとめて修正しています。


:scissors:

rails guideのGetting Started with Enginesの修正です。

行末尾の不要なスペースを削除しています。


Move CHANGELOG.md entry from Active Support to Action Pack

先のaction_controller_apiaction_controller_base load hookの追加対応のエントリーがActive SupportのCHANGELOG.mdにかかれてしまっていたのを、Action PackのCHANGELOG.mdに移動しています。


Use a query that’s compatible with PostgreSQL 9.2

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

primary key取得処理のSQLリファクタリングしています。

          select_values(<<-SQL.strip_heredoc, "SCHEMA")
-            SELECT a.attname FROM pg_index i
-            CROSS JOIN generate_subscripts(i.indkey, 1) k
-             JOIN pg_attribute a
-               ON a.attrelid = i.indrelid
-              AND a.attnum = i.indkey[k]
-            WHERE i.indrelid = #{quote(quote_table_name(table_name))}::regclass
-              AND i.indisprimary
+            SELECT a.attname
+              FROM (
+                     SELECT indrelid, indkey, generate_subscripts(indkey, 1) idx
+                       FROM pg_index
+                      WHERE indrelid = #{quote(quote_table_name(table_name))}::regclass
+                        AND indisprimary
+                   ) i
+              JOIN pg_attribute a
+                ON a.attrelid = i.indrelid
+               AND a.attnum = i.indkey[i.idx]
+             ORDER BY i.idx

元のSQLだとPostgreSQL 9.2でエラーになってしまう為修正したとの事です。合わせて、CIにPostgreSQL 9.2の環境を追加しています。PG UndefinedTableエラーが発生してしまう、という事らしいのですが、何が悪いのかよくわからない…。

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

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

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


Small grammar fixes

rails guideのRails on Rackの修正です。

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


Remove link to rack.github.io

rails guideのRails on Rackの修正です。

Introduction to Rackの項から、Rack API Documentationへのリンクを削除しています。先にあるResourcesの項に同じ先へのリンクがある為、こちらは無くても良いだろう、という事で削除されたようです。


Fix an AR test of relations_test when using Oracle

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

#inspectメソッドで全てのレコードを読み込まない事を確認するテストがOracle adapterでコケていたのを修正しています。

-    assert_sql(/LIMIT/) do
+    assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) do
       Post.all.inspect
     end

OracleにはLIMITが無く、ROWNUMが使われるので、ROWNUMのチェックを追加、及び、 Oracle 12cではFETCH FIRST n rowsという新しいシンタックスが使われるようになっているので、そちらもチェック対象に追加しています。

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

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

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

activesupport/CHANGELOG.md


Merge pull request #28713 from kamipo/expose_queries_for_association_queries

Active Recordの修正です。

AssociationQueryValuePolymorphicArrayValuequeriesメソッドを追加し、queryを外から取得出来るよう修正しています。


exclude ORDER BY clause for exists? (#28699)

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

exists?メソッドで、ORDER BY句を除外するよう修正しています。

# before
Model.order(status: :desc).any?
# SELECT  1 AS one FROM `models` ORDER BY `models`.`status` DESC LIMIT 1

# after
Model.order(status: :desc).any?
# SELECT COUNT(*) FROM `models`

Merge pull request #26981 from kamipo/should_not_except_order_for_existsでORDER BY句を維持するよう修正したのですが、 下位互換を維持する為(ORDER BYが設定されている事によりSQLエラーになるのを防ぐ為)、修正されたようです。

なお、exists?の挙動を変えたい場合は、construct_relation_for_existsを上書きすれば出来るようになっています。参考:Extract construct_relation_for_exists in FinderMethods


Implement fetch_values for HashWithIndifferentAccess (#28316)

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

HashWithIndifferentAccessfetch_valuesメソッドを追加しています。挙動はRuby#fetch_valuesと同じです。

hash = ActiveSupport::HashWithIndifferentAccess.new
hash[:a] = 'x'
hash[:b] = 'y'
hash.fetch_values('a', 'b') # => ["x", "y"]
hash.fetch_values('a', 'c') { |key| 'z' } # => ["x", "z"]
hash.fetch_values('a', 'c') # => KeyError: key not found: "c"

[ci skip] documented issue related before_destroy

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

Destroying an Objectの項に、associationのrecord削除時にcallbackを実行したい場合、before_destroy callbackはdependent: :destroy associationsより先に定義する必要がある(:dependentはcallbackを使用しており、callbackは定義された順に実行される為)旨説明を追加しています


Pluralize callback

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

callback -> callbacksに修正しています。

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

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

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


Remove mentions and instructions for docrails

rails guideのAPI Documentation GuidelinesContributing to Ruby on Railsの修正です。

各箇所からdocrailsに関する説明を削除しています。docrailsはprivateリポジトリになってしまい、コミッターしか見れなくなってしまい、コントリビューターはrails/railsにPRを送る必要がある為。


Drop the “Sanity Check” contributing step

rails guideのContributing to Ruby on Railsの修正です。

Sanity Checkの項をまるまる削除しています。


Merge pull request #28705 from kamipo/extract_construct_relation_for_exists

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

exists?メソッドの為のrelationの構築処理をメソッド(construct_relation_for_exists)に切り出しています。


Merge pull request #28678 from hedgesky/use_formatted_number_as_schema_version

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

schema.rbの先頭に表示するschemaのバージョンを、フォーマットした値を表示するよう修正しています。

# before
ActiveRecord::Schema.define(version: 20170404131909)

# after
ActiveRecord::Schema.define(version: 2017_04_04_131909)

timestampをわかりやすくする為ですかね。ちょっと違和感が…。


Add scaffolding for different sections in 5.1 release notes

rails guideのRuby on Rails 5.1 Release Notesの修正です。

コンポーネントRemovalsDeprecationsNotable changesのセクションヘッダーを追加しています。


Add text to “Upgrading to Rails 5.1”

rails guideのRuby on Rails 5.1 Release Notesの修正です。

Upgrading to Rails 5.1の項にテキストを追加しています。


Merge pull request #28697 from y-yagi/remove_duplicated_delivery_method_definition

actionmailer/test/parameterized_test.rbの修正です。

重複して行われていたActionMailer::Base.delivery_methodへの設定を削除しています。


delegate_to_missing doesn’t delegate private methods

activesupport/lib/active_support/core_ext/module/delegation.rbの修正です。

delegate_missing_toメソッドをprivateメソッドにはdelegateしないよう修正しています。


delegate_missing_to should fall back to super

activesupport/lib/active_support/core_ext/module/delegation.rbの修正です。

delegate_missing_toメソッドで、targetに指定されたメソッドが見つからなかった場合に、superにfallbackするよう修正しています。

-        #{target}.respond_to?(name)
+        #{target}.respond_to?(name) || super

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

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

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


Fix Guides to include #23138 [ci skip]

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

Singular Resourcesの項に、resolveメソッドのexampleを追加しています。


:scissors:

railties/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.cssの修正です。

行末尾にあった不要なスペースを削除しています。


More :scissors:

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

yarnコマンド実行行の後に不要な空行があったのを削除しています。


Spaces

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

bin/rails db:migrateの前に空行を追加してます。

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

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

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

activerecord/CHANGELOG.md


Improve logging when Origin header doesn’t match

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

CSRF tokenのチェックでエラーになった場合、かつ、異なるoriginからのリクエストだった場合に、ログにその詳細(e.g. HTTP Origin header (http://bad.host) didn't match request.base_url (http://test.host))を出力するよう修正しています。


Fix warning: already initialized constant HashWithIndifferentAccessTest::HashWithIndifferentAccess

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

HashWithIndifferentAccessを再定義している事によるRubyのwarningがでていたので、不要な定義処理を削除し対応しています。


Remove duplicated “test” prefix

各テストから、重複していた"test"という文字を削除しています。

例。

-  test "test type casting with emulated booleans" do
+  test "type casting with emulated booleans" do

Merge pull request #28632 from kamipo/fix_warning_extra_states_are_no_longer_copied

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

ActiveModel::ErrorsRubyのwarning(warning: extra states are no longer copied)が出ていたのを修正しています。

    def values
-      messages.reject do |key, value|
-        value.empty?
+      messages.select do |key, value|
+        !value.empty?
       end.values
     end

default_procが設定されているHashに対してrejectメソッドを呼び出すと上記warningが出てしまうので、selectを使用するよう修正したようです。知らなかった。

参考:https://github.com/ruby/ruby/blob/v2_4_1/hash.c#L1335-L1337


Merge pull request #28670 from aledalgrande/activerecord-docs-fix

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

Halting Executionの項でcallback chainを止める方法にfalseをreturnする旨説明が記載されていたのを、throw :abortを行う必要がある旨説明を修正しています。


Passing in no arguments to the dynamic fixture accessor method returns all fixtures, not an empty array.

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

fixturesのaccessor methodに引数を指定しなかった場合に、全てのfixtureの値を返すよう修正しています。

# todo.yml
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html

one:
  title: MyString
  user: one

two:
  title: MyString
  user: two
# before
todos
# => []

# after
todos
# => [#<Todo id: 980190962, title: "MyString", user_id: 980190962, created_at: "2017-04-07 21:30:11", updated_at: "2017-04-07 21:30:11">, #<Todo id: 298486374, title: "MyString", user_id: 298486374, created_at: "2017-04-07 21:30:11", updated_at: "2017-04-07 21:30:11">]