toadhopper 2.0 → 2.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 +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:
|