airbrake-ruby 1.4.4 → 1.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/airbrake-ruby/backtrace.rb +37 -7
- data/lib/airbrake-ruby/version.rb +3 -2
- data/spec/backtrace_spec.rb +35 -0
- metadata +2 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf59f6fb5b27ba10198dbb6c0dd4581239535ac3
|
4
|
+
data.tar.gz: 3d046a2369cfb7eabf7765e1728f81482ae0f039
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 981beea055633c18d1ccfe83f1e1651abb308536c155f18960103f00447d6572351281cd8992db7d1ea2ca8dce935480805916f86af5f964ef1a915fdc96f2aa
|
7
|
+
data.tar.gz: db5f9c67510d7a09d985ab4411edd8b148cf03e96c171e22dd2528a6189c5809722c4c555e1c3aeb76101a7ecdf91bf2dafe951d22a7a901cc02a6ce87bb7661
|
@@ -64,6 +64,22 @@ module Airbrake
|
|
64
64
|
)
|
65
65
|
\z/x
|
66
66
|
|
67
|
+
##
|
68
|
+
# @return [Regexp] the template that matches CoffeeScript backtraces
|
69
|
+
# usually coming from Rails & ExecJS
|
70
|
+
EXECJS_STACKFRAME_REGEXP = /\A
|
71
|
+
(?:
|
72
|
+
# Matches 'compile ((execjs):6692:19)'
|
73
|
+
(?<function>.+)\s\((?<file>.+):(?<line>\d+):\d+\)
|
74
|
+
|
|
75
|
+
# Matches 'bootstrap_node.js:467:3'
|
76
|
+
(?<file>.+):(?<line>\d+):\d+(?<function>)
|
77
|
+
|
|
78
|
+
# Matches the Ruby part of the backtrace
|
79
|
+
#{RUBY_STACKFRAME_REGEXP}
|
80
|
+
)
|
81
|
+
\z/x
|
82
|
+
|
67
83
|
##
|
68
84
|
# Parses an exception's backtrace.
|
69
85
|
#
|
@@ -73,13 +89,7 @@ module Airbrake
|
|
73
89
|
def self.parse(exception, logger)
|
74
90
|
return [] if exception.backtrace.nil? || exception.backtrace.none?
|
75
91
|
|
76
|
-
regexp =
|
77
|
-
JAVA_STACKFRAME_REGEXP
|
78
|
-
elsif oci_exception?(exception)
|
79
|
-
OCI_STACKFRAME_REGEXP
|
80
|
-
else
|
81
|
-
RUBY_STACKFRAME_REGEXP
|
82
|
-
end
|
92
|
+
regexp = best_regexp_for(exception)
|
83
93
|
|
84
94
|
exception.backtrace.map do |stackframe|
|
85
95
|
frame = match_frame(regexp, stackframe)
|
@@ -109,10 +119,30 @@ module Airbrake
|
|
109
119
|
class << self
|
110
120
|
private
|
111
121
|
|
122
|
+
def best_regexp_for(exception)
|
123
|
+
if java_exception?(exception)
|
124
|
+
JAVA_STACKFRAME_REGEXP
|
125
|
+
elsif oci_exception?(exception)
|
126
|
+
OCI_STACKFRAME_REGEXP
|
127
|
+
elsif execjs_exception?(exception)
|
128
|
+
EXECJS_STACKFRAME_REGEXP
|
129
|
+
else
|
130
|
+
RUBY_STACKFRAME_REGEXP
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
112
134
|
def oci_exception?(exception)
|
113
135
|
defined?(OCIError) && exception.is_a?(OCIError)
|
114
136
|
end
|
115
137
|
|
138
|
+
def execjs_exception?(exception)
|
139
|
+
return false unless defined?(ExecJS::RuntimeError)
|
140
|
+
return true if exception.is_a?(ExecJS::RuntimeError)
|
141
|
+
return true if exception.cause && exception.cause.is_a?(ExecJS::RuntimeError)
|
142
|
+
|
143
|
+
false
|
144
|
+
end
|
145
|
+
|
116
146
|
def stack_frame(match)
|
117
147
|
{ file: match[:file],
|
118
148
|
line: (Integer(match[:line]) if match[:line]),
|
data/spec/backtrace_spec.rb
CHANGED
@@ -190,5 +190,40 @@ RSpec.describe Airbrake::Backtrace do
|
|
190
190
|
).to eq(parsed_backtrace)
|
191
191
|
end
|
192
192
|
end
|
193
|
+
|
194
|
+
context "given an ExecJS backtrace" do
|
195
|
+
let(:bt) do
|
196
|
+
['compile ((execjs):6692:19)',
|
197
|
+
'eval (<anonymous>:1:10)',
|
198
|
+
'(execjs):6703:8',
|
199
|
+
'require../helpers.exports ((execjs):1:102)',
|
200
|
+
'Object.<anonymous> ((execjs):1:120)',
|
201
|
+
'Object.Module._extensions..js (module.js:550:10)',
|
202
|
+
'bootstrap_node.js:467:3',
|
203
|
+
"/opt/rubies/ruby-2.3.1/lib/ruby/2.3.0/benchmark.rb:308:in `realtime'"]
|
204
|
+
end
|
205
|
+
|
206
|
+
let(:ex) { ExecJS::RuntimeError.new.tap { |e| e.set_backtrace(bt) } }
|
207
|
+
|
208
|
+
let(:parsed_backtrace) do
|
209
|
+
[{ file: '(execjs)', line: 6692, function: 'compile' },
|
210
|
+
{ file: '<anonymous>', line: 1, function: 'eval' },
|
211
|
+
{ file: '(execjs)', line: 6703, function: '' },
|
212
|
+
{ file: '(execjs)', line: 1, function: 'require../helpers.exports' },
|
213
|
+
{ file: '(execjs)', line: 1, function: 'Object.<anonymous>' },
|
214
|
+
{ file: 'module.js', line: 550, function: 'Object.Module._extensions..js' },
|
215
|
+
{ file: 'bootstrap_node.js', line: 467, function: '' },
|
216
|
+
{ file: '/opt/rubies/ruby-2.3.1/lib/ruby/2.3.0/benchmark.rb',
|
217
|
+
line: 308,
|
218
|
+
function: 'realtime' }]
|
219
|
+
end
|
220
|
+
|
221
|
+
it "returns a properly formatted array of hashes" do
|
222
|
+
stub_const('ExecJS::RuntimeError', AirbrakeTestError)
|
223
|
+
expect(
|
224
|
+
described_class.parse(ex, Logger.new('/dev/null'))
|
225
|
+
).to eq(parsed_backtrace)
|
226
|
+
end
|
227
|
+
end
|
193
228
|
end
|
194
229
|
end
|
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.4.
|
4
|
+
version: 1.4.5
|
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: 2016-
|
11
|
+
date: 2016-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -160,4 +160,3 @@ test_files:
|
|
160
160
|
- spec/payload_truncator_spec.rb
|
161
161
|
- spec/spec_helper.rb
|
162
162
|
- spec/sync_sender_spec.rb
|
163
|
-
has_rdoc:
|