aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2010-01-28 19:46:17 +0000
committerPratik Naik <pratiknaik@gmail.com>2010-01-28 19:46:17 +0000
commit285361d1589002fcdd1584c07e6eb295f13c9f37 (patch)
tree2d50a69b3b59b6fb3cb7577b990fe3b1aaf58f4f /activesupport/lib/active_support/core_ext
parentdfa19408651ecc82e2aeba95d93db871ba8a6e41 (diff)
parentd58398c2b5e98aad18dc72790230f338c10d145c (diff)
downloadrails-285361d1589002fcdd1584c07e6eb295f13c9f37.tar.gz
rails-285361d1589002fcdd1584c07e6eb295f13c9f37.tar.bz2
rails-285361d1589002fcdd1584c07e6eb295f13c9f37.zip
Merge remote branch 'mainstream/master'
Conflicts: railties/lib/rails/railtie.rb
Diffstat (limited to 'activesupport/lib/active_support/core_ext')
-rw-r--r--activesupport/lib/active_support/core_ext/array.rb1
-rw-r--r--activesupport/lib/active_support/core_ext/array/conversions.rb13
-rw-r--r--activesupport/lib/active_support/core_ext/array/uniq_by.rb17
-rw-r--r--activesupport/lib/active_support/core_ext/class.rb1
-rw-r--r--activesupport/lib/active_support/core_ext/class/removal.rb57
-rw-r--r--activesupport/lib/active_support/core_ext/hash/deep_merge.rb13
-rw-r--r--activesupport/lib/active_support/core_ext/hash/keys.rb15
-rw-r--r--activesupport/lib/active_support/core_ext/object.rb1
-rw-r--r--activesupport/lib/active_support/core_ext/object/extending.rb63
-rw-r--r--activesupport/lib/active_support/core_ext/time/calculations.rb2
10 files changed, 31 insertions, 152 deletions
diff --git a/activesupport/lib/active_support/core_ext/array.rb b/activesupport/lib/active_support/core_ext/array.rb
index b583c7533e..4688468a8f 100644
--- a/activesupport/lib/active_support/core_ext/array.rb
+++ b/activesupport/lib/active_support/core_ext/array.rb
@@ -1,5 +1,6 @@
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/array/access'
+require 'active_support/core_ext/array/uniq_by'
require 'active_support/core_ext/array/conversions'
require 'active_support/core_ext/array/extract_options'
require 'active_support/core_ext/array/grouping'
diff --git a/activesupport/lib/active_support/core_ext/array/conversions.rb b/activesupport/lib/active_support/core_ext/array/conversions.rb
index 7fcef38372..814567a5a6 100644
--- a/activesupport/lib/active_support/core_ext/array/conversions.rb
+++ b/activesupport/lib/active_support/core_ext/array/conversions.rb
@@ -13,19 +13,6 @@ class Array
default_two_words_connector = I18n.translate(:'support.array.two_words_connector', :locale => options[:locale])
default_last_word_connector = I18n.translate(:'support.array.last_word_connector', :locale => options[:locale])
- # Try to emulate to_sentences previous to 2.3
- if options.has_key?(:connector) || options.has_key?(:skip_last_comma)
- ::ActiveSupport::Deprecation.warn(":connector has been deprecated. Use :words_connector instead", caller) if options.has_key? :connector
- ::ActiveSupport::Deprecation.warn(":skip_last_comma has been deprecated. Use :last_word_connector instead", caller) if options.has_key? :skip_last_comma
-
- skip_last_comma = options.delete :skip_last_comma
- if connector = options.delete(:connector)
- options[:last_word_connector] ||= skip_last_comma ? connector : ", #{connector}"
- else
- options[:last_word_connector] ||= skip_last_comma ? default_two_words_connector : default_last_word_connector
- end
- end
-
options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale)
options.reverse_merge! :words_connector => default_words_connector, :two_words_connector => default_two_words_connector, :last_word_connector => default_last_word_connector
diff --git a/activesupport/lib/active_support/core_ext/array/uniq_by.rb b/activesupport/lib/active_support/core_ext/array/uniq_by.rb
new file mode 100644
index 0000000000..a09b2302fd
--- /dev/null
+++ b/activesupport/lib/active_support/core_ext/array/uniq_by.rb
@@ -0,0 +1,17 @@
+class Array
+ # Return an unique array based on the criteria given as a proc.
+ #
+ # [1, 2, 3, 4].uniq_by { |i| i.odd? }
+ # #=> [1, 2]
+ #
+ def uniq_by
+ hash, array = {}, []
+ each { |i| hash[yield(i)] ||= (array << i) }
+ array
+ end
+
+ # Same as uniq_by, but modifies self.
+ def uniq_by!
+ replace(uniq_by{ |i| yield(i) })
+ end
+end
diff --git a/activesupport/lib/active_support/core_ext/class.rb b/activesupport/lib/active_support/core_ext/class.rb
index 44ad6c8c08..62df7d8b82 100644
--- a/activesupport/lib/active_support/core_ext/class.rb
+++ b/activesupport/lib/active_support/core_ext/class.rb
@@ -1,4 +1,3 @@
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/class/inheritable_attributes'
-require 'active_support/core_ext/class/removal'
require 'active_support/core_ext/class/delegating_attributes'
diff --git a/activesupport/lib/active_support/core_ext/class/removal.rb b/activesupport/lib/active_support/core_ext/class/removal.rb
deleted file mode 100644
index 652be4ed78..0000000000
--- a/activesupport/lib/active_support/core_ext/class/removal.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-require 'active_support/core_ext/object/extending'
-require 'active_support/core_ext/module/introspection'
-
-class Class #:nodoc:
-
- def reachable?
- eval("defined?(::#{self}) && ::#{self}.equal?(self)")
- end
-
- # Unassociates the class with its subclasses and removes the subclasses
- # themselves.
- #
- # Integer.remove_subclasses # => [Bignum, Fixnum]
- # Fixnum # => NameError: uninitialized constant Fixnum
- def remove_subclasses
- Object.remove_subclasses_of(self)
- end
-
- # Returns an array with the names of the subclasses of +self+ as strings.
- #
- # Integer.subclasses # => ["Bignum", "Fixnum"]
- def subclasses
- Object.subclasses_of(self).map { |o| o.to_s }
- end
-
- # Removes the classes in +klasses+ from their parent module.
- #
- # Ordinary classes belong to some module via a constant. This method computes
- # that constant name from the class name and removes it from the module it
- # belongs to.
- #
- # Object.remove_class(Integer) # => [Integer]
- # Integer # => NameError: uninitialized constant Integer
- #
- # Take into account that in general the class object could be still stored
- # somewhere else.
- #
- # i = Integer # => Integer
- # Object.remove_class(Integer) # => [Integer]
- # Integer # => NameError: uninitialized constant Integer
- # i.subclasses # => ["Bignum", "Fixnum"]
- # Fixnum.superclass # => Integer
- def remove_class(*klasses)
- klasses.flatten.each do |klass|
- # Skip this class if there is nothing bound to this name
- next unless defined?(klass.name)
-
- basename = klass.to_s.split("::").last
- parent = klass.parent
-
- # Skip this class if it does not match the current one bound to this name
- next unless parent.const_defined?(basename) && klass = parent.const_get(basename)
-
- parent.instance_eval { remove_const basename } unless parent == klass
- end
- end
-end
diff --git a/activesupport/lib/active_support/core_ext/hash/deep_merge.rb b/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
index 24d0a2a481..af771c86ff 100644
--- a/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
+++ b/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
@@ -1,17 +1,16 @@
class Hash
# Returns a new hash with +self+ and +other_hash+ merged recursively.
def deep_merge(other_hash)
- target = dup
- other_hash.each_pair do |k,v|
- tv = target[k]
- target[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
- end
- target
+ dup.deep_merge!(other_hash)
end
# Returns a new hash with +self+ and +other_hash+ merged recursively.
# Modifies the receiver in place.
def deep_merge!(other_hash)
- replace(deep_merge(other_hash))
+ other_hash.each_pair do |k,v|
+ tv = self[k]
+ self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
+ end
+ self
end
end
diff --git a/activesupport/lib/active_support/core_ext/hash/keys.rb b/activesupport/lib/active_support/core_ext/hash/keys.rb
index ecd63293b4..045a6944fa 100644
--- a/activesupport/lib/active_support/core_ext/hash/keys.rb
+++ b/activesupport/lib/active_support/core_ext/hash/keys.rb
@@ -1,10 +1,7 @@
class Hash
# Return a new hash with all keys converted to strings.
def stringify_keys
- inject({}) do |options, (key, value)|
- options[key.to_s] = value
- options
- end
+ dup.stringify_keys!
end
# Destructively convert all keys to strings.
@@ -18,16 +15,16 @@ class Hash
# Return a new hash with all keys converted to symbols, as long as
# they respond to +to_sym+.
def symbolize_keys
- inject({}) do |options, (key, value)|
- options[(key.to_sym rescue key) || key] = value
- options
- end
+ dup.symbolize_keys!
end
# Destructively convert all keys to symbols, as long as they respond
# to +to_sym+.
def symbolize_keys!
- self.replace(self.symbolize_keys)
+ keys.each do |key|
+ self[(key.to_sym rescue key) || key] = delete(key)
+ end
+ self
end
alias_method :to_options, :symbolize_keys
diff --git a/activesupport/lib/active_support/core_ext/object.rb b/activesupport/lib/active_support/core_ext/object.rb
index 04e8f06b3d..08e07a5b24 100644
--- a/activesupport/lib/active_support/core_ext/object.rb
+++ b/activesupport/lib/active_support/core_ext/object.rb
@@ -4,7 +4,6 @@ require 'active_support/core_ext/object/duplicable'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/object/conversions'
-require 'active_support/core_ext/object/extending'
require 'active_support/core_ext/object/instance_variables'
require 'active_support/core_ext/object/metaclass'
require 'active_support/core_ext/object/misc'
diff --git a/activesupport/lib/active_support/core_ext/object/extending.rb b/activesupport/lib/active_support/core_ext/object/extending.rb
deleted file mode 100644
index b8b6970382..0000000000
--- a/activesupport/lib/active_support/core_ext/object/extending.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-require 'active_support/core_ext/class/removal'
-require 'active_support/core_ext/object/blank'
-
-class Class
- # Rubinius
- if defined?(Class.__subclasses__)
- def descendents
- subclasses = []
- __subclasses__.each {|k| subclasses << k; subclasses.concat k.descendents }
- subclasses
- end
- else
- # MRI
- begin
- ObjectSpace.each_object(Class.new) {}
-
- def descendents
- subclasses = []
- ObjectSpace.each_object(class << self; self; end) do |k|
- subclasses << k unless k == self
- end
- subclasses
- end
- # JRuby
- rescue StandardError
- def descendents
- subclasses = []
- ObjectSpace.each_object(Class) do |k|
- subclasses << k if k < self
- end
- subclasses.uniq!
- subclasses
- end
- end
- end
-end
-
-class Object
- def remove_subclasses_of(*superclasses) #:nodoc:
- Class.remove_class(*subclasses_of(*superclasses))
- end
-
- # Exclude this class unless it's a subclass of our supers and is defined.
- # We check defined? in case we find a removed class that has yet to be
- # garbage collected. This also fails for anonymous classes -- please
- # submit a patch if you have a workaround.
- def subclasses_of(*superclasses) #:nodoc:
- subclasses = []
- superclasses.each do |klass|
- subclasses.concat klass.descendents.select {|k| k.name.blank? || k.reachable?}
- end
- subclasses
- end
-
- def extended_by #:nodoc:
- ancestors = class << self; ancestors end
- ancestors.select { |mod| mod.class == Module } - [ Object, Kernel ]
- end
-
- def extend_with_included_modules_from(object) #:nodoc:
- object.extended_by.each { |mod| extend mod }
- end
-end
diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb
index 703b89ffd0..98906bc5c0 100644
--- a/activesupport/lib/active_support/core_ext/time/calculations.rb
+++ b/activesupport/lib/active_support/core_ext/time/calculations.rb
@@ -259,7 +259,7 @@ class Time
# are coerced into values that Time#- will recognize
def minus_with_coercion(other)
other = other.comparable_time if other.respond_to?(:comparable_time)
- minus_without_coercion(other)
+ other.is_a?(DateTime) ? to_f - other.to_f : minus_without_coercion(other)
end
alias_method :minus_without_coercion, :-
alias_method :-, :minus_with_coercion