Merged updates from trunk into stable branch
[feedcatcher.git] / vendor / rails / activesupport / lib / active_support / core_ext / exception.rb
diff --git a/vendor/rails/activesupport/lib/active_support/core_ext/exception.rb b/vendor/rails/activesupport/lib/active_support/core_ext/exception.rb
new file mode 100644 (file)
index 0000000..cde0df4
--- /dev/null
@@ -0,0 +1,45 @@
+module ActiveSupport
+  if RUBY_VERSION >= '1.9'
+    FrozenObjectError = RuntimeError
+  else
+    FrozenObjectError = TypeError
+  end
+end
+
+# TODO: Turn all this into using the BacktraceCleaner.
+class Exception # :nodoc:
+  def clean_message
+    Pathname.clean_within message
+  end
+
+  TraceSubstitutions = []
+  FrameworkStart = /action_controller\/dispatcher\.rb/.freeze
+  FrameworkRegexp = /generated|vendor|dispatch|ruby|script\/\w+/.freeze
+
+  def clean_backtrace
+    backtrace.collect do |line|
+      Pathname.clean_within(TraceSubstitutions.inject(line) do |result, (regexp, sub)|
+        result.gsub regexp, sub
+      end)
+    end
+  end
+
+  def application_backtrace
+    before_framework_frame = nil
+    before_application_frame = true
+
+    trace = clean_backtrace.reject do |line|
+      before_framework_frame ||= (line =~ FrameworkStart)
+      non_app_frame = (line =~ FrameworkRegexp)
+      before_application_frame = false unless non_app_frame
+      before_framework_frame || (non_app_frame && !before_application_frame)
+    end
+
+    # If we didn't find any application frames, return an empty app trace.
+    before_application_frame ? [] : trace
+  end
+
+  def framework_backtrace
+    clean_backtrace.grep FrameworkRegexp
+  end
+end