arthur 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 51eb37332f248a9befa3f6b8038d7609dd5ff246
4
+ data.tar.gz: c71e6d4356acb00c7120432c2083b11d3b67ed32
5
+ SHA512:
6
+ metadata.gz: ae68a8046225cefc7dd01f0d1292cb5a40955d25826e732165ec216cd747aad18968378d451d9b35f4d6ae30ea2c30cadbae38ac58ef13df2d064c02dc03d3f8
7
+ data.tar.gz: 801afaa2aefc825ab683e7e0346ac24d443d7784f704d5eb0f07ca5f130371ba527c8fd0a26fe5999ac9e68676a2bbaedc5d94fafe83f6d349c23eedd9ca4370
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - jruby-19mode
4
+ - jruby-head
5
+ - rbx-2
6
+ - 1.9.2
7
+ - 1.9.3
8
+ - 2.0.0
9
+ - 2.1.0
10
+ - 2.1.2
@@ -0,0 +1,14 @@
1
+ Contributing
2
+ ============
3
+
4
+ If you would like to contribute code to Arthur you can do so through GitHub by
5
+ forking the repository and sending a pull request.
6
+
7
+ When submitting code, please make every effort to follow existing conventions
8
+ and style in order to keep the code as readable as possible. Please also make
9
+ sure tests pass by running `rake`.
10
+
11
+ Before your code can be accepted into the project you must also sign the
12
+ [Individual Contributor License Agreement (CLA)][1]. We're sorry.
13
+
14
+ [1]: https://spreadsheets.google.com/spreadsheet/viewform?formkey=dDViT2xzUHAwRkI3X3k5Z0lQM091OGc6MQ&ndplr=1
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://www.rubygems.org'
2
+
3
+ gem 'rest-client'
4
+ gem 'rake'
5
+
6
+ group :test do
7
+ gem 'webmock'
8
+ gem 'rspec'
9
+ gem 'pry'
10
+ end
@@ -0,0 +1,44 @@
1
+ GEM
2
+ remote: https://www.rubygems.org/
3
+ specs:
4
+ addressable (2.3.6)
5
+ coderay (1.1.0)
6
+ crack (0.4.2)
7
+ safe_yaml (~> 1.0.0)
8
+ diff-lcs (1.2.5)
9
+ method_source (0.8.2)
10
+ mime-types (2.3)
11
+ pry (0.9.12.6)
12
+ coderay (~> 1.0)
13
+ method_source (~> 0.8)
14
+ slop (~> 3.4)
15
+ rake (10.3.2)
16
+ rest-client (1.6.7)
17
+ mime-types (>= 1.16)
18
+ rspec (3.0.0)
19
+ rspec-core (~> 3.0.0)
20
+ rspec-expectations (~> 3.0.0)
21
+ rspec-mocks (~> 3.0.0)
22
+ rspec-core (3.0.2)
23
+ rspec-support (~> 3.0.0)
24
+ rspec-expectations (3.0.2)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.0.0)
27
+ rspec-mocks (3.0.2)
28
+ rspec-support (~> 3.0.0)
29
+ rspec-support (3.0.2)
30
+ safe_yaml (1.0.3)
31
+ slop (3.5.0)
32
+ webmock (1.18.0)
33
+ addressable (>= 2.3.6)
34
+ crack (>= 0.3.2)
35
+
36
+ PLATFORMS
37
+ ruby
38
+
39
+ DEPENDENCIES
40
+ pry
41
+ rake
42
+ rest-client
43
+ rspec
44
+ webmock
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Square, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,22 @@
1
+ Arthur eats bugs! Specifically, it consumes Bugsnag's API to allow you to view project details, errors,
2
+ error details etc.
3
+
4
+ ####Initial setup
5
+ Arthur::Api.configure(base_url, auth_token)
6
+
7
+ ####Get project details
8
+ Arthur::Project.fetch(project_id)
9
+
10
+ ####Get project errors
11
+ Arthur::Project.fetch(project_id).errors
12
+
13
+ ####Get error details
14
+ Arthur::Error.fetch(error_id)
15
+
16
+ ####Get error count in environment
17
+ Arthur::Error.fetch(error_id).count_in_environment(env)
18
+
19
+ ####Run tests
20
+ rake
21
+
22
+ Arthur is released under the MIT License (http://www.opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require 'rake/testtask'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "arthur"
7
+ spec.version = "1.0.0"
8
+ spec.authors = ['Bella Norvig', 'Danny Spencer']
9
+ spec.email = %w(bella@squareup.com dspencer@squareup.com)
10
+ spec.description = 'Consumes the Bugsnag API.'
11
+ spec.summary = 'Consumes the Bugsnag API, for real!'
12
+ spec.homepage = "https://github.com/square/arthur"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency('rest-client')
21
+
22
+ spec.add_development_dependency('rake')
23
+ spec.add_development_dependency('pry')
24
+ spec.add_development_dependency('rspec', '>= 3.0')
25
+ spec.add_development_dependency('webmock', '>= 1.18')
26
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'arthur/api'
2
+ require_relative 'arthur/project'
3
+ require_relative 'arthur/error'
@@ -0,0 +1,60 @@
1
+ require 'json'
2
+ require 'open-uri'
3
+ require 'rest-client'
4
+
5
+ module Arthur
6
+ module Api
7
+ # return JSON parsed response
8
+ def self.get(path, opts = {})
9
+ all_elements = []
10
+ next_offset = nil
11
+
12
+ loop do
13
+ response = RestClient.get(full_path(path), 'params' => prune_options(opts.merge(offset: next_offset)))
14
+
15
+ next_offset = nil
16
+ if response.headers[:link]
17
+ rel_next = response.headers[:link].match(/\<(.*)\>; rel=\"next\"/)
18
+ if rel_next
19
+ next_offset = URI.unescape(rel_next[1].match(/[&?]offset=([^&>]*)/)[1])
20
+ end
21
+ end
22
+ json_parsed_response = JSON.parse(response.body)
23
+
24
+ if json_parsed_response.is_a?(Array)
25
+ all_elements += json_parsed_response
26
+ else
27
+ return json_parsed_response
28
+ end
29
+ break unless next_offset
30
+ end
31
+
32
+ all_elements
33
+ end
34
+
35
+ def self.prune_options(options={})
36
+ options.merge(auth_token: auth_token).delete_if{ |_, value| value.nil? }
37
+ end
38
+
39
+ def self.full_path(path)
40
+ "#{base_path}#{path}"
41
+ end
42
+
43
+ def self.configure(path, token)
44
+ @base_path = path
45
+ @auth_token = token
46
+ end
47
+
48
+ def self.base_path
49
+ if @base_path
50
+ @base_path
51
+ else
52
+ 'https://api.bugsnag.com'
53
+ end
54
+ end
55
+
56
+ def self.auth_token
57
+ @auth_token
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'api'
2
+
3
+ module Arthur
4
+ class Error
5
+ def self.fetch(error_id)
6
+ Arthur::Error.new(Arthur::Api.get("/errors/#{error_id}"))
7
+ end
8
+
9
+ attr_reader :data
10
+
11
+ def initialize(data)
12
+ @data = data
13
+ end
14
+
15
+ def count_in_environment(env)
16
+ @data['release_stages'].fetch(env, 0)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'api'
2
+
3
+ module Arthur
4
+ class Project
5
+ def self.list
6
+ Arthur::Api.get("/account/projects").map do |project|
7
+ Arthur::Project.new(project)
8
+ end
9
+ end
10
+
11
+ def self.fetch(project_id)
12
+ Arthur::Project.new(Arthur::Api.get("/projects/#{project_id}"))
13
+ end
14
+
15
+ attr_reader :data
16
+
17
+ def initialize(data)
18
+ @data = data
19
+ end
20
+
21
+ def errors
22
+ Arthur::Api.get("/projects/#{@data['id']}/errors").map do |project|
23
+ Arthur::Error.new(project)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Arthur
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,63 @@
1
+ require 'arthur/error'
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Arthur::Error do
6
+ before do
7
+ stub_request(:get, full_url(path)).to_return(:body => api_response)
8
+ end
9
+
10
+ let(:api_response) do
11
+ %({
12
+ "id": "518031bcd775355c48a1cd4f",
13
+ "class": "NoMethodError",
14
+ "last_message": "undefined method `name' for nil:NilClass",
15
+ "last_context": "mailer#admin",
16
+ "resolved": false,
17
+ "occurrences": 8,
18
+ "users_affected": 8,
19
+ "contexts": {
20
+ "mailer#admin": 8
21
+ },
22
+ "release_stages": {
23
+ "production": 8
24
+ },
25
+ "first_received": "2013-04-30T21:03:56Z",
26
+ "last_received": "2013-07-29T10:42:05Z",
27
+ "comments_url": "bugsnag-host/errors/518031bcd775355c48a1cd4f/comments",
28
+ "events_url": "bugsnag-host/errors/518031bcd775355c48a1cd4f/events",
29
+ "html_url": "https://bugsnag.com/errors/518031bcd775355c48a1cd4f",
30
+ "url": "bugsnag-host/errors/518031bcd775355c48a1cd4f"
31
+ })
32
+ end
33
+
34
+ let(:error_id) { "518031bcd775355c48a1cd4f" }
35
+
36
+ let(:error) do
37
+ Arthur::Error.fetch(error_id)
38
+ end
39
+
40
+ let(:path) { "/errors/#{error_id}"}
41
+
42
+ describe '.fetch' do
43
+ it "fetches the correct data from the API" do
44
+ expect(error.data['id']).to eq(error_id)
45
+ expect(error.data['occurrences']).to eq(8)
46
+ end
47
+ end
48
+
49
+ describe '#count_in_environment' do
50
+ context 'production environment' do
51
+ subject do
52
+ error.count_in_environment('production')
53
+ end
54
+ it { should eq(8) }
55
+ end
56
+ context 'staging environment' do
57
+ subject do
58
+ error.count_in_environment('staging')
59
+ end
60
+ it { should eq(0) }
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,178 @@
1
+ require 'arthur/project'
2
+ require 'arthur/error'
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Arthur::Project do
7
+ describe '.list' do
8
+ let(:path) do
9
+ '/account/projects'
10
+ end
11
+ let(:api_response) do
12
+ '[
13
+ {
14
+ "id": "50baed119bf39c1431000004",
15
+ "name": "Website",
16
+ "api_key": "a0f5e56c125d2eeac31fd66e4f0cbd79",
17
+ "errors": 78,
18
+ "icon": "https://bugsnag.com/assets/frameworks/rails.png",
19
+ "release_stages": ["production", "development"],
20
+ "type": "rails",
21
+ "created_at": "2012-12-02T05:54:25Z",
22
+ "updated_at": "2013-06-17T19:57:49Z",
23
+ "errors_url": "bugsnag-host/projects/50baed119bf39c1431000004/errors",
24
+ "events_url": "bugsnag-host/projects/50baed119bf39c1431000004/events",
25
+ "html_url": "https://bugsnag.com/dashboard/website",
26
+ "url": "bugsnag-host/projects/50baed119bf39c1431000004"
27
+ },
28
+ {
29
+ "id": "50baed119bf39c1431000007",
30
+ "name": "Another Website",
31
+ "api_key": "a0f5e56c125d2eeac31fd66e4f0cbd79",
32
+ "errors": 25,
33
+ "icon": "https://bugsnag.com/assets/frameworks/rails.png",
34
+ "release_stages": ["production", "development"],
35
+ "type": "rails",
36
+ "created_at": "2012-12-02T05:54:25Z",
37
+ "updated_at": "2013-06-17T19:57:49Z",
38
+ "errors_url": "bugsnag-host/projects/50baed119bf39c1431000004/errors",
39
+ "events_url": "bugsnag-host/projects/50baed119bf39c1431000004/events",
40
+ "html_url": "https://bugsnag.com/dashboard/website",
41
+ "url": "bugsnag-host/projects/50baed119bf39c1431000004"
42
+ }
43
+ ]'
44
+ end
45
+
46
+ it "returns the correct list" do
47
+ # stub_api_response(api_response)
48
+ stub_request(:get, full_url(path)).to_return(:body => api_response)
49
+ responses = Arthur::Project.list
50
+ expect(responses.first.data['id']).to eq("50baed119bf39c1431000004")
51
+ expect(responses.first.data['name']).to eq("Website")
52
+ expect(responses.last.data['id']).to eq("50baed119bf39c1431000007")
53
+ expect(responses.last.data['name']).to eq("Another Website")
54
+ end
55
+ end
56
+
57
+
58
+ describe '.fetch' do
59
+ let(:project_id) { "50baed119bf39c1431000004" }
60
+ let(:path) { "/projects/#{project_id}" }
61
+
62
+ let(:api_response) do
63
+ '{
64
+ "id": "50baed119bf39c1431000004",
65
+ "name": "Website",
66
+ "api_key": "a0f5e56c125d2eeac31fd66e4f0cbd79",
67
+ "errors": 78,
68
+ "icon": "https://bugsnag.com/assets/frameworks/rails.png",
69
+ "release_stages": ["production", "development"],
70
+ "type": "rails",
71
+ "created_at": "2012-12-02T05:54:25Z",
72
+ "updated_at": "2013-06-17T19:57:49Z",
73
+ "errors_url": "bugsnag-host/projects/50baed119bf39c1431000004/errors",
74
+ "events_url": "bugsnag-host/projects/50baed119bf39c1431000004/events",
75
+ "html_url": "https://bugsnag.com/dashboard/website",
76
+ "url": "bugsnag-host/projects/50baed119bf39c1431000004"
77
+ }'
78
+ end
79
+
80
+ it "returns the correct project" do
81
+ stub_request(:get, full_url(path)).to_return(:body => api_response)
82
+ response = Arthur::Project.fetch(project_id)
83
+ expect(response.data['id']).to eq(project_id)
84
+ expect(response.data['name']).to eq("Website")
85
+ end
86
+ end
87
+
88
+ context '#errors' do
89
+ let(:path) { "/projects/#{example_project.data['id']}/errors" }
90
+ let(:example_project) do
91
+ Arthur::Project.new(
92
+ "id" => "50baed119bf39c1431000004",
93
+ "name" => "Website",
94
+ "api_key" => "a0f5e56c125d2eeac31fd66e4f0cbd79",
95
+ "errors" => 78,
96
+ "icon" => "https://bugsnag.com/assets/frameworks/rails.png",
97
+ "release_stages" => ["production", "development"],
98
+ "type" => "rails",
99
+ "created_at" => "2012-12-02T05:54:25Z",
100
+ "updated_at" => "2013-06-17T19:57:49Z",
101
+ "errors_url" => "bugsnag-host/projects/50baed119bf39c1431000004/errors",
102
+ "events_url" => "bugsnag-host/projects/50baed119bf39c1431000004/events",
103
+ "html_url" => "https://bugsnag.com/dashboard/website",
104
+ "url" => "bugsnag-host/projects/50baed119bf39c1431000004"
105
+ )
106
+ end
107
+
108
+ let(:api_response) do
109
+ %([
110
+ {
111
+ "id": "518031bcd775355c48a1cd4e",
112
+ "class": "NoMethodError",
113
+ "last_message": "undefined method `name' for nil:NilClass",
114
+ "last_context": "mailer#admin",
115
+ "resolved": false,
116
+ "occurrences": 12,
117
+ "users_affected": 13,
118
+ "contexts": {
119
+ "mailer#admin": 12
120
+ },
121
+ "release_stages": {
122
+ "production": 12
123
+ },
124
+ "first_received": "2013-04-30T21:03:56Z",
125
+ "last_received": "2013-07-29T10:42:05Z",
126
+ "comments_url": "bugsnag-host/errors/518031bcd775355c48a1cd4e/comments",
127
+ "events_url": "bugsnag-host/errors/518031bcd775355c48a1cd4e/events",
128
+ "html_url": "https://bugsnag.com/errors/518031bcd775355c48a1cd4e",
129
+ "url": "bugsnag-host/errors/518031bcd775355c48a1cd4e"
130
+ },
131
+ {
132
+ "id": "518031bcd775355c48a1cd4f",
133
+ "class": "NoMethodError",
134
+ "last_message": "undefined method `name' for nil:NilClass",
135
+ "last_context": "mailer#admin",
136
+ "resolved": false,
137
+ "occurrences": 8,
138
+ "users_affected": 8,
139
+ "contexts": {
140
+ "mailer#admin": 8
141
+ },
142
+ "release_stages": {
143
+ "production": 8
144
+ },
145
+ "first_received": "2013-04-30T21:03:56Z",
146
+ "last_received": "2013-07-29T10:42:05Z",
147
+ "comments_url": "bugsnag-host/errors/518031bcd775355c48a1cd4f/comments",
148
+ "events_url": "bugsnag-host/errors/518031bcd775355c48a1cd4f/events",
149
+ "html_url": "https://bugsnag.com/errors/518031bcd775355c48a1cd4f",
150
+ "url": "bugsnag-host/errors/518031bcd775355c48a1cd4f"
151
+ }
152
+ ])
153
+ end
154
+
155
+ it "returns the correct list" do
156
+ stub_request(:get, full_url(path)).to_return(:body => api_response)
157
+ responses = example_project.errors
158
+ expect(responses.first.data['id']).to eq("518031bcd775355c48a1cd4e")
159
+ expect(responses.last.data['id']).to eq("518031bcd775355c48a1cd4f")
160
+ end
161
+
162
+ context "with a longer list of errors" do
163
+ let(:first_api_response) do
164
+ Array.new(30){ {} }.to_json
165
+ end
166
+ let(:second_api_response) do
167
+ Array.new(20){ {'second' => true} }.to_json
168
+ end
169
+ let(:offset) { "herpderpderp" }
170
+ it "returns the correct list" do
171
+ stub_request(:get, full_url(path)).to_return(:body => first_api_response, :headers => {:link => "<http://localhost/projects/537ab6c3f697833600000001/errors?direction=desc&offset=#{offset}&per_page=30&sort=last_received>; rel=\"next\""})
172
+ stub_request(:get, full_url(path, offset: offset)).to_return(:body => second_api_response)
173
+ responses = example_project.errors
174
+ expect(responses.length).to eq(50)
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,12 @@
1
+ require 'webmock/rspec'
2
+ require 'pry'
3
+
4
+ RSpec.configure do |c|
5
+ c.before do
6
+ Arthur::Api.configure('https://api.custombugsnaghost.com:1234', 'auth-token')
7
+ end
8
+ end
9
+
10
+ def full_url(url, params={})
11
+ RestClient::Request.new({:method => :get, :url => ""}).process_url_params(Arthur::Api.full_path(url), {'params' => params.merge(auth_token: Arthur::Api.auth_token)})
12
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arthur
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bella Norvig
8
+ - Danny Spencer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-08-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: pry
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '3.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: webmock
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '1.18'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '1.18'
84
+ description: Consumes the Bugsnag API.
85
+ email:
86
+ - bella@squareup.com
87
+ - dspencer@squareup.com
88
+ executables: []
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".travis.yml"
93
+ - CONTRIBUTING.md
94
+ - Gemfile
95
+ - Gemfile.lock
96
+ - LICENSE
97
+ - README.md
98
+ - Rakefile
99
+ - arthur.gemspec
100
+ - lib/arthur.rb
101
+ - lib/arthur/api.rb
102
+ - lib/arthur/error.rb
103
+ - lib/arthur/project.rb
104
+ - lib/arthur/version.rb
105
+ - spec/arthur/error_spec.rb
106
+ - spec/arthur/project_spec.rb
107
+ - spec/spec_helper.rb
108
+ homepage: https://github.com/square/arthur
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.2.2
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: Consumes the Bugsnag API, for real!
132
+ test_files:
133
+ - spec/arthur/error_spec.rb
134
+ - spec/arthur/project_spec.rb
135
+ - spec/spec_helper.rb
136
+ has_rdoc: