sentry_breakpad 0.1.9 → 0.1.10
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 +4 -4
- data/.gitignore +0 -1
- data/.rubocop.yml +14 -0
- data/.travis.yml +12 -2
- data/Gemfile.lock +52 -0
- data/README.md +2 -2
- data/Rakefile +3 -3
- data/bin/console +4 -4
- data/lib/sentry_breakpad.rb +7 -6
- data/lib/sentry_breakpad/breakpad_parser.rb +90 -88
- data/lib/sentry_breakpad/hash_helper.rb +30 -0
- data/lib/sentry_breakpad/version.rb +1 -1
- data/sentry_breakpad.gemspec +14 -13
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57728a993a05e1ce50d874845c1a60eb5b6cb9d0
|
4
|
+
data.tar.gz: e9d3d50f2cb26f67fa8f693e1f5c02f065ce7824
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 794f61ff285ffa3f2645a815afa1d00357abd6fb656076e143b39a22f8a6443f24d0e0fa1fd664e5b8e6470126fa3e2a4357bed0952977c68e397e13349475f6
|
7
|
+
data.tar.gz: f64c38d31914d28a01cda09cf32b8c1b90ab8302572393b2d5ba5956fa7d64fa0b54386d8fe52a099fffd6febea46a989a409d53af014824afa56f75a8bf667d
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
@@ -1,4 +1,14 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
2
3
|
rvm:
|
3
|
-
-
|
4
|
-
|
4
|
+
- 1.9
|
5
|
+
- 1.9.3
|
6
|
+
- 2.0
|
7
|
+
- 2.1
|
8
|
+
- 2.2
|
9
|
+
- 2.3.3
|
10
|
+
- 2.4.0
|
11
|
+
before_install: gem update --remote bundler
|
12
|
+
script:
|
13
|
+
- bundle exec rspec
|
14
|
+
- bundle exec rubocop -c .rubocop.yml
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
sentry_breakpad (0.1.10)
|
5
|
+
sentry-raven (~> 2.2.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
ast (2.3.0)
|
11
|
+
diff-lcs (1.2.5)
|
12
|
+
faraday (0.10.0)
|
13
|
+
multipart-post (>= 1.2, < 3)
|
14
|
+
multipart-post (2.0.0)
|
15
|
+
parser (2.3.3.1)
|
16
|
+
ast (~> 2.2)
|
17
|
+
powerpack (0.1.1)
|
18
|
+
rainbow (2.1.0)
|
19
|
+
rspec (3.4.0)
|
20
|
+
rspec-core (~> 3.4.0)
|
21
|
+
rspec-expectations (~> 3.4.0)
|
22
|
+
rspec-mocks (~> 3.4.0)
|
23
|
+
rspec-core (3.4.2)
|
24
|
+
rspec-support (~> 3.4.0)
|
25
|
+
rspec-expectations (3.4.0)
|
26
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
27
|
+
rspec-support (~> 3.4.0)
|
28
|
+
rspec-mocks (3.4.1)
|
29
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
30
|
+
rspec-support (~> 3.4.0)
|
31
|
+
rspec-support (3.4.1)
|
32
|
+
rubocop (0.38.0)
|
33
|
+
parser (>= 2.3.0.6, < 3.0)
|
34
|
+
powerpack (~> 0.1)
|
35
|
+
rainbow (>= 1.99.1, < 3.0)
|
36
|
+
ruby-progressbar (~> 1.7)
|
37
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
38
|
+
ruby-progressbar (1.8.1)
|
39
|
+
sentry-raven (2.2.0)
|
40
|
+
faraday (>= 0.7.6, < 1.0)
|
41
|
+
unicode-display_width (1.1.1)
|
42
|
+
|
43
|
+
PLATFORMS
|
44
|
+
ruby
|
45
|
+
|
46
|
+
DEPENDENCIES
|
47
|
+
rspec
|
48
|
+
rubocop
|
49
|
+
sentry_breakpad!
|
50
|
+
|
51
|
+
BUNDLED WITH
|
52
|
+
1.13.6
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://travis-ci.org/wk8/sentry_breakpad)
|
2
|
+
|
1
3
|
# SentryBreakpad
|
2
4
|
|
3
5
|
So you've integrated [Google
|
@@ -139,7 +141,6 @@ SentryBreakpad.send_from_file('/path/to/report', {
|
|
139
141
|
```
|
140
142
|
|
141
143
|
The exhaustive list of all the extra information that can be passed can be found
|
142
|
-
at https://github.com/getsentry/raven-ruby/blob/0.15.3/lib/raven/event.rb#L31-L49.
|
143
144
|
|
144
145
|
Please note that all of the above assumes that `Raven` has been properly configured
|
145
146
|
(we use `Raven.client` to send the generated events)
|
@@ -154,7 +155,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
154
155
|
|
155
156
|
Bug reports and pull requests are welcome on GitHub at https://github.com/wk8/sentry_breakpad.
|
156
157
|
|
157
|
-
|
158
158
|
## License
|
159
159
|
|
160
160
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'sentry_breakpad'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require
|
10
|
+
# require 'pry'
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/lib/sentry_breakpad.rb
CHANGED
@@ -1,22 +1,23 @@
|
|
1
1
|
require 'sentry_breakpad/version'
|
2
2
|
require 'sentry_breakpad/breakpad_parser'
|
3
|
+
require 'sentry_breakpad/hash_helper'
|
3
4
|
|
4
5
|
require 'raven'
|
5
6
|
|
6
7
|
module SentryBreakpad
|
7
8
|
class << self
|
8
|
-
def send_from_file(file_path, extra_info = {}
|
9
|
-
send_event(BreakpadParser.from_file(file_path), extra_info
|
9
|
+
def send_from_file(file_path, extra_info = {})
|
10
|
+
send_event(BreakpadParser.from_file(file_path), extra_info)
|
10
11
|
end
|
11
12
|
|
12
|
-
def send_from_string(string, extra_info = {}
|
13
|
-
send_event(BreakpadParser.new(string), extra_info
|
13
|
+
def send_from_string(string, extra_info = {})
|
14
|
+
send_event(BreakpadParser.new(string), extra_info)
|
14
15
|
end
|
15
16
|
|
16
17
|
private
|
17
18
|
|
18
|
-
def send_event(parser, extra_info
|
19
|
-
Raven.client.send_event(parser.raven_event(extra_info
|
19
|
+
def send_event(parser, extra_info)
|
20
|
+
Raven.client.send_event(parser.raven_event(extra_info))
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
@@ -1,63 +1,59 @@
|
|
1
1
|
require 'raven'
|
2
2
|
|
3
3
|
module SentryBreakpad
|
4
|
-
# parses a breakpad report
|
5
|
-
class BreakpadParser
|
4
|
+
# parses a breakpad report and turns it into a Raven event
|
5
|
+
class BreakpadParser # rubocop:disable Metrics/ClassLength
|
6
6
|
def self.from_file(file_path)
|
7
|
-
new(File.
|
7
|
+
new(File.read(file_path))
|
8
8
|
end
|
9
9
|
|
10
10
|
def initialize(breakpad_report_content)
|
11
11
|
@breakpad_report_content = breakpad_report_content
|
12
|
-
@parsed = false
|
13
12
|
|
14
13
|
@message = nil
|
15
14
|
@tags = {}
|
16
15
|
@crashed_thread_stacktrace = []
|
16
|
+
# TODO: this is not leveraged yet, because the ruby-raven gem doesn't
|
17
|
+
# support this yet...
|
18
|
+
# come back to integrating other threads' stacktraces when
|
19
|
+
# https://github.com/getsentry/raven-ruby/issues/551
|
20
|
+
# is resolved
|
21
|
+
@other_threads_stacktraces = {}
|
17
22
|
@culprit = nil
|
18
23
|
@modules = {}
|
19
24
|
@extra = {}
|
20
|
-
end
|
21
25
|
|
22
|
-
|
23
|
-
hash = deep_merge(raven_event_hash(include_whole_report), extra_info)
|
24
|
-
Raven::Event.new(hash)
|
26
|
+
parse!
|
25
27
|
end
|
26
28
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@extra
|
29
|
+
def raven_event(extra_info = {})
|
30
|
+
hash = HashHelper.deep_merge!(base_event_hash, HashHelper.deep_symbolize_keys!(extra_info))
|
31
|
+
Raven::Event.new(hash).tap do |event|
|
32
|
+
unless @crashed_thread_stacktrace.empty?
|
33
|
+
event[:stacktrace] = { frames: @crashed_thread_stacktrace }
|
34
|
+
end
|
34
35
|
end
|
35
|
-
|
36
|
-
{
|
37
|
-
'message' => @message,
|
38
|
-
'tags' => @tags,
|
39
|
-
'culprit' => @culprit,
|
40
|
-
'modules' => @modules,
|
41
|
-
'extra' => extra,
|
42
|
-
'level' => 'fatal',
|
43
|
-
'logger' => 'breakpad',
|
44
|
-
'interfaces' => {
|
45
|
-
'stacktrace' => {
|
46
|
-
'frames' => @crashed_thread_stacktrace
|
47
|
-
}
|
48
|
-
}
|
49
|
-
}
|
50
36
|
end
|
51
37
|
|
52
38
|
private
|
53
39
|
|
54
|
-
def
|
55
|
-
|
40
|
+
def base_event_hash
|
41
|
+
{
|
42
|
+
message: @message,
|
43
|
+
tags: @tags,
|
44
|
+
culprit: @culprit,
|
45
|
+
modules: @modules,
|
46
|
+
extra: @extra,
|
47
|
+
level: 'fatal',
|
48
|
+
logger: 'breakpad'
|
49
|
+
}
|
50
|
+
end
|
56
51
|
|
52
|
+
def parse!
|
57
53
|
parse_lines(@breakpad_report_content.split("\n").reverse!)
|
58
54
|
end
|
59
55
|
|
60
|
-
def parse_lines(lines)
|
56
|
+
def parse_lines(lines) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength, Metrics/LineLength
|
61
57
|
until lines.empty?
|
62
58
|
case lines.last
|
63
59
|
when /^Operating system:/
|
@@ -68,8 +64,8 @@ module SentryBreakpad
|
|
68
64
|
parse_crash_reason(lines.pop)
|
69
65
|
when /^Crash address:/
|
70
66
|
parse_crash_address(lines.pop)
|
71
|
-
when /^Thread ([0-9]+)
|
72
|
-
|
67
|
+
when /^Thread ([0-9]+)(\s+\(crashed\))?/
|
68
|
+
parse_thread_stacktrace(lines, Regexp.last_match[1].to_i, !Regexp.last_match[2].nil?)
|
73
69
|
when /^Loaded modules:/
|
74
70
|
parse_loaded_modules(lines)
|
75
71
|
else
|
@@ -82,7 +78,15 @@ module SentryBreakpad
|
|
82
78
|
# Operating system: Windows NT
|
83
79
|
# 6.1.7601 Service Pack 1
|
84
80
|
def parse_operating_system(lines)
|
85
|
-
parse_indented_section(lines, 'Operating system:',
|
81
|
+
parse_indented_section(lines, 'Operating system:', :os)
|
82
|
+
|
83
|
+
if @tags[:os]
|
84
|
+
@extra[:server] ||= {}
|
85
|
+
@extra[:server][:os] = {
|
86
|
+
name: @tags[:os],
|
87
|
+
version: @tags[:os_full]
|
88
|
+
}
|
89
|
+
end
|
86
90
|
end
|
87
91
|
|
88
92
|
# Parses something of the form
|
@@ -90,7 +94,7 @@ module SentryBreakpad
|
|
90
94
|
# GenuineIntel family 6 model 70 stepping 1
|
91
95
|
# 4 CPUs
|
92
96
|
def parse_cpu(lines)
|
93
|
-
parse_indented_section(lines, 'CPU:',
|
97
|
+
parse_indented_section(lines, 'CPU:', :cpu)
|
94
98
|
end
|
95
99
|
|
96
100
|
def parse_indented_section(lines, prefix, tag_name)
|
@@ -102,7 +106,7 @@ module SentryBreakpad
|
|
102
106
|
end
|
103
107
|
|
104
108
|
@tags[tag_name] = short
|
105
|
-
@tags["#{tag_name}_full"] = long
|
109
|
+
@tags["#{tag_name}_full".to_sym] = long
|
106
110
|
end
|
107
111
|
|
108
112
|
# Parses a single line like
|
@@ -110,12 +114,12 @@ module SentryBreakpad
|
|
110
114
|
def parse_crash_reason(line)
|
111
115
|
reason = remove_prefix(line, 'Crash reason:')
|
112
116
|
|
113
|
-
if @message.nil?
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
117
|
+
@message = if @message.nil?
|
118
|
+
reason
|
119
|
+
else
|
120
|
+
# we parse the crashed thread first
|
121
|
+
"#{reason} at #{@message}"
|
122
|
+
end
|
119
123
|
end
|
120
124
|
|
121
125
|
# Parses a single line like
|
@@ -123,7 +127,7 @@ module SentryBreakpad
|
|
123
127
|
def parse_crash_address(line)
|
124
128
|
address = remove_prefix(line, 'Crash address:')
|
125
129
|
|
126
|
-
@extra[
|
130
|
+
@extra[:crash_address] = address
|
127
131
|
end
|
128
132
|
|
129
133
|
def remove_prefix(line, prefix)
|
@@ -131,8 +135,9 @@ module SentryBreakpad
|
|
131
135
|
line.strip
|
132
136
|
end
|
133
137
|
|
134
|
-
BACKTRACE_LINE_REGEX = /^\s*([0-9]+)\s+(.*)\s+(?:\[(([^ ]+)\s+:\s+([0-9]+))\s+\+\s+0x[0-9a-f]+\]|\+\s+0x[0-9a-f]+)\s*$/
|
138
|
+
BACKTRACE_LINE_REGEX = /^\s*([0-9]+)\s+(.*)\s+(?:\[(([^ ]+)\s+:\s+([0-9]+))\s+\+\s+0x[0-9a-f]+\]|\+\s+0x[0-9a-f]+)\s*$/ # rubocop:disable Metrics/LineLength
|
135
139
|
|
140
|
+
# rubocop:disable Metrics/LineLength
|
136
141
|
# Parses something of the form
|
137
142
|
# Thread 0 (crashed)
|
138
143
|
# 0 ETClient.exe!QString::~QString() [qstring.h : 992 + 0xa]
|
@@ -182,48 +187,58 @@ module SentryBreakpad
|
|
182
187
|
# 14 ETClient.exe!WinMain + 0x21358
|
183
188
|
# eip = 0x015bb068 esp = 0x0018d690 ebp = 0x0018d7f8
|
184
189
|
# Found by: call frame info
|
185
|
-
|
190
|
+
# rubocop:enable Metrics/LineLength
|
191
|
+
def parse_thread_stacktrace(lines, thread_id, is_crashed_thread)
|
186
192
|
# remove the 1st line
|
187
193
|
lines.pop
|
188
194
|
|
189
195
|
stacktrace = []
|
190
196
|
process_matching_lines(lines, BACKTRACE_LINE_REGEX) do |match|
|
191
|
-
|
192
|
-
|
193
|
-
filename = match[4] || 'unknown'
|
194
|
-
lineno = match[5]
|
195
|
-
|
196
|
-
frame = {
|
197
|
-
'filename' => filename,
|
198
|
-
'function' => function
|
199
|
-
}
|
200
|
-
frame['lineno'] = lineno.to_i if lineno
|
197
|
+
stacktrace << parse_crashed_thread_stacktrace_line(match, is_crashed_thread)
|
198
|
+
end
|
201
199
|
|
202
|
-
|
200
|
+
# sentry wants their stacktrace with the oldest frame first
|
201
|
+
stacktrace = stacktrace.reverse
|
203
202
|
|
204
|
-
|
205
|
-
|
203
|
+
if is_crashed_thread
|
204
|
+
@crashed_thread_stacktrace = stacktrace
|
205
|
+
@extra[:crashed_thread_id] = thread_id
|
206
|
+
else
|
207
|
+
@other_threads_stacktraces[thread_id] = stacktrace
|
208
|
+
end
|
209
|
+
end
|
206
210
|
|
207
|
-
|
208
|
-
|
211
|
+
def parse_crashed_thread_stacktrace_line(match, is_crashed_thread)
|
212
|
+
frame_nb = match[1]
|
213
|
+
function = match[2]
|
214
|
+
filename = match[4] || 'unknown'
|
215
|
+
lineno = match[5]
|
209
216
|
|
210
|
-
|
211
|
-
@message = message_tail
|
212
|
-
else
|
213
|
-
# already parsed the crash reason
|
214
|
-
@message += " at #{message_tail}"
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
217
|
+
parse_culprit_and_message(function, match[3]) if is_crashed_thread && frame_nb.to_i == 0
|
218
218
|
|
219
|
-
|
220
|
-
|
219
|
+
{
|
220
|
+
filename: filename,
|
221
|
+
function: function
|
222
|
+
}.tap { |frame| frame[:lineno] = lineno.to_i if lineno }
|
223
|
+
end
|
224
|
+
|
225
|
+
def parse_culprit_and_message(function, file_name_and_lineno)
|
226
|
+
@culprit = function
|
221
227
|
|
222
|
-
|
228
|
+
message_tail = function
|
229
|
+
message_tail += " (#{file_name_and_lineno})" if file_name_and_lineno
|
230
|
+
|
231
|
+
if @message.nil?
|
232
|
+
@message = message_tail
|
233
|
+
else
|
234
|
+
# already parsed the crash reason
|
235
|
+
@message += " at #{message_tail}"
|
236
|
+
end
|
223
237
|
end
|
224
238
|
|
225
239
|
MODULE_LINE_REGEX = /0x[0-9a-f]+\s+-\s+0x[0-9a-f]+\s+([^ ]+)\s+([^ ]+)/
|
226
240
|
|
241
|
+
# rubocop:disable Metrics/LineLength
|
227
242
|
# Parses something of the form
|
228
243
|
# Loaded modules:
|
229
244
|
# 0x00d70000 - 0x01b39fff ETClient.exe ??? (main)
|
@@ -278,6 +293,7 @@ module SentryBreakpad
|
|
278
293
|
# 0x76f90000 - 0x76feffff imm32.dll 6.1.7601.17514
|
279
294
|
# 0x76ff0000 - 0x77016fff cfgmgr32.dll 6.1.7601.17621
|
280
295
|
# 0x77420000 - 0x7759ffff ntdll.dll 6.1.7601.19110 (WARNING: No symbols, wntdll.pdb, 992AA396746C4D548F7F497DD63B4EEC2)
|
296
|
+
# rubocop:enable Metrics/LineLength
|
281
297
|
def parse_loaded_modules(lines)
|
282
298
|
# remove the 1st line
|
283
299
|
lines.pop
|
@@ -290,7 +306,7 @@ module SentryBreakpad
|
|
290
306
|
end
|
291
307
|
end
|
292
308
|
|
293
|
-
def process_matching_lines(lines, regex, &
|
309
|
+
def process_matching_lines(lines, regex, &_blk)
|
294
310
|
loop do
|
295
311
|
line = lines.pop
|
296
312
|
line.strip! if line
|
@@ -301,19 +317,5 @@ module SentryBreakpad
|
|
301
317
|
yield(match) if match
|
302
318
|
end
|
303
319
|
end
|
304
|
-
|
305
|
-
# merges hash2 into hash1, recursively
|
306
|
-
# wish ActiveSupport was around...
|
307
|
-
def deep_merge(hash1, hash2)
|
308
|
-
hash2.each do |key, value|
|
309
|
-
if hash1.key?(value) && hash1[key].is_a?(Hash) && value.is_a?(Hash)
|
310
|
-
hash1[key] = deep_merge(hash1[key], value)
|
311
|
-
else
|
312
|
-
hash1[key] = value
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
hash1
|
317
|
-
end
|
318
320
|
end
|
319
321
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Seemed somewhat silly to pull ActiveSupport as a dependency for just a couple
|
2
|
+
# of methods...
|
3
|
+
|
4
|
+
module SentryBreakpad
|
5
|
+
class HashHelper
|
6
|
+
class << self
|
7
|
+
# merges hash2 into hash1, recursively
|
8
|
+
def deep_merge!(hash1, hash2)
|
9
|
+
hash2.each do |key, value|
|
10
|
+
hash1[key] = if hash1.key?(key) && hash1[key].is_a?(Hash) && value.is_a?(Hash)
|
11
|
+
deep_merge!(hash1[key], value)
|
12
|
+
else
|
13
|
+
value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
hash1
|
18
|
+
end
|
19
|
+
|
20
|
+
# recursively symbolizes a hash's keys
|
21
|
+
def deep_symbolize_keys!(hash)
|
22
|
+
hash.each_with_object({}) do |(key, value), new_hash|
|
23
|
+
new_key = key.respond_to?(:to_sym) ? key.to_sym : key
|
24
|
+
new_value = value.is_a?(Hash) ? deep_symbolize_keys!(value) : value
|
25
|
+
new_hash[new_key] = new_value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/sentry_breakpad.gemspec
CHANGED
@@ -4,21 +4,22 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'sentry_breakpad/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
7
|
+
spec.name = 'sentry_breakpad'
|
8
|
+
spec.version = SentryBreakpad::VERSION
|
9
|
+
spec.authors = ['Jean Rouge']
|
10
|
+
spec.email = ['jer329@cornell.edu']
|
11
11
|
|
12
|
-
spec.summary
|
13
|
-
spec.homepage
|
14
|
-
spec.license
|
12
|
+
spec.summary = "Converts Google breakpad's reports into Sentry/Raven events"
|
13
|
+
spec.homepage = 'https://github.com/wk8/sentry_breakpad'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
|
-
spec.files
|
17
|
-
spec.bindir
|
18
|
-
spec.executables
|
19
|
-
spec.require_paths = [
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = 'exe'
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency
|
21
|
+
spec.add_dependency 'sentry-raven', '~> 2.2.0'
|
22
22
|
|
23
|
-
spec.add_development_dependency
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'rubocop'
|
24
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sentry_breakpad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Rouge
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sentry-raven
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
description:
|
42
56
|
email:
|
43
57
|
- jer329@cornell.edu
|
@@ -47,8 +61,10 @@ extra_rdoc_files: []
|
|
47
61
|
files:
|
48
62
|
- ".gitignore"
|
49
63
|
- ".rspec"
|
64
|
+
- ".rubocop.yml"
|
50
65
|
- ".travis.yml"
|
51
66
|
- Gemfile
|
67
|
+
- Gemfile.lock
|
52
68
|
- LICENSE.txt
|
53
69
|
- README.md
|
54
70
|
- Rakefile
|
@@ -56,6 +72,7 @@ files:
|
|
56
72
|
- bin/setup
|
57
73
|
- lib/sentry_breakpad.rb
|
58
74
|
- lib/sentry_breakpad/breakpad_parser.rb
|
75
|
+
- lib/sentry_breakpad/hash_helper.rb
|
59
76
|
- lib/sentry_breakpad/version.rb
|
60
77
|
- sentry_breakpad.gemspec
|
61
78
|
homepage: https://github.com/wk8/sentry_breakpad
|