roqua-support 0.1.20 → 0.1.21

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e8bd876218d378c21add709e9625782de687197
4
- data.tar.gz: 8edb8923293e61035707854c43f3b04b937359ac
3
+ metadata.gz: af4e7902bfddd72164acc8f09dce2533316c9471
4
+ data.tar.gz: e3028ffe08f80d936cfc97d5f6fa901dda1fc5a6
5
5
  SHA512:
6
- metadata.gz: f46cd09d06f2b1d094c4de58dba69d3e0d5bf632390b6190d0f7694ee975500c0bb70f7d420fddc7d295ac68d4a0dc032e45821a26490b0580be98cd8205f0ac
7
- data.tar.gz: 3f1b4ddf2053b3d7fe7d7e7e92b21f3b7f52cd141e5c0b9a8250b15803a1e1ed6f1d88ab414746b614b1e7a1c5d673795535bc7114416c27d537c1d56d80f872
6
+ metadata.gz: 03cb1045caf436e5340bd9625a4b2dc9f3208f41c864031c5b0110fb455933d84fd26d5ec414c47137593b2bc82077adcc8456525cf1ca7f73f3fae669391615
7
+ data.tar.gz: 761670d36d6e992f063209e1f946065df4d2e1a792da65074645588fcb7de727d0f630308af60a693bed12731ffedbb4918999386999675706a8e95cfa39c98e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.1.21
2
+
3
+ * Add Errors.add_parameters(add_to: 'error_report')
4
+
1
5
  ## 0.1.20
2
6
 
3
7
  * Add SubsetValidator
data/Gemfile CHANGED
@@ -5,7 +5,6 @@ gemspec
5
5
 
6
6
  group :test do
7
7
  gem 'guard-rspec', '~> 4.2.6'
8
- gem 'fuubar', '~> 1.3.2'
9
8
  gem 'actionpack', '~> 4.0'
10
9
  gem 'rspec-rails'
11
10
  gem 'combustion', '~> 0.5.2'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- roqua-support (0.1.19)
4
+ roqua-support (0.1.21)
5
5
  activesupport (>= 3.2, < 5.0)
6
6
  naught (~> 1.0)
7
7
 
@@ -40,9 +40,6 @@ GEM
40
40
  erubis (2.7.0)
41
41
  ffi (1.9.6)
42
42
  formatador (0.2.5)
43
- fuubar (1.3.3)
44
- rspec (>= 2.14.0, < 3.1.0)
45
- ruby-progressbar (~> 1.4)
46
43
  guard (2.7.0)
47
44
  formatador (>= 0.2.4)
48
45
  listen (~> 2.7)
@@ -53,59 +50,59 @@ GEM
53
50
  guard (~> 2.1)
54
51
  rspec (>= 2.14, < 4.0)
55
52
  hitimes (1.2.2)
56
- i18n (0.6.11)
57
- json (1.8.1)
53
+ i18n (0.7.0)
54
+ json (1.8.3)
58
55
  listen (2.7.11)
59
56
  celluloid (>= 0.15.2)
60
57
  rb-fsevent (>= 0.9.3)
61
58
  rb-inotify (>= 0.9)
62
59
  lumberjack (1.0.9)
63
60
  method_source (0.8.2)
64
- minitest (5.4.2)
65
- naught (1.0.0)
61
+ minitest (5.9.0)
62
+ naught (1.1.0)
66
63
  pry (0.10.1)
67
64
  coderay (~> 1.1.0)
68
65
  method_source (~> 0.8.1)
69
66
  slop (~> 3.4)
70
- rack (1.5.2)
71
- rack-test (0.6.2)
67
+ rack (1.5.5)
68
+ rack-test (0.6.3)
72
69
  rack (>= 1.0)
73
70
  railties (4.1.6)
74
71
  actionpack (= 4.1.6)
75
72
  activesupport (= 4.1.6)
76
73
  rake (>= 0.8.7)
77
74
  thor (>= 0.18.1, < 2.0)
78
- rake (10.3.2)
75
+ rake (11.2.2)
79
76
  rb-fsevent (0.9.4)
80
77
  rb-inotify (0.9.5)
81
78
  ffi (>= 0.5.0)
82
- rspec (3.0.0)
83
- rspec-core (~> 3.0.0)
84
- rspec-expectations (~> 3.0.0)
85
- rspec-mocks (~> 3.0.0)
86
- rspec-core (3.0.4)
87
- rspec-support (~> 3.0.0)
88
- rspec-expectations (3.0.4)
79
+ rspec (3.4.0)
80
+ rspec-core (~> 3.4.0)
81
+ rspec-expectations (~> 3.4.0)
82
+ rspec-mocks (~> 3.4.0)
83
+ rspec-core (3.4.4)
84
+ rspec-support (~> 3.4.0)
85
+ rspec-expectations (3.4.0)
89
86
  diff-lcs (>= 1.2.0, < 2.0)
90
- rspec-support (~> 3.0.0)
87
+ rspec-support (~> 3.4.0)
91
88
  rspec-instrumentation-matcher (0.0.4)
92
89
  activesupport
93
90
  rspec-expectations
94
- rspec-mocks (3.0.4)
95
- rspec-support (~> 3.0.0)
96
- rspec-rails (3.0.2)
97
- actionpack (>= 3.0)
98
- activesupport (>= 3.0)
99
- railties (>= 3.0)
100
- rspec-core (~> 3.0.0)
101
- rspec-expectations (~> 3.0.0)
102
- rspec-mocks (~> 3.0.0)
103
- rspec-support (~> 3.0.0)
104
- rspec-support (3.0.4)
105
- ruby-progressbar (1.6.0)
91
+ rspec-mocks (3.4.1)
92
+ diff-lcs (>= 1.2.0, < 2.0)
93
+ rspec-support (~> 3.4.0)
94
+ rspec-rails (3.4.2)
95
+ actionpack (>= 3.0, < 4.3)
96
+ activesupport (>= 3.0, < 4.3)
97
+ railties (>= 3.0, < 4.3)
98
+ rspec-core (~> 3.4.0)
99
+ rspec-expectations (~> 3.4.0)
100
+ rspec-mocks (~> 3.4.0)
101
+ rspec-support (~> 3.4.0)
102
+ rspec-support (3.4.1)
106
103
  slop (3.6.0)
107
104
  thor (0.19.1)
108
- thread_safe (0.3.4)
105
+ thread_safe (0.3.5)
109
106
  timers (4.0.1)
110
107
  hitimes
111
108
  tzinfo (1.2.2)
@@ -119,10 +116,12 @@ DEPENDENCIES
119
116
  active_interaction (~> 1.0)
120
117
  bundler (~> 1.0)
121
118
  combustion (~> 0.5.2)
122
- fuubar (~> 1.3.2)
123
119
  guard-rspec (~> 4.2.6)
124
120
  rake
125
121
  roqua-support!
126
122
  rspec (>= 2.12.0, < 4.0)
127
123
  rspec-instrumentation-matcher
128
124
  rspec-rails
125
+
126
+ BUNDLED WITH
127
+ 1.12.5
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard :rspec, cmd: 'bundle exec rspec --format Fuubar --colour' do
4
+ guard :rspec, cmd: 'bundle exec rspec --colour' do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
7
  watch('spec/spec_helper.rb') { "spec" }
data/README.md CHANGED
@@ -48,6 +48,27 @@ require 'roqua/support/request_logger'
48
48
  Roqua::Support::RequestLogger.attach_to :action_controller
49
49
  ```
50
50
 
51
+ ### Error reporting
52
+
53
+ Log and error to Roqua.logger, appsignal and/or airbrake, depending on which is configured.
54
+
55
+ ```ruby
56
+ Roqua::Support::Errors.report(exception, extra: 'params')
57
+ ```
58
+
59
+ Add extra info to all reports (global setting, put in initializer)
60
+
61
+ ```
62
+ Roqua::Support::Errors.extra_parameters = {root_path: Rails.root.to_s}
63
+ ```
64
+
65
+ When you want to add more info, but want to catch the error higher up you can call Errors.add_parameters, which will save them on the current exception instance.
66
+
67
+ ```
68
+ rescue
69
+ raise Roqua::Support::Errors::add_parameters(more: 'params')
70
+ ```
71
+
51
72
  ### Responders
52
73
 
53
74
  #### option 1
@@ -1,5 +1,5 @@
1
1
  module Roqua
2
2
  module Support
3
- VERSION = '0.1.20'
3
+ VERSION = '0.1.21'
4
4
  end
5
5
  end
@@ -1,107 +1,107 @@
1
1
  module Roqua
2
2
  module Support
3
3
  module Errors
4
+ # global extra parameters to be added to all reports.
4
5
  def self.extra_parameters
5
6
  @extra_parameters || {}
6
7
  end
7
8
 
8
9
  def self.extra_parameters=(hash)
10
+ fail 'not a hash' unless hash.is_a? Hash
9
11
  @extra_parameters = hash
10
12
  end
11
13
 
14
+ # adds instance variable roqua_extra_parameters to current exception.
15
+ def self.add_parameters(params)
16
+ return unless params.is_a?(Hash) && $!
17
+ $!.instance_eval do
18
+ (@roqua_extra_parameters ||= {}).merge! params
19
+ end
20
+ end
21
+
12
22
  def self.report(exception, context = {})
13
23
  return if const_defined?(:Rails) and Rails.env.test?
14
- parameters, controller, skip_backtrace = merge_parameters(context)
15
- notification_urls = []
16
- # Notify Airbrake
17
- notification_urls << notify_airbrake(exception, controller, parameters)
18
- # Notify AppSignal
19
- notification_urls << notify_appsignal(exception, parameters)
24
+ context = {} unless context.is_a? Hash
25
+
26
+ parameters, controller, skip_backtrace = merge_parameters(exception, context)
27
+
28
+ notification_urls = [notify_airbrake(exception, controller, parameters),
29
+ notify_appsignal(exception, parameters)]
20
30
  # Notify Roqua logging
21
31
  log_exception(exception, parameters, notification_urls.compact, skip_backtrace)
22
32
  end
23
33
 
24
34
  private
25
35
 
26
- def self.merge_parameters(context)
27
- begin
28
- if context.is_a?(Hash)
29
- controller = context.delete :controller
30
- skip_backtrace = context.delete :skip_backtrace
31
- if extra_parameters.is_a?(Hash)
32
- parameters = extra_parameters.merge(context)
33
- else
34
- parameters = context
35
- end
36
- elsif extra_parameters.is_a?(Hash)
37
- parameters = extra_parameters
38
- end
39
- [parameters, controller, skip_backtrace]
40
- rescue Exception
41
- end
36
+ def self.merge_parameters(exception, context = {})
37
+ parameters = extra_parameters.dup
38
+ controller = context.delete :controller
39
+ skip_backtrace = context.delete :skip_backtrace
40
+ parameters.merge! context
41
+ parameters.merge! extra_parameters_from_exception(exception)
42
+ [parameters, controller, skip_backtrace]
43
+ rescue Exception
44
+ end
45
+
46
+ def self.extra_parameters_from_exception(exception)
47
+ exception.instance_variable_get(:@roqua_extra_parameters) || {}
42
48
  end
43
49
 
44
50
  def self.log_exception(exception, parameters = {}, notification_urls = [], skip_backtrace = false)
45
- begin
46
- if Roqua.respond_to?(:logger)
47
- exception_info = {class_name: exception.class.to_s,
48
- message: exception.message,
49
- parameters: parameters}
50
- exception_info[:notification_urls] = notification_urls if notification_urls.present?
51
- exception_info[:backtrace] = exception.backtrace unless skip_backtrace
52
- puts exception_info.inspect
53
- Roqua.logger.error('roqua.exception', exception_info)
54
- end
55
- rescue Exception
51
+ if Roqua.respond_to?(:logger)
52
+ exception_info = {class_name: exception.class.to_s,
53
+ message: exception.message,
54
+ parameters: parameters}
55
+ exception_info[:notification_urls] = notification_urls if notification_urls.present?
56
+ exception_info[:backtrace] = exception.backtrace unless skip_backtrace
57
+ puts exception_info.inspect
58
+ Roqua.logger.error('roqua.exception', exception_info)
56
59
  end
60
+ rescue Exception
57
61
  end
58
62
 
59
63
  def self.notify_airbrake(exception, controller, parameters = {})
60
- begin
61
- if const_defined?(:Airbrake)
62
- if controller && controller.respond_to?(:airbrake_request_data)
63
- request_data = controller.airbrake_request_data
64
- if request_data.is_a?(Hash)
65
- request_data[:parameters] ||= {}
66
- if request_data[:parameters].is_a?(Hash)
67
- request_data[:parameters] = parameters.merge request_data[:parameters]
68
- end
69
- else
70
- request_data = nil
64
+ if const_defined?(:Airbrake)
65
+ if controller && controller.respond_to?(:airbrake_request_data)
66
+ request_data = controller.airbrake_request_data
67
+ if request_data.is_a?(Hash)
68
+ request_data[:parameters] ||= {}
69
+ if request_data[:parameters].is_a?(Hash)
70
+ request_data[:parameters] = parameters.merge request_data[:parameters]
71
71
  end
72
+ else
73
+ request_data = nil
72
74
  end
73
- request_data ||= {parameters: parameters}
74
- uuid = Airbrake.notify_or_ignore(exception, request_data)
75
- "https://airbrake.io/locate/#{uuid}" if uuid
76
75
  end
77
- rescue Exception
76
+ request_data ||= {parameters: parameters}
77
+ uuid = Airbrake.notify_or_ignore(exception, request_data)
78
+ "https://airbrake.io/locate/#{uuid}" if uuid
78
79
  end
80
+ rescue Exception
79
81
  end
80
82
 
81
83
  def self.notify_appsignal(exception, parameters = {})
82
- begin
83
- if const_defined?(:Appsignal) and
84
- not Appsignal.is_ignored_exception?(exception)
85
- # TODO: If and when https://github.com/appsignal/appsignal/pull/9 is merged,
86
- # this functionality should be supported directly by Appsignal.send_exception.
87
- # Appsignal.send_exception(exception, parameters: parameters)
84
+ if const_defined?(:Appsignal) and
85
+ not Appsignal.is_ignored_exception?(exception)
86
+ # TODO: If and when https://github.com/appsignal/appsignal/pull/9 is merged,
87
+ # this functionality should be supported directly by Appsignal.send_exception.
88
+ # Appsignal.send_exception(exception, parameters: parameters)
88
89
 
89
- if Appsignal.active?
90
- # Hackety hack around stateful mess of Appsignal gem
91
- if Appsignal::Transaction.current
92
- Appsignal::Transaction.current.set_tags(parameters)
93
- Appsignal::Transaction.current.add_exception(exception)
94
- else
95
- transaction = Appsignal::Transaction.create(SecureRandom.uuid, ENV.to_hash)
96
- transaction.set_tags(parameters)
97
- transaction.add_exception(exception)
98
- transaction.complete!
99
- Appsignal.agent.send_queue
100
- end
90
+ if Appsignal.active?
91
+ # Hackety hack around stateful mess of Appsignal gem
92
+ if Appsignal::Transaction.current
93
+ Appsignal::Transaction.current.set_tags(parameters)
94
+ Appsignal::Transaction.current.add_exception(exception)
95
+ else
96
+ transaction = Appsignal::Transaction.create(SecureRandom.uuid, ENV.to_hash)
97
+ transaction.set_tags(parameters)
98
+ transaction.add_exception(exception)
99
+ transaction.complete!
100
+ Appsignal.agent.send_queue
101
101
  end
102
102
  end
103
- rescue Exception
104
103
  end
104
+ rescue Exception
105
105
  end
106
106
  end
107
107
  end
@@ -45,6 +45,48 @@ describe 'Error reporting' do
45
45
  Roqua::Support::Errors.report exception, skip_backtrace: true
46
46
  end
47
47
 
48
+ it 'can add extra parameters by calling add_parameters' do
49
+ Roqua.logger.should_receive(:error).with \
50
+ 'roqua.exception', class_name: 'RuntimeError',
51
+ message: 'exception_message',
52
+ parameters: {more: 'params',
53
+ even_more: 'params'}
54
+ begin
55
+ begin
56
+ begin
57
+ fail 'exception_message'
58
+ rescue
59
+ Roqua::Support::Errors.add_parameters(more: 'params')
60
+ raise
61
+ end
62
+ rescue
63
+ Roqua::Support::Errors.add_parameters(even_more: 'params')
64
+ raise
65
+ end
66
+ rescue => e
67
+ Roqua::Support::Errors.report e, skip_backtrace: true
68
+ end
69
+ end
70
+
71
+ it 'will not fail when called outside of rescue or when passed the wrong format to add_parameters' do
72
+ Roqua.logger.should_receive(:error).with \
73
+ 'roqua.exception', class_name: 'RuntimeError',
74
+ message: 'exception_message',
75
+ parameters: {}
76
+
77
+ begin
78
+ Roqua::Support::Errors.add_parameters('just a string')
79
+ begin
80
+ fail 'exception_message'
81
+ rescue
82
+ Roqua::Support::Errors.add_parameters('just a string')
83
+ raise
84
+ end
85
+ rescue => e
86
+ Roqua::Support::Errors.report e, skip_backtrace: true
87
+ end
88
+ end
89
+
48
90
  it 'logs notification_urls when present' do
49
91
  stub_const('Airbrake', double('Airbrake', notify_or_ignore: 'uuid'))
50
92
  Roqua.logger.should_receive(:error)
@@ -75,13 +117,6 @@ describe 'Error reporting' do
75
117
  Roqua::Support::Errors.report exception, controller: controller, some: 'context'
76
118
  end
77
119
 
78
- it 'does not fail with extra parameters of incompatible type' do
79
- Roqua::Support::Errors.extra_parameters = ['extra', 'param']
80
- expect(Airbrake).to receive(:notify_or_ignore).with(exception, parameters: {})
81
- Roqua::Support::Errors.report exception
82
- Roqua::Support::Errors.extra_parameters = {}
83
- end
84
-
85
120
  it 'does not fail with context of incompatible type' do
86
121
  expect(Airbrake).to receive(:notify_or_ignore).with(exception, parameters: {})
87
122
  Roqua::Support::Errors.report exception, ['controller', 'extra_param']
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roqua-support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20
4
+ version: 0.1.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marten Veldthuis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-23 00:00:00.000000000 Z
11
+ date: 2016-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -169,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
169
  version: '0'
170
170
  requirements: []
171
171
  rubyforge_project:
172
- rubygems_version: 2.4.3
172
+ rubygems_version: 2.5.1
173
173
  signing_key:
174
174
  specification_version: 4
175
175
  summary: Helper objects and proxies used by a lot of RoQua applications
@@ -192,4 +192,3 @@ test_files:
192
192
  - spec/roqua/support_spec.rb
193
193
  - spec/roqua/validators/subset_validator_spec.rb
194
194
  - spec/spec_helper.rb
195
- has_rdoc: