| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Added the ability to initialize `thread_mattr_*` methods with default
values like so:
``` ruby
class MyClass
thread_attr_reader :foo, default: :foo
thread_attr_writer :bar, default: :bar
thread_attr_accessor: baz do
"baz"
end
end
```
This is consistent with the api exposed by `mattr_accessor`.
|
| |
|
| |
|
|
|
|
|
| |
This causes
"NameError: undefined local variable or method `nsec' for #<DateTime:0x0000559163cdd878>"
|
|
|
|
|
|
| |
In most cases it works now without explicit require because it's accidentally required through
active_support/core_ext/date_and_time/calculations.rb where we still call `try`,
but that would stop working if we changed the Calculations implementation and remove the require call there.
|
|
|
|
|
|
| |
Using `(raise FooError, "error")` is like forcing a "new scope" around
the `raise` call, it's simpler to just wrap the `raise` arguments with
parentheses just like any other method call would.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
```ruby
class String
def to1(position)
position = [position + length, -1].max if position < 0
self[0, position + 1]
end
def to2(position)
position += size if position < 0
self[0, position + 1] || +""
end
end
Benchmark.ips do |x|
x.report("'foo'.to(1)") { 'foo'.to(1) }
x.report("'foo'.to1(1)") { 'foo'.to1(1) }
x.report("'foo'.to2(1)") { 'foo'.to2(1) }
x.report("'foo'.to(-1)") { 'foo'.to(-1) }
x.report("'foo'.to1(-1)") { 'foo'.to1(-1) }
x.report("'foo'.to2(-1)") { 'foo'.to2(-1) }
x.report("'foo'.to(-10)") { 'foo'.to(-10) }
x.report("'foo'.to1(-10)") { 'foo'.to1(-10) }
x.report("'foo'.to2(-10)") { 'foo'.to2(-10) }
end
```
Result:
```
Warming up --------------------------------------
'foo'.to(1) 199.859k i/100ms
'foo'.to1(1) 220.293k i/100ms
'foo'.to2(1) 221.522k i/100ms
'foo'.to(-1) 205.032k i/100ms
'foo'.to1(-1) 195.837k i/100ms
'foo'.to2(-1) 214.975k i/100ms
'foo'.to(-10) 214.331k i/100ms
'foo'.to1(-10) 182.666k i/100ms
'foo'.to2(-10) 224.696k i/100ms
Calculating -------------------------------------
'foo'.to(1) 4.685M (± 4.2%) i/s - 23.583M in 5.042568s
'foo'.to1(1) 5.233M (± 5.8%) i/s - 26.215M in 5.026778s
'foo'.to2(1) 5.180M (± 5.7%) i/s - 25.918M in 5.020735s
'foo'.to(-1) 4.253M (± 7.0%) i/s - 21.323M in 5.043133s
'foo'.to1(-1) 4.438M (±11.2%) i/s - 21.934M in 5.025751s
'foo'.to2(-1) 4.716M (± 9.8%) i/s - 23.432M in 5.028088s
'foo'.to(-10) 4.678M (± 9.5%) i/s - 23.148M in 5.007379s
'foo'.to1(-10) 4.428M (± 5.1%) i/s - 22.103M in 5.005155s
'foo'.to2(-10) 5.243M (± 4.6%) i/s - 26.289M in 5.024695s
```
|
|\
| |
| | |
Improve String#first and #last performance
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Removes unnecessary conditional and method call for significant
performance improvement. As a side effect, this fixes an unexpected
behavior where passing a limit of 0 would return a frozen string.
This also implements the Rails 6.1 intended behavior with regards to
negative limits, and removes the previous deprecation warnings.
String#first Comparison:
new: 3056515.0 i/s
old: 1943310.2 i/s - 1.57x slower
String#last Comparison:
new: 2691919.0 i/s
old: 1924256.6 i/s - 1.40x slower
(Note: "old" benchmarks have deprecation warnings commented out, for a
more fair comparison.)
|
| |
| |
| |
| | |
We're already running Performance/RegexpMatch cop, but it seems like the cop is not always =~ justice
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
In case a negative position is provided that exceeds the size of the
string, we're relying on -1 returned from max to get 0 length by + 1
and let [] with a 0 length returning "" for us.
E.g. "hello".to(-7), where -7 + 5 size = -2. That's
lower than -1, so we use -1 instead and + 1 would turn it into 0.
Instead allow outer bounds access and always return "".
|
|\ \
| | |
| | | |
Avoid extra allocation in String#from and #to
|
| |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Removes unnecessary Range object allocations for a significant speed-up.
String#from Comparison:
new: 3378594.0 i/s
old: 2380129.8 i/s - 1.42x slower
String#to Comparison:
new: 2866175.7 i/s
old: 2304406.4 i/s - 1.24x slower
|
|\ \
| | |
| | |
| | | |
Add compact_blank shortcut for reject(&:blank?)
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
I frequently find myself having to .compact but for blank. which means
on an array reject(&:blank?) (this is fine), or,
on a hash `.reject { |_k, v| v.blank? }` which is slightly more
frustrating and i usually write it as .reject(&:blank?) first and am
confused when it's trying to check if the keys are blank.
I've added the analagous .compact_blank! where there's a reject! to
build on (there's also a reject! in Set, but there's no other core_ext
touching Set so i've left that alone)
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Exclude missing marshal_dump and _dump methods from being delegated to
an object's delegation target via the delegate_missing_to extension.
This avoids unintentionally adding instance variables to an object
during marshallization, should the delegation target be a method which
would otherwise add them.
In current versions of Ruby, a bug exists in the way objects are
marshalled, allowing for instance variables to be added or removed
during marshallization (see https://bugs.ruby-lang.org/issues/15968).
This results in a corrupted serialized byte stream, causing an object's
instance variables to "leak" into subsequent serialized objects during
demarshallization.
In Rails, this behavior may be triggered when marshalling an object that
uses the delegate_missing_to extension, if the delegation target is a
method which adds or removes instance variables to an object being
marshalled - when calling Marshal.dump(object), Ruby's built in behavior
will check whether the object responds to :marshal_dump or :_dump, which
in turn triggers the delegation target method in the
responds_to_missing? function defined in
activesupport/lib/active_support/core_ext/module/delegation.rb
While future versions of Ruby will resolve this bug by raising a
RuntimeError, the underlying cause of this error may not be readily
apparent when encountered by Rails developers. By excluding marshal_dump
and _dump from being delegated to an object's target, this commit
eliminates a potential cause of unexpected behavior and/or
RuntimeErrors.
Fixes #36522
|
| | | |
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
definition
Tests are also only on the `Time` class
Update doc forgetting to erase when moved
Update guide `Date` class to `Time` class and defined file
Update guide correction omission
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
We sometimes say "✂️ newline after `private`" in a code review (e.g.
https://github.com/rails/rails/pull/18546#discussion_r23188776,
https://github.com/rails/rails/pull/34832#discussion_r244847195).
Now `Layout/EmptyLinesAroundAccessModifier` cop have new enforced style
`EnforcedStyle: only_before` (https://github.com/rubocop-hq/rubocop/pull/7059).
That cop and enforced style will reduce the our code review cost.
|
|/ / |
|
| | |
|
| | |
|
|/
|
|
| |
attachment
|
|
|
|
|
|
|
|
|
| |
ActiveSupport `delegate` has `to` option, but it's not a option hash
anymore and now it's a keyword argument.
When `to` argument is not given, it raises an ArgumentError but
the message suggests supplying "options hash", which is now wrong.
Now it's fixed to provide correct suggestion to supply a keyword
argument.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Add test asserting truncate returns unfrozen string
* Ensure strings returned from truncate are not frozen
This fixes an issue where strings too short to be truncated were
returned unfrozen, where as long-enough strings were returned
frozen. Now retuned strings will not be frozen whether or not
the string returned was shortened.
* Update changelog w/ new truncate behavior description
[Jordan Thomas + Rafael Mendonça França]
|
| |
|
|\
| |
| | |
Hash / HashWithIndifferentAccess speed improvements
|
| | |
|
|/
|
|
|
|
|
| |
* add leading `#` before `=>` since hash rocket is valid Ruby code
* add backticks
* remove trailing spaces
* and more
|
|\
| |
| | |
sub, sub!, gsub, and gsub! should set back references
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Before:
```ruby
(1..10).cover?(1...11) => false
```
After:
```ruby
(1..10).cover?(1...11) => true
```
See https://git.io/fjTtz for the commit against Ruby core that added
support for Range arguments, with similar handling of this case.
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
In #10634 the behavior of Time#advance was changed to maintain a
proleptic gregorian calendar for dates before calendar reform. However
it didn't full address dates a long time before calendar reform and
they gradually drift away from the proleptic calendar the further you
go back in time. Fix this by always converting the date to gregorian
before calling advance which sets the reform date to -infinity.
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| |
| |
| | |
Parameterize is triggering I18n#transliterate. This method already
accepts a locale. It would be cleaner if similar to other string inflection
methods #parameterize also accepted 'locale' as a parameter.
|
| | |
|
| |
| |
| |
| | |
Enumerable#excluding
|
| |
| |
| |
| |
| |
| |
| |
| | |
* activesupport(class_attribute): Use redefine_singleton_method
* activesupport(class_attribute): Use keyword arguments
* activesupport(class_attribute): Avoid unnecessary redefinition for default
|
| |
| |
| |
| | |
`object.transform_values!` returns `object` itself.
|
| | |
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
ActiveSupport overrides `` Kernel#` `` so that it would not raise
`Errno::ENOENT` but return `nil` instead (due to the last statement
`STDERR.puts` returning nil) if a given command were not found.
Because of this, you cannot safely say somthing like
`` `command`.chomp `` when ActiveSupport is loaded.
It turns out that this is an outdated monkey patch for Windows
platforms to emulate Unix behavior on an ancient version of Ruby, and
it should be removed by now.
|