aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2010-02-14 19:28:05 +0000
committerPratik Naik <pratiknaik@gmail.com>2010-02-14 19:28:05 +0000
commit6f3c5f67870a625b8be4de6e34e8d0d2f5d2b5e3 (patch)
tree3da8d75101aabe3c1d90d0582505ec1480c9d885 /activesupport/lib/active_support/core_ext
parent77bf78b3b78a41d4f2f6e733f5c9c00608c0adba (diff)
parenta1b60696e2b13cbe94d748444cc0da37b190fbb8 (diff)
downloadrails-6f3c5f67870a625b8be4de6e34e8d0d2f5d2b5e3.tar.gz
rails-6f3c5f67870a625b8be4de6e34e8d0d2f5d2b5e3.tar.bz2
rails-6f3c5f67870a625b8be4de6e34e8d0d2f5d2b5e3.zip
Merge remote branch 'mainstream/master'
Conflicts: railties/README railties/guides/source/active_support_core_extensions.textile railties/guides/source/getting_started.textile railties/lib/generators/rails/app/templates/README
Diffstat (limited to 'activesupport/lib/active_support/core_ext')
-rw-r--r--activesupport/lib/active_support/core_ext/class.rb1
-rw-r--r--activesupport/lib/active_support/core_ext/class/subclasses.rb55
-rw-r--r--activesupport/lib/active_support/core_ext/file/atomic.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/kernel.rb1
-rw-r--r--activesupport/lib/active_support/core_ext/kernel/daemonizing.rb7
-rw-r--r--activesupport/lib/active_support/core_ext/kernel/debugger.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/module.rb6
-rw-r--r--activesupport/lib/active_support/core_ext/module/anonymous.rb24
-rw-r--r--activesupport/lib/active_support/core_ext/module/inclusion.rb30
-rw-r--r--activesupport/lib/active_support/core_ext/module/loading.rb25
-rw-r--r--activesupport/lib/active_support/core_ext/module/reachable.rb10
-rw-r--r--activesupport/lib/active_support/core_ext/object.rb6
-rw-r--r--activesupport/lib/active_support/core_ext/object/extending.rb11
-rw-r--r--activesupport/lib/active_support/core_ext/string/output_safety.rb7
-rw-r--r--activesupport/lib/active_support/core_ext/string/xchar.rb2
15 files changed, 115 insertions, 74 deletions
diff --git a/activesupport/lib/active_support/core_ext/class.rb b/activesupport/lib/active_support/core_ext/class.rb
index 62df7d8b82..f2ca9c7cc9 100644
--- a/activesupport/lib/active_support/core_ext/class.rb
+++ b/activesupport/lib/active_support/core_ext/class.rb
@@ -1,3 +1,4 @@
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/class/inheritable_attributes'
require 'active_support/core_ext/class/delegating_attributes'
+require 'active_support/core_ext/class/subclasses'
diff --git a/activesupport/lib/active_support/core_ext/class/subclasses.rb b/activesupport/lib/active_support/core_ext/class/subclasses.rb
new file mode 100644
index 0000000000..bbd8f5aef6
--- /dev/null
+++ b/activesupport/lib/active_support/core_ext/class/subclasses.rb
@@ -0,0 +1,55 @@
+require 'active_support/core_ext/module/anonymous'
+require 'active_support/core_ext/module/reachable'
+
+class Class #:nodoc:
+ # Returns an array with the names of the subclasses of +self+ as strings.
+ #
+ # Integer.subclasses # => ["Bignum", "Fixnum"]
+ def subclasses
+ Class.subclasses_of(self).map { |o| o.to_s }
+ end
+
+ # 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
+
+ # 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 self.subclasses_of(*superclasses) #:nodoc:
+ subclasses = []
+ superclasses.each do |klass|
+ subclasses.concat klass.descendents.select {|k| k.anonymous? || k.reachable?}
+ end
+ subclasses
+ end
+end
diff --git a/activesupport/lib/active_support/core_ext/file/atomic.rb b/activesupport/lib/active_support/core_ext/file/atomic.rb
index 249fb1362d..49d28e8a34 100644
--- a/activesupport/lib/active_support/core_ext/file/atomic.rb
+++ b/activesupport/lib/active_support/core_ext/file/atomic.rb
@@ -9,7 +9,7 @@ class File
# If your temp directory is not on the same filesystem as the file you're
# trying to write, you can provide a different temporary directory.
#
- # File.atomic_write("/data/something.important", "/data/tmp") do |f|
+ # File.atomic_write("/data/something.important", "/data/tmp") do |file|
# file.write("hello")
# end
def self.atomic_write(file_name, temp_dir = Dir.tmpdir)
diff --git a/activesupport/lib/active_support/core_ext/kernel.rb b/activesupport/lib/active_support/core_ext/kernel.rb
index 1922d804bf..c3bed14f63 100644
--- a/activesupport/lib/active_support/core_ext/kernel.rb
+++ b/activesupport/lib/active_support/core_ext/kernel.rb
@@ -1,4 +1,3 @@
-require 'active_support/core_ext/kernel/daemonizing'
require 'active_support/core_ext/kernel/reporting'
require 'active_support/core_ext/kernel/agnostics'
require 'active_support/core_ext/kernel/requires'
diff --git a/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb b/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb
deleted file mode 100644
index ed9d1f9bf2..0000000000
--- a/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-module Kernel
- # Turns the current script into a daemon process that detaches from the console.
- # It can be shut down with a TERM signal.
- def daemonize
- Process.daemon
- end
-end
diff --git a/activesupport/lib/active_support/core_ext/kernel/debugger.rb b/activesupport/lib/active_support/core_ext/kernel/debugger.rb
index 59e03e3df7..22fcc1910b 100644
--- a/activesupport/lib/active_support/core_ext/kernel/debugger.rb
+++ b/activesupport/lib/active_support/core_ext/kernel/debugger.rb
@@ -1,6 +1,6 @@
module Kernel
unless respond_to?(:debugger)
- # Starts a debugging session if ruby-debug has been loaded (call script/server --debugger to do load it).
+ # Starts a debugging session if ruby-debug has been loaded (call rails server --debugger to do load it).
def debugger
message = "\n***** Debugger requested, but was not available: Start server with --debugger to enable *****\n"
defined?(Rails) ? Rails.logger.info(message) : $stderr.puts(message)
diff --git a/activesupport/lib/active_support/core_ext/module.rb b/activesupport/lib/active_support/core_ext/module.rb
index fbe89fe07c..bf272e9e73 100644
--- a/activesupport/lib/active_support/core_ext/module.rb
+++ b/activesupport/lib/active_support/core_ext/module.rb
@@ -1,10 +1,10 @@
require 'active_support/core_ext/module/aliasing'
require 'active_support/core_ext/module/introspection'
-
-require 'active_support/core_ext/module/inclusion'
+require 'active_support/core_ext/module/anonymous'
+require 'active_support/core_ext/module/reachable'
require 'active_support/core_ext/module/attribute_accessors'
require 'active_support/core_ext/module/attr_internal'
require 'active_support/core_ext/module/attr_accessor_with_default'
require 'active_support/core_ext/module/delegation'
-require 'active_support/core_ext/module/loading'
require 'active_support/core_ext/module/synchronization'
+require 'active_support/core_ext/module/deprecation' \ No newline at end of file
diff --git a/activesupport/lib/active_support/core_ext/module/anonymous.rb b/activesupport/lib/active_support/core_ext/module/anonymous.rb
new file mode 100644
index 0000000000..df25a09ec9
--- /dev/null
+++ b/activesupport/lib/active_support/core_ext/module/anonymous.rb
@@ -0,0 +1,24 @@
+require 'active_support/core_ext/object/blank'
+
+class Module
+ # A module may or may not have a name.
+ #
+ # module M; end
+ # M.name # => "M"
+ #
+ # m = Module.new
+ # m.name # => ""
+ #
+ # A module gets a name when it is first assigned to a constant. Either
+ # via the +module+ or +class+ keyword or by an explicit assignment:
+ #
+ # m = Module.new # creates an anonymous module
+ # M = m # => m gets a name here as a side-effect
+ # m.name # => "M"
+ #
+ def anonymous?
+ # Uses blank? because the name of an anonymous class is an empty
+ # string in 1.8, and nil in 1.9.
+ name.blank?
+ end
+end
diff --git a/activesupport/lib/active_support/core_ext/module/inclusion.rb b/activesupport/lib/active_support/core_ext/module/inclusion.rb
deleted file mode 100644
index 4f23841645..0000000000
--- a/activesupport/lib/active_support/core_ext/module/inclusion.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-class Module
- # Returns the classes in the current ObjectSpace where this module has been
- # mixed in according to Module#included_modules.
- #
- # module M
- # end
- #
- # module N
- # include M
- # end
- #
- # class C
- # include M
- # end
- #
- # class D < C
- # end
- #
- # p M.included_in_classes # => [C, D]
- #
- def included_in_classes
- classes = []
- ObjectSpace.each_object(Class) { |k| classes << k if k.included_modules.include?(self) }
-
- classes.reverse.inject([]) do |unique_classes, klass|
- unique_classes << klass unless unique_classes.collect { |k| k.to_s }.include?(klass.to_s)
- unique_classes
- end
- end
-end \ No newline at end of file
diff --git a/activesupport/lib/active_support/core_ext/module/loading.rb b/activesupport/lib/active_support/core_ext/module/loading.rb
deleted file mode 100644
index 43d0578ae6..0000000000
--- a/activesupport/lib/active_support/core_ext/module/loading.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'active_support/core_ext/string/inflections'
-
-class Module
- # Returns String#underscore applied to the module name minus trailing classes.
- #
- # ActiveRecord.as_load_path # => "active_record"
- # ActiveRecord::Associations.as_load_path # => "active_record/associations"
- # ActiveRecord::Base.as_load_path # => "active_record" (Base is a class)
- #
- # The Kernel module gives an empty string by definition.
- #
- # Kernel.as_load_path # => ""
- # Math.as_load_path # => "math"
- def as_load_path
- if self == Object || self == Kernel
- ''
- elsif is_a? Class
- parent == self ? '' : parent.as_load_path
- else
- name.split('::').collect do |word|
- word.underscore
- end * '/'
- end
- end
-end \ No newline at end of file
diff --git a/activesupport/lib/active_support/core_ext/module/reachable.rb b/activesupport/lib/active_support/core_ext/module/reachable.rb
new file mode 100644
index 0000000000..443d2c3d53
--- /dev/null
+++ b/activesupport/lib/active_support/core_ext/module/reachable.rb
@@ -0,0 +1,10 @@
+require 'active_support/core_ext/module/anonymous'
+require 'active_support/core_ext/string/inflections'
+
+class Module
+ def reachable? #:nodoc:
+ !anonymous? && name.constantize.equal?(self)
+ rescue NameError
+ false
+ end
+end
diff --git a/activesupport/lib/active_support/core_ext/object.rb b/activesupport/lib/active_support/core_ext/object.rb
index 08e07a5b24..db2dac1472 100644
--- a/activesupport/lib/active_support/core_ext/object.rb
+++ b/activesupport/lib/active_support/core_ext/object.rb
@@ -7,3 +7,9 @@ require 'active_support/core_ext/object/conversions'
require 'active_support/core_ext/object/instance_variables'
require 'active_support/core_ext/object/metaclass'
require 'active_support/core_ext/object/misc'
+require 'active_support/core_ext/object/extending'
+
+require 'active_support/core_ext/object/returning'
+require 'active_support/core_ext/object/to_param'
+require 'active_support/core_ext/object/to_query'
+require 'active_support/core_ext/object/with_options'
diff --git a/activesupport/lib/active_support/core_ext/object/extending.rb b/activesupport/lib/active_support/core_ext/object/extending.rb
new file mode 100644
index 0000000000..c4c37b6a2a
--- /dev/null
+++ b/activesupport/lib/active_support/core_ext/object/extending.rb
@@ -0,0 +1,11 @@
+require 'active_support/core_ext/class/subclasses'
+
+class Object
+ # 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:
+ Class.subclasses_of(*superclasses)
+ end
+end
diff --git a/activesupport/lib/active_support/core_ext/string/output_safety.rb b/activesupport/lib/active_support/core_ext/string/output_safety.rb
index 3977971e8d..567ba00b0d 100644
--- a/activesupport/lib/active_support/core_ext/string/output_safety.rb
+++ b/activesupport/lib/active_support/core_ext/string/output_safety.rb
@@ -71,15 +71,12 @@ module ActiveSupport #:nodoc:
super(ERB::Util.h(value))
end
end
+ alias << concat
def +(other)
dup.concat(other)
end
- def <<(value)
- self.concat(value)
- end
-
def html_safe?
true
end
@@ -102,4 +99,4 @@ class String
def html_safe
ActiveSupport::SafeBuffer.new(self)
end
-end \ No newline at end of file
+end
diff --git a/activesupport/lib/active_support/core_ext/string/xchar.rb b/activesupport/lib/active_support/core_ext/string/xchar.rb
index 7183218634..f9a5b4fb64 100644
--- a/activesupport/lib/active_support/core_ext/string/xchar.rb
+++ b/activesupport/lib/active_support/core_ext/string/xchar.rb
@@ -1,5 +1,5 @@
begin
- # See http://bogomips.org/fast_xs/ by Eric Wong.
+ # See http://fast-xs.rubyforge.org/ by Eric Wong.
# Also included with hpricot.
require 'fast_xs'
rescue LoadError