exception_notification 3.0.1 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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