airbrake-api 3.3.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,58 +1,43 @@
1
+ require 'airbrake-api/base'
2
+
1
3
  module AirbrakeAPI
2
- class Error < AirbrakeAPI::Base
4
+ class Error < Base
3
5
 
6
+ # @deprecated Please use {AirbrakeAPI::Client::error} and {AirbrakeAPI::Client::errors} instead
4
7
  def self.find(*args)
5
- setup
8
+ deprecate('Error.find has been deprecated; use AibrakeAPI::Client#error and AibrakeAPI::Client#errors instead')
6
9
 
7
10
  results = case args.first
8
11
  when Fixnum
9
- find_individual(args)
12
+ id = args.shift
13
+ options = args.last.is_a?(::Hash) ? args.pop : {}
14
+ AirbrakeAPI::Client.new.error(id, options)
10
15
  when :all
11
- find_all(args)
16
+ options = args.last.is_a?(::Hash) ? args.pop : {}
17
+ AirbrakeAPI::Client.new.errors(options)
12
18
  else
13
19
  raise AirbrakeError.new('Invalid argument')
14
20
  end
15
21
 
16
- raise AirbrakeError.new('No results found.') if results.nil?
17
- raise AirbrakeError.new(results.errors.error) if results.errors
18
-
19
- results.group || results.groups
22
+ results
20
23
  end
21
24
 
25
+ # @deprecated Please use {AirbrakeAPI::Client::update} instead
22
26
  def self.update(error, options)
23
- setup
24
-
25
- response = put(error_path(error), :body => options)
26
- if response.code == 403
27
- raise AirbrakeError.new('SSL should be enabled - use Airbrake.secure = true in configuration')
28
- end
29
- results = Hashie::Mash.new(response)
30
-
31
- raise AirbrakeError.new(results.errors.error) if results.errors
32
- results.group
33
- end
34
-
35
- private
36
-
37
- def self.find_all(args)
38
- options = args.extract_options!
39
-
40
- fetch(collection_path, options)
41
- end
42
-
43
- def self.find_individual(args)
44
- id = args.shift
45
- options = args.extract_options!
46
-
47
- fetch(error_path(id), options)
27
+ deprecate('Error.update has been deprecated; use AibrakeAPI::Client#update instead')
28
+ AirbrakeAPI::Client.new.update(error, options)
48
29
  end
49
30
 
31
+ # @deprecated Please use {AirbrakeAPI::Client::errors_path} instead
50
32
  def self.collection_path
51
- '/errors.xml'
33
+ deprecate('Error.collection_path has been deprecated; use AibrakeAPI::Client#errors_path instead')
34
+ AirbrakeAPI::Client.new.errors_path
52
35
  end
53
36
 
37
+ # @deprecated Please use {AirbrakeAPI::Client::error_path} instead
54
38
  def self.error_path(error_id)
55
- "/errors/#{error_id}.xml"
39
+ deprecate('Error.error_path has been deprecated; use AibrakeAPI::Client#error_path instead')
40
+ AirbrakeAPI::Client.new.error_path(error_id)
56
41
  end
57
42
 
58
43
  end
@@ -0,0 +1,17 @@
1
+ require 'faraday'
2
+
3
+ module AirbrakeAPI
4
+ module Middleware
5
+ class RaiseResponseError < Faraday::Response::Middleware
6
+
7
+ def on_complete(env)
8
+ raise AirbrakeError.new('No results found.') if env[:body].nil?
9
+
10
+ if env[:body].errors && env[:body].errors.error
11
+ raise AirbrakeError.new(env[:body].errors.error)
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ require 'faraday'
2
+
3
+ module AirbrakeAPI
4
+ module Middleware
5
+ class RaiseServerError < Faraday::Response::Middleware
6
+
7
+ def on_complete(env)
8
+ case env[:status].to_i
9
+ when 403
10
+ raise AirbrakeError.new('SSL should be enabled - use AirbrakeAPI.secure = true in configuration')
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require 'faraday'
2
+
3
+ module AirbrakeAPI
4
+ module Middleware
5
+ class ScrubResponse < Faraday::Response::Middleware
6
+
7
+ def parse(body)
8
+ body.gsub!(/<__utmz>.*?<\/__utmz>/m,'')
9
+ body.gsub!(/<[0-9]+.*?>.*?<\/[0-9]+.*?>/m,'')
10
+ body
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -1,66 +1,38 @@
1
1
  require 'parallel'
2
+ require 'airbrake-api/base'
2
3
 
3
4
  module AirbrakeAPI
4
- class Notice < AirbrakeAPI::Base
5
- PER_PAGE = 30
6
- PARALLEL_WORKERS = 10
5
+ class Notice < Base
7
6
 
8
- def self.find(id, error_id, options={})
9
- setup
10
-
11
- hash = fetch(find_path(id, error_id), options)
12
-
13
- if hash.errors
14
- raise AirbrakeError.new(results.errors.error)
15
- end
16
-
17
- hash.notice
7
+ # @deprecated Please use {AirbrakeAPI::Client::notice} instead
8
+ def self.find(id, error_id, options = {})
9
+ deprecate('Notice.find has been deprecated; use AibrakeAPI::Client#notice instead')
10
+ AirbrakeAPI::Client.new.notice(id, error_id, options)
18
11
  end
19
12
 
20
- def self.find_all_by_error_id(error_id, notice_options = {})
21
- setup
22
-
23
- options = {}
24
- notices = []
25
- page = 1
26
- while !notice_options[:pages] || page <= notice_options[:pages]
27
- options[:page] = page
28
- hash = fetch(all_path(error_id), options)
29
- if hash.errors
30
- raise AirbrakeError.new(hash.errors.error)
31
- end
32
-
33
- batch = Parallel.map(hash.notices, :in_threads => PARALLEL_WORKERS) do |notice_stub|
34
- find(notice_stub.id, error_id)
35
- end
36
- yield batch if block_given?
37
- batch.each{|n| notices << n }
38
-
39
- break if batch.size < PER_PAGE
40
- page += 1
41
- end
42
- notices
13
+ # @deprecated Please use {AirbrakeAPI::Client::all_notices} instead
14
+ def self.find_all_by_error_id(error_id, notice_options = {}, &block)
15
+ deprecate('Notice.find_all_by_error_id has been deprecated; use AibrakeAPI::Client#all_notices instead')
16
+ AirbrakeAPI::Client.new.notices(error_id, notice_options, &block)
43
17
  end
44
18
 
45
- def self.find_by_error_id(error_id, options={ 'page' => 1})
46
- setup
47
-
48
- hash = fetch(all_path(error_id), options)
49
- if hash.errors
50
- raise AirbrakeError.new(results.errors.error)
51
- end
52
-
53
- hash.notices
19
+ # @deprecated Please use {AirbrakeAPI::Client::notices} instead
20
+ def self.find_by_error_id(error_id, options = {})
21
+ deprecate('Notice.find_by_error_id has been deprecated; use AibrakeAPI::Client#notices instead')
22
+ AirbrakeAPI::Client.new.notices(error_id, options)
54
23
  end
55
24
 
56
- private
57
-
25
+ # @deprecated Please use {AirbrakeAPI::Client::notice_path} instead
58
26
  def self.find_path(id, error_id)
59
- "/errors/#{error_id}/notices/#{id}.xml"
27
+ deprecate('Notice.find_path has been deprecated; use AibrakeAPI::Client#notice_path instead')
28
+ AirbrakeAPI::Client.new.notice_path(id, error_id)
60
29
  end
61
30
 
31
+ # @deprecated Please use {AirbrakeAPI::Client::notices_path} instead
62
32
  def self.all_path(error_id)
63
- "/errors/#{error_id}/notices.xml"
33
+ deprecate('Notice.all_path has been deprecated; use AibrakeAPI::Client#notices_path instead')
34
+ AirbrakeAPI::Client.new.notices_path(error_id)
64
35
  end
36
+
65
37
  end
66
38
  end
@@ -1,18 +1,19 @@
1
+ require 'airbrake-api/base'
2
+
1
3
  module AirbrakeAPI
2
- class Project < AirbrakeAPI::Base
4
+ class Project < Base
3
5
 
6
+ # @deprecated Please use {AirbrakeAPI::Client::projects} instead
4
7
  def self.find(*args)
5
- setup
6
- options = args.extract_options!
7
-
8
- results = fetch(collection_path, options)
9
-
10
- raise AirbrakeError.new(results.errors.error) if results.errors
11
- results.projects.project
8
+ deprecate('Project.find has been deprecated; use AibrakeAPI::Client.projects instead')
9
+ options = args.last.is_a?(::Hash) ? args.pop : {}
10
+ AirbrakeAPI::Client.new.projects(options)
12
11
  end
13
12
 
13
+ # @deprecated Please use {AirbrakeAPI::Client::projects_path} instead
14
14
  def self.collection_path
15
- '/data_api/v1/projects.xml'
15
+ deprecate('Project.collection_path has been deprecated; use AibrakeAPI::Client.projects_path instead')
16
+ AirbrakeAPI::Client.new.projects_path
16
17
  end
17
18
 
18
19
  end
@@ -1,3 +1,3 @@
1
1
  module AirbrakeAPI
2
- VERSION = '3.3.0'
2
+ VERSION = '4.0.0'
3
3
  end
@@ -0,0 +1,178 @@
1
+ require 'spec_helper'
2
+
3
+ describe AirbrakeAPI::Client do
4
+ describe 'initialization' do
5
+ before do
6
+ @keys = AirbrakeAPI::Configuration::VALID_OPTIONS_KEYS
7
+ end
8
+
9
+ context "with module configuration" do
10
+ before do
11
+ AirbrakeAPI.configure do |config|
12
+ @keys.each do |key|
13
+ config.send("#{key}=", key)
14
+ end
15
+ end
16
+ end
17
+
18
+ after do
19
+ AirbrakeAPI.reset
20
+ end
21
+
22
+ it "should inherit module configuration" do
23
+ api = AirbrakeAPI::Client.new
24
+ @keys.each do |key|
25
+ api.send(key).should == key
26
+ end
27
+ end
28
+
29
+ context "with class configuration" do
30
+
31
+ before do
32
+ @configuration = {
33
+ :account => 'test',
34
+ :auth_token => 'token',
35
+ :secure => true,
36
+ :connection_options => {},
37
+ :adapter => :em_http,
38
+ :user_agent => 'Airbrake API Tests'
39
+ }
40
+ end
41
+
42
+ context "during initialization" do
43
+ it "should override module configuration" do
44
+ api = AirbrakeAPI::Client.new(@configuration)
45
+ @keys.each do |key|
46
+ api.send(key).should == @configuration[key]
47
+ end
48
+ end
49
+ end
50
+
51
+ context "after initilization" do
52
+ it "should override module configuration after initialization" do
53
+ api = AirbrakeAPI::Client.new
54
+ @configuration.each do |key, value|
55
+ api.send("#{key}=", value)
56
+ end
57
+ @keys.each do |key|
58
+ api.send(key).should == @configuration[key]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ describe 'api requests'do
67
+ before(:all) do
68
+ options = { :account => 'myapp', :auth_token => 'abcdefg123456', :secure => false }
69
+ AirbrakeAPI.configure(options)
70
+
71
+ @client = AirbrakeAPI::Client.new
72
+ end
73
+
74
+ it "should fail with errors" do
75
+ expect {
76
+ @client.notices(1696172)
77
+ }.to raise_error(AirbrakeAPI::AirbrakeError, /You are not authorized to see that page/)
78
+ end
79
+
80
+ describe '#deploys' do
81
+ it 'returns an array of deploys' do
82
+ @client.deploys('12345').should be_kind_of(Array)
83
+ end
84
+
85
+ it 'returns deploy data' do
86
+ deploys = @client.deploys('12345')
87
+ first_deploy = deploys.first
88
+
89
+ first_deploy.rails_env.should eq('production')
90
+ end
91
+
92
+ it 'returns empty when no data' do
93
+ @client.deploys('67890').should be_kind_of(Array)
94
+ end
95
+ end
96
+
97
+ describe '#projects' do
98
+ it 'returns an array of projects' do
99
+ @client.projects.should be_kind_of(Array)
100
+ end
101
+
102
+ it 'returns project data' do
103
+ projects = @client.projects
104
+ projects.size.should == 4
105
+ projects.first.id.should == '1'
106
+ projects.first.name.should == 'Venkman'
107
+ end
108
+ end
109
+
110
+ describe '#update' do
111
+ it 'should update the status of an error' do
112
+ error = @client.update(1696170, :group => { :resolved => true})
113
+ error.resolved.should be_true
114
+ end
115
+ end
116
+
117
+ describe '#errors' do
118
+ it "should find a page of the 30 most recent errors" do
119
+ errors = @client.errors
120
+ ordered = errors.sort_by(&:most_recent_notice_at).reverse
121
+ ordered.should == errors
122
+ errors.size.should == 30
123
+ end
124
+
125
+ it "should paginate errors" do
126
+ errors = @client.errors(:page => 2)
127
+ ordered = errors.sort_by(&:most_recent_notice_at).reverse
128
+ ordered.should == errors
129
+ errors.size.should == 2
130
+ end
131
+ end
132
+
133
+ describe '#error' do
134
+ it "should find an individual error" do
135
+ error = @client.error(1696170)
136
+ error.action.should == 'index'
137
+ error.id.should == 1696170
138
+ end
139
+ end
140
+
141
+ describe '#notice' do
142
+ it "finds individual notices" do
143
+ @client.notice(1234, 1696170).should_not be_nil
144
+ end
145
+
146
+ it "finds broken notices" do
147
+ @client.notice(666, 1696170).should_not be_nil
148
+ end
149
+ end
150
+
151
+ describe '#notices' do
152
+ it "finds all error notices" do
153
+ notices = @client.notices(1696170)
154
+ notices.size.should == 42
155
+ end
156
+
157
+ it "finds error notices for a specific page" do
158
+ notices = @client.notices(1696170, :page => 1)
159
+ notices.size.should == 30
160
+ notices.first.id.should == 1234
161
+ end
162
+
163
+ it "finds all error notices with a page limit" do
164
+ notices = @client.notices(1696171, :pages => 2)
165
+ notices.size.should == 60
166
+ end
167
+
168
+ it "yields batches" do
169
+ batches = []
170
+ notices = @client.notices(1696171, :pages => 2) do |batch|
171
+ batches << batch
172
+ end
173
+ notices.size.should == 60
174
+ batches.map(&:size).should == [30,30]
175
+ end
176
+ end
177
+ end
178
+ end
@@ -9,7 +9,7 @@ describe AirbrakeAPI::Notice do
9
9
 
10
10
  it "should find error notices" do
11
11
  notices = AirbrakeAPI::Notice.find_by_error_id(1696170)
12
- notices.size.should == 30
12
+ notices.size.should == 42
13
13
  notices.first.id.should == 1234
14
14
  end
15
15
 
@@ -45,4 +45,12 @@ describe AirbrakeAPI::Notice do
45
45
  it "should find a broken notices" do
46
46
  AirbrakeAPI::Notice.find(666, 1696170).should_not == nil
47
47
  end
48
+
49
+ it 'defines the notices path' do
50
+ AirbrakeAPI::Notice.all_path(1696170).should eq('/errors/1696170/notices.xml')
51
+ end
52
+
53
+ it 'defines the an individual notices path' do
54
+ AirbrakeAPI::Notice.find_path(666, 1696170).should eq('/errors/1696170/notices/666.xml')
55
+ end
48
56
  end