なるようになるブログ

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

rails commit log流し読み(2016/04/19)

2016/04/19分のコミットです。

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

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md


Don't create new arrays when trying to compute non_empty_predicates for where clause predicate. Get a 3-4% improvement in AST generation.

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

#non_empty_predicatesで空配列を作成するのに、定数を使用するよう修正しています。

+      ARRAY_WITH_EMPTY_STRING = ['']
       def non_empty_predicates
-        predicates - ['']
+        predicates - ARRAY_WITH_EMPTY_STRING
       end

ちょっとだけ性能改善になっているそうです。


Database comments: switch to keyword args for new table options

Active Recordの修正です。

Database commentsの指定にキーワード引数を使用するよう修正、オプションの設定処理を#add_table_options!メソッドで行うよう修正、そのリファクタリングをまとめて行っています。


Fix isolated test failures due to referencing ActiveRecord::Tasks::DatabaseAlreadyExists before another test happened to make it available

Active Recordの修正です。

rake task用テストファイルに、不足していたactive_record/tasks/database_tasksのrequireを追加しています。


Cable: Periodic timers refresh

Action Cableの修正です。

定期的に実行する処理を定義する為のメソッド(#periodically)にdocを追加、引数にblockを指定出来るよう修正、引数のチェック処理を追加等の修正を行っています。

periodically :transmit_progress, every: 5.seconds
periodically every: 3.minutes do
  transmit action: :update_count, count: current_count
end

こんなメソッドあったんですねえ。


Merge pull request #23622 from kamipo/primary_key_should_be_not_null

Active Recordの修正です。

SQLite adapterで、強制的にprimary keyにNOT NULL制約を設定するよう修正しています。

PostgreSQLMySQLについては暗黙的にNOT NULLになるようになっていたのですが、SQLiteについてはNULLになってしまう可能性があった為、column optionsに強制的にoptions[:null] = falseを設定し対応しています。


ActiveSupport::Duration supports ISO8601 formatting and parsing.

Active Supportの修正です。

ActiveSupport::Durationクラスに、ISO8601 format及びパース処理のサポートを追加しています。

CHANGELOGより。

ActiveSupport::Duration.parse('P3Y6M4DT12H30M5S')
# => 3 years, 6 months, 4 days, 12 hours, 30 minutes, and 5 seconds

(3.years + 3.days).iso8601
# => "P3Y3D"

元々、ISO8601 gemというgemがあり、それを参考にして実装を行っているとの事です。


Add #16917 to release notes

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

上記ActiveSupport::DurationクラスにISO8601 format及びパース処理のサポートを追加した対応について、Notable changesの項にentryを追加しています。


Merge pull request #24613 from vipulnsward/fix-dbs-test-assertions

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

rake db taskのテストで、Rubyのワーニング(ambiguous first argument; put parentheses or a space even after/' operator`)が出ていたのを対応しています。


Merge pull request #24614 from kamipo/foreign_key_respects_table_name_prefix_and_suffix

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

#foreign_keyメソッドで、テーブル名を生成する際、ActiveRecord::Base.table_name_prefix及びActiveRecord::Base.table_name_suffixの値を使用するよう修正しています。


Merge pull request #23522 from kamipo/add_value_too_long_exception_class

Active Recordの修正です。

limitに指定した値以上の値が指定された場合に、ActiveRecord::ValueTooLongのエラーをraiseするよう修正しています(MySQLPostgreSQLのみ)。


Merge pull request #23523 from kamipo/avoid_truncation_in_uniqueness_validation

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

uniqueness validatorで、値がStringかつlimitが指定されていた場合に、validation前に値をtruncateしていたのを、truncateしないよう修正しています。

         value = cast_type.serialize(value)
         value = klass.connection.type_cast(value)
-        if value.is_a?(String) && column.limit
-          value = value.to_s[0, column.limit]
-        end

MySQL, PostgreSQLの場合は、先の対応によりlimitより大きい値が設定された場合、エラー(ActiveRecord::ValueTooLong)が発生するので問題無いのですが、SQLiteはlimitに指定した値以上の値も保存出来てしまうので、limitで指定した値でtruncateしてしまうと、正常に uniquenessのチェックが出来ないので、truncateしないよう修正したようです。


Ruby 2.4: compat with new Array#sum

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

Array#sumが定義されている場合に、Enumerable#sumが使用されるよう修正しています。

Ruby 2.4からRuby本体にArray#sumが追加されたのですが、現状numeric elementしかサポートしていません。

しかし、元々Railsが提供していたEnumerable#sumメソッドはStringもサポートしていた為、Rub本体のメソッドをそのまま使用すると、下位非互換が発生してしまいます。

# Ruby 2.4
%w[ a b ].sum # => TypeError: String can't be coerced into Fixnum
# `Enumerable#sum`
%w[ a b ].sum # => 'ab'

そのため、下位互換の為に、Array#sumが定義されいる、かつ、Stringのsumに失敗したする場合は、Enumerable#sumを呼び出すよう修正しています。

if Array.instance_methods(false).include?(:sum) && !(%w[a].sum rescue false)
  class Array
    def sum(*args) #:nodoc:
      # Use Enumerable#sum instead.
      super
    end
  end
end

Cable: Extract stream handler construction

Action Cableの修正です。

stream handlerの生成処理をメソッドへ切り出しています。オーバーライド及びテストをしやすくする為に、とのことです。


Travis: cache unicode data downloads and beanstalkd build

.travis.ymlの修正です。

コンパイルしたbeanstalkd及び、テスト中で使用するダウンロードしたunicodeのデータをtravis上でキャッシュするよう修正しています。


Merge pull request #23515 from kamipo/extract_arel_visitor

Active Recordの修正です。

各connection adapterで行っていたarel visitorの生成処理をabstract adapterで行うよう修正しています。


Merge pull request #23497 from kamipo/extract_schema_qualified_name

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

table_nameからからschemeとtable名を切り出す処理をメソッドに(#extract_schema_qualified_name)に切り出しています。


Merge pull request #24552 from yui-knk/raise_argument_error

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

Date#to_timeの引数に不正な値(:local, :utc以外の値)を指定した場合に、ArgumentErrorをraiseするよう修正しています。


Ruby 2.4 Array#sum: fix non-numeric #sum feature detection

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

Array#sumがStringに対応しているかどうかのチェックロジックで、判定処理に誤りがあったのを修正しています。


Ruby 2.4 Array#sum: ficauses -> cases changelog typo [ci skip]

activesupport/CHANGELOG.mdの修正です。

casescausesにタイポしている箇所があったのを修正しています。


Merge pull request #24576 from yahonda/quote_column_name_for_reserved_word_size

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

ActiveRecord::CollectionCacheKey#collection_cache_keyメソッドで、SELECT query内でsizeを使用する際に、#quote_column_nameメソッドでquoteするよう修正しています。

-          .select("COUNT(*) AS size", "MAX(#{column}) AS timestamp")
+          .select("COUNT(*) AS #{connection.quote_column_name("size")}", "MAX(#{column}) AS timestamp")

sizeそのままだと、oracleでエラーになってしまう為、とのことです。


Merge pull request #24503 from prathamesh-sonpatki/add-test-for-warn-on-records-fetched-greater-than https://github.com/rails/rails/commit/db06ad61497c8860f73b5548acad138b367aa9a1

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

warn_on_records_fetched_greater_thanに値を指定した場合のテストケースを追加しています。


Merge pull request #24317 from Gaurav2728/unused_set_in_active_record

activerecord/lib/active_record/connection_adapters/column.rbactiverecord/lib/active_record/relation/delegation.rbの修正です。

使用していないsetのrequireを削除しています。


Remove unused table_with_autoincrement table

activerecord/test/schema/sqlite_specific_schema.rbの修正です。

使用していないテスト用のテーブル(table_with_autoincrement)を削除しています。


Change the Hash.to_xml with a lamda example

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

Hash#to_xmlのdoc内にあるlamdaを使用した場合のexampleが、実際は動作しないコードになっていたのを、正常に動作するコードに修正しています。