honeybadger 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cbb055f81d8f22c73d15a07319416223dc2088e8
4
+ data.tar.gz: 97d3c1ea643d868e725df494d10710bf353a0cd0
5
+ SHA512:
6
+ metadata.gz: b59eabe45dd37a73fbc3f5977e1991c84b976b7907d908d6058849d953fca3df3b13c8678e1c1a18fb121854df7d067ec59224e936a9382219fc651bd717c345
7
+ data.tar.gz: 851867be99923a9b115fde0a06934dae4fe04b4424038c41da5b70cb10e625014298aef0ad9475c891b8482fa44705d8625d7602b13848abb787dad3287b3c4b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## Honeybadger 1.8.0 ##
2
+
3
+ * Report memory and load stats
4
+
5
+ *Benjamin Curtis*
6
+
7
+ * Use HONEYBADGER_API_KEY as default value for api_key
8
+
9
+ *Benjamin Curtis*
10
+
11
+ * Prefer notice args to exception attributes
12
+
13
+ *Joshua Wood*
14
+
15
+ * Trim size of notice message to 1k
16
+
17
+ *Joshua Wood*
18
+
19
+ * Make hostname overridable in configuration.
20
+
21
+ *Joshua Wood*
22
+
1
23
  ## Honeybadger 1.7.0 ##
2
24
 
3
25
  * Added a custom grouping option
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- honeybadger (1.7.0)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
data/MIT-LICENSE CHANGED
@@ -1,5 +1,6 @@
1
1
  Copyright (c) 2007 - 2012, Exceptional DBA Airbrake.io
2
2
  Portions Copyright (c) 2012-2013, Honeybadger Industries LLC
3
+ Portions Copyright (c) 2009 Brenton Fletcher (http://i.bloople.net i@bloople.net)
3
4
 
4
5
  NOTE: All code contained herein that is copyright Exceptional DBA Airbrake.io was available
5
6
  under the MIT license (listed below) on or before November 6, 2012.
data/README.md CHANGED
@@ -541,6 +541,19 @@ Honeybadger.configure do |config|
541
541
  end
542
542
  ```
543
543
 
544
+ ## Setting the hostname
545
+
546
+ The hostname for the local server is determined by `Socket.gethostname`
547
+ by default, but can be overridden using the `hostname` configuration
548
+ option:
549
+
550
+ ```ruby
551
+ Honeybadger.configure do |config|
552
+ # ...
553
+ config.hostname = `hostname`
554
+ end
555
+ ```
556
+
544
557
  ## Testing
545
558
 
546
559
  When you run your tests, you might notice that the Honeybadger service is recording
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/josh/code/honeybadger-ruby
3
3
  specs:
4
- honeybadger (1.6.2)
4
+ honeybadger (1.8.0)
5
5
  json
6
6
 
7
7
  GEM
data/honeybadger.gemspec CHANGED
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
4
4
  s.rubygems_version = '1.3.5'
5
5
 
6
6
  s.name = 'honeybadger'
7
- s.version = '1.7.0'
8
- s.date = '2013-06-07'
7
+ s.version = '1.8.0'
8
+ s.date = '2013-08-14'
9
9
 
10
10
  s.summary = 'Error reports you can be happy about.'
11
11
  s.description = 'Make managing application errors a more pleasant experience.'
@@ -98,6 +98,7 @@ Gem::Specification.new do |s|
98
98
  lib/honeybadger/rake_handler.rb
99
99
  lib/honeybadger/sender.rb
100
100
  lib/honeybadger/shared_tasks.rb
101
+ lib/honeybadger/stats.rb
101
102
  lib/honeybadger/tasks.rb
102
103
  lib/honeybadger_tasks.rb
103
104
  lib/rails/generators/honeybadger/honeybadger_generator.rb
data/lib/honeybadger.rb CHANGED
@@ -9,11 +9,12 @@ require 'honeybadger/backtrace'
9
9
  require 'honeybadger/notice'
10
10
  require 'honeybadger/rack'
11
11
  require 'honeybadger/sender'
12
+ require 'honeybadger/stats'
12
13
 
13
14
  require 'honeybadger/railtie' if defined?(Rails::Railtie)
14
15
 
15
16
  module Honeybadger
16
- VERSION = '1.7.0'
17
+ VERSION = '1.8.0'
17
18
  LOG_PREFIX = "** [Honeybadger] "
18
19
 
19
20
  HEADERS = {
@@ -129,9 +130,12 @@ module Honeybadger
129
130
  result
130
131
  end
131
132
 
132
- def context(hash = {})
133
- Thread.current[:honeybadger_context] ||= {}
134
- Thread.current[:honeybadger_context].merge!(hash)
133
+ def context(hash = nil)
134
+ unless hash.nil?
135
+ Thread.current[:honeybadger_context] ||= {}
136
+ Thread.current[:honeybadger_context].merge!(hash)
137
+ end
138
+
135
139
  self
136
140
  end
137
141
 
@@ -6,7 +6,7 @@ module Honeybadger
6
6
  :params_filters, :project_root, :port, :protocol, :proxy_host, :proxy_pass,
7
7
  :proxy_port, :proxy_user, :secure, :use_system_ssl_cert_chain, :framework,
8
8
  :user_information, :rescue_rake_exceptions, :source_extract_radius,
9
- :send_request_session, :debug, :fingerprint].freeze
9
+ :send_request_session, :debug, :fingerprint, :hostname].freeze
10
10
 
11
11
  # The API key for your project, found on the project edit form.
12
12
  attr_accessor :api_key
@@ -104,6 +104,9 @@ module Honeybadger
104
104
  # A Proc object used to generate optional fingerprint
105
105
  attr_writer :fingerprint
106
106
 
107
+ # Override the hostname of the local server (optional)
108
+ attr_accessor :hostname
109
+
107
110
  DEFAULT_PARAMS_FILTERS = %w(password password_confirmation).freeze
108
111
 
109
112
  DEFAULT_BACKTRACE_FILTERS = [
@@ -137,6 +140,7 @@ module Honeybadger
137
140
  alias_method :use_system_ssl_cert_chain?, :use_system_ssl_cert_chain
138
141
 
139
142
  def initialize
143
+ @api_key = ENV['HONEYBADGER_API_KEY']
140
144
  @secure = true
141
145
  @use_system_ssl_cert_chain = false
142
146
  @host = 'api.honeybadger.io'
@@ -157,6 +161,7 @@ module Honeybadger
157
161
  @source_extract_radius = 2
158
162
  @send_request_session = true
159
163
  @debug = false
164
+ @hostname = nil
160
165
  end
161
166
 
162
167
  # Public: Takes a block and adds it to the list of backtrace filters. When
@@ -79,6 +79,9 @@ module Honeybadger
79
79
  # The host name where this error occurred (if any)
80
80
  attr_reader :hostname
81
81
 
82
+ # System stats
83
+ attr_reader :stats
84
+
82
85
  def initialize(args)
83
86
  self.args = args
84
87
  self.exception = args[:exception]
@@ -105,11 +108,14 @@ module Honeybadger
105
108
  self.backtrace = Backtrace.parse(exception_attribute(:backtrace, caller), :filters => self.backtrace_filters)
106
109
  self.fingerprint = hashed_fingerprint
107
110
  self.error_class = exception_attribute(:error_class) {|exception| exception.class.name }
108
- self.error_message = exception_attribute(:error_message, 'Notification') do |exception|
109
- "#{exception.class.name}: #{exception.message}"
111
+ self.error_message = trim_size(1024) do
112
+ exception_attribute(:error_message, 'Notification') do |exception|
113
+ "#{exception.class.name}: #{exception.message}"
114
+ end
110
115
  end
111
116
 
112
117
  self.hostname = local_hostname
118
+ self.stats = Stats.all
113
119
 
114
120
  self.source_extract_radius = args[:source_extract_radius] || 2
115
121
  self.source_extract = extract_source_from_backtrace
@@ -162,7 +168,8 @@ module Honeybadger
162
168
  :server => {
163
169
  :project_root => project_root,
164
170
  :environment_name => environment_name,
165
- :hostname => hostname
171
+ :hostname => hostname,
172
+ :stats => stats
166
173
  }
167
174
  }
168
175
  end
@@ -223,21 +230,24 @@ module Honeybadger
223
230
  :error_message, :backtrace_filters, :parameters, :params_filters,
224
231
  :environment_filters, :session_data, :project_root, :url, :ignore,
225
232
  :ignore_by_filters, :notifier_name, :notifier_url, :notifier_version,
226
- :component, :action, :cgi_data, :environment_name, :hostname, :context,
233
+ :component, :action, :cgi_data, :environment_name, :hostname, :stats, :context,
227
234
  :source_extract, :source_extract_radius, :send_request_session
228
235
 
229
236
  # Private: Arguments given in the initializer
230
237
  attr_accessor :args
231
238
 
232
- # Private: Gets a property named +attribute+ of an exception, either from an actual
233
- # exception or a hash.
239
+ # Internal: Gets a property named "attribute" of an exception, either from
240
+ # the #args hash or actual exception (in order of precidence)
234
241
  #
235
- # If an exception is available, #from_exception will be used. Otherwise,
236
- # a key named +attribute+ will be used from the #args.
242
+ # attribute - A Symbol existing as a key in #args and/or attribute on
243
+ # Exception
244
+ # default - Default value if no other value is found. (optional)
245
+ # block - An optional block which receives an Exception and returns the
246
+ # desired value
237
247
  #
238
- # If no exception or hash key is available, +default+ will be used.
248
+ # Returns attribute value from args or exception, otherwise default
239
249
  def exception_attribute(attribute, default = nil, &block)
240
- (exception && from_exception(attribute, &block)) || args[attribute] || default
250
+ args[attribute] || (exception && from_exception(attribute, &block)) || default
241
251
  end
242
252
 
243
253
  # Private: Gets a property named +attribute+ from an exception.
@@ -324,7 +334,7 @@ module Honeybadger
324
334
  # ActionView::Template::Error has its own source_extract method.
325
335
  # If present, use that instead.
326
336
  if exception.respond_to?(:source_extract)
327
- Hash[exception_attribute(:source_extract).split("\n").map do |line|
337
+ Hash[exception.source_extract.split("\n").map do |line|
328
338
  parts = line.split(': ')
329
339
  [parts[0].strip, parts[1] || '']
330
340
  end]
@@ -398,7 +408,30 @@ module Honeybadger
398
408
  end
399
409
 
400
410
  def local_hostname
401
- Socket.gethostname
411
+ args[:hostname] || Socket.gethostname
412
+ end
413
+
414
+ # Internal: Limit size of string to bytes
415
+ #
416
+ # input - The String to be trimmed.
417
+ # bytes - The Integer bytes to trim.
418
+ # block - An optional block used in place of input.
419
+ #
420
+ # Examples
421
+ #
422
+ # trimmed = trim_size("Honeybadger doesn't care", 3)
423
+ #
424
+ # trimmed = trim_size(3) do
425
+ # "Honeybadger doesn't care"
426
+ # end
427
+ #
428
+ # Returns trimmed String
429
+ def trim_size(*args, &block)
430
+ input, bytes = args.first, args.last
431
+ input = yield if block_given?
432
+ input = input.dup
433
+ input = input[0...bytes] if input.respond_to?(:size) && input.size > bytes
434
+ input
402
435
  end
403
436
  end
404
437
  end
@@ -0,0 +1,29 @@
1
+ module Honeybadger
2
+ class Stats
3
+ HAS_MEM = File.exists?("/proc/meminfo")
4
+ HAS_LOAD = File.exists?("/proc/loadavg")
5
+
6
+ class << self
7
+ def all
8
+ { :mem => memory, :load => load }
9
+ end
10
+
11
+ # From https://github.com/bloopletech/webstats/blob/master/server/data_providers/mem_info.rb
12
+ def memory
13
+ out = {}
14
+ if HAS_MEM
15
+ out[:total], out[:free], out[:buffers], out[:cached] = IO.readlines("/proc/meminfo")[0..4].map { |l| l =~ /^.*?\: +(.*?) kB$/; $1.to_i / 1024.0 }
16
+ out[:free_total] = out[:free] + out[:buffers] + out[:cached]
17
+ end
18
+ out
19
+ end
20
+
21
+ # From https://github.com/bloopletech/webstats/blob/master/server/data_providers/cpu_info.rb
22
+ def load
23
+ out = {}
24
+ out[:one], out[:five], out[:fifteen] = IO.read("/proc/loadavg").split(' ', 4).map(&:to_f) if HAS_LOAD
25
+ out
26
+ end
27
+ end
28
+ end
29
+ end
@@ -30,6 +30,7 @@ class ConfigurationTest < Test::Unit::TestCase
30
30
  assert_config_default :send_request_session, true
31
31
  assert_config_default :debug, false
32
32
  assert_config_default :fingerprint, nil
33
+ assert_config_default :hostname, nil
33
34
  end
34
35
 
35
36
  should "configure async as Proc" do
@@ -110,6 +111,7 @@ class ConfigurationTest < Test::Unit::TestCase
110
111
  assert_config_overridable :fingerprint
111
112
  assert_config_overridable :send_request_session
112
113
  assert_config_overridable :debug
114
+ assert_config_overridable :hostname
113
115
  end
114
116
 
115
117
  should "have an api key" do
@@ -124,7 +126,8 @@ class ConfigurationTest < Test::Unit::TestCase
124
126
  :ignore_by_filters, :ignore_user_agent, :notifier_name, :notifier_url,
125
127
  :notifier_version, :params_filters, :project_root, :port, :protocol,
126
128
  :proxy_host, :proxy_pass, :proxy_port, :proxy_user, :secure,
127
- :source_extract_radius, :async, :send_request_session, :debug, :fingerprint].each do |option|
129
+ :source_extract_radius, :async, :send_request_session, :debug,
130
+ :fingerprint, :hostname].each do |option|
128
131
  assert_equal config[option], hash[option], "Wrong value for #{option}"
129
132
  end
130
133
  end
@@ -92,6 +92,11 @@ class NoticeTest < Test::Unit::TestCase
92
92
  assert_equal hostname, notice.hostname
93
93
  end
94
94
 
95
+ should "override the host name" do
96
+ notice = build_notice({ :hostname => 'asdf' })
97
+ assert_equal 'asdf', notice.hostname
98
+ end
99
+
95
100
  context "custom fingerprint" do
96
101
  should "include nil fingerprint when no fingerprint is specified" do
97
102
  notice = build_notice
@@ -510,6 +515,21 @@ class NoticeTest < Test::Unit::TestCase
510
515
  assert_equal "[possible infinite recursion halted]", notice.parameters[:hash]
511
516
  end
512
517
 
518
+ should "trim error message to 1k" do
519
+ message = 'asdfghjkl'*200
520
+ e = StandardError.new(message)
521
+ notice = Honeybadger::Notice.new(:exception => e)
522
+ assert_operator 1024, :<, message.bytesize
523
+ assert_equal 1024, notice.error_message.bytesize
524
+ end
525
+
526
+ should "prefer notice args to exception attributes" do
527
+ e = RuntimeError.new('Not very helpful')
528
+ notice = Honeybadger::Notice.new(:exception => e, :error_class => 'MyClass', :error_message => 'Something very specific went wrong.')
529
+ assert_equal 'MyClass', notice.error_class
530
+ assert_equal 'Something very specific went wrong.', notice.error_message
531
+ end
532
+
513
533
  def assert_accepts_exception_attribute(attribute, args = {}, &block)
514
534
  exception = build_exception
515
535
  block ||= lambda { exception.send(attribute) }
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeybadger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
5
- prerelease:
4
+ version: 1.8.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Joshua Wood
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-07 00:00:00.000000000 Z
11
+ date: 2013-08-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: json
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: cucumber
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: fakeweb
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: sham_rack
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,23 +83,20 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: bourne
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '1.0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '1.0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: shoulda
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ~>
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ~>
124
109
  - !ruby/object:Gem::Version
@@ -126,81 +111,71 @@ dependencies:
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: capistrano
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: rake
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - '>='
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - '>='
156
137
  - !ruby/object:Gem::Version
157
138
  version: '0'
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: sinatra
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
- - - ! '>='
143
+ - - '>='
164
144
  - !ruby/object:Gem::Version
165
145
  version: '0'
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
- - - ! '>='
150
+ - - '>='
172
151
  - !ruby/object:Gem::Version
173
152
  version: '0'
174
153
  - !ruby/object:Gem::Dependency
175
154
  name: aruba
176
155
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
156
  requirements:
179
- - - ! '>='
157
+ - - '>='
180
158
  - !ruby/object:Gem::Version
181
159
  version: '0'
182
160
  type: :development
183
161
  prerelease: false
184
162
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
163
  requirements:
187
- - - ! '>='
164
+ - - '>='
188
165
  - !ruby/object:Gem::Version
189
166
  version: '0'
190
167
  - !ruby/object:Gem::Dependency
191
168
  name: appraisal
192
169
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
170
  requirements:
195
- - - ! '>='
171
+ - - '>='
196
172
  - !ruby/object:Gem::Version
197
173
  version: '0'
198
174
  type: :development
199
175
  prerelease: false
200
176
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
177
  requirements:
203
- - - ! '>='
178
+ - - '>='
204
179
  - !ruby/object:Gem::Version
205
180
  version: '0'
206
181
  description: Make managing application errors a more pleasant experience.
@@ -271,6 +246,7 @@ files:
271
246
  - lib/honeybadger/rake_handler.rb
272
247
  - lib/honeybadger/sender.rb
273
248
  - lib/honeybadger/shared_tasks.rb
249
+ - lib/honeybadger/stats.rb
274
250
  - lib/honeybadger/tasks.rb
275
251
  - lib/honeybadger_tasks.rb
276
252
  - lib/rails/generators/honeybadger/honeybadger_generator.rb
@@ -292,6 +268,7 @@ files:
292
268
  - test/unit/sender_test.rb
293
269
  homepage: http://www.honeybadger.io
294
270
  licenses: []
271
+ metadata: {}
295
272
  post_install_message:
296
273
  rdoc_options:
297
274
  - --charset=UTF-8
@@ -299,23 +276,18 @@ rdoc_options:
299
276
  require_paths:
300
277
  - lib
301
278
  required_ruby_version: !ruby/object:Gem::Requirement
302
- none: false
303
279
  requirements:
304
- - - ! '>='
280
+ - - '>='
305
281
  - !ruby/object:Gem::Version
306
282
  version: '0'
307
- segments:
308
- - 0
309
- hash: -2239778721023369939
310
283
  required_rubygems_version: !ruby/object:Gem::Requirement
311
- none: false
312
284
  requirements:
313
- - - ! '>='
285
+ - - '>='
314
286
  - !ruby/object:Gem::Version
315
287
  version: '0'
316
288
  requirements: []
317
289
  rubyforge_project:
318
- rubygems_version: 1.8.23
290
+ rubygems_version: 2.0.3
319
291
  signing_key:
320
292
  specification_version: 2
321
293
  summary: Error reports you can be happy about.