Skip to content
Commits on May 1, 2016
  1. @mrkn @jeremy

    Fix initial value effects for sum along to ruby 2.4

    mrkn committed with jeremy Apr 30, 2016
    Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
Commits on Apr 29, 2016
  1. @fxn

    restores the regexp used in String#blank?

    fxn committed Apr 29, 2016
    This commit undoes 54243fe.
    
    Reason: Further investigation has shown the benefit is not so clear
    generally speaking.
    
    There is a long discussion and several benchmarks in the PR #24658
    if you are interested in the details.
  2. @vijaydev

    Merge branch 'master' of github.com:rails/docrails

    vijaydev committed Apr 29, 2016
    Conflicts:
    	guides/source/configuring.md
Commits on Apr 28, 2016
  1. @Envek

    Change 1.week to create 1 week durations instead of 7 days durations.

    Envek committed Dec 27, 2015
    This is just to remove astonishment from getting `3600 seconds` from typing `1.hour`.
Commits on Apr 27, 2016
  1. @eileencodes

    Prep Rails 5 beta 4

    eileencodes committed Apr 27, 2016
  2. @jeremy

    Revert "Change 1.week to create 1 week durations instead of 7 days du…

    jeremy committed Apr 27, 2016
    …rations."
    
    Regression: adding minutes/hours to a time would change its time zone
    
    This reverts commit 1bf9fe7.
Commits on Apr 26, 2016
  1. @jeremy

    Merge pull request #24723 from lvl0nax/array_split_fix

    jeremy committed Apr 26, 2016
    Little perfomance fix for Array#split.
  2. @lvl0nax

    Little perfomance fix for Array#split.

    lvl0nax committed Apr 25, 2016
    Calculating -------------------------------------
    before    40.770k i/100ms
    after    58.464k i/100ms
    -------------------------------------------------
    before    629.568k (± 5.0%) i/s -      3.180M
    after      1.159M (± 4.5%) i/s -      5.788M
  3. @conf @jeremy

    Do not cache ActiveSupport::TimeZone#utc_offset

    conf committed with jeremy Apr 21, 2016
    This can be an issue when TZInfo::TimeZone#current_period is refreshed
    due to timezone period transition, but it's not reflected in
    ActiveSupport::TimeZone object.
    
    For example, on Sun, 26 Oct 2014 22:00 UTC, Moscow changed its TZ from
    MSK +04:00 to MSK +03:00 (-1 hour). If ActiveSupport::TimeZone['Moscow']
    happens to be initialized just before the timezone transition, it will
    cache its stale utc_offset even after the timezone transition.
    
    This commit removes cache and fixes this issue.
    
    Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
Commits on Apr 25, 2016
  1. @Fryguy
  2. @yui-knk @jeremy

    Remove `Array#sum` method before override it

    yui-knk committed with jeremy Apr 25, 2016
    To suppress warning ('warning: method redefined; discarding old sum')
    remove the method before override it.
    
    Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
Commits on Apr 24, 2016
  1. @fxn

    rewords code comment [ci skip]

    fxn committed Apr 24, 2016
    This alternative flows better.
    
    [Richard Schneeman & Xavier Noria]
  2. @jeremy

    Share lock: more accurate livelock fix for aa598f4

    jeremy committed Apr 24, 2016
    Awaken waiting threads even if the current thread (the previously
    exclusive thread) hadn't taken a share lock.
    
    This only happens in code that wasn't run within an executor, since that
    always take an outermost share lock.
Commits on Apr 23, 2016
  1. @jeremy

    Share lock: avoid livelock due to exclusive thread sleeping before wa…

    jeremy committed Apr 23, 2016
    …iting threads wake
  2. @vipulnsward

    Follow up of c9c5788

    vipulnsward committed Apr 23, 2016
    [ci skip]
  3. @pixeltrix

    Make getlocal and getutc always return instances of Time

    pixeltrix committed Apr 23, 2016
    Previously these methods could return either a DateTime or a Time
    depending on how the ActiveSupport::TimeWithZone instance had
    been constructed. Changing to always return an instance of Time
    eliminates a possible stack level too deep error in to_time where
    it was wrapping a DateTime instance.
    
    As a consequence of this the internal time value is now always an
    instance of Time in the UTC timezone, whether that's as the UTC
    time directly or a representation of the local time in the timezone.
    
    There should be no consequences of this internal change and if
    there are it's a bug due to leaky abstractions.
  4. @pixeltrix

    Add DateTime#subsec

    pixeltrix committed Apr 23, 2016
    Mirrors the Time#subsec method by returning the fraction
    of the second as a Rational.
  5. @pixeltrix

    Change Time#sec_fraction to use subsec

    pixeltrix committed Apr 23, 2016
    Time instances can have fractional parts smaller than a nanosecond.
  6. @pixeltrix
  7. @pixeltrix

    Add Time#sec_fraction

    pixeltrix committed Apr 23, 2016
    Mirrors the DateTime#sec_fraction method by returning the fraction
    of the second as a Rational.
  8. @yui-knk

    Move `DateTime#getlocal` to `/core_ext/date_time/calculations.rb`

    yui-knk committed Apr 23, 2016
    `DateTime#getlocal` is newly added public API.
    It's responsible is same as `DateTime#utc`, so `calculations.rb` is
    a best plase to define this method.
    For keeping consistency with `DateTime#utc`, defines `#localtime` and
    defines `getlocal` as an alias method.
  9. @pixeltrix

    Add compatibility for Ruby 2.4 `to_time` changes

    pixeltrix committed Apr 23, 2016
    In Ruby 2.4 the `to_time` method for both `DateTime` and `Time` will
    preserve the timezone of the receiver when converting to an instance
    of `Time`. Since Rails 5.0 will support Ruby 2.2, 2.3 and later we
    need to introduce a compatibility layer so that apps that upgrade do
    not break. New apps will have a config initializer file that defaults
    to match the new Ruby 2.4 behavior going forward.
    
    For information about the changes to Ruby see:
    https://bugs.ruby-lang.org/issues/12189
    https://bugs.ruby-lang.org/issues/12271
    
    Fixes #24617.
Commits on Apr 22, 2016
  1. @tenderlove

    fix boot performance issue

    tenderlove committed Apr 22, 2016
    Slight refactor to improve boot performance on some Ruby
    implementations (for now).
Commits on Apr 21, 2016
  1. @fxn

    just say nothing about why this regexp is slower [ci skip]

    fxn committed Apr 21, 2016
    Further investigation seems to disprove that backtracking is the
    reason why the positive variant is slower, see
    
        #24658 (comment)
    
    so, just say nothing about it, only assert it is slower.
  2. @fxn

    restores code comments in String#blank? [ci skip]

    fxn committed Apr 21, 2016
    When you come here without context, it is important to hightlight that
    checking the predicate is worthwhile due to the observation that blank
    strings are often empty. So you complicate the code (which has a cost
    in terms of readability and aesthetics), but statistically makes sense.
    
    Then, you also need to explain why the second operand is so convoluted.
    
    Otherwise, you wonder why this line is written precisely this way. That
    is what code comments are for.
  3. @jeremy

    Merge pull request #24663 from kamipo/remove_unused_blank_re

    jeremy committed Apr 20, 2016
    Remove unused `BLANK_RE`
  4. @tlynam

    Update delegate to use newer Ruby syntax

    tlynam committed Apr 20, 2016
    This commit updates `delegate` to use the keyword argument syntax added in Ruby 2. I left the `ArgumentError` when `to` is missing, because it better explains how to correctly use `delegate`.  We could instead rely on the default `ArgumentError` that would be raised if `to` were a required keyword argument.
  5. @kamipo

    Remove unused `BLANK_RE`

    kamipo committed Apr 21, 2016
    Follow up to #24658.
Commits on Apr 20, 2016
  1. @schneems

    Speed up String#blank? Regex

    schneems committed Apr 20, 2016
    Follow up on 697384d#commitcomment-17184696.
    
    The regex to detect a blank string `/\A[[:space:]]*\z/` will loop through every character in the string to ensure that all of them are a `:space:` type. We can invert this logic and instead look for any non-`:space:` characters. When that happens, we would return on the first character found and the regex engine does not need to keep looking.
    
    Thanks @nellshamrell for the regex talk at LSRC.
    
    By defining a "blank" string as any string that does not have a non-whitespace character (yes, double negative) we can get a substantial speed bump.
    
    Also an inline regex is (barely) faster than a regex in a constant, since it skips the constant lookup. A regex literal is frozen by default.
    
    ```ruby
    require 'benchmark/ips'
    
    def string_generate
      str = " abcdefghijklmnopqrstuvwxyz\t".freeze
      str[rand(0..(str.length - 1))] * rand(0..23)
    end
    
    strings = 100.times.map { string_generate }
    
    ALL_WHITESPACE_STAR = /\A[[:space:]]*\z/
    
    Benchmark.ips do |x|
      x.report('current regex            ') { strings.each {|str| str.empty? || ALL_WHITESPACE_STAR === str } }
      x.report('+ instead of *           ') { strings.each {|str| str.empty? || /\A[[:space:]]+\z/ === str } }
      x.report('not a non-whitespace char') { strings.each {|str| str.empty? || !(/[[:^space:]]/ === str) } }
      x.compare!
    end
    
    # Warming up --------------------------------------
    # current regex
    #                          1.744k i/100ms
    # not a non-whitespace char
    #                          2.264k i/100ms
    # Calculating -------------------------------------
    # current regex
    #                          18.078k (± 8.9%) i/s -     90.688k
    # not a non-whitespace char
    #                          23.580k (± 7.1%) i/s -    117.728k
    
    # Comparison:
    # not a non-whitespace char:    23580.3 i/s
    # current regex            :    18078.2 i/s - 1.30x slower
    ```
    
    This makes the method roughly 30% faster `(23.580 - 18.078)/18.078 * 100`.
    
    cc/ @fxn
  2. @fxn

    ~3.5x speedup of String#blank? for empty strings

    fxn committed Apr 20, 2016
    See the rationale in the comment in this patch.
    
    To benchmark this I ran a number of variations, ultimately narrowing to
    
        require 'benchmark/ips'
    
        str = ''
        regexp = /\A[[:space:]]*\z/
    
        Benchmark.ips do |x|
          x.report('regexp') { regexp === str }
          x.report('empty')  { str.empty? || regexp === str }
          x.compare!
        end
    
    This benchmark has consistently reported speedups around 3.5x:
    
        Calculating -------------------------------------
                      regexp    69.197k i/100ms
                       empty   115.468k i/100ms
        -------------------------------------------------
                      regexp      2. 6.3%) i/s -     13.839M
                       empty      9. 8.8%) i/s -     47.804M
    
        Comparison:
                       empty:  9642607.6 i/s
                      regexp:  2768351.9 i/s - 3.48x slower
    
    Sometimes even reaching 4x.
    
    Running the same bechmark on strings of 10 or 100 characters (with
    whitespace or present) has shown a slowdown of just about 1.01/1.02.
    Marginal, we seem to have a worthwhile trade-off here.
  3. @yui-knk
Commits on Apr 19, 2016
  1. @Envek

    Add ActiveSupport::TimeZone.country_zones helper

    Envek committed Jun 18, 2015
    That helper will return time zones for any country that tzdata knows about.
    So it will be much simpler for non-US people to list own country time zones
    in HTML selects or anywhere.
  2. @JustinJruby

    Change the Hash.to_xml with a lamda example

    JustinJruby committed Apr 19, 2016
    Update 'foo'.to_xml(lambda { |options, key| options[:builder].b(key) })
    to  {foo: lambda { |options, key| options[:builder].b(key) }}.to_xml
  3. @jeremy
  4. @jeremy

    Merge pull request #24552 from yui-knk/raise_argument_error

    jeremy committed Apr 19, 2016
    Raise `ArgumentError` when an invalid form is passed to `Date#to_time`
Something went wrong with that request. Please try again.