aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-01-12 17:48:09 +0100
committerJosé Valim <jose.valim@gmail.com>2010-01-13 01:19:23 +0100
commitfe3ceabeed6bde67eb9c0e64b27e133a66e13d83 (patch)
tree523dcb635d1d8934e035e54c8ece3b49413688ed
parent7f25ccf38d6cab2b96494ed1a6b7cdffeef8eae7 (diff)
downloadrails-fe3ceabeed6bde67eb9c0e64b27e133a66e13d83.tar.gz
rails-fe3ceabeed6bde67eb9c0e64b27e133a66e13d83.tar.bz2
rails-fe3ceabeed6bde67eb9c0e64b27e133a66e13d83.zip
Set up subscriber on initialization.
-rw-r--r--railties/lib/rails/application.rb3
-rw-r--r--railties/lib/rails/bootstrap.rb13
-rw-r--r--railties/lib/rails/configuration.rb15
-rw-r--r--railties/test/application/generators_test.rb2
-rw-r--r--railties/test/application/notifications_test.rb46
-rw-r--r--railties/test/subscriber_test.rb10
6 files changed, 74 insertions, 15 deletions
diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb
index 6034aa8485..c95316a4da 100644
--- a/railties/lib/rails/application.rb
+++ b/railties/lib/rails/application.rb
@@ -104,9 +104,6 @@ module Rails
@app.call(env)
end
- # # bail out if gems are missing - note that check_gem_dependencies will have
- # # already called abort() unless $gems_rake_task is set
- # return unless gems_dependencies_loaded
initializer :load_application_initializers do
Dir["#{root}/config/initializers/**/*.rb"].sort.each do |initializer|
load(initializer)
diff --git a/railties/lib/rails/bootstrap.rb b/railties/lib/rails/bootstrap.rb
index 5d9165bf9a..8a65b3fa98 100644
--- a/railties/lib/rails/bootstrap.rb
+++ b/railties/lib/rails/bootstrap.rb
@@ -128,5 +128,18 @@ module Rails
end
end
end
+
+ initializer :initialize_notifications do
+ require 'active_support/notifications'
+
+ if config.colorize_logging == false
+ Rails::Subscriber.colorize_logging = false
+ config.generators.colorize_logging = false
+ end
+
+ ActiveSupport::Notifications.subscribe do |*args|
+ Rails::Subscriber.dispatch(args)
+ end
+ end
end
end
diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb
index eed9834203..9991288cc5 100644
--- a/railties/lib/rails/configuration.rb
+++ b/railties/lib/rails/configuration.rb
@@ -64,17 +64,16 @@ module Rails
end
class Configuration < Railtie::Configuration
- attr_accessor :after_initialize_blocks, :cache_classes,
- :consider_all_requests_local, :dependency_loading, :gems,
+ attr_accessor :after_initialize_blocks, :cache_classes, :colorize_logging,
+ :consider_all_requests_local, :dependency_loading,
:load_once_paths, :logger, :metals, :plugins,
:preload_frameworks, :reload_plugins, :serve_static_assets,
:time_zone, :whiny_nils
attr_writer :cache_store, :controller_paths,
:database_configuration_file, :eager_load_paths,
- :i18n, :load_paths,
- :log_level, :log_path, :paths, :routes_configuration_file,
- :view_path
+ :i18n, :load_paths, :log_level, :log_path, :paths,
+ :routes_configuration_file, :view_path
def initialize(base = nil)
super
@@ -287,10 +286,14 @@ module Rails
end
end
- # Allows Notifications queue to be modified.
+ # Allow Notifications queue to be modified or add subscriptions:
#
# config.notifications.queue = MyNewQueue.new
#
+ # config.notifications.subscribe /action_dispatch.show_exception/ do |*args|
+ # ExceptionDeliver.deliver_exception(args)
+ # end
+ #
def notifications
ActiveSupport::Notifications
end
diff --git a/railties/test/application/generators_test.rb b/railties/test/application/generators_test.rb
index 0c858d6394..e1e51c318c 100644
--- a/railties/test/application/generators_test.rb
+++ b/railties/test/application/generators_test.rb
@@ -52,8 +52,8 @@ module ApplicationTests
config.generators.test_framework :rspec
RUBY
- require "#{app_path}/config/environment"
# Initialize the application
+ require "#{app_path}/config/environment"
require "rails/generators"
Rails::Generators.configure!
diff --git a/railties/test/application/notifications_test.rb b/railties/test/application/notifications_test.rb
index b57e829cca..1eb0777db8 100644
--- a/railties/test/application/notifications_test.rb
+++ b/railties/test/application/notifications_test.rb
@@ -12,28 +12,64 @@ module ApplicationTests
end
end
+ class MockLogger
+ def method_missing(*args)
+ @logged ||= []
+ @logged << args.last
+ end
+
+ def logged
+ @logged.compact.map { |l| l.to_s.strip }
+ end
+ end
+
class NotificationsTest < Test::Unit::TestCase
include ActiveSupport::Testing::Isolation
def setup
build_app
boot_rails
+ end
+
+ def instrument(*args, &block)
+ ActiveSupport::Notifications.instrument(*args, &block)
+ end
+
+ def wait
+ ActiveSupport::Notifications.notifier.wait
+ end
+
+ test "new queue is set" do
+ # We don't want to load all frameworks, so remove them and clean up environments.
+ use_frameworks []
FileUtils.rm_rf("#{app_path}/config/environments")
- require "active_support/notifications"
- @events = []
add_to_config <<-RUBY
config.notifications.notifier = ActiveSupport::Notifications::Notifier.new(ApplicationTests::MyQueue.new)
RUBY
- end
- test "new queue is set" do
- use_frameworks []
require "#{app_path}/config/environment"
assert_raise RuntimeError do
ActiveSupport::Notifications.publish('foo')
end
end
+
+ test "rails subscribers are added" do
+ add_to_config <<-RUBY
+ config.colorize_logging = false
+ RUBY
+
+ require "#{app_path}/config/environment"
+
+ ActiveRecord::Base.logger = logger = MockLogger.new
+
+ # Mimic an ActiveRecord notifications
+ instrument "active_record.sql", :name => "SQL", :sql => "SHOW tables"
+ wait
+
+ assert_equal 1, logger.logged.size
+ assert_match /SHOW tables/, logger.logged.last
+ end
end
end
diff --git a/railties/test/subscriber_test.rb b/railties/test/subscriber_test.rb
index ada40e2d2b..0d8793abab 100644
--- a/railties/test/subscriber_test.rb
+++ b/railties/test/subscriber_test.rb
@@ -22,7 +22,10 @@ ActiveSupport::Notifications.subscribe do |*args|
end
class MySubscriber < Rails::Subscriber
+ attr_reader :event
+
def some_event(event)
+ @event = event
info event.name
end
@@ -85,6 +88,13 @@ class SubscriberTest < ActiveSupport::TestCase
assert_equal %w(my_subscriber.some_event), @logger.logged(:info)
end
+ def test_event_is_an_active_support_notifications_event
+ Rails::Subscriber.add :my_subscriber, @subscriber
+ instrument "my_subscriber.some_event"
+ wait
+ assert_kind_of ActiveSupport::Notifications::Event, @subscriber.event
+ end
+
def test_does_not_send_the_event_if_it_doesnt_match_the_class
Rails::Subscriber.add :my_subscriber, @subscriber
instrument "my_subscriber.unknown_event"