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.
Files changed (55) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +9 -0
  3. data/Appraisals +11 -0
  4. data/CHANGELOG.rdoc +21 -0
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +49 -7
  7. data/README.md +417 -184
  8. data/Rakefile +4 -2
  9. data/examples/sinatra/Gemfile +8 -0
  10. data/examples/sinatra/Gemfile.lock +95 -0
  11. data/examples/sinatra/Procfile +2 -0
  12. data/examples/sinatra/README.md +11 -0
  13. data/examples/sinatra/config.ru +3 -0
  14. data/examples/sinatra/sinatra_app.rb +28 -0
  15. data/exception_notification.gemspec +10 -4
  16. data/gemfiles/rails3_1.gemfile +7 -0
  17. data/gemfiles/rails3_2.gemfile +7 -0
  18. data/gemfiles/rails4_0.gemfile +7 -0
  19. data/lib/exception_notification.rb +10 -0
  20. data/lib/exception_notification/rack.rb +45 -0
  21. data/lib/exception_notification/rails.rb +8 -0
  22. data/lib/exception_notification/resque.rb +24 -0
  23. data/lib/exception_notification/sidekiq.rb +22 -0
  24. data/lib/exception_notifier.rb +89 -61
  25. data/lib/exception_notifier/campfire_notifier.rb +2 -7
  26. data/lib/exception_notifier/email_notifier.rb +181 -0
  27. data/lib/exception_notifier/notifier.rb +9 -178
  28. data/lib/exception_notifier/views/exception_notifier/_backtrace.html.erb +3 -1
  29. data/lib/exception_notifier/views/exception_notifier/_data.html.erb +6 -1
  30. data/lib/exception_notifier/views/exception_notifier/_environment.html.erb +16 -6
  31. data/lib/exception_notifier/views/exception_notifier/_environment.text.erb +1 -1
  32. data/lib/exception_notifier/views/exception_notifier/_request.html.erb +24 -5
  33. data/lib/exception_notifier/views/exception_notifier/_request.text.erb +2 -0
  34. data/lib/exception_notifier/views/exception_notifier/_session.html.erb +10 -2
  35. data/lib/exception_notifier/views/exception_notifier/_session.text.erb +1 -1
  36. data/lib/exception_notifier/views/exception_notifier/_title.html.erb +3 -3
  37. data/lib/exception_notifier/views/exception_notifier/background_exception_notification.html.erb +38 -11
  38. data/lib/exception_notifier/views/exception_notifier/background_exception_notification.text.erb +0 -1
  39. data/lib/exception_notifier/views/exception_notifier/exception_notification.html.erb +39 -21
  40. data/lib/exception_notifier/views/exception_notifier/exception_notification.text.erb +0 -1
  41. data/lib/exception_notifier/webhook_notifier.rb +21 -0
  42. data/lib/generators/exception_notification/install_generator.rb +15 -0
  43. data/lib/generators/exception_notification/templates/exception_notification.rb +47 -0
  44. data/test/dummy/Gemfile +2 -1
  45. data/test/dummy/Gemfile.lock +79 -78
  46. data/test/dummy/config/environment.rb +9 -7
  47. data/test/dummy/test/functional/posts_controller_test.rb +22 -37
  48. data/test/{campfire_test.rb → exception_notifier/campfire_notifier_test.rb} +4 -4
  49. data/test/exception_notifier/email_notifier_test.rb +144 -0
  50. data/test/exception_notifier/webhook_notifier_test.rb +41 -0
  51. data/test/exception_notifier_test.rb +101 -0
  52. data/test/test_helper.rb +4 -1
  53. metadata +136 -18
  54. data/test/background_exception_notification_test.rb +0 -82
  55. data/test/exception_notification_test.rb +0 -73
@@ -1,5 +1,24 @@
1
- * URL : <%= raw @request.url %>
2
- * IP address: <%= raw @request.remote_ip %>
3
- * Parameters: <%= raw @request.filtered_parameters.inspect %>
4
- * Rails root: <%= raw Rails.root %>
5
- * Timestamp : <%= raw Time.current %>
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,5 +1,7 @@
1
1
  * URL : <%= raw @request.url %>
2
2
  * IP address: <%= raw @request.remote_ip %>
3
3
  * Parameters: <%= raw @request.filtered_parameters.inspect %>
4
+ <% if defined?(Rails) %>
4
5
  * Rails root: <%= raw Rails.root %>
6
+ <% end %>
5
7
  * Timestamp : <%= raw Time.current %>
@@ -1,2 +1,10 @@
1
- * session id: <%= @request.ssl? ? "[FILTERED]" : (raw (@request.session['session_id'] || @request.env["rack.session.options"][:id]).inspect.html_safe) %>
2
- * data: <%= raw PP.pp(@request.session, "") %>
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>
@@ -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
- <%= @exception.message %>
12
- <%= @backtrace.first %>
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
- "#{title}\n\n#{summary.gsub(/^/, " ")}\n\n"
15
+ [title, summary]
19
16
  end
20
- end.join
21
- sections = sections.force_encoding('UTF-8').encode('UTF-16LE', :invalid => :replace).encode('UTF-8') if sections.respond_to?(:force_encoding)
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
- <%= raw sections %>
24
- </pre>
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>
@@ -10,6 +10,5 @@
10
10
  "#{title}\n\n#{summary.gsub(/^/, " ")}\n\n"
11
11
  end
12
12
  end.join
13
- sections = sections.force_encoding('UTF-8').encode('UTF-16LE', :invalid => :replace).encode('UTF-8') if sections.respond_to?(:force_encoding)
14
13
  %>
15
14
  <%= raw sections %>
@@ -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
- sections = @sections.map do |section|
16
- begin
17
- summary = render(section).strip
18
- unless summary.blank?
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
- summary = ["ERROR: Failed to generate exception summary:", [e.class.to_s, e.message].join(": "), e.backtrace && e.backtrace.join("\n")].compact.join("\n\n")
26
-
27
- [title, summary.gsub(/^/, " "), nil].join("\n\n")
15
+ [title, summary]
28
16
  end
29
- end.join
30
- sections = sections.force_encoding('UTF-8').encode('UTF-16LE', :invalid => :replace).encode('UTF-8') if sections.respond_to?(:force_encoding)
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
- <%= raw sections %>
34
- </pre>
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>
@@ -19,7 +19,6 @@
19
19
  [title, summary.gsub(/^/, " "), nil].join("\n\n")
20
20
  end
21
21
  end.join
22
- sections = sections.force_encoding('UTF-8').encode('UTF-16LE', :invalid => :replace).encode('UTF-8') if sections.respond_to?(:force_encoding)
23
22
  %>
24
23
 
25
24
  <%= raw sections %>
@@ -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.2.8'
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'
@@ -1,118 +1,119 @@
1
1
  PATH
2
2
  remote: ../../..
3
3
  specs:
4
- exception_notification (3.0.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 (3.2.8)
11
- actionpack (= 3.2.8)
12
- mail (~> 2.4.4)
13
- actionpack (3.2.8)
14
- activemodel (= 3.2.8)
15
- activesupport (= 3.2.8)
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
- journey (~> 1.0.4)
19
- rack (~> 1.4.0)
20
- rack-cache (~> 1.2)
21
- rack-test (~> 0.6.1)
22
- sprockets (~> 2.1.3)
23
- activemodel (3.2.8)
24
- activesupport (= 3.2.8)
25
- builder (~> 3.0.0)
26
- activerecord (3.2.8)
27
- activemodel (= 3.2.8)
28
- activesupport (= 3.2.8)
29
- arel (~> 3.0.2)
30
- tzinfo (~> 0.3.29)
31
- activeresource (3.2.8)
32
- activemodel (= 3.2.8)
33
- activesupport (= 3.2.8)
34
- activesupport (3.2.8)
35
- i18n (~> 0.6)
36
- multi_json (~> 1.0)
37
- arel (3.0.2)
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.0)
41
- faraday (0.8.4)
39
+ eventmachine (1.0.3)
40
+ faraday (0.8.7)
42
41
  multipart-post (~> 1.1)
43
- faraday_middleware (0.8.8)
42
+ faraday_middleware (0.9.0)
44
43
  faraday (>= 0.7.4, < 0.9)
45
44
  hashie (1.2.0)
46
- hike (1.2.1)
45
+ hike (1.2.3)
47
46
  http_parser.rb (0.5.3)
48
- i18n (0.6.1)
49
- journey (1.0.4)
50
- json (1.7.5)
51
- mail (2.4.4)
52
- i18n (>= 0.4.0)
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.19)
56
- multi_json (1.3.6)
57
- multipart-post (1.1.5)
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.4.1)
60
- rack-cache (1.2)
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 (3.2.8)
67
- actionmailer (= 3.2.8)
68
- actionpack (= 3.2.8)
69
- activerecord (= 3.2.8)
70
- activeresource (= 3.2.8)
71
- activesupport (= 3.2.8)
72
- bundler (~> 1.0)
73
- railties (= 3.2.8)
74
- railties (3.2.8)
75
- actionpack (= 3.2.8)
76
- activesupport (= 3.2.8)
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
- rdoc (~> 3.4)
80
- thor (>= 0.14.6, < 2.0)
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.1.3)
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
- sqlite3 (1.3.6)
90
- thor (0.16.0)
91
- tilt (1.3.3)
92
- tinder (1.9.1)
93
- eventmachine (>= 0.12.0, < 2)
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.8)
96
+ faraday_middleware (~> 0.9)
96
97
  hashie (~> 1.0)
97
- json (~> 1.6)
98
- mime-types (~> 1.16)
99
- multi_json (~> 1.0)
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.10)
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.33)
109
+ tzinfo (0.3.37)
110
110
 
111
111
  PLATFORMS
112
112
  ruby
113
113
 
114
114
  DEPENDENCIES
115
115
  exception_notification!
116
- rails (= 3.2.8)
116
+ httparty
117
+ rails (= 4.0.0.rc2)
117
118
  sqlite3
118
119
  tinder