toadhopper 2.0 → 2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- FakeWeb.allow_net_connect = true
7
+ def reset_test_env
8
+ FakeWeb.clean_registry
9
+ FakeWeb.allow_net_connect = false
10
+ end
7
11
 
8
12
  def toadhopper
9
- @toadhopper ||= Toadhopper.new(ENV['AIRBRAKE_API_KEY'] || ENV['HOPTOAD_API_KEY'] || "test api key")
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
- FakeWeb.register_uri(:post, 'http://airbrakeapp.com/deploys.txt', :status => ['200', 'Ok'])
8
- options = {:framework_env => 'test', :scm_revision => 3, :scm_repository => 'some/where', :username => 'phil'}
9
- response = Toadhopper('bogus key').deploy!(options)
10
- request = FakeWeb.last_request
11
- expected_parameters = {'api_key' => 'bogus key', 'deploy[rails_env]' => 'test', 'deploy[scm_revision]' => '3', 'deploy[scm_repository]' => 'some/where', 'deploy[local_username]' => 'phil'}
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 expected_parameters, Hash[CGI.unescape(FakeWeb.last_request.body).split('&').map { |x| x.split('=') }]
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
@@ -23,8 +23,9 @@ class Toadhopper::TestFiltering < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def filtered_document(key, value, filter)
26
- toadhopper.filters = filter
26
+ toad = toadhopper
27
+ toad.filters = filter
27
28
  hash = {"nested" => {key => value}, key => value}
28
- toadhopper.__send__(:document_for, error, {:params => hash, :session => hash, :environment => hash})
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
@@ -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
- assert_equal 422, response.status
7
- assert_equal ['No project exists with the given API key.'], response.errors
32
+ # Check how we capture the live response
33
+ assert_failed_response response
8
34
  end
9
35
 
10
- if ENV['AIRBRAKE_API_KEY']
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
- toadhopper.filters = "AIRBRAKE_API_KEY", "ROOT_PASSWORD"
13
- response = toadhopper.post!(error)
14
- assert_equal 200, response.status
15
- assert_equal [], response.errors
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
@@ -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
- date: 2011-07-26 00:00:00 Z
18
- dependencies:
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: &id001 !ruby/object:Gem::Requirement
20
+ requirement: !ruby/object:Gem::Requirement
22
21
  none: false
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: "0"
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
27
26
  type: :development
28
27
  prerelease: false
29
- version_requirements: *id001
30
- - !ruby/object:Gem::Dependency
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: &id002 !ruby/object:Gem::Requirement
36
+ requirement: !ruby/object:Gem::Requirement
33
37
  none: false
34
- requirements:
35
- - - ">="
36
- - !ruby/object:Gem::Version
37
- version: "0"
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
38
42
  type: :development
39
43
  prerelease: false
40
- version_requirements: *id002
41
- - !ruby/object:Gem::Dependency
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: &id003 !ruby/object:Gem::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: "0"
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
49
74
  type: :development
50
75
  prerelease: false
51
- version_requirements: *id003
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
- files:
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
- hash: 384563062547314553
92
- segments:
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
- hash: 384563062547314553
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.5
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: