hockeybrake 0.0.2
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.
- data/.gitignore +10 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +26 -0
- data/README.md +26 -0
- data/hockeybrake.gemspec +21 -0
- data/lib/generators/hockeybrake/hockeybrake_generator.rb +7 -0
- data/lib/generators/hockeybrake/templates/initializer.rb +19 -0
- data/lib/hockeybrake.rb +20 -0
- data/lib/hockeybrake/configuration.rb +27 -0
- data/lib/hockeybrake/hockey_log.rb +55 -0
- data/lib/hockeybrake/hockey_sender.rb +63 -0
- data/lib/hockeybrake/hockey_sender_injector.rb +14 -0
- data/lib/hockeybrake/version.rb +4 -0
- metadata +91 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
hockeybrake (0.0.1)
|
|
5
|
+
airbrake (>= 3.1.2)
|
|
6
|
+
multipart-post (>= 1.1.5)
|
|
7
|
+
|
|
8
|
+
GEM
|
|
9
|
+
remote: http://rubygems.org/
|
|
10
|
+
specs:
|
|
11
|
+
activesupport (3.2.8)
|
|
12
|
+
i18n (~> 0.6)
|
|
13
|
+
multi_json (~> 1.0)
|
|
14
|
+
airbrake (3.1.2)
|
|
15
|
+
activesupport
|
|
16
|
+
builder
|
|
17
|
+
builder (3.0.0)
|
|
18
|
+
i18n (0.6.1)
|
|
19
|
+
multi_json (1.3.6)
|
|
20
|
+
multipart-post (1.1.5)
|
|
21
|
+
|
|
22
|
+
PLATFORMS
|
|
23
|
+
ruby
|
|
24
|
+
|
|
25
|
+
DEPENDENCIES
|
|
26
|
+
hockeybrake!
|
data/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# HockeyBrake
|
|
2
|
+
|
|
3
|
+
An extension for the amazing airbrake gem which routes crash reports to HockeyApp
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this to your Gemfile
|
|
8
|
+
```ruby
|
|
9
|
+
gem 'airbrake'
|
|
10
|
+
gem 'hockeybrake', :git => 'git://github.com/dei79/hockeybrake.git'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Execute the following command for your Rails app
|
|
14
|
+
```shell
|
|
15
|
+
rails g hockeybrake
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
|
|
20
|
+
Update hockeybrake.rb in config/initializers
|
|
21
|
+
|
|
22
|
+
## Contributing
|
|
23
|
+
|
|
24
|
+
* Fork the project
|
|
25
|
+
* Fix the issue
|
|
26
|
+
* Create pull request on github
|
data/hockeybrake.gemspec
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "hockeybrake/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "hockeybrake"
|
|
7
|
+
s.version = HockeyBrake::VERSION
|
|
8
|
+
s.authors = ["Dirk Eisenberg"]
|
|
9
|
+
s.email = ["dirk.eisenberg@gmail.com"]
|
|
10
|
+
s.homepage = 'http://rubygems.org/gems/hockeybrake'
|
|
11
|
+
s.summary = %q{An extension for the amazing airbrake gem which routes crash reports to HockeyApp}
|
|
12
|
+
s.description = %q{An extension for the amazing airbrake gem which routes crash reports to HockeyApp}
|
|
13
|
+
|
|
14
|
+
s.files = `git ls-files`.split("\n")
|
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
17
|
+
s.require_paths = ["lib"]
|
|
18
|
+
|
|
19
|
+
s.add_runtime_dependency(%q<airbrake>, [">= 3.1.2"])
|
|
20
|
+
s.add_runtime_dependency(%q<multipart-post>, [">= 1.1.5"])
|
|
21
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Airbrake.configure do |config|
|
|
2
|
+
# comment out if sending exceptions in the development environment
|
|
3
|
+
# is needed as well
|
|
4
|
+
# config.development_environments.delete("development")
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
HockeyBrake.configure do |config|
|
|
8
|
+
|
|
9
|
+
# the bundle id
|
|
10
|
+
config.app_bundle_id= "###YOUR BUNDLE IDENTIFIER FROM HOCKEYAPP###"
|
|
11
|
+
|
|
12
|
+
# The application ID in hockey app
|
|
13
|
+
config.app_id="###YOUR APP SECRET###"
|
|
14
|
+
|
|
15
|
+
# The application version, you can use the different environments
|
|
16
|
+
# as version, otherwise use the name of your version
|
|
17
|
+
config.app_version="#{Rails.env}"
|
|
18
|
+
|
|
19
|
+
end
|
data/lib/hockeybrake.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'hockeybrake/configuration'
|
|
2
|
+
require 'hockeybrake/hockey_log'
|
|
3
|
+
require 'hockeybrake/hockey_sender'
|
|
4
|
+
require 'hockeybrake/hockey_sender_injector'
|
|
5
|
+
|
|
6
|
+
module HockeyBrake
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
|
|
10
|
+
def configure
|
|
11
|
+
# receive the configuration
|
|
12
|
+
yield(configuration)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def configuration
|
|
16
|
+
@configuration ||= Configuration.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module HockeyBrake
|
|
2
|
+
class Configuration
|
|
3
|
+
|
|
4
|
+
# The application bundle id
|
|
5
|
+
attr_accessor :app_bundle_id
|
|
6
|
+
|
|
7
|
+
# The app id of the application
|
|
8
|
+
attr_accessor :app_id
|
|
9
|
+
|
|
10
|
+
# The app version
|
|
11
|
+
attr_accessor :app_version
|
|
12
|
+
|
|
13
|
+
# The service url
|
|
14
|
+
def hockey_url
|
|
15
|
+
"https://rink.hockeyapp.net/api/2/apps/#{app_id}/crashes/upload"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# convert to hash
|
|
19
|
+
def to_hash
|
|
20
|
+
h = Hash.new
|
|
21
|
+
h[:app_id] = self.app_id
|
|
22
|
+
h[:app_version] = self.app_version
|
|
23
|
+
h[:hockey_url] = self.hockey_url
|
|
24
|
+
h
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This class converts the given Airbrake XML data to the log format of the HockeyApp server
|
|
3
|
+
#
|
|
4
|
+
module HockeyBrake
|
|
5
|
+
class HockeyLog
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Generates a string which can be sent to the hockey service
|
|
9
|
+
#
|
|
10
|
+
def self.generate(data)
|
|
11
|
+
# the output
|
|
12
|
+
output = ""
|
|
13
|
+
|
|
14
|
+
# generate our time string
|
|
15
|
+
dtstr = Time.now.strftime("%a %b %d %H:%M:%S %Z %Y")
|
|
16
|
+
|
|
17
|
+
# write the header so that we have something to send
|
|
18
|
+
output += "Package: #{HockeyBrake.configuration.app_bundle_id}\n"
|
|
19
|
+
output += "Version: #{HockeyBrake.configuration.app_version}\n"
|
|
20
|
+
output += "Date: #{dtstr}\n"
|
|
21
|
+
|
|
22
|
+
# add the optional values if possible
|
|
23
|
+
begin
|
|
24
|
+
output += "Android: #{RUBY_PLATFORM}\n"
|
|
25
|
+
output += "Model: Ruby #{RUBY_VERSION} Rails #{Rails.version}\n"
|
|
26
|
+
rescue
|
|
27
|
+
# nothing to do
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# add the empty line
|
|
31
|
+
output += "\n"
|
|
32
|
+
|
|
33
|
+
# parse the XML and convert them to the HockeyApp format
|
|
34
|
+
begin
|
|
35
|
+
# xml parser
|
|
36
|
+
crashData = Hash.from_xml(data)
|
|
37
|
+
|
|
38
|
+
# write the first line
|
|
39
|
+
output += "#{crashData['notice']['error']['class']}: #{crashData['notice']['error']['message']}\n"
|
|
40
|
+
|
|
41
|
+
# parse the lines
|
|
42
|
+
lines = crashData['notice']['error']['backtrace']['line']
|
|
43
|
+
lines.each do |line|
|
|
44
|
+
class_name = File.basename(line['file'], ".rb").classify
|
|
45
|
+
output += " at #{class_name}##{line['method']}(#{line['file']}:#{line['number']})\n"
|
|
46
|
+
end
|
|
47
|
+
rescue
|
|
48
|
+
# nothing to do
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# return the output
|
|
52
|
+
output
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# using multipart post
|
|
2
|
+
require 'net/http/post/multipart'
|
|
3
|
+
|
|
4
|
+
module HockeyBrake
|
|
5
|
+
# Sends out the notice to HockeyApp
|
|
6
|
+
class HockeySender < Airbrake::Sender
|
|
7
|
+
|
|
8
|
+
# initialize the sender
|
|
9
|
+
def initialize
|
|
10
|
+
super(Airbrake.configuration.to_hash)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Sends the notice data off to HockeyApp for processing.
|
|
14
|
+
#
|
|
15
|
+
# @param [String] data The XML notice to be sent off
|
|
16
|
+
def send_to_airbrake(data)
|
|
17
|
+
|
|
18
|
+
# generate the log
|
|
19
|
+
logstr = HockeyLog.generate(data)
|
|
20
|
+
|
|
21
|
+
# store the data into temp file
|
|
22
|
+
file = Tempfile.new('hockey-exception')
|
|
23
|
+
file.write(logstr)
|
|
24
|
+
file.close
|
|
25
|
+
|
|
26
|
+
# buidl the url
|
|
27
|
+
url = URI.parse(HockeyBrake.configuration.hockey_url)
|
|
28
|
+
|
|
29
|
+
# send the request
|
|
30
|
+
response = begin
|
|
31
|
+
File.open(file.path) do |log|
|
|
32
|
+
|
|
33
|
+
req = Net::HTTP::Post::Multipart.new url.path,
|
|
34
|
+
"log" => UploadIO.new(log, 'application/octet-stream', "log.txt")
|
|
35
|
+
Net::HTTP.start(url.host, url.port, :use_ssl => url.scheme == 'https') do |http|
|
|
36
|
+
http.request(req)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
rescue *HTTP_ERRORS => e
|
|
40
|
+
log :error, "Unable to contact the HockeyApp server. HTTP Error=#{e}"
|
|
41
|
+
nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# remove the file
|
|
45
|
+
file.unlink
|
|
46
|
+
|
|
47
|
+
case response
|
|
48
|
+
when Net::HTTPSuccess then
|
|
49
|
+
log :info, "Success: #{response.class}", response
|
|
50
|
+
else
|
|
51
|
+
log :error, "Failure: #{response.class}", response
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if response && response.respond_to?(:body)
|
|
55
|
+
error_id = response.body.match(%r{<id[^>]*>(.*?)</id>})
|
|
56
|
+
error_id[1] if error_id
|
|
57
|
+
end
|
|
58
|
+
rescue => e
|
|
59
|
+
log :error, "[HockeyBrake::HockeySender#send_to_airbrake] Cannot send notification. Error: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}"
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module HockeyBrake
|
|
2
|
+
module HockeySenderInjector
|
|
3
|
+
def override_send_to_airbrake(data)
|
|
4
|
+
HockeyBrake::HockeySender.new().send_to_airbrake(data)
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Airbrake
|
|
10
|
+
class Sender
|
|
11
|
+
include HockeyBrake::HockeySenderInjector
|
|
12
|
+
alias_method :send_to_airbrake, :override_send_to_airbrake
|
|
13
|
+
end
|
|
14
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: hockeybrake
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.2
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Dirk Eisenberg
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2012-09-01 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: airbrake
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ! '>='
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: 3.1.2
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ! '>='
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: 3.1.2
|
|
30
|
+
- !ruby/object:Gem::Dependency
|
|
31
|
+
name: multipart-post
|
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
|
33
|
+
none: false
|
|
34
|
+
requirements:
|
|
35
|
+
- - ! '>='
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: 1.1.5
|
|
38
|
+
type: :runtime
|
|
39
|
+
prerelease: false
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ! '>='
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: 1.1.5
|
|
46
|
+
description: An extension for the amazing airbrake gem which routes crash reports
|
|
47
|
+
to HockeyApp
|
|
48
|
+
email:
|
|
49
|
+
- dirk.eisenberg@gmail.com
|
|
50
|
+
executables: []
|
|
51
|
+
extensions: []
|
|
52
|
+
extra_rdoc_files: []
|
|
53
|
+
files:
|
|
54
|
+
- .gitignore
|
|
55
|
+
- Gemfile
|
|
56
|
+
- Gemfile.lock
|
|
57
|
+
- README.md
|
|
58
|
+
- hockeybrake.gemspec
|
|
59
|
+
- lib/generators/hockeybrake/hockeybrake_generator.rb
|
|
60
|
+
- lib/generators/hockeybrake/templates/initializer.rb
|
|
61
|
+
- lib/hockeybrake.rb
|
|
62
|
+
- lib/hockeybrake/configuration.rb
|
|
63
|
+
- lib/hockeybrake/hockey_log.rb
|
|
64
|
+
- lib/hockeybrake/hockey_sender.rb
|
|
65
|
+
- lib/hockeybrake/hockey_sender_injector.rb
|
|
66
|
+
- lib/hockeybrake/version.rb
|
|
67
|
+
homepage: http://rubygems.org/gems/hockeybrake
|
|
68
|
+
licenses: []
|
|
69
|
+
post_install_message:
|
|
70
|
+
rdoc_options: []
|
|
71
|
+
require_paths:
|
|
72
|
+
- lib
|
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
74
|
+
none: false
|
|
75
|
+
requirements:
|
|
76
|
+
- - ! '>='
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: '0'
|
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
|
+
none: false
|
|
81
|
+
requirements:
|
|
82
|
+
- - ! '>='
|
|
83
|
+
- !ruby/object:Gem::Version
|
|
84
|
+
version: '0'
|
|
85
|
+
requirements: []
|
|
86
|
+
rubyforge_project:
|
|
87
|
+
rubygems_version: 1.8.23
|
|
88
|
+
signing_key:
|
|
89
|
+
specification_version: 3
|
|
90
|
+
summary: An extension for the amazing airbrake gem which routes crash reports to HockeyApp
|
|
91
|
+
test_files: []
|