| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
| | |
| | |
| | |
| | | |
- LoggerThreadSafeLevel does nowaday since 2518bda97cbbcb33dc9a92e70d5b01c09e64d12d
|
| |/
|/|
| |
| |
| |
| |
| |
| |
| |
| | |
* Handle more unsafe String methods
* Fix codeclimate issue
* Revert stylistic change
[Janosch Müller + Rafael Mendonça França]
|
| | |
|
|\ \
| | |
| | | |
Remove private def
|
| | | |
|
|/ /
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
In Ruby 2.3 or later, `String#+@` is available and `+@` is faster than `dup`.
```ruby
# frozen_string_literal: true
require "bundler/inline"
gemfile(true) do
source "https://rubygems.org"
gem "benchmark-ips"
end
Benchmark.ips do |x|
x.report('+@') { +"" }
x.report('dup') { "".dup }
x.compare!
end
```
```
$ ruby -v benchmark.rb
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
Warming up --------------------------------------
+@ 282.289k i/100ms
dup 187.638k i/100ms
Calculating -------------------------------------
+@ 6.775M (± 3.6%) i/s - 33.875M in 5.006253s
dup 3.320M (± 2.2%) i/s - 16.700M in 5.032125s
Comparison:
+@: 6775299.3 i/s
dup: 3320400.7 i/s - 2.04x slower
```
|
| |
| |
| |
| |
| | |
- Moving the `supports_cache_versioning?` check to a class method.
- Shorten the method doc.
- Expand on the error message.
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
| |
does not support it
If you are using the "in cache versioning" also known as "recyclable cache keys" the cache store must be aware of this scheme, otherwise you will generate cache entries that never invalidate.
This PR adds a check to the initialization process to ensure that if recyclable cache keys are being used via
```
config.active_record.cache_versioning = true
```
Then the cache store needs to show that it supports this versioning scheme. Cache stores can let Rails know that they support this scheme by adding a method `supports_in_cache_versioning?` and returning true.
|
|\
| |
| | |
Improve API document on Object#blank?
|
| | |
|
| |
| |
| |
| |
| | |
* Introduce `falsey` to represent both `nil` and `false`.
* Keep consistent order between abstract description and examples.
|
| | |
|
|\ \
| | |
| | |
| | | |
TaggedLogging to return a new logger instance
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The name of the minitest library is spelled that way: regular font, and
lowercase. Lowercase is used even at the beginning of sentences, see
http://docs.seattlerb.org/minitest/
I double-checked this with @zenspider too (thanks!).
|
| | |
| | |
| | |
| | |
| | | |
Followup to a recently merged PR, too minor and detailed to require a
modification to the contributed patch.
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | | |
Closes #32885.
|
| | |
| | |
| | |
| | | |
Fixing code block rendering, indentation, backticks, etc.
|
|\ \ \
| | | |
| | | | |
Maintain html_safe? on sliced HTML safe strings
|
| | | |
| | | |
| | | |
| | | | |
Co-authored-by: no-itsbackpack <no-itsbackpack@github.com>
|
| | | |
| | | |
| | | |
| | | | |
Co-authored-by: no-itsbackpack <no-itsbackpack@github.com>
|
| | |/
| |/|
| | |
| | |
| | |
| | | |
original buffer was safe.
Co-Authored-By: no-itsbackpack <no-itsbackpack@github.com>
|
| | | |
|
|\ \ \
| | | |
| | | | |
Faster File Store
|
| |/ /
| | |
| | |
| | |
| | |
| | | |
Memory before 1826584.8 memory after: 1797795.6 difference: 1.58% memory (speed) savings.
When the key is not longer than the limit we can avoid allocating two strings and an array.
|
|\ \ \
| | | |
| | | |
| | | |
| | | | |
lsylvester/change-i18n-defaults-behaviour-to-match-i18n-1.1.0
update I18n fallbacks configuration to be compatible with i18n 1.1.0
|
| | | | |
|
| |/ /
|/| |
| | |
| | |
| | |
| | | |
This commit moves the `run_cleanup` hook into an `ensure` block so we
make sure to cleanup the databases even if an exception is raised while
running the parallel tests.
|
| | |
| | |
| | |
| | | |
Since #29860, `travel_back` automatically called at the end of the test.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Following up on #33747, this takes things a step further by pulling out
the method name from the arguments array, letting us skip an allocation
in the case where there are no arguments -- notably, this also no longer
*requires* the splat to be an array, allowing us to benefit from
optimizations in Jruby (and maybe MRI in the future) of skipping the
array allocation entirely.
Benchmark results:
```
Warming up --------------------------------------
old 179.987k i/100ms
new 199.201k i/100ms
Calculating -------------------------------------
old 3.029M (± 1.6%) i/s - 15.299M in 5.052417s
new 3.657M (± 1.2%) i/s - 18.326M in 5.012648s
Comparison:
new: 3656620.7 i/s
old: 3028848.3 i/s - 1.21x slower
```
|
|\ \ \
| | | |
| | | | |
32% Faster Object#try
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Here’s the micro benchmark:
```ruby
module ActiveSupport
module NewTryable #:nodoc:
def try(*a, &b)
return unless a.empty? || respond_to?(a.first)
return public_send(*a, &b) unless a.empty?
return nil unless block_given?
return instance_eval(&b) if b.arity == 0
yield self
end
def try!(*a, &b)
return public_send(*a, &b) if !a.empty?
return nil unless block_given?
return instance_eval(&b) if b.arity == 0
yield self
end
end
end
module ActiveSupport
module OldTryable #:nodoc:
def try(*a, &b)
try!(*a, &b) if a.empty? || respond_to?(a.first)
end
def try!(*a, &b)
if a.empty? && block_given?
if b.arity == 0
instance_eval(&b)
else
yield self
end
else
public_send(*a, &b)
end
end
end
end
class FooNew
include ActiveSupport::NewTryable
def foo
end
end
class FooOld
include ActiveSupport::OldTryable
def foo
end
end
foo_new = FooNew.new
foo_old = FooOld.new
require 'benchmark/ips'
Benchmark.ips do |x|
x.report("old") { foo_old.try(:foo) }
x.report("new") { foo_new.try(:foo) }
x.compare!
end
# Warming up --------------------------------------
# old 144.178k i/100ms
# new 172.371k i/100ms
# Calculating -------------------------------------
# old 2.181M (± 8.0%) i/s - 10.813M in 5.001419s
# new 2.889M (± 7.7%) i/s - 14.479M in 5.051760s
# Comparison:
# new: 2888691.7 i/s
# old: 2180740.7 i/s - 1.32x slower
```
Also reduces memory. On https://www.codetriage.com i’m seeing 1.5% fewer object allocations per request (in object count).
Before:
Total allocated: 1014475 bytes (8525 objects)
After:
Total allocated: 1015499 bytes (8389 objects)
|
| |/ /
|/| |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
* Update the comments for TimeWithZone subtraction
While reading the description/documentation comments for the subtraction method, it was confusing. While in practical usage, the returned values make sense. It seems as though the explanation could be a bit clearer.
* Removed erroneous closing parenthesis
[ci skip]
[Rob Race + Ryuta Kamizono]
|
|\ \ \
| |/ /
|/| | |
Stop using Mocha
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Six Mocha calls prove quite resistant to Minitestification. For example,
if we replace
```
ActiveRecord::Associations::HasManyAssociation
.any_instance
.expects(:reader)
.never
```
with `assert_not_called`, Minitest wisely raises
```
NameError: undefined method `reader' for class `ActiveRecord::Associations::HasManyAssociation'
```
as `:reader` comes from a deeply embedded abstract class,
`ActiveRecord::Associations::CollectionAssociation`.
This patch tackles this difficulty by adding
`ActiveSupport::Testing::MethodCallAsserts#assert_called_on_instance_of`
which injects a stubbed method into `klass`, and verifies the number of
times it is called, similar to `assert_called`. It also adds a convenience
method, `assert_not_called_on_instance_of`, mirroring
`assert_not_called`.
It uses the new method_call_assertions to replace the remaining Mocha
calls in `ActiveRecord` tests.
[utilum + bogdanvlviv + kspath]
|
| | | |
|
|\ \ \
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
emaxi/feature/add-missing-documentation-option-to-number-to-currency
Add missing documentation option to number_to_currency
[ci skip]
|
| | | | |
|
| | | | |
|
| | | | |
|
|\ \ \ \
| | | | |
| | | | | |
use BacktraceCleaner for ActiveRecord verbose logging
|
| | |/ /
| |/| | |
|
|\ \ \ \
| | | | |
| | | | | |
Test `assert_called` and `assert_called_with`
|
| |/ / /
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
- ActiveSupport::Testing::MethodCallAssertions#assert_called
- Ensure that the method stubbed by `assert_called` returns correct value after
- ActiveSupport::Testing::MethodCallAssertions#assert_called_with
- Ensure that `#assert_called_with` stubs the method to return a specific value
- Ensure that the method stubbed by `assert_called_with` returns correct value after
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Avoid allocating the second array by using `Array#reject!` instead of
`Enumerable#partition` in `Array#extract!`.
There are benchmarks in order to ensure that the changes speed up the method:
```
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update
your Bundler"
raise e
end
class Array
def extract_v1!(&block)
unless block_given?
to_enum(:extract!) { size }
else
extracted_elements, other_elements = partition(&block)
replace(other_elements)
extracted_elements
end
end
def extract_v2!
return to_enum(:extract!) { size } unless block_given?
extracted_elements = []
reject! do |element|
extracted_elements << element if yield(element)
end
extracted_elements
end
end
gemfile(true) do
source "https://rubygems.org"
gem "benchmark-ips"
end
arrays_for_partition = Array.new(1000) { (0..10000).to_a }
arrays_for_extract_v1 = Array.new(1000) { (0..10000).to_a }
arrays_for_extract_v2 = Array.new(1000) { (0..10000).to_a }
Benchmark.ips do |x|
x.report("Array#partition") do
arrays_for_partition.each do |numbers|
odd_numbers, numbers = numbers.partition { |number| number.odd? }
numbers
end
end
x.report("Array#extract_v1!") do
arrays_for_extract_v1.each do |numbers|
odd_numbers = numbers.extract_v1! { |number| number.odd? }
numbers
end
end
x.report("Array#extract_v2!") do
arrays_for_extract_v2.each do |numbers|
odd_numbers = numbers.extract_v2! { |number| number.odd? }
numbers
end
end
x.compare!
end
```
The result of the benchmarks:
```
ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
```
```
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using benchmark-ips 2.7.2
Using bundler 1.16.1
Warming up --------------------------------------
Array#partition 1.000 i/100ms
Array#extract_v1! 1.000 i/100ms
Array#extract_v2! 1.000 i/100ms
Calculating -------------------------------------
Array#partition 1.390 (± 0.0%) i/s - 7.000 in 5.044843s
Array#extract_v1! 2.781 (± 0.0%) i/s - 14.000 in 5.050589s
Array#extract_v2! 3.151 (± 0.0%) i/s - 16.000 in 5.080608s
Comparison:
Array#extract_v2!: 3.2 i/s
Array#extract_v1!: 2.8 i/s - 1.13x slower
Array#partition: 1.4 i/s - 2.27x slower
```
Avoid `unless`/`else` in favour of an early return.
The double-negative of that `else` can be confusing,
even though the code layout is nearly the same.
Also using of early return would improve `git diff`
if we needed to change this method.
|
|/ / /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The method removes and returns the elements for which the block returns a true value.
If no block is given, an Enumerator is returned instead.
```
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
numbers # => [0, 2, 4, 6, 8]
```
|
| | | |
|
| | | |
|