wested-rack-bug 0.2.2.1

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.
Files changed (78) hide show
  1. data/.gitignore +3 -0
  2. data/History.txt +0 -0
  3. data/MIT-LICENSE.txt +19 -0
  4. data/README.rdoc +29 -0
  5. data/Rakefile +20 -0
  6. data/Thorfile +109 -0
  7. data/VERSION +1 -0
  8. data/lib/rack/bug.rb +43 -0
  9. data/lib/rack/bug/options.rb +89 -0
  10. data/lib/rack/bug/panel.rb +50 -0
  11. data/lib/rack/bug/panel_app.rb +33 -0
  12. data/lib/rack/bug/panels/active_record_panel.rb +45 -0
  13. data/lib/rack/bug/panels/active_record_panel/activerecord_extensions.rb +18 -0
  14. data/lib/rack/bug/panels/cache_panel.rb +50 -0
  15. data/lib/rack/bug/panels/cache_panel/memcache_extension.rb +129 -0
  16. data/lib/rack/bug/panels/cache_panel/panel_app.rb +48 -0
  17. data/lib/rack/bug/panels/cache_panel/stats.rb +97 -0
  18. data/lib/rack/bug/panels/log_panel.rb +39 -0
  19. data/lib/rack/bug/panels/log_panel/rails_extension.rb +11 -0
  20. data/lib/rack/bug/panels/memory_panel.rb +27 -0
  21. data/lib/rack/bug/panels/rails_info_panel.rb +23 -0
  22. data/lib/rack/bug/panels/redis_panel.rb +44 -0
  23. data/lib/rack/bug/panels/redis_panel/redis_extension.rb +14 -0
  24. data/lib/rack/bug/panels/redis_panel/stats.rb +48 -0
  25. data/lib/rack/bug/panels/request_variables_panel.rb +25 -0
  26. data/lib/rack/bug/panels/sql_panel.rb +55 -0
  27. data/lib/rack/bug/panels/sql_panel/panel_app.rb +37 -0
  28. data/lib/rack/bug/panels/sql_panel/query.rb +73 -0
  29. data/lib/rack/bug/panels/sql_panel/sql_extension.rb +11 -0
  30. data/lib/rack/bug/panels/templates_panel.rb +44 -0
  31. data/lib/rack/bug/panels/templates_panel/actionview_extension.rb +12 -0
  32. data/lib/rack/bug/panels/templates_panel/rendering.rb +67 -0
  33. data/lib/rack/bug/panels/templates_panel/trace.rb +34 -0
  34. data/lib/rack/bug/panels/timer_panel.rb +40 -0
  35. data/lib/rack/bug/params_signature.rb +65 -0
  36. data/lib/rack/bug/public/__rack_bug__/bookmarklet.html +10 -0
  37. data/lib/rack/bug/public/__rack_bug__/bookmarklet.js +215 -0
  38. data/lib/rack/bug/public/__rack_bug__/bug.css +211 -0
  39. data/lib/rack/bug/public/__rack_bug__/bug.js +84 -0
  40. data/lib/rack/bug/public/__rack_bug__/jquery-1.3.2.js +4376 -0
  41. data/lib/rack/bug/public/__rack_bug__/jquery.tablesorter.min.js +1 -0
  42. data/lib/rack/bug/public/__rack_bug__/spinner.gif +0 -0
  43. data/lib/rack/bug/render.rb +66 -0
  44. data/lib/rack/bug/toolbar.rb +137 -0
  45. data/lib/rack/bug/views/error.html.erb +16 -0
  46. data/lib/rack/bug/views/panels/active_record.html.erb +17 -0
  47. data/lib/rack/bug/views/panels/cache.html.erb +93 -0
  48. data/lib/rack/bug/views/panels/execute_sql.html.erb +32 -0
  49. data/lib/rack/bug/views/panels/explain_sql.html.erb +32 -0
  50. data/lib/rack/bug/views/panels/log.html.erb +23 -0
  51. data/lib/rack/bug/views/panels/profile_sql.html.erb +32 -0
  52. data/lib/rack/bug/views/panels/rails_info.html.erb +19 -0
  53. data/lib/rack/bug/views/panels/redis.html.erb +32 -0
  54. data/lib/rack/bug/views/panels/request_variables.html.erb +107 -0
  55. data/lib/rack/bug/views/panels/sql.html.erb +43 -0
  56. data/lib/rack/bug/views/panels/templates.html.erb +7 -0
  57. data/lib/rack/bug/views/panels/timer.html.erb +19 -0
  58. data/lib/rack/bug/views/panels/view_cache.html.erb +19 -0
  59. data/lib/rack/bug/views/redirect.html.erb +16 -0
  60. data/lib/rack/bug/views/toolbar.html.erb +42 -0
  61. data/spec/fixtures/config.ru +8 -0
  62. data/spec/fixtures/dummy_panel.rb +2 -0
  63. data/spec/fixtures/sample_app.rb +29 -0
  64. data/spec/rack/bug/panels/active_record_panel_spec.rb +30 -0
  65. data/spec/rack/bug/panels/cache_panel_spec.rb +159 -0
  66. data/spec/rack/bug/panels/log_panel_spec.rb +25 -0
  67. data/spec/rack/bug/panels/memory_panel_spec.rb +21 -0
  68. data/spec/rack/bug/panels/rails_info_panel_spec.rb +25 -0
  69. data/spec/rack/bug/panels/redis_panel_spec.rb +57 -0
  70. data/spec/rack/bug/panels/sql_panel_spec.rb +136 -0
  71. data/spec/rack/bug/panels/templates_panel_spec.rb +71 -0
  72. data/spec/rack/bug/panels/timer_panel_spec.rb +38 -0
  73. data/spec/rack/toolbar_spec.rb +100 -0
  74. data/spec/rcov.opts +1 -0
  75. data/spec/spec.opts +1 -0
  76. data/spec/spec_helper.rb +70 -0
  77. data/wested-rack-bug.gemspec +127 -0
  78. metadata +153 -0
@@ -0,0 +1,3 @@
1
+ coverage
2
+ pkg
3
+ TODO
File without changes
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2009 Bryan Helmkamp
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ Usage:
2
+
3
+ script/plugin install git://github.com/brynary/rack-bug.git
4
+
5
+ # config/environments/development.rb
6
+ config.middleware.use "Rack::Bug"
7
+
8
+ # add bookmarklet to browser
9
+ open http://RAILS_APP/__rack_bug__/bookmarklet.html
10
+
11
+ Notes:
12
+
13
+ To use rack-bug with hoptoad, you need to stub hoptoad from trying to serialize the environment variables
14
+ that rack-bug uses like so:
15
+
16
+ HoptoadNotifier.configure do |config|
17
+ config.environment_filters << 'rack-bug.*'
18
+ end
19
+
20
+
21
+ Thanks to:
22
+
23
+ Django debug toolbar
24
+ Rails footnotes
25
+ Rack's ShowException middleware
26
+ Oink
27
+ Rack::Cache
28
+
29
+
@@ -0,0 +1,20 @@
1
+ require "rubygems"
2
+ require "spec/rake/spectask"
3
+
4
+ Spec::Rake::SpecTask.new do |t|
5
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
6
+ end
7
+
8
+ desc "Run all specs in spec directory with RCov"
9
+ Spec::Rake::SpecTask.new(:rcov) do |t|
10
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
11
+ t.rcov = true
12
+ t.rcov_opts = lambda do
13
+ IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
14
+ end
15
+ end
16
+
17
+ task :spec => :check_dependencies
18
+
19
+ desc "Run the specs"
20
+ task :default => :spec
@@ -0,0 +1,109 @@
1
+ module GemHelpers
2
+
3
+ def generate_gemspec
4
+ $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), "lib")))
5
+ require "rack/bug"
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "rack-bug"
9
+ s.version = Rack::Bug::VERSION
10
+ s.author = "Bryan Helmkamp"
11
+ s.email = "bryan@brynary.com"
12
+ s.homepage = "http://github.com/brynary/rack-bug"
13
+ s.summary = "Debugging toolbar for Rack applications implemented as middleware"
14
+ # s.description = "TODO"
15
+ s.rubyforge_project = "rack-bug"
16
+
17
+ require "git"
18
+ repo = Git.open(".")
19
+
20
+ s.files = normalize_files(repo.ls_files.keys - repo.lib.ignored_files)
21
+ s.test_files = normalize_files(Dir['spec/**/*.rb'] - repo.lib.ignored_files)
22
+
23
+ s.has_rdoc = true
24
+ s.extra_rdoc_files = %w[README.rdoc MIT-LICENSE.txt]
25
+
26
+ s.add_dependency "rack", ">= 1.0"
27
+ end
28
+ end
29
+
30
+ def normalize_files(array)
31
+ # only keep files, no directories, and sort
32
+ array.select do |path|
33
+ File.file?(path)
34
+ end.sort
35
+ end
36
+
37
+ # Adds extra space when outputting an array. This helps create better version
38
+ # control diffs, because otherwise it is all on the same line.
39
+ def prettyify_array(gemspec_ruby, array_name)
40
+ gemspec_ruby.gsub(/s\.#{array_name.to_s} = \[.+?\]/) do |match|
41
+ leadin, files = match[0..-2].split("[")
42
+ leadin + "[\n #{files.split(",").join(",\n ")}\n ]"
43
+ end
44
+ end
45
+
46
+ def read_gemspec
47
+ @read_gemspec ||= eval(File.read("rack-bug.gemspec"))
48
+ end
49
+
50
+ def sh(command)
51
+ puts command
52
+ system command
53
+ end
54
+ end
55
+
56
+ class Default < Thor
57
+ include GemHelpers
58
+
59
+ desc "gemspec", "Regenerate rack-bug.gemspec"
60
+ def gemspec
61
+ File.open("rack-bug.gemspec", "w") do |file|
62
+ gemspec_ruby = generate_gemspec.to_ruby
63
+ gemspec_ruby = prettyify_array(gemspec_ruby, :files)
64
+ gemspec_ruby = prettyify_array(gemspec_ruby, :test_files)
65
+ gemspec_ruby = prettyify_array(gemspec_ruby, :extra_rdoc_files)
66
+
67
+ file.write gemspec_ruby
68
+ end
69
+
70
+ puts "Wrote gemspec to rack-bug.gemspec"
71
+ read_gemspec.validate
72
+ end
73
+
74
+ desc "build", "Build a rack-bug gem"
75
+ def build
76
+ sh "gem build rack-bug.gemspec"
77
+ FileUtils.mkdir_p "pkg"
78
+ FileUtils.mv read_gemspec.file_name, "pkg"
79
+ end
80
+
81
+ desc "install", "Install the latest built gem"
82
+ def install
83
+ sh "gem install --local pkg/#{read_gemspec.file_name}"
84
+ end
85
+
86
+ desc "release", "Release the current branch to GitHub and Gemcutter"
87
+ def release
88
+ gemspec
89
+ build
90
+ Release.new.tag
91
+ Release.new.gem
92
+ end
93
+ end
94
+
95
+ class Release < Thor
96
+ include GemHelpers
97
+
98
+ desc "tag", "Tag the gem on the origin server"
99
+ def tag
100
+ release_tag = "v#{read_gemspec.version}"
101
+ sh "git tag -a #{release_tag} -m 'Tagging #{release_tag}'"
102
+ sh "git push origin #{release_tag}"
103
+ end
104
+
105
+ desc "gem", "Push the gem to Gemcutter"
106
+ def gem
107
+ sh "gem push pkg/#{read_gemspec.file_name}"
108
+ end
109
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.1
@@ -0,0 +1,43 @@
1
+ require "rack"
2
+
3
+ module Rack::Bug
4
+ autoload :Options, "rack/bug/options"
5
+ autoload :Panel, "rack/bug/panel"
6
+ autoload :PanelApp, "rack/bug/panel_app"
7
+ autoload :ParamsSignature, "rack/bug/params_signature"
8
+ autoload :Render, "rack/bug/render"
9
+ autoload :Toolbar, "rack/bug/toolbar"
10
+
11
+ # Panels
12
+ autoload :ActiveRecordPanel, "rack/bug/panels/active_record_panel"
13
+ autoload :CachePanel, "rack/bug/panels/cache_panel"
14
+ autoload :LogPanel, "rack/bug/panels/log_panel"
15
+ autoload :MemoryPanel, "rack/bug/panels/memory_panel"
16
+ autoload :RailsInfoPanel, "rack/bug/panels/rails_info_panel"
17
+ autoload :RedisPanel, "rack/bug/panels/redis_panel"
18
+ autoload :RequestVariablesPanel, "rack/bug/panels/request_variables_panel"
19
+ autoload :SQLPanel, "rack/bug/panels/sql_panel"
20
+ autoload :TemplatesPanel, "rack/bug/panels/templates_panel"
21
+ autoload :TimerPanel, "rack/bug/panels/timer_panel"
22
+
23
+ VERSION = "0.2.2.pre"
24
+
25
+ class SecurityError < StandardError
26
+ end
27
+
28
+ def self.enable
29
+ Thread.current["rack-bug.enabled"] = true
30
+ end
31
+
32
+ def self.disable
33
+ Thread.current["rack-bug.enabled"] = false
34
+ end
35
+
36
+ def self.enabled?
37
+ Thread.current["rack-bug.enabled"] == true
38
+ end
39
+
40
+ def self.new(*args, &block)
41
+ Toolbar.new(*args, &block)
42
+ end
43
+ end
@@ -0,0 +1,89 @@
1
+ module Rack::Bug
2
+
3
+ module Options
4
+ class << self
5
+ private
6
+ def option_accessor(key)
7
+ define_method(key) { || read_option(key) }
8
+ define_method("#{key}=") { |value| write_option(key, value) }
9
+ define_method("#{key}?") { || !! read_option(key) }
10
+ end
11
+ end
12
+
13
+ option_accessor :secret_key
14
+ option_accessor :ip_masks
15
+ option_accessor :password
16
+ option_accessor :panel_classes
17
+ option_accessor :intercept_redirects
18
+
19
+ # The underlying options Hash. During initialization (or outside of a
20
+ # request), this is a default values Hash. During a request, this is the
21
+ # Rack environment Hash. The default values Hash is merged in underneath
22
+ # the Rack environment before each request is processed.
23
+ def options
24
+ @env || @default_options
25
+ end
26
+
27
+ # Set multiple options.
28
+ def options=(hash={})
29
+ hash.each { |key,value| write_option(key, value) }
30
+ end
31
+
32
+ # Set an option. When +option+ is a Symbol, it is set in the Rack
33
+ # Environment as "rack-cache.option". When +option+ is a String, it
34
+ # exactly as specified. The +option+ argument may also be a Hash in
35
+ # which case each key/value pair is merged into the environment as if
36
+ # the #set method were called on each.
37
+ def set(option, value=self, &block)
38
+ if block_given?
39
+ write_option option, block
40
+ elsif value == self
41
+ self.options = option.to_hash
42
+ else
43
+ write_option option, value
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def read_option(key)
50
+ options[option_name(key)]
51
+ end
52
+
53
+ def write_option(key, value)
54
+ options[option_name(key)] = value
55
+ end
56
+
57
+ def option_name(key)
58
+ case key
59
+ when Symbol ; "rack-bug.#{key}"
60
+ when String ; key
61
+ else raise ArgumentError
62
+ end
63
+ end
64
+
65
+ def initialize_options(options={})
66
+ @default_options = {
67
+ 'rack-bug.ip_masks' => [IPAddr.new("127.0.0.1")],
68
+ 'rack-bug.password' => nil,
69
+ 'rack-bug.verbose' => nil,
70
+ 'rack-bug.secret_key' => nil,
71
+ 'rack-bug.intercept_redirects' => false,
72
+ 'rack-bug.panels' => [],
73
+ 'rack-bug.panel_classes' => [
74
+ RailsInfoPanel,
75
+ TimerPanel,
76
+ RequestVariablesPanel,
77
+ SQLPanel,
78
+ ActiveRecordPanel,
79
+ CachePanel,
80
+ TemplatesPanel,
81
+ LogPanel,
82
+ MemoryPanel
83
+ ]
84
+ }
85
+ self.options = options
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,50 @@
1
+ require "erb"
2
+
3
+ module Rack
4
+ module Bug
5
+
6
+ # Panels are also Rack middleware
7
+ class Panel
8
+ include Render
9
+ include ERB::Util
10
+
11
+ attr_reader :request
12
+
13
+ def initialize(app)
14
+ if panel_app
15
+ @app = Rack::Cascade.new([panel_app, app])
16
+ else
17
+ @app = app
18
+ end
19
+ end
20
+
21
+ def call(env)
22
+ before(env)
23
+ status, headers, body = @app.call(env)
24
+ @request = Request.new(env)
25
+ after(env, status, headers, body)
26
+ env["rack-bug.panels"] << self
27
+ return [status, headers, body]
28
+ end
29
+
30
+ def panel_app
31
+ nil
32
+ end
33
+
34
+ def has_content?
35
+ true
36
+ end
37
+
38
+ def before(env)
39
+ end
40
+
41
+ def after(env, status, headers, body)
42
+ end
43
+
44
+ def render(template)
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,33 @@
1
+ module Rack
2
+ module Bug
3
+
4
+ class PanelApp
5
+ include Rack::Bug::Render
6
+
7
+ attr_reader :request
8
+
9
+ def call(env)
10
+ @request = Rack::Request.new(env)
11
+ dispatch
12
+ end
13
+
14
+ def render_template(*args)
15
+ Rack::Response.new([super]).to_a
16
+ end
17
+
18
+ def params
19
+ @request.GET
20
+ end
21
+
22
+ def not_found
23
+ [404, {}, []]
24
+ end
25
+
26
+ def validate_params
27
+ ParamsSignature.new(request).validate!
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,45 @@
1
+ require "rack/bug/panels/active_record_panel/activerecord_extensions"
2
+
3
+ module Rack
4
+ module Bug
5
+
6
+ class ActiveRecordPanel < Panel
7
+
8
+ def self.record(class_name)
9
+ return unless Rack::Bug.enabled?
10
+ records[class_name] += 1
11
+ end
12
+
13
+ def self.reset
14
+ Thread.current["rack.bug.active_records"] = Hash.new { 0 }
15
+ end
16
+
17
+ def self.records
18
+ Thread.current["rack.bug.active_records"] ||= Hash.new { 0 }
19
+ end
20
+
21
+ def self.total
22
+ records.inject(0) do |memo, (key, value)|
23
+ memo + value
24
+ end
25
+ end
26
+
27
+ def name
28
+ "active_record"
29
+ end
30
+
31
+ def heading
32
+ "#{self.class.total} AR Objects"
33
+ end
34
+
35
+ def content
36
+ records = self.class.records.to_a.sort_by { |key, value| value }.reverse
37
+ result = render_template "panels/active_record", :records => records
38
+ self.class.reset
39
+ result
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end