squash_rails 1.0.0 → 1.1.0
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/README.md +10 -3
- data/lib/squash/rails/capistrano.rb +11 -7
- data/lib/squash/rails/rack.rb +94 -0
- data/lib/squash/rails.rb +13 -0
- data/lib/squash/ruby/railtie.rb +14 -1
- metadata +23 -22
data/README.md
CHANGED
@@ -31,9 +31,16 @@ https://github.com/SquareSquash/ruby
|
|
31
31
|
Usage
|
32
32
|
-----
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
Add this gem and the Squash Ruby gem to your Gemfile:
|
35
|
+
|
36
|
+
```` ruby
|
37
|
+
gem 'squash_ruby', :require => 'squash/ruby'
|
38
|
+
gem 'squash_rails', :require => 'squash/rails'
|
39
|
+
````
|
40
|
+
|
41
|
+
See the `squash_ruby` gem for configuration instructions. Note that it is no
|
42
|
+
longer necessary to set the `:environment` configuration option; the Rails
|
43
|
+
client library automatically sets that to the Rails environment.
|
37
44
|
|
38
45
|
You can use the usual `Squash::Ruby.notify` method in your Rails projects, but
|
39
46
|
you will miss out on some Rails-specific information in your exception logs. You
|
@@ -14,11 +14,15 @@
|
|
14
14
|
|
15
15
|
# Capistrano tasks for Rails apps using Squash.
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
Capistrano::Configuration.instance.load do
|
18
|
+
namespace :squash do
|
19
|
+
desc "Notifies Squash of a new deploy."
|
20
|
+
task :notify, :roles => :web, :only => {:primary => true}, :except => {:no_release => true} do
|
21
|
+
rails_env = fetch(:rails_env, 'production')
|
22
|
+
run "cd #{current_path} && env RAILS_ENV=#{rails_env} #{fetch(:bundle_cmd, "bundle")} exec rake squash:notify REVISION=#{real_revision} DEPLOY_ENV=#{rails_env}"
|
23
|
+
end
|
24
|
+
end
|
22
25
|
|
23
|
-
after 'deploy:restart', 'squash:notify'
|
24
|
-
after 'deploy:start', 'squash:notify'
|
26
|
+
after 'deploy:restart', 'squash:notify'
|
27
|
+
after 'deploy:start', 'squash:notify'
|
28
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Squash
|
2
|
+
module Rails
|
3
|
+
|
4
|
+
# Rack middleware that catches exceptions thrown outside the scope of
|
5
|
+
# Rails's request processing. This middleware is automatically added to your
|
6
|
+
# stack when you include the `squash_rails` gem.
|
7
|
+
|
8
|
+
class Rack
|
9
|
+
|
10
|
+
# Instantiates the middleware.
|
11
|
+
#
|
12
|
+
# @param [Array] app The middleware stack.
|
13
|
+
|
14
|
+
def initialize(app)
|
15
|
+
@app = app
|
16
|
+
end
|
17
|
+
|
18
|
+
# Rescues any exceptions thrown downstream, notifies Squash, then
|
19
|
+
# re-raises them.
|
20
|
+
#
|
21
|
+
# @param [Hash] env The Rack environment.
|
22
|
+
# @return [Hash] The Rack result to pass up the stack.
|
23
|
+
|
24
|
+
def call(env)
|
25
|
+
@env = env
|
26
|
+
|
27
|
+
begin
|
28
|
+
result = @app.call(env)
|
29
|
+
rescue ::Exception => ex
|
30
|
+
@env['squash.notified'] = ::Squash::Ruby.notify(ex, squash_rack_data)
|
31
|
+
raise ex
|
32
|
+
end
|
33
|
+
|
34
|
+
result
|
35
|
+
end
|
36
|
+
|
37
|
+
# @abstract
|
38
|
+
#
|
39
|
+
# Override this method to implement filtering of sensitive data in the
|
40
|
+
# headers, cookies, and rack hashes (see {#squash_rack_data}). The method
|
41
|
+
# signature is the same as `Squash::Ruby#filter_for_squash`, but `kind`
|
42
|
+
# can also be `:env` for the Rack environment hash.
|
43
|
+
|
44
|
+
def filter_for_squash(data, kind)
|
45
|
+
data
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Hash<Symbol, Object>] The additional information this
|
49
|
+
# middleware gives to `Squash::Ruby.notify`.
|
50
|
+
|
51
|
+
def squash_rack_data
|
52
|
+
{
|
53
|
+
:environment => environment_name,
|
54
|
+
:root => root_path,
|
55
|
+
|
56
|
+
:headers => filter_for_squash(request_headers, :headers),
|
57
|
+
:request_method => @env['REQUEST_METHOD'].to_s.upcase,
|
58
|
+
:schema => @env['rack.url_scheme'],
|
59
|
+
:host => @env['SERVER_NAME'],
|
60
|
+
:port => @env['SERVER_PORT'],
|
61
|
+
:path => @env['PATH_INFO'],
|
62
|
+
:query => @env['QUERY_STRING'],
|
63
|
+
|
64
|
+
:params => filter_for_squash(@env['action_dispatch.request.parameters'], :params),
|
65
|
+
:session => filter_for_squash(@env['rack.session'], :session),
|
66
|
+
:flash => filter_for_squash(@env[ActionDispatch::Flash::KEY], :flash),
|
67
|
+
:cookies => filter_for_squash(@env['rack.request.cookie_hash'], :cookies),
|
68
|
+
|
69
|
+
:"rack.env" => filter_for_squash(@env, :rack)
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def environment_name
|
76
|
+
if defined?(::Rails)
|
77
|
+
::Rails.env.to_s
|
78
|
+
else
|
79
|
+
ENV['RAILS_ENV'] || ENV['RACK_ENV']
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Extract any rack key/value pairs where the key begins with HTTP_*
|
84
|
+
def request_headers
|
85
|
+
@env.select { |key, _| key[0, 5] == 'HTTP_' }
|
86
|
+
end
|
87
|
+
|
88
|
+
def root_path
|
89
|
+
defined?(::Rails) ? ::Rails.root.to_s : ENV['RAILS_ROOT']
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
data/lib/squash/rails.rb
CHANGED
@@ -25,6 +25,19 @@ end
|
|
25
25
|
module Squash::Ruby
|
26
26
|
CONFIGURATION_DEFAULTS[:deploy_path] = "/api/1.0/deploy"
|
27
27
|
|
28
|
+
# @private
|
29
|
+
def self.failsafe_log(tag, message)
|
30
|
+
logger = Rails.respond_to?(:logger) ? Rails.logger : RAILS_DEFAULT_LOGGER
|
31
|
+
if (logger.respond_to?(:tagged))
|
32
|
+
logger.tagged(tag) { logger.error message }
|
33
|
+
else
|
34
|
+
logger.error "[#{tag}]\t#{message}"
|
35
|
+
end
|
36
|
+
rescue Object => err
|
37
|
+
$stderr.puts "Couldn't write to failsafe log (#{err.to_s}); writing to stderr instead."
|
38
|
+
$stderr.puts "#{Time.now.to_s}\t[#{tag}]\t#{message}"
|
39
|
+
end
|
40
|
+
|
28
41
|
private
|
29
42
|
|
30
43
|
def self.client_name() 'rails' end
|
data/lib/squash/ruby/railtie.rb
CHANGED
@@ -17,11 +17,24 @@
|
|
17
17
|
# versions, see `rails/init.rb`.
|
18
18
|
|
19
19
|
class Squash::Ruby::Railtie < Rails::Railtie
|
20
|
-
initializer "squash_client.configure_rails_initialization" do
|
20
|
+
initializer "squash_client.configure_rails_initialization" do |app|
|
21
21
|
Squash::Ruby.configure :environment => Rails.env.to_s,
|
22
22
|
:project_root => Rails.root.to_s,
|
23
23
|
:repository_root => Rails.root.to_s,
|
24
24
|
:failsafe_log => Rails.root.join('log', 'squash.failsafe.log').to_s
|
25
|
+
|
26
|
+
# Load the Rack middleware into the stack at the top.
|
27
|
+
if app.respond_to?(:config) && app.config.respond_to?(:middleware)
|
28
|
+
require 'squash/rails/rack'
|
29
|
+
|
30
|
+
if defined?(ActionDispatch::DebugExceptions)
|
31
|
+
app.config.middleware.insert_after ActionDispatch::DebugExceptions, Squash::Rails::Rack
|
32
|
+
elsif defined?(ActionDispatch::ShowExceptions)
|
33
|
+
app.config.middleware.insert_after ActionDispatch::ShowExceptions, Squash::Rails::Rack
|
34
|
+
else
|
35
|
+
app.config.middleware.insert 0, Squash::Rails::Rack
|
36
|
+
end
|
37
|
+
end
|
25
38
|
end
|
26
39
|
|
27
40
|
rake_tasks { load 'squash/rails/tasks.rake' }
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: squash_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tim Morgan
|
@@ -15,10 +15,9 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-02-05 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
prerelease: false
|
22
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
22
|
none: false
|
24
23
|
requirements:
|
@@ -28,11 +27,11 @@ dependencies:
|
|
28
27
|
segments:
|
29
28
|
- 0
|
30
29
|
version: "0"
|
31
|
-
type: :runtime
|
32
|
-
name: squash_ruby
|
33
30
|
version_requirements: *id001
|
34
|
-
|
31
|
+
name: squash_ruby
|
35
32
|
prerelease: false
|
33
|
+
type: :runtime
|
34
|
+
- !ruby/object:Gem::Dependency
|
36
35
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
36
|
none: false
|
38
37
|
requirements:
|
@@ -42,11 +41,11 @@ dependencies:
|
|
42
41
|
segments:
|
43
42
|
- 0
|
44
43
|
version: "0"
|
45
|
-
type: :development
|
46
|
-
name: rails
|
47
44
|
version_requirements: *id002
|
48
|
-
|
45
|
+
name: rails
|
49
46
|
prerelease: false
|
47
|
+
type: :development
|
48
|
+
- !ruby/object:Gem::Dependency
|
50
49
|
requirement: &id003 !ruby/object:Gem::Requirement
|
51
50
|
none: false
|
52
51
|
requirements:
|
@@ -56,11 +55,11 @@ dependencies:
|
|
56
55
|
segments:
|
57
56
|
- 0
|
58
57
|
version: "0"
|
59
|
-
type: :development
|
60
|
-
name: rspec
|
61
58
|
version_requirements: *id003
|
62
|
-
|
59
|
+
name: rspec
|
63
60
|
prerelease: false
|
61
|
+
type: :development
|
62
|
+
- !ruby/object:Gem::Dependency
|
64
63
|
requirement: &id004 !ruby/object:Gem::Requirement
|
65
64
|
none: false
|
66
65
|
requirements:
|
@@ -70,11 +69,11 @@ dependencies:
|
|
70
69
|
segments:
|
71
70
|
- 0
|
72
71
|
version: "0"
|
73
|
-
type: :development
|
74
|
-
name: yard
|
75
72
|
version_requirements: *id004
|
76
|
-
|
73
|
+
name: yard
|
77
74
|
prerelease: false
|
75
|
+
type: :development
|
76
|
+
- !ruby/object:Gem::Dependency
|
78
77
|
requirement: &id005 !ruby/object:Gem::Requirement
|
79
78
|
none: false
|
80
79
|
requirements:
|
@@ -84,11 +83,11 @@ dependencies:
|
|
84
83
|
segments:
|
85
84
|
- 0
|
86
85
|
version: "0"
|
87
|
-
type: :development
|
88
|
-
name: redcarpet
|
89
86
|
version_requirements: *id005
|
90
|
-
|
87
|
+
name: redcarpet
|
91
88
|
prerelease: false
|
89
|
+
type: :development
|
90
|
+
- !ruby/object:Gem::Dependency
|
92
91
|
requirement: &id006 !ruby/object:Gem::Requirement
|
93
92
|
none: false
|
94
93
|
requirements:
|
@@ -98,9 +97,10 @@ dependencies:
|
|
98
97
|
segments:
|
99
98
|
- 0
|
100
99
|
version: "0"
|
101
|
-
type: :development
|
102
|
-
name: jeweler
|
103
100
|
version_requirements: *id006
|
101
|
+
name: jeweler
|
102
|
+
prerelease: false
|
103
|
+
type: :development
|
104
104
|
description: This client library records Ruby on Rails exceptions to Squash.
|
105
105
|
email: tim@squareup.com
|
106
106
|
executables: []
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- lib/squash/rails.rb
|
117
117
|
- lib/squash/rails/capistrano.rb
|
118
118
|
- lib/squash/rails/configure.rb
|
119
|
+
- lib/squash/rails/rack.rb
|
119
120
|
- lib/squash/rails/tasks.rake
|
120
121
|
- lib/squash/ruby/controller_methods.rb
|
121
122
|
- lib/squash/ruby/railtie.rb
|