Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge commit 'rails/master'

  • Loading branch information...
commit 6c7d8cb8ac9e6b6775e9a54ef0be62dbaab592f5 2 parents 8885b2d + 8ee0c59
@miloops miloops authored
Showing with 307 additions and 153 deletions.
  1. +1 −1  actionpack/lib/action_controller/abstract.rb
  2. +8 −11 actionpack/lib/action_controller/abstract/base.rb
  3. +11 −8 actionpack/lib/action_controller/abstract/callbacks.rb
  4. +1 −1  actionpack/lib/action_controller/abstract/exceptions.rb
  5. +12 −11 actionpack/lib/action_controller/abstract/helpers.rb
  6. +16 −16 actionpack/lib/action_controller/abstract/layouts.rb
  7. +4 −2 actionpack/lib/action_controller/abstract/logger.rb
  8. +16 −15 actionpack/lib/action_controller/abstract/renderer.rb
  9. +1 −1  actionpack/lib/action_controller/new_base.rb
  10. +13 −14 actionpack/lib/action_controller/new_base/base.rb
  11. +8 −9 actionpack/lib/action_controller/new_base/hide_actions.rb
  12. +8 −8 actionpack/lib/action_controller/new_base/layouts.rb
  13. +13 −12 actionpack/lib/action_controller/new_base/renderer.rb
  14. +3 −3 actionpack/lib/action_controller/new_base/url_for.rb
  15. +1 −1  actionpack/test/abstract_controller/callbacks_test.rb
  16. +3 −3 actionpack/test/abstract_controller/layouts_test.rb
  17. +7 −7 actionpack/test/new_base/test_helper.rb
  18. +1 −0  activeresource/lib/active_resource/base.rb
  19. +1 −0  activeresource/test/base/load_test.rb
  20. +1 −0  activesupport/lib/active_support.rb
  21. +0 −1  activesupport/lib/active_support/core_ext/module.rb
  22. +0 −26 activesupport/lib/active_support/core_ext/module/setup.rb
  23. +24 −0 activesupport/lib/active_support/dependency_module.rb
  24. +77 −0 activesupport/test/dependency_module_test.rb
  25. +1 −1  railties/lib/initializer.rb
  26. +1 −2  railties/lib/tasks/gems.rake
  27. +75 −0 tools/profile_requires.rb
View
2  actionpack/lib/action_controller/abstract.rb
@@ -7,4 +7,4 @@ module AbstractController
autoload :Renderer, "action_controller/abstract/renderer"
# === Exceptions
autoload :ActionNotFound, "action_controller/abstract/exceptions"
-end
+end
View
19 actionpack/lib/action_controller/abstract/base.rb
@@ -1,41 +1,38 @@
module AbstractController
class Base
-
attr_internal :response_body
attr_internal :response_obj
attr_internal :action_name
-
+
def self.process(action)
new.process(action)
end
-
+
def self.inherited(klass)
end
-
+
def initialize
self.response_obj = {}
end
-
+
def process(action_name)
unless respond_to_action?(action_name)
raise ActionNotFound, "The action '#{action_name}' could not be found"
end
-
+
@_action_name = action_name
process_action
self.response_obj[:body] = self.response_body
self
end
-
+
private
-
def process_action
respond_to?(action_name) ? send(action_name) : send(:action_missing, action_name)
end
-
+
def respond_to_action?(action_name)
respond_to?(action_name) || respond_to?(:action_missing, true)
end
-
end
-end
+end
View
19 actionpack/lib/action_controller/abstract/callbacks.rb
@@ -1,16 +1,19 @@
module AbstractController
module Callbacks
- setup do
- include ActiveSupport::NewCallbacks
- define_callbacks :process_action
+ extend ActiveSupport::DependencyModule
+
+ depends_on ActiveSupport::NewCallbacks
+
+ included do
+ define_callbacks :process_action
end
-
+
def process_action
_run_process_action_callbacks(action_name) do
super
end
end
-
+
module ClassMethods
def _normalize_callback_options(options)
if only = options[:only]
@@ -18,11 +21,11 @@ def _normalize_callback_options(options)
options[:per_key] = {:if => only}
end
if except = options[:except]
- except = Array(except).map {|e| "action_name == :#{e}"}.join(" || ")
+ except = Array(except).map {|e| "action_name == :#{e}"}.join(" || ")
options[:per_key] = {:unless => except}
end
end
-
+
[:before, :after, :around].each do |filter|
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
def #{filter}_filter(*names, &blk)
@@ -37,4 +40,4 @@ def #{filter}_filter(*names, &blk)
end
end
end
-end
+end
View
2  actionpack/lib/action_controller/abstract/exceptions.rb
@@ -1,3 +1,3 @@
module AbstractController
class ActionNotFound < StandardError ; end
-end
+end
View
23 actionpack/lib/action_controller/abstract/helpers.rb
@@ -1,19 +1,21 @@
module AbstractController
module Helpers
+ extend ActiveSupport::DependencyModule
+
depends_on Renderer
-
- setup do
+
+ included do
extlib_inheritable_accessor :master_helper_module
self.master_helper_module = Module.new
end
-
+
# def self.included(klass)
# klass.class_eval do
# extlib_inheritable_accessor :master_helper_module
# self.master_helper_module = Module.new
# end
# end
-
+
def _action_view
@_action_view ||= begin
av = super
@@ -21,19 +23,19 @@ def _action_view
av
end
end
-
+
module ClassMethods
def inherited(klass)
klass.master_helper_module = Module.new
klass.master_helper_module.__send__ :include, master_helper_module
-
+
super
end
-
+
def add_template_helper(mod)
master_helper_module.module_eval { include mod }
end
-
+
def helper_method(*meths)
meths.flatten.each do |meth|
master_helper_module.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
@@ -43,7 +45,7 @@ def #{meth}(*args, &blk)
ruby_eval
end
end
-
+
def helper(*args, &blk)
args.flatten.each do |arg|
case arg
@@ -54,6 +56,5 @@ def helper(*args, &blk)
master_helper_module.module_eval(&blk) if block_given?
end
end
-
end
-end
+end
View
32 actionpack/lib/action_controller/abstract/layouts.rb
@@ -1,25 +1,26 @@
module AbstractController
module Layouts
-
+ extend ActiveSupport::DependencyModule
+
depends_on Renderer
-
+
module ClassMethods
def layout(layout)
unless [String, Symbol, FalseClass, NilClass].include?(layout.class)
raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
end
-
+
@_layout = layout || false # Converts nil to false
_write_layout_method
end
-
+
def _implied_layout_name
name.underscore
end
-
+
# Takes the specified layout and creates a _layout method to be called
# by _default_layout
- #
+ #
# If the specified layout is a:
# String:: return the string
# Symbol:: call the method specified by the symbol
@@ -48,35 +49,34 @@ def _layout
end
end
end
-
+
def _render_template(template, options)
_action_view._render_template_with_layout(template, options[:_layout])
end
-
+
private
-
def _layout() end # This will be overwritten
-
+
def _layout_for_name(name)
unless [String, FalseClass, NilClass].include?(name.class)
raise ArgumentError, "String, false, or nil expected; you passed #{name.inspect}"
end
-
+
name && view_paths.find_by_parts(name, {:formats => formats}, "layouts")
end
-
+
def _default_layout(require_layout = false)
if require_layout && !_layout
- raise ArgumentError,
+ raise ArgumentError,
"There was no default layout for #{self.class} in #{view_paths.inspect}"
end
-
+
begin
layout = _layout_for_name(_layout)
rescue NameError => e
- raise NoMethodError,
+ raise NoMethodError,
"You specified #{@_layout.inspect} as the layout, but no such method was found"
end
end
end
-end
+end
View
6 actionpack/lib/action_controller/abstract/logger.rb
@@ -1,7 +1,9 @@
module AbstractController
module Logger
- setup do
+ extend ActiveSupport::DependencyModule
+
+ included do
cattr_accessor :logger
end
end
-end
+end
View
31 actionpack/lib/action_controller/abstract/renderer.rb
@@ -2,33 +2,35 @@
module AbstractController
module Renderer
+ extend ActiveSupport::DependencyModule
+
depends_on AbstractController::Logger
-
- setup do
+
+ included do
attr_internal :formats
-
+
extlib_inheritable_accessor :_view_paths
-
+
self._view_paths ||= ActionView::PathSet.new
end
-
+
def _action_view
- @_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self)
+ @_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self)
end
-
+
def render(options = {})
self.response_body = render_to_body(options)
end
-
+
# Raw rendering of a template to a Rack-compatible body.
# ====
# @option _prefix<String> The template's path prefix
# @option _layout<String> The relative path to the layout template to use
- #
+ #
# :api: plugin
def render_to_body(options = {})
name = options[:_template_name] || action_name
-
+
template = options[:_template] || view_paths.find_by_parts(name.to_s, {:formats => formats}, options[:_prefix])
_render_template(template, options)
end
@@ -37,7 +39,7 @@ def render_to_body(options = {})
# ====
# @option _prefix<String> The template's path prefix
# @option _layout<String> The relative path to the layout template to use
- #
+ #
# :api: plugin
def render_to_string(options = {})
AbstractController::Renderer.body_to_s(render_to_body(options))
@@ -46,7 +48,7 @@ def render_to_string(options = {})
def _render_template(template, options)
_action_view._render_template_with_layout(template)
end
-
+
def view_paths() _view_paths end
# Return a string representation of a Rack-compatible response body.
@@ -62,15 +64,14 @@ def self.body_to_s(body)
end
module ClassMethods
-
def append_view_path(path)
self.view_paths << path
end
-
+
def view_paths
self._view_paths
end
-
+
def view_paths=(paths)
self._view_paths = paths.is_a?(ActionView::PathSet) ?
paths : ActionView::Base.process_view_paths(paths)
View
2  actionpack/lib/action_controller/new_base.rb
@@ -4,4 +4,4 @@ module ActionController
autoload :Layouts, "action_controller/new_base/layouts"
autoload :Renderer, "action_controller/new_base/renderer"
autoload :UrlFor, "action_controller/new_base/url_for"
-end
+end
View
27 actionpack/lib/action_controller/new_base/base.rb
@@ -1,6 +1,5 @@
module ActionController
class AbstractBase < AbstractController::Base
-
# :api: public
attr_internal :request, :response, :params
@@ -12,46 +11,46 @@ def self.controller_name
# :api: public
def controller_name() self.class.controller_name end
- # :api: public
+ # :api: public
def self.controller_path
@controller_path ||= self.name.sub(/Controller$/, '').underscore
end
-
- # :api: public
+
+ # :api: public
def controller_path() self.class.controller_path end
-
- # :api: private
+
+ # :api: private
def self.action_methods
@action_names ||= Set.new(self.public_instance_methods - self::CORE_METHODS)
end
-
- # :api: private
+
+ # :api: private
def self.action_names() action_methods end
-
- # :api: private
+
+ # :api: private
def action_methods() self.class.action_names end
# :api: private
def action_names() action_methods end
-
+
# :api: plugin
def self.call(env)
controller = new
controller.call(env).to_rack
end
-
+
# :api: plugin
def response_body=(body)
@_response.body = body
end
-
+
# :api: private
def call(env)
@_request = ActionDispatch::Request.new(env)
@_response = ActionDispatch::Response.new
process(@_request.parameters[:action])
end
-
+
# :api: private
def to_rack
response.to_a
View
17 actionpack/lib/action_controller/new_base/hide_actions.rb
@@ -1,26 +1,25 @@
module ActionController
module HideActions
- setup do
+ included do
extlib_inheritable_accessor :hidden_actions
- self.hidden_actions ||= Set.new
+ self.hidden_actions ||= Set.new
end
-
+
def action_methods() self.class.action_names end
- def action_names() action_methods end
-
+ def action_names() action_methods end
+
private
-
def respond_to_action?(action_name)
!hidden_actions.include?(action_name) && (super || respond_to?(:method_missing))
end
-
+
module ClassMethods
def hide_action(*args)
args.each do |arg|
self.hidden_actions << arg.to_s
end
end
-
+
def action_methods
@action_names ||= Set.new(super.reject {|name| self.hidden_actions.include?(name.to_s)})
end
@@ -28,4 +27,4 @@ def action_methods
def self.action_names() action_methods end
end
end
-end
+end
View
16 actionpack/lib/action_controller/new_base/layouts.rb
@@ -1,14 +1,16 @@
module ActionController
module Layouts
+ extend ActiveSupport::DependencyModule
+
depends_on ActionController::Renderer
depends_on AbstractController::Layouts
-
+
module ClassMethods
def _implied_layout_name
controller_path
end
end
-
+
def render_to_body(options)
# render :text => ..., :layout => ...
# or
@@ -16,22 +18,20 @@ def render_to_body(options)
if !options.key?(:text) || options.key?(:layout)
options[:_layout] = options.key?(:layout) ? _layout_for_option(options[:layout]) : _default_layout
end
-
+
super
end
-
+
private
-
def _layout_for_option(name)
case name
when String then _layout_for_name(name)
when true then _default_layout(true)
when false, nil then nil
else
- raise ArgumentError,
- "String, true, or false, expected for `layout'; you passed #{name.inspect}"
+ raise ArgumentError,
+ "String, true, or false, expected for `layout'; you passed #{name.inspect}"
end
end
-
end
end
View
25 actionpack/lib/action_controller/new_base/renderer.rb
@@ -1,22 +1,24 @@
module ActionController
module Renderer
+ extend ActiveSupport::DependencyModule
+
depends_on AbstractController::Renderer
-
+
def initialize(*)
self.formats = [:html]
super
end
-
+
def render(action, options = {})
# TODO: Move this into #render_to_body
if action.is_a?(Hash)
- options, action = action, nil
+ options, action = action, nil
else
options.merge! :action => action
end
-
+
_process_options(options)
-
+
self.response_body = render_to_body(options)
end
@@ -32,18 +34,17 @@ def render_to_body(options)
options[:_template_name] = options[:template]
elsif options.key?(:action)
options[:_template_name] = options[:action].to_s
- options[:_prefix] = _prefix
+ options[:_prefix] = _prefix
end
-
+
super(options)
end
-
+
private
-
def _prefix
controller_path
- end
-
+ end
+
def _text(options)
text = options[:text]
@@ -52,7 +53,7 @@ def _text(options)
else text.to_s
end
end
-
+
def _process_options(options)
if status = options[:status]
response.status = status.to_i
View
6 actionpack/lib/action_controller/new_base/url_for.rb
@@ -16,7 +16,7 @@ def initialize_current_url
# by this method.
def default_url_options(options = nil)
end
-
+
def rewrite_options(options) #:nodoc:
if defaults = default_url_options(options)
defaults.merge(options)
@@ -24,7 +24,7 @@ def rewrite_options(options) #:nodoc:
options
end
end
-
+
def url_for(options = {})
options ||= {}
case options
@@ -37,4 +37,4 @@ def url_for(options = {})
end
end
end
-end
+end
View
2  actionpack/test/abstract_controller/callbacks_test.rb
@@ -4,7 +4,7 @@ module AbstractController
module Testing
class ControllerWithCallbacks < AbstractController::Base
- use AbstractController::Callbacks
+ include AbstractController::Callbacks
end
class Callback1 < ControllerWithCallbacks
View
6 actionpack/test/abstract_controller/layouts_test.rb
@@ -5,9 +5,9 @@ module Layouts
# Base controller for these tests
class Base < AbstractController::Base
- use AbstractController::Renderer
- use AbstractController::Layouts
-
+ include AbstractController::Renderer
+ include AbstractController::Layouts
+
self.view_paths = [ActionView::FixtureTemplate::FixturePath.new(
"layouts/hello.erb" => "With String <%= yield %>",
"layouts/hello_override.erb" => "With Override <%= yield %>",
View
14 actionpack/test/new_base/test_helper.rb
@@ -26,14 +26,14 @@
module ActionController
class Base2 < AbstractBase
- use AbstractController::Callbacks
- use AbstractController::Helpers
- use AbstractController::Logger
+ include AbstractController::Callbacks
+ include AbstractController::Helpers
+ include AbstractController::Logger
- use ActionController::HideActions
- use ActionController::UrlFor
- use ActionController::Renderer
- use ActionController::Layouts
+ include ActionController::HideActions
+ include ActionController::UrlFor
+ include ActionController::Renderer
+ include ActionController::Layouts
def self.inherited(klass)
::ActionController::Base2.subclasses << klass.to_s
View
1  activeresource/lib/active_resource/base.rb
@@ -3,6 +3,7 @@
require 'active_support/core_ext/module/attr_accessor_with_default'
require 'active_support/core_ext/module/delegation'
require 'active_support/core_ext/module/aliasing'
+require 'active_support/core_ext/object/misc'
require 'set'
module ActiveResource
View
1  activeresource/test/base/load_test.rb
@@ -1,6 +1,7 @@
require 'abstract_unit'
require "fixtures/person"
require "fixtures/street_address"
+require 'active_support/core_ext/symbol'
module Highrise
class Note < ActiveResource::Base
View
1  activesupport/lib/active_support.rb
@@ -34,6 +34,7 @@ def self.load_all!
autoload :Callbacks, 'active_support/callbacks'
autoload :NewCallbacks, 'active_support/new_callbacks'
autoload :ConcurrentHash, 'active_support/concurrent_hash'
+ autoload :DependencyModule, 'active_support/dependency_module'
autoload :Deprecation, 'active_support/deprecation'
autoload :Gzip, 'active_support/gzip'
autoload :Inflector, 'active_support/inflector'
View
1  activesupport/lib/active_support/core_ext/module.rb
@@ -9,4 +9,3 @@
require 'active_support/core_ext/module/loading'
require 'active_support/core_ext/module/model_naming'
require 'active_support/core_ext/module/synchronization'
-require 'active_support/core_ext/module/setup'
View
26 activesupport/lib/active_support/core_ext/module/setup.rb
@@ -1,26 +0,0 @@
-class Module
- attr_accessor :_setup_block
- attr_accessor :_dependencies
-
- def setup(&blk)
- @_setup_block = blk
- end
-
- def use(mod)
- return if self < mod
-
- (mod._dependencies || []).each do |dep|
- use dep
- end
- # raise "Circular dependencies" if self < mod
- include mod
- extend mod.const_get("ClassMethods") if mod.const_defined?("ClassMethods")
- class_eval(&mod._setup_block) if mod._setup_block
- end
-
- def depends_on(mod)
- return if self < mod
- @_dependencies ||= []
- @_dependencies << mod
- end
-end
View
24 activesupport/lib/active_support/dependency_module.rb
@@ -0,0 +1,24 @@
+module ActiveSupport
+ module DependencyModule
+ def append_features(base)
+ return if base < self
+ (@_dependencies ||= []).each { |dep| base.send(:include, dep) }
+ super
+ end
+
+ def included(base = nil, &block)
+ if base.nil? && block_given?
+ @_included_block = block
+ else
+ base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
+ base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
+ end
+ end
+
+ def depends_on(mod)
+ return if self < mod
+ @_dependencies ||= []
+ @_dependencies << mod
+ end
+ end
+end
View
77 activesupport/test/dependency_module_test.rb
@@ -0,0 +1,77 @@
+require 'abstract_unit'
+require 'active_support/dependency_module'
+
+class DependencyModuleTest < Test::Unit::TestCase
+ module Baz
+ extend ActiveSupport::DependencyModule
+
+ module ClassMethods
+ def baz
+ "baz"
+ end
+
+ def included_ran=(value)
+ @@included_ran = value
+ end
+
+ def included_ran
+ @@included_ran
+ end
+ end
+
+ included do
+ self.included_ran = true
+ end
+
+ def baz
+ "baz"
+ end
+ end
+
+ module Bar
+ extend ActiveSupport::DependencyModule
+
+ depends_on Baz
+
+ def bar
+ "bar"
+ end
+
+ def baz
+ "bar+" + super
+ end
+ end
+
+ def setup
+ @klass = Class.new
+ end
+
+ def test_module_is_included_normally
+ @klass.send(:include, Baz)
+ assert_equal "baz", @klass.new.baz
+ assert_equal DependencyModuleTest::Baz, @klass.included_modules[0]
+
+ @klass.send(:include, Baz)
+ assert_equal "baz", @klass.new.baz
+ assert_equal DependencyModuleTest::Baz, @klass.included_modules[0]
+ end
+
+ def test_class_methods_are_extended
+ @klass.send(:include, Baz)
+ assert_equal "baz", @klass.baz
+ assert_equal DependencyModuleTest::Baz::ClassMethods, (class << @klass; self.included_modules; end)[0]
+ end
+
+ def test_included_block_is_ran
+ @klass.send(:include, Baz)
+ assert_equal true, @klass.included_ran
+ end
+
+ def test_modules_dependencies_are_met
+ @klass.send(:include, Bar)
+ assert_equal "bar", @klass.new.bar
+ assert_equal "bar+baz", @klass.new.baz
+ assert_equal "baz", @klass.baz
+ assert_equal [DependencyModuleTest::Bar, DependencyModuleTest::Baz], @klass.included_modules[0..1]
+ end
+end
View
2  railties/lib/initializer.rb
@@ -462,7 +462,7 @@ def initialize_cache
if RAILS_CACHE.respond_to?(:middleware)
# Insert middleware to setup and teardown local cache for each request
- configuration.middleware.insert_after(:"ActionController::Failsafe", RAILS_CACHE.middleware)
+ configuration.middleware.insert_after(:"ActionDispatch::Failsafe", RAILS_CACHE.middleware)
end
end
end
View
3  railties/lib/tasks/gems.rake
@@ -27,8 +27,7 @@ namespace :gems do
desc "Force the build of all gems"
task :force do
$gems_build_rake_task = true
- Rake::Task['gems:unpack'].invoke
- current_gems.each { |gem| gem.build(:force => true) }
+ frozen_gems.each { |gem| gem.build(:force => true) }
end
end
View
75 tools/profile_requires.rb
@@ -0,0 +1,75 @@
+#!/usr/bin/env ruby
+# Example:
+# ruby -Iactivesupport/lib tools/profile_requires.rb active_support
+# ruby -Iactionpack/lib tools/profile_requires.rb action_controller
+abort 'Use REE so you can profile memory and object allocation' unless GC.respond_to?(:enable_stats)
+
+GC.enable_stats
+require 'rubygems'
+Gem.source_index
+require 'benchmark'
+
+module TrackHeapGrowth
+ class << self
+ attr_accessor :indent
+ attr_accessor :stats
+ end
+ self.indent = 0
+ self.stats = []
+
+ def track_growth(file)
+ TrackHeapGrowth.indent += 1
+ heap_before, objects_before = GC.allocated_size, ObjectSpace.allocated_objects
+ result = nil
+ elapsed = Benchmark.realtime { result = yield }
+ heap_after, objects_after = GC.allocated_size, ObjectSpace.allocated_objects
+ TrackHeapGrowth.indent -= 1
+ TrackHeapGrowth.stats << [file, TrackHeapGrowth.indent, elapsed, heap_after - heap_before, objects_after - objects_before] if result
+ result
+ end
+
+ def require(file, *args)
+ track_growth(file) { super }
+ end
+
+ def load(file, *args)
+ track_growth(file) { super }
+ end
+end
+
+Object.instance_eval { include TrackHeapGrowth }
+
+GC.start
+before = GC.allocated_size
+before_rss = `ps -o rss= -p #{Process.pid}`.to_i
+before_live_objects = ObjectSpace.live_objects
+
+path = ARGV.shift
+
+if mode = ARGV.shift
+ require 'ruby-prof'
+ RubyProf.measure_mode = RubyProf.const_get(mode.upcase)
+ RubyProf.start
+end
+
+ENV['NO_RELOAD'] ||= '1'
+ENV['RAILS_ENV'] ||= 'development'
+elapsed = Benchmark.realtime { require path }
+results = RubyProf.stop if mode
+
+GC.start
+after_live_objects = ObjectSpace.live_objects
+after_rss = `ps -o rss= -p #{Process.pid}`.to_i
+after = GC.allocated_size
+usage = (after - before) / 1024.0
+
+if mode
+ File.open("profile_startup.#{mode}.tree", 'w') do |out|
+ RubyProf::CallTreePrinter.new(results).print(out)
+ end
+end
+
+TrackHeapGrowth.stats.reverse_each do |file, indent, sec, bytes, objects|
+ puts "%10.2f KB %10d obj %8.1f ms %s%s" % [bytes / 1024.0, objects, sec * 1000, ' ' * indent, file]
+end
+puts "%10.2f KB %10d obj %8.1f ms %d KB RSS" % [usage, after_live_objects - before_live_objects, elapsed * 1000, after_rss - before_rss]
Please sign in to comment.
Something went wrong with that request. Please try again.