| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|/ / |
|
| |
| |
| |
| |
| |
| | |
Some casual benchmarks showed a 2x factor.
All credit goes to @nurse.
|
| |
| |
| |
| |
| |
| | |
See the rationale in the documentation included in this patch.
We are going to gradually introduce this predicate in the code base.
|
| | |
|
| | |
|
|/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When the Pathname object is converted as JSON,
it should be a string that means itself.
Expected:
```
>> Pathname.new('/path/to/somewhere.txt').as_json
"/path/to/somewhere.txt"
```
Actual:
```
>> Pathname.new('/path/to/somewhere.txt').as_json
{"path"=>"/path/to/somewhere.txt"}
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When the URI object is converted as JSON,
it is expected that it is a string that means its URI.
Expected:
```
>> URI.parse('http://example.com').as_json
"http://example.com"
```
Actual:
```
>> URI.parse('http://example.com').as_json
{"scheme"=>"http",
"user"=>nil,
"password"=>nil,
"host"=>"example.com",
"port"=>80,
"path"=>"",
"query"=>nil,
"opaque"=>nil,
"fragment"=>nil,
"parser"=>
{"regexp"=>
{"SCHEME"=>"(?-mix:\\A[A-Za-z][A-Za-z0-9+\\-.]*\\z)",
"USERINFO"=>"(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=A-Z_a-z~])*\\z)",
"HOST"=>
"(?-mix:\\A(?:(?<IP-literal>\\[(?:(?<IPv6address>(?:\\h{1,4}:){6}(?<ls32>\\h{1,4}:\\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5]|\\d)\\.\\g<dec-octet>\\.\\g<dec-octet>\\.\\g<dec-octet>))|::(?:\\h{1,4}:){5}\\g<ls32>|\\h{,4}::(?:\\h{1,4}:){4}\\g<ls32>|(?:(?:\\h{1,4}:)?\\h{1,4})?::(?:\\h{1,4}:){3}\\g<ls32>|(?:(?:\\h{1,4}:){,2}\\h{1,4})?::(?:\\h{1,4}:){2}\\g<ls32>|(?:(?:\\h{1,4}:){,3}\\h{1,4})?::\\h{1,4}:\\g<ls32>|(?:(?:\\h{1,4}:){,4}\\h{1,4})?::\\g<ls32>|(?:(?:\\h{1,4}:){,5}\\h{1,4})?::\\h{1,4}|(?:(?:\\h{1,4}:){,6}\\h{1,4})?::)|(?<IPvFuture>v\\h+\\.[!$&-.0-;=A-Z_a-z~]+))\\])|\\g<IPv4address>|(?<reg-name>(?:%\\h\\h|[!$&-.0-9;=A-Z_a-z~])*))\\z)",
"ABS_PATH"=>
"(?-mix:\\A\\/(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])*(?:\\/(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])*)*\\z)",
"REL_PATH"=>
"(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])+(?:\\/(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~])*)*\\z)",
"QUERY"=>"(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~\\/?])*\\z)",
"FRAGMENT"=>"(?-mix:\\A(?:%\\h\\h|[!$&-.0-;=@-Z_a-z~\\/?])*\\z)",
"OPAQUE"=>"(?-mix:\\A(?:[^\\/].*)?\\z)",
"PORT"=>
"(?-mix:\\A[\\x09\\x0a\\x0c\\x0d ]*\\d*[\\x09\\x0a\\x0c\\x0d ]*\\z)"}}}
```
|
| |
|
|\
| |
| | |
Improve Hash#compact! documentation and tests
|
| |
| |
| |
| |
| |
| |
| | |
Make it clear what should be returned when no changes were made to the
hash.
{ c: true }.compact! # => nil
|
|/ |
|
|
|
|
|
|
|
|
|
|
|
| |
We are currently using `%e` which adds a space before the result if the
digit is a single number. This leads to strings like `February 2, 2016`
which is undesireable. I've opted to replace with 0 padding instead of
removing the padding entirely, to preserve compatibility for those
relying on the fact that the width is constant, and to be consistent
with time formatting.
Fixes #25251.
|
|
|
|
| |
This is a similar change that occurred for Hash#except in #21087.
|
|
|
|
| |
And make sure that it doesn't even try to call the method in the target.
|
|\
| |
| |
| | |
Introduce Module#delegate_missing_to
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When building decorators, a common pattern may emerge:
class Partition
def initialize(first_event)
@events = [ first_event ]
end
def people
if @events.first.detail.people.any?
@events.collect { |e| Array(e.detail.people) }.flatten.uniq
else
@events.collect(&:creator).uniq
end
end
private
def respond_to_missing?(name, include_private = false)
@events.respond_to?(name, include_private)
end
def method_missing(method, *args, &block)
@events.send(method, *args, &block)
end
end
With `Module#delegate_missing_to`, the above is condensed to:
class Partition
delegate_missing_to :@events
def initialize(first_event)
@events = [ first_event ]
end
def people
if @events.first.detail.people.any?
@events.collect { |e| Array(e.detail.people) }.flatten.uniq
else
@events.collect(&:creator).uniq
end
end
end
David suggested it in #23824.
|
| |
| |
| |
| |
| |
| |
| | |
This reverts commit 28492204ee59a5aca2f3bc7b161d45724552686d.
Reason: `suppress` without an argument doesn't actually tell what is
supressing. Also, it can be confused with ActiveRecord::Base#suppress.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
* Add default exceptions affected by suppress
suppress { do_something_that_might_fail }
# instead of
begin
do_something_that_might_fail
rescue
end
# or
do_something_that_might_fail rescue nil
* Do not add default exceptions list constant
[Rafael Mendonça França + Alexey Zapparov]
|
| |
| |
| |
| |
| |
| |
| |
| | |
Ruby 2.4 unifies Fixnum and Bignum into Integer: https://bugs.ruby-lang.org/issues/12005
* Forward compat with new unified Integer class in Ruby 2.4+.
* Backward compat with separate Fixnum/Bignum in Ruby 2.2 & 2.3.
* Drops needless Fixnum distinction in docs, preferring Integer.
|
|\ \
| | |
| | | |
Introduce Date#all_day
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Useful for queries like:
Item.where(created_at: Date.current.all_day)
There was already a Time#all_day with the same behaviour, but for
queries like the above, Date is more convenient.
|
| | | |
|
|/ /
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Calculating -------------------------------------
before 34.731k i/100ms
after 48.206k i/100ms
-------------------------------------------------
before 508.451k (± 1.2%) i/s - 2.570M
after 720.068k (± 0.9%) i/s - 3.615M
Comparison:
after: 720067.6 i/s
before: 508451.1 i/s - 1.42x slower
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Use original `Array#sum` when calculating Numeric sum.
This commit is related #24804 issue.
Issue #24804 reports `Array#sum` becomes much slower when
ActiveSupport is included.
This commit tries to use original method as far as possible.
```shell
$ cat array_sum.rb
class Array
alias core_sum sum
end
require 'benchmark/ips'
require 'active_support/core_ext/enumerable'
ary = [1.0] * 1_000_000
Benchmark.ips do |x|
x.report("core sum") { ary.core_sum }
x.report("AS's sum") { ary.sum }
x.compare!
end
$ bundle exec ruby -v -I lib array_sum.rb
ruby 2.4.0dev (2016-05-01 master 54867) [x86_64-darwin14]
Calculating -------------------------------------
core sum 4.000 i/100ms
AS's sum 5.000 i/100ms
-------------------------------------------------
core sum 50.492 (± 7.9%) i/s - 252.000
AS's sum 50.116 (± 6.0%) i/s - 250.000
Comparison:
core sum: 50.5 i/s
AS's sum: 50.1 i/s - 1.01x slower
```
Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Calculating -------------------------------------
before 26.319k i/100ms
after 29.414k i/100ms
-------------------------------------------------
before 350.623k (± 1.6%) i/s - 1.763M
after 416.227k (± 1.4%) i/s - 2.088M
Comparison:
after: 416226.8 i/s
before: 350622.8 i/s - 1.19x slower
|
| |
| |
| |
| | |
Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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.
|
|\ \
| | |
| | |
| | |
| | | |
Conflicts:
guides/source/configuring.md
|
| | | |
|
| | |
| | |
| | |
| | | |
This is just to remove astonishment from getting `3600 seconds` from typing `1.hour`.
|
| | |
| | |
| | |
| | |
| | |
| | | |
Regression: adding minutes/hours to a time would change its time zone
This reverts commit 1bf9fe75a6473cb7501cae544cab772713e68cef.
|
|\ \ \
| | | |
| | | |
| | | | |
Little perfomance fix for Array#split.
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
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
|
|/ / /
| | |
| | |
| | |
| | | |
Follow up to
https://github.com/rails/rails/commit/c9c5788a527b70d7f983e2b4b47e3afd863d9f48
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
To suppress warning ('warning: method redefined; discarding old sum')
remove the method before override it.
Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
|
| | |
| | |
| | |
| | |
| | |
| | | |
This alternative flows better.
[Richard Schneeman & Xavier Noria]
|
| | |
| | |
| | |
| | |
| | |
| | | |
https://github.com/rails/rails/commit/c9c5788a527b70d7f983e2b4b47e3afd863d9f48
[ci skip]
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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.
|
| | |
| | |
| | |
| | |
| | | |
Mirrors the Time#subsec method by returning the fraction
of the second as a Rational.
|
| | |
| | |
| | |
| | | |
Time instances can have fractional parts smaller than a nanosecond.
|
| | | |
|
| | |
| | |
| | |
| | |
| | | |
Mirrors the DateTime#sec_fraction method by returning the fraction
of the second as a Rational.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
`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.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Further investigation seems to disprove that backtracking is the
reason why the positive variant is slower, see
https://github.com/rails/rails/pull/24658#issuecomment-213079710
so, just say nothing about it, only assert it is slower.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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.
|
|\ \ \
| | | |
| | | |
| | | | |
Remove unused `BLANK_RE`
|
| | | |
| | | |
| | | |
| | | | |
Follow up to #24658.
|
|/ / /
| | |
| | | |
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.
|