bullet 2.0.0.rc3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,11 +12,10 @@ module Bullet
12
12
  autoload :Rack, 'bullet/rack'
13
13
  autoload :BulletLogger, 'bullet/logger'
14
14
  autoload :Notification, 'bullet/notification'
15
- autoload :Presenter, 'bullet/presenter'
16
15
  autoload :Detector, 'bullet/detector'
17
16
  autoload :Registry, 'bullet/registry'
18
17
  autoload :NotificationCollector, 'bullet/notification_collector'
19
-
18
+
20
19
  if defined? Rails::Railtie
21
20
  # compatible with rails 3.0.0.beta4
22
21
  class BulletRailtie < Rails::Railtie
@@ -27,23 +26,18 @@ module Bullet
27
26
  end
28
27
 
29
28
  class <<self
30
- attr_accessor :enable, :alert, :console, :growl, :growl_password, :rails_logger, :bullet_logger, :disable_browser_cache, :xmpp
29
+ attr_accessor :enable, :disable_browser_cache
31
30
  attr_reader :notification_collector
32
-
33
- DETECTORS = [ Bullet::Detector::NPlusOneQuery,
31
+
32
+ delegate :alert=, :console=, :growl=, :rails_logger=, :xmpp=, :to => UniformNotifier
33
+
34
+ DETECTORS = [ Bullet::Detector::NPlusOneQuery,
34
35
  Bullet::Detector::UnusedEagerAssociation,
35
36
  Bullet::Detector::Counter ]
36
37
 
37
- PRESENTERS = [ Bullet::Presenter::JavascriptAlert,
38
- Bullet::Presenter::JavascriptConsole,
39
- Bullet::Presenter::Growl,
40
- Bullet::Presenter::Xmpp,
41
- Bullet::Presenter::RailsLogger,
42
- Bullet::Presenter::BulletLogger ]
43
-
44
38
  def enable=(enable)
45
39
  @enable = enable
46
- if enable?
40
+ if enable?
47
41
  Bullet::ActiveRecord.enable
48
42
  if Rails.version =~ /^2./
49
43
  Bullet::ActionController.enable
@@ -55,16 +49,12 @@ module Bullet
55
49
  @enable == true
56
50
  end
57
51
 
58
- def growl=(growl)
59
- Bullet::Presenter::Growl.setup_connection( self.growl_password ) if growl
60
- end
61
-
62
- def xmpp=(xmpp)
63
- Bullet::Presenter::Xmpp.setup_connection( xmpp ) if xmpp
64
- end
65
-
66
- def bullet_logger=(bullet_logger)
67
- Bullet::Presenter::BulletLogger.setup if bullet_logger
52
+ def bullet_logger=(active)
53
+ if active
54
+ bullet_log_file = File.open( 'log/bullet.log', 'a+' )
55
+ bullet_log_file.sync
56
+ UniformNotifier.customized_logger = bullet_log_file
57
+ end
68
58
  end
69
59
 
70
60
  def start_request
@@ -75,15 +65,11 @@ module Bullet
75
65
  def end_request
76
66
  DETECTORS.each {|bullet| bullet.end_request}
77
67
  end
78
-
68
+
79
69
  def clear
80
70
  DETECTORS.each {|bullet| bullet.clear}
81
71
  end
82
72
 
83
- def active_presenters
84
- PRESENTERS.select { |presenter| presenter.send :active? }
85
- end
86
-
87
73
  def notification_collector
88
74
  @notification_collector ||= Bullet::NotificationCollector.new
89
75
  end
@@ -95,23 +81,23 @@ module Bullet
95
81
 
96
82
  def gather_inline_notifications
97
83
  responses = []
98
- for_each_active_presenter_with_notification do |notification|
99
- responses << notification.present_inline
84
+ for_each_active_notifier_with_notification do |notification|
85
+ responses << notification.notify_inline
100
86
  end
101
87
  responses.join( "\n" )
102
88
  end
103
89
 
104
90
  def perform_out_of_channel_notifications
105
- for_each_active_presenter_with_notification do |notification|
106
- notification.present_out_of_channel
91
+ for_each_active_notifier_with_notification do |notification|
92
+ notification.notify_out_of_channel
107
93
  end
108
94
  end
109
95
 
110
96
  private
111
- def for_each_active_presenter_with_notification
112
- active_presenters.each do |presenter|
97
+ def for_each_active_notifier_with_notification
98
+ UniformNotifier.active_notifiers.each do |notifier|
113
99
  notification_collector.collection.each do |notification|
114
- notification.presenter = presenter
100
+ notification.notifier = notifier
115
101
  yield notification
116
102
  end
117
103
  end
@@ -1,7 +1,7 @@
1
1
  module Bullet
2
2
  module Notification
3
3
  class Base
4
- attr_accessor :presenter
4
+ attr_accessor :notifier
5
5
  attr_reader :base_class, :associations, :path
6
6
 
7
7
  def initialize( base_class, associations, path = nil )
@@ -15,11 +15,11 @@ module Bullet
15
15
 
16
16
  def body
17
17
  end
18
-
18
+
19
19
  def body_with_caller
20
20
  body
21
21
  end
22
-
22
+
23
23
  def standard_notice
24
24
  @standard_notifice ||= title + "\n" + body
25
25
  end
@@ -28,14 +28,12 @@ module Bullet
28
28
  @full_notice ||= title + "\n" + body_with_caller
29
29
  end
30
30
 
31
- def present_inline
32
- return unless self.presenter.respond_to? :inline_notify
33
- self.presenter.send( :inline_notify, self )
31
+ def notify_inline
32
+ self.notifier.inline_notify( self.full_notice )
34
33
  end
35
34
 
36
- def present_out_of_channel
37
- return unless self.presenter.respond_to? :out_of_channel_notify
38
- self.presenter.send( :out_of_channel_notify, self )
35
+ def notify_out_of_channel
36
+ self.notifier.out_of_channel_notify( self.full_notice )
39
37
  end
40
38
 
41
39
  def eql?( other )
@@ -30,7 +30,7 @@ module Bullet
30
30
  (response.is_a?(Array) && response.size <= 1) ||
31
31
  !response.body.is_a?(String) || response.body.empty?
32
32
  end
33
-
33
+
34
34
  def check_html?(headers, response)
35
35
  headers['Content-Type'] and headers['Content-Type'].include? 'text/html' and response.body =~ %r{<html.*</html>}m
36
36
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
  module Bullet
3
- VERSION = "2.0.0.rc3"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullet
3
3
  version: !ruby/object:Gem::Version
4
- hash: 977940588
5
- prerelease: true
4
+ hash: 15
5
+ prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 0
9
9
  - 0
10
- - rc3
11
- version: 2.0.0.rc3
10
+ version: 2.0.0
12
11
  platform: ruby
13
12
  authors:
14
13
  - Richard Huang
@@ -16,10 +15,25 @@ autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2010-11-02 00:00:00 +08:00
18
+ date: 2010-11-19 00:00:00 +08:00
20
19
  default_executable:
21
- dependencies: []
22
-
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 23
28
+ segments:
29
+ - 1
30
+ - 0
31
+ - 0
32
+ version: 1.0.0
33
+ requirement: *id001
34
+ name: uniform_notifier
35
+ prerelease: false
36
+ type: :runtime
23
37
  description: A rails plugin to kill N+1 queries and unused eager loading.
24
38
  email:
25
39
  - flyerhzm@gmail.com
@@ -47,15 +61,6 @@ files:
47
61
  - lib/bullet/notification/unused_eager_loading.rb
48
62
  - lib/bullet/notification.rb
49
63
  - lib/bullet/notification_collector.rb
50
- - lib/bullet/presenter/base.rb
51
- - lib/bullet/presenter/bullet_logger.rb
52
- - lib/bullet/presenter/growl.rb
53
- - lib/bullet/presenter/javascript_alert.rb
54
- - lib/bullet/presenter/javascript_console.rb
55
- - lib/bullet/presenter/javascript_helpers.rb
56
- - lib/bullet/presenter/rails_logger.rb
57
- - lib/bullet/presenter/xmpp.rb
58
- - lib/bullet/presenter.rb
59
64
  - lib/bullet/rack.rb
60
65
  - lib/bullet/registry/association.rb
61
66
  - lib/bullet/registry/base.rb
@@ -1,13 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- autoload :Base, 'bullet/presenter/base'
4
- autoload :JavascriptAlert, 'bullet/presenter/javascript_alert'
5
- autoload :JavascriptConsole, 'bullet/presenter/javascript_console'
6
- autoload :Growl, 'bullet/presenter/growl'
7
- autoload :Xmpp, 'bullet/presenter/xmpp'
8
- autoload :RailsLogger, 'bullet/presenter/rails_logger'
9
- autoload :BulletLogger, 'bullet/presenter/bullet_logger'
10
-
11
- autoload :JavascriptHelpers, 'bullet/presenter/javascript_helpers'
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- class Base
4
- def self.active?
5
- false
6
- end
7
- end
8
- end
9
- end
@@ -1,28 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- class BulletLogger < Base
4
- @logger_file = nil
5
- @logger = nil
6
-
7
- def self.active?
8
- @logger
9
- end
10
-
11
- def self.out_of_channel_notify( notice )
12
- return unless active?
13
- @logger.info notice.full_notice
14
- @logger_file.flush
15
- end
16
-
17
- def self.setup
18
- @logger_file = File.open( Rails.root.join('log/bullet.log'), 'a+' )
19
- @logger = Logger.new( @logger_file )
20
-
21
- def @logger.format_message( severity, timestamp, progname, msg )
22
- "#{timestamp.to_formatted_s(:db)}[#{severity}] #{msg}\n"
23
- end
24
- end
25
-
26
- end
27
- end
28
- end
@@ -1,40 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- class Growl < Base
4
- @growl = nil
5
-
6
- def self.active?
7
- @growl
8
- end
9
-
10
- def self.out_of_channel_notify( notice )
11
- return unless active?
12
- notify( notice.standard_notice )
13
- end
14
-
15
- def self.setup_connection( password )
16
- require 'ruby-growl'
17
- @password = password
18
- @growl = connect
19
-
20
- notify 'Bullet Growl notifications have been turned on'
21
- rescue MissingSourceFile
22
- @growl = nil
23
- raise NotificationError.new( 'You must install the ruby-growl gem to use Growl notifications: `sudo gem install ruby-growl`' )
24
- end
25
-
26
- private
27
- def self.connect
28
- ::Growl.new 'localhost',
29
- 'ruby-growl',
30
- [ 'Bullet Notification' ],
31
- nil,
32
- @password
33
- end
34
-
35
- def self.notify( message )
36
- @growl.notify( 'Bullet Notification', 'Bullet Notification', message )
37
- end
38
- end
39
- end
40
- end
@@ -1,15 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- class JavascriptAlert < Base
4
- def self.active?
5
- Bullet.alert
6
- end
7
-
8
- def self.inline_notify( notice )
9
- return '' unless self.active?
10
-
11
- JavascriptHelpers::wrap_js_association "alert( #{notice.standard_notice.inspect} ); "
12
- end
13
- end
14
- end
15
- end
@@ -1,28 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- class JavascriptConsole < Base
4
- def self.active?
5
- Bullet.console
6
- end
7
-
8
- def self.inline_notify( notice )
9
- return '' unless active?
10
-
11
- code = <<-CODE
12
- if (typeof(console) !== 'undefined') {
13
- if (console.groupCollapsed && console.groupEnd && console.log) {
14
- console.groupCollapsed(#{notice.title.inspect});
15
- console.log(#{notice.body_with_caller.inspect});
16
- console.groupEnd();
17
-
18
- } else if (console.log) {
19
- console.log(#{notice.full_notice.inspect});
20
- }
21
- }
22
- CODE
23
-
24
- JavascriptHelpers::wrap_js_association code
25
- end
26
- end
27
- end
28
- end
@@ -1,13 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- module JavascriptHelpers
4
- def self.wrap_js_association( message )
5
- %{
6
- <script type="text/javascript">/*<![CDATA[*/
7
- #{message}
8
- /*]]>*/</script>
9
- }
10
- end
11
- end
12
- end
13
- end
@@ -1,15 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- class RailsLogger < Base
4
- def self.active?
5
- Bullet.rails_logger
6
- end
7
-
8
- def self.out_of_channel_notify( notice )
9
- return unless active?
10
- Rails.logger.warn ''
11
- Rails.logger.warn notice.full_notice
12
- end
13
- end
14
- end
15
- end
@@ -1,56 +0,0 @@
1
- module Bullet
2
- module Presenter
3
- class Xmpp < Base
4
- @receiver = nil
5
- @xmpp = nil
6
- @password = nil
7
-
8
- def self.active?
9
- @xmpp
10
- end
11
-
12
- def self.out_of_channel_notify( notice )
13
- return unless active?
14
- notify( notice.standard_notice )
15
- end
16
-
17
- def self.setup_connection( xmpp_information )
18
- require 'xmpp4r'
19
-
20
- @receiver = xmpp_information[:receiver]
21
- @password = xmpp_information[:password]
22
- @account = xmpp_information[:account]
23
- @show_online_status = xmpp_information[:show_online_status]
24
-
25
- connect
26
- rescue MissingSourceFile
27
- @xmpp = nil
28
- raise NotificationError.new( 'You must install the xmpp4r gem to use XMPP notifications: `sudo gem install xmpp4r`' )
29
- end
30
-
31
- private
32
- def self.connect
33
- jid = Jabber::JID.new( @account )
34
- @xmpp = Jabber::Client.new( jid )
35
- @xmpp.connect
36
- @xmpp.auth( @password )
37
- @xmpp.send( presence_status ) if @show_online_status
38
- end
39
-
40
- def self.notify( message )
41
- message = Jabber::Message.new( @receiver, message ).
42
- set_type( :normal ).
43
- set_id( '1' ).
44
- set_subject( 'Bullet Notification' )
45
- @xmpp.send( message )
46
- end
47
-
48
- def self.presence_status
49
- project_name = Rails.root.basename.to_s.camelcase
50
- time = Time.now
51
-
52
- Jabber::Presence.new.set_status( "Bullet in project '#{project_name}' started on #{time}" )
53
- end
54
- end
55
- end
56
- end