| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
```
|
|\
| |
| | |
Let escape_javascript handle conversion to string
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This brings `escape_javascript` in line with the behavior of `json_escape` and
allows other value types to be output without needing explicit casting in the
view template.
Example:
<%= javascript_tag do %>
var locale = '<%== j I18n.locale %>'; // locale is a symbol
<% end %>
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
On every iteration of generating a cache for a collection a “digest path” is calculated even though it’s exactly the same for every element.
This PR exposes a method `digest_path_from_virtual` that returns back a “digest_path”. This can in turn be passed back into `cache_fragment_name`. This not only does less work, but it also (you guessed it) uses less memory.
before: Total allocated: 762539 bytes (7035 objects)
after: Total allocated: 743590 bytes (6621 objects)
(762539 - 743590)/ 762539.0 # => 2.4% faster ⚡️⚡️
|
| | |
|
| | |
|
|\ \
| | |
| | | |
Finish converting whitelist and blacklist references
|
| | | |
|
| | | |
|
|/ / |
|
|\ \
| | |
| | |
| | | |
Use public_send in value_for_collection
|
| | |
| | |
| | |
| | |
| | | |
Instead of dropping it completely in case someone is relying (probably
inadvertenly) on it.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Avoid exposing private methods in view's helpers. However, as
`extract_values_from_collection` is only called from
`options_from_collection_for_select` where `value_for_collection` is
previously called, this case was already covered. The change makes
anyway sense for consistency and in case the code changes in the
future.
|
| |/
| |
| |
| |
| |
| | |
Avoid exposing private methods in view's helpers.
Fixes https://github.com/rails/rails/issues/33546
|
|\ \
| | |
| | |
| | |
| | |
| | |
| | | |
emaxi/feature/add-missing-documentation-option-to-number-to-currency
Add missing documentation option to number_to_currency
[ci skip]
|
| | | |
|
| | |
| | |
| | |
| | | |
To prevent style check in review like https://github.com/rails/rails/pull/33608#discussion_r211087605.
|
| |/
|/| |
|
| |
| |
| |
| |
| | |
This commit follows the path we started at commit #ea4f0e2
and continued at PR #33229.
|
| |
| |
| |
| |
| | |
In cases where the MatchData object is not used, this provides a speed-up:
https://github.com/JuanitoFatas/fast-ruby/#stringmatch-vs-stringmatch-vs-stringstart_withstringend_with-code-start-code-end
|
|\ \
| | |
| | | |
Keep time_tag docs up-to-date.
|
| | |
| | |
| | |
| | |
| | | |
The pubdate attribute was removed from the spec, see
940eec417f20e53abd3e3114c7fa845dac0d3a62 for context.
|
| | |
| | |
| | |
| | |
| | | |
Special form_with attributes `skip_default_ids` and `allow_method_names_outside_object`
attributes are leaking into html attributes of option select tag helpers.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
`button_to` was throwing exception when invoked with `params` hash that
contains symbol and string keys. The reason for the exception was that
`to_form_params` was comparing the given symbol and string keys.
The issue is fixed by turning all keys to strings inside
`to_form_params` before comparing them.
|
| | |
| | |
| | | |
Related to https://github.com/rails/rails/pull/24386#issuecomment-403926683
|
|\ \ \
| |/ /
|/| | |
Add safe html support to arrays of translations
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | | |
Follow up #32190
[ci skip]
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
to customize year
names. Lambda should be passed to use this option. Example:
date_select('user_birthday', '', start_year: 1998, end_year: 2000, year_format: ->year { "Heisei #{year - 1988}" })
The HTML produced:
<select id="user_birthday__1i" name="user_birthday[(1i)]">
<option value="1998">Heisei 10</option>
<option value="1999">Heisei 11</option>
<option value="2000">Heisei 12</option>
</select>
/* The rest is omitted */
|
| | |
| | |
| | |
| | | |
Follow up of #32958.
|
| | | |
|
| | |
| | |
| | |
| | | |
[ci skip]
|
| | | |
|
| | |
| | |
| | |
| | | |
Caused at 9276ea89d2b0be9fdd1ad6590857f8d45a38c267.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Or it would raise if the argument was frozen.
And even with this change, it would still reduce String allocations together with 9276ea89d2b0be9fdd1ad6590857f8d45a38c267
because `escape` should be `true` in most cases
|
| | |
| | |
| | |
| | |
| | | |
This method is called against each tag option for each tag,
and creates an extra garbage String per each call
|
|\ \ \
| | | |
| | | | |
Use ImageProcessing gem for ActiveStorage variants
|
| | | | |
|
|\ \ \ \
| | | | |
| | | | | |
Add the `nonce: true` option for `javascript_include_tag` helper.
|
| | | | | |
|
|\ \ \ \ \
| |/ / / /
|/| | | |
| | | | |
| | | | | |
q-centrix/perf-improvement-translation-helper-default-array
Only create an array with default options if we have default options
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
If the options passed in don't have a default key, there's no point in
creating an array from those empty results when we can just go straight
to creating an empty array.
Benchmarks:
```ruby
master_version with false
{:FREE=>-2497, :T_STRING=>52, :T_ARRAY=>2000, :T_HASH=>1000, :T_IMEMO=>1}
master_version with true
{:FREE=>-3001, :T_ARRAY=>2000, :T_HASH=>1000}
fast_version with false
{:FREE=>-1001, :T_ARRAY=>1000}
fast_version with true
{:FREE=>-3001, :T_ARRAY=>2000, :T_HASH=>1000}
Warming up --------------------------------------
master_version with false
104.985k i/100ms
master_version with true
118.737k i/100ms
fast_version with false
206.013k i/100ms
fast_version with true
107.005k i/100ms
Calculating -------------------------------------
master_version with false
1.970M (±24.6%) i/s - 8.924M in 5.010302s
master_version with true
2.152M (±12.4%) i/s - 10.686M in 5.051588s
fast_version with false
5.613M (±19.6%) i/s - 26.782M in 5.003740s
fast_version with true
2.027M (±15.8%) i/s - 9.951M in 5.065670s
Comparison:
fast_version with false: 5613159.2 i/s
master_version with true: 2152354.4 i/s - 2.61x slower
fast_version with true: 2027296.0 i/s - 2.77x slower
master_version with false: 1969824.9 i/s - 2.85x slower
```
Benchmark code:
```ruby
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update
your Bundler"
raise e
end
gemfile(true) do
source "https://rubygems.org"
gem "benchmark-ips"
gem "rails"
end
def allocate_count
GC.disable
before = ObjectSpace.count_objects
yield
after = ObjectSpace.count_objects
after.each { |k,v| after[k] = v - before[k] }
after[:T_HASH] -= 1 # probe effect - we created the before hash.
GC.enable
result = after.reject { |k,v| v == 0 }
GC.start
result
end
def master_version(key)
Array({}.delete(:default)).compact
end
def fast_version(key)
if key
Array({}.delete(:default)).compact
else
[]
end
end
def test
puts "master_version with false"
puts allocate_count { 1000.times { master_version(false) } }
puts "master_version with true"
puts allocate_count { 1000.times { master_version(true) } }
puts "fast_version with false"
puts allocate_count { 1000.times { fast_version(false) } }
puts "fast_version with true"
puts allocate_count { 1000.times { fast_version(true) } }
Benchmark.ips do |x|
x.report("master_version with false") { master_version(false) }
x.report("master_version with true") { master_version(true) }
x.report("fast_version with false") { fast_version(false) }
x.report("fast_version with true") { fast_version(true) }
x.compare!
end
end
test
```
|
| |/ / /
|/| | | |
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
* Since #18411, we started to inform about extracted gem (record_tag_helper)
to developers who use `ActionView::Helpers::RecordTagHelper` 's methods.
* Currently, it seems no problem that we don't have to support no longer.
|
| | | |
| | | |
| | | |
| | | | |
All of Date, DateTime and Time respond to `iso8601`.
|
| | | |
| | | |
| | | |
| | | | |
Ruby 2.6.0 warns about this.
|
| | | |
| | | |
| | | |
| | | | |
[ci skip]
|
| |/ /
|/| |
| | |
| | |
| | |
| | |
| | |
| | | |
The spacing in these comments is fairly inconsistent. Array argument
contents are often separated with a space from the array literal
brackets but in several cases the Hash literal curly braces are tangent
to their contents which makes the documentation harder to read in some
cases.
|
|\ \ \
| | | |
| | | | |
Memoize the result of gsubbing @virtual_path
|
| |/ /
| | |
| | |
| | |
| | |
| | | |
This gets called many times for each virtual_path, creating a new string
each time that `translate` is called. We can memoize this so that it
only happens once per virtual_path instead.
|