toadhopper 2.0 → 2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.travis.yml +17 -0
- data/CHANGELOG.md +23 -0
- data/Gemfile +4 -0
- data/README.md +67 -1
- data/lib/toadhopper.rb +122 -17
- data/lib/toadhopper/capistrano.rb +9 -3
- data/lib/toadhopper_exception.rb +1 -0
- data/resources/README.md +13 -0
- data/resources/ca-bundle.crt +3376 -0
- data/test/helper.rb +39 -2
- data/test/resources/airbrake_2_2.xsd +78 -0
- data/test/test_deploy_tracking.rb +62 -6
- data/test/test_filtering.rb +3 -2
- data/test/test_initialization.rb +83 -0
- data/test/test_posting.rb +76 -7
- data/toadhopper.gemspec +3 -1
- metadata +101 -55
data/test/helper.rb
CHANGED
@@ -2,13 +2,50 @@ require 'bundler/setup'
|
|
2
2
|
require 'test/unit'
|
3
3
|
require 'fakeweb'
|
4
4
|
require 'toadhopper'
|
5
|
+
require 'nokogiri'
|
5
6
|
|
6
|
-
|
7
|
+
def reset_test_env
|
8
|
+
FakeWeb.clean_registry
|
9
|
+
FakeWeb.allow_net_connect = false
|
10
|
+
end
|
7
11
|
|
8
12
|
def toadhopper
|
9
|
-
|
13
|
+
api_key = toadhopper_api_key || 'test api key'
|
14
|
+
Toadhopper.new api_key, toadhopper_args
|
15
|
+
end
|
16
|
+
|
17
|
+
def toadhopper_api_key
|
18
|
+
ENV['AIRBRAKE_API_KEY'] || ENV['HOPTOAD_API_KEY']
|
19
|
+
end
|
20
|
+
|
21
|
+
def toadhopper_args
|
22
|
+
ENV['AIRBRAKE_FULL_TEST'] ? {:notify_host => "https://#{Toadhopper::DEFAULT_DOMAIN}"} : {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert_valid_airbrake_xml(body)
|
26
|
+
# prepare schema for validation
|
27
|
+
xsd_path = File.expand_path File.join('resources', 'airbrake_2_2.xsd'),
|
28
|
+
File.dirname(__FILE__)
|
29
|
+
xsd = Nokogiri::XML::Schema File.read xsd_path
|
30
|
+
# validate xml document
|
31
|
+
#doc = Nokogiri::XML body
|
32
|
+
doc = Nokogiri::XML body
|
33
|
+
assert xsd.valid?(doc), "The document is not valid:\n#{body}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def posting_response_good
|
37
|
+
"<notice>
|
38
|
+
<id>d87i3bc8-1854-f937-184b-e2d93711cad3</id>
|
39
|
+
<url>#{Toadhopper::DEFAULT_NOTIFY_HOST}/locate/d87i3bc8-1854-f937-184b-e2d93711cad3</url>
|
40
|
+
</notice>"
|
41
|
+
end
|
42
|
+
|
43
|
+
def posting_response_bad_apikey
|
44
|
+
'We could not find a project with API key of foo. Please double check your airbrake configuration.'
|
10
45
|
end
|
11
46
|
|
12
47
|
def error
|
13
48
|
begin; raise "Kaboom!"; rescue => e; e end
|
14
49
|
end
|
50
|
+
|
51
|
+
reset_test_env
|
@@ -0,0 +1,78 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
3
|
+
|
4
|
+
<xs:element name="notice">
|
5
|
+
<xs:complexType>
|
6
|
+
<xs:all>
|
7
|
+
<xs:element name="api-key" type="xs:string"/>
|
8
|
+
<xs:element name="notifier" type="notifier"/>
|
9
|
+
<xs:element name="error" type="error"/>
|
10
|
+
<xs:element name="request" type="request" minOccurs="0"/>
|
11
|
+
<xs:element name="server-environment" type="serverEnvironment"/>
|
12
|
+
</xs:all>
|
13
|
+
<xs:attribute name="version" type="xs:string" use="required"/>
|
14
|
+
</xs:complexType>
|
15
|
+
</xs:element>
|
16
|
+
|
17
|
+
<xs:complexType name="notifier">
|
18
|
+
<xs:all>
|
19
|
+
<xs:element name="name" type="xs:string"/>
|
20
|
+
<xs:element name="version" type="xs:string"/>
|
21
|
+
<xs:element name="url" type="xs:string"/>
|
22
|
+
</xs:all>
|
23
|
+
</xs:complexType>
|
24
|
+
|
25
|
+
<xs:complexType name="error">
|
26
|
+
<xs:all>
|
27
|
+
<xs:element name="class" type="xs:string"/>
|
28
|
+
<xs:element name="message" type="xs:string" minOccurs="0"/>
|
29
|
+
<xs:element name="backtrace" type="backtrace"/>
|
30
|
+
</xs:all>
|
31
|
+
</xs:complexType>
|
32
|
+
|
33
|
+
<xs:complexType name="backtrace">
|
34
|
+
<xs:sequence>
|
35
|
+
<xs:element name="line" maxOccurs="unbounded">
|
36
|
+
<xs:complexType>
|
37
|
+
<xs:attribute name="file" type="xs:string" use="required"/>
|
38
|
+
<xs:attribute name="number" type="xs:string" use="required"/>
|
39
|
+
<xs:attribute name="method" type="xs:string" use="optional"/>
|
40
|
+
</xs:complexType>
|
41
|
+
</xs:element>
|
42
|
+
</xs:sequence>
|
43
|
+
</xs:complexType>
|
44
|
+
|
45
|
+
<xs:complexType name="request">
|
46
|
+
<xs:all>
|
47
|
+
<xs:element name="url" type="xs:string"/>
|
48
|
+
<xs:element name="component" type="xs:string"/>
|
49
|
+
<xs:element name="action" type="xs:string" minOccurs="0"/>
|
50
|
+
<xs:element name="params" type="varList" minOccurs="0"/>
|
51
|
+
<xs:element name="session" type="varList" minOccurs="0"/>
|
52
|
+
<xs:element name="cgi-data" type="varList" minOccurs="0"/>
|
53
|
+
</xs:all>
|
54
|
+
</xs:complexType>
|
55
|
+
|
56
|
+
<xs:complexType name="varList">
|
57
|
+
<xs:sequence>
|
58
|
+
<xs:element name="var" type="var" maxOccurs="unbounded"/>
|
59
|
+
</xs:sequence>
|
60
|
+
</xs:complexType>
|
61
|
+
|
62
|
+
<xs:complexType name="var" mixed="true">
|
63
|
+
<xs:sequence>
|
64
|
+
<xs:element name="var" type="var" minOccurs="0" maxOccurs="unbounded"/>
|
65
|
+
</xs:sequence>
|
66
|
+
<xs:attribute name="key" type="xs:string" use="required"/>
|
67
|
+
</xs:complexType>
|
68
|
+
|
69
|
+
<xs:complexType name="serverEnvironment">
|
70
|
+
<xs:sequence>
|
71
|
+
<xs:element name="project-root" type="xs:string" minOccurs="0"/>
|
72
|
+
<xs:element name="environment-name" type="xs:string"/>
|
73
|
+
<xs:element name="app-version" type="xs:string" minOccurs="0"/>
|
74
|
+
<xs:element name="hostname" type="xs:string" minOccurs="0"/>
|
75
|
+
</xs:sequence>
|
76
|
+
</xs:complexType>
|
77
|
+
|
78
|
+
</xs:schema>
|
@@ -3,13 +3,69 @@ require 'cgi'
|
|
3
3
|
require 'fakeweb'
|
4
4
|
|
5
5
|
class Toadhopper::TestDeployTracking < Test::Unit::TestCase
|
6
|
+
BOGUS_KEY = 'bogus_key'
|
7
|
+
|
6
8
|
def test_deploy
|
7
|
-
|
8
|
-
|
9
|
-
response = Toadhopper(
|
10
|
-
|
11
|
-
expected_parameters
|
9
|
+
response_body = 'Recorded deploy of My Awesome App to test.'
|
10
|
+
FakeWeb.register_uri(:post, "http://#{Toadhopper::DEFAULT_DOMAIN}/deploys.txt", :body => response_body, :status => ['200', 'Ok'])
|
11
|
+
response = Toadhopper(BOGUS_KEY).deploy!(options)
|
12
|
+
# Check our request
|
13
|
+
assert_equal expected_parameters, query_to_hash(FakeWeb.last_request.body)
|
14
|
+
# Check how we capture the mock response
|
15
|
+
assert_equal 200, response.status, response
|
16
|
+
assert_equal response_body, response.body, response
|
17
|
+
assert_equal [], response.errors, response
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_fake_secure_deploy
|
21
|
+
response_body = 'Recorded deploy of Foo to test.'
|
22
|
+
FakeWeb.register_uri(:post, "https://#{Toadhopper::DEFAULT_DOMAIN}/deploys.txt", :body => response_body, :status => ['200', 'OK'])
|
23
|
+
response = Toadhopper.new(BOGUS_KEY, :notify_host => "https://#{Toadhopper::DEFAULT_DOMAIN}").deploy!(options)
|
24
|
+
# Check our request
|
25
|
+
assert_equal expected_parameters, query_to_hash(FakeWeb.last_request.body)
|
26
|
+
# Check how we capture the mock response
|
12
27
|
assert_equal 200, response.status
|
13
|
-
assert_equal
|
28
|
+
assert_equal response_body, response.body, response
|
29
|
+
assert_equal [], response.errors, response
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_deploy_integration_bad_key
|
33
|
+
FakeWeb.allow_net_connect = true
|
34
|
+
response = Toadhopper('bogus key').deploy!(options)
|
35
|
+
# Check how we capture the live response
|
36
|
+
assert_equal 403, response.status, response
|
37
|
+
expected_error = 'could not find a project with API key'
|
38
|
+
assert_match expected_error, response.body, response
|
39
|
+
assert_equal 1, response.errors.size, response
|
40
|
+
assert_match expected_error, response.errors.first, response
|
41
|
+
end
|
42
|
+
|
43
|
+
if toadhopper_api_key and ENV['AIRBRAKE_FULL_TEST']
|
44
|
+
def test_deploy_integration_good_key
|
45
|
+
FakeWeb.allow_net_connect = true
|
46
|
+
opts = {:scm_repository => 'git://github.com/toolmantim/toadhopper.git', :scm_revision => '5e15028652023c98c70ac275b5f04bb368e04773'}
|
47
|
+
response = toadhopper.deploy!(opts)
|
48
|
+
# Check how we capture the live response
|
49
|
+
assert_equal 200, response.status, response
|
50
|
+
assert_match 'Recorded deploy', response.body, response
|
51
|
+
assert_equal [], response.errors, response
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def options
|
56
|
+
{:framework_env => 'test', :scm_revision => 3, :scm_repository => 'some/where', :username => 'phil'}
|
57
|
+
end
|
58
|
+
|
59
|
+
def expected_parameters
|
60
|
+
{'api_key' => BOGUS_KEY, 'deploy[rails_env]' => 'test', 'deploy[scm_revision]' => '3', 'deploy[scm_repository]' => 'some/where', 'deploy[local_username]' => 'phil'}
|
61
|
+
end
|
62
|
+
|
63
|
+
def query_to_hash(query)
|
64
|
+
Hash[CGI.unescape(query).split('&').map { |x| x.split('=') }]
|
65
|
+
end
|
66
|
+
|
67
|
+
# This method is called automatically after every test
|
68
|
+
def teardown
|
69
|
+
reset_test_env
|
14
70
|
end
|
15
71
|
end
|
data/test/test_filtering.rb
CHANGED
@@ -23,8 +23,9 @@ class Toadhopper::TestFiltering < Test::Unit::TestCase
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def filtered_document(key, value, filter)
|
26
|
-
|
26
|
+
toad = toadhopper
|
27
|
+
toad.filters = filter
|
27
28
|
hash = {"nested" => {key => value}, key => value}
|
28
|
-
|
29
|
+
toad.__send__(:document_for, error, {:params => hash, :session => hash, :environment => hash})
|
29
30
|
end
|
30
31
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class Toadhopper::TestInitialization < Test::Unit::TestCase
|
4
|
+
MY_KEY = 'my key'
|
5
|
+
|
6
|
+
def test_defaults
|
7
|
+
assert_equal 'airbrake.io', Toadhopper::DEFAULT_DOMAIN
|
8
|
+
assert_equal 'http://airbrake.io', Toadhopper::DEFAULT_NOTIFY_HOST
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_no_params
|
12
|
+
toad = Toadhopper.new MY_KEY
|
13
|
+
assert_toad_behavior toad
|
14
|
+
assert_match Toadhopper::DEFAULT_NOTIFY_HOST, toad.error_url.to_s
|
15
|
+
assert ! toad.secure?
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_http_host
|
19
|
+
toad = Toadhopper.new MY_KEY, :notify_host => 'http://foo.com'
|
20
|
+
assert_toad_behavior toad
|
21
|
+
assert_match 'http://foo.com', toad.deploy_url.to_s
|
22
|
+
assert ! toad.secure?
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_https_host
|
26
|
+
secure_host = 'https://example.com'
|
27
|
+
toad = Toadhopper.new MY_KEY, :notify_host => secure_host
|
28
|
+
assert_toad_behavior toad
|
29
|
+
assert_match secure_host, toad.error_url.to_s
|
30
|
+
assert toad.secure?
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_vague_host_not_allowed
|
34
|
+
assert_raise(ToadhopperException) do
|
35
|
+
Toadhopper.new MY_KEY, :notify_host => 'toadhopper.net'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_http_transport
|
40
|
+
transport = Net::HTTP.new 'airbrake.io'
|
41
|
+
toad = Toadhopper.new MY_KEY, :transport => transport
|
42
|
+
assert ! toad.secure?
|
43
|
+
assert_same transport, toad.connection(toad.error_url)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_https_transport
|
47
|
+
transport = Net::HTTP.new 'foo.com', 443
|
48
|
+
transport.use_ssl = true
|
49
|
+
toad = Toadhopper.new MY_KEY, :transport => transport
|
50
|
+
assert toad.secure?
|
51
|
+
assert_same transport, toad.connection(toad.error_url)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_transport_and_url_conflict
|
55
|
+
transport = Net::HTTP.new 'domain1.com'
|
56
|
+
assert_raise(ToadhopperException) do
|
57
|
+
Toadhopper.new MY_KEY, :notify_host => 'http://domain2.com', :transport => transport
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_ca_file
|
62
|
+
assert File.exists? Toadhopper::CA_FILE
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_ca_file_validates_notify_host
|
66
|
+
require 'openssl'
|
67
|
+
require 'socket'
|
68
|
+
context = OpenSSL::SSL::SSLContext.new
|
69
|
+
context.ca_file = Toadhopper::CA_FILE
|
70
|
+
context.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
71
|
+
client_socket = TCPSocket.new Toadhopper::DEFAULT_DOMAIN, 443
|
72
|
+
ssl_client = OpenSSL::SSL::SSLSocket.new client_socket, context
|
73
|
+
ssl_client.connect
|
74
|
+
ssl_client.puts 'hello server!'
|
75
|
+
body = ssl_client.read
|
76
|
+
assert_match /html/, body, "bad response body: #{body.inspect}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def assert_toad_behavior(toad)
|
80
|
+
assert_kind_of Toadhopper, toad
|
81
|
+
assert_equal MY_KEY, toad.api_key
|
82
|
+
end
|
83
|
+
end
|
data/test/test_posting.rb
CHANGED
@@ -1,18 +1,87 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class Toadhopper::TestPosting < Test::Unit::TestCase
|
4
|
+
MY_ERROR_URL = "#{Toadhopper::DEFAULT_NOTIFY_HOST}/notifier_api/v2/notices"
|
5
|
+
|
6
|
+
def test_mock_successful_posting
|
7
|
+
key = 'lolc@tz'
|
8
|
+
response_body = posting_response_good
|
9
|
+
FakeWeb.register_uri(:post, MY_ERROR_URL, :body => response_body, :status => ['200', 'OK'])
|
10
|
+
response = Toadhopper(key).post!(error)
|
11
|
+
# Check our request
|
12
|
+
assert_match key, FakeWeb.last_request.body, FakeWeb.last_request.body
|
13
|
+
assert_valid_airbrake_xml FakeWeb.last_request.body
|
14
|
+
# Check how we capture the mock response
|
15
|
+
assert_equal response_body, response.body, response
|
16
|
+
assert_successful_response response
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_mock_unsuccessful_posting
|
20
|
+
key = 'roflcopt3r'
|
21
|
+
response_body = posting_response_bad_apikey
|
22
|
+
FakeWeb.register_uri(:post, MY_ERROR_URL, :body => response_body, :status => ['422', '422 status code 422'])
|
23
|
+
response = Toadhopper(key).post! error
|
24
|
+
# Check how we capture the mock response
|
25
|
+
assert_equal response_body, response.body, response
|
26
|
+
assert_failed_response response
|
27
|
+
end
|
28
|
+
|
4
29
|
def test_posting
|
30
|
+
FakeWeb.allow_net_connect = true
|
5
31
|
response = Toadhopper('bogus key').post!(error)
|
6
|
-
|
7
|
-
|
32
|
+
# Check how we capture the live response
|
33
|
+
assert_failed_response response
|
8
34
|
end
|
9
35
|
|
10
|
-
|
36
|
+
def test_posting_transport
|
37
|
+
FakeWeb.allow_net_connect = true
|
38
|
+
response = Toadhopper.new('bogus key', :transport => transport).post!(error)
|
39
|
+
assert_equal 1, response.errors.length, response
|
40
|
+
end
|
41
|
+
|
42
|
+
if toadhopper_api_key
|
11
43
|
def test_posting_integration
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
44
|
+
FakeWeb.allow_net_connect = true
|
45
|
+
toad = toadhopper
|
46
|
+
toad.filters = "AIRBRAKE_API_KEY", "ROOT_PASSWORD"
|
47
|
+
assert_successful_response toad.post! error
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_posting_transport_integration
|
51
|
+
FakeWeb.allow_net_connect = true
|
52
|
+
toad = Toadhopper.new toadhopper_api_key, :transport => transport
|
53
|
+
assert_successful_response toad.post! error
|
16
54
|
end
|
17
55
|
end
|
56
|
+
|
57
|
+
def assert_successful_response(response)
|
58
|
+
assert_equal 200, response.status, response
|
59
|
+
assert_match '</id>', response.body, response
|
60
|
+
assert_equal [], response.errors, response
|
61
|
+
end
|
62
|
+
|
63
|
+
def assert_failed_response(response, code = 422)
|
64
|
+
assert_equal code, response.status, response
|
65
|
+
assert_respond_to response.errors, :each_with_index, response
|
66
|
+
assert_equal 1, response.errors.length, response
|
67
|
+
end
|
68
|
+
|
69
|
+
def transport
|
70
|
+
port = nil
|
71
|
+
port = Net::HTTP.https_default_port if ENV['AIRBRAKE_FULL_TEST']
|
72
|
+
transport = Net::HTTP.new Toadhopper::DEFAULT_DOMAIN, port
|
73
|
+
transport.read_timeout = 7 # seconds
|
74
|
+
transport.open_timeout = 7 # seconds
|
75
|
+
if ENV['AIRBRAKE_FULL_TEST']
|
76
|
+
transport.use_ssl = true
|
77
|
+
transport.ca_file = Toadhopper::CA_FILE
|
78
|
+
transport.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
79
|
+
end
|
80
|
+
transport
|
81
|
+
end
|
82
|
+
|
83
|
+
# This method is called automatically after every test
|
84
|
+
def teardown
|
85
|
+
reset_test_env
|
86
|
+
end
|
18
87
|
end
|
data/toadhopper.gemspec
CHANGED
@@ -20,9 +20,11 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
22
|
s.require_paths = ['lib']
|
23
|
-
s.extra_rdoc_files = ['README.md', 'LICENSE']
|
23
|
+
s.extra_rdoc_files = ['README.md', 'LICENSE', 'CHANGELOG.md']
|
24
24
|
|
25
25
|
s.add_development_dependency 'rake'
|
26
26
|
s.add_development_dependency 'test-unit'
|
27
27
|
s.add_development_dependency 'fakeweb'
|
28
|
+
s.add_development_dependency 'travis-lint'
|
29
|
+
s.add_development_dependency 'nokogiri'
|
28
30
|
end
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: toadhopper
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '2.1'
|
4
5
|
prerelease:
|
5
|
-
version: "2.0"
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Tim Lucas
|
9
9
|
- Samuel Tesla
|
10
10
|
- Corey Donohoe
|
@@ -13,55 +13,102 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
- !ruby/object:Gem::Dependency
|
16
|
+
date: 2012-07-18 00:00:00.000000000 Z
|
17
|
+
dependencies:
|
18
|
+
- !ruby/object:Gem::Dependency
|
20
19
|
name: rake
|
21
|
-
requirement:
|
20
|
+
requirement: !ruby/object:Gem::Requirement
|
22
21
|
none: false
|
23
|
-
requirements:
|
24
|
-
- -
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version:
|
22
|
+
requirements:
|
23
|
+
- - ! '>='
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
27
26
|
type: :development
|
28
27
|
prerelease: false
|
29
|
-
version_requirements:
|
30
|
-
|
28
|
+
version_requirements: !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
- !ruby/object:Gem::Dependency
|
31
35
|
name: test-unit
|
32
|
-
requirement:
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
33
37
|
none: false
|
34
|
-
requirements:
|
35
|
-
- -
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version:
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
38
42
|
type: :development
|
39
43
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
- !ruby/object:Gem::Dependency
|
42
51
|
name: fakeweb
|
43
|
-
requirement:
|
52
|
+
requirement: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
type: :development
|
59
|
+
prerelease: false
|
60
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: travis-lint
|
68
|
+
requirement: !ruby/object:Gem::Requirement
|
44
69
|
none: false
|
45
|
-
requirements:
|
46
|
-
- -
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version:
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
49
74
|
type: :development
|
50
75
|
prerelease: false
|
51
|
-
version_requirements:
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: nokogiri
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ! '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
52
98
|
description: A base library for Airbrake error reporting
|
53
|
-
email:
|
99
|
+
email:
|
54
100
|
- t.lucas@toolmantim.com
|
55
101
|
executables: []
|
56
|
-
|
57
102
|
extensions: []
|
58
|
-
|
59
|
-
extra_rdoc_files:
|
103
|
+
extra_rdoc_files:
|
60
104
|
- README.md
|
61
105
|
- LICENSE
|
62
|
-
|
106
|
+
- CHANGELOG.md
|
107
|
+
files:
|
63
108
|
- .gitignore
|
109
|
+
- .travis.yml
|
64
110
|
- .yardopts
|
111
|
+
- CHANGELOG.md
|
65
112
|
- Gemfile
|
66
113
|
- LICENSE
|
67
114
|
- README.md
|
@@ -69,48 +116,47 @@ files:
|
|
69
116
|
- lib/notice.erb
|
70
117
|
- lib/toadhopper.rb
|
71
118
|
- lib/toadhopper/capistrano.rb
|
119
|
+
- lib/toadhopper_exception.rb
|
120
|
+
- resources/README.md
|
121
|
+
- resources/ca-bundle.crt
|
72
122
|
- test/helper.rb
|
123
|
+
- test/resources/airbrake_2_2.xsd
|
73
124
|
- test/test_convenience_constructor.rb
|
74
125
|
- test/test_deploy_tracking.rb
|
75
126
|
- test/test_filtering.rb
|
127
|
+
- test/test_initialization.rb
|
76
128
|
- test/test_posting.rb
|
77
129
|
- toadhopper.gemspec
|
78
130
|
homepage: http://github.com/toolmantim/toadhopper
|
79
131
|
licenses: []
|
80
|
-
|
81
132
|
post_install_message:
|
82
133
|
rdoc_options: []
|
83
|
-
|
84
|
-
require_paths:
|
134
|
+
require_paths:
|
85
135
|
- lib
|
86
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
137
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
|
92
|
-
|
93
|
-
- 0
|
94
|
-
version: "0"
|
95
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
143
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
segments:
|
102
|
-
- 0
|
103
|
-
version: "0"
|
144
|
+
requirements:
|
145
|
+
- - ! '>='
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
104
148
|
requirements: []
|
105
|
-
|
106
149
|
rubyforge_project: toadhopper
|
107
|
-
rubygems_version: 1.8.
|
150
|
+
rubygems_version: 1.8.24
|
108
151
|
signing_key:
|
109
152
|
specification_version: 3
|
110
153
|
summary: Post error notifications to Airbrake
|
111
|
-
test_files:
|
154
|
+
test_files:
|
112
155
|
- test/helper.rb
|
156
|
+
- test/resources/airbrake_2_2.xsd
|
113
157
|
- test/test_convenience_constructor.rb
|
114
158
|
- test/test_deploy_tracking.rb
|
115
159
|
- test/test_filtering.rb
|
160
|
+
- test/test_initialization.rb
|
116
161
|
- test/test_posting.rb
|
162
|
+
has_rdoc:
|