asana_exception_notifier 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +26 -0
  3. data/.reek +11 -0
  4. data/.rubocop.yml +76 -0
  5. data/.travis.yml +16 -0
  6. data/CONTRIBUTING.md +46 -0
  7. data/Gemfile +3 -0
  8. data/Gemfile.lock +180 -0
  9. data/LICENSE +20 -0
  10. data/README.md +225 -0
  11. data/Rakefile +37 -0
  12. data/asana_exception_notifier.gemspec +48 -0
  13. data/examples/sinatra/Gemfile +7 -0
  14. data/examples/sinatra/Gemfile.lock +124 -0
  15. data/examples/sinatra/Procfile +1 -0
  16. data/examples/sinatra/README.md +14 -0
  17. data/examples/sinatra/config.ru +3 -0
  18. data/examples/sinatra/sinatra_app.rb +46 -0
  19. data/init.rb +1 -0
  20. data/lib/asana_exception_notifier/classes/asana.rb +95 -0
  21. data/lib/asana_exception_notifier/classes/error_page.rb +134 -0
  22. data/lib/asana_exception_notifier/helpers/application_helper.rb +286 -0
  23. data/lib/asana_exception_notifier/initializers/zip.rb +14 -0
  24. data/lib/asana_exception_notifier/note_templates/asana_exception_notifier.html.erb +82 -0
  25. data/lib/asana_exception_notifier/note_templates/asana_exception_notifier.text.erb +24 -0
  26. data/lib/asana_exception_notifier/request/client.rb +85 -0
  27. data/lib/asana_exception_notifier/request/core.rb +132 -0
  28. data/lib/asana_exception_notifier/request/middleware.rb +41 -0
  29. data/lib/asana_exception_notifier/version.rb +27 -0
  30. data/lib/asana_exception_notifier.rb +45 -0
  31. data/lib/generators/asana_exception_notifier/install_generator.rb +14 -0
  32. data/lib/generators/asana_exception_notifier/templates/asana_exception_notifier.rb +20 -0
  33. data/spec/lib/asana_exception_notifier/classes/asana_spec.rb +23 -0
  34. data/spec/spec_helper.rb +45 -0
  35. data/spec/test_notification.rb +20 -0
  36. metadata +467 -0
@@ -0,0 +1,132 @@
1
+ require_relative '../helpers/application_helper'
2
+ module AsanaExceptionNotifier
3
+ module Request
4
+ # module that is used for formatting numbers using metrics
5
+ #
6
+ # @!attribute params
7
+ # @return [Hash] THe params received from URL
8
+ # @!attribute hostname
9
+ # @return [String] THe hostname from where the badges are fetched from
10
+ # @!attribute base_url
11
+ # @return [String] THe base_url of the API
12
+ module Core
13
+ include AsanaExceptionNotifier::ApplicationHelper
14
+
15
+ # Returns the connection options used for connecting to API's
16
+ #
17
+ # @return [Hash] Returns the connection options used for connecting to API's
18
+ def em_connection_options
19
+ {
20
+ connect_timeout: 1200, # default connection setup timeout
21
+ inactivity_timeout: 120, # default connection inactivity (post-setup) timeout
22
+ ssl: {
23
+ verify_peer: false
24
+ },
25
+ head: {
26
+ 'ACCEPT' => '*/*',
27
+ 'Connection' => 'keep-alive'
28
+ }
29
+ }
30
+ end
31
+
32
+ # Returns the request options used for connecting to API's
33
+ #
34
+ # @return [Hash] Returns the request options used for connecting to API's
35
+ def em_request_options(params = {})
36
+ {
37
+ redirects: 5, # follow 3XX redirects up to depth 5
38
+ keepalive: true, # enable keep-alive (don't send Connection:close header)
39
+ head: (params[:head] || {}).merge(
40
+ 'ACCEPT' => '*/*',
41
+ 'Connection' => 'keep-alive'
42
+ ),
43
+ body: (params[:body] || {})
44
+ }
45
+ end
46
+
47
+ # instantiates an eventmachine http request object that will be used to make the htpp request
48
+ # @see EventMachine::HttpRequest#initialize
49
+ #
50
+ # @param [String] url The URL that will be used in the HTTP request
51
+ # @return [EventMachine::HttpRequest] Returns an http request object
52
+ def em_request(url, options)
53
+ uri = Addressable::URI.parse(url)
54
+ conn_options = em_connection_options.merge(ssl: { sni_hostname: uri.host })
55
+ em_request = EventMachine::HttpRequest.new(url, conn_options)
56
+ em_request.send(options.fetch(:http_method, 'get'), em_request_options)
57
+ end
58
+
59
+ # Method that fetch the data from a URL and registers the error and success callback to the HTTP object
60
+ # @see #em_request
61
+ # @see #register_error_callback
62
+ # @see #register_success_callback
63
+ #
64
+ # @param [url] url The URL that is used to fetch data from
65
+ # @param [Lambda] callback The callback that will be called if the response is blank
66
+ # @param [Proc] block If the response is not blank, the block will receive the response
67
+ # @return [void]
68
+ def fetch_data(options = {}, &block)
69
+ options = options.symbolize_keys
70
+ if options[:multi_request] && multi_manager.present?
71
+ multi_fetch_data(options, &block)
72
+ else
73
+ register_error_callback(@http)
74
+ register_success_callback(@http, options, &block)
75
+ end
76
+ end
77
+
78
+ def multi_fetch_data(options = {}, &block)
79
+ multi_manager.add options[:request_name], @http
80
+ return unless options[:request_final]
81
+ register_error_callback(multi_manager)
82
+ register_success_callback(multi_manager, options, &block)
83
+ end
84
+
85
+ # Method that is used to register a success callback to a http object
86
+ # @see #callback_before_success
87
+ # @see #dispatch_http_response
88
+ #
89
+ # @param [EventMachine::HttpRequest] http The HTTP object that will be used for registering the success callback
90
+ # @param [Lambda] callback The callback that will be called if the response is blank
91
+ # @param [Proc] block If the response is not blank, the block will receive the response
92
+ # @return [void]
93
+ def register_success_callback(http, options)
94
+ http.callback do
95
+ res = callback_before_success(get_response_from_request(http, options))
96
+ callback = options.fetch('callback', nil)
97
+ block_given? ? yield(res) : callback.call(res)
98
+ end
99
+ end
100
+
101
+ # Callback that is used before returning the response the the instance
102
+ #
103
+ # @param [String] response The response that will be dispatched to the instance class that made the request
104
+ # @return [String] Returns the response
105
+ def callback_before_success(response)
106
+ response
107
+ end
108
+
109
+ # This method is used to reqister a error callback to a HTTP request object
110
+ # @see #callback_error
111
+ # @param [EventMachine::HttpRequest] http The HTTP object that will be used for reqisteringt the error callback
112
+ # @return [void]
113
+ def register_error_callback(http)
114
+ http.errback { |error| callback_error(error) }
115
+ end
116
+
117
+ def get_error_from_request(http, options)
118
+ http_response = http.respond_to?(:response) ? http.response : http.responses[:errback]
119
+ options[:multi_request].present? && http_response.is_a?(Hash) ? http_response.values.map(&:response) : http_response
120
+ end
121
+
122
+ # Method that is used to react when an error happens in a HTTP request
123
+ # and prints out an error message
124
+ #
125
+ # @param [Object] error The error that was raised by the HTTP request
126
+ # @return [void]
127
+ def callback_error(error)
128
+ log_exception(error)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,41 @@
1
+ require_relative '../helpers/application_helper'
2
+ module AsanaExceptionNotifier
3
+ module Request
4
+ # middleware used only in development for testing purpose
5
+ class Middleware
6
+ include AsanaExceptionNotifier::ApplicationHelper
7
+ # Method that is used to debug requests to API's
8
+ # The method receives the request object and prints it content to console
9
+ #
10
+ # @param [EventMachine::HttpRequest] client The Http request made to an API
11
+ # @param [Hash] head The http headers sent to API
12
+ # @param [String, nil] body The body sent to API
13
+ # @return [Array<Hash,String>] Returns the http headers and the body
14
+ def request(client, head, body)
15
+ puts "############## HTTP REQUEST #####################\n"
16
+ puts JSON.pretty_generate(
17
+ headers: head,
18
+ url: client.req.uri,
19
+ body: force_utf8_encoding(body.to_s.inspect)
20
+ )
21
+ [head, body]
22
+ end
23
+
24
+ # Method that is used to debug responses from API's
25
+ # The method receives the response object and prints it content to console
26
+ #
27
+ # @param [EventMachine::HttpResponse] resp The Http response received from API
28
+ # @return [EventMachine::HttpResponse]
29
+ def response(resp)
30
+ puts "############## HTTP RESPONSE #####################\n"
31
+ headers = resp.response_header
32
+ puts JSON.pretty_generate(
33
+ headers: headers,
34
+ status: headers.status,
35
+ body: force_utf8_encoding(resp.response.to_s.inspect)
36
+ )
37
+ resp
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ # Returns the version of the gem as a <tt>Gem::Version</tt>
2
+ module AsanaExceptionNotifier
3
+ # it prints the gem version as a string
4
+ #
5
+ # @return [String]
6
+ #
7
+ # @api public
8
+ def self.gem_version
9
+ Gem::Version.new VERSION::STRING
10
+ end
11
+
12
+ # module used to generate the version string
13
+ # provides a easy way of getting the major, minor and tiny
14
+ module VERSION
15
+ # major release version
16
+ MAJOR = 0
17
+ # minor release version
18
+ MINOR = 0
19
+ # tiny release version
20
+ TINY = 1
21
+ # prelease version ( set this only if it is a prelease)
22
+ PRE = nil
23
+
24
+ # generates the version string
25
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
26
+ end
27
+ end
@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ require 'bundler/setup'
4
+ require 'active_support/core_ext/object/blank'
5
+ require 'active_support/core_ext/hash/keys'
6
+
7
+ require 'exception_notifier'
8
+ require 'exception_notification/rack'
9
+ if defined?(Rails)
10
+ require 'exception_notification/rails'
11
+ end
12
+ if defined?(Resque)
13
+ require 'exception_notification/resque'
14
+ end
15
+ if defined?(Sidekiq)
16
+ require 'exception_notification/sidekiq'
17
+ end
18
+ require 'exception_notification'
19
+
20
+ require 'em-http-request'
21
+ require 'eventmachine'
22
+
23
+ require 'multipart_body'
24
+ require 'rack'
25
+ require 'zip'
26
+ require 'rack/mime'
27
+ require 'sys-uname'
28
+
29
+ require 'tilt'
30
+ require 'erb'
31
+ require 'tilt/erb'
32
+
33
+ require 'logger'
34
+ require 'fileutils'
35
+ require 'ostruct'
36
+ require 'thread'
37
+ require 'json'
38
+ require 'tempfile'
39
+ require 'English'
40
+ require 'pathname'
41
+
42
+ %w(initializers helpers request classes).each do |folder_name|
43
+ Gem.find_files("asana_exception_notifier/#{folder_name}/**/*.rb").each { |path| require path }
44
+ end
45
+ require_relative './asana_exception_notifier/version'
@@ -0,0 +1,14 @@
1
+ module AsanaExceptionNotifier
2
+ module Generators
3
+ # module that is used for formatting numbers using metrics
4
+ class InstallGenerator < Rails::Generators::Base
5
+ desc 'Creates a AsanaExceptionNotifier initializer.'
6
+
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ def copy_initializer
10
+ template 'asana_exception_notifier.rb', 'config/initializers/asana_exception_notifier.rb'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ require 'asana_exception_notifier'
2
+
3
+ ExceptionNotification.configure do |config|
4
+ # Email notifier sends notifications to Asana by creating tasks .
5
+ config.add_notifier :asana, asana_api_key: ENV['ASANA_API_KEY'],
6
+ workspace: ENV['ASANA_WORKSPACE_ID'],
7
+ assignee: 'me',
8
+ assignee_status: 'today', # 'today'
9
+ due_at: Time.now.iso8601,
10
+ due_on: nil,
11
+ hearted: false,
12
+ hearts: [],
13
+ projects: [],
14
+ followers: [],
15
+ memberships: [],
16
+ tags: [],
17
+ name: nil,
18
+ notes: '',
19
+ template_path: nil
20
+ end
@@ -0,0 +1,23 @@
1
+ # encoding:utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ExceptionNotifier::AsanaNotifier do
6
+
7
+ let(:options) { double('options') }
8
+
9
+ before(:each) do
10
+ allow(options).to receive(:symbolize_keys) { options }
11
+ allow(options).to receive(:reject) { options }
12
+ allow_any_instance_of(ExceptionNotifier::AsanaNotifier).to receive(:parse_options).and_return(true)
13
+ @subject = ExceptionNotifier::AsanaNotifier.new(options)
14
+ end
15
+
16
+ describe '#initialize' do
17
+ it 'creates a object' do
18
+ expect(@subject.initial_options).to eq options
19
+ end
20
+ end
21
+
22
+
23
+ end
@@ -0,0 +1,45 @@
1
+ # Configure Rails Envinronment
2
+ ENV['RAILS_ENV'] = 'test'
3
+
4
+ require 'simplecov'
5
+ require 'simplecov-summary'
6
+ require 'coveralls'
7
+
8
+ # require "codeclimate-test-reporter"
9
+ formatters = [SimpleCov::Formatter::HTMLFormatter]
10
+
11
+ formatters << Coveralls::SimpleCov::Formatter # if ENV['TRAVIS']
12
+ # formatters << CodeClimate::TestReporter::Formatter # if ENV['CODECLIMATE_REPO_TOKEN'] && ENV['TRAVIS']
13
+
14
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(formatters)
15
+
16
+ Coveralls.wear!
17
+ SimpleCov.start 'rails' do
18
+ add_filter 'spec'
19
+
20
+ at_exit {}
21
+ end
22
+
23
+ # CodeClimate::TestReporter.configure do |config|
24
+ # config.logger.level = Logger::WARN
25
+ # end
26
+ # CodeClimate::TestReporter.start
27
+
28
+ require 'bundler/setup'
29
+ require 'asana_exception_notifier'
30
+
31
+ RSpec.configure do |config|
32
+ require 'rspec/expectations'
33
+ require 'rspec/mocks'
34
+ config.include RSpec::Matchers
35
+
36
+ config.mock_with :rspec
37
+
38
+ config.after(:suite) do
39
+ if SimpleCov.running
40
+ SimpleCov::Formatter::HTMLFormatter.new.format(SimpleCov.result)
41
+
42
+ SimpleCov::Formatter::SummaryFormatter.new.format(SimpleCov.result)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../lib/asana_exception_notifier'
2
+
3
+ AsanaExceptionNotifier::ErrorPage.class_eval do
4
+ alias_method :original_initialize, :initialize
5
+
6
+ def initialize(*args)
7
+ original_initialize(*args)
8
+ debug_html_template if ENV['DEBUG_ASANA_TEMPLATE']
9
+ end
10
+
11
+ def debug_html_template
12
+ _filename, path = create_tempfile
13
+ system("google-chrome #{path}")
14
+ sleep until 0 == 1
15
+ end
16
+ end
17
+
18
+ require_relative '../lib/generators/asana_exception_notifier/templates/asana_exception_notifier'
19
+ exception = StandardError.new
20
+ ExceptionNotifier.notify_exception(exception, notifiers: :asana)
metadata ADDED
@@ -0,0 +1,467 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asana_exception_notifier
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - bogdanRada
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ - !ruby/object:Gem::Dependency
34
+ name: em-http-request
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.1.2
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.1.2
53
+ - !ruby/object:Gem::Dependency
54
+ name: eventmachine
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.7
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.0.7
73
+ - !ruby/object:Gem::Dependency
74
+ name: exception_notification
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '4.1'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 4.1.4
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4.1'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 4.1.4
93
+ - !ruby/object:Gem::Dependency
94
+ name: multipart_body
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.2'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 0.2.1
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.2'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 0.2.1
113
+ - !ruby/object:Gem::Dependency
114
+ name: tilt
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '1.4'
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '3'
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '1.4'
130
+ - - "<"
131
+ - !ruby/object:Gem::Version
132
+ version: '3'
133
+ - !ruby/object:Gem::Dependency
134
+ name: rack
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '1.6'
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '1.6'
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '1.6'
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '1.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubyzip
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.0'
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: 1.0.0
163
+ type: :runtime
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '1.0'
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: 1.0.0
173
+ - !ruby/object:Gem::Dependency
174
+ name: zip-zip
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '0.3'
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0.3'
183
+ type: :runtime
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '0.3'
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0.3'
193
+ - !ruby/object:Gem::Dependency
194
+ name: sys-uname
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '1.0'
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: 1.0.2
203
+ type: :runtime
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '1.0'
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: 1.0.2
213
+ - !ruby/object:Gem::Dependency
214
+ name: rspec
215
+ requirement: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - "~>"
218
+ - !ruby/object:Gem::Version
219
+ version: '3.4'
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '3.4'
223
+ type: :development
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '3.4'
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: '3.4'
233
+ - !ruby/object:Gem::Dependency
234
+ name: simplecov
235
+ requirement: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - "~>"
238
+ - !ruby/object:Gem::Version
239
+ version: '0.10'
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0.10'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '0.10'
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0.10'
253
+ - !ruby/object:Gem::Dependency
254
+ name: simplecov-summary
255
+ requirement: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - "~>"
258
+ - !ruby/object:Gem::Version
259
+ version: 0.0.4
260
+ - - ">="
261
+ - !ruby/object:Gem::Version
262
+ version: 0.0.4
263
+ type: :development
264
+ prerelease: false
265
+ version_requirements: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - "~>"
268
+ - !ruby/object:Gem::Version
269
+ version: 0.0.4
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ version: 0.0.4
273
+ - !ruby/object:Gem::Dependency
274
+ name: coveralls
275
+ requirement: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - "~>"
278
+ - !ruby/object:Gem::Version
279
+ version: '0.7'
280
+ - - ">="
281
+ - !ruby/object:Gem::Version
282
+ version: '0.7'
283
+ type: :development
284
+ prerelease: false
285
+ version_requirements: !ruby/object:Gem::Requirement
286
+ requirements:
287
+ - - "~>"
288
+ - !ruby/object:Gem::Version
289
+ version: '0.7'
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0.7'
293
+ - !ruby/object:Gem::Dependency
294
+ name: rake
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '10.5'
300
+ - - ">="
301
+ - !ruby/object:Gem::Version
302
+ version: '10.5'
303
+ type: :development
304
+ prerelease: false
305
+ version_requirements: !ruby/object:Gem::Requirement
306
+ requirements:
307
+ - - "~>"
308
+ - !ruby/object:Gem::Version
309
+ version: '10.5'
310
+ - - ">="
311
+ - !ruby/object:Gem::Version
312
+ version: '10.5'
313
+ - !ruby/object:Gem::Dependency
314
+ name: yard
315
+ requirement: !ruby/object:Gem::Requirement
316
+ requirements:
317
+ - - "~>"
318
+ - !ruby/object:Gem::Version
319
+ version: '0.8'
320
+ - - ">="
321
+ - !ruby/object:Gem::Version
322
+ version: 0.8.7
323
+ type: :development
324
+ prerelease: false
325
+ version_requirements: !ruby/object:Gem::Requirement
326
+ requirements:
327
+ - - "~>"
328
+ - !ruby/object:Gem::Version
329
+ version: '0.8'
330
+ - - ">="
331
+ - !ruby/object:Gem::Version
332
+ version: 0.8.7
333
+ - !ruby/object:Gem::Dependency
334
+ name: redcarpet
335
+ requirement: !ruby/object:Gem::Requirement
336
+ requirements:
337
+ - - "~>"
338
+ - !ruby/object:Gem::Version
339
+ version: '3.3'
340
+ - - ">="
341
+ - !ruby/object:Gem::Version
342
+ version: '3.3'
343
+ type: :development
344
+ prerelease: false
345
+ version_requirements: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - "~>"
348
+ - !ruby/object:Gem::Version
349
+ version: '3.3'
350
+ - - ">="
351
+ - !ruby/object:Gem::Version
352
+ version: '3.3'
353
+ - !ruby/object:Gem::Dependency
354
+ name: github-markup
355
+ requirement: !ruby/object:Gem::Requirement
356
+ requirements:
357
+ - - "~>"
358
+ - !ruby/object:Gem::Version
359
+ version: '1.3'
360
+ - - ">="
361
+ - !ruby/object:Gem::Version
362
+ version: 1.3.3
363
+ type: :development
364
+ prerelease: false
365
+ version_requirements: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - "~>"
368
+ - !ruby/object:Gem::Version
369
+ version: '1.3'
370
+ - - ">="
371
+ - !ruby/object:Gem::Version
372
+ version: 1.3.3
373
+ - !ruby/object:Gem::Dependency
374
+ name: inch
375
+ requirement: !ruby/object:Gem::Requirement
376
+ requirements:
377
+ - - "~>"
378
+ - !ruby/object:Gem::Version
379
+ version: '0.6'
380
+ - - ">="
381
+ - !ruby/object:Gem::Version
382
+ version: '0.6'
383
+ type: :development
384
+ prerelease: false
385
+ version_requirements: !ruby/object:Gem::Requirement
386
+ requirements:
387
+ - - "~>"
388
+ - !ruby/object:Gem::Version
389
+ version: '0.6'
390
+ - - ">="
391
+ - !ruby/object:Gem::Version
392
+ version: '0.6'
393
+ description: |-
394
+ Simple ruby implementation to send notifications to Asana
395
+ when a exception happens in Rails or Rack-based apps by creating a task and uploading exception details to the task using zip archives
396
+ email: raoul_ice@yahoo.com
397
+ executables: []
398
+ extensions: []
399
+ extra_rdoc_files: []
400
+ files:
401
+ - ".codeclimate.yml"
402
+ - ".reek"
403
+ - ".rubocop.yml"
404
+ - ".travis.yml"
405
+ - CONTRIBUTING.md
406
+ - Gemfile
407
+ - Gemfile.lock
408
+ - LICENSE
409
+ - README.md
410
+ - Rakefile
411
+ - asana_exception_notifier.gemspec
412
+ - examples/sinatra/Gemfile
413
+ - examples/sinatra/Gemfile.lock
414
+ - examples/sinatra/Procfile
415
+ - examples/sinatra/README.md
416
+ - examples/sinatra/config.ru
417
+ - examples/sinatra/sinatra_app.rb
418
+ - init.rb
419
+ - lib/asana_exception_notifier.rb
420
+ - lib/asana_exception_notifier/classes/asana.rb
421
+ - lib/asana_exception_notifier/classes/error_page.rb
422
+ - lib/asana_exception_notifier/helpers/application_helper.rb
423
+ - lib/asana_exception_notifier/initializers/zip.rb
424
+ - lib/asana_exception_notifier/note_templates/asana_exception_notifier.html.erb
425
+ - lib/asana_exception_notifier/note_templates/asana_exception_notifier.text.erb
426
+ - lib/asana_exception_notifier/request/client.rb
427
+ - lib/asana_exception_notifier/request/core.rb
428
+ - lib/asana_exception_notifier/request/middleware.rb
429
+ - lib/asana_exception_notifier/version.rb
430
+ - lib/generators/asana_exception_notifier/install_generator.rb
431
+ - lib/generators/asana_exception_notifier/templates/asana_exception_notifier.rb
432
+ - spec/lib/asana_exception_notifier/classes/asana_spec.rb
433
+ - spec/spec_helper.rb
434
+ - spec/test_notification.rb
435
+ homepage: http://github.com/bogdanRada/asana_exception_notifier
436
+ licenses:
437
+ - MIT
438
+ metadata:
439
+ source_code: http://github.com/bogdanRada/asana_exception_notifier
440
+ bug_tracker: http://github.com/bogdanRada/asana_exception_notifier/issues
441
+ post_install_message:
442
+ rdoc_options: []
443
+ require_paths:
444
+ - lib
445
+ required_ruby_version: !ruby/object:Gem::Requirement
446
+ requirements:
447
+ - - ">="
448
+ - !ruby/object:Gem::Version
449
+ version: '2.0'
450
+ required_rubygems_version: !ruby/object:Gem::Requirement
451
+ requirements:
452
+ - - ">="
453
+ - !ruby/object:Gem::Version
454
+ version: '2.5'
455
+ requirements: []
456
+ rubyforge_project:
457
+ rubygems_version: 2.5.1
458
+ signing_key:
459
+ specification_version: 4
460
+ summary: Simple ruby implementation to send notifications to Asana when a exception
461
+ happens in Rails or Rack-based apps by creating a task and uploading exception details
462
+ to the task
463
+ test_files:
464
+ - spec/lib/asana_exception_notifier/classes/asana_spec.rb
465
+ - spec/spec_helper.rb
466
+ - spec/test_notification.rb
467
+ has_rdoc: