airbrake-ruby 1.8.0 → 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: 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