なるようになるブログ

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

rails commit log流し読み(2016/02/22)

2016/02/22分のコミットです。

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


[ci skip] Mention testing fore-runners.

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

plugin_rails_initメソッドのdocにRSpecminitest-reportersmaxitest等を参考にした旨説明を追加しています。


[ci skip] Clarify collection caching went EXPLICIT.

actionview/CHANGELOG.mdの修正です。

Collection renderingのcache対応についのentryに、より詳細な説明を追加しています。


[ci skip] Document collection caching better.

actionview/lib/action_view/helpers/cache_helper.rbメソッドのdocの修正です。

cacheメソッドのdocに、collection cachingについてのより詳細な説明を追加しています。


Merge pull request #23785 from eval/correct-types-examples

activesupport/lib/active_support/core_ext/numeric/conversions.rbactivesupport/lib/active_support/number_helper.rbのdocの修正です。

doc内のexampleコードの実行結果を、ダブルクォートで囲むよう修正しています。

-  #  5551234.to_s(:phone)                                     # => 555-1234
-  #  1235551234.to_s(:phone)                                  # => 123-555-1234
-  #  1235551234.to_s(:phone, area_code: true)                 # => (123) 555-1234
-  #  1235551234.to_s(:phone, delimiter: ' ')                  # => 123 555 1234
-  #  1235551234.to_s(:phone, area_code: true, extension: 555) # => (123) 555-1234 x 555
-  #  1235551234.to_s(:phone, country_code: 1)                 # => +1-123-555-1234
+  #  5551234.to_s(:phone)                                     # => "555-1234"
+  #  1235551234.to_s(:phone)                                  # => "123-555-1234"
+  #  1235551234.to_s(:phone, area_code: true)                 # => "(123) 555-1234"
+  #  1235551234.to_s(:phone, delimiter: ' ')                  # => "123 555 1234"
+  #  1235551234.to_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
+  #  1235551234.to_s(:phone, country_code: 1)                 # => "+1-123-555-1234"

戻り値はStringな為。


Match test name to test (typo)

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

validates_length_ofのテストをしているのに、テスト名がxxx_validates_presence_of_xxxになっていたのを、テスト名をxxx_validates_length_of_xxxに修正しています。


Add a note about downcasing submit tag

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

submit buttonのvalueに表示するmodel名を小文字に変換するよう修正した、Merge pull request #2764 from stevenspiel/titleize_model_name_for_default_submit_button_valueの対応について、releas noteに追記しています。


Merge pull request #23743 from maclover7/rm-unused-parameter

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

ActiveModel::Errors#normalize_detailメソッドから、使用していないattribute引数を削除しています。


Merge pull request #23803 from kamipo/reduce_attribute_to_s

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

ActiveRecord::Validations::UniquenessValidatorクラスで、attributeへのStringへの変換処理を減らせるようにする為に、変換したStringの値を使いまわすよう修正しています。


Merge pull request #23776 from chi6rag/master

activesupport/test/core_ext/date_time_ext_test.rbの修正です。

うるう年の場合にDateTime#last_weekメソッドが正しい値を戻す事を確認するテストを追加しています。


Merge pull request #23682 from ShikChen/fast_strxor

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

xorの計算をするメソッドで、Stringでループするのにeach + byteを使用していたのを、each_byteを使用するよう修正しています。each_byteの方が高速の為。

PRにあったベンチマークは下記の通りです。

require 'benchmark/ips'
require 'allocation_tracer'

a = 32.times.map { rand(256) }.pack('C*')
b = 32.times.map { rand(256) }.pack('C*')

def xor_byte_strings1(s1, s2)
  s1.bytes.zip(s2.bytes).map { |(c1,c2)| c1 ^ c2 }.pack('c*')
end

def xor_byte_strings2(s1, s2)
  s2_bytes = s2.bytes
  s1.bytes.map.with_index { |c1, i| c1 ^ s2_bytes[i] }.pack('c*')
end

def xor_byte_strings3(s1, s2)
  s2_bytes = s2.bytes
  s1.each_byte.with_index { |c1, i| s2_bytes[i] ^= c1 }
  s2_bytes.pack('C*')
end

fail if xor_byte_strings1(a, b) != xor_byte_strings2(a, b)
fail if xor_byte_strings1(a, b) != xor_byte_strings3(a, b)

Benchmark.ips do |x|
  x.report('xor_byte_strings1') { xor_byte_strings1(a, b) }
  x.report('xor_byte_strings2') { xor_byte_strings2(a, b) }
  x.report('xor_byte_strings3') { xor_byte_strings3(a, b) }
  x.compare!
end

Tracer = ObjectSpace::AllocationTracer
Tracer.setup(%i{type})
p xor_byte_strings1: Tracer.trace { xor_byte_strings1(a, b) }
p xor_byte_strings2: Tracer.trace { xor_byte_strings2(a, b) }
p xor_byte_strings3: Tracer.trace { xor_byte_strings3(a, b) }
Warming up --------------------------------------
   xor_byte_strings1    10.668k i/100ms
   xor_byte_strings2    11.814k i/100ms
   xor_byte_strings3    13.139k i/100ms
Calculating -------------------------------------
   xor_byte_strings1    116.667k (± 3.1%) i/s -    586.740k
   xor_byte_strings2    129.932k (± 4.3%) i/s -    649.770k
   xor_byte_strings3    142.506k (± 4.2%) i/s -    722.645k

Comparison:
   xor_byte_strings3:   142506.3 i/s
   xor_byte_strings2:   129932.4 i/s - 1.10x slower
   xor_byte_strings1:   116666.8 i/s - 1.22x slower

{:xor_byte_strings1=>{[:T_ARRAY]=>[38, 0, 0, 0, 0, 0], [:T_STRING]=>[2, 0, 0, 0, 0, 0]}}
{:xor_byte_strings2=>{[:T_ARRAY]=>[3, 0, 0, 0, 0, 0], [:T_DATA]=>[1, 0, 0, 0, 0, 0], [:T_IMEMO]=>[2, 0, 0, 0, 0, 0], [:T_STRING]=>[2, 0, 0, 0, 0, 0]}}
{:xor_byte_strings3=>{[:T_ARRAY]=>[1, 0, 0, 0, 0, 0], [:T_DATA]=>[1, 0, 0, 0, 0, 0], [:T_IMEMO]=>[2, 0, 0, 0, 0, 0], [:T_STRING]=>[2, 0, 0, 0, 0, 0]}}

Merge pull request #23769 from kamipo/remove_alias_exec_without_stmt_exec_query

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

#exec_queryから#exec_without_stmtへのaliasを削除しています。

legacy mysql adapterの為のaliasであり、現状legacy mysql adapterはもうサポートしてない為、削除したとの事です。


Fix typographical error

actionpack/lib/action_dispatch/routing.rbのdocの修正です。

Routing moduleのdoc内のexampleでコメントをタイポしている箇所があったのを修正しています。


Merge pull request #23751 from chezou/add-test-case-order-by-field

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

ActiveRecord::QueryMethods#orderメソッドプレースホルダに空の配列、nilを渡した場合のテストを追加しています。


Merge pull request #22748 from Azzurrio/master

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

DBがPostgreSQLprepared_statementsにfalseを指定した場合に、エラー("select_all': undefined methodpreparable' for #<Arel::Visitors::PostgreSQL:0x007ff9416cf718> (NoMethodError)")が出てしまうバグがあったのを修正しています。