aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext
Commit message (Collapse)AuthorAgeFilesLines
* Add require of mattr_accessor since Compatibility relies on it.Jason Frey2016-04-251-0/+2
| | | | | Follow up to https://github.com/rails/rails/commit/c9c5788a527b70d7f983e2b4b47e3afd863d9f48
* Remove `Array#sum` method before override ityui-knk2016-04-241-0/+2
| | | | | | | To suppress warning ('warning: method redefined; discarding old sum') remove the method before override it. Signed-off-by: Jeremy Daer <jeremydaer@gmail.com>
* rewords code comment [ci skip]Xavier Noria2016-04-241-3/+3
| | | | | | This alternative flows better. [Richard Schneeman & Xavier Noria]
* Follow up of ↵Vipul A M2016-04-241-4/+4
| | | | | | https://github.com/rails/rails/commit/c9c5788a527b70d7f983e2b4b47e3afd863d9f48 [ci skip]
* Make getlocal and getutc always return instances of TimeAndrew White2016-04-231-14/+18
| | | | | | | | | | | | | | | 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.
* Add DateTime#subsecAndrew White2016-04-231-0/+7
| | | | | Mirrors the Time#subsec method by returning the fraction of the second as a Rational.
* Change Time#sec_fraction to use subsecAndrew White2016-04-231-2/+2
| | | | Time instances can have fractional parts smaller than a nanosecond.
* Add additional aliases for DateTime#utcAndrew White2016-04-231-0/+2
|
* Add Time#sec_fractionAndrew White2016-04-231-0/+7
| | | | | Mirrors the DateTime#sec_fraction method by returning the fraction of the second as a Rational.
* Move `DateTime#getlocal` to `/core_ext/date_time/calculations.rb`yui-knk2016-04-232-11/+12
| | | | | | | | `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.
* Add compatibility for Ruby 2.4 `to_time` changesAndrew White2016-04-236-1/+40
| | | | | | | | | | | | | | | 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.
* just say nothing about why this regexp is slower [ci skip]Xavier Noria2016-04-211-1/+1
| | | | | | | | | 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.
* restores code comments in String#blank? [ci skip]Xavier Noria2016-04-211-2/+6
| | | | | | | | | | | | 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.
* Merge pull request #24663 from kamipo/remove_unused_blank_reJeremy Daer2016-04-201-2/+0
|\ | | | | | | Remove unused `BLANK_RE`
| * Remove unused `BLANK_RE`Ryuta Kamizono2016-04-211-2/+0
| | | | | | | | Follow up to #24658.
* | Update delegate to use newer Ruby syntaxTodd Lynam2016-04-201-5/+2
|/ | | 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.
* Speed up String#blank? Regexschneems2016-04-201-6/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Follow up on https://github.com/rails/rails/commit/697384df36a939e565b7c08725017d49dc83fe40#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
* ~3.5x speedup of String#blank? for empty stringsXavier Noria2016-04-201-1/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* Change the Hash.to_xml with a lamda example Justin2016-04-191-1/+1
| | | | Update 'foo'.to_xml(lambda { |options, key| options[:builder].b(key) }) to {foo: lambda { |options, key| options[:builder].b(key) }}.to_xml
* Ruby 2.4 Array#sum: fix non-numeric #sum feature detectionJeremy Daer2016-04-191-1/+1
|
* Merge pull request #24552 from yui-knk/raise_argument_errorJeremy Daer2016-04-191-0/+1
|\ | | | | | | Raise `ArgumentError` when an invalid form is passed to `Date#to_time`
| * Raise `ArgumentError` when an invalid form is passed to `Date#to_time`yui-knk2016-04-171-0/+1
| | | | | | | | | | | | | | | | Before this commit `NoMethodError: undefined method `form_name' for Time:Class` is raised when an invalid argument is passed. It is better to raise `ArgumentError` and show list of valid arguments to developers.
* | Ruby 2.4: compat with new Array#sumJeremy Daer2016-04-181-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Ruby 2.4 introduces `Array#sum`, but it only supports numeric elements, breaking our `Enumerable#sum` which supports arbitrary `Object#+`. To fix, override `Array#sum` with our compatible implementation. Native Ruby 2.4: %w[ a b ].sum # => TypeError: String can't be coerced into Fixnum With `Enumerable#sum` shim: %w[ a b ].sum # => 'ab' We tried shimming the fast path and falling back to the compatible path if it fails, but that ends up slower even in simple causes due to the cost of exception handling. Our only choice is to override the native `Array#sum` with our `Enumerable#sum`.
* | Change 1.week to create 1 week durations instead of 7 days durations.Andrey Novikov2016-04-181-8/+8
| | | | | | | | This is just to remove astonishment from getting `3600 seconds` from typing `1.hour`.
* | Restore Hash#transform_keys behavior to always return a Hash instanceEmily2016-04-121-1/+1
|/
* Fix behavior of JSON encoding for Exceptionnamusyaka2016-04-091-0/+6
|
* Avoid unused captureRyuta Kamizono2016-04-051-1/+1
|
* Merge pull request #24345 from ↵Rafael França2016-04-051-1/+1
|\ | | | | | | | | mtsmfm/fix-marshal-with-autoloading-for-nested-class Fix marshal with autoloading for nested class/module
| * Fix marshal with autoloading for nested class/moduleFumiaki MATSUSHIMA2016-03-281-1/+1
| | | | | | | | | | | | | | | | | | #24150 break autoloading for nested class/module. There is test for nested class but it doesn't work correctly. Following code will autoload `ClassFolder::ClassFolderSubclass` before `Marshal.load`: `assert_kind_of ClassFolder::ClassFolderSubclass, Marshal.load(dumped)`
* | Match `String#to_time`'s behaviour to rubySiim Liiser2016-04-041-1/+2
| | | | | | | | | | | | | | | | Previously `String#to_time` returned the midnight of the current date in some cases where there was no relavant information in the string. Now the method returns `nil` instead in those cases. Fixes #22958.
* | Call super instead of returning nil for DateTime#<=>Andrew White2016-04-031-5/+2
| | | | | | | | | | | | | | | | The native DateTime#<=> implementation can be used to compare instances with numeric values being considered as astronomical julian day numbers so we should call that instead of returning nil. Fixes #24228.
* | Merge branch 'master' of github.com:rails/docrailsVijay Dev2016-04-031-1/+1
|\ \
| * | s/responsibilty/responsibility/Vipul A M2016-03-221-1/+1
| | | | | | | | | | | | | | | | | | s/symantically/semantically/ [ci skip]
* | | Remove not needed includingyui-knk2016-04-022-7/+0
| | | | | | | | | | | | | | | Because `DateTime` inherits `Date` and `Date` includes `DateAndTime::Zones`, `DateTime` not need to include `DateAndTime::Zones` again.
* | | Fix method String#upcase_firstbogdanvlviv2016-03-311-1/+3
| | |
* | | Merge pull request #23895 from glaucocustodio/add_upcase_first_methodRafael Mendonça França2016-03-301-0/+7
|\ \ \ | |_|/ |/| | | | | Add upcase_first method
| * | Add upcase_first methodGlauco Custódio2016-02-251-0/+7
| | |
* | | fixed spelling in the attribute_accessors docuTorsten Braun2016-03-231-1/+1
| | | | | | | | | mattr_writer to mattr_reader
* | | fixed spellin in the mattr_reader documentationTorsten Braun2016-03-231-1/+1
| | | | | | | | | renamed cattr_reader to mattr_reader
* | | Merge pull request #24150 from exviva/unmarshal-infinite-retryXavier Noria2016-03-111-1/+4
|\ \ \ | | | | | | | | Prevent `Marshal.load` from looping infinitely
| * | | Prevent `Marshal.load` from looping infinitelyOlek Janiszewski2016-03-111-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix a bug in `Marshal.load` that caused it to loop indefinitely when trying to autoload a constant that resolved to a different name. This could occur when marshalling an ActiveRecord 4.0 object (e.g. into memcached) and then trying to unmarshal it with Rails 4.2. The marshalled payload contains a reference to `ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column`, which in Rails 4.2 resolves to `ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::Column`.
* | | | Fix `thread_mattr_accessor` thread-local variable namingMichael Ryan2016-03-111-2/+2
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The current implentation of `thread_mattr_accessor` is setting differently-named thread variables when defining class and instance writer methods, so the method isn't working as documented: Account.user = "DHH" Account.user # => "DHH" Account.new.user # => nil a = Account.new a.user = "ABC" # => "ABC" a.class.user # => "DHH" At this point `:attr_Account_user` and `:attr_Class_user` thread-local variables have been created. Modify the reader and writer methods to use the class name instead of 'Class'.
* | / Add missing require to tryRafael Mendonça França2016-03-111-0/+2
| |/ |/|
* | Deprecate `Module.local_constants`yui-knk2016-03-011-0/+4
|/ | | | | After Ruby 1.9, we can easily get the constants that have been defined locally by `Module.constants(false)`.
* Show correct return types for examples [ci skip]Gert Goet2016-02-201-49/+49
|
* Add `#on_weekday?` method to `Date`, `Time`, and `DateTime`.Vipul A M2016-02-151-0/+5
|
* rename to 'second_to_last' and 'third_to_last'Brian Christian2016-02-101-4/+4
|
* allow Array.penultimate and Array.antepenultiate access methodsBrian Christian2016-02-091-0/+14
|
* drop array allocations on `html_safe`Aaron Patterson2016-02-081-1/+1
| | | | | | | | For better or worse, anonymous `*` args will allocate arrays. Ideally, the interpreter would optimize away this allocation. However, given the number of times we call `html_safe` it seems worth the shedding idealism and going for performance. This line was the top allocation spot for a scaffold (and presumably worse on real applications).
* Don't publicize Kernel core extensionsGenadi Samokovarov2016-02-042-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a reaction to a [bug] we hit in web-console. The cause of it was a `Kernel` extension called `#console` that was public and was fighting over Railties with console block to be run on `rails console`. We solved it by making the method private. We did that through `module_function` so `::Kernel.console` can be invoked even in `BasicObject`. I'm proposing to make most of the core Active Support `Kernel` extensions `module_function` as well. Those are currently public and we are polluting every `Object` public interface with them. ```ruby >> Object.new.respond_to? :silence_warnings => true >> Object.new.respond_to? :with_warnings => true >> Object.new.respond_to? :enable_warnings => true >> Object.new.respond_to? :suppress => true `` Some extensions like `Kernel#class_eval` should be public, but most of them don't really need to be. [bug]: https://github.com/rails/web-console/issues/184