rails3-footnotes 4.0.0.pre.3 → 4.0.0.pre.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ == Footnotes v4.0.0.pre.4 (April 2, 2011)
2
+ * fix event[:duration] to event.duration in query note
3
+ * fix layout note to work again
4
+ * rename views note to render note since it lists renders
5
+
1
6
  == Footnotes v4.0.0.pre.3 (March 30, 2011)
2
7
  * Merge in contributions from irjudson and jackkinsella
3
8
  * fixes for partials note
@@ -5,11 +5,15 @@ module Footnotes
5
5
  if ::Rails.env.development?
6
6
  require 'rails-footnotes/footnotes'
7
7
  require 'rails-footnotes/backtracer'
8
+ require 'rails-footnotes/view_subscriber'
8
9
 
9
10
  # Require each individual note
10
11
  notes_glob = File.expand_path("../rails-footnotes/notes/*.rb", __FILE__)
11
12
  Dir[notes_glob].each{|note| require note }
12
13
 
14
+ # Subscribe to view events so we can use them later
15
+ ActiveSupport::LogSubscriber.attach_to(:action_view, Footnotes.view_subscriber)
16
+
13
17
  # The footnotes are applied by default to all actions. To remove the
14
18
  # footnotes from an action, use skip_filter in your controller.
15
19
  ActionController::Base.prepend_before_filter Footnotes::BeforeFilter
@@ -25,9 +25,9 @@ module Footnotes
25
25
  @@prefix = 'txmt://open?url=file://%s&line=%d&column=%d'.html_safe
26
26
 
27
27
  # Edit notes
28
- @@notes = [ :controller, :view, :layout, :partials, :stylesheets, :javascripts ]
28
+ @@notes = [ :controller, :layout, :partials, :stylesheets, :javascripts ]
29
29
  # Show notes
30
- @@notes += [ :assigns, :session, :cookies, :params, :filters, :routes, :env, :queries, :log ]
30
+ @@notes += [ :render, :assigns, :session, :cookies, :params, :filters, :routes, :env, :queries, :log ]
31
31
 
32
32
  # Change queries for rpm note when available
33
33
  # if defined?(NewRelic)
@@ -3,9 +3,6 @@ require "#{File.dirname(__FILE__)}/abstract_note"
3
3
  module Footnotes
4
4
  module Notes
5
5
  class LayoutNote < AbstractNote
6
- def initialize(controller)
7
- @controller = controller
8
- end
9
6
 
10
7
  def row
11
8
  :edit
@@ -16,13 +13,14 @@ module Footnotes
16
13
  end
17
14
 
18
15
  def valid?
19
- prefix? && nil#@controller.active_layout TODO doesn't work with Rails 3
16
+ prefix? && filename
17
+ end
18
+
19
+ protected
20
+ def filename
21
+ Dir[Footnotes.view_subscriber.layout.to_s+".html*"].first
20
22
  end
21
23
 
22
- protected
23
- def filename
24
- File.join(File.expand_path(Rails.root), 'app', 'layouts', "#{@controller.active_layout.to_s.underscore}").sub('/layouts/layouts/', '/views/layouts/')
25
- end
26
24
  end
27
25
  end
28
26
  end
@@ -3,19 +3,12 @@ require "#{File.dirname(__FILE__)}/log_note"
3
3
  module Footnotes
4
4
  module Notes
5
5
  class PartialsNote < LogNote
6
- @@partial_subscriber = nil
7
- cattr_accessor :partial_subscriber
8
6
 
9
7
  def initialize(controller)
10
8
  super
11
9
  @controller = controller
12
10
  end
13
11
 
14
- def self.start!(controller)
15
- @@partial_subscriber = Footnotes::Notes::PartialSubscriber.new
16
- ActiveSupport::LogSubscriber.attach_to(:action_view, @@partial_subscriber)
17
- end
18
-
19
12
  def row
20
13
  :edit
21
14
  end
@@ -27,8 +20,8 @@ module Footnotes
27
20
  def content
28
21
  rows = partials.map do |filename|
29
22
  href = Footnotes::Filter.prefix(filename,1,1)
30
- shortened_name=filename.gsub(File.join(Rails.root,"app/views/"),"")
31
- [%{<a href="#{href}">#{shortened_name}</a>},"#{@partial_times[filename].sum}ms", @partial_counts[filename]]
23
+ name = filename.gsub(Rails.root.join("app/views/"),"")
24
+ [%{<a href="#{href}">#{name}</a>},"#{@partial_times[filename].sum}ms", @partial_counts[filename]]
32
25
  end
33
26
  mount_table(rows.unshift(%w(Partial Time Count)), :summary => "Partials for #{title}")
34
27
  end
@@ -37,7 +30,7 @@ module Footnotes
37
30
  self.loaded = true unless loaded
38
31
  end
39
32
 
40
- protected
33
+ protected
41
34
  #Generate a list of partials that were rendered, also build up render times and counts.
42
35
  #This is memoized so we can use its information in the title easily.
43
36
  def partials
@@ -45,7 +38,7 @@ module Footnotes
45
38
  partials = []
46
39
  @partial_counts = {}
47
40
  @partial_times = {}
48
- @@partial_subscriber.events.each do |event|
41
+ Footnotes.view_subscriber.partials.each do |event|
49
42
  partial = event.payload[:identifier]
50
43
  @partial_times[partial] ||= []
51
44
  @partial_times[partial] << event.duration
@@ -56,17 +49,7 @@ module Footnotes
56
49
  partials.reverse
57
50
  end
58
51
  end
59
- end
60
- class PartialSubscriber < ActiveSupport::LogSubscriber
61
- attr_accessor :events
62
- def initialize
63
- @events = Array.new
64
- super
65
- end
66
52
 
67
- def render_partial(event)
68
- @events << event.dup
69
- end
70
53
  end
71
54
  end
72
55
  end
@@ -31,7 +31,7 @@ module Footnotes
31
31
 
32
32
  def title
33
33
  queries = @@query_subscriber.events.length
34
- total_time = @@query_subscriber.events.inject(0){|sum, item| sum += item.payload[:duration]} / 1000.0
34
+ total_time = @@query_subscriber.events.map{|e| e.duration }.sum / 1000.0
35
35
  query_color = generate_red_color(@@query_subscriber.events.length, alert_sql_number)
36
36
  db_color = generate_red_color(total_time, alert_db_time)
37
37
 
@@ -55,7 +55,7 @@ module Footnotes
55
55
 
56
56
  @@query_subscriber.events.each_with_index do |item, i|
57
57
  html << <<-HTML
58
- #{print_name_and_time(item.payload[:name], item.payload[:duration] / 1000.0)}&nbsp;
58
+ #{print_name_and_time(item.payload[:name], item.duration / 1000.0)}&nbsp;
59
59
  <span id="explain_#{i}">#{print_query(item.payload[:sql])}</span><br />
60
60
  HTML
61
61
  end
@@ -0,0 +1,40 @@
1
+ require "#{File.dirname(__FILE__)}/abstract_note"
2
+ require "#{File.dirname(__FILE__)}/../view_subscriber"
3
+
4
+ module Footnotes
5
+ module Notes
6
+ class RenderNote < AbstractNote
7
+
8
+ def initialize(controller)
9
+ super
10
+ @controller = controller
11
+ @page = Footnotes.view_subscriber.page
12
+ end
13
+
14
+ def title
15
+ "<span style=\"background-color:#{color(@page.duration)}\">Rendered (#{"%.3f" % @page.duration}ms)</span>"
16
+ end
17
+
18
+ def content
19
+ html = ''
20
+
21
+ if @page
22
+ view = Footnotes.view_subscriber.view_name
23
+ layout = Footnotes.view_subscriber.layout_name
24
+ partial_time = Footnotes.view_subscriber.partial_time
25
+
26
+ rows = [["View", "Layout", "View Render", "Partial Render", "Total Render"],
27
+ [escape(view), escape(layout), "#{'%.3f' % (@page.duration - partial_time)}ms",
28
+ "<a href=\"#\" onclick=\"Footnotes.hideAllAndToggle('partials_debug_info');return false;\">#{'%.3f' % partial_time}ms</a>",
29
+ "#{'%.3f' % @page.duration}ms"]]
30
+ mount_table(rows)
31
+ end
32
+ end
33
+
34
+ def color(value)
35
+ value > 500.0 ? "#f00" : "#aaa"
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Footnotes
2
- VERSION = "4.0.0.pre.3"
2
+ VERSION = "4.0.0.pre.4"
3
3
  end
@@ -0,0 +1,48 @@
1
+ # Class that can subscribe to and log any view events
2
+ module Footnotes
3
+ class ViewSubscriber < ActiveSupport::LogSubscriber
4
+ attr_accessor :events
5
+ def initialize
6
+ @events = Array.new
7
+ super
8
+ end
9
+
10
+ def render_template(event)
11
+ @events << event.dup
12
+ end
13
+ alias :render_partial :render_template
14
+ alias :render_collection :render_template
15
+
16
+ def partials
17
+ events.select{ |e| e.name =~ /render_partial/ }
18
+ end
19
+
20
+ def partial_time
21
+ partials.map{|p| p.duration }.sum
22
+ end
23
+
24
+ def page
25
+ events.find{ |e| e.name =~ /render_template/ }
26
+ end
27
+
28
+ def view
29
+ page && page.payload[:identifier]
30
+ end
31
+
32
+ def view_name
33
+ view && view.gsub(Rails.root.join("app/views/"),'')
34
+ end
35
+
36
+ def layout
37
+ page && Rails.root.join("app/views", page.payload[:layout])
38
+ end
39
+
40
+ def layout_name
41
+ page && page.payload[:layout]
42
+ end
43
+ end
44
+
45
+ def self.view_subscriber
46
+ @view_subscriber ||= ViewSubscriber.new
47
+ end
48
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails3-footnotes
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1923831855
4
+ hash: 1923831841
5
5
  prerelease: true
6
6
  segments:
7
7
  - 4
8
8
  - 0
9
9
  - 0
10
10
  - pre
11
- - 3
12
- version: 4.0.0.pre.3
11
+ - 4
12
+ version: 4.0.0.pre.4
13
13
  platform: ruby
14
14
  authors:
15
15
  - "Andr\xC3\xA9 Arko"
@@ -78,12 +78,13 @@ files:
78
78
  - lib/rails-footnotes/notes/params_note.rb
79
79
  - lib/rails-footnotes/notes/partials_note.rb
80
80
  - lib/rails-footnotes/notes/queries_note.rb
81
+ - lib/rails-footnotes/notes/render_note.rb
81
82
  - lib/rails-footnotes/notes/routes_note.rb
82
83
  - lib/rails-footnotes/notes/rpm_note.rb
83
84
  - lib/rails-footnotes/notes/session_note.rb
84
85
  - lib/rails-footnotes/notes/stylesheets_note.rb
85
- - lib/rails-footnotes/notes/view_note.rb
86
86
  - lib/rails-footnotes/version.rb
87
+ - lib/rails-footnotes/view_subscriber.rb
87
88
  - lib/rails-footnotes.rb
88
89
  - lib/rails3-footnotes.rb
89
90
  - test/footnotes_test.rb
@@ -1,75 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/abstract_note"
2
-
3
- module Footnotes
4
- module Notes
5
- class ViewNote < AbstractNote
6
- @@alert_time = 500.0
7
- @@loaded = false
8
- @@view_subscriber = nil
9
-
10
- def initialize(controller)
11
- super
12
- @controller = controller
13
- end
14
-
15
- def self.start!(controller)
16
- @@view_subscriber = Footnotes::Notes::ViewSubscriber.new
17
- ActiveSupport::LogSubscriber.attach_to(:action_view, @@view_subscriber)
18
- end
19
-
20
- def self.to_sym
21
- :views
22
- end
23
-
24
- def title
25
- total_time = @@view_subscriber.events.select{ |e| e.name =~ /render_template/ }[0].duration
26
- "<span style=\"background-color:#{generate_red_color(total_time)}\">View Render (#{"%.3f" % total_time}ms)</span>"
27
- end
28
-
29
- def content
30
- html = ''
31
- page = @@view_subscriber.events.select{ |e| e.name =~ /render_template/ }[0]
32
- partials = @@view_subscriber.events.select{ |e| e.name =~ /render_partial/ }
33
- partial_time = partials.inject(0) {|sum, item| sum += item.duration}
34
-
35
- view = page.payload[:identifier].gsub(File.join(Rails.root,"app/views/"),"")
36
- layout = page.payload[:layout].gsub(File.join(Rails.root,"app/views/"),"")
37
-
38
- rows = [["View", "Layout", "View Render (ms)", "Partial(s) Render (ms)", "Total Render (ms)"],
39
- [escape(view), escape(layout), "#{'%.3f' % (page.duration - partial_time)}",
40
- "<a href=\"#\" onclick=\"Footnotes.hideAllAndToggle('partials_debug_info');return false;\">#{'%.3f' % partial_time}</a>",
41
- "#{'%.3f' % page.duration}"]]
42
-
43
- puts rows.inspect
44
-
45
- mount_table(rows)
46
- end
47
-
48
- def self.load
49
- self.loaded = true unless loaded
50
- end
51
-
52
- def generate_red_color(value)
53
- if value > @@alert_time
54
- "#f00"
55
- else
56
- "#aaa"
57
- end
58
- end
59
- end
60
-
61
- class ViewSubscriber < ActiveSupport::LogSubscriber
62
- attr_accessor :events
63
- def initialize
64
- @events = Array.new
65
- super
66
- end
67
-
68
- def render_template(event)
69
- @events << event.dup
70
- end
71
- alias :render_partial :render_template
72
- alias :render_collection :render_template
73
- end
74
- end
75
- end