From fe3ceabeed6bde67eb9c0e64b27e133a66e13d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 12 Jan 2010 17:48:09 +0100 Subject: Set up subscriber on initialization. --- railties/lib/rails/application.rb | 3 -- railties/lib/rails/bootstrap.rb | 13 +++++++ railties/lib/rails/configuration.rb | 15 ++++---- railties/test/application/generators_test.rb | 2 +- railties/test/application/notifications_test.rb | 46 ++++++++++++++++++++++--- railties/test/subscriber_test.rb | 10 ++++++ 6 files changed, 74 insertions(+), 15 deletions(-) (limited to 'railties') 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" -- cgit v1.2.3