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.
@@ -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: