rails-footnotes 3.6.6 → 3.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +10 -0
- data/README +18 -7
- data/Rakefile +4 -4
- data/lib/rails-footnotes.rb +6 -3
- data/lib/rails-footnotes/notes/abstract_note.rb +1 -1
- data/lib/rails-footnotes/notes/assigns_note.rb +23 -7
- data/lib/rails-footnotes/notes/controller_note.rb +14 -7
- data/lib/rails-footnotes/notes/partials_note.rb +18 -12
- data/lib/rails-footnotes/notes/queries_note.rb +3 -7
- data/test/footnotes_test.rb +1 -0
- metadata +22 -7
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
== Footnotes v3.6.7
|
2
|
+
* fixed log_note error - long overdue (thanks to many including Moritz Heidkamp)
|
3
|
+
* 1.9: ignore more assigns (thanks to justin case)
|
4
|
+
* 1.9 fixed test mocking (thanks to lsylvester)
|
5
|
+
* sort notes includes (thanks Alexey Smolianiov)
|
6
|
+
* handle controller paths in gems / others (thanks ubilabs)
|
7
|
+
* more graceful fallback when controller not found
|
8
|
+
* fixes for table entries being double encoded
|
9
|
+
* moved rpm exclude sql explain logic to config option
|
10
|
+
|
1
11
|
== Footnotes v3.6.6
|
2
12
|
* fix for ruby 1.9 compat (thanks to ivanoats)
|
3
13
|
* fix for log note (thanks to tobias)
|
data/README
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Rails Footnotes
|
2
2
|
License: MIT
|
3
|
-
Version: 3.6.
|
3
|
+
Version: 3.6.7
|
4
4
|
|
5
5
|
You can also read this README in pretty html at the GitHub project Wiki page
|
6
6
|
|
@@ -58,14 +58,20 @@ Another option is to allow multiple notes to be opened at the same time:
|
|
58
58
|
|
59
59
|
Footnotes::Filter.multiple_notes = true
|
60
60
|
|
61
|
+
If you have New Relic RPM installed, you may want to turn off query explains
|
62
|
+
(explains can slows things down)
|
63
|
+
|
64
|
+
Footnotes::Notes::QueriesNote.sql_explain = false
|
65
|
+
|
66
|
+
If you want to add alternate logic to enable or disable footnotes,
|
67
|
+
add something like this to environment.rb:
|
68
|
+
|
69
|
+
ENABLE_RAILS_FOOTNOTES=(Rails.env.production? == false)
|
70
|
+
|
61
71
|
Finally, you can control which notes you want to show. The default are:
|
62
72
|
|
63
73
|
Footnotes::Filter.notes = [:session, :cookies, :params, :filters, :routes, :env, :queries, :log, :general]
|
64
74
|
|
65
|
-
The queries note by default will not load if it detects New Relic loaded in the app. If you want to load it
|
66
|
-
in this case, add the following to an initializer:
|
67
|
-
|
68
|
-
Footnotes::Notes::QueriesNote.include_when_new_relic_installed = true if defined?(Footnotes)
|
69
75
|
|
70
76
|
Creating your own notes
|
71
77
|
-----------------------
|
@@ -128,13 +134,18 @@ Colaborators
|
|
128
134
|
Bugs and Feedback
|
129
135
|
-----------------
|
130
136
|
|
131
|
-
If you discover any bugs, please send an e-mail to
|
137
|
+
If you discover any bugs, please send an e-mail to keenan@thebrocks.net
|
132
138
|
If you just want to give some positive feedback or drop a line, that's fine too!
|
133
139
|
|
140
|
+
|
141
|
+
Version 3.x
|
142
|
+
-----------
|
143
|
+
|
144
|
+
This plugin was maintained until version 3.6 by José Valim
|
145
|
+
|
134
146
|
Copyright (c) 2009 José Valim (jose@plataformatec.com.br)
|
135
147
|
http://blog.plataformatec.com.br/
|
136
148
|
|
137
|
-
|
138
149
|
Version 2.0
|
139
150
|
-----------
|
140
151
|
|
data/Rakefile
CHANGED
@@ -6,19 +6,19 @@ begin
|
|
6
6
|
require 'jeweler'
|
7
7
|
Jeweler::Tasks.new do |s|
|
8
8
|
s.name = "rails-footnotes"
|
9
|
-
s.version = "3.6.
|
9
|
+
s.version = "3.6.7"
|
10
10
|
s.rubyforge_project = "rails-footnotes"
|
11
11
|
s.summary = "Every Rails page has footnotes that gives information about your application and links back to your editor."
|
12
|
-
s.email = "
|
12
|
+
s.email = "keenan@thebrocks.net"
|
13
13
|
s.homepage = "http://github.com/josevalim/rails-footnotes"
|
14
14
|
s.description = "Every Rails page has footnotes that gives information about your application and links back to your editor."
|
15
|
-
s.authors = ['
|
15
|
+
s.authors = ['Keenan Brock']
|
16
16
|
s.files = FileList["[A-Z]*", "{lib}/**/*"]
|
17
17
|
end
|
18
18
|
|
19
19
|
Jeweler::GemcutterTasks.new
|
20
20
|
rescue LoadError
|
21
|
-
puts "Jeweler, or one of its dependencies, is not available. Install it with:
|
21
|
+
puts "Jeweler, or one of its dependencies, is not available. Install it with: gem install jeweler"
|
22
22
|
end
|
23
23
|
|
24
24
|
desc 'Run tests for Footnotes.'
|
data/lib/rails-footnotes.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
-
|
1
|
+
unless defined?(ENABLE_RAILS_FOOTNOTES)
|
2
|
+
ENABLE_RAILS_FOOTNOTES=(RAILS_ENV == 'development')
|
3
|
+
end
|
4
|
+
if ENABLE_RAILS_FOOTNOTES
|
2
5
|
dir = File.dirname(__FILE__)
|
3
6
|
require File.join(dir, 'rails-footnotes', 'footnotes')
|
4
7
|
require File.join(dir, 'rails-footnotes', 'backtracer')
|
5
8
|
|
6
9
|
# Load all notes
|
7
10
|
#
|
8
|
-
Dir[File.join(dir, 'rails-footnotes', 'notes', '*.rb')].each do |note|
|
11
|
+
Dir[File.join(dir, 'rails-footnotes', 'notes', '*.rb')].sort.each do |note|
|
9
12
|
require note
|
10
13
|
end
|
11
14
|
|
@@ -17,4 +20,4 @@ if RAILS_ENV == 'development'
|
|
17
20
|
prepend_before_filter Footnotes::Filter
|
18
21
|
after_filter Footnotes::Filter
|
19
22
|
end
|
20
|
-
end
|
23
|
+
end
|
@@ -145,7 +145,7 @@ module Footnotes
|
|
145
145
|
return '' if array.empty?
|
146
146
|
|
147
147
|
header = header.collect{|i| escape(i.to_s.humanize) }
|
148
|
-
array = array.collect { |a| a.collect { |b| c = b.to_s; escape(c) unless c == ""}}
|
148
|
+
# array = array.collect { |a| a.collect { |b| c = b.to_s; escape(c) unless c == ""}}
|
149
149
|
rows = array.collect{|i| "<tr><td>#{i.join('</td><td>')}</td></tr>" }
|
150
150
|
|
151
151
|
<<-TABLE
|
@@ -3,7 +3,20 @@ require "#{File.dirname(__FILE__)}/abstract_note"
|
|
3
3
|
module Footnotes
|
4
4
|
module Notes
|
5
5
|
class AssignsNote < AbstractNote
|
6
|
-
@@ignored_assigns =
|
6
|
+
@@ignored_assigns = [
|
7
|
+
:@real_format,
|
8
|
+
:@before_filter_chain_aborted,
|
9
|
+
:@performed_redirect,
|
10
|
+
:@performed_render,
|
11
|
+
:@_params,
|
12
|
+
:@_response,
|
13
|
+
:@url,
|
14
|
+
:@template,
|
15
|
+
:@_request,
|
16
|
+
:@db_rt_before_render,
|
17
|
+
:@db_rt_after_render,
|
18
|
+
:@view_runtime
|
19
|
+
]
|
7
20
|
cattr_accessor :ignored_assigns, :instance_writter => false
|
8
21
|
|
9
22
|
def initialize(controller)
|
@@ -21,7 +34,7 @@ module Footnotes
|
|
21
34
|
def content
|
22
35
|
rows = []
|
23
36
|
assigns.each do |key|
|
24
|
-
rows << [ key, assigned_value(key) ]
|
37
|
+
rows << [ key, escape(assigned_value(key)) ]
|
25
38
|
end
|
26
39
|
mount_table(rows.unshift(['Name', 'Value']), :class => 'name_values', :summary => "Debug information for #{title}")
|
27
40
|
end
|
@@ -29,11 +42,14 @@ module Footnotes
|
|
29
42
|
protected
|
30
43
|
|
31
44
|
def assigns
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
@
|
36
|
-
@
|
45
|
+
assign = []
|
46
|
+
ignored = @@ignored_assigns
|
47
|
+
|
48
|
+
@controller.instance_variables.each {|x| assign << x.intern }
|
49
|
+
@controller.protected_instance_variables.each {|x| ignored << x.intern } if @controller.respond_to? :protected_instance_variables
|
50
|
+
|
51
|
+
assign -= ignored
|
52
|
+
return assign
|
37
53
|
end
|
38
54
|
|
39
55
|
def assigned_value(key)
|
@@ -12,7 +12,9 @@ module Footnotes
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def link
|
15
|
-
|
15
|
+
if controller_filename && controller_line_number
|
16
|
+
escape(Footnotes::Filter.prefix(controller_filename, controller_line_number + 1, 3))
|
17
|
+
end
|
16
18
|
end
|
17
19
|
|
18
20
|
def valid?
|
@@ -23,29 +25,34 @@ module Footnotes
|
|
23
25
|
# Some controller classes come with the Controller:: module and some don't
|
24
26
|
# (anyone know why? -- Duane)
|
25
27
|
def controller_filename
|
28
|
+
return @controller_filename if defined?(@controller_filename)
|
26
29
|
controller_name=@controller.class.to_s.underscore
|
27
30
|
controller_name='application' if controller_name=='application_controller'
|
28
31
|
if ActionController::Routing.respond_to? :controller_paths
|
32
|
+
@controller_filename=nil
|
29
33
|
ActionController::Routing.controller_paths.each do |controller_path|
|
30
34
|
full_controller_path = File.join(File.expand_path(controller_path), "#{controller_name}.rb")
|
31
|
-
|
35
|
+
@controller_filename=full_controller_path if File.exists?(full_controller_path)
|
32
36
|
end
|
33
|
-
raise "File not found"
|
37
|
+
#raise "File not found"
|
34
38
|
else
|
35
|
-
File.join(File.expand_path(RAILS_ROOT), 'app', 'controllers', "#{controller_name}.rb").sub('/controllers/controllers/', '/controllers/')
|
39
|
+
@controller_filename=File.join(File.expand_path(RAILS_ROOT), 'app', 'controllers', "#{controller_name}.rb").sub('/controllers/controllers/', '/controllers/')
|
36
40
|
end
|
41
|
+
@controller_filename
|
37
42
|
end
|
38
43
|
|
39
44
|
def controller_text
|
40
|
-
|
45
|
+
if controller_filename
|
46
|
+
@controller_text ||= IO.read(controller_filename)
|
47
|
+
end
|
41
48
|
end
|
42
49
|
|
43
50
|
def action_index
|
44
|
-
(controller_text =~ /def\s+#{@controller.action_name}[\s\(]/)
|
51
|
+
(controller_text =~ /def\s+#{@controller.action_name}[\s\(]/) if controller_text
|
45
52
|
end
|
46
53
|
|
47
54
|
def controller_line_number
|
48
|
-
lines_from_index(controller_text, action_index) || 0
|
55
|
+
lines_from_index(controller_text, action_index) || 0 if controller_text
|
49
56
|
end
|
50
57
|
|
51
58
|
def lines_from_index(string, index)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/log_note"
|
2
|
+
|
1
3
|
module Footnotes
|
2
4
|
module Notes
|
3
5
|
class PartialsNote < LogNote
|
@@ -12,11 +14,12 @@ module Footnotes
|
|
12
14
|
"Partials (#{partials.size})"
|
13
15
|
end
|
14
16
|
def content
|
15
|
-
|
16
|
-
href = Footnotes::Filter.prefix(
|
17
|
-
|
17
|
+
rows = partials.map do |filename|
|
18
|
+
href = Footnotes::Filter.prefix(filename,1,1)
|
19
|
+
shortened_name=filename.gsub(File.join(RAILS_ROOT,"app/views/"),"")
|
20
|
+
[%{<a href="#{href}">#{shortened_name}</a>},"#{@partial_times[filename].sum}ms",@partial_counts[filename]]
|
18
21
|
end
|
19
|
-
|
22
|
+
mount_table(rows.unshift(%w(Partial Time Count)), :summary => "Partials for #{title}")
|
20
23
|
end
|
21
24
|
|
22
25
|
protected
|
@@ -31,14 +34,17 @@ module Footnotes
|
|
31
34
|
log_lines.split("\n").each do |line|
|
32
35
|
if line =~ /Rendered (\S*) \(([\d\.]+)\S*?\)/
|
33
36
|
partial = $1
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
@controller.view_paths.each do |view_path|
|
38
|
+
path = File.join(view_path, "#{partial}*")
|
39
|
+
files = Dir.glob(path)
|
40
|
+
for file in files
|
41
|
+
#TODO figure out what format got rendered if theres multiple
|
42
|
+
@partial_times[file] ||= []
|
43
|
+
@partial_times[file] << $2.to_f
|
44
|
+
@partial_counts[file] ||= 0
|
45
|
+
@partial_counts[file] += 1
|
46
|
+
partials << file unless partials.include?(file)
|
47
|
+
end
|
42
48
|
end
|
43
49
|
end
|
44
50
|
end
|
@@ -9,7 +9,7 @@ module Footnotes
|
|
9
9
|
@@include_when_new_relic_installed = false
|
10
10
|
@@loaded = false
|
11
11
|
|
12
|
-
cattr_accessor :sql, :alert_db_time, :alert_sql_number, :alert_explain, :loaded, :instance_writter => false
|
12
|
+
cattr_accessor :sql, :alert_db_time, :alert_sql_number, :alert_explain, :loaded, :sql_explain, :instance_writter => false
|
13
13
|
cattr_reader :include_when_new_relic_installed
|
14
14
|
|
15
15
|
def self.include_when_new_relic_installed=(include_me)
|
@@ -67,11 +67,7 @@ module Footnotes
|
|
67
67
|
|
68
68
|
def self.load
|
69
69
|
#only include when NewRelic is installed if configured to do so
|
70
|
-
if !loaded and
|
71
|
-
included? and
|
72
|
-
defined?(ActiveRecord) and
|
73
|
-
(!defined?(NewRelic) or
|
74
|
-
include_when_new_relic_installed)
|
70
|
+
if !loaded and included? and defined?(ActiveRecord)
|
75
71
|
ActiveRecord::ConnectionAdapters::AbstractAdapter.send :include, Footnotes::Extensions::AbstractAdapter
|
76
72
|
ActiveRecord::ConnectionAdapters.local_constants.each do |adapter|
|
77
73
|
next unless adapter =~ /.*[^Abstract]Adapter$/
|
@@ -159,7 +155,7 @@ module Footnotes
|
|
159
155
|
type = $&.downcase.to_sym
|
160
156
|
explain = nil
|
161
157
|
|
162
|
-
if adapter_name == 'MySQL' && type == :select
|
158
|
+
if adapter_name == 'MySQL' && type == :select && Footnotes::Notes::QueriesNote.sql_explain
|
163
159
|
log_silence do
|
164
160
|
explain = execute_without_analyzer("EXPLAIN #{query}", name)
|
165
161
|
end
|
data/test/footnotes_test.rb
CHANGED
@@ -16,6 +16,7 @@ end
|
|
16
16
|
class FootnotesTest < Test::Unit::TestCase
|
17
17
|
def setup
|
18
18
|
@controller = FootnotesController.new
|
19
|
+
@controller.template = Object.new
|
19
20
|
@controller.request = ActionController::TestRequest.new
|
20
21
|
@controller.response = ActionController::TestResponse.new
|
21
22
|
@controller.response.body = $html.dup
|
metadata
CHANGED
@@ -1,20 +1,26 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-footnotes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 17
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 3
|
8
|
+
- 6
|
9
|
+
- 7
|
10
|
+
version: 3.6.7
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
|
-
-
|
13
|
+
- Keenan Brock
|
8
14
|
autorequire:
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-
|
18
|
+
date: 2010-07-20 00:00:00 -04:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
16
22
|
description: Every Rails page has footnotes that gives information about your application and links back to your editor.
|
17
|
-
email:
|
23
|
+
email: keenan@thebrocks.net
|
18
24
|
executables: []
|
19
25
|
|
20
26
|
extensions: []
|
@@ -48,6 +54,9 @@ files:
|
|
48
54
|
- lib/rails-footnotes/notes/session_note.rb
|
49
55
|
- lib/rails-footnotes/notes/stylesheets_note.rb
|
50
56
|
- lib/rails-footnotes/notes/view_note.rb
|
57
|
+
- test/footnotes_test.rb
|
58
|
+
- test/notes/abstract_note_test.rb
|
59
|
+
- test/test_helper.rb
|
51
60
|
has_rdoc: true
|
52
61
|
homepage: http://github.com/josevalim/rails-footnotes
|
53
62
|
licenses: []
|
@@ -58,21 +67,27 @@ rdoc_options:
|
|
58
67
|
require_paths:
|
59
68
|
- lib
|
60
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
61
71
|
requirements:
|
62
72
|
- - ">="
|
63
73
|
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
64
77
|
version: "0"
|
65
|
-
version:
|
66
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
67
80
|
requirements:
|
68
81
|
- - ">="
|
69
82
|
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
70
86
|
version: "0"
|
71
|
-
version:
|
72
87
|
requirements: []
|
73
88
|
|
74
89
|
rubyforge_project: rails-footnotes
|
75
|
-
rubygems_version: 1.3.
|
90
|
+
rubygems_version: 1.3.7
|
76
91
|
signing_key:
|
77
92
|
specification_version: 3
|
78
93
|
summary: Every Rails page has footnotes that gives information about your application and links back to your editor.
|