trusty 0.0.7 → 0.0.8
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 +4 -4
- data/README.md +40 -0
- data/lib/trusty/errors/exception_handlers.rb +27 -0
- data/lib/trusty/errors/retry.rb +50 -0
- data/lib/trusty/errors.rb +2 -0
- data/lib/trusty/exception_notification.rb +17 -0
- data/lib/trusty/iron_io/queue_processor.rb +59 -0
- data/lib/trusty/omniauth.rb +3 -5
- data/lib/trusty/rails/controller_extensions.rb +13 -0
- data/lib/trusty/rails/engine.rb +33 -0
- data/lib/trusty/rails.rb +1 -0
- data/lib/trusty/rake.rb +35 -0
- data/lib/trusty/utilities.rb +2 -5
- data/lib/trusty/version.rb +1 -1
- data/lib/trusty.rb +8 -0
- data/trusty.gemspec +19 -1
- metadata +82 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f19690f72d7d3b49ee371125c130f005e1a7b347
|
4
|
+
data.tar.gz: 525c37e879aa8a171a2d5ba213db391206091f79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e1fdf638e05d39b2783c2fabdfc6fb669a197e032bff5f2e8d6a91f372846bc7f16fbb5a05ec9b361ce177be0358085f5a54d1890715657b291644365fe04ee
|
7
|
+
data.tar.gz: 0aaf8265f6ce15530213afb547a544638b63ac31340df3310c570ddef4ae663e84bff0764f8586ee5c96a4fad694d44d7e7d987c8de8d8bc5ca758a6473c9514
|
data/README.md
CHANGED
@@ -152,6 +152,46 @@ class MyModel
|
|
152
152
|
end
|
153
153
|
```
|
154
154
|
|
155
|
+
### Error Handling
|
156
|
+
|
157
|
+
You can include the `Trusty::Errors::Retry` module to call the `retry_block` helper method to retry a block of code.
|
158
|
+
This is useful when dealing with HTTP errors and such things with APIs and so on.
|
159
|
+
You can also easily add the retry behavior to a method with the same options you would pass to `retry_block`.
|
160
|
+
|
161
|
+
```Ruby
|
162
|
+
class MyModel
|
163
|
+
include Trusty::Errors::Retry
|
164
|
+
|
165
|
+
def api_request
|
166
|
+
retry_block :retry => 3 do
|
167
|
+
# ... some API calls ...
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# add retry behavior to any method
|
172
|
+
def api_request2
|
173
|
+
# ... some API calls ...
|
174
|
+
end
|
175
|
+
retry_method :api_request2, :retry => 3
|
176
|
+
|
177
|
+
end
|
178
|
+
```
|
179
|
+
|
180
|
+
#### Exception Notification Integration
|
181
|
+
|
182
|
+
If you use the "ExceptionNotification" gem, requiring `trusty/exception_notification` will automatically listen for exceptions thrown and handled from `Trusty::Errors::*`.
|
183
|
+
Exceptions handled by Trusty will include contextual data and the `env` data for ExceptionNotification to include in error emails.
|
184
|
+
|
185
|
+
### Rails Extensions
|
186
|
+
|
187
|
+
Require `trusty/rails` to register the `Trusty::Rails::Engine` and add some extensions to Rails.
|
188
|
+
Controller extensions are added to fix quirks such as making sure Flash messages aren't lost on redirect.
|
189
|
+
Error handling in Rake and ExceptionNotification are also wired up to listen to exceptions handled by Trusty (see above).
|
190
|
+
|
191
|
+
### Iron.io
|
192
|
+
|
193
|
+
The `Trusty::IronIo::QueueProcessor` makes it easy to pull messages off a queue.
|
194
|
+
|
155
195
|
## Contributing
|
156
196
|
|
157
197
|
1. Fork it
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module Trusty
|
4
|
+
module Errors
|
5
|
+
module ExceptionHandlers
|
6
|
+
|
7
|
+
def try_with_data(data, &block)
|
8
|
+
begin
|
9
|
+
yield
|
10
|
+
rescue => exception
|
11
|
+
notify_exception exception, :data => data, :raise => true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# include in classes
|
16
|
+
def notify_exception(exception, options = {})
|
17
|
+
|
18
|
+
options[:env] ||= respond_to?(:request) ? request.env : respond_to?(:env) ? env : nil
|
19
|
+
|
20
|
+
ActiveSupport::Notifications.publish("trusty.errors.notify_exception", exception, options)
|
21
|
+
|
22
|
+
raise exception if options[:raise] == true
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'trusty/errors/exception_handlers'
|
2
|
+
|
3
|
+
module Trusty
|
4
|
+
module Errors
|
5
|
+
module Retry
|
6
|
+
include ExceptionHandlers
|
7
|
+
|
8
|
+
# retry a block of code
|
9
|
+
def retry_block(options = {}, &block)
|
10
|
+
options = {
|
11
|
+
:retry => 1,
|
12
|
+
:data => {},
|
13
|
+
:type => StandardError
|
14
|
+
}.merge(options)
|
15
|
+
|
16
|
+
retries = case options[:retry]
|
17
|
+
when true
|
18
|
+
1
|
19
|
+
when Integer
|
20
|
+
options[:retry]
|
21
|
+
else
|
22
|
+
0
|
23
|
+
end
|
24
|
+
|
25
|
+
types = [ options[:type] ].flatten.compact
|
26
|
+
|
27
|
+
begin
|
28
|
+
yield
|
29
|
+
rescue *types => ex
|
30
|
+
if retries > 0
|
31
|
+
return self.send(__method__, options.merge(:retry => retries - 1), &block)
|
32
|
+
else
|
33
|
+
notify_exception(ex, :data => options[:data], :raise => true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# helper method to redefine method (a la alias_method_chain, etc)
|
39
|
+
def retry_method(method, options = {})
|
40
|
+
define_method method do |*args, &block|
|
41
|
+
super_method = method(:super)
|
42
|
+
retry_block options do
|
43
|
+
super_method(*args, &block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'exception_notification'
|
2
|
+
|
3
|
+
module Trusty
|
4
|
+
module ExceptionNotification
|
5
|
+
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
# register exception listener for Trusty::Errors::ExceptionHelper and Trusty::ExceptionNotification::Rake
|
10
|
+
|
11
|
+
ActiveSupport::Notifications.subscribe("trusty.errors.notify_exception") do |exception, options|
|
12
|
+
if env = options.delete(:env)
|
13
|
+
ExceptionNotifier::Notifier.exception_notification(env, exception, options).deliver!
|
14
|
+
else
|
15
|
+
ExceptionNotifier::Notifier.background_exception_notification(exception, options).deliver!
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'iron_mq'
|
2
|
+
require 'trusty/errors/exception_handlers'
|
3
|
+
|
4
|
+
module Trusty
|
5
|
+
module IronIo
|
6
|
+
class QueueProcessor
|
7
|
+
include ::Trusty::Errors::ExceptionHandlers
|
8
|
+
|
9
|
+
# helper method forwards to "run" instance method
|
10
|
+
def self.run(queue_name, *args, &block)
|
11
|
+
new(queue_name).run(*args, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :queue_name, :client
|
15
|
+
|
16
|
+
def initialize(queue_name)
|
17
|
+
@queue_name = queue_name
|
18
|
+
@client = IronMQ::Client.new(:token => ENV['IRON_TOKEN'], :project_id => ENV['IRON_PROJECT_ID'])
|
19
|
+
end
|
20
|
+
|
21
|
+
def default_options
|
22
|
+
{ :timeout => 30, :break_if_nil => true }
|
23
|
+
end
|
24
|
+
|
25
|
+
def queue
|
26
|
+
@queue ||= client.queue(queue_name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def run(options = {}, &block)
|
30
|
+
options = default_options.merge(options)
|
31
|
+
|
32
|
+
queue.poll(options) do |message|#, :break_if_nil => true do |message|
|
33
|
+
|
34
|
+
# parse body for better data formatting
|
35
|
+
begin
|
36
|
+
body = JSON.parse message.body
|
37
|
+
rescue JSON::ParserError => ex
|
38
|
+
body = message.body
|
39
|
+
end
|
40
|
+
|
41
|
+
try_with_data :message_id => message.id, :body => body do
|
42
|
+
block.call(message, queue)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def webhook_url
|
48
|
+
url_template = 'https://mq-aws-us-east-1.iron.io/1/projects/%{project_id}/queues/%{queue_name}/messages/webhook?oauth=%{token}'
|
49
|
+
|
50
|
+
url_template % {
|
51
|
+
project_id: ENV['IRON_TOKEN'],
|
52
|
+
token: ENV['IRON_PROJECT_ID'],
|
53
|
+
queue_name: queue_name
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/trusty/omniauth.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'trusty/rails/controller_extensions'
|
2
|
+
|
3
|
+
module Trusty
|
4
|
+
module Rails
|
5
|
+
class Engine < ::Rails::Engine
|
6
|
+
|
7
|
+
initializer "trusty.rails.initialize_views" do |app|
|
8
|
+
ActiveSupport.on_load :action_view do
|
9
|
+
# TODO: Add view extensions
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
initializer "trusty.rails.initialize_controllers" do |app|
|
14
|
+
ActiveSupport.on_load :action_controller do
|
15
|
+
include ControllerExtensions
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
if defined? Rake
|
20
|
+
initializer "trusty.rails.initialize_rake" do |app|
|
21
|
+
require 'trusty/rake'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if defined? ExceptionNotification
|
26
|
+
initializer "trusty.rails.initialize_exception_notification" do |app|
|
27
|
+
require 'trusty/exception_notification'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/trusty/rails.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'trusty/rails/engine'
|
data/lib/trusty/rake.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'trusty/errors/exception_handlers'
|
3
|
+
|
4
|
+
# FROM:
|
5
|
+
# https://github.com/thoughtbot/airbrake/blob/master/lib/airbrake/rake_handler.rb
|
6
|
+
# Patch Rake::Application to handle errors with Airbrake
|
7
|
+
module Trusty
|
8
|
+
module Rake
|
9
|
+
include ::Trusty::Errors::ExceptionHandlers
|
10
|
+
|
11
|
+
def self.included(base)
|
12
|
+
base.class_eval do
|
13
|
+
alias_method :display_error_message_without_email, :display_error_message
|
14
|
+
alias_method :display_error_message, :display_error_message_with_email
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.handle_exceptions!
|
19
|
+
Rake.application.instance_eval do
|
20
|
+
class << self
|
21
|
+
# include this module
|
22
|
+
include Rake
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def display_error_message_with_email(exception)
|
28
|
+
notify_exception(exception)
|
29
|
+
display_error_message_without_email(exception)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# wire up exception handling in Rake tasks
|
35
|
+
Trusty::Rake.handle_exceptions!
|
data/lib/trusty/utilities.rb
CHANGED
data/lib/trusty/version.rb
CHANGED
data/lib/trusty.rb
CHANGED
@@ -2,5 +2,13 @@ require "trusty/version"
|
|
2
2
|
require "trusty/environment"
|
3
3
|
require "trusty/utilities"
|
4
4
|
|
5
|
+
# Optional features that need to be required manually when using this gem
|
6
|
+
# require "trusty/errors"
|
7
|
+
# require "trusty/exception_notification"
|
8
|
+
# require "trusty/iron_io"
|
9
|
+
# require "trusty/omniauth"
|
10
|
+
# require "trusty/rails"
|
11
|
+
# require "trusty/rake"
|
12
|
+
|
5
13
|
# copy out of namespace
|
6
14
|
::Vars = Trusty::Environment
|
data/trusty.gemspec
CHANGED
@@ -20,9 +20,27 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
-
|
23
|
+
|
24
|
+
# Trusty::Rails (and defined?(Rails) checks sprinkled throughout)
|
24
25
|
spec.add_development_dependency "rails"
|
25
26
|
|
27
|
+
# Trusty::Omniauth
|
28
|
+
spec.add_development_dependency "omniauth"
|
29
|
+
|
30
|
+
# Trusty::Errors::ExceptionHandlers
|
31
|
+
spec.add_development_dependency "active_support" # active_support/notifications
|
32
|
+
|
33
|
+
# Trusty::ExceptionNotification
|
34
|
+
spec.add_development_dependency "exception_notification"
|
35
|
+
|
36
|
+
# Trusty::Rake
|
37
|
+
spec.add_development_dependency "rake"
|
38
|
+
|
39
|
+
# Trusty::IronIo::QueueProcessor
|
40
|
+
spec.add_development_dependency "typhoeus" # used by iron_mq
|
41
|
+
spec.add_development_dependency "iron_mq"
|
42
|
+
|
43
|
+
# Trusty::Environment
|
26
44
|
spec.add_dependency "dotenv", ">= 0.9.0"
|
27
45
|
spec.add_dependency "hashie", ">= 2.0"
|
28
46
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trusty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Van Horn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rails
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: omniauth
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,7 +67,63 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: active_support
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: exception_notification
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: typhoeus
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: iron_mq
|
57
127
|
requirement: !ruby/object:Gem::Requirement
|
58
128
|
requirements:
|
59
129
|
- - '>='
|
@@ -109,10 +179,19 @@ files:
|
|
109
179
|
- lib/trusty.rb
|
110
180
|
- lib/trusty/environment.rb
|
111
181
|
- lib/trusty/environment/dot_file_parser.rb
|
182
|
+
- lib/trusty/errors.rb
|
183
|
+
- lib/trusty/errors/exception_handlers.rb
|
184
|
+
- lib/trusty/errors/retry.rb
|
185
|
+
- lib/trusty/exception_notification.rb
|
186
|
+
- lib/trusty/iron_io/queue_processor.rb
|
112
187
|
- lib/trusty/omniauth.rb
|
113
188
|
- lib/trusty/omniauth/mapping_helpers.rb
|
114
189
|
- lib/trusty/omniauth/model_mapper.rb
|
115
190
|
- lib/trusty/omniauth/provider_mapper.rb
|
191
|
+
- lib/trusty/rails.rb
|
192
|
+
- lib/trusty/rails/controller_extensions.rb
|
193
|
+
- lib/trusty/rails/engine.rb
|
194
|
+
- lib/trusty/rake.rb
|
116
195
|
- lib/trusty/utilities.rb
|
117
196
|
- lib/trusty/utilities/method_name.rb
|
118
197
|
- lib/trusty/utilities/method_name_extensions.rb
|