exception_notification 3.0.1 → 4.0.0.rc1
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.
- data/.gitignore +2 -0
- data/.travis.yml +9 -0
- data/Appraisals +11 -0
- data/CHANGELOG.rdoc +21 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +49 -7
- data/README.md +417 -184
- data/Rakefile +4 -2
- data/examples/sinatra/Gemfile +8 -0
- data/examples/sinatra/Gemfile.lock +95 -0
- data/examples/sinatra/Procfile +2 -0
- data/examples/sinatra/README.md +11 -0
- data/examples/sinatra/config.ru +3 -0
- data/examples/sinatra/sinatra_app.rb +28 -0
- data/exception_notification.gemspec +10 -4
- data/gemfiles/rails3_1.gemfile +7 -0
- data/gemfiles/rails3_2.gemfile +7 -0
- data/gemfiles/rails4_0.gemfile +7 -0
- data/lib/exception_notification.rb +10 -0
- data/lib/exception_notification/rack.rb +45 -0
- data/lib/exception_notification/rails.rb +8 -0
- data/lib/exception_notification/resque.rb +24 -0
- data/lib/exception_notification/sidekiq.rb +22 -0
- data/lib/exception_notifier.rb +89 -61
- data/lib/exception_notifier/campfire_notifier.rb +2 -7
- data/lib/exception_notifier/email_notifier.rb +181 -0
- data/lib/exception_notifier/notifier.rb +9 -178
- data/lib/exception_notifier/views/exception_notifier/_backtrace.html.erb +3 -1
- data/lib/exception_notifier/views/exception_notifier/_data.html.erb +6 -1
- data/lib/exception_notifier/views/exception_notifier/_environment.html.erb +16 -6
- data/lib/exception_notifier/views/exception_notifier/_environment.text.erb +1 -1
- data/lib/exception_notifier/views/exception_notifier/_request.html.erb +24 -5
- data/lib/exception_notifier/views/exception_notifier/_request.text.erb +2 -0
- data/lib/exception_notifier/views/exception_notifier/_session.html.erb +10 -2
- data/lib/exception_notifier/views/exception_notifier/_session.text.erb +1 -1
- data/lib/exception_notifier/views/exception_notifier/_title.html.erb +3 -3
- data/lib/exception_notifier/views/exception_notifier/background_exception_notification.html.erb +38 -11
- data/lib/exception_notifier/views/exception_notifier/background_exception_notification.text.erb +0 -1
- data/lib/exception_notifier/views/exception_notifier/exception_notification.html.erb +39 -21
- data/lib/exception_notifier/views/exception_notifier/exception_notification.text.erb +0 -1
- data/lib/exception_notifier/webhook_notifier.rb +21 -0
- data/lib/generators/exception_notification/install_generator.rb +15 -0
- data/lib/generators/exception_notification/templates/exception_notification.rb +47 -0
- data/test/dummy/Gemfile +2 -1
- data/test/dummy/Gemfile.lock +79 -78
- data/test/dummy/config/environment.rb +9 -7
- data/test/dummy/test/functional/posts_controller_test.rb +22 -37
- data/test/{campfire_test.rb → exception_notifier/campfire_notifier_test.rb} +4 -4
- data/test/exception_notifier/email_notifier_test.rb +144 -0
- data/test/exception_notifier/webhook_notifier_test.rb +41 -0
- data/test/exception_notifier_test.rb +101 -0
- data/test/test_helper.rb +4 -1
- metadata +136 -18
- data/test/background_exception_notification_test.rb +0 -82
- data/test/exception_notification_test.rb +0 -73
@@ -1,5 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
<ul style="list-style: none">
|
2
|
+
<li>
|
3
|
+
<strong>URL:</strong>
|
4
|
+
<span><%= raw @request.url %></span>
|
5
|
+
</li>
|
6
|
+
<li>
|
7
|
+
<strong>IP Address:</strong>
|
8
|
+
<span><%= raw @request.remote_ip %></span>
|
9
|
+
</li>
|
10
|
+
<li>
|
11
|
+
<strong>Parameters:</strong>
|
12
|
+
<span><%= raw @request.filtered_parameters.inspect %></span>
|
13
|
+
</li>
|
14
|
+
<% if defined?(Rails) %>
|
15
|
+
<li>
|
16
|
+
<strong>Rails root:</strong>
|
17
|
+
<span><%= raw Rails.root %></span>
|
18
|
+
</li>
|
19
|
+
<% end %>
|
20
|
+
<li>
|
21
|
+
<strong>Timestamp:</strong>
|
22
|
+
<span><%= raw Time.current %></span>
|
23
|
+
</li>
|
24
|
+
</ul>
|
@@ -1,2 +1,10 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<ul style="list-style: none">
|
2
|
+
<li>
|
3
|
+
<strong>session_id: </strong>
|
4
|
+
<span><%= @request.ssl? ? "[FILTERED]" : (raw (@request.session['session_id'] || (@request.env["rack.session.options"] and @request.env["rack.session.options"][:id])).inspect.html_safe) %></span>
|
5
|
+
</li>
|
6
|
+
<li>
|
7
|
+
<strong>data: </strong>
|
8
|
+
<span><%= raw PP.pp(@request.session, "") %></span>
|
9
|
+
</li>
|
10
|
+
</ul>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
* session id: <%= @request.ssl? ? "[FILTERED]" : (raw (@request.session['session_id'] || @request.env["rack.session.options"][:id]).inspect.html_safe) %>
|
1
|
+
* session id: <%= @request.ssl? ? "[FILTERED]" : (raw (@request.session['session_id'] || (@request.env["rack.session.options"] and @request.env["rack.session.options"][:id])).inspect.html_safe) %>
|
2
2
|
* data: <%= raw PP.pp(@request.session, "") %>
|
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
<%= raw title.to_s.humanize
|
3
|
-
|
1
|
+
<h2>
|
2
|
+
<%= raw title.to_s.humanize %>
|
3
|
+
</h2>
|
data/lib/exception_notifier/views/exception_notifier/background_exception_notification.html.erb
CHANGED
@@ -5,22 +5,49 @@
|
|
5
5
|
<title>Exception</title>
|
6
6
|
</head>
|
7
7
|
<body>
|
8
|
-
<pre style="font-size: 12px">
|
9
|
-
<%= @exception.class.to_s =~ /^[aeiou]/i ? 'An' : 'A' %> <%= @exception.class %> occurred in background at <%= raw Time.current %> :
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
sections = @sections.map do |section|
|
9
|
+
<%
|
10
|
+
sections_content = @sections.map do |section|
|
11
|
+
begin
|
15
12
|
summary = render(section).strip
|
16
13
|
unless summary.blank?
|
17
14
|
title = render("title", :title => section).strip
|
18
|
-
|
15
|
+
[title, summary]
|
19
16
|
end
|
20
|
-
|
21
|
-
|
17
|
+
|
18
|
+
rescue Exception => e
|
19
|
+
title = render("title", :title => section).strip
|
20
|
+
summary = ["ERROR: Failed to generate exception summary:", [e.class.to_s, e.message].join(": "), e.backtrace && e.backtrace.join("\n")].compact.join("\n\n")
|
21
|
+
|
22
|
+
[title, summary]
|
23
|
+
end
|
24
|
+
end
|
22
25
|
%>
|
23
|
-
|
24
|
-
|
26
|
+
|
27
|
+
<table width="100%" border="0" cellpadding="0" cellspacing="0">
|
28
|
+
<tr><td align="center" valign="top">
|
29
|
+
<table width="650" border="0" cellpadding="0" cellspacing="20">
|
30
|
+
<tr>
|
31
|
+
<td style="padding: 10px; border: 1px solid #eed3d7; background-color: #f2dede">
|
32
|
+
<h3 style="color: #b94a48">
|
33
|
+
<%= @exception.class.to_s =~ /^[aeiou]/i ? 'An' : 'A' %> <%= @exception.class %> occurred in background at <%= raw Time.current %> :
|
34
|
+
</h3>
|
35
|
+
<p style="color: #b94a48"><%= raw @exception.message %></p>
|
36
|
+
<pre style="font-size: 12px; padding: 5px; background-color:#f5f5f5">
|
37
|
+
<%= raw @backtrace.first %>
|
38
|
+
</pre>
|
39
|
+
</td>
|
40
|
+
</tr>
|
41
|
+
<% sections_content.each do |title, summary| %>
|
42
|
+
<tr>
|
43
|
+
<td style="border-bottom: 1px solid #eeeeee;"><%= raw title %></td>
|
44
|
+
</tr>
|
45
|
+
<tr>
|
46
|
+
<td><%= raw summary %></td>
|
47
|
+
</tr>
|
48
|
+
<% end %>
|
49
|
+
</table>
|
50
|
+
</td></tr>
|
51
|
+
</table>
|
25
52
|
</body>
|
26
53
|
</html>
|
@@ -5,32 +5,50 @@
|
|
5
5
|
<title>Exception</title>
|
6
6
|
</head>
|
7
7
|
<body>
|
8
|
-
<pre style="font-size: 12px">
|
9
|
-
<%= @exception.class.to_s =~ /^[aeiou]/i ? 'An' : 'A' %> <%= @exception.class %> occurred in <%= @kontroller.controller_name %>#<%= @kontroller.action_name %>:
|
10
|
-
|
11
|
-
<%= raw @exception.message %>
|
12
|
-
<%= raw @backtrace.first %>
|
13
8
|
|
14
9
|
<%
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
title = render("title", :title => section).strip
|
20
|
-
"#{title}\n\n#{summary.gsub(/^/, " ")}\n\n"
|
21
|
-
end
|
22
|
-
|
23
|
-
rescue Exception => e
|
10
|
+
sections_content = @sections.map do |section|
|
11
|
+
begin
|
12
|
+
summary = render(section).strip
|
13
|
+
unless summary.blank?
|
24
14
|
title = render("title", :title => section).strip
|
25
|
-
|
26
|
-
|
27
|
-
[title, summary.gsub(/^/, " "), nil].join("\n\n")
|
15
|
+
[title, summary]
|
28
16
|
end
|
29
|
-
|
30
|
-
|
17
|
+
|
18
|
+
rescue Exception => e
|
19
|
+
title = render("title", :title => section).strip
|
20
|
+
summary = ["ERROR: Failed to generate exception summary:", [e.class.to_s, e.message].join(": "), e.backtrace && e.backtrace.join("\n")].compact.join("\n\n")
|
21
|
+
|
22
|
+
[title, summary]
|
23
|
+
end
|
24
|
+
end
|
31
25
|
%>
|
32
26
|
|
33
|
-
|
34
|
-
|
27
|
+
<table width="100%" border="0" cellpadding="0" cellspacing="0">
|
28
|
+
<tr><td align="center" valign="top">
|
29
|
+
<table width="650" border="0" cellpadding="0" cellspacing="20">
|
30
|
+
<tr>
|
31
|
+
<td style="padding: 10px; border: 1px solid #eed3d7; background-color: #f2dede">
|
32
|
+
<h3 style="color: #b94a48">
|
33
|
+
<%= @exception.class.to_s =~ /^[aeiou]/i ? 'An' : 'A' %> <%= @exception.class %> occurred in <%= @kontroller.controller_name %>#<%= @kontroller.action_name %>:
|
34
|
+
</h3>
|
35
|
+
<p style="color: #b94a48"><%= raw @exception.message %></p>
|
36
|
+
<pre style="font-size: 12px; padding: 5px; background-color:#f5f5f5">
|
37
|
+
<%= raw @backtrace.first %>
|
38
|
+
</pre>
|
39
|
+
</td>
|
40
|
+
</tr>
|
41
|
+
<% sections_content.each do |title, summary| %>
|
42
|
+
<tr>
|
43
|
+
<td style="border-bottom: 1px solid #eeeeee;"><%= raw title %></td>
|
44
|
+
</tr>
|
45
|
+
<tr>
|
46
|
+
<td><%= raw summary %></td>
|
47
|
+
</tr>
|
48
|
+
<% end %>
|
49
|
+
</table>
|
50
|
+
</td></tr>
|
51
|
+
</table>
|
52
|
+
|
35
53
|
</body>
|
36
54
|
</html>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ExceptionNotifier
|
2
|
+
class WebhookNotifier
|
3
|
+
|
4
|
+
def initialize(options)
|
5
|
+
@default_options = options
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(exception, options={})
|
9
|
+
options = options.reverse_merge(@default_options)
|
10
|
+
url = options.delete(:url)
|
11
|
+
http_method = options.delete(:http_method) || :post
|
12
|
+
|
13
|
+
options[:body] ||= {}
|
14
|
+
options[:body][:exception] = {:error_class => exception.class.to_s,
|
15
|
+
:message => exception.message.inspect,
|
16
|
+
:backtrace => exception.backtrace}
|
17
|
+
|
18
|
+
HTTParty.send(http_method, url, options)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ExceptionNotification
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
desc "Creates a ExceptionNotification initializer."
|
5
|
+
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
class_option :resque, :type => :boolean, :desc => 'Add support for sending notifications when errors occur in Resque jobs.'
|
8
|
+
class_option :sidekiq, :type => :boolean, :desc => 'Add support for sending notifications when errors occur in Sidekiq jobs.'
|
9
|
+
|
10
|
+
def copy_initializer
|
11
|
+
template 'exception_notification.rb', 'config/initializers/exception_notification.rb'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'exception_notification/rails'
|
2
|
+
<% if options.sidekiq? %>
|
3
|
+
require 'exception_notification/sidekiq'
|
4
|
+
<% end %>
|
5
|
+
<% if options.resque? %>
|
6
|
+
require 'resque/failure/multiple'
|
7
|
+
require 'resque/failure/redis'
|
8
|
+
require 'exception_notification/resque'
|
9
|
+
|
10
|
+
Resque::Failure::Multiple.classes = [Resque::Failure::Redis, ExceptionNotification::Resque]
|
11
|
+
Resque::Failure.backend = Resque::Failure::Multiple
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
ExceptionNotification.configure do |config|
|
15
|
+
# Ignore additional exception types.
|
16
|
+
# ActiveRecord::RecordNotFound, AbstractController::ActionNotFound and ActionController::RoutingError are already added.
|
17
|
+
# config.ignored_exceptions += %w{ActionView::TemplateError CustomError}
|
18
|
+
|
19
|
+
# Adds a condition to decide when an exception must be ignored or not.
|
20
|
+
# The ignore_if method can be invoked multiple times to add extra conditions.
|
21
|
+
# config.ignore_if do |exception, options|
|
22
|
+
# not Rails.env.production?
|
23
|
+
# end
|
24
|
+
|
25
|
+
# Notifiers =================================================================
|
26
|
+
|
27
|
+
# Email notifier sends notifications by email.
|
28
|
+
config.add_notifier :email, {
|
29
|
+
:email_prefix => "[ERROR] ",
|
30
|
+
:sender_address => %{"Notifier" <notifier@example.com>},
|
31
|
+
:exception_recipients => %w{exceptions@example.com}
|
32
|
+
}
|
33
|
+
|
34
|
+
# Campfire notifier sends notifications to your Campfire room. Requires 'tinder' gem.
|
35
|
+
# config.add_notifier :campfire, {
|
36
|
+
# :subdomain => 'my_subdomain',
|
37
|
+
# :token => 'my_token',
|
38
|
+
# :room_name => 'my_room'
|
39
|
+
# }
|
40
|
+
|
41
|
+
# Webhook notifier sends notifications over HTTP protocol. Requires 'httparty' gem.
|
42
|
+
# config.add_notifier :webhook, {
|
43
|
+
# :url => 'http://example.com:5555/hubot/path',
|
44
|
+
# :http_method => :post
|
45
|
+
# }
|
46
|
+
|
47
|
+
end
|
data/test/dummy/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
2
|
|
3
|
-
gem 'rails', '
|
3
|
+
gem 'rails', '4.0.0.rc2'
|
4
4
|
|
5
5
|
# Bundle edge Rails instead:
|
6
6
|
# gem 'rails', :git => 'git://github.com/rails/rails.git'
|
@@ -8,6 +8,7 @@ gem 'rails', '3.2.8'
|
|
8
8
|
gem 'sqlite3'
|
9
9
|
|
10
10
|
gem 'tinder'
|
11
|
+
gem 'httparty'
|
11
12
|
gem 'exception_notification', :path => "../../.."
|
12
13
|
# Use unicorn as the web server
|
13
14
|
# gem 'unicorn'
|
data/test/dummy/Gemfile.lock
CHANGED
@@ -1,118 +1,119 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../../..
|
3
3
|
specs:
|
4
|
-
exception_notification (3.0.
|
4
|
+
exception_notification (3.0.1)
|
5
5
|
actionmailer (>= 3.0.4)
|
6
|
+
activesupport (>= 3.0.4)
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: http://rubygems.org/
|
9
10
|
specs:
|
10
|
-
actionmailer (
|
11
|
-
actionpack (=
|
12
|
-
mail (~> 2.
|
13
|
-
actionpack (
|
14
|
-
|
15
|
-
|
16
|
-
builder (~> 3.0.0)
|
11
|
+
actionmailer (4.0.0.rc2)
|
12
|
+
actionpack (= 4.0.0.rc2)
|
13
|
+
mail (~> 2.5.3)
|
14
|
+
actionpack (4.0.0.rc2)
|
15
|
+
activesupport (= 4.0.0.rc2)
|
16
|
+
builder (~> 3.1.0)
|
17
17
|
erubis (~> 2.7.0)
|
18
|
-
|
19
|
-
rack (~>
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
builder (3.0.2)
|
18
|
+
rack (~> 1.5.2)
|
19
|
+
rack-test (~> 0.6.2)
|
20
|
+
activemodel (4.0.0.rc2)
|
21
|
+
activesupport (= 4.0.0.rc2)
|
22
|
+
builder (~> 3.1.0)
|
23
|
+
activerecord (4.0.0.rc2)
|
24
|
+
activemodel (= 4.0.0.rc2)
|
25
|
+
activerecord-deprecated_finders (~> 1.0.2)
|
26
|
+
activesupport (= 4.0.0.rc2)
|
27
|
+
arel (~> 4.0.0)
|
28
|
+
activerecord-deprecated_finders (1.0.3)
|
29
|
+
activesupport (4.0.0.rc2)
|
30
|
+
i18n (~> 0.6, >= 0.6.4)
|
31
|
+
minitest (~> 4.2)
|
32
|
+
multi_json (~> 1.3)
|
33
|
+
thread_safe (~> 0.1)
|
34
|
+
tzinfo (~> 0.3.37)
|
35
|
+
arel (4.0.0)
|
36
|
+
atomic (1.1.9)
|
37
|
+
builder (3.1.4)
|
39
38
|
erubis (2.7.0)
|
40
|
-
eventmachine (1.0.
|
41
|
-
faraday (0.8.
|
39
|
+
eventmachine (1.0.3)
|
40
|
+
faraday (0.8.7)
|
42
41
|
multipart-post (~> 1.1)
|
43
|
-
faraday_middleware (0.
|
42
|
+
faraday_middleware (0.9.0)
|
44
43
|
faraday (>= 0.7.4, < 0.9)
|
45
44
|
hashie (1.2.0)
|
46
|
-
hike (1.2.
|
45
|
+
hike (1.2.3)
|
47
46
|
http_parser.rb (0.5.3)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
httparty (0.11.0)
|
48
|
+
multi_json (~> 1.0)
|
49
|
+
multi_xml (>= 0.5.2)
|
50
|
+
i18n (0.6.4)
|
51
|
+
json (1.7.7)
|
52
|
+
mail (2.5.4)
|
53
53
|
mime-types (~> 1.16)
|
54
54
|
treetop (~> 1.4.8)
|
55
|
-
mime-types (1.
|
56
|
-
|
57
|
-
|
55
|
+
mime-types (1.23)
|
56
|
+
minitest (4.7.4)
|
57
|
+
multi_json (1.7.7)
|
58
|
+
multi_xml (0.5.4)
|
59
|
+
multipart-post (1.2.0)
|
58
60
|
polyglot (0.3.3)
|
59
|
-
rack (1.
|
60
|
-
rack-
|
61
|
-
rack (>= 0.4)
|
62
|
-
rack-ssl (1.3.2)
|
63
|
-
rack
|
64
|
-
rack-test (0.6.1)
|
61
|
+
rack (1.5.2)
|
62
|
+
rack-test (0.6.2)
|
65
63
|
rack (>= 1.0)
|
66
|
-
rails (
|
67
|
-
actionmailer (=
|
68
|
-
actionpack (=
|
69
|
-
activerecord (=
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
railties (
|
75
|
-
actionpack (=
|
76
|
-
activesupport (=
|
77
|
-
rack-ssl (~> 1.3.2)
|
64
|
+
rails (4.0.0.rc2)
|
65
|
+
actionmailer (= 4.0.0.rc2)
|
66
|
+
actionpack (= 4.0.0.rc2)
|
67
|
+
activerecord (= 4.0.0.rc2)
|
68
|
+
activesupport (= 4.0.0.rc2)
|
69
|
+
bundler (>= 1.3.0, < 2.0)
|
70
|
+
railties (= 4.0.0.rc2)
|
71
|
+
sprockets-rails (~> 2.0.0)
|
72
|
+
railties (4.0.0.rc2)
|
73
|
+
actionpack (= 4.0.0.rc2)
|
74
|
+
activesupport (= 4.0.0.rc2)
|
78
75
|
rake (>= 0.8.7)
|
79
|
-
|
80
|
-
|
81
|
-
rake (0.9.2.2)
|
82
|
-
rdoc (3.12)
|
83
|
-
json (~> 1.4)
|
76
|
+
thor (>= 0.18.1, < 2.0)
|
77
|
+
rake (10.0.4)
|
84
78
|
simple_oauth (0.1.9)
|
85
|
-
sprockets (2.
|
79
|
+
sprockets (2.10.0)
|
86
80
|
hike (~> 1.2)
|
81
|
+
multi_json (~> 1.0)
|
87
82
|
rack (~> 1.0)
|
88
83
|
tilt (~> 1.1, != 1.3.0)
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
84
|
+
sprockets-rails (2.0.0)
|
85
|
+
actionpack (>= 3.0)
|
86
|
+
activesupport (>= 3.0)
|
87
|
+
sprockets (~> 2.8)
|
88
|
+
sqlite3 (1.3.7)
|
89
|
+
thor (0.18.1)
|
90
|
+
thread_safe (0.1.0)
|
91
|
+
atomic
|
92
|
+
tilt (1.4.1)
|
93
|
+
tinder (1.9.2)
|
94
|
+
eventmachine (~> 1.0)
|
94
95
|
faraday (~> 0.8)
|
95
|
-
faraday_middleware (~> 0.
|
96
|
+
faraday_middleware (~> 0.9)
|
96
97
|
hashie (~> 1.0)
|
97
|
-
json (~> 1.
|
98
|
-
mime-types (~> 1.
|
99
|
-
multi_json (~> 1.
|
100
|
-
multipart-post (~> 1.1)
|
98
|
+
json (~> 1.7.5)
|
99
|
+
mime-types (~> 1.19)
|
100
|
+
multi_json (~> 1.5)
|
101
101
|
twitter-stream (~> 0.1)
|
102
|
-
treetop (1.4.
|
102
|
+
treetop (1.4.14)
|
103
103
|
polyglot
|
104
104
|
polyglot (>= 0.3.1)
|
105
105
|
twitter-stream (0.1.16)
|
106
106
|
eventmachine (>= 0.12.8)
|
107
107
|
http_parser.rb (~> 0.5.1)
|
108
108
|
simple_oauth (~> 0.1.4)
|
109
|
-
tzinfo (0.3.
|
109
|
+
tzinfo (0.3.37)
|
110
110
|
|
111
111
|
PLATFORMS
|
112
112
|
ruby
|
113
113
|
|
114
114
|
DEPENDENCIES
|
115
115
|
exception_notification!
|
116
|
-
|
116
|
+
httparty
|
117
|
+
rails (= 4.0.0.rc2)
|
117
118
|
sqlite3
|
118
119
|
tinder
|