honeybadger 1.7.0 → 1.8.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.
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.