rails-footnotes 3.6.3 → 3.6.4
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +21 -21
- data/README +140 -141
- data/Rakefile +20 -20
- data/lib/rails-footnotes.rb +19 -19
- data/lib/rails-footnotes/backtracer.rb +33 -33
- data/lib/rails-footnotes/footnotes.rb +2 -2
- data/lib/rails-footnotes/notes/assigns_note.rb +15 -15
- data/lib/rails-footnotes/notes/controller_note.rb +64 -64
- data/lib/rails-footnotes/notes/cookies_note.rb +17 -17
- data/lib/rails-footnotes/notes/env_note.rb +19 -19
- data/lib/rails-footnotes/notes/files_note.rb +43 -43
- data/lib/rails-footnotes/notes/filters_note.rb +52 -52
- data/lib/rails-footnotes/notes/general_note.rb +18 -18
- data/lib/rails-footnotes/notes/javascripts_note.rb +15 -15
- data/lib/rails-footnotes/notes/layout_note.rb +28 -28
- data/lib/rails-footnotes/notes/log_note.rb +47 -36
- data/lib/rails-footnotes/notes/params_note.rb +16 -16
- data/lib/rails-footnotes/notes/queries_note.rb +152 -152
- data/lib/rails-footnotes/notes/routes_note.rb +59 -59
- data/lib/rails-footnotes/notes/rpm_note.rb +24 -24
- data/lib/rails-footnotes/notes/session_note.rb +15 -15
- data/lib/rails-footnotes/notes/stylesheets_note.rb +15 -15
- data/lib/rails-footnotes/notes/view_note.rb +35 -35
- data/test/footnotes_test.rb +198 -198
- data/test/notes/abstract_note_test.rb +106 -106
- data/test/test_helper.rb +8 -8
- metadata +3 -3
@@ -199,6 +199,8 @@ module Footnotes
|
|
199
199
|
function hideAllAndToggle(id) {
|
200
200
|
hideAll();
|
201
201
|
toggle(id)
|
202
|
+
|
203
|
+
location.href = '#footnotes_debug';
|
202
204
|
}
|
203
205
|
|
204
206
|
function toggle(id){
|
@@ -208,8 +210,6 @@ module Footnotes
|
|
208
210
|
} else {
|
209
211
|
Footnotes.hide(el);
|
210
212
|
}
|
211
|
-
|
212
|
-
location.href = '#footnotes_debug';
|
213
213
|
}
|
214
214
|
|
215
215
|
function show(element) {
|
@@ -1,17 +1,17 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
5
|
class AssignsNote < AbstractNote
|
6
6
|
@@ignored_assigns = %w( @template @_request @db_rt_before_render @db_rt_after_render @view_runtime )
|
7
7
|
cattr_accessor :ignored_assigns, :instance_writter => false
|
8
|
-
|
8
|
+
|
9
9
|
def initialize(controller)
|
10
|
-
@controller = controller
|
11
|
-
end
|
12
|
-
|
13
|
-
def title
|
14
|
-
"Assigns (#{assigns.size})"
|
10
|
+
@controller = controller
|
11
|
+
end
|
12
|
+
|
13
|
+
def title
|
14
|
+
"Assigns (#{assigns.size})"
|
15
15
|
end
|
16
16
|
|
17
17
|
def valid?
|
@@ -23,7 +23,7 @@ module Footnotes
|
|
23
23
|
assigns.each do |key|
|
24
24
|
rows << [ key, assigned_value(key) ]
|
25
25
|
end
|
26
|
-
mount_table(rows.unshift(['Name', 'Value']), :class => 'name_values')
|
26
|
+
mount_table(rows.unshift(['Name', 'Value']), :class => 'name_values')
|
27
27
|
end
|
28
28
|
|
29
29
|
protected
|
@@ -38,7 +38,7 @@ module Footnotes
|
|
38
38
|
|
39
39
|
def assigned_value(key)
|
40
40
|
escape(@controller.instance_variable_get(key).inspect)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,65 +1,65 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class ControllerNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@controller = controller
|
8
|
-
end
|
9
|
-
|
10
|
-
def row
|
11
|
-
:edit
|
12
|
-
end
|
13
|
-
|
14
|
-
def link
|
15
|
-
escape(Footnotes::Filter.prefix(controller_filename, controller_line_number + 1, 3))
|
16
|
-
end
|
17
|
-
|
18
|
-
def valid?
|
19
|
-
prefix?
|
20
|
-
end
|
21
|
-
|
22
|
-
protected
|
23
|
-
# Some controller classes come with the Controller:: module and some don't
|
24
|
-
# (anyone know why? -- Duane)
|
25
|
-
def controller_filename
|
26
|
-
controller_name=@controller.class.to_s.underscore
|
27
|
-
controller_name='application' if controller_name=='application_controller'
|
28
|
-
if ActionController::Routing.respond_to? :controller_paths
|
29
|
-
ActionController::Routing.controller_paths.each do |controller_path|
|
30
|
-
full_controller_path = File.join(File.expand_path(controller_path), "#{controller_name}.rb")
|
31
|
-
return full_controller_path if File.exists?(full_controller_path)
|
32
|
-
end
|
33
|
-
raise "File not found"
|
34
|
-
else
|
35
|
-
File.join(File.expand_path(RAILS_ROOT), 'app', 'controllers', "#{controller_name}.rb").sub('/controllers/controllers/', '/controllers/')
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def controller_text
|
40
|
-
@controller_text ||= IO.read(controller_filename)
|
41
|
-
end
|
42
|
-
|
43
|
-
def action_index
|
44
|
-
(controller_text =~ /def\s+#{@controller.action_name}[\s\(]/)
|
45
|
-
end
|
46
|
-
|
47
|
-
def controller_line_number
|
48
|
-
lines_from_index(controller_text, action_index) || 0
|
49
|
-
end
|
50
|
-
|
51
|
-
def lines_from_index(string, index)
|
52
|
-
return nil if string.blank? || index.blank?
|
53
|
-
|
54
|
-
lines = string.to_a
|
55
|
-
running_length = 0
|
56
|
-
lines.each_with_index do |line, i|
|
57
|
-
running_length += line.length
|
58
|
-
if running_length > index
|
59
|
-
return i
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class ControllerNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@controller = controller
|
8
|
+
end
|
9
|
+
|
10
|
+
def row
|
11
|
+
:edit
|
12
|
+
end
|
13
|
+
|
14
|
+
def link
|
15
|
+
escape(Footnotes::Filter.prefix(controller_filename, controller_line_number + 1, 3))
|
16
|
+
end
|
17
|
+
|
18
|
+
def valid?
|
19
|
+
prefix?
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
# Some controller classes come with the Controller:: module and some don't
|
24
|
+
# (anyone know why? -- Duane)
|
25
|
+
def controller_filename
|
26
|
+
controller_name=@controller.class.to_s.underscore
|
27
|
+
controller_name='application' if controller_name=='application_controller'
|
28
|
+
if ActionController::Routing.respond_to? :controller_paths
|
29
|
+
ActionController::Routing.controller_paths.each do |controller_path|
|
30
|
+
full_controller_path = File.join(File.expand_path(controller_path), "#{controller_name}.rb")
|
31
|
+
return full_controller_path if File.exists?(full_controller_path)
|
32
|
+
end
|
33
|
+
raise "File not found"
|
34
|
+
else
|
35
|
+
File.join(File.expand_path(RAILS_ROOT), 'app', 'controllers', "#{controller_name}.rb").sub('/controllers/controllers/', '/controllers/')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def controller_text
|
40
|
+
@controller_text ||= IO.read(controller_filename)
|
41
|
+
end
|
42
|
+
|
43
|
+
def action_index
|
44
|
+
(controller_text =~ /def\s+#{@controller.action_name}[\s\(]/)
|
45
|
+
end
|
46
|
+
|
47
|
+
def controller_line_number
|
48
|
+
lines_from_index(controller_text, action_index) || 0
|
49
|
+
end
|
50
|
+
|
51
|
+
def lines_from_index(string, index)
|
52
|
+
return nil if string.blank? || index.blank?
|
53
|
+
|
54
|
+
lines = string.to_a
|
55
|
+
running_length = 0
|
56
|
+
lines.each_with_index do |line, i|
|
57
|
+
running_length += line.length
|
58
|
+
if running_length > index
|
59
|
+
return i
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
65
|
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class CookiesNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@cookies = (controller.__send__(:cookies) || {}).symbolize_keys
|
8
|
-
end
|
9
|
-
|
10
|
-
def title
|
11
|
-
"Cookies (#{@cookies.length})"
|
12
|
-
end
|
13
|
-
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class CookiesNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@cookies = (controller.__send__(:cookies) || {}).symbolize_keys
|
8
|
+
end
|
9
|
+
|
10
|
+
def title
|
11
|
+
"Cookies (#{@cookies.length})"
|
12
|
+
end
|
13
|
+
|
14
14
|
def content
|
15
|
-
mount_table_for_hash(@cookies)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
15
|
+
mount_table_for_hash(@cookies)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
19
|
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class EnvNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@env = controller.request.env.dup
|
8
|
-
end
|
9
|
-
|
10
|
-
def content
|
11
|
-
# Replace HTTP_COOKIE for a link
|
12
|
-
@env['HTTP_COOKIE'] = '<a href="#" style="color:#009" onclick="Footnotes.hideAllAndToggle(\'cookies_debug_info\');return false;">See cookies on its tab</a>'
|
13
|
-
|
14
|
-
# Create the env table
|
15
|
-
mount_table(@env.to_a.sort.unshift([:key, :value]))
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class EnvNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@env = controller.request.env.dup
|
8
|
+
end
|
9
|
+
|
10
|
+
def content
|
11
|
+
# Replace HTTP_COOKIE for a link
|
12
|
+
@env['HTTP_COOKIE'] = '<a href="#" style="color:#009" onclick="Footnotes.hideAllAndToggle(\'cookies_debug_info\');return false;">See cookies on its tab</a>'
|
13
|
+
|
14
|
+
# Create the env table
|
15
|
+
mount_table(@env.to_a.sort.unshift([:key, :value]))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,44 +1,44 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class FilesNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@files = scan_text(controller.response.body)
|
8
|
-
parse_files!
|
9
|
-
end
|
10
|
-
|
11
|
-
def row
|
12
|
-
:edit
|
13
|
-
end
|
14
|
-
|
15
|
-
def content
|
16
|
-
if @files.empty?
|
17
|
-
""
|
18
|
-
else
|
19
|
-
"<ul><li>#{@files.join("</li><li>")}</li></ul>"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def valid?
|
24
|
-
prefix?
|
25
|
-
end
|
26
|
-
|
27
|
-
protected
|
28
|
-
def scan_text(text)
|
29
|
-
[]
|
30
|
-
end
|
31
|
-
|
32
|
-
def parse_files!
|
33
|
-
@files.collect! do |filename|
|
34
|
-
if filename =~ %r{^/}
|
35
|
-
full_filename = File.join(File.expand_path(RAILS_ROOT), 'public', filename)
|
36
|
-
%[<a href="#{Footnotes::Filter.prefix(full_filename, 1, 1)}">#{filename}</a>]
|
37
|
-
else
|
38
|
-
%[<a href="#{filename}">#{filename}</a>]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class FilesNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@files = scan_text(controller.response.body)
|
8
|
+
parse_files!
|
9
|
+
end
|
10
|
+
|
11
|
+
def row
|
12
|
+
:edit
|
13
|
+
end
|
14
|
+
|
15
|
+
def content
|
16
|
+
if @files.empty?
|
17
|
+
""
|
18
|
+
else
|
19
|
+
"<ul><li>#{@files.join("</li><li>")}</li></ul>"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def valid?
|
24
|
+
prefix?
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def scan_text(text)
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse_files!
|
33
|
+
@files.collect! do |filename|
|
34
|
+
if filename =~ %r{^/}
|
35
|
+
full_filename = File.join(File.expand_path(RAILS_ROOT), 'public', filename)
|
36
|
+
%[<a href="#{Footnotes::Filter.prefix(full_filename, 1, 1)}">#{filename}</a>]
|
37
|
+
else
|
38
|
+
%[<a href="#{filename}">#{filename}</a>]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
44
|
end
|
@@ -1,53 +1,53 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
-
|
3
|
-
module Footnotes
|
4
|
-
module Notes
|
5
|
-
class FiltersNote < AbstractNote
|
6
|
-
def initialize(controller)
|
7
|
-
@controller = controller
|
8
|
-
@parsed_filters = parse_filters
|
9
|
-
end
|
10
|
-
|
11
|
-
def legend
|
12
|
-
"Filter chain for #{@controller.class.to_s}"
|
13
|
-
end
|
14
|
-
|
15
|
-
def content
|
16
|
-
mount_table(@parsed_filters.unshift([:name, :type, :actions]))
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
# Get controller filter chain
|
21
|
-
#
|
22
|
-
def parse_filters
|
23
|
-
return @controller.class.filter_chain.collect do |filter|
|
24
|
-
[parse_method(filter.method), filter.type.inspect, controller_filtered_actions(filter).inspect]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# This receives a filter, creates a mock controller and check in which
|
29
|
-
# actions the filter is performed
|
30
|
-
#
|
31
|
-
def controller_filtered_actions(filter)
|
32
|
-
mock_controller = Footnotes::Extensions::MockController.new
|
33
|
-
|
34
|
-
return @controller.class.action_methods.select { |action|
|
35
|
-
mock_controller.action_name = action
|
36
|
-
|
37
|
-
#remove conditions (this would call a Proc on the mock_controller)
|
38
|
-
filter.options.merge!(:if => nil, :unless => nil)
|
39
|
-
|
40
|
-
filter.__send__(:should_run_callback?, mock_controller)
|
41
|
-
}.map(&:to_sym)
|
42
|
-
end
|
43
|
-
|
44
|
-
def parse_method(method = '')
|
45
|
-
escape(method.inspect.gsub(RAILS_ROOT, ''))
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
module Extensions
|
51
|
-
class MockController < Struct.new(:action_name); end
|
52
|
-
end
|
1
|
+
require "#{File.dirname(__FILE__)}/abstract_note"
|
2
|
+
|
3
|
+
module Footnotes
|
4
|
+
module Notes
|
5
|
+
class FiltersNote < AbstractNote
|
6
|
+
def initialize(controller)
|
7
|
+
@controller = controller
|
8
|
+
@parsed_filters = parse_filters
|
9
|
+
end
|
10
|
+
|
11
|
+
def legend
|
12
|
+
"Filter chain for #{@controller.class.to_s}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def content
|
16
|
+
mount_table(@parsed_filters.unshift([:name, :type, :actions]))
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
# Get controller filter chain
|
21
|
+
#
|
22
|
+
def parse_filters
|
23
|
+
return @controller.class.filter_chain.collect do |filter|
|
24
|
+
[parse_method(filter.method), filter.type.inspect, controller_filtered_actions(filter).inspect]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# This receives a filter, creates a mock controller and check in which
|
29
|
+
# actions the filter is performed
|
30
|
+
#
|
31
|
+
def controller_filtered_actions(filter)
|
32
|
+
mock_controller = Footnotes::Extensions::MockController.new
|
33
|
+
|
34
|
+
return @controller.class.action_methods.select { |action|
|
35
|
+
mock_controller.action_name = action
|
36
|
+
|
37
|
+
#remove conditions (this would call a Proc on the mock_controller)
|
38
|
+
filter.options.merge!(:if => nil, :unless => nil)
|
39
|
+
|
40
|
+
filter.__send__(:should_run_callback?, mock_controller)
|
41
|
+
}.map(&:to_sym)
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_method(method = '')
|
45
|
+
escape(method.inspect.gsub(RAILS_ROOT, ''))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module Extensions
|
51
|
+
class MockController < Struct.new(:action_name); end
|
52
|
+
end
|
53
53
|
end
|