mole 1.0.12 → 1.0.15
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.
- metadata +24 -146
- data/History.txt +0 -17
- data/Manifest.txt +0 -132
- data/README.txt +0 -216
- data/Rakefile +0 -46
- data/config/database.yml +0 -21
- data/config/test_database.yml +0 -69
- data/lib/mole.rb +0 -260
- data/lib/mole/db/migrate.rb +0 -90
- data/lib/mole/e_mole.rb +0 -75
- data/lib/mole/logger.rb +0 -134
- data/lib/mole/models/mole_feature.rb +0 -58
- data/lib/mole/models/mole_log.rb +0 -31
- data/lib/mole/module.rb +0 -292
- data/lib/mole/moler.rb +0 -71
- data/lib/mole/utils/frameworks.rb +0 -53
- data/lib/mole/version.rb +0 -15
- data/samples/merbapp/README +0 -14
- data/samples/merbapp/Rakefile +0 -124
- data/samples/merbapp/app/controllers/application.rb +0 -3
- data/samples/merbapp/app/controllers/exceptions.rb +0 -13
- data/samples/merbapp/app/controllers/moled.rb +0 -25
- data/samples/merbapp/app/helpers/global_helper.rb +0 -5
- data/samples/merbapp/app/mailers/views/layout/application.html.erb +0 -1
- data/samples/merbapp/app/mailers/views/layout/application.text.erb +0 -1
- data/samples/merbapp/app/parts/views/layout/application.html.erb +0 -1
- data/samples/merbapp/app/views/exceptions/internal_server_error.html.erb +0 -216
- data/samples/merbapp/app/views/exceptions/not_acceptable.html.erb +0 -38
- data/samples/merbapp/app/views/exceptions/not_found.html.erb +0 -40
- data/samples/merbapp/app/views/layout/application.html.erb +0 -11
- data/samples/merbapp/app/views/moled/index.html.erb +0 -5
- data/samples/merbapp/app/views/moled/result.html.erb +0 -5
- data/samples/merbapp/config/boot.rb +0 -11
- data/samples/merbapp/config/dependencies.rb +0 -41
- data/samples/merbapp/config/environments/development.rb +0 -1
- data/samples/merbapp/config/environments/production.rb +0 -1
- data/samples/merbapp/config/environments/test.rb +0 -1
- data/samples/merbapp/config/merb.yml +0 -82
- data/samples/merbapp/config/merb_init.rb +0 -26
- data/samples/merbapp/config/mole_config.rb +0 -33
- data/samples/merbapp/config/router.rb +0 -38
- data/samples/merbapp/config/upload.conf +0 -0
- data/samples/merbapp/public/images/merb.jpg +0 -0
- data/samples/merbapp/public/merb.fcgi +0 -6
- data/samples/merbapp/public/stylesheets/master.css +0 -119
- data/samples/merbapp/script/destroy +0 -32
- data/samples/merbapp/script/generate +0 -32
- data/samples/merbapp/script/stop_merb +0 -13
- data/samples/merbapp/spec/spec_helper.rb +0 -15
- data/samples/merbapp/test/test_helper.rb +0 -14
- data/samples/railsapp/README +0 -14
- data/samples/railsapp/Rakefile +0 -10
- data/samples/railsapp/app/controllers/application.rb +0 -13
- data/samples/railsapp/app/controllers/moled_controller.rb +0 -23
- data/samples/railsapp/app/helpers/application_helper.rb +0 -3
- data/samples/railsapp/app/views/moled/index.html.erb +0 -5
- data/samples/railsapp/app/views/moled/result.html.erb +0 -5
- data/samples/railsapp/config/boot.rb +0 -109
- data/samples/railsapp/config/database.yml +0 -13
- data/samples/railsapp/config/environment.rb +0 -59
- data/samples/railsapp/config/environments/development.rb +0 -18
- data/samples/railsapp/config/environments/production.rb +0 -20
- data/samples/railsapp/config/environments/test.rb +0 -22
- data/samples/railsapp/config/initializers/inflections.rb +0 -10
- data/samples/railsapp/config/initializers/mime_types.rb +0 -5
- data/samples/railsapp/config/initializers/mole.rb +0 -10
- data/samples/railsapp/config/moles/mole_config.rb +0 -44
- data/samples/railsapp/config/routes.rb +0 -35
- data/samples/railsapp/doc/README_FOR_APP +0 -2
- data/samples/railsapp/public/.htaccess +0 -40
- data/samples/railsapp/public/404.html +0 -30
- data/samples/railsapp/public/422.html +0 -30
- data/samples/railsapp/public/500.html +0 -30
- data/samples/railsapp/public/dispatch.cgi +0 -10
- data/samples/railsapp/public/dispatch.fcgi +0 -24
- data/samples/railsapp/public/dispatch.rb +0 -10
- data/samples/railsapp/public/favicon.ico +0 -0
- data/samples/railsapp/public/images/rails.png +0 -0
- data/samples/railsapp/public/javascripts/application.js +0 -2
- data/samples/railsapp/public/javascripts/controls.js +0 -963
- data/samples/railsapp/public/javascripts/dragdrop.js +0 -972
- data/samples/railsapp/public/javascripts/effects.js +0 -1120
- data/samples/railsapp/public/javascripts/prototype.js +0 -4225
- data/samples/railsapp/public/robots.txt +0 -5
- data/samples/railsapp/script/about +0 -3
- data/samples/railsapp/script/console +0 -3
- data/samples/railsapp/script/destroy +0 -3
- data/samples/railsapp/script/generate +0 -3
- data/samples/railsapp/script/performance/benchmarker +0 -3
- data/samples/railsapp/script/performance/profiler +0 -3
- data/samples/railsapp/script/performance/request +0 -3
- data/samples/railsapp/script/plugin +0 -3
- data/samples/railsapp/script/process/inspector +0 -3
- data/samples/railsapp/script/process/reaper +0 -3
- data/samples/railsapp/script/process/spawner +0 -3
- data/samples/railsapp/script/runner +0 -3
- data/samples/railsapp/script/server +0 -3
- data/samples/railsapp/test/test_helper.rb +0 -38
- data/samples/rubyapp/README +0 -22
- data/samples/rubyapp/bin/ruby_app +0 -35
- data/samples/rubyapp/config/mole_conf.rb +0 -31
- data/samples/rubyapp/lib/fred.rb +0 -22
- data/spec/config/auto_mole_config.rb +0 -26
- data/spec/config/mole_config.rb +0 -0
- data/spec/config/moles/fred_config.rb +0 -0
- data/spec/data/blee.rb +0 -64
- data/spec/db/migrate_spec.rb +0 -19
- data/spec/emole_spec.rb +0 -43
- data/spec/logger_spec.rb +0 -56
- data/spec/models/mole_feature_spec.rb +0 -48
- data/spec/models/mole_log_spec.rb +0 -62
- data/spec/module_spec.rb +0 -229
- data/spec/mole_spec.rb +0 -135
- data/spec/moler_spec.rb +0 -77
- data/spec/spec_helper.rb +0 -76
- data/spec/utils/framework_spec.rb +0 -99
- data/tasks/ann.rake +0 -76
- data/tasks/annotations.rake +0 -22
- data/tasks/doc.rake +0 -48
- data/tasks/gem.rake +0 -110
- data/tasks/manifest.rake +0 -49
- data/tasks/mole.rake +0 -115
- data/tasks/post_load.rake +0 -26
- data/tasks/rubyforge.rake +0 -57
- data/tasks/setup.rb +0 -227
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -44
- data/tasks/test.rake +0 -38
- data/templates/mole/e_mole/exception_alerts.rhtml +0 -14
- data/templates/mole/e_mole/feature_alerts.rhtml +0 -11
- data/templates/mole/e_mole/perf_alerts.rhtml +0 -12
data/lib/mole/moler.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
# -----------------------------------------------------------------------------
|
2
|
-
# Manages different ways to log the Mole interceptors. Currently there are two
|
3
|
-
# allowed modes ie persistent and transient
|
4
|
-
# Persistent mode will log the interception to the database for easy viewing
|
5
|
-
# and reporting.
|
6
|
-
# Transient mode will log the interaction to the mole logger.
|
7
|
-
# -----------------------------------------------------------------------------
|
8
|
-
module Mole
|
9
|
-
class Moler
|
10
|
-
class << self
|
11
|
-
# log an unchecked exception. Moler will look at the MOle
|
12
|
-
# configuration to see if this event should be persisted to the db or
|
13
|
-
# sent out to the logger.
|
14
|
-
def check_it( context, user_id, args )
|
15
|
-
return unless ::Mole.moleable?
|
16
|
-
# If exception is given record the first couple of frames
|
17
|
-
if args[:boom]
|
18
|
-
args[:trace] = dump_stack( args[:boom] )
|
19
|
-
args[:boom] = truncate( args[:boom].to_s )
|
20
|
-
end
|
21
|
-
if ::Mole.persistent?
|
22
|
-
MoleLog.log_it( context, MoleFeature::find_exception_feature( ::Mole.application ), user_id, args )
|
23
|
-
else
|
24
|
-
::Mole.logger.log_it( context, "Exception", user_id, args )
|
25
|
-
end
|
26
|
-
# Send out email notification if requested
|
27
|
-
Mole::EMole.deliver_exception_alerts( context, user_id, args ) if args[:email] and args[:email] == true
|
28
|
-
end
|
29
|
-
|
30
|
-
# log performance occurence.
|
31
|
-
def perf_it( context, user_id, args )
|
32
|
-
return unless ::Mole.moleable?
|
33
|
-
if ::Mole.persistent?
|
34
|
-
MoleLog.log_it( context, MoleFeature::find_performance_feature( ::Mole.application ), user_id, args )
|
35
|
-
else
|
36
|
-
::Mole.logger.log_it( context, "Performance", user_id, args )
|
37
|
-
end
|
38
|
-
# Send out email notification if requested
|
39
|
-
Mole::EMole.deliver_perf_alerts( context, user_id, args ) if args[:email] and args[:email] == true
|
40
|
-
end
|
41
|
-
|
42
|
-
# log a mole feature occurence.
|
43
|
-
def mole_it(context, feature, user_id, args)
|
44
|
-
return unless ::Mole.moleable?
|
45
|
-
if ::Mole.persistent?
|
46
|
-
MoleLog.log_it( context, MoleFeature::find_or_create_feature( feature, ::Mole.application, context.class.name ), user_id, args )
|
47
|
-
else
|
48
|
-
::Mole.logger.log_it( context, feature, user_id, args )
|
49
|
-
end
|
50
|
-
# Send out email notification if requested
|
51
|
-
if args[:email] and args[:email] == true
|
52
|
-
args[:feature] = feature
|
53
|
-
Mole::EMole.deliver_feature_alerts( context, user_id, args )
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# Truncate
|
58
|
-
def truncate(text, length = 200, truncate_string = "...")
|
59
|
-
return "" if text.nil?
|
60
|
-
l = length - truncate_string.chars.length
|
61
|
-
text.chars.length > length ? (text.chars[0...l] + truncate_string).to_s : text
|
62
|
-
end
|
63
|
-
|
64
|
-
# dumps partial stack
|
65
|
-
def dump_stack( boom )
|
66
|
-
return truncate( boom.backtrace[0] ) if boom.backtrace.size == 1
|
67
|
-
buff = boom.backtrace[0...3].join( "-" )
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# -----------------------------------------------------------------------------
|
2
|
-
# Convenience for extracting actions out controller classes
|
3
|
-
# Currently supported frameworks : Rails and Merb, more in the future...
|
4
|
-
# -----------------------------------------------------------------------------
|
5
|
-
module Mole
|
6
|
-
module Utils
|
7
|
-
class Frameworks
|
8
|
-
class << self
|
9
|
-
|
10
|
-
# compiles request parameters in a flat list.
|
11
|
-
def flatten_params( context )
|
12
|
-
return nil unless context.respond_to? :params
|
13
|
-
context.params.keys.sort{ |a,b| a.to_s <=> b.to_s }.collect{ |k| "#{k} => #{context.params[k]}" }.join( ", ")
|
14
|
-
end
|
15
|
-
|
16
|
-
# find moleable features for a given class
|
17
|
-
def features_for( controller_class )
|
18
|
-
# Try rails first
|
19
|
-
return rails_actions( controller_class ) rescue nil
|
20
|
-
# Try merb
|
21
|
-
return merb_actions( controller_class ) rescue nil
|
22
|
-
# Otherwise returns instance methods
|
23
|
-
moleable_features( controller_class )
|
24
|
-
end
|
25
|
-
|
26
|
-
# Find moleable features on a given class ie non moled instance methods
|
27
|
-
def moleable_features( clazz )
|
28
|
-
features = clazz.public_instance_methods( false )
|
29
|
-
features.select { |f| f unless f.index( /_(with|without)_mole/) }
|
30
|
-
end
|
31
|
-
|
32
|
-
# retrieves the collection of callable actions from a Merb controller.
|
33
|
-
def merb_actions( controller_class )
|
34
|
-
begin
|
35
|
-
actions = []
|
36
|
-
controller_class.send( :callable_actions ).keys.each { |action| actions << action }
|
37
|
-
rescue
|
38
|
-
raise "Invalid Merb Controller class `#{controller_class}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# retrieves the collection of callable actions from a Rails controller
|
43
|
-
def rails_actions( controller_class )
|
44
|
-
begin
|
45
|
-
controller_class.send( :action_methods )
|
46
|
-
rescue
|
47
|
-
raise "Invalid Rails Controller class `#{controller_class}"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/lib/mole/version.rb
DELETED
data/samples/merbapp/README
DELETED
data/samples/merbapp/Rakefile
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
Gem.clear_paths
|
3
|
-
Gem.path.unshift(File.join(File.dirname(__FILE__), "gems"))
|
4
|
-
|
5
|
-
require 'rake'
|
6
|
-
require 'rake/rdoctask'
|
7
|
-
require 'rake/testtask'
|
8
|
-
require 'spec/rake/spectask'
|
9
|
-
require 'fileutils'
|
10
|
-
|
11
|
-
require File.dirname(__FILE__)+'/config/boot.rb'
|
12
|
-
require Merb::framework_root+'/tasks'
|
13
|
-
include FileUtils
|
14
|
-
|
15
|
-
# Set these before any dependencies load
|
16
|
-
# otherwise the ORM may connect to the wrong env
|
17
|
-
Merb.root = File.dirname(__FILE__)
|
18
|
-
Merb.environment = ENV['MERB_ENV'] if ENV['MERB_ENV']
|
19
|
-
|
20
|
-
# Get Merb plugins and dependencies
|
21
|
-
require File.dirname(__FILE__)+'/config/dependencies.rb'
|
22
|
-
Merb::Plugins.rakefiles.each {|r| require r }
|
23
|
-
|
24
|
-
#desc "Packages up Merb."
|
25
|
-
#task :default => [:package]
|
26
|
-
|
27
|
-
desc "load merb_init.rb"
|
28
|
-
task :merb_init do
|
29
|
-
# deprecated - here for BC
|
30
|
-
Rake::Task['merb_env'].invoke
|
31
|
-
end
|
32
|
-
|
33
|
-
task :uninstall => [:clean] do
|
34
|
-
sh %{sudo gem uninstall #{NAME}}
|
35
|
-
end
|
36
|
-
|
37
|
-
desc 'Run unit tests'
|
38
|
-
Rake::TestTask.new('test_unit') do |t|
|
39
|
-
t.libs << 'test'
|
40
|
-
t.pattern = 'test/unit/*_test.rb'
|
41
|
-
t.verbose = true
|
42
|
-
end
|
43
|
-
|
44
|
-
desc 'Run functional tests'
|
45
|
-
Rake::TestTask.new('test_functional') do |t|
|
46
|
-
t.libs << 'test'
|
47
|
-
t.pattern = 'test/functional/*_test.rb'
|
48
|
-
t.verbose = true
|
49
|
-
end
|
50
|
-
|
51
|
-
desc 'Run all tests'
|
52
|
-
Rake::TestTask.new('test') do |t|
|
53
|
-
t.libs << 'test'
|
54
|
-
t.pattern = 'test/**/*_test.rb'
|
55
|
-
t.verbose = true
|
56
|
-
end
|
57
|
-
|
58
|
-
desc "Run all specs"
|
59
|
-
Spec::Rake::SpecTask.new('specs') do |t|
|
60
|
-
t.spec_opts = ["--format", "specdoc", "--colour"]
|
61
|
-
t.spec_files = Dir['spec/**/*_spec.rb'].sort
|
62
|
-
end
|
63
|
-
|
64
|
-
desc "Run all model specs"
|
65
|
-
Spec::Rake::SpecTask.new('model_specs') do |t|
|
66
|
-
t.spec_opts = ["--format", "specdoc", "--colour"]
|
67
|
-
t.spec_files = Dir['spec/models/**/*_spec.rb'].sort
|
68
|
-
end
|
69
|
-
|
70
|
-
desc "Run all controller specs"
|
71
|
-
Spec::Rake::SpecTask.new('controller_specs') do |t|
|
72
|
-
t.spec_opts = ["--format", "specdoc", "--colour"]
|
73
|
-
t.spec_files = Dir['spec/controllers/**/*_spec.rb'].sort
|
74
|
-
end
|
75
|
-
|
76
|
-
desc "Run a specific spec with TASK=xxxx"
|
77
|
-
Spec::Rake::SpecTask.new('spec') do |t|
|
78
|
-
t.spec_opts = ["--format", "specdoc", "--colour"]
|
79
|
-
t.libs = ['lib', 'server/lib' ]
|
80
|
-
t.spec_files = ["spec/merb/#{ENV['TASK']}_spec.rb"]
|
81
|
-
end
|
82
|
-
|
83
|
-
desc "Run all specs output html"
|
84
|
-
Spec::Rake::SpecTask.new('specs_html') do |t|
|
85
|
-
t.spec_opts = ["--format", "html"]
|
86
|
-
t.libs = ['lib', 'server/lib' ]
|
87
|
-
t.spec_files = Dir['spec/**/*_spec.rb'].sort
|
88
|
-
end
|
89
|
-
|
90
|
-
desc "RCov"
|
91
|
-
Spec::Rake::SpecTask.new('rcov') do |t|
|
92
|
-
t.spec_opts = ["--format", "specdoc", "--colour"]
|
93
|
-
t.spec_files = Dir['spec/**/*_spec.rb'].sort
|
94
|
-
t.libs = ['lib', 'server/lib' ]
|
95
|
-
t.rcov = true
|
96
|
-
end
|
97
|
-
|
98
|
-
desc 'Run all tests, specs and finish with rcov'
|
99
|
-
task :aok do
|
100
|
-
sh %{rake rcov}
|
101
|
-
sh %{rake spec}
|
102
|
-
end
|
103
|
-
|
104
|
-
unless Gem.cache.search("haml").empty?
|
105
|
-
namespace :haml do
|
106
|
-
desc "Compiles all sass files into CSS"
|
107
|
-
task :compile_sass do
|
108
|
-
gem 'haml'
|
109
|
-
require 'sass'
|
110
|
-
puts "*** Updating stylesheets"
|
111
|
-
Sass::Plugin.update_stylesheets
|
112
|
-
puts "*** Done"
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
##############################################################################
|
118
|
-
# SVN
|
119
|
-
##############################################################################
|
120
|
-
|
121
|
-
desc "Add new files to subversion"
|
122
|
-
task :svn_add do
|
123
|
-
system "svn status | grep '^\?' | sed -e 's/? *//' | sed -e 's/ /\ /g' | xargs svn add"
|
124
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# A plain old application controller that has been MOled...
|
2
|
-
class Moled < Application
|
3
|
-
|
4
|
-
def index
|
5
|
-
render
|
6
|
-
end
|
7
|
-
|
8
|
-
# A plain ol' feature
|
9
|
-
def my_action( id )
|
10
|
-
session[:user] = "Fernand"
|
11
|
-
@state = "Fred"
|
12
|
-
render :template => "moled/result"
|
13
|
-
end
|
14
|
-
|
15
|
-
# A slow action
|
16
|
-
def my_slow_action
|
17
|
-
sleep( 2 )
|
18
|
-
render :template => "moled/result"
|
19
|
-
end
|
20
|
-
|
21
|
-
# Hosed action
|
22
|
-
def my_hosed_action
|
23
|
-
raise "This will hose your app"
|
24
|
-
end
|
25
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= catch_content :layout %>
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= catch_content :layout %>
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= catch_content :layout %>
|
@@ -1,216 +0,0 @@
|
|
1
|
-
<html>
|
2
|
-
<head>
|
3
|
-
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
4
|
-
<title><%= @exception.name.humanize %></title>
|
5
|
-
<style type="text/css" media="screen">
|
6
|
-
body {
|
7
|
-
font-family:arial;
|
8
|
-
font-size:11px;
|
9
|
-
}
|
10
|
-
h1 {
|
11
|
-
font-size:48px;
|
12
|
-
letter-spacing:-4px;
|
13
|
-
margin:0;
|
14
|
-
line-height:36px;
|
15
|
-
color:#333;
|
16
|
-
}
|
17
|
-
h1 sup {
|
18
|
-
font-size: 0.5em;
|
19
|
-
}
|
20
|
-
h1 sup.error_500, h1 sup.error_400 {
|
21
|
-
color:#990E05;
|
22
|
-
}
|
23
|
-
h1 sup.error_100, h1 sup.error_200 {
|
24
|
-
color:#00BF10;
|
25
|
-
}
|
26
|
-
h1 sup.error_300 {
|
27
|
-
/* pretty sure you cant 'see' status 300
|
28
|
-
errors but if you could I think they
|
29
|
-
would be blue */
|
30
|
-
color:#1B2099;
|
31
|
-
}
|
32
|
-
h2 {
|
33
|
-
font-size:36px;
|
34
|
-
letter-spacing:-3px;
|
35
|
-
margin:0;
|
36
|
-
line-height:28px;
|
37
|
-
color:#444;
|
38
|
-
}
|
39
|
-
a, a:visited {
|
40
|
-
color:#00BF10;
|
41
|
-
}
|
42
|
-
.internalError {
|
43
|
-
width:800px;
|
44
|
-
margin:50px auto;
|
45
|
-
}
|
46
|
-
.header {
|
47
|
-
border-bottom:10px solid #333;
|
48
|
-
margin-bottom:1px;
|
49
|
-
background-image: url("data:image/gif;base64,R0lGODlhAwADAIAAAP///8zMzCH5BAAAAAAALAAAAAADAAMAAAIEBHIJBQA7");
|
50
|
-
padding:20px;
|
51
|
-
}
|
52
|
-
table.trace {
|
53
|
-
width:100%;
|
54
|
-
font-family:courier, monospace;
|
55
|
-
letter-spacing:-1px;
|
56
|
-
border-collapse: collapse;
|
57
|
-
border-spacing:0;
|
58
|
-
}
|
59
|
-
table.trace tr td{
|
60
|
-
padding:0;
|
61
|
-
height:26px;
|
62
|
-
font-size:13px;
|
63
|
-
vertical-align:middle;
|
64
|
-
}
|
65
|
-
table.trace tr.file{
|
66
|
-
border-top:2px solid #fff;
|
67
|
-
background-color:#F3F3F3;
|
68
|
-
}
|
69
|
-
table.trace tr.source {
|
70
|
-
background-color:#F8F8F8;
|
71
|
-
display:none;
|
72
|
-
}
|
73
|
-
table.trace .open tr.source {
|
74
|
-
display:table-row;
|
75
|
-
}
|
76
|
-
table.trace tr.file td.expand {
|
77
|
-
width:23px;
|
78
|
-
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAIAAABvSEP3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdVJREFUeNqMVL+TwUAYxaRIOlEhlZHGDAUzzOQ61+AqXMV1lJSU7q/QRqm8KFUcJTNn5qJkaPyoKKVz7y4mF8na5Kt29tt9+/Z97/u81+vVQ4r9frdarS6Xi7ETDIZisRjxMGPfmk4niNPpZE+xLAugbPaZ53nzvtfMBe/3+/3dbuehBrAKhZdUKkVAWa9Xsiybv0CPZDJZLr/qa5/BwgwRjYqOKIvFYjQa/aNommZh0Ww2K5UqzwfoQOPxaLPZ3FAmk0+7lplMpt1u53J5OpBOR0eZEE9wHJfP5zud93g88QhluwWbjW+5VOmKBgKBer3eaDTDYeGBQF8+x7rqIYoiPgixWJazpA6HA+MSxRArkUgMh0M409g8Ho8+9wYxxCqVSq1W26EDHGM2m4HOHQrEc38f/Yn7cLmlIRhBENzcx8cVRZnPZ/YUep2BWkjTIfA+PKVpZAXR5QxsjiqCKvGEqqp443w+0dvy17swqD0HB3S73V5PpkNg1qBqt8kwGCjmPkinM0QJbIoEa7U6UG6ToVgs4V9G2g0ESoP5Aoi7KYX5oCgf8IKbkvn9/mr1LRQKESamzgJy0g0tSZIuB3nuGqRU9Vv9C4sKkUhEkp4soxvxI8AAhWrrtXa3X8EAAAAASUVORK5CYII=);
|
79
|
-
background-position:top left;
|
80
|
-
background-repeat:no-repeat;
|
81
|
-
}
|
82
|
-
table.trace .open tr.file td.expand {
|
83
|
-
width:19px;
|
84
|
-
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAB1CAIAAAAqdO2mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXZJREFUeNrslK1ywkAUhcMOBomEOiSdqLxEBJX0NaijOsjyHGGmCGyQQYaiiiw4gktkcOmZbpsuuzQ/M5XnqJ2d3S/n3nM3rTzPLUP7/Tt0+pLcGQwG3W53OLyHzPMtjYL7q9UqSRLrD4E1Gj1orCvKYuFHUWTVkOM44/HjDcp8/lL4r6NerzeZPMm1KFw0QkDn83m5fP2lHA4fNQvRtNvtjsfDd0WzmSfb2e/fdTqdOvdh/HLJZLOn0+d2HJ+KRGzbdl23EpFlmed5cp2maRzHQq1lvQ5KMi6EUZBGfup6E1pTfd+vrGW7jbQ2C9hTt9BpqNyIWaAwAy6xg2eBz5iRC/NomiZhGN5sqmnkauo0BUGgVQoBjQ80oCACgNQdZHfTYBkF2mxCtWWAqunWpahxIDUt3QYUxIFQpJHyIWpXjinabKbbwItMHT+NyjchrP8QKaSQQgoppJBCCimkkEIKKaSQQgoppJBCCimkkEIKKaSo+hRgAEFD17X08O2NAAAAAElFTkSuQmCC);
|
85
|
-
background-position:top left;
|
86
|
-
background-repeat:no-repeat;
|
87
|
-
}
|
88
|
-
table.trace tr.source td.collapse {
|
89
|
-
width:19px;
|
90
|
-
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAB1CAIAAAAqdO2mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAVxJREFUeNrs0zFygkAUBmBlUkgJHdABlQwVkVJKKUxBYWbkALTxMJwhltyDFkss03IF8pudIcwaDaDl/6pd2P327b7d+eHwMXs4lNkzggoVKlSoUKFChQoVKlSoUKFChQoVKlSoUKFChQqVEYqm6ft9+qiSJEkYho7jTlcw2fd9NOI4nq4gEdFwXXe1Cqco63VkWVbXRTqLhTpOwQRpF7quR1E0TgGhqvLKUFCyoQqG/rks3O6kZKW/eRFpevOCoGTXVTcMQ5EyxyDEkML1c5RzuZOICIyXqn7JBVez6282MWrx731HOv2qB8Hri2lamNk0DfpVVdV1Peodappmmua8bdvzuc7zfNprzrLMth1FnGh/X8MjCAIQv/cFz/+65PcDh7rbvYv2ZUfdj+PxsyzLgVl0hKwgTqeqKApx2LeOc7t98zyv/1FWOgvx9RPii23bmL9cetJ8Ed8CDAC6aFW8bCzFhwAAAABJRU5ErkJggg==);
|
91
|
-
background-position:bottom left;
|
92
|
-
background-repeat:no-repeat;
|
93
|
-
background-color:#6F706F;
|
94
|
-
}
|
95
|
-
table.trace tr td.path {
|
96
|
-
padding-left:10px;
|
97
|
-
}
|
98
|
-
table.trace tr td.code {
|
99
|
-
padding-left:35px;
|
100
|
-
white-space: pre;
|
101
|
-
line-height:9px;
|
102
|
-
padding-bottom:10px;
|
103
|
-
}
|
104
|
-
table.trace tr td.code em {
|
105
|
-
font-weight:bold;
|
106
|
-
color:#00BF10;
|
107
|
-
}
|
108
|
-
table.trace tr td.code a {
|
109
|
-
width: 20px;
|
110
|
-
float: left;
|
111
|
-
}
|
112
|
-
table.trace tr td.code .more {
|
113
|
-
color:#666;
|
114
|
-
}
|
115
|
-
table.trace tr td.line {
|
116
|
-
width:30px;
|
117
|
-
text-align:right;
|
118
|
-
padding-right:4px;
|
119
|
-
}
|
120
|
-
.footer {
|
121
|
-
margin-top:5px;
|
122
|
-
font-size:11px;
|
123
|
-
color:#444;
|
124
|
-
text-align:right;
|
125
|
-
}
|
126
|
-
</style>
|
127
|
-
</head>
|
128
|
-
<body>
|
129
|
-
<div class="internalError">
|
130
|
-
|
131
|
-
<div class="header">
|
132
|
-
<h1><%= @exception.name.humanize %> <sup class="error_<%= @exception.class::STATUS %>"><%= @exception.class::STATUS %></sup></h1>
|
133
|
-
<% if show_details = ::Merb::Config[:exception_details] -%>
|
134
|
-
<h2><%== @exception.message %></h2>
|
135
|
-
<% else -%>
|
136
|
-
<h2>Sorry about that...</h2>
|
137
|
-
<% end -%>
|
138
|
-
<h3>Parameters</h3>
|
139
|
-
<ul>
|
140
|
-
<% controller.params[:original_params].each do |param, value| %>
|
141
|
-
<li><strong><%= param %>:</strong> <%= value.inspect %></li>
|
142
|
-
<% end %>
|
143
|
-
<%= "<li>None</li>" if controller.params[:original_params].empty? %>
|
144
|
-
</ul>
|
145
|
-
|
146
|
-
<h3>Session</h3>
|
147
|
-
<ul>
|
148
|
-
<% controller.params[:original_session].each do |param, value| %>
|
149
|
-
<li><strong><%= param %>:</strong> <%= value.inspect %></li>
|
150
|
-
<% end %>
|
151
|
-
<%= "<li>None</li>" if controller.params[:original_session].empty? %>
|
152
|
-
</ul>
|
153
|
-
|
154
|
-
<h3>Cookies</h3>
|
155
|
-
<ul>
|
156
|
-
<% controller.params[:original_cookies].each do |param, value| %>
|
157
|
-
<li><strong><%= param %>:</strong> <%= value.inspect %></li>
|
158
|
-
<% end %>
|
159
|
-
<%= "<li>None</li>" if controller.params[:original_cookies].empty? %>
|
160
|
-
</ul>
|
161
|
-
</div>
|
162
|
-
|
163
|
-
<% if show_details %>
|
164
|
-
<table class="trace">
|
165
|
-
<% @exception.backtrace.each_with_index do |line, index| %>
|
166
|
-
<tbody class="close">
|
167
|
-
<tr class="file">
|
168
|
-
<td class="expand">
|
169
|
-
</td>
|
170
|
-
<td class="path">
|
171
|
-
<%= (line.match(/^([^:]+)/)[1] rescue 'unknown').sub(/\/((opt|usr)\/local\/lib\/(ruby\/)?(gems\/)?(1.8\/)?(gems\/)?|.+\/app\/)/, '') %>
|
172
|
-
<% unless line.match(/\.erb:/) %>
|
173
|
-
in "<strong><%= line.match(/:in `(.+)'$/)[1] rescue '?' %></strong>"
|
174
|
-
<% else %>
|
175
|
-
(<strong>ERB Template</strong>)
|
176
|
-
<% end %>
|
177
|
-
</td>
|
178
|
-
<td class="line">
|
179
|
-
<a href="txmt://open?url=file://<%=file = (line.match(/^([^:]+)/)[1] rescue 'unknown')%>&line=<%= lineno = line.match(/:([0-9]+):/)[1] rescue '?' %>"><%=lineno%></a>
|
180
|
-
</td>
|
181
|
-
</tr>
|
182
|
-
<tr class="source">
|
183
|
-
<td class="collapse">
|
184
|
-
</td>
|
185
|
-
<td class="code" colspan="2"><% (__caller_lines__(file, lineno, 5) rescue []).each do |llineno, lcode, lcurrent| %>
|
186
|
-
<a href="txmt://open?url=file://<%=file%>&line=<%=llineno%>"><%= llineno %></a><%='<em>' if llineno==lineno.to_i %><%= lcode.size > 90 ? CGI.escapeHTML(lcode[0..90])+'<span class="more">......</span>' : CGI.escapeHTML(lcode) %><%='</em>' if llineno==lineno.to_i %>
|
187
|
-
<% end %>
|
188
|
-
|
189
|
-
</td>
|
190
|
-
</tr>
|
191
|
-
</tbody>
|
192
|
-
<% end %>
|
193
|
-
</table>
|
194
|
-
<script type="text/javascript" charset="utf-8">
|
195
|
-
// swop the open & closed classes
|
196
|
-
els = document.getElementsByTagName('td');
|
197
|
-
for(i=0; i<els.length; i++){
|
198
|
-
if(els[i].className=='expand' || els[i].className=='collapse'){
|
199
|
-
els[i].onclick = function(e){
|
200
|
-
tbody = this.parentNode.parentNode;
|
201
|
-
if(tbody.className=='open'){
|
202
|
-
tbody.className='closed';
|
203
|
-
}else{
|
204
|
-
tbody.className='open';
|
205
|
-
}
|
206
|
-
}
|
207
|
-
}
|
208
|
-
}
|
209
|
-
</script>
|
210
|
-
<% end %>
|
211
|
-
<div class="footer">
|
212
|
-
lots of love, from <a href="#">merb</a>
|
213
|
-
</div>
|
214
|
-
</div>
|
215
|
-
</body>
|
216
|
-
</html>
|