airbrake-ruby 1.8.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bd52bfc797145037c7aa2c4ba9193b860b6a48f4
4
- data.tar.gz: 2314e4ba463a99416df04c209c2af159e6b384c8
3
+ metadata.gz: abc8e8ee3aac5103d60b365927bb65426a3118d4
4
+ data.tar.gz: 3b6721865f222b5dc2fd26c4456de385a0761ddf
5
5
  SHA512:
6
- metadata.gz: da90297990ebb7d1b8ba092750a666ef9324cdd6149195d4d143fb9d74d0963793a9696a403bc5011b8675bab3b8ff5c0c881061d89568e225ef0575a0ad0597
7
- data.tar.gz: e18299029cd90b600fab49d0867874a3e66f6950c3f882dc1b1c2ab3930846d9de59cb3673afb539926eb1c56c019955d1d3834b51b16d7dea366627e4836b6d
6
+ metadata.gz: 54a86bed42a190518bf82281abb3354fc74b951ffde54cc9b83c796c0d0cd8c8960bac7e1a635b614c6eebc8b985495646006c0ccfde4ed0f2df2221ba2c31c9
7
+ data.tar.gz: 20e077993ec39e48f2d548b5978f4815a181bd1ca51e23b88054d1f4d249dabfc5cb0247d9b9a5efb3800b2a6397d91b33865e0379548ae745d18356a56eab09
@@ -115,26 +115,20 @@ module Airbrake
115
115
  # existing notifier
116
116
  # @note There's no way to reconfigure a notifier
117
117
  # @note There's no way to read config values outside of this library
118
- def configure(notifier = :default)
118
+ def configure(notifier_name = :default)
119
119
  yield config = Airbrake::Config.new
120
120
 
121
- if configured?(notifier)
121
+ if @notifiers.key?(notifier_name)
122
122
  raise Airbrake::Error,
123
- "the '#{notifier}' notifier was already configured"
123
+ "the '#{notifier_name}' notifier was already configured"
124
124
  else
125
- @notifiers[notifier] = Notifier.new(config)
125
+ @notifiers[notifier_name] = Notifier.new(config)
126
126
  end
127
127
  end
128
128
 
129
- # @!macro proxy_method
130
- # @param [Symbol] notifier The name of the notifier
131
- # @raise [Airbrake::Error] if +notifier+ doesn't exist
132
- # @see Airbrake::Notifier#$0
133
-
134
129
  ##
135
130
  # Sends an exception to Airbrake asynchronously.
136
131
  #
137
- # @macro proxy_method
138
132
  # @example Sending an exception
139
133
  # Airbrake.notify(RuntimeError.new('Oops!'))
140
134
  # @example Sending a string
@@ -151,24 +145,21 @@ module Airbrake
151
145
  # tab in your project's dashboard
152
146
  # @return [Airbrake::Promise]
153
147
  # @see .notify_sync
154
- def notify(exception, params = {}, notifier = (no_arg = true && :default))
155
- deprecation_warn(__method__, notifier) unless no_arg
156
- call_notifier(notifier, __method__, exception, params)
148
+ def notify(exception, params = {})
149
+ @notifiers[:default] && @notifiers[:default].notify(exception, params)
157
150
  end
158
151
 
159
152
  ##
160
153
  # Sends an exception to Airbrake synchronously.
161
154
  #
162
- # @macro proxy_method
163
155
  # @example
164
156
  # Airbrake.notify_sync('App crashed!')
165
157
  # #=> {"id"=>"123", "url"=>"https://airbrake.io/locate/321"}
166
158
  #
167
159
  # @return [Hash{String=>String}] the reponse from the server
168
160
  # @see .notify
169
- def notify_sync(exception, params = {}, notifier = (no_arg = true && :default))
170
- deprecation_warn(__method__, notifier) unless no_arg
171
- call_notifier(notifier, __method__, exception, params)
161
+ def notify_sync(exception, params = {})
162
+ @notifiers[:default] && @notifiers[:default].notify_sync(exception, params)
172
163
  end
173
164
 
174
165
  ##
@@ -176,7 +167,6 @@ module Airbrake
176
167
  # useful if you want to ignore specific notices or filter the data the
177
168
  # notice contains.
178
169
  #
179
- # @macro proxy_method
180
170
  # @example Ignore all notices
181
171
  # Airbrake.add_filter(&:ignore!)
182
172
  # @example Ignore based on some condition
@@ -198,9 +188,8 @@ module Airbrake
198
188
  # @yieldreturn [void]
199
189
  # @return [void]
200
190
  # @note Once a filter was added, there's no way to delete it
201
- def add_filter(filter = nil, notifier = (no_arg = true && :default), &block)
202
- deprecation_warn(__method__, notifier) unless no_arg
203
- call_notifier(notifier, __method__, filter, &block)
191
+ def add_filter(filter = nil, &block)
192
+ @notifiers[:default] && @notifiers[:default].add_filter(filter, &block)
204
193
  end
205
194
 
206
195
  ##
@@ -208,7 +197,6 @@ module Airbrake
208
197
  # value only for a specific notice. When you're done modifying the notice,
209
198
  # send it with {.notify} or {.notify_sync}.
210
199
  #
211
- # @macro proxy_method
212
200
  # @example
213
201
  # notice = airbrake.build_notice('App crashed!')
214
202
  # notice[:params][:username] = user.name
@@ -219,9 +207,8 @@ module Airbrake
219
207
  # @param [Hash] params The additional params attached to the notice
220
208
  # @return [Airbrake::Notice] the notice built with help of the given
221
209
  # arguments
222
- def build_notice(exception, params = {}, notifier = (no_arg = true && :default))
223
- deprecation_warn(__method__, notifier) unless no_arg
224
- call_notifier(notifier, __method__, exception, params)
210
+ def build_notice(exception, params = {})
211
+ @notifiers[:default] && @notifiers[:default].build_notice(exception, params)
225
212
  end
226
213
 
227
214
  ##
@@ -229,22 +216,19 @@ module Airbrake
229
216
  # {.notify_sync} methods anymore. It also stops the notifier's worker
230
217
  # threads.
231
218
  #
232
- # @macro proxy_method
233
219
  # @example
234
220
  # Airbrake.close
235
221
  # Airbrake.notify('App crashed!') #=> raises Airbrake::Error
236
222
  #
237
223
  # @return [void]
238
- def close(notifier = (no_arg = true && :default))
239
- deprecation_warn(__method__, notifier) unless no_arg
240
- call_notifier(notifier, __method__)
224
+ def close
225
+ @notifiers[:default] && @notifiers[:default].close
241
226
  end
242
227
 
243
228
  ##
244
229
  # Pings the Airbrake Deploy API endpoint about the occurred deploy. This
245
230
  # method is used by the airbrake gem for various integrations.
246
231
  #
247
- # @macro proxy_method
248
232
  # @param [Hash{Symbol=>String}] deploy_params The params for the API
249
233
  # @option deploy_params [Symbol] :environment
250
234
  # @option deploy_params [Symbol] :username
@@ -252,33 +236,8 @@ module Airbrake
252
236
  # @option deploy_params [Symbol] :revision
253
237
  # @option deploy_params [Symbol] :version
254
238
  # @return [void]
255
- def create_deploy(deploy_params, notifier = (no_arg = true && :default))
256
- deprecation_warn(__method__, notifier) unless no_arg
257
- call_notifier(notifier, __method__, deploy_params)
258
- end
259
-
260
- private
261
-
262
- ##
263
- # Calls +method+ on +notifier+ with provided +args+. If +notifier+ is not
264
- # configured, returns nil.
265
- def call_notifier(notifier, method, *args, &block)
266
- return unless configured?(notifier)
267
- @notifiers[notifier].__send__(method, *args, &block)
268
- end
269
-
270
- def configured?(notifier)
271
- @notifiers.key?(notifier)
272
- end
273
-
274
- def deprecation_warn(method, notifier)
275
- warn(
276
- "#{LOG_LABEL} `Airbrake.#{method}` method signature was changed. " \
277
- "Passing `notifier_name` is deprecated and will be removed in the " \
278
- "next MAJOR release.\n" \
279
- "Use `Airbrake[:#{notifier}]` to access the :#{notifier} notifier " \
280
- "and call same methods directly on it."
281
- )
239
+ def create_deploy(deploy_params)
240
+ @notifiers[:default] && @notifiers[:default].create_deploy(deploy_params)
282
241
  end
283
242
  end
284
243
  end
@@ -128,8 +128,14 @@ module Airbrake
128
128
  # @param [Exception] exception
129
129
  # @return [Boolean]
130
130
  def self.java_exception?(exception)
131
- defined?(Java::JavaLang::Throwable) &&
132
- exception.is_a?(Java::JavaLang::Throwable)
131
+ if defined?(Java::JavaLang::Throwable) &&
132
+ exception.is_a?(Java::JavaLang::Throwable)
133
+ return true
134
+ end
135
+
136
+ return false unless exception.respond_to?(:backtrace)
137
+
138
+ (Patterns::JAVA =~ exception.backtrace.first) != nil
133
139
  end
134
140
 
135
141
  class << self
@@ -96,9 +96,9 @@ module Airbrake
96
96
  self.blacklist_keys = []
97
97
  self.whitelist_keys = []
98
98
 
99
- self.root_directory = (
99
+ self.root_directory = File.realpath(
100
100
  (defined?(Bundler) && Bundler.root) ||
101
- File.expand_path(Dir.pwd)
101
+ Dir.pwd
102
102
  )
103
103
 
104
104
  merge(user_config)
@@ -67,7 +67,7 @@ module Airbrake
67
67
 
68
68
  @payload = {
69
69
  errors: NestedException.new(exception, @config.logger).as_json,
70
- context: context(params),
70
+ context: context,
71
71
  environment: {},
72
72
  session: {},
73
73
  params: params
@@ -148,19 +148,8 @@ module Airbrake
148
148
 
149
149
  private
150
150
 
151
- def context(params)
152
- # DEPRECATION: remove the following code in the next MINOR release.
153
- if params.key?(:component) || params.key?(:action)
154
- @config.logger.warn(
155
- "#{LOG_LABEL} passing component/action keys in the params hash is " \
156
- "deprecated and will be removed soon. Please update your code to use " \
157
- "`Airbrake.build_notice` and set these keys like this:\n" \
158
- " notice[:context][:component] = 'mycomponent'\n" \
159
- " notice[:context][:action] = 'myaction'"
160
- )
161
- end
162
-
163
- ctx = {
151
+ def context
152
+ {
164
153
  version: @config.app_version,
165
154
  # We ensure that root_directory is always a String, so it can always be
166
155
  # converted to JSON in a predictable manner (when it's a Pathname and in
@@ -168,16 +157,9 @@ module Airbrake
168
157
  rootDirectory: @config.root_directory.to_s,
169
158
  environment: @config.environment,
170
159
 
171
- # DEPRECATION: remove the following code in the next MINOR release.
172
- # Legacy Airbrake v4 behaviour.
173
- component: params.delete(:component),
174
- action: params.delete(:action),
175
-
176
160
  # Make sure we always send hostname.
177
161
  hostname: HOSTNAME
178
- }
179
-
180
- ctx.merge(CONTEXT).delete_if { |_key, val| val.nil? || val.empty? }
162
+ }.merge(CONTEXT).delete_if { |_key, val| val.nil? || val.empty? }
181
163
  end
182
164
 
183
165
  def raise_if_ignored
@@ -9,8 +9,10 @@ module Airbrake
9
9
  # @since v1.7.0
10
10
  class Promise
11
11
  ##
12
+ # @api private
12
13
  # @return [Hash<String,String>] either successful response containing the
13
- # `id` key or unsuccessful response containing the `error` key
14
+ # +id+ key or unsuccessful response containing the +error+ key
15
+ # @note This is a non-blocking call!
14
16
  attr_reader :value
15
17
 
16
18
  def initialize
@@ -4,5 +4,5 @@
4
4
  module Airbrake
5
5
  ##
6
6
  # @return [String] the library version
7
- AIRBRAKE_RUBY_VERSION = '1.8.0'.freeze
7
+ AIRBRAKE_RUBY_VERSION = '2.0.0'.freeze
8
8
  end
@@ -45,31 +45,6 @@ RSpec.describe Airbrake do
45
45
  expect(a_request(:post, endpoint)).to have_been_made.once
46
46
  end
47
47
 
48
- context "given the notifier argument" do
49
- it "sends exceptions via that notifier, ignoring other ones" do
50
- bingo_string = StringIO.new
51
- bango_string = StringIO.new
52
-
53
- described_class.configure(:bingo) do |c|
54
- c.project_id = 113743
55
- c.project_key = 'fd04e13d806a90f96614ad8e529b2822'
56
- c.logger = Logger.new(bingo_string)
57
- end
58
-
59
- described_class.configure(:bango) do |c|
60
- c.project_id = 113743
61
- c.project_key = 'fd04e13d806a90f96614ad8e529b2822'
62
- c.logger = Logger.new(bango_string)
63
- end
64
-
65
- stub_request(:post, endpoint).to_return(status: 201, body: '{"id":1}')
66
-
67
- described_class.notify_sync('bango', {}, :bango)
68
- expect(bingo_string.string).to be_empty
69
- expect(bango_string.string).to match(/\*\*Airbrake: {"id"=>1}/)
70
- end
71
- end
72
-
73
48
  describe "clean backtrace" do
74
49
  shared_examples 'backtrace building' do |msg, argument|
75
50
  it(msg) do
@@ -106,26 +81,6 @@ RSpec.describe Airbrake do
106
81
  )
107
82
  end
108
83
  end
109
-
110
- context "special params" do
111
- it "sends context/component and doesn't contain params/component" do
112
- described_class.notify_sync('bingo', component: 'bango')
113
-
114
- expect(
115
- a_request(:post, endpoint).
116
- with(body: /"context":{.*"component":"bango".+"params":{}/)
117
- ).to have_been_made.once
118
- end
119
-
120
- it "sends context/action and doesn't contain params/action" do
121
- described_class.notify_sync('bingo', action: 'bango')
122
-
123
- expect(
124
- a_request(:post, endpoint).
125
- with(body: /"context":{.*"action":"bango".+"params":{}/)
126
- ).to have_been_made.once
127
- end
128
- end
129
84
  end
130
85
 
131
86
  describe ".configure" do
@@ -106,6 +106,32 @@ RSpec.describe Airbrake::Backtrace do
106
106
  end
107
107
  end
108
108
 
109
+ context "JRuby non-throwable exceptions" do
110
+ let(:backtrace) do
111
+ # rubocop:disable Metrics/LineLength
112
+ ['org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(org/postgresql/core/v3/ConnectionFactoryImpl.java:257)',
113
+ 'org.postgresql.core.ConnectionFactory.openConnection(org/postgresql/core/ConnectionFactory.java:65)',
114
+ 'org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(org/postgresql/jdbc2/AbstractJdbc2Connection.java:149)']
115
+ # rubocop:enable Metrics/LineLength
116
+ end
117
+
118
+ let(:parsed_backtrace) do
119
+ # rubocop:disable Metrics/LineLength
120
+ [{ file: 'org/postgresql/core/v3/ConnectionFactoryImpl.java', line: 257, function: 'org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl' },
121
+ { file: 'org/postgresql/core/ConnectionFactory.java', line: 65, function: 'org.postgresql.core.ConnectionFactory.openConnection' },
122
+ { file: 'org/postgresql/jdbc2/AbstractJdbc2Connection.java', line: 149, function: 'org.postgresql.jdbc2.AbstractJdbc2Connection.<init>' }]
123
+ # rubocop:enable Metrics/LineLength
124
+ end
125
+
126
+ let(:ex) { AirbrakeTestError.new.tap { |e| e.set_backtrace(backtrace) } }
127
+
128
+ it "returns a properly formatted array of hashes" do
129
+ expect(
130
+ described_class.parse(ex, Logger.new('/dev/null'))
131
+ ).to eq(parsed_backtrace)
132
+ end
133
+ end
134
+
109
135
  context "generic backtrace" do
110
136
  context "when function is absent" do
111
137
  # rubocop:disable Metrics/LineLength
@@ -52,7 +52,7 @@ RSpec.describe Airbrake::Config do
52
52
  end
53
53
 
54
54
  it "sets the default root_directory" do
55
- expect(config.root_directory).to eq Bundler.root
55
+ expect(config.root_directory).to eq Bundler.root.realpath.to_s
56
56
  end
57
57
 
58
58
  it "doesn't set the default environment" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airbrake-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airbrake Technologies, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-24 00:00:00.000000000 Z
11
+ date: 2017-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec