ht_retro 0.0.1
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 +4 -0
- data/Gemfile +4 -0
- data/Rakefile +7 -0
- data/ht_retro.gemspec +26 -0
- data/lib/ht_retro/version.rb +5 -0
- data/lib/ht_retro.rb +155 -0
- data/spec/ht_retro_spec.rb +42 -0
- data/spec/spec_helper.rb +9 -0
- metadata +121 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/ht_retro.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
gem "hoptoad_notifier"
|
4
|
+
require "ht_retro/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "ht_retro"
|
8
|
+
s.version = Hoptoad::Retro::VERSION
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.authors = ["Jake Varghese"]
|
11
|
+
s.email = ["jake@flvorful.com"]
|
12
|
+
s.homepage = ""
|
13
|
+
s.summary = %q{HT retro}
|
14
|
+
s.description = %q{if you need it you will know :)}
|
15
|
+
|
16
|
+
s.rubyforge_project = "ht_retro"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
s.add_dependency "rails", "~> 3.0.6"
|
23
|
+
s.add_dependency "hoptoad_notifier", "~> 2.3"
|
24
|
+
s.add_development_dependency 'rspec', '~> 2.5'
|
25
|
+
|
26
|
+
end
|
data/lib/ht_retro.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
module HoptoadNotifier
|
2
|
+
HEADERS = {
|
3
|
+
"X-Hoptoad-Client-Name" =>"Hoptoad Notifier",
|
4
|
+
"Content-type" =>"application/x-yaml",
|
5
|
+
"X-Hoptoad-Client-Version" =>"1.2.4",
|
6
|
+
"Accept" =>"text/xml, application/xml"
|
7
|
+
}
|
8
|
+
|
9
|
+
class Sender
|
10
|
+
NOTICES_URI = '/notices/'.freeze
|
11
|
+
end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
def notify_or_ignore(exception, opts = {})
|
16
|
+
#debugger
|
17
|
+
notice = build_notice_for(exception, opts)
|
18
|
+
send_notice(notice) if configuration.public?
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def default_notice_options #:nodoc:
|
25
|
+
{
|
26
|
+
:api_key => HoptoadNotifier.configuration.api_key,
|
27
|
+
:error_message => 'Notification',
|
28
|
+
:backtrace => caller,
|
29
|
+
:request => {},
|
30
|
+
:session => {},
|
31
|
+
:environment => ENV.to_hash
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def send_notice(notice)
|
36
|
+
if configuration.public?
|
37
|
+
sender.send_to_hoptoad(notice)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def build_notice_for(exception, opts = {})
|
42
|
+
notice = normalize_notice(exception)
|
43
|
+
notice = clean_notice(notice)
|
44
|
+
notice = yamlize_notice(notice)
|
45
|
+
end
|
46
|
+
|
47
|
+
def yamlize_notice(notice)
|
48
|
+
notice.stringify_keys.to_yaml
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def normalize_notice(notice) #:nodoc:
|
53
|
+
case notice
|
54
|
+
when Hash
|
55
|
+
default_notice_options.merge(notice)
|
56
|
+
when Exception
|
57
|
+
default_notice_options.merge(exception_to_data(notice))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def clean_notice(notice)
|
62
|
+
notice[:backtrace] = clean_hoptoad_backtrace(notice[:backtrace])
|
63
|
+
if notice[:request].is_a?(Hash) && notice[:request][:params].is_a?(Hash)
|
64
|
+
notice[:request][:params] = filter_parameters(notice[:request][:params]) if respond_to?(:filter_parameters)
|
65
|
+
notice[:request][:params] = clean_hoptoad_params(notice[:request][:params])
|
66
|
+
end
|
67
|
+
if notice[:environment].is_a?(Hash)
|
68
|
+
notice[:environment] = filter_parameters(notice[:environment]) if respond_to?(:filter_parameters)
|
69
|
+
notice[:environment] = clean_hoptoad_environment(notice[:environment])
|
70
|
+
end
|
71
|
+
{:notice => clean_non_serializable_data(notice)}
|
72
|
+
end
|
73
|
+
|
74
|
+
def exception_to_data(exception)
|
75
|
+
data = {
|
76
|
+
:api_key => HoptoadNotifier.configuration.api_key,
|
77
|
+
:error_class => exception.class.name,
|
78
|
+
:error_message => "#{exception.class.name}: #{exception.message}",
|
79
|
+
:backtrace => exception.backtrace,
|
80
|
+
:environment => ENV.to_hash
|
81
|
+
}
|
82
|
+
|
83
|
+
if self.respond_to? :request
|
84
|
+
data[:request] = {
|
85
|
+
:params => request.parameters.to_hash,
|
86
|
+
:rails_root => File.expand_path(RAILS_ROOT),
|
87
|
+
:url => "#{request.protocol}#{request.host}#{request.request_uri}"
|
88
|
+
}
|
89
|
+
data[:environment].merge!(request.env.to_hash)
|
90
|
+
end
|
91
|
+
|
92
|
+
if self.respond_to? :session
|
93
|
+
data[:session] = {
|
94
|
+
:key => session.instance_variable_get("@session_id"),
|
95
|
+
:data => session.respond_to?(:to_hash) ?
|
96
|
+
session.to_hash :
|
97
|
+
session.instance_variable_get("@data")
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
data
|
102
|
+
end
|
103
|
+
|
104
|
+
def clean_hoptoad_backtrace backtrace #:nodoc:
|
105
|
+
if backtrace.to_a.size == 1
|
106
|
+
backtrace = backtrace.to_a.first.split(/\n\s*/)
|
107
|
+
end
|
108
|
+
|
109
|
+
filtered = backtrace.to_a.map do |line|
|
110
|
+
HoptoadNotifier.configuration.backtrace_filters.inject(line) do |line, proc|
|
111
|
+
proc.call(line)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
filtered.compact
|
116
|
+
end
|
117
|
+
|
118
|
+
def clean_hoptoad_params params #:nodoc:
|
119
|
+
params.each do |k, v|
|
120
|
+
params[k] = "[FILTERED]" if HoptoadNotifier.configuration.params_filters.any? do |filter|
|
121
|
+
k.to_s.match(/#{filter}/)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def clean_hoptoad_environment env #:nodoc:
|
127
|
+
env.each do |k, v|
|
128
|
+
env[k] = "[FILTERED]" if HoptoadNotifier.configuration.environment_filters.any? do |filter|
|
129
|
+
k.to_s.match(/#{filter}/)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def clean_non_serializable_data(data) #:nodoc:
|
135
|
+
case data
|
136
|
+
when Hash
|
137
|
+
data.inject({}) do |result, (key, value)|
|
138
|
+
result.update(key => clean_non_serializable_data(value))
|
139
|
+
end
|
140
|
+
when Fixnum, Array, String, Bignum
|
141
|
+
data
|
142
|
+
else
|
143
|
+
data.to_s
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def stringify_keys(hash) #:nodoc:
|
148
|
+
hash.inject({}) do |h, pair|
|
149
|
+
h[pair.first.to_s] = pair.last.is_a?(Hash) ? stringify_keys(pair.last) : pair.last
|
150
|
+
h
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe HoptoadNotifier do
|
4
|
+
describe '.notify_or_ignore' do
|
5
|
+
|
6
|
+
context 'with an exception' do
|
7
|
+
let(:api_url) { HoptoadNotifier::Sender.new(HoptoadNotifier.configuration).instance_eval { url }.to_s }
|
8
|
+
let(:build_notice) { HoptoadNotifier.instance_eval { build_notice_for(Exception.new("blah blah")) } }
|
9
|
+
|
10
|
+
|
11
|
+
it 'should send to the old url of /notices/' do
|
12
|
+
api_url.should match(/notices\//)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should not send to the new api url" do
|
16
|
+
api_url.should_not match(/notices_api/)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should send data to url in yaml form" do
|
20
|
+
build_notice.should match(/\-\-\-/)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should not send data xml form" do
|
24
|
+
build_notice.should_not match(/^\</)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should set headers to yaml content type" do
|
28
|
+
HoptoadNotifier::HEADERS["Content-type"].should match(/yaml/)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should not set headers to xml content type" do
|
32
|
+
HoptoadNotifier::HEADERS["Content-type"].should_not match(/xml/)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "the root of the notice should be 'notice'" do
|
36
|
+
HoptoadNotifier.instance_eval do
|
37
|
+
clean_notice(normalize_notice(Exception.new("blah blah")))
|
38
|
+
end.keys.should == [:notice]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ht_retro
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jake Varghese
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-05-13 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rails
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 11
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 6
|
34
|
+
version: 3.0.6
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: hoptoad_notifier
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 5
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 3
|
49
|
+
version: "2.3"
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: rspec
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 9
|
61
|
+
segments:
|
62
|
+
- 2
|
63
|
+
- 5
|
64
|
+
version: "2.5"
|
65
|
+
type: :development
|
66
|
+
version_requirements: *id003
|
67
|
+
description: if you need it you will know :)
|
68
|
+
email:
|
69
|
+
- jake@flvorful.com
|
70
|
+
executables: []
|
71
|
+
|
72
|
+
extensions: []
|
73
|
+
|
74
|
+
extra_rdoc_files: []
|
75
|
+
|
76
|
+
files:
|
77
|
+
- .gitignore
|
78
|
+
- Gemfile
|
79
|
+
- Rakefile
|
80
|
+
- ht_retro.gemspec
|
81
|
+
- lib/ht_retro.rb
|
82
|
+
- lib/ht_retro/version.rb
|
83
|
+
- spec/ht_retro_spec.rb
|
84
|
+
- spec/spec_helper.rb
|
85
|
+
has_rdoc: true
|
86
|
+
homepage: ""
|
87
|
+
licenses: []
|
88
|
+
|
89
|
+
post_install_message:
|
90
|
+
rdoc_options: []
|
91
|
+
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
hash: 3
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
version: "0"
|
112
|
+
requirements: []
|
113
|
+
|
114
|
+
rubyforge_project: ht_retro
|
115
|
+
rubygems_version: 1.6.2
|
116
|
+
signing_key:
|
117
|
+
specification_version: 3
|
118
|
+
summary: HT retro
|
119
|
+
test_files:
|
120
|
+
- spec/ht_retro_spec.rb
|
121
|
+
- spec/spec_helper.rb
|