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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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