bugsnag 1.8.8 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ea6c2fbc0b0da06935be5460b6c2a8980f6efea
4
- data.tar.gz: 027990caadb74dc2e16a309bb426c3d305ef3fd9
3
+ metadata.gz: 8747ea8d79be63f2a884d5c595a4d0faf946e0bf
4
+ data.tar.gz: ddd5564d323f74a0d27d6adc89725ddab1d4dbdc
5
5
  SHA512:
6
- metadata.gz: 039998cab22c0fbe6e6ad0c7dbd59874b8892fce56fb356c5204dfb1f3cbd4e24794472c3c210253e0c0af9f9a814e99ce1d46efa20c2a8a181ff4f6507af3af
7
- data.tar.gz: 7bf8ea09e3bd673e3e5563510b3e3521c923fb4c0643319b4f50492981256d707e573d2b8f94c41b3cc054dd429ddeb1e1f9669f1538476cb5827a353a50be65
6
+ metadata.gz: e459123fbdc0e0fba0824e4f34bbf035144eda2e797ebf28652301af01f8f4274a42e287f3f666700b7c1e74a3acd284322a4358b489669f9a4a42e933ea9af5
7
+ data.tar.gz: 5ee52a9b0982be48dd089b2a2315c3fe8b79d7ca735e1968de0106ce79ee358600406cef1f60936ac3165f555ad3f3de57043dded54958a93a369612ecc5514f
@@ -1,6 +1,16 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 2.0.0
5
+ -----
6
+ - BREAKING: capistrano integration requires explicit configuration to avoid loading rails env (15x faster to notify)
7
+ - Sidekiq 3 support
8
+ - java.lang.Throwable support for jruby
9
+ - Show non-serializable objects as '[Object]' instead of 'null'.
10
+ - Fix delayed job 2.x
11
+ - Fix rake support
12
+ - Fix missing notifications caused by invalid utf8
13
+
4
14
  1.8.8
5
15
  -----
6
16
  - Prepare 'severity' feature for release
data/README.md CHANGED
@@ -148,7 +148,7 @@ You can read more about how callbacks work in the
148
148
  [Bugsnag Middleware](#bugsnag-middleware) documentation below.
149
149
 
150
150
 
151
- Sending Non-Fatal Exceptions
151
+ Sending Handled Exceptions
152
152
  ----------------------------
153
153
 
154
154
  If you would like to send non-fatal exceptions to Bugsnag, you can call
@@ -158,15 +158,36 @@ If you would like to send non-fatal exceptions to Bugsnag, you can call
158
158
  Bugsnag.notify(RuntimeError.new("Something broke"))
159
159
  ```
160
160
 
161
+ ### Custom Data
162
+
161
163
  You can also send additional meta-data with your exception:
162
164
 
163
165
  ```ruby
164
166
  Bugsnag.notify(RuntimeError.new("Something broke"), {
165
- :username => "bob-hoskins",
166
- :registered_user => true
167
+ :user => {
168
+ :username => "bob-hoskins",
169
+ :registered_user => true
170
+ }
171
+ })
172
+ ```
173
+
174
+ ### Severity
175
+
176
+ You can set the severity of an error in Bugsnag by including the severity option when
177
+ notifying bugsnag of the error,
178
+
179
+ ```ruby
180
+ Bugsnag.notify(RuntimeError.new("Something broke"), {
181
+ :severity => "error",
167
182
  })
168
183
  ```
169
184
 
185
+ Valid severities are `error`, `warning` and `info`.
186
+
187
+ Severity is displayed in the dashboard and can be used to filter the error list.
188
+ By default all crashes (or unhandled exceptions) are set to `error` and all
189
+ `Bugsnag.notify` calls default to `warning`.
190
+
170
191
  Rake Integration
171
192
  ----------------
172
193
 
@@ -256,7 +277,7 @@ apps it is automatically set to `RACK_ENV`. Otherwise the default is
256
277
  ###notify_release_stages
257
278
 
258
279
  By default, we will notify Bugsnag of exceptions that happen in any
259
- `release_stage`. If you would like to change which release stages
280
+ `release_stage`. If you would like to change which release stages
260
281
  notify Bugsnag of exceptions you can set `notify_release_stages`:
261
282
 
262
283
  ```ruby
@@ -493,11 +514,13 @@ introduced in.
493
514
  ### Using Capistrano
494
515
 
495
516
  If you use [capistrano](https://github.com/capistrano/capistrano) to deploy
496
- your apps, you can enable deploy tracking by adding the following line to your
517
+ your apps, you can enable deploy tracking by adding the integration to your
497
518
  app's `deploy.rb`:
498
519
 
499
520
  ```ruby
500
521
  require "bugsnag/capistrano"
522
+
523
+ set :bugsnag_api_key, "api_key_here"
501
524
  ```
502
525
 
503
526
  ### Using Rake
@@ -506,7 +529,7 @@ If you aren't using capistrano, you can run the following rake command from
506
529
  your deploy scripts.
507
530
 
508
531
  ```shell
509
- rake bugsnag:deploy BUGSNAG_REVISION=source-control-revision BUGSNAG_RELEASE_STAGE=production
532
+ rake bugsnag:deploy BUGSNAG_REVISION=source-control-revision BUGSNAG_RELEASE_STAGE=production BUGSNAG_API_KEY=api-key-here
510
533
  ```
511
534
 
512
535
  The bugsnag rake tasks will be automatically available for Rails 3/4
@@ -522,13 +545,12 @@ require "bugsnag/tasks"
522
545
  You can set the following environmental variables to override or specify
523
546
  additional deploy information:
524
547
 
548
+ - **BUGSNAG_API_KEY** -
549
+ Your Bugsnag API key (required).
525
550
  - **BUGSNAG_RELEASE_STAGE** -
526
551
  The release stage (eg, production, staging) currently being deployed.
527
552
  This is set automatically from your Bugsnag settings or rails/rack
528
553
  environment.
529
- - **BUGSNAG_API_KEY** -
530
- Your Bugsnag API key. This is set automatically from your Bugsnag
531
- settings in your app.
532
554
  - **BUGSNAG_REPOSITORY** -
533
555
  The repository from which you are deploying the code. This is set
534
556
  automatically if you are using capistrano.
@@ -576,6 +598,12 @@ end
576
598
  For this to work, include [Deferrable](http://eventmachine.rubyforge.org/EventMachine/Deferrable.html)
577
599
  in your `MyServer`, then whenever you want to raise an error, call `fail`.
578
600
 
601
+ ### Integrations
602
+
603
+ Bugsnag ruby works out of the box with Rails, Sidekiq, Resque, DelayedJob (3+), Mailman, Rake and Rack. It
604
+ should be easy to add support for other frameworks, either by sending a pull request here or adding a hook
605
+ to those projects.
606
+
579
607
  Reporting Bugs or Feature Requests
580
608
  ----------------------------------
581
609
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.8.8
1
+ 2.0.0
@@ -30,5 +30,6 @@ Gem::Specification.new do |s|
30
30
 
31
31
  s.add_development_dependency 'rspec'
32
32
  s.add_development_dependency 'rdoc'
33
+ s.add_development_dependency 'pry'
33
34
  end
34
35
 
@@ -5,6 +5,7 @@ require "bugsnag/configuration"
5
5
  require "bugsnag/meta_data"
6
6
  require "bugsnag/notification"
7
7
  require "bugsnag/helpers"
8
+ require "bugsnag/deploy"
8
9
 
9
10
  require "bugsnag/rack"
10
11
  require "bugsnag/railtie" if defined?(Rails::Railtie)
@@ -1,7 +1,7 @@
1
+ require "bugsnag/deploy"
2
+
1
3
  module Bugsnag
2
4
  module Capistrano
3
- ALLOWED_ENV_SETTINGS = %w{BUGSNAG_RELEASE_STAGE BUGSNAG_REPOSITORY BUGSNAG_REVISION BUGSNAG_BRANCH BUGSNAG_API_KEY BUGSNAG_APP_VERSION}
4
-
5
5
  def self.load_into(configuration)
6
6
  configuration.load do
7
7
  after "deploy", "bugsnag:deploy"
@@ -10,29 +10,18 @@ module Bugsnag
10
10
  namespace :bugsnag do
11
11
  desc "Notify Bugsnag that new production code has been deployed"
12
12
  task :deploy, :except => { :no_release => true }, :on_error => :continue do
13
- # Build the rake command
14
- rake = fetch(:rake, "rake")
15
- rails_env = fetch(:rails_env, "production")
16
- bugsnag_env = fetch(:bugsnag_env, rails_env)
17
- rake_command = "cd '#{current_path}' && RAILS_ENV=#{rails_env} #{rake} bugsnag:deploy"
18
-
19
- # Build the new environment to pass through to rake
20
- new_env = {
21
- "BUGSNAG_RELEASE_STAGE" => bugsnag_env,
22
- "BUGSNAG_REVISION" => fetch(:current_revision, nil),
23
- "BUGSNAG_REPOSITORY" => fetch(:repository, nil),
24
- "BUGSNAG_BRANCH" => fetch(:branch, nil),
25
- "BUGSNAG_API_KEY" => fetch(:bugsnag_api_key, nil)
26
- }.reject { |_, v| v.nil? }
27
-
28
- # Pass through any existing env variables
29
- ALLOWED_ENV_SETTINGS.each { |opt| new_env[opt] = ENV[opt] if ENV[opt] }
30
-
31
- # Append the env to the rake command
32
- rake_command << " #{new_env.map{|k,v| "#{k}=#{v}"}.join(" ")}"
33
-
34
- # Run the rake command (only on one server)
35
- run(rake_command, :once => true)
13
+ begin
14
+ Bugsnag::Deploy.notify({
15
+ :api_key => fetch(:bugsnag_api_key, ENV["BUGSNAG_API_KEY"]),
16
+ :release_stage => fetch(:rails_env, ENV["BUGSNAG_RELEASE_STAGE"] || "production"),
17
+ :revision => fetch(:current_revision, ENV["BUGSNAG_REPOSITORY"]),
18
+ :repository => fetch(:repository, ENV["BUGSNAG_REVISION"]),
19
+ :branch => fetch(:branch, ENV["BUGSNAG_BRANCH"],
20
+ :app_version => fetch(:app_version, ENV["BUGSNAG_APP_VERSION"]))
21
+ })
22
+ rescue
23
+ logger.important("Bugnsag deploy notification failed, #{$!.inspect}")
24
+ end
36
25
 
37
26
  logger.info "Bugsnag deploy notification complete."
38
27
  end
@@ -43,4 +32,3 @@ module Bugsnag
43
32
  end
44
33
 
45
34
  Bugsnag::Capistrano.load_into(Capistrano::Configuration.instance) if Capistrano::Configuration.instance
46
-
@@ -1,8 +1,15 @@
1
1
  require 'delayed_job'
2
2
 
3
+ # See Issue #99
4
+ unless defined?(Delayed::Plugins::Plugin)
5
+ raise LoadError, "bugsnag requires delayed_job > 3.x"
6
+ end
7
+
3
8
  unless defined? Delayed::Plugins::Bugsnag
4
9
  module Delayed
5
10
  module Plugins
11
+
12
+
6
13
  class Bugsnag < Plugin
7
14
  module Notify
8
15
  def error(job, error)
@@ -0,0 +1,45 @@
1
+ require "net/http"
2
+ require "uri"
3
+ require "bugsnag"
4
+
5
+ module Bugsnag
6
+ class Deploy
7
+ def self.notify(opts = {})
8
+ opts[:api_key] ||= Bugsnag.configuration.api_key
9
+ opts[:release_stage] ||= "production"
10
+ opts[:endpoint] ||= Bugsnag.configuration.endpoint
11
+ opts[:use_ssl] = Bugsnag.configuration.use_ssl if opts[:use_ssl] == nil
12
+ opts[:proxy_host] ||= Bugsnag.configuration.proxy_host
13
+ opts[:proxy_port] ||= Bugsnag.configuration.proxy_port
14
+ opts[:proxy_user] ||= Bugsnag.configuration.proxy_user
15
+ opts[:proxy_password] ||= Bugsnag.configuration.proxy_password
16
+
17
+ endpoint = (opts[:use_ssl] ? "https://" : "http://") + opts[:endpoint] + "/deploy"
18
+
19
+ parameters = {
20
+ "apiKey" => opts[:api_key],
21
+ "releaseStage" => opts[:release_stage],
22
+ "appVersion" => opts[:app_version],
23
+ "revision" => opts[:revision],
24
+ "repository" => opts[:repository],
25
+ "branch" => opts[:branch]
26
+ }.reject {|k,v| v == nil}
27
+
28
+ raise RuntimeError.new("No API key found when notifying of deploy") if !parameters["apiKey"] || parameters["apiKey"].empty?
29
+
30
+ uri = URI.parse(endpoint)
31
+ req = Net::HTTP::Post.new(uri.path)
32
+ req.set_form_data(parameters)
33
+ http = Net::HTTP.new(
34
+ uri.host,
35
+ uri.port,
36
+ opts[:proxy_host],
37
+ opts[:proxy_port],
38
+ opts[:proxy_user],
39
+ opts[:proxy_password]
40
+ )
41
+ http.use_ssl = true if opts[:use_ssl]
42
+ http.request(req)
43
+ end
44
+ end
45
+ end
@@ -23,7 +23,8 @@ module Bugsnag
23
23
  seen << obj
24
24
  end
25
25
 
26
- if obj.is_a?(Hash)
26
+ case obj
27
+ when Hash
27
28
  clean_hash = {}
28
29
  obj.each do |k,v|
29
30
  if filters && filters.any? {|f| k.to_s.include?(f.to_s)}
@@ -34,12 +35,26 @@ module Bugsnag
34
35
  end
35
36
  end
36
37
  clean_hash
37
- elsif obj.is_a?(Array) || obj.is_a?(Set)
38
+ when Array, Set
38
39
  obj.map { |el| cleanup_obj(el, filters, seen) }.compact
39
- elsif obj.is_a?(Integer) || obj.is_a?(Float) || obj.is_a?(String)
40
+ when Numeric
40
41
  obj
42
+ when String
43
+ if defined?(obj.encoding) && defined?(Encoding::UTF_8)
44
+ obj.encode('utf-8', obj.encoding == Encoding::UTF_8 ? 'binary' : obj.encoding, :invalid => :replace, :undef => :replace)
45
+ elsif defined?(Iconv)
46
+ Iconv.conv('UTF-8//IGNORE', 'UTF-8', obj) || obj
47
+ else
48
+ obj
49
+ end
41
50
  else
42
- obj.to_s unless obj.to_s =~ /#<.*>/
51
+ str = obj.to_s
52
+ # avoid leaking potentially sensitive data from objects' #inspect output
53
+ if str =~ /#<.*>/
54
+ '[OBJECT]'
55
+ else
56
+ str
57
+ end
43
58
  end
44
59
  end
45
60
 
@@ -11,8 +11,13 @@ module Bugsnag
11
11
  NOTIFIER_URL = "http://www.bugsnag.com"
12
12
 
13
13
  API_KEY_REGEX = /[0-9a-f]{32}/i
14
+
15
+ # e.g. "org/jruby/RubyKernel.java:1264:in `catch'"
14
16
  BACKTRACE_LINE_REGEX = /^((?:[a-zA-Z]:)?[^:]+):(\d+)(?::in `([^']+)')?$/
15
17
 
18
+ # e.g. "org.jruby.Ruby.runScript(Ruby.java:807)"
19
+ JAVA_BACKTRACE_REGEX = /^(.*)\((.*)(?::([0-9]+))?\)$/
20
+
16
21
  MAX_EXCEPTIONS_TO_UNWRAP = 5
17
22
 
18
23
  SUPPORTED_SEVERITIES = ["error", "warning", "info"]
@@ -75,16 +80,18 @@ module Bugsnag
75
80
  @exceptions = []
76
81
  ex = exception
77
82
  while ex != nil && !@exceptions.include?(ex) && @exceptions.length < MAX_EXCEPTIONS_TO_UNWRAP
83
+
78
84
  unless ex.is_a? Exception
79
85
  if ex.respond_to?(:to_exception)
80
86
  ex = ex.to_exception
81
87
  elsif ex.respond_to?(:exception)
82
88
  ex = ex.exception
83
89
  end
84
- unless ex.is_a? Exception
85
- Bugsnag.warn("Converting non-Exception to RuntimeError: #{ex.inspect}")
86
- ex = RuntimeError.new(ex.to_s)
87
- end
90
+ end
91
+
92
+ unless ex.is_a?(Exception) || (defined?(Java::JavaLang::Throwable) && ex.is_a?(Java::JavaLang::Throwable))
93
+ Bugsnag.warn("Converting non-Exception to RuntimeError: #{ex.inspect}")
94
+ ex = RuntimeError.new(ex.to_s)
88
95
  end
89
96
 
90
97
  @exceptions << ex
@@ -331,8 +338,14 @@ module Bugsnag
331
338
 
332
339
  def stacktrace(exception)
333
340
  (exception.backtrace || caller).map do |trace|
341
+
342
+ if trace.match(BACKTRACE_LINE_REGEX)
343
+ file, line_str, method = [$1, $2, $3]
344
+ elsif trace.match(JAVA_BACKTRACE_REGEX)
345
+ method, file, line_str = [$1, $2, $3]
346
+ end
347
+
334
348
  # Parse the stacktrace line
335
- _, file, line_str, method = trace.match(BACKTRACE_LINE_REGEX).to_a
336
349
 
337
350
  # Skip stacktrace lines inside lib/bugsnag
338
351
  next(nil) if file.nil? || file =~ %r{lib/bugsnag}
@@ -9,29 +9,38 @@ module Bugsnag::Rake
9
9
  alias_method :define_task, :bugsnag_define_task
10
10
  end
11
11
  end
12
+
13
+ Bugsnag.before_notify_callbacks << lambda {|notif|
14
+ task = Thread.current[:bugsnag_running_task]
15
+ next unless task
16
+
17
+ notif.add_tab(:rake_task, {
18
+ :name => task.name,
19
+ :description => task.full_comment,
20
+ :arguments => task.arg_description
21
+ })
22
+
23
+ notif.context ||= task.name
24
+ }
12
25
  end
13
26
 
14
27
  module ClassMethods
15
28
  def bugsnag_define_task(*args, &block)
16
- task = self.original_define_task *args do |*block_args|
29
+ task = self.original_define_task(*args) do |*block_args|
17
30
  begin
18
- Bugsnag.before_notify_callbacks << lambda {|notif|
19
- notif.add_tab(:rake_task, {
20
- :name => task.name,
21
- :description => task.full_comment,
22
- :arguments => task.arg_description
23
- })
24
- notif.context ||= task.name
25
- }
31
+ old_task = Thread.current[:bugsnag_running_task]
32
+ Thread.current[:bugsnag_running_task] = task
26
33
 
27
34
  yield(*block_args) if block_given?
28
35
  rescue Exception => e
29
36
  Bugsnag.auto_notify(e)
30
37
  raise
38
+ ensure
39
+ Thread.current[:bugsnag_running_task] = old_task
31
40
  end
32
41
  end
33
42
  end
34
43
  end
35
44
  end
36
45
 
37
- Rake::Task.send(:include, Bugsnag::Rake) if defined?(Rake::Task)
46
+ Rake::Task.send(:include, Bugsnag::Rake) if defined?(Rake::Task)
@@ -21,8 +21,16 @@ module Bugsnag
21
21
  end
22
22
  end
23
23
 
24
- ::Sidekiq.configure_server do |config|
25
- config.server_middleware do |chain|
26
- chain.add ::Bugsnag::Sidekiq
24
+ if ::Sidekiq::VERSION < '3'
25
+ ::Sidekiq.configure_server do |config|
26
+ config.server_middleware do |chain|
27
+ chain.add ::Bugsnag::Sidekiq
28
+ end
29
+ end
30
+ else
31
+ ::Sidekiq.configure_server do |config|
32
+ config.error_handlers << lambda do |ex, ctx|
33
+ Bugsnag.auto_notify(ex, :sidekiq => ctx, :context => "sidekiq##{ctx['queue']}")
34
+ end
27
35
  end
28
36
  end
@@ -24,34 +24,20 @@ namespace :bugsnag do
24
24
 
25
25
  desc 'Notify Bugsnag that new production code has been deployed'
26
26
  task :deploy do
27
- on primary(:app) do
28
- ALLOWED_ENV_SETTINGS = %w{BUGSNAG_RELEASE_STAGE BUGSNAG_REPOSITORY BUGSNAG_REVISION BUGSNAG_BRANCH BUGSNAG_API_KEY BUGSNAG_APP_VERSION}
29
-
30
- rails_env = fetch(:rails_env) || fetch(:stage)
31
- bugsnag_env = fetch(:bugsnag_env, rails_env)
32
-
33
- # Build the new environment to pass through to rake
34
- new_env = {
35
- "BUGSNAG_RELEASE_STAGE" => bugsnag_env,
36
- "BUGSNAG_REVISION" => fetch(:current_revision, nil),
37
- "BUGSNAG_REPOSITORY" => fetch(:repo_url, nil),
38
- "BUGSNAG_BRANCH" => fetch(:branch, nil),
39
- "BUGSNAG_API_KEY" => fetch(:bugsnag_api_key, nil)
40
- }.reject { |_, v| v.nil? }
41
-
42
- # Pass through any existing env variables
43
- ALLOWED_ENV_SETTINGS.each { |opt| new_env[opt] = ENV[opt] if ENV[opt] }
44
-
45
- within release_path do
46
- with rails_env: rails_env do
47
- params = "bugsnag:deploy #{new_env.map{|k,v| "#{k}=#{v}"}.join(" ")}"
48
- rake = fetch(:rake, "rake")
49
- execute rake, params
50
- end
51
- end
52
-
53
- info 'Bugsnag deploy notification complete.'
27
+ begin
28
+ Bugsnag::Deploy.notify({
29
+ :api_key => fetch(:bugsnag_api_key, ENV["BUGSNAG_API_KEY"]),
30
+ :release_stage => fetch(:bugsnag_env) || fetch(:rails_env) || fetch(:stage) || ENV["BUGSNAG_RELEASE_STAGE"] || "production",
31
+ :revision => fetch(:current_revision, ENV["BUGSNAG_REVISION"]),
32
+ :repository => fetch(:repo_url, ENV["BUGSNAG_REPOSITORY"]),
33
+ :branch => fetch(:branch, ENV["BUGSNAG_BRANCH"]),
34
+ :app_version => fetch(:app_version, ENV["BUGSNAG_APP_VERSION"])
35
+ })
36
+ rescue
37
+ important("Bugnsag deploy notification failed, #{$!.inspect}")
54
38
  end
39
+
40
+ info 'Bugsnag deploy notification complete.'
55
41
  end
56
42
 
57
43
  end
@@ -1,71 +1,23 @@
1
1
  require "bugsnag"
2
- require "pathname"
3
- require "httparty"
4
- require "multi_json"
5
- require "net/http"
6
- require "uri"
7
2
 
8
3
  namespace :bugsnag do
9
4
  desc "Notify Bugsnag of a new deploy."
10
5
  task :deploy do
11
- # Post the deploy notification
12
- begin
13
- require 'bugsnag'
14
-
15
- api_key = ENV["BUGSNAG_API_KEY"]
16
- releaseStage = ENV["BUGSNAG_RELEASE_STAGE"] || "production"
17
- appVersion = ENV["BUGSNAG_APP_VERSION"]
18
- revision = ENV["BUGSNAG_REVISION"]
19
- repository = ENV["BUGSNAG_REPOSITORY"]
20
- branch = ENV["BUGSNAG_BRANCH"]
21
-
22
- # TODO: more reliable ways to infer this are needed
23
- path = defined?(Rails.root) ? Rails.root : Pathname.pwd
24
- initializer = path + 'config/initializers/bugsnag'
25
- if File.exist?(initializer)
26
- require initializer
27
- else
28
- yml_filename = path + 'config/bugsnag.yml'
29
- config = YAML.load_file(yml_filename) if File.exists?(yml_filename)
30
- Bugsnag.configure(config[releaseStage] ? config[releaseStage] : config) if config
31
- end
32
-
33
- config = Bugsnag.configuration
34
-
35
- # Fetch and check the api key
36
- api_key ||= config.api_key
37
- raise RuntimeError.new("No API key found when notifying deploy") if !api_key || api_key.empty?
38
-
39
- endpoint = (config.use_ssl ? "https://" : "http://") \
40
- + (config.endpoint || Bugsnag::Configuration::DEFAULT_ENDPOINT) \
41
- + "/deploy"
42
-
43
- parameters = {
44
- "apiKey" => api_key,
45
- "releaseStage" => releaseStage,
46
- "appVersion" => appVersion,
47
- "revision" => revision,
48
- "repository" => repository,
49
- "branch" => branch
50
- }
51
-
52
- uri = URI.parse(endpoint)
53
- req = Net::HTTP::Post.new(uri.path)
54
- req.set_form_data(parameters)
55
- http = Net::HTTP.new(
56
- uri.host,
57
- uri.port,
58
- config.proxy_host,
59
- config.proxy_port,
60
- config.proxy_user,
61
- config.proxy_password
62
- )
63
- http.use_ssl = true if config.use_ssl
64
- http.request(req)
65
-
66
- rescue Exception => e
67
- Bugsnag.warn("Deploy notification failed, #{e.inspect}")
68
- end
6
+ api_key = ENV["BUGSNAG_API_KEY"]
7
+ release_stage = ENV["BUGSNAG_RELEASE_STAGE"]
8
+ app_version = ENV["BUGSNAG_APP_VERSION"]
9
+ revision = ENV["BUGSNAG_REVISION"]
10
+ repository = ENV["BUGSNAG_REPOSITORY"]
11
+ branch = ENV["BUGSNAG_BRANCH"]
12
+
13
+ Bugsnag::Deploy.notify({
14
+ :api_key => api_key,
15
+ :release_stage => release_stage,
16
+ :app_version => app_version,
17
+ :revision => revision,
18
+ :repository => repository,
19
+ :branch => branch
20
+ })
69
21
  end
70
22
 
71
23
  desc "Send a test exception to Bugsnag."
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
  require 'securerandom'
3
4
  require 'ostruct'
@@ -15,9 +16,19 @@ class Ruby21Exception < RuntimeError
15
16
  end
16
17
  end
17
18
 
19
+ class JRubyException
20
+ def self.raise!
21
+ new.gloops
22
+ end
23
+
24
+ def gloops
25
+ java.lang.System.out.printf(nil)
26
+ end
27
+ end
28
+
18
29
  describe Bugsnag::Notification do
19
- def notify_test_exception
20
- Bugsnag.notify(RuntimeError.new("test message"))
30
+ def notify_test_exception(*args)
31
+ Bugsnag.notify(RuntimeError.new("test message"), *args)
21
32
  end
22
33
 
23
34
  it "should contain an api_key if one is set" do
@@ -677,4 +688,32 @@ describe Bugsnag::Notification do
677
688
 
678
689
  notify_test_exception
679
690
  end
691
+
692
+ it "should fix invalid utf8" do
693
+ invalid_data = "fl\xc3ff"
694
+ invalid_data.force_encoding('BINARY') if invalid_data.respond_to?(:force_encoding)
695
+
696
+ expect(Bugsnag::Notification).to receive(:post) do |endpoint, opts|
697
+ expect(opts[:body]).to match(/fl�ff/) if defined?(Encoding::UTF_8)
698
+ end
699
+
700
+ notify_test_exception(:fluff => {:fluff => invalid_data})
701
+ end
702
+
703
+ if defined?(JRUBY_VERSION)
704
+
705
+ it "should work with java.lang.Throwables" do
706
+ expect(Bugsnag::Notification).to receive(:deliver_exception_payload) do |endpoint, payload|
707
+ expect(payload[:events][0][:exceptions][0][:errorClass]).to eq('Java::JavaLang::ArrayIndexOutOfBoundsException')
708
+ expect(payload[:events][0][:exceptions][0][:message]).to eq("2")
709
+ expect(payload[:events][0][:exceptions][0][:stacktrace].size).to be_gt(0)
710
+ end
711
+
712
+ begin
713
+ JRubyException.raise!
714
+ rescue
715
+ Bugsnag.notify $!
716
+ end
717
+ end
718
+ end
680
719
  end
metadata CHANGED
@@ -1,89 +1,103 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugsnag
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.8
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-11 00:00:00.000000000 Z
11
+ date: 2014-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: httparty
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "<"
31
+ - - <
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.0'
34
- - - ">="
34
+ - - '>='
35
35
  - !ruby/object:Gem::Version
36
36
  version: '0.6'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "<"
41
+ - - <
42
42
  - !ruby/object:Gem::Version
43
43
  version: '1.0'
44
- - - ">="
44
+ - - '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0.6'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - '>='
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - '>='
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rspec
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - '>='
66
66
  - !ruby/object:Gem::Version
67
67
  version: '0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - '>='
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: rdoc
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
79
+ - - '>='
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - ">="
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: pry
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
87
101
  - !ruby/object:Gem::Version
88
102
  version: '0'
89
103
  description: Ruby notifier for bugsnag.com
@@ -94,10 +108,10 @@ extra_rdoc_files:
94
108
  - LICENSE.txt
95
109
  - README.md
96
110
  files:
97
- - ".document"
98
- - ".gitignore"
99
- - ".rspec"
100
- - ".travis.yml"
111
+ - .document
112
+ - .gitignore
113
+ - .rspec
114
+ - .travis.yml
101
115
  - CHANGELOG.md
102
116
  - Gemfile
103
117
  - LICENSE.txt
@@ -111,6 +125,7 @@ files:
111
125
  - lib/bugsnag/configuration.rb
112
126
  - lib/bugsnag/delay/resque.rb
113
127
  - lib/bugsnag/delayed_job.rb
128
+ - lib/bugsnag/deploy.rb
114
129
  - lib/bugsnag/helpers.rb
115
130
  - lib/bugsnag/mailman.rb
116
131
  - lib/bugsnag/meta_data.rb
@@ -151,17 +166,17 @@ require_paths:
151
166
  - lib
152
167
  required_ruby_version: !ruby/object:Gem::Requirement
153
168
  requirements:
154
- - - ">="
169
+ - - '>='
155
170
  - !ruby/object:Gem::Version
156
171
  version: '0'
157
172
  required_rubygems_version: !ruby/object:Gem::Requirement
158
173
  requirements:
159
- - - ">="
174
+ - - '>='
160
175
  - !ruby/object:Gem::Version
161
176
  version: '0'
162
177
  requirements: []
163
178
  rubyforge_project:
164
- rubygems_version: 2.2.2
179
+ rubygems_version: 2.0.3
165
180
  signing_key:
166
181
  specification_version: 4
167
182
  summary: Ruby notifier for bugsnag.com