bugsnag-api 1.0.2 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.buildkite/pipeline.yml +6 -0
- data/.github/ISSUE_TEMPLATE/A.md +14 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +47 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +16 -0
- data/.github/support.md +19 -0
- data/.github/workflows/tests.yml +53 -0
- data/.rubocop.yml +2 -0
- data/.rubocop_todo.yml +271 -0
- data/CHANGELOG.md +59 -0
- data/CONTRIBUTING.md +40 -0
- data/Gemfile +9 -0
- data/README.md +178 -109
- data/bugsnag-api.gemspec +42 -6
- data/config/.gitignore +1 -0
- data/docker-compose.yml +9 -0
- data/dockerfiles/Dockerfile.audit +5 -0
- data/lib/bugsnag/api/client.rb +32 -10
- data/lib/bugsnag/api/client/collaborators.rb +86 -0
- data/lib/bugsnag/api/client/comments.rb +31 -40
- data/lib/bugsnag/api/client/currentuser.rb +32 -0
- data/lib/bugsnag/api/client/errors.rb +48 -53
- data/lib/bugsnag/api/client/eventfields.rb +49 -0
- data/lib/bugsnag/api/client/events.rb +37 -32
- data/lib/bugsnag/api/client/organizations.rb +45 -0
- data/lib/bugsnag/api/client/pivots.rb +42 -0
- data/lib/bugsnag/api/client/projects.rb +36 -63
- data/lib/bugsnag/api/client/trends.rb +41 -0
- data/lib/bugsnag/api/configuration.rb +1 -1
- data/lib/bugsnag/api/error.rb +5 -1
- data/lib/bugsnag/api/response/raise_error.rb +0 -2
- data/lib/bugsnag/api/version.rb +1 -1
- data/scripts/license_finder.sh +4 -0
- data/spec/bugsnag/api/client/collaborators_spec.rb +101 -0
- data/spec/bugsnag/api/client/comments_spec.rb +42 -30
- data/spec/bugsnag/api/client/currentuser_spec.rb +57 -0
- data/spec/bugsnag/api/client/errors_spec.rb +44 -41
- data/spec/bugsnag/api/client/eventfields_spec.rb +56 -0
- data/spec/bugsnag/api/client/events_spec.rb +41 -29
- data/spec/bugsnag/api/client/organizations_spec.rb +53 -0
- data/spec/bugsnag/api/client/pivots_spec.rb +49 -0
- data/spec/bugsnag/api/client/projects_spec.rb +35 -59
- data/spec/bugsnag/api/client/trends_spec.rb +44 -0
- data/spec/bugsnag/api/client_spec.rb +76 -9
- data/spec/bugsnag/api_spec.rb +2 -0
- data/spec/cassettes/Bugsnag_Api_Client/_get/handles_query_params.yml +36 -26
- data/spec/cassettes/Bugsnag_Api_Client/_last_response/caches_the_last_agent_response.yml +36 -26
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/_invitecollaborator/creates_and_returns_a_collaborator.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/_invitecollaborator/invites_multiple_collaborators.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/given_a_collaborator_exists/_collaborator/returns_a_collaborator.yml +133 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/given_a_collaborator_exists/_collaborators/returns_a_list_of_all_organization_collaborators.yml +135 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/given_a_collaborator_exists/_collaborators/returns_a_list_of_all_project_collaborators.yml +135 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/given_a_collaborator_exists/_collaborators/throws_an_argument_error_if_neither_org_id_or_project_id_are_provided.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/given_a_collaborator_exists/_delete_collaborator/deletes_a_collaborator.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/given_a_collaborator_exists/_update_collaborator_permissions/updates_and_returns_the_collaborator.yml +133 -0
- data/spec/cassettes/Bugsnag_Api_Client_Collaborators/given_a_collaborator_exists/_view_collaborator_projects/returns_a_list_of_projects_belonging_to_the_collaborator.yml +153 -0
- data/spec/cassettes/Bugsnag_Api_Client_Comments/_create_comment/creates_a_comment_on_the_error.yml +70 -0
- data/spec/cassettes/Bugsnag_Api_Client_Comments/given_a_comment_has_been_created/_comment/retrieves_the_comment_specified.yml +135 -0
- data/spec/cassettes/Bugsnag_Api_Client_Comments/given_a_comment_has_been_created/_comments/retrieves_all_comments_on_an_error.yml +137 -0
- data/spec/cassettes/Bugsnag_Api_Client_Comments/given_a_comment_has_been_created/_delete_comment/deletes_the_comment_and_returns_true.yml +70 -0
- data/spec/cassettes/Bugsnag_Api_Client_Comments/given_a_comment_has_been_created/_update_comment/updates_the_message_on_a_comment.yml +135 -0
- data/spec/cassettes/Bugsnag_Api_Client_CurrentUser/_list_organizations/when_using_auth_token/returns_the_organization_the_auth_token_belongs_to.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_CurrentUser/_list_organizations/when_using_user_credentials/returns_users_organizations.yml +71 -0
- data/spec/cassettes/Bugsnag_Api_Client_CurrentUser/_list_projects/when_using_auth_token/lists_current_user_s_projects_in_the_organization.yml +88 -0
- data/spec/cassettes/Bugsnag_Api_Client_CurrentUser/_list_projects/when_using_user_credentials/lists_current_user_s_projects_in_the_organization.yml +91 -0
- data/spec/cassettes/Bugsnag_Api_Client_Errors/_error/returns_a_single_error.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Errors/_errors/returns_errors_on_the_project.yml +70 -0
- data/spec/cassettes/Bugsnag_Api_Client_Errors/_update_errors/updates_and_returns_the_updated_errors.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Events/_error_events/lists_all_error_events.yml +73 -0
- data/spec/cassettes/Bugsnag_Api_Client_Events/_event/returns_the_specified_event.yml +70 -0
- data/spec/cassettes/Bugsnag_Api_Client_Events/_events/returns_the_a_list_of_project_errors.yml +73 -0
- data/spec/cassettes/Bugsnag_Api_Client_Events/_latest_event/returns_the_last_event_on_an_error.yml +70 -0
- data/spec/cassettes/Bugsnag_Api_Client_Organizations/_create_organization/creates_a_new_organization.yml +71 -0
- data/spec/cassettes/Bugsnag_Api_Client_Organizations/with_organization/_delete_organization/deletes_the_organization.yml +133 -0
- data/spec/cassettes/Bugsnag_Api_Client_Organizations/with_organization/_organization/returns_the_requested_organization.yml +139 -0
- data/spec/cassettes/Bugsnag_Api_Client_Organizations/with_organization/_update_organization/updates_and_returns_the_organization.yml +139 -0
- data/spec/cassettes/Bugsnag_Api_Client_Projects/_create_project/creates_a_new_project.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Projects/given_a_project/_delete_project/deletes_the_project.yml +127 -0
- data/spec/cassettes/Bugsnag_Api_Client_Projects/given_a_project/_project/returns_the_requested_project.yml +133 -0
- data/spec/cassettes/Bugsnag_Api_Client_Projects/given_a_project/_regenerate_api_key/removes_the_current_api_key_and_replaces_it_with_a_new_api_key.yml +133 -0
- data/spec/cassettes/Bugsnag_Api_Client_Projects/given_a_project/_update_project/updates_and_returns_the_project.yml +133 -0
- data/spec/cassettes/Bugsnag_Api_Client_Trends/_trends_buckets/returns_a_list_of_error_trends_in_bucket_form.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Trends/_trends_buckets/returns_a_list_of_project_trends_in_bucket_form.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Trends/_trends_resolution/returns_a_list_of_project_trends_in_resolution_form.yml +68 -0
- data/spec/cassettes/Bugsnag_Api_Client_Trends/_trends_resolution/returns_a_list_of_trends_in_resolution_form.yml +68 -0
- data/spec/spec_helper.rb +32 -30
- metadata +167 -115
- data/.travis.yml +0 -9
- data/lib/bugsnag/api/client/accounts.rb +0 -44
- data/lib/bugsnag/api/client/users.rb +0 -99
- data/spec/bugsnag/api/client/accounts_spec.rb +0 -45
- data/spec/bugsnag/api/client/users_spec.rb +0 -105
- data/spec/cassettes/Bugsnag_Api_Client_Accounts/_account/returns_the_requested_account.yml +0 -49
- data/spec/cassettes/Bugsnag_Api_Client_Accounts/_account/when_using_account_credentials/returns_the_account.yml +0 -51
- data/spec/cassettes/Bugsnag_Api_Client_Accounts/_accounts/returns_all_accounts.yml +0 -49
- data/spec/cassettes/Bugsnag_Api_Client_Comments/_comments/returns_all_comments_on_an_error.yml +0 -107
- data/spec/cassettes/Bugsnag_Api_Client_Comments/_create_comment/created_a_comment.yml +0 -51
- data/spec/cassettes/Bugsnag_Api_Client_Comments/with_comment/_comment/returns_a_comment.yml +0 -97
- data/spec/cassettes/Bugsnag_Api_Client_Comments/with_comment/_delete_comment/deletes_an_existing_comment.yml +0 -92
- data/spec/cassettes/Bugsnag_Api_Client_Comments/with_comment/_update_comment/updates_an_existing_comment.yml +0 -97
- data/spec/cassettes/Bugsnag_Api_Client_Errors/_errors/returns_all_errors_on_an_project.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Errors/with_error/_error/returns_an_error.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Errors/with_error/_reopen_error/reopens_the_error.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Errors/with_error/_resolve_error/resolves_the_error.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Errors/with_error/_update_error/updates_the_error.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Events/_error_events/returns_all_events_on_an_error.yml +0 -64
- data/spec/cassettes/Bugsnag_Api_Client_Events/_project_events/returns_all_events_on_a_project.yml +0 -64
- data/spec/cassettes/Bugsnag_Api_Client_Events/with_event/_event/returns_an_event.yml +0 -56
- data/spec/cassettes/Bugsnag_Api_Client_Projects/_account_projects/returns_all_projects_on_an_account.yml +0 -61
- data/spec/cassettes/Bugsnag_Api_Client_Projects/_account_projects/when_using_account_credentials/returns_all_projects.yml +0 -63
- data/spec/cassettes/Bugsnag_Api_Client_Projects/_create_project/creates_a_project_on_an_account.yml +0 -50
- data/spec/cassettes/Bugsnag_Api_Client_Projects/_user_projects/returns_all_projects_for_a_user.yml +0 -61
- data/spec/cassettes/Bugsnag_Api_Client_Projects/with_project/_delete_project/deletes_an_existing_project.yml +0 -91
- data/spec/cassettes/Bugsnag_Api_Client_Projects/with_project/_project/returns_a_project.yml +0 -95
- data/spec/cassettes/Bugsnag_Api_Client_Projects/with_project/_update_project/updates_an_existing_project.yml +0 -95
- data/spec/cassettes/Bugsnag_Api_Client_Users/_account_users/returns_all_users_on_an_account.yml +0 -49
- data/spec/cassettes/Bugsnag_Api_Client_Users/_account_users/when_using_account_credentials/returns_all_users.yml +0 -51
- data/spec/cassettes/Bugsnag_Api_Client_Users/_invite_user/invites_a_user_to_an_account.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Users/_project_users/returns_all_users_for_a_project.yml +0 -49
- data/spec/cassettes/Bugsnag_Api_Client_Users/_user/returns_a_user.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Users/_user/when_using_user_credentials/returns_the_authed_user.yml +0 -48
- data/spec/cassettes/Bugsnag_Api_Client_Users/with_user/_remove_user/removes_a_user_from_an_account.yml +0 -89
- data/spec/cassettes/Bugsnag_Api_Client_Users/with_user/_update_user_permissions/updates_a_users_permissions.yml +0 -93
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,65 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
## 2.0.3 (11 May 2021)
|
5
|
+
|
6
|
+
### Fixes
|
7
|
+
|
8
|
+
* Fix error handling middleware compatibility with Faraday v1.2.0 and above
|
9
|
+
| [askreet](https://github.com/askreet)
|
10
|
+
| [#30](https://github.com/bugsnag/bugsnag-api-ruby/pull/30)
|
11
|
+
|
12
|
+
* Remove call to deprecated `URI.escape`
|
13
|
+
| [askreet](https://github.com/askreet)
|
14
|
+
| [#28](https://github.com/bugsnag/bugsnag-api-ruby/pull/28)
|
15
|
+
|
16
|
+
## 2.0.2 (21 Feb 2018)
|
17
|
+
|
18
|
+
### Fixes
|
19
|
+
|
20
|
+
* Fixes issue with custom query parameters being overridden
|
21
|
+
| [#13](https://github.com/bugsnag/bugsnag-api-ruby/pull/13)
|
22
|
+
|
23
|
+
## 2.0.1 (15 Nov 2017)
|
24
|
+
|
25
|
+
### Fixes
|
26
|
+
|
27
|
+
* Adds `X-Bugsnag-Api` header so that on-prem clients may use this tool
|
28
|
+
| [tremlab](https://github.com/tremlab)
|
29
|
+
| [#14](https://github.com/bugsnag/bugsnag-api-ruby/pull/14)
|
30
|
+
|
31
|
+
## 2.0.0 (10 Oct 2017)
|
32
|
+
|
33
|
+
This release changes the gem to access v2 of the [Bugsnag data-access API](https://docs.bugsnag.com/api/data-access/), with full API documentation found [here](http://docs.bugsnagapiv2.apiary.io/).
|
34
|
+
|
35
|
+
### Enhancements
|
36
|
+
|
37
|
+
* Uses Bugsnag data-access API v2 endpoints with associated changes to endpoints and methods, namely:
|
38
|
+
- Removes:
|
39
|
+
* accounts
|
40
|
+
* users
|
41
|
+
- Adds:
|
42
|
+
* organizations
|
43
|
+
* collaborators
|
44
|
+
* event fields
|
45
|
+
* pivots
|
46
|
+
* trends
|
47
|
+
- Updates:
|
48
|
+
* comments
|
49
|
+
* errors
|
50
|
+
* events
|
51
|
+
* projects
|
52
|
+
|
53
|
+
| [#11](https://github.com/bugsnag/bugsnag-api-ruby/pull/11)
|
54
|
+
|
55
|
+
* Adds error response to hitting rate limit
|
56
|
+
| [#10](https://github.com/bugsnag/bugsnag-api-ruby/pull/10)
|
57
|
+
|
58
|
+
### Known Issues
|
59
|
+
|
60
|
+
* per_page option not respected in paginated API calls
|
61
|
+
* issues with event_fields not being created correctly
|
62
|
+
|
4
63
|
1.0.2
|
5
64
|
-----
|
6
65
|
- Fix load-order bug when requiring from certain environments
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# How to contribute
|
2
|
+
|
3
|
+
1. [Fork](https://help.github.com/articles/fork-a-repo) the [library on GitHub](https://github.com/bugsnag/bugsnag-api-ruby)
|
4
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
5
|
+
3. Commit and push until you are happy with your contribution
|
6
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
7
|
+
5. Run the tests and make sure they all pass:
|
8
|
+
|
9
|
+
```
|
10
|
+
rake spec
|
11
|
+
```
|
12
|
+
|
13
|
+
6. Create a [Pull Request](https://help.github.com/articles/using-pull-requests)
|
14
|
+
|
15
|
+
Thank you!
|
16
|
+
|
17
|
+
## How to release
|
18
|
+
|
19
|
+
If you're a member of the core team, follow these instructions for releasing bugsnag-api-ruby.
|
20
|
+
|
21
|
+
### First time setup
|
22
|
+
|
23
|
+
* Create a Rubygems account
|
24
|
+
* Get a member of the platforms team to add you as contributor on bugsnag-ruby in Rubygems
|
25
|
+
|
26
|
+
### Every time
|
27
|
+
|
28
|
+
* Update `CHANGELOG.md`
|
29
|
+
* Update the version number in [`lib/bugsnag/api/version.rb`](./lib/bugsnag/api/version.rb)
|
30
|
+
* Update `README.md` if necessary with changes to the interface or configuration
|
31
|
+
* Commit/push your changes
|
32
|
+
* Release to rubygems
|
33
|
+
|
34
|
+
```
|
35
|
+
gem build bugsnag-api.gemspec
|
36
|
+
gem push bugsnag-api-[version].gem
|
37
|
+
```
|
38
|
+
* Create a new GitHub release, copying the changes from the change log
|
39
|
+
|
40
|
+
|
data/Gemfile
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
+
# Any :development dependencies are ignored for license auditing purposes
|
4
|
+
group :development do
|
5
|
+
end
|
6
|
+
|
7
|
+
# Any :test dependencies are ignored for license auditing purposes
|
8
|
+
group :test do
|
9
|
+
end
|
10
|
+
|
3
11
|
# Specify your gem's dependencies in bugsnag-api.gemspec
|
4
12
|
gemspec
|
13
|
+
|
data/README.md
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
Bugsnag API Toolkit for Ruby
|
2
2
|
============================
|
3
|
+
![Build status](https://travis-ci.org/bugsnag/bugsnag-api-ruby.svg?branch=master)
|
4
|
+
|
5
|
+
The library allows for quick read/write access to the [Bugsnag Data Access API](https://docs.bugsnag.com/api/data-access/) from your Ruby applications. You can use this library to build your own applications which leverage data found in your Bugsnag dashboard.
|
3
6
|
|
4
|
-
|
7
|
+
Version 2.x (current) of this gem corresponds to v2 of the Data Access API, while [1.x](https://github.com/bugsnag/bugsnag-api-ruby/tree/v1.0.3) uses the (deprecated) v1 of the Data Access API.
|
5
8
|
|
6
|
-
If you are looking to automatically detect crashes in your Ruby apps, you should take a look at the [Bugsnag Ruby Detection Library](https://bugsnag.com/
|
9
|
+
If you are looking to automatically detect crashes in your Ruby apps, you should take a look at the [Bugsnag Ruby Detection Library](https://docs.bugsnag.com/platforms/ruby) instead.
|
7
10
|
|
8
11
|
This library borrows heavily from the code and philosophies of the fantastic [Octokit](https://github.com/octokit/octokit.rb) library. A big thanks to [@pengwynn](https://github.com/pengwynn) and the rest of the Octokit team!
|
9
12
|
|
@@ -17,14 +20,18 @@ This library borrows heavily from the code and philosophies of the fantastic [Oc
|
|
17
20
|
- [Accessing Related Resources](#accessing-related-resources)
|
18
21
|
- [Authentication](#authentication)
|
19
22
|
- [Pagination](#pagination)
|
23
|
+
- [Filtering](#filtering)
|
20
24
|
- [Accessing HTTP responses](#accessing-http-responses)
|
21
25
|
- [API Methods](#api-methods)
|
22
|
-
- [
|
26
|
+
- [Organizations](#organizations)
|
27
|
+
- [Collaborators](#collaborators)
|
23
28
|
- [Comments](#comments)
|
24
29
|
- [Errors](#errors)
|
25
30
|
- [Events](#events)
|
31
|
+
- [Event Fields](#event-fields)
|
32
|
+
- [Pivots](#pivots)
|
26
33
|
- [Projects](#projects)
|
27
|
-
- [
|
34
|
+
- [Trends](#trends)
|
28
35
|
- [Advanced Configuration](#advanced-configuration)
|
29
36
|
|
30
37
|
|
@@ -51,6 +58,12 @@ $ gem install bugsnag-api
|
|
51
58
|
|
52
59
|
## Usage
|
53
60
|
|
61
|
+
### Require gem
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
require 'bugsnag/api'
|
65
|
+
```
|
66
|
+
|
54
67
|
### Making Requests
|
55
68
|
|
56
69
|
API methods are available as module methods or as client instance methods.
|
@@ -58,42 +71,44 @@ API methods are available as module methods or as client instance methods.
|
|
58
71
|
```ruby
|
59
72
|
# Provide authentication credentials
|
60
73
|
Bugsnag::Api.configure do |config|
|
61
|
-
config.auth_token = "your-
|
74
|
+
config.auth_token = "your-personal-auth-token"
|
62
75
|
end
|
63
76
|
|
64
|
-
#
|
65
|
-
|
77
|
+
# Access API methods
|
78
|
+
organizations = Bugsnag::Api.organizations
|
66
79
|
```
|
67
80
|
|
68
81
|
or...
|
69
82
|
|
70
83
|
```ruby
|
71
84
|
# Create an non-static API client
|
72
|
-
client = Bugsnag::Api::Client.new(auth_token: "your-
|
85
|
+
client = Bugsnag::Api::Client.new(auth_token: "your-personal-auth-token")
|
73
86
|
|
74
87
|
# Access API methods on the client
|
75
|
-
|
88
|
+
organizations = client.organizations
|
76
89
|
```
|
77
90
|
|
78
91
|
### Consuming Resources
|
79
92
|
|
80
|
-
Most methods return a `Resource`
|
93
|
+
Most methods return a [`Resource`](http://www.rubydoc.info/gems/sawyer/Sawyer/Resource)
|
94
|
+
object which provides dot notation and [] access for fields returned in the API
|
95
|
+
response.
|
81
96
|
|
82
97
|
```ruby
|
83
|
-
# Fetch
|
84
|
-
|
98
|
+
# Fetch an organization
|
99
|
+
org = Bugsnag::Api.organization("organization-id")
|
85
100
|
|
86
|
-
puts
|
101
|
+
puts org.name
|
87
102
|
# => "Acme Co"
|
88
103
|
|
89
|
-
puts
|
90
|
-
# => #<Set: {:id, :name, :
|
104
|
+
puts org.fields
|
105
|
+
# => #<Set: {:id, :name, :slug, :creator, :created_at, :updated_at, :auto_upgrade, :upgrade_url, :billing_emails}>
|
91
106
|
|
92
|
-
puts
|
107
|
+
puts org.id
|
93
108
|
# => "50baed0d9bf39c1431000003"
|
94
109
|
|
95
|
-
account.rels[:
|
96
|
-
# => "https://api.bugsnag.com/
|
110
|
+
account.rels[:upgrade].href
|
111
|
+
# => "https://api.bugsnag.com/organizations/50baed0d9bf39c1431000003/..."
|
97
112
|
```
|
98
113
|
|
99
114
|
### Accessing Related Resources
|
@@ -101,15 +116,15 @@ account.rels[:users].href
|
|
101
116
|
Resources returned by Bugsnag API methods contain not only data but hypermedia link relations:
|
102
117
|
|
103
118
|
```ruby
|
104
|
-
|
119
|
+
project = Bugsnag::Api.projects("organization-id")
|
105
120
|
|
106
121
|
# Get the users rel, returned from the API as users_url in the resource
|
107
|
-
|
108
|
-
# => "https://api.bugsnag.com/
|
122
|
+
project.rels[:errors].href
|
123
|
+
# => "https://api.bugsnag.com/projects/50baed0d9bf39c1431000003/errors"
|
109
124
|
|
110
|
-
|
111
|
-
|
112
|
-
# => "
|
125
|
+
errors = project.rels[:errors].get.data
|
126
|
+
errors.first.message
|
127
|
+
# => "Can't find method: getStrng()"
|
113
128
|
```
|
114
129
|
|
115
130
|
When processing API responses, all `*_url` attributes are culled in to the link relations collection. Any `url` attribute becomes `.rels[:self]`.
|
@@ -118,16 +133,17 @@ When processing API responses, all `*_url` attributes are culled in to the link
|
|
118
133
|
### Authentication
|
119
134
|
|
120
135
|
API usage requires authentication. You can authenticate using either your
|
121
|
-
Bugsnag account's [auth token](https://bugsnag.com/
|
122
|
-
or with your Bugsnag
|
136
|
+
Bugsnag account's [auth token](https://app.bugsnag.com/settings/my-account/)
|
137
|
+
or with your Bugsnag user credentials.
|
123
138
|
|
124
139
|
```ruby
|
125
140
|
# Authenticate with your Bugsnag account's auth token
|
126
141
|
Bugsnag::Api.configure do |config|
|
127
|
-
config.auth_token = "your-
|
142
|
+
config.auth_token = "your-personal-auth-token"
|
128
143
|
end
|
129
144
|
|
130
|
-
# Authenticate using your Bugsnag email address and password
|
145
|
+
# Authenticate using your Bugsnag email address and password. Unavailable when
|
146
|
+
# using multi-factor authentication.
|
131
147
|
Bugsnag::Api.configure do |config|
|
132
148
|
config.email = "example@example.com"
|
133
149
|
config.password = "password"
|
@@ -140,46 +156,102 @@ Many Bugsnag API resources are paginated. While you may be tempted to start addi
|
|
140
156
|
|
141
157
|
```ruby
|
142
158
|
errors = Bugsnag::Api.errors("project-id", per_page: 100)
|
143
|
-
|
159
|
+
last_response = Bugsnag::Api.last_response
|
160
|
+
until last_response.rels[:next].nil?
|
161
|
+
last_response = last_response.rels[:next].get
|
162
|
+
errors.concat last_response.data
|
163
|
+
end
|
144
164
|
```
|
145
165
|
|
166
|
+
### Filtering
|
167
|
+
|
168
|
+
Events and Errors can be filtered to return a subset of data. Any of the filters usable in the Bugsnag dashoard can be used in this API. The filter object is a hash of Event Field keys containing an array of filter values. Each filter value has a `type` and a `value` to filter on. The type determines the type of comparison that will be performed.
|
169
|
+
|
170
|
+
| `type` | Description | Multiple value combination logic |
|
171
|
+
|-|-|-|
|
172
|
+
| `eq` | Filter for items that 'match' the value. Some fields require an exact match and some support substring matching. | OR |
|
173
|
+
| `ne` | Filter for items that don't match the value. | AND |
|
174
|
+
|
175
|
+
:warning: Note that the Event Field `search` can not be used more than once in a call.
|
176
|
+
|
177
|
+
You can see the filterable fields for a project using the following snippet, after setting the `project-id` value.
|
178
|
+
|
179
|
+
```ruby
|
180
|
+
fields = Bugsnag::Api.event_fields("project-id")
|
181
|
+
|
182
|
+
puts "List of the searchable fields for this project:"
|
183
|
+
fields.each_with_index do |field,idx|
|
184
|
+
puts " [#{idx}] #{field.display_id}"
|
185
|
+
end
|
186
|
+
# => List of the searchable fields for this project:
|
187
|
+
# => [0] event
|
188
|
+
# => [1] error
|
189
|
+
# => [2] search
|
190
|
+
# => [3] user.id
|
191
|
+
# => ...
|
192
|
+
```
|
146
193
|
|
147
194
|
### Accessing HTTP responses
|
148
195
|
|
149
196
|
While most methods return a `Resource` object or a `Boolean`, sometimes you may need access to the raw HTTP response headers. You can access the last HTTP response with `Client#last_response`:
|
150
197
|
|
151
198
|
```ruby
|
152
|
-
|
153
|
-
response
|
154
|
-
status
|
199
|
+
organization = Bugsnag::Api.organizations.first
|
200
|
+
response = Bugsnag::Api.last_response
|
201
|
+
status = response.headers[:status]
|
155
202
|
```
|
156
203
|
|
157
204
|
## API Methods
|
158
205
|
|
159
|
-
|
206
|
+
The following methods are available via `Bugsnag::Api` and the Client interface.
|
207
|
+
For more information, consult the [API
|
208
|
+
documentation](http://www.rubydoc.info/gems/bugsnag-api/Bugsnag/Api/Client)
|
209
|
+
|
210
|
+
### Organizations
|
160
211
|
|
161
212
|
```ruby
|
162
|
-
# List your
|
163
|
-
|
213
|
+
# List your organizations
|
214
|
+
orgs = Bugsnag::Api.organizations
|
164
215
|
|
165
|
-
# Get a single
|
166
|
-
|
216
|
+
# Get a single organization
|
217
|
+
org = Bugsnag::Api.organization("organization-id")
|
218
|
+
```
|
167
219
|
|
168
|
-
|
169
|
-
|
220
|
+
### Collaborators
|
221
|
+
|
222
|
+
```ruby
|
223
|
+
# List organization collaborators
|
224
|
+
users = Bugsnag::Api.collaborators("organization-id")
|
225
|
+
|
226
|
+
# List project collaborators
|
227
|
+
users = Bugsnag::Api.collaborators(nil, "project-id")
|
228
|
+
|
229
|
+
# Invite a user to an account
|
230
|
+
user = Bugsnag::Api.invite_collaborators("org-id", "example@example.com", {
|
231
|
+
admin: true
|
232
|
+
})
|
233
|
+
|
234
|
+
# Update a user's account permissions
|
235
|
+
user = Bugsnag::Api.update_collaborator_permissions("org-id", "user-id", {
|
236
|
+
admin: false
|
237
|
+
})
|
238
|
+
|
239
|
+
# Remove a user from an account
|
240
|
+
Bugsnag::Api.delete_collaborator("org-id", "user-id")
|
170
241
|
```
|
171
242
|
|
243
|
+
|
172
244
|
### Comments
|
173
245
|
|
174
246
|
```ruby
|
175
247
|
# List error comments
|
176
|
-
comments = Bugsnag::Api.comments("error-id")
|
248
|
+
comments = Bugsnag::Api.comments("project-id", "error-id")
|
177
249
|
|
178
250
|
# Get a single comment
|
179
|
-
comment = Bugsnag::Api.comment("comment-id")
|
251
|
+
comment = Bugsnag::Api.comment("project-id", "comment-id")
|
180
252
|
|
181
253
|
# Create a comment
|
182
|
-
comment = Bugsnag::Api.create_comment("error-id", "comment message")
|
254
|
+
comment = Bugsnag::Api.create_comment("project-id", "error-id", "comment message")
|
183
255
|
|
184
256
|
# Update a comment
|
185
257
|
comment = Bugsnag::Api.update_comment("comment-id", "new comment message")
|
@@ -192,24 +264,26 @@ Bugsnag::Api.delete_comment("comment-id")
|
|
192
264
|
|
193
265
|
```ruby
|
194
266
|
# List project errors
|
195
|
-
errors = Bugsnag::Api.errors("project-id")
|
267
|
+
errors = Bugsnag::Api.errors("project-id", nil)
|
268
|
+
|
269
|
+
# List errors with a filter (see Filtering section for more information)
|
270
|
+
# Returns errors that match `EXC_BAD_INSTRUCTION`, this could be from the error class, message, context, or stack trace.
|
271
|
+
errors = Bugsnag::Api.errors("project-id", nil, direction:"desc", filters: {
|
272
|
+
"search": [{ "type":"eq", "value":"EXC_BAD_INSTRUCTION" }]
|
273
|
+
})
|
196
274
|
|
197
275
|
# Get a single error
|
198
|
-
error = Bugsnag::Api.error("error-id")
|
276
|
+
error = Bugsnag::Api.error("project-id", "error-id")
|
199
277
|
|
200
|
-
#
|
201
|
-
error = Bugsnag::Api.
|
278
|
+
# Update a single error
|
279
|
+
error = Bugsnag::Api.update_errors("project-id", "error-id")
|
202
280
|
|
203
|
-
#
|
204
|
-
error = Bugsnag::Api.
|
205
|
-
|
206
|
-
# Update an error
|
207
|
-
error = Bugsnag::Api.update_error("error-id", {
|
208
|
-
resolved: true
|
209
|
-
})
|
281
|
+
# Update bulk errors
|
282
|
+
error = Bugsnag::Api.update_errors("project-id",
|
283
|
+
["error-id1", "error-id2"])
|
210
284
|
|
211
285
|
# Delete an error
|
212
|
-
error = Bugsnag::Api.delete_error("error-id")
|
286
|
+
error = Bugsnag::Api.delete_error("project-id", "error-id")
|
213
287
|
```
|
214
288
|
|
215
289
|
### Events
|
@@ -219,78 +293,87 @@ error = Bugsnag::Api.delete_error("error-id")
|
|
219
293
|
events = Bugsnag::Api.events("project-id")
|
220
294
|
|
221
295
|
# List error events
|
222
|
-
events = Bugsnag::Api.error_events("error-id")
|
296
|
+
events = Bugsnag::Api.error_events("project-id", "error-id")
|
297
|
+
|
298
|
+
# List events with a filter (see Filtering section for more information)
|
299
|
+
# Returns events with
|
300
|
+
# class `EXC_BAD_INSTRUCTION` OR `EXC_BAD_ACCESS`
|
301
|
+
# AND where the device is jailbroken
|
302
|
+
events = Bugsnag::Api.events(PROJECT_ID, direction:"desc", filters: {
|
303
|
+
"event.class": [{ "type":"eq", "value":"EXC_BAD_INSTRUCTION" }, { "type":"eq", "value":"EXC_BAD_ACCESS" }],
|
304
|
+
"device.jailbroken": [{ "type":"eq", "value":"false"}]
|
305
|
+
})
|
306
|
+
|
307
|
+
# Get the latest event
|
308
|
+
event = Bugsnag::Api.latest_event("project-id", "error-id")
|
223
309
|
|
224
310
|
# Get a single event
|
225
|
-
event = Bugsnag::Api.event("event-id")
|
311
|
+
event = Bugsnag::Api.event("project-id", "event-id")
|
226
312
|
|
227
313
|
# Delete an event
|
228
|
-
Bugsnag::Api.delete_event("event-id")
|
314
|
+
Bugsnag::Api.delete_event("project-id", "event-id")
|
229
315
|
```
|
230
316
|
|
231
|
-
###
|
317
|
+
### Event Fields
|
232
318
|
|
233
319
|
```ruby
|
234
|
-
#
|
235
|
-
|
320
|
+
# list a project's event fields
|
321
|
+
Bugsnag::Api.event_fields("project-id")
|
236
322
|
|
237
|
-
#
|
238
|
-
|
323
|
+
# create an event field
|
324
|
+
Bugsnag::Api.create_event_field("project-id", "display id", "path.to.field", {})
|
239
325
|
|
240
|
-
#
|
241
|
-
|
326
|
+
# update an event field
|
327
|
+
Bugsnag::Api.update_event_field("project-id", "display id", "new.path.to.field")
|
328
|
+
|
329
|
+
# delete an event field
|
330
|
+
Bugsnag::Api.delete_event_field("project-id", "display id")
|
331
|
+
```
|
332
|
+
|
333
|
+
### Projects
|
334
|
+
|
335
|
+
```ruby
|
336
|
+
# List organization projects
|
337
|
+
projects = Bugsnag::Api.projects("organization-id")
|
242
338
|
|
243
339
|
# Get a single project
|
244
340
|
project = Bugsnag::Api.project("project-id")
|
245
341
|
|
246
342
|
# Create a project
|
247
|
-
project = Bugsnag::Api.create_project("
|
248
|
-
name: "Name",
|
249
|
-
type: "rails"
|
250
|
-
})
|
343
|
+
project = Bugsnag::Api.create_project("organization-id", "project name", "rails")
|
251
344
|
|
252
345
|
# Update a project
|
253
346
|
project = Bugsnag::Api.update_project("project-id", {
|
254
347
|
name: "New Name"
|
255
348
|
})
|
256
349
|
|
350
|
+
# Regenerate a project API key
|
351
|
+
Bugsnag::Api.regenerate_api_key("project-id")
|
352
|
+
|
257
353
|
# Delete a project
|
258
354
|
Bugsnag::Api.delete_project("project-id")
|
259
355
|
```
|
260
356
|
|
261
|
-
###
|
357
|
+
### Pivots
|
262
358
|
|
263
359
|
```ruby
|
264
|
-
#
|
265
|
-
|
266
|
-
|
267
|
-
# List authenticated account's users (requires account auth)
|
268
|
-
users = Bugsnag::Api.users
|
360
|
+
# list a project's pivots
|
361
|
+
Bugsnag::Api.pivots("project-id")
|
269
362
|
|
270
|
-
#
|
271
|
-
|
272
|
-
|
273
|
-
# Get a single user
|
274
|
-
user = Bugsnag::Api.user("user-id")
|
275
|
-
|
276
|
-
# Get authenticated user (requires user auth)
|
277
|
-
user = Bugsnag::Api.user
|
363
|
+
# list pivot values
|
364
|
+
Bugsnag::Api.pivot_values("project-id", "display id")
|
365
|
+
```
|
278
366
|
|
279
|
-
|
280
|
-
user = Bugsnag::Api.invite_user("account-id", "example@example.com", {
|
281
|
-
admin: true
|
282
|
-
})
|
367
|
+
### Trends
|
283
368
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
})
|
369
|
+
```ruby
|
370
|
+
# list an error's trends in 5 buckets
|
371
|
+
Bugsnag::Api.trends_buckets("project-id", 5, "error-id")
|
288
372
|
|
289
|
-
#
|
290
|
-
Bugsnag::Api.
|
373
|
+
# list a project's trends by resolution
|
374
|
+
Bugsnag::Api.trends_resolution("project-id", "2h")
|
291
375
|
```
|
292
376
|
|
293
|
-
|
294
377
|
## Advanced Configuration
|
295
378
|
|
296
379
|
### Endpoint
|
@@ -299,7 +382,7 @@ By default, `https://api.bugsnag.com` is used for API access, if you are using
|
|
299
382
|
Bugsnag Enterprise, you can configure a custom endpoint.
|
300
383
|
|
301
384
|
```ruby
|
302
|
-
Bugsnag
|
385
|
+
Bugsnag::Api.configure do |config|
|
303
386
|
config.endpoint = "http://api.bugsnag.example.com"
|
304
387
|
end
|
305
388
|
```
|
@@ -309,7 +392,7 @@ end
|
|
309
392
|
If you are using a proxy, you can configure the API client to use it.
|
310
393
|
|
311
394
|
```ruby
|
312
|
-
Bugsnag
|
395
|
+
Bugsnag::Api.configure do |config|
|
313
396
|
config.proxy = {
|
314
397
|
uri: "http://proxy.example.com",
|
315
398
|
user: "foo",
|
@@ -319,20 +402,6 @@ end
|
|
319
402
|
```
|
320
403
|
|
321
404
|
|
322
|
-
## Build Status
|
323
|
-
|
324
|
-
![Build status](https://travis-ci.org/bugsnag/bugsnag-api-ruby.svg?branch=master)
|
325
|
-
|
326
|
-
|
327
|
-
## Contributing
|
328
|
-
|
329
|
-
1. Fork it
|
330
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
331
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
332
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
333
|
-
5. Create new Pull Request
|
334
|
-
|
335
|
-
|
336
405
|
## License
|
337
406
|
|
338
407
|
The Bugsnag API Toolkit for Ruby is free software released under the MIT License. See [LICENSE.txt](LICENSE.txt) for details.
|