hoptoad_notifier 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/INSTALL ADDED
@@ -0,0 +1,25 @@
1
+ === Configuration
2
+
3
+ You should have something like this in config/initializers/hoptoad.rb.
4
+
5
+ HoptoadNotifier.configure do |config|
6
+ config.api_key = '1234567890abcdef'
7
+ end
8
+
9
+ (Please note that this configuration should be in a global configuration, and
10
+ is *not* environment-specific. Hoptoad is smart enough to know what errors are
11
+ caused by what environments, so your staging errors don't get mixed in with
12
+ your production errors.)
13
+
14
+ You can test that Hoptoad is working in your production environment by using
15
+ this rake task (from RAILS_ROOT):
16
+
17
+ rake hoptoad:test
18
+
19
+ If everything is configured properly, that task will send a notice to Hoptoad
20
+ which will be visible immediately.
21
+
22
+ NOTE FOR RAILS 1.2.* USERS:
23
+
24
+ You will need to copy the hoptoad_notifier_tasks.rake file into your
25
+ RAILS_ROOT/lib/tasks directory in order for the rake hoptoad:test task to work.
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2007, Tammer Saleh, Thoughtbot, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,221 @@
1
+ = HoptoadNotifier
2
+
3
+ This is the notifier gem for integrating apps with Hoptoad.
4
+
5
+ When an uncaught exception occurs, HoptoadNotifier will POST the relevant data
6
+ to the Hoptoad server specified in your environment.
7
+
8
+ == Help
9
+
10
+ * {IRC}[irc://irc.freenode.net/thoughtbot]
11
+ * {mailing list}[http://groups.google.com/group/hoptoad-notifier-dev]
12
+
13
+ == Installation
14
+
15
+ === Remove exception_notifier
16
+
17
+ in your ApplicationController, REMOVE this line:
18
+
19
+ include ExceptionNotifiable
20
+
21
+ In your config/environment* files, remove all references to ExceptionNotifier
22
+
23
+ Remove the vendor/plugins/exception_notifier directory.
24
+
25
+ === Rails 2.x
26
+
27
+ Add the hoptoad_notifier gem to your app. In config/environment.rb:
28
+
29
+ config.gem 'hoptoad_notifier'
30
+
31
+ Then from your project's RAILS_ROOT, run:
32
+
33
+ rake gems:install
34
+ script/generate hoptoad --api-key your_key_here
35
+
36
+ === Rails 1.2.6
37
+
38
+ Install the hoptoad_notifier Gem, and then add something like this at the
39
+ bottom of your config/environment.rb:
40
+
41
+ HoptoadNotifier.configure do |config|
42
+ config.api_key = 'your_key_here'
43
+ end
44
+
45
+ You will need to copy the hoptoad_notifier_tasks.rake file into your
46
+ RAILS_ROOT/lib/tasks directory in order for the rake hoptoad:test task to work.
47
+
48
+ === Testing it out
49
+
50
+ You can test that Hoptoad is working in your production environment by using
51
+ this rake task (from RAILS_ROOT):
52
+
53
+ rake hoptoad:test
54
+
55
+ If everything is configured properly, that task will send a notice to Hoptoad
56
+ which will be visible immediately.
57
+
58
+ == Usage
59
+
60
+ For the most part, Hoptoad works for itself. Once you've included the notifier
61
+ in your ApplicationController (which is now done automatically by the gem),
62
+ all errors will be rescued by the #rescue_action_in_public provided by the gem.
63
+
64
+ If you want to log arbitrary things which you've rescued yourself from a
65
+ controller, you can do something like this:
66
+
67
+ ...
68
+ rescue => ex
69
+ notify_hoptoad(ex)
70
+ flash[:failure] = 'Encryptions could not be rerouted, try again.'
71
+ end
72
+ ...
73
+
74
+ The #notify_hoptoad call will send the notice over to Hoptoad for later
75
+ analysis. While in your controllers you use the notify_hoptoad method, anywhere
76
+ else in your code, use HoptoadNotifier.notify.
77
+
78
+ To perform custom error processing after Hoptoad has been notified, define the
79
+ instance method #rescue_action_in_public_without_hoptoad(exception) in your
80
+ controller.
81
+
82
+ == Tracking deployments in Hoptoad
83
+
84
+ Paying Hoptoad plans support the ability to track deployments of your application in Hoptoad.
85
+ By notifying Hoptoad of your application deployments, all errors are resolved when a deploy occurs,
86
+ so that you'll be notified again about any errors that reoccur after a deployment.
87
+
88
+ Additionally, it's possible to review the errors in Hoptoad that occurred before and after a deploy.
89
+
90
+ When Hoptoad is installed as a gem, you need to add
91
+
92
+ require 'hoptoad_notifier/recipes/hoptoad'
93
+
94
+ to your deploy.rb
95
+
96
+ == Going beyond exceptions
97
+
98
+ You can also pass a hash to notify_hoptoad method and store whatever you want,
99
+ not just an exception. And you can also use it anywhere, not just in
100
+ controllers:
101
+
102
+ begin
103
+ params = {
104
+ # params that you pass to a method that can throw an exception
105
+ }
106
+ my_unpredicable_method(params)
107
+ rescue => e
108
+ HoptoadNotifier.notify(
109
+ :error_class => "Special Error",
110
+ :error_message => "Special Error: #{e.message}",
111
+ :parameters => params
112
+ )
113
+ end
114
+
115
+ While in your controllers you use the notify_hoptoad method, anywhere else in
116
+ your code, use HoptoadNotifier.notify. Hoptoad will get all the information
117
+ about the error itself. As for a hash, these are the keys you should pass:
118
+
119
+ * :error_class - Use this to group similar errors together. When Hoptoad catches an exception it sends the class name of that exception object.
120
+ * :error_message - This is the title of the error you see in the errors list. For exceptions it is "#{exception.class.name}: #{exception.message}"
121
+ * :parameters - While there are several ways to send additional data to Hoptoad, passing a Hash as :parameters as in the example above is the most common use case. When Hoptoad catches an exception in a controller, the actual HTTP client request parameters are sent using this key.
122
+
123
+ Hoptoad merges the hash you pass with these default options:
124
+
125
+ {
126
+ :api_key => HoptoadNotifier.api_key,
127
+ :error_message => 'Notification',
128
+ :backtrace => caller,
129
+ :parameters => {},
130
+ :session => {}
131
+ }
132
+
133
+ You can override any of those parameters.
134
+
135
+ == Filtering
136
+
137
+ You can specify a whitelist of errors, that Hoptoad will not report on. Use
138
+ this feature when you are so apathetic to certain errors that you don't want
139
+ them even logged.
140
+
141
+ This filter will only be applied to automatic notifications, not manual
142
+ notifications (when #notify is called directly).
143
+
144
+ Hoptoad ignores the following exceptions by default:
145
+
146
+ ActiveRecord::RecordNotFound
147
+ ActionController::RoutingError
148
+ ActionController::InvalidAuthenticityToken
149
+ ActionController::UnknownAction
150
+ CGI::Session::CookieStore::TamperedWithCookie
151
+
152
+ To ignore errors in addition to those, specify their names in your Hoptoad
153
+ configuration block.
154
+
155
+ HoptoadNotifier.configure do |config|
156
+ config.api_key = '1234567890abcdef'
157
+ config.ignore << ActiveRecord::IgnoreThisError
158
+ end
159
+
160
+ To ignore *only* certain errors (and override the defaults), use the
161
+ #ignore_only attribute.
162
+
163
+ HoptoadNotifier.configure do |config|
164
+ config.api_key = '1234567890abcdef'
165
+ config.ignore_only = [ActiveRecord::IgnoreThisError]
166
+ end
167
+
168
+ To ignore certain user agents, add in the #ignore_user_agent attribute as a
169
+ string or regexp:
170
+
171
+ HoptoadNotifier.configure do |config|
172
+ config.api_key = '1234567890abcdef'
173
+ config.ignore_user_agent << /Ignored/
174
+ config.ignore_user_agent << 'IgnoredUserAgent'
175
+ end
176
+
177
+ To ignore exceptions based on other conditions, use #ignore_by_filter:
178
+
179
+ HoptoadNotifier.configure do |config|
180
+ config.api_key = '1234567890abcdef'
181
+ config.ignore_by_filter do |exception_data|
182
+ true if exception_data[:error_class] == "RuntimeError"
183
+ end
184
+ end
185
+
186
+ To replace sensitive information sent to the Hoptoad service with [FILTERED] use #params_filters:
187
+
188
+ HoptoadNotifier.configure do |config|
189
+ config.api_key = '1234567890abcdef'
190
+ config.params_filters << "credit_card_number"
191
+ end
192
+
193
+ Note that, when rescuing exceptions within an ActionController method,
194
+ hoptoad_notifier will reuse filters specified by #filter_params_logging.
195
+
196
+ == Testing
197
+
198
+ When you run your tests, you might notice that the Hoptoad service is recording
199
+ notices generated using #notify when you don't expect it to. You can
200
+ use code like this in your test_helper.rb to redefine that method so those
201
+ errors are not reported while running tests.
202
+
203
+ module HoptoadNotifier
204
+ def self.notify(thing)
205
+ # do nothing.
206
+ end
207
+ end
208
+
209
+ == Supported Rails versions
210
+
211
+ See SUPPORTED_RAILS_VERSIONS for a list of official supported versions of
212
+ Rails.
213
+
214
+ Please open up a support ticket on Tender ( http://help.hoptoadapp.com ) if
215
+ you're using a version of Rails that is not listed above and the notifier is
216
+ not working properly.
217
+
218
+ == Thanks
219
+
220
+ Thanks to Eugene Bolshakov for the excellent write-up on GOING BEYOND
221
+ EXCEPTIONS, which we have included above.
data/Rakefile ADDED
@@ -0,0 +1,117 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/gempackagetask'
5
+ require 'cucumber/rake/task'
6
+
7
+ desc 'Default: run unit tests.'
8
+ task :default => [:test, :cucumber]
9
+
10
+ desc 'Test the hoptoad_notifier gem.'
11
+ Rake::TestTask.new(:test) do |t|
12
+ t.libs << 'lib'
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = true
15
+ end
16
+
17
+ desc 'Run ginger tests'
18
+ task :ginger do
19
+ $LOAD_PATH << File.join(*%w[vendor ginger lib])
20
+ ARGV.clear
21
+ ARGV << 'test'
22
+ load File.join(*%w[vendor ginger bin ginger])
23
+ end
24
+
25
+ begin
26
+ require 'yard'
27
+ YARD::Rake::YardocTask.new do |t|
28
+ t.files = ['lib/**/*.rb', 'TESTING.rdoc']
29
+ end
30
+ rescue LoadError
31
+ end
32
+
33
+ GEM_ROOT = File.dirname(__FILE__).freeze
34
+ VERSION_FILE = File.join(GEM_ROOT, 'lib', 'hoptoad_notifier', 'version')
35
+
36
+ require VERSION_FILE
37
+
38
+ gemspec = Gem::Specification.new do |s|
39
+ s.name = %q{hoptoad_notifier}
40
+ s.version = HoptoadNotifier::VERSION
41
+ s.summary = %q{Send your application errors to our hosted service and reclaim your inbox.}
42
+
43
+ s.files = FileList['[A-Z]*', 'generators/**/*.*', 'lib/**/*.rb',
44
+ 'test/**/*.rb', 'rails/**/*.rb', 'tasks/**/*.rake']
45
+ s.require_path = 'lib'
46
+ s.test_files = Dir[*['test/**/*_test.rb']]
47
+
48
+ s.has_rdoc = true
49
+ s.extra_rdoc_files = ["README.rdoc"]
50
+ s.rdoc_options = ['--line-numbers', "--main", "README.rdoc"]
51
+
52
+ s.authors = ["thoughtbot, inc"]
53
+ s.email = %q{support@hoptoadapp.com}
54
+ s.homepage = "http://www.hoptoadapp.com"
55
+
56
+ s.platform = Gem::Platform::RUBY
57
+ end
58
+
59
+ Rake::GemPackageTask.new gemspec do |pkg|
60
+ pkg.need_tar = true
61
+ pkg.need_zip = true
62
+ end
63
+
64
+ desc "Clean files generated by rake tasks"
65
+ task :clobber => [:clobber_rdoc, :clobber_package]
66
+
67
+ desc "Generate a gemspec file"
68
+ task :gemspec do
69
+ File.open("#{gemspec.name}.gemspec", 'w') do |f|
70
+ f.write gemspec.to_ruby
71
+ end
72
+ end
73
+
74
+ LOCAL_GEM_ROOT = File.join(GEM_ROOT, 'tmp', 'local_gems').freeze
75
+ RAILS_VERSIONS = IO.read('SUPPORTED_RAILS_VERSIONS').strip.split("\n")
76
+ LOCAL_GEMS = [['sham_rack', nil], ['capistrano', nil], ['sqlite3-ruby', nil]] +
77
+ RAILS_VERSIONS.collect { |version| ['rails', version] }
78
+
79
+ task :vendor_test_gems do
80
+ LOCAL_GEMS.each do |gem_name, version|
81
+ gem_file_pattern = [gem_name, version || '*'].compact.join('-')
82
+ version_option = version ? "-v #{version}" : ''
83
+ pattern = File.join(LOCAL_GEM_ROOT, 'gems', "#{gem_file_pattern}")
84
+ existing = Dir.glob(pattern).first
85
+ unless existing
86
+ command = "gem install -i #{LOCAL_GEM_ROOT} --no-ri --no-rdoc #{version_option} #{gem_name}"
87
+ puts "Vendoring #{gem_file_pattern}..."
88
+ unless system(command)
89
+ $stderr.puts "Command failed: #{command}"
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ Cucumber::Rake::Task.new(:cucumber) do |t|
96
+ t.fork = true
97
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
98
+ end
99
+
100
+ task :cucumber => [:gemspec, :vendor_test_gems]
101
+
102
+ OLD_RAILS_VERSIONS = RAILS_VERSIONS[0...-1]
103
+
104
+ namespace :cucumber do
105
+ namespace :rails do
106
+ OLD_RAILS_VERSIONS.each do |version|
107
+ desc "Test integration of the gem with Rails #{version}"
108
+ task version do
109
+ ENV['RAILS_VERSION'] = version
110
+ system("cucumber --format progress features/rails.feature")
111
+ end
112
+ end
113
+
114
+ desc "Test integration of the gem with all Rails versions"
115
+ task :all => [:cucumber, *OLD_RAILS_VERSIONS]
116
+ end
117
+ end
@@ -0,0 +1,8 @@
1
+ 1.2.6
2
+ 2.0.2
3
+ 2.1.0
4
+ 2.1.2
5
+ 2.2.2
6
+ 2.3.2
7
+ 2.3.3
8
+ 2.3.4
data/TESTING.rdoc ADDED
@@ -0,0 +1,8 @@
1
+ = For Maintainers:
2
+
3
+ When developing the Hoptoad Notifier, be sure to use the integration test
4
+ against an existing project on staging before pushing to master.
5
+
6
+ +./script/integration_test.rb <test project's api key> <staging server hostname>+
7
+
8
+ +./script/integration_test.rb <test project's api key> <staging server hostname> secure+
@@ -0,0 +1,42 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/lib/insert_commands.rb")
2
+ require File.expand_path(File.dirname(__FILE__) + "/lib/rake_commands.rb")
3
+
4
+ class HoptoadGenerator < Rails::Generator::Base
5
+ def add_options!(opt)
6
+ opt.on('-k', '--api-key=key', String, "Your Hoptoad API key") {|v| options[:api_key] = v}
7
+ end
8
+
9
+ def manifest
10
+ if !api_key_configured? && !options[:api_key]
11
+ puts "Must pass --api-key or create config/initializers/hoptoad.rb"
12
+ exit
13
+ end
14
+ record do |m|
15
+ m.directory 'lib/tasks'
16
+ m.file 'hoptoad_notifier_tasks.rake', 'lib/tasks/hoptoad_notifier_tasks.rake'
17
+ if File.exists?('config/deploy.rb')
18
+ m.append_to 'config/deploy.rb', "require 'hoptoad_notifier/capistrano'"
19
+ end
20
+ if options[:api_key]
21
+ if use_initializer?
22
+ m.template 'initializer.rb', 'config/initializers/hoptoad.rb',
23
+ :assigns => {:api_key => options[:api_key]}
24
+ else
25
+ m.template 'initializer.rb', 'config/hoptoad.rb',
26
+ :assigns => {:api_key => options[:api_key]}
27
+ m.append_to 'config/environment.rb', "require 'config/hoptoad'"
28
+ end
29
+ end
30
+ m.rake "hoptoad:test", :generate_only => true
31
+ end
32
+ end
33
+
34
+ def use_initializer?
35
+ Rails::VERSION::MAJOR > 1
36
+ end
37
+
38
+ def api_key_configured?
39
+ File.exists?('config/initializers/hoptoad.rb') ||
40
+ system("grep HoptoadNotifier config/environment.rb")
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ # Mostly pinched from http://github.com/ryanb/nifty-generators/tree/master
2
+
3
+ Rails::Generator::Commands::Base.class_eval do
4
+ def file_contains?(relative_destination, line)
5
+ File.read(destination_path(relative_destination)).include?(line)
6
+ end
7
+ end
8
+
9
+ Rails::Generator::Commands::Create.class_eval do
10
+ def append_to(file, line)
11
+ logger.insert "#{line} appended to #{file}"
12
+ unless options[:pretend] || file_contains?(file, line)
13
+ File.open(file, "a") do |file|
14
+ file.puts
15
+ file.puts line
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ Rails::Generator::Commands::Destroy.class_eval do
22
+ def append_to(file, line)
23
+ logger.remove "#{line} removed from #{file}"
24
+ unless options[:pretend]
25
+ gsub_file file, "\n#{line}", ''
26
+ end
27
+ end
28
+ end
29
+
30
+ Rails::Generator::Commands::List.class_eval do
31
+ def append_to(file, line)
32
+ logger.insert "#{line} appended to #{file}"
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ Rails::Generator::Commands::Create.class_eval do
2
+ def rake(cmd, opts = {})
3
+ logger.rake "rake #{cmd}"
4
+ unless system("rake #{cmd}")
5
+ logger.rake "#{cmd} failed. Rolling back"
6
+ command(:destroy).invoke!
7
+ end
8
+ end
9
+ end
10
+
11
+ Rails::Generator::Commands::Destroy.class_eval do
12
+ def rake(cmd, opts = {})
13
+ unless opts[:generate_only]
14
+ logger.rake "rake #{cmd}"
15
+ system "rake #{cmd}"
16
+ end
17
+ end
18
+ end
19
+
20
+ Rails::Generator::Commands::List.class_eval do
21
+ def rake(cmd, opts = {})
22
+ logger.rake "rake #{cmd}"
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ Dir[File.join(RAILS_ROOT, 'vendor', 'gems', 'hoptoad_notifier-*')].each do |vendored_notifier|
2
+ $: << File.join(vendored_notifier, 'lib')
3
+ end
4
+
5
+ require 'hoptoad_notifier/tasks'
@@ -0,0 +1,6 @@
1
+ <% if Rails::VERSION::MINOR < 2 -%>
2
+ require 'hoptoad_notifier/rails'
3
+ <% end -%>
4
+ HoptoadNotifier.configure do |config|
5
+ config.api_key = '<%= api_key %>'
6
+ end
@@ -0,0 +1,99 @@
1
+ module HoptoadNotifier
2
+ # Front end to parsing the backtrace for each notice
3
+ class Backtrace
4
+
5
+ # Handles backtrace parsing line by line
6
+ class Line
7
+
8
+ INPUT_FORMAT = %r{^([^:]+):(\d+)(?::in `([^']+)')?$}.freeze
9
+
10
+ # The file portion of the line (such as app/models/user.rb)
11
+ attr_reader :file
12
+
13
+ # The line number portion of the line
14
+ attr_reader :number
15
+
16
+ # The method of the line (such as index)
17
+ attr_reader :method
18
+
19
+ # Parses a single line of a given backtrace
20
+ # @param [String] unparsed_line The raw line from +caller+ or some backtrace
21
+ # @return [Line] The parsed backtrace line
22
+ def self.parse(unparsed_line)
23
+ _, file, number, method = unparsed_line.match(INPUT_FORMAT).to_a
24
+ new(file, number, method)
25
+ end
26
+
27
+ def initialize(file, number, method)
28
+ self.file = file
29
+ self.number = number
30
+ self.method = method
31
+ end
32
+
33
+ # Reconstructs the line in a readable fashion
34
+ def to_s
35
+ "#{file}:#{number}:in `#{method}'"
36
+ end
37
+
38
+ def ==(other)
39
+ to_s == other.to_s
40
+ end
41
+
42
+ def inspect
43
+ "<Line:#{to_s}>"
44
+ end
45
+
46
+ private
47
+
48
+ attr_writer :file, :number, :method
49
+ end
50
+
51
+ # holder for an Array of Backtrace::Line instances
52
+ attr_reader :lines
53
+
54
+ def self.parse(ruby_backtrace, opts = {})
55
+ ruby_lines = split_multiline_backtrace(ruby_backtrace)
56
+
57
+ filters = opts[:filters] || []
58
+ filtered_lines = ruby_lines.to_a.map do |line|
59
+ filters.inject(line) do |line, proc|
60
+ proc.call(line)
61
+ end
62
+ end.compact
63
+
64
+ lines = filtered_lines.collect do |unparsed_line|
65
+ Line.parse(unparsed_line)
66
+ end
67
+
68
+ instance = new(lines)
69
+ end
70
+
71
+ def initialize(lines)
72
+ self.lines = lines
73
+ end
74
+
75
+ def inspect
76
+ "<Backtrace: " + lines.collect { |line| line.inspect }.join(", ") + ">"
77
+ end
78
+
79
+ def ==(other)
80
+ if other.respond_to?(:lines)
81
+ lines == other.lines
82
+ else
83
+ false
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ attr_writer :lines
90
+
91
+ def self.split_multiline_backtrace(backtrace)
92
+ if backtrace.to_a.size == 1
93
+ backtrace.to_a.first.split(/\n\s*/)
94
+ else
95
+ backtrace
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,20 @@
1
+ # Defines deploy:notify_hoptoad which will send information about the deploy to Hoptoad.
2
+
3
+ Capistrano::Configuration.instance(:must_exist).load do
4
+ after "deploy", "deploy:notify_hoptoad"
5
+ after "deploy:migrations", "deploy:notify_hoptoad"
6
+
7
+ namespace :deploy do
8
+ desc "Notify Hoptoad of the deployment"
9
+ task :notify_hoptoad, :except => { :no_release => true } do
10
+ rails_env = fetch(:hoptoad_env, fetch(:rails_env, "production"))
11
+ local_user = ENV['USER'] || ENV['USERNAME']
12
+ executable = RUBY_PLATFORM.downcase.include?('mswin') ? 'rake.bat' : 'rake'
13
+ notify_command = "#{executable} hoptoad:deploy TO=#{rails_env} REVISION=#{current_revision} REPO=#{repository} USER=#{local_user}"
14
+ notify_command << " API_KEY=#{ENV['API_KEY']}" if ENV['API_KEY']
15
+ puts "Notifying Hoptoad of Deploy (#{notify_command})"
16
+ `#{notify_command}`
17
+ puts "Hoptoad Notification Complete."
18
+ end
19
+ end
20
+ end