diff --git a/.travis.yml b/.travis.yml
index d1014f11f..36513ae8a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,6 +15,8 @@ addons:
- $(ls tmp/screenshots/*.png | tr "\n" ":")
- $(ls tmp/csvs/*.csv | tr "\n" ":")
debug: true
+gemfile:
+- Gemfile
services:
- redis-server
env:
diff --git a/Gemfile b/Gemfile
index 0138184a0..0e886f6c0 100644
--- a/Gemfile
+++ b/Gemfile
@@ -78,7 +78,7 @@ gem "pusher-push-notifications", "~> 1.1" # Pusher Push Notifications Ruby serve
gem "rack-attack", "~> 6.3.1" # Used to throttle requests to prevent brute force attacks
gem "rack-cors", "~> 1.1" # Middleware that will make Rack-based apps CORS compatible
gem "rack-timeout", "~> 0.6" # Rack middleware which aborts requests that have been running for longer than a specified timeout
-gem "rails", "~> 5.2" # Ruby on Rails
+gem "rails", "~> 6.0.1" # Ruby on Rails
gem "rails-settings-cached", ">= 2.1.1" # Settings plugin for Rails that makes managing a table of global key, value pairs easy.
gem "ransack", "~> 2.3" # Searching and sorting
gem "recaptcha", "~> 5.5", require: "recaptcha/rails" # Helpers for the reCAPTCHA API
@@ -101,7 +101,7 @@ gem "storext", "~> 3.1" # Add type-casting and other features on top of ActiveRe
gem "stripe", "~> 5.22" # Ruby library for the Stripe API
gem "strong_migrations", "~> 0.6" # Catch unsafe migrations
gem "timber", "~> 3.0" # Great Ruby logging made easy
-gem "timber-rails", "~> 1.0" # Timber integration for Rails
+gem "timber-rails", github: "timberio/timber-ruby-rails", branch: "master" # Timber integration for Rails
gem "twilio-ruby", "~> 5.36" # The official library for communicating with the Twilio REST API
gem "twitter", "~> 7.0" # A Ruby interface to the Twitter API
gem "uglifier", "~> 4.2" # Uglifier minifies JavaScript files
diff --git a/Gemfile.lock b/Gemfile.lock
index b1513c05d..aac508ba5 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -6,54 +6,78 @@ GIT
acts_as_follower (0.2.1)
activerecord (>= 4.0)
+GIT
+ remote: https://github.com/timberio/timber-ruby-rails.git
+ revision: 250326b0926d33207f0e1147a594dd8fe4487466
+ branch: master
+ specs:
+ timber-rails (1.0.2)
+ rails (>= 3.0.0)
+ timber (~> 3.0)
+ timber-rack (~> 1.0)
+
GEM
remote: https://rubygems.org/
specs:
- actioncable (5.2.4.3)
- actionpack (= 5.2.4.3)
+ actioncable (6.0.3.1)
+ actionpack (= 6.0.3.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailer (5.2.4.3)
- actionpack (= 5.2.4.3)
- actionview (= 5.2.4.3)
- activejob (= 5.2.4.3)
+ actionmailbox (6.0.3.1)
+ actionpack (= 6.0.3.1)
+ activejob (= 6.0.3.1)
+ activerecord (= 6.0.3.1)
+ activestorage (= 6.0.3.1)
+ activesupport (= 6.0.3.1)
+ mail (>= 2.7.1)
+ actionmailer (6.0.3.1)
+ actionpack (= 6.0.3.1)
+ actionview (= 6.0.3.1)
+ activejob (= 6.0.3.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (5.2.4.3)
- actionview (= 5.2.4.3)
- activesupport (= 5.2.4.3)
+ actionpack (6.0.3.1)
+ actionview (= 6.0.3.1)
+ activesupport (= 6.0.3.1)
rack (~> 2.0, >= 2.0.8)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
- actionview (5.2.4.3)
- activesupport (= 5.2.4.3)
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
+ actiontext (6.0.3.1)
+ actionpack (= 6.0.3.1)
+ activerecord (= 6.0.3.1)
+ activestorage (= 6.0.3.1)
+ activesupport (= 6.0.3.1)
+ nokogiri (>= 1.8.5)
+ actionview (6.0.3.1)
+ activesupport (= 6.0.3.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_record_union (1.3.0)
activerecord (>= 4.0)
- activejob (5.2.4.3)
- activesupport (= 5.2.4.3)
+ activejob (6.0.3.1)
+ activesupport (= 6.0.3.1)
globalid (>= 0.3.6)
- activemodel (5.2.4.3)
- activesupport (= 5.2.4.3)
- activerecord (5.2.4.3)
- activemodel (= 5.2.4.3)
- activesupport (= 5.2.4.3)
- arel (>= 9.0)
+ activemodel (6.0.3.1)
+ activesupport (= 6.0.3.1)
+ activerecord (6.0.3.1)
+ activemodel (= 6.0.3.1)
+ activesupport (= 6.0.3.1)
activerecord-import (1.0.5)
activerecord (>= 3.2)
- activestorage (5.2.4.3)
- actionpack (= 5.2.4.3)
- activerecord (= 5.2.4.3)
+ activestorage (6.0.3.1)
+ actionpack (= 6.0.3.1)
+ activejob (= 6.0.3.1)
+ activerecord (= 6.0.3.1)
marcel (~> 0.3.1)
- activesupport (5.2.4.3)
+ activesupport (6.0.3.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
+ zeitwerk (~> 2.2, >= 2.2.2)
acts-as-taggable-on (6.5.0)
activerecord (>= 5.0, < 6.1)
addressable (2.7.0)
@@ -86,7 +110,6 @@ GEM
approvals (0.0.24)
nokogiri (~> 1.6)
thor (~> 0.18)
- arel (9.0.0)
ast (2.4.0)
autoprefixer-rails (9.7.6)
execjs
@@ -566,18 +589,20 @@ GEM
rack-test (1.1.0)
rack (>= 1.0, < 3)
rack-timeout (0.6.0)
- rails (5.2.4.3)
- actioncable (= 5.2.4.3)
- actionmailer (= 5.2.4.3)
- actionpack (= 5.2.4.3)
- actionview (= 5.2.4.3)
- activejob (= 5.2.4.3)
- activemodel (= 5.2.4.3)
- activerecord (= 5.2.4.3)
- activestorage (= 5.2.4.3)
- activesupport (= 5.2.4.3)
+ rails (6.0.3.1)
+ actioncable (= 6.0.3.1)
+ actionmailbox (= 6.0.3.1)
+ actionmailer (= 6.0.3.1)
+ actionpack (= 6.0.3.1)
+ actiontext (= 6.0.3.1)
+ actionview (= 6.0.3.1)
+ activejob (= 6.0.3.1)
+ activemodel (= 6.0.3.1)
+ activerecord (= 6.0.3.1)
+ activestorage (= 6.0.3.1)
+ activesupport (= 6.0.3.1)
bundler (>= 1.3.0)
- railties (= 5.2.4.3)
+ railties (= 6.0.3.1)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
@@ -587,12 +612,12 @@ GEM
rails-settings-cached (2.1.1)
rails (>= 4.2.0)
request_store
- railties (5.2.4.3)
- actionpack (= 5.2.4.3)
- activesupport (= 5.2.4.3)
+ railties (6.0.3.1)
+ actionpack (= 6.0.3.1)
+ activesupport (= 6.0.3.1)
method_source
rake (>= 0.8.7)
- thor (>= 0.19.0, < 2.0)
+ thor (>= 0.20.3, < 2.0)
rainbow (3.0.0)
rake (13.0.1)
ransack (2.3.2)
@@ -774,10 +799,6 @@ GEM
timber-rack (1.0.1)
rack (>= 1.2, < 3.0)
timber (~> 3.0)
- timber-rails (1.0.1)
- rails (>= 3.0.0, < 6.0.0)
- timber (~> 3.0)
- timber-rack (~> 1.0)
timecop (0.9.1)
twilio-ruby (5.36.0)
faraday (>= 0.9, < 2.0)
@@ -835,7 +856,7 @@ GEM
rack-proxy (>= 0.6.1)
railties (>= 5.2)
semantic_range (>= 2.3.0)
- websocket-driver (0.7.1)
+ websocket-driver (0.7.2)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.4)
xpath (3.2.0)
@@ -846,6 +867,7 @@ GEM
yard (>= 0.8.3)
yard-activesupport-concern (0.0.1)
yard (>= 0.8)
+ zeitwerk (2.3.0)
zonebie (0.6.1)
PLATFORMS
@@ -949,7 +971,7 @@ DEPENDENCIES
rack-cors (~> 1.1)
rack-host-redirect (~> 1.3)
rack-timeout (~> 0.6)
- rails (~> 5.2)
+ rails (~> 6.0.1)
rails-settings-cached (>= 2.1.1)
ransack (~> 2.3)
recaptcha (~> 5.5)
@@ -987,7 +1009,7 @@ DEPENDENCIES
strong_migrations (~> 0.6)
test-prof (~> 0.11)
timber (~> 3.0)
- timber-rails (~> 1.0)
+ timber-rails!
timecop (~> 0.9)
twilio-ruby (~> 5.36)
twitter (~> 7.0)
diff --git a/app/controllers/chat_channel_memberships_controller.rb b/app/controllers/chat_channel_memberships_controller.rb
index e89865227..7d5359ce2 100644
--- a/app/controllers/chat_channel_memberships_controller.rb
+++ b/app/controllers/chat_channel_memberships_controller.rb
@@ -121,7 +121,9 @@ class ChatChannelMembershipsController < ApplicationController
flash[:settings_notice] = "Invitation to #{channel_name} accepted. It may take a moment to show up in your list."
else
send_chat_action_message("@#{current_user.username} added @#{@chat_channel_membership.user.username}", current_user, @chat_channel_membership.chat_channel_id, "joined")
- NotifyMailer.channel_invite_email(@chat_channel_membership, @chat_channel_membership.user).deliver_later
+
+ NotifyMailer.with(membership: @chat_channel_membership, inviter: @chat_channel_membership.user).channel_invite_email.deliver_later
+
flash[:settings_notice] = "Accepted request of #{@chat_channel_membership.user.username} to join #{channel_name}."
membership = ChatChannelMembership.find_by!(chat_channel_id: @chat_channel_membership.chat_channel.id, user: current_user)
respond_to do |format|
diff --git a/app/labor/sticky_article_collection.rb b/app/labor/sticky_article_collection.rb
index d4a4a4d0b..f4c2474f3 100644
--- a/app/labor/sticky_article_collection.rb
+++ b/app/labor/sticky_article_collection.rb
@@ -24,7 +24,7 @@ class StickyArticleCollection
@tag_articles ||= Article.published.tagged_with(article_tags, any: true).
includes(:user).
where("public_reactions_count > ? OR comments_count > ?", reaction_count_num, comment_count_num).
- where.not(id: article.id, user_id: article.user_id).
+ where.not(id: article.id).where.not(user_id: article.user_id).
where("featured_number > ?", 5.days.ago.to_i).
order(Arel.sql("RANDOM()")).
limit(8)
@@ -36,7 +36,7 @@ class StickyArticleCollection
Article.published.tagged_with(%w[career productivity discuss explainlikeimfive], any: true).
includes(:user).
where("comments_count > ?", comment_count_num).
- where.not(id: article.id, user_id: article.user_id).
+ where.not(id: article.id).where.not(user_id: article.user_id).
where("featured_number > ?", 5.days.ago.to_i).
order(Arel.sql("RANDOM()")).
limit(10 - tag_articles.size)
diff --git a/app/mailers/notify_mailer.rb b/app/mailers/notify_mailer.rb
index f6d18fbed..32766386e 100644
--- a/app/mailers/notify_mailer.rb
+++ b/app/mailers/notify_mailer.rb
@@ -81,14 +81,16 @@ class NotifyMailer < ApplicationMailer
mail(to: @user.email, subject: subject)
end
- def channel_invite_email(membership, inviter)
- @membership = membership
- @inviter = inviter
+ def channel_invite_email
+ @membership = params[:membership]
+ @inviter = params[:inviter]
+
subject = if @membership.role == "mod"
"You are invited to the #{@membership.chat_channel.channel_name} channel as moderator."
else
"You are invited to the #{@membership.chat_channel.channel_name} channel."
end
+
mail(to: @membership.user.email, subject: subject)
end
diff --git a/app/models/article.rb b/app/models/article.rb
index 6cc00134a..f5fbf5fd1 100644
--- a/app/models/article.rb
+++ b/app/models/article.rb
@@ -169,7 +169,7 @@ class Article < ApplicationRecord
scope :feed, -> { published.includes(:taggings).select(:id, :published_at, :processed_html, :user_id, :organization_id, :title, :path, :cached_tag_list) }
- scope :with_video, -> { published.where.not(video: [nil, ""], video_thumbnail_url: [nil, ""]).where("score > ?", -4) }
+ scope :with_video, -> { published.where.not(video: [nil, ""]).where.not(video_thumbnail_url: [nil, ""]).where("score > ?", -4) }
scope :eager_load_serialized_data, -> { includes(:user, :organization, :tags) }
diff --git a/app/models/chat_channel.rb b/app/models/chat_channel.rb
index 07f572b69..097dc3da5 100644
--- a/app/models/chat_channel.rb
+++ b/app/models/chat_channel.rb
@@ -112,13 +112,13 @@ class ChatChannel < ApplicationRecord
existing_membership = ChatChannelMembership.find_by(user_id: user.id, chat_channel_id: id)
if existing_membership.present? && %w[active pending].exclude?(existing_membership.status)
if existing_membership.update(status: "pending", role: membership_role)
- NotifyMailer.channel_invite_email(existing_membership, inviter).deliver_later
+ NotifyMailer.with(membership: existing_membership, inviter: inviter).channel_invite_email.deliver_later
invitation_sent += 1
end
else
membership = ChatChannelMembership.create(user_id: user.id, chat_channel_id: id, role: membership_role, status: "pending")
if membership.persisted?
- NotifyMailer.channel_invite_email(membership, inviter).deliver_later
+ NotifyMailer.with(membership: membership, inviter: inviter).channel_invite_email.deliver_later
invitation_sent += 1
end
end
diff --git a/app/queries/internal/moderators_query.rb b/app/queries/internal/moderators_query.rb
index 83d5d8141..2b2d68eb9 100644
--- a/app/queries/internal/moderators_query.rb
+++ b/app/queries/internal/moderators_query.rb
@@ -14,7 +14,7 @@ module Internal
role_id_for(:trusted),
).order("users.comments_count DESC")
else
- relation.joins(:users_roles).
+ relation.joins(:roles).
where(users_roles: { role_id: role_id_for(state) })
end
diff --git a/app/services/audit/event/util.rb b/app/services/audit/event/util.rb
index 30f993000..40362ccfe 100644
--- a/app/services/audit/event/util.rb
+++ b/app/services/audit/event/util.rb
@@ -1,3 +1,4 @@
+# NOTE: [Rails 6] Util class is obsolete in Rails 6
module Audit
module Event
class Util
diff --git a/app/services/suggester/articles/boosted.rb b/app/services/suggester/articles/boosted.rb
index 21d7e2c6f..b4eac3f0a 100644
--- a/app/services/suggester/articles/boosted.rb
+++ b/app/services/suggester/articles/boosted.rb
@@ -10,9 +10,10 @@ module Suggester
end
def suggest
- base_articles = Article.includes(:user).
- includes(:organization).
- where.not(id: not_ids, organization_id: nil).
+ base_articles = Article.
+ includes(:user, :organization).
+ where.not(id: not_ids).
+ where.not(organization_id: nil).
cached_tagged_with(tag)
if area == "additional_articles"
diff --git a/bin/setup b/bin/setup
index 6b8f47400..96005270a 100755
--- a/bin/setup
+++ b/bin/setup
@@ -1,5 +1,6 @@
#!/usr/bin/env ruby
require "fileutils"
+include FileUtils
# path to your application root.
APP_ROOT = File.expand_path("..", __dir__)
@@ -8,7 +9,7 @@ def system!(*args)
system(*args) || abort("\n== Command #{args} failed ==")
end
-FileUtils.chdir APP_ROOT do
+chdir APP_ROOT do
# This script is a way to set up or update your development environment automatically.
# This script is idempotent, so that you can run it at anytime and get an expectable outcome.
# Add necessary setup steps to this file.
@@ -26,7 +27,7 @@ FileUtils.chdir APP_ROOT do
puts "\n== Copying sample files =="
unless File.exist?("config/database.yml")
- FileUtils.cp "config/database.yml.sample", "config/database.yml"
+ cp "config/database.yml.sample", "config/database.yml"
end
puts "\n== Preparing Test Elasticsearch =="
diff --git a/config/application.rb b/config/application.rb
index f178615b4..1ff42c4bc 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -20,7 +20,7 @@ Bundler.require(*Rails.groups)
module PracticalDeveloper
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
- config.load_defaults 5.1
+ config.load_defaults 5.1 # NOTE: [Rails 6] we should at least work towards updating this to 5.2
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
@@ -50,24 +50,9 @@ module PracticalDeveloper
# Therefore we disable "per_form_csrf_tokens" for the time being.
config.action_controller.per_form_csrf_tokens = false
- # Enable CORS for API v0
- # (logging is only activated when debug is enabled)
- debug_cors = ENV["DEBUG_CORS"].present? ? true : false
- config.middleware.insert_before 0, Rack::Cors, debug: debug_cors, logger: (-> { Rails.logger }) do
- allow do
- origins do |source, _env|
- source # echo back the client's `Origin` header instead of using `*`
- end
-
- # allowed public APIs
- %w[articles comments listings podcast_episodes tags users videos].each do |resource_name|
- # allow read operations, disallow custom headers (eg. api-key) and enable preflight caching
- # NOTE: Chrome caps preflight caching at 2 hours, Firefox at 24 hours
- # see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age#Directives
- resource "/api/#{resource_name}/*", methods: %i[head get options], headers: [], max_age: 2.hours.to_i
- end
- end
- end
+ # NOTE: [Rails 6]
+ # To improve security, Rails embeds the purpose and expiry metadata inside encrypted or signed cookies value.
+ config.action_dispatch.use_cookies_with_metadata = false
# After-initialize checker to add routes to reserved words
config.after_initialize do
diff --git a/config/boot.rb b/config/boot.rb
index 36d6361a0..988a5ddc4 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,5 +1,4 @@
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
-ENV["COMMAND"] = ARGV[0]
require "bundler/setup" # Set up gems listed in the Gemfile.
require "bootsnap/setup" # Speed up boot time by caching expensive operations.
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 1fc4f2920..4fe162982 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -1,7 +1,4 @@
Rails.application.configure do
- # Verifies that versions and hashed value of the package contents in the project's package.json
- config.webpacker.check_yarn_integrity = false
-
# Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests.
@@ -20,6 +17,10 @@ Rails.application.configure do
# Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
# or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
# config.require_master_key = true
+
+ # Attempt to read encrypted secrets from `config/secrets.yml.enc`.
+ # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or
+ # `config/secrets.yml.key`.
config.read_encrypted_secrets = true
# Disable serving static files from the `/public` folder by default since
@@ -40,7 +41,7 @@ Rails.application.configure do
config.assets.digest = true
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
- # config.action_controller.asset_host = 'http://assets.example.com'
+ config.action_controller.asset_host = ENV["FASTLY_CDN_URL"]
# Specifies the header that your server uses for sending files.
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
@@ -59,14 +60,12 @@ Rails.application.configure do
# Prepend all log lines with the following tags.
config.log_tags = [:request_id]
- # Use a different logger for distributed setups.
- # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
-
# Use a different cache store in production.
- # config.cache_store = :mem_cache_store
-
- # Enable serving of images, stylesheets, and JavaScripts from an asset server.
- config.action_controller.asset_host = ENV["FASTLY_CDN_URL"]
+ # DEV uses the RedisCloud Heroku Add-On which comes with the predefined env variable REDISCLOUD_URL
+ redis_url = ENV["REDISCLOUD_URL"]
+ redis_url ||= ENV["REDIS_URL"]
+ DEFAULT_EXPIRATION = 24.hours.to_i.freeze
+ config.cache_store = :redis_cache_store, { url: redis_url, expires_in: DEFAULT_EXPIRATION }
# Use a real queuing backend for Active Job (and separate queues per environment)
# config.active_job.queue_adapter = :resque
@@ -109,12 +108,6 @@ Rails.application.configure do
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
- # DEV uses the RedisCloud Heroku Add-On which comes with the predefined env variable REDISCLOUD_URL
- redis_url = ENV["REDISCLOUD_URL"]
- redis_url ||= ENV["REDIS_URL"]
- DEFAULT_EXPIRATION = 24.hours.to_i.freeze
- config.cache_store = :redis_cache_store, { url: redis_url, expires_in: DEFAULT_EXPIRATION }
-
config.app_domain = ENV["APP_DOMAIN"]
config.action_mailer.delivery_method = :smtp
diff --git a/config/environments/test.rb b/config/environments/test.rb
index c0441a885..888edd150 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -10,6 +10,9 @@ Rails.application.configure do
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
+ # NOTE: [Rails 6] this is the default store in testing,
+ # as we haven't enabled Rails 6.0 defaults in config/application.rb,
+ # we need to keep this explicit, for now
config.cache_store = :null_store
# Do not eager load code on boot. This avoids loading your whole application
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index eba6c50e9..068a20f42 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -6,7 +6,7 @@ Rails.application.config.assets.version = "1.1"
# Add additional assets to the asset load path.
# Rails.application.config.assets.paths << Emoji.images_path
-# Add Yarn node_modules folder to the asset load path
+# Add Yarn node_modules folder to the asset load path.
Rails.application.config.assets.paths << Rails.root.join("node_modules")
Rails.application.config.assets.paths << Rails.root.join("app/assets/xml")
diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb
index b8c57c3c2..59385cdf3 100644
--- a/config/initializers/backtrace_silencers.rb
+++ b/config/initializers/backtrace_silencers.rb
@@ -1,9 +1,7 @@
# Be sure to restart your server when you modify this file.
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
-# but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
-# You can also remove all the silencers if you're trying to debug a problem
-# that might stem from framework code.
+# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
# Rails.backtrace_cleaner.remove_silencers!
diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb
new file mode 100644
index 000000000..640b7d352
--- /dev/null
+++ b/config/initializers/cors.rb
@@ -0,0 +1,19 @@
+# Be sure to restart your server when you modify this file.
+
+# Enable CORS for API v0 (logging is only activated when debug is enabled)
+debug_cors = ENV["DEBUG_CORS"].present? ? true : false
+Rails.application.config.middleware.insert_before 0, Rack::Cors, debug: debug_cors, logger: (-> { Rails.logger }) do
+ allow do
+ origins do |source, _env|
+ source # echo back the client's `Origin` header instead of using `*`
+ end
+
+ # allowed public APIs
+ %w[articles comments listings podcast_episodes tags users videos].each do |resource_name|
+ # allow read operations, disallow custom headers (eg. api-key) and enable preflight caching
+ # NOTE: Chrome caps preflight caching at 2 hours, Firefox at 24 hours
+ # see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age#Directives
+ resource "/api/#{resource_name}/*", methods: %i[head get options], headers: [], max_age: 2.hours.to_i
+ end
+ end
+end
diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb
new file mode 100644
index 000000000..92240ef5f
--- /dev/null
+++ b/config/initializers/new_framework_defaults_6_0.rb
@@ -0,0 +1,45 @@
+# Be sure to restart your server when you modify this file.
+#
+# This file contains migration options to ease your Rails 6.0 upgrade.
+#
+# Once upgraded flip defaults one by one to migrate to the new default.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
+
+# Don't force requests from old versions of IE to be UTF-8 encoded.
+# Rails.application.config.action_view.default_enforce_utf8 = false
+
+# Embed purpose and expiry metadata inside signed and encrypted
+# cookies for increased security.
+#
+# This option is not backwards compatible with earlier Rails versions.
+# It's best enabled when your entire app is migrated and stable on 6.0.
+# Rails.application.config.action_dispatch.use_cookies_with_metadata = true
+
+# Change the return value of `ActionDispatch::Response#content_type` to Content-Type header without modification.
+# Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false
+
+# Return false instead of self when enqueuing is aborted from a callback.
+# Rails.application.config.active_job.return_false_on_aborted_enqueue = true
+
+# Send Active Storage analysis and purge jobs to dedicated queues.
+# Rails.application.config.active_storage.queues.analysis = :active_storage_analysis
+# Rails.application.config.active_storage.queues.purge = :active_storage_purge
+
+# When assigning to a collection of attachments declared via `has_many_attached`, replace existing
+# attachments instead of appending. Use #attach to add new attachments without replacing existing ones.
+# Rails.application.config.active_storage.replace_on_assign_to_many = true
+
+# Use ActionMailer::MailDeliveryJob for sending parameterized and normal mail.
+#
+# The default delivery jobs (ActionMailer::Parameterized::DeliveryJob, ActionMailer::DeliveryJob),
+# will be removed in Rails 6.1. This setting is not backwards compatible with earlier Rails versions.
+# If you send mail in the background, job workers need to have a copy of
+# MailDeliveryJob to ensure all delivery jobs are processed properly.
+# Make sure your entire app is migrated and stable on 6.0 before using this setting.
+# Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"
+
+# Enable the same cache key to be reused when the object being cached of type
+# `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count)
+# of the relation's cache key into the cache version to support recycling cache key.
+# Rails.application.config.active_record.collection_cache_versioning = true
diff --git a/config/puma.rb b/config/puma.rb
index b25810d4f..1ac17acf2 100644
--- a/config/puma.rb
+++ b/config/puma.rb
@@ -15,6 +15,9 @@ port ENV.fetch("PORT") { 3000 }
#
environment ENV.fetch("RAILS_ENV") { "development" }
+# Specifies the `pidfile` that Puma will use.
+pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
+
# Specifies the number of `workers` to boot in clustered mode.
# Workers are forked webserver processes. If using threads and workers together
# the concurrency of the application would be max `threads` * `workers`.
diff --git a/lib/tasks/app_initializer.rake b/lib/tasks/app_initializer.rake
index 35cfc366c..cebf4f1cd 100644
--- a/lib/tasks/app_initializer.rake
+++ b/lib/tasks/app_initializer.rake
@@ -5,12 +5,7 @@ namespace :app_initializer do
Rake::Task["search:setup"].execute
puts "\n== Preparing database =="
- begin
- Rake::Task["db:migrate"].execute
- rescue ActiveRecord::NoDatabaseError
- puts "\n== Creating and Seeding database =="
- system("bin/rails db:setup")
- end
+ system!('bin/rails db:prepare')
puts "\n== Updating Data =="
Rake::Task["data_updates:enqueue_data_update_worker"].execute
diff --git a/spec/mailers/notify_mailer_spec.rb b/spec/mailers/notify_mailer_spec.rb
index 6f123d10b..489f7d01f 100644
--- a/spec/mailers/notify_mailer_spec.rb
+++ b/spec/mailers/notify_mailer_spec.rb
@@ -485,8 +485,8 @@ RSpec.describe NotifyMailer, type: :mailer do
describe "#channel_invite_email" do
let(:moderator_membership) { create(:chat_channel_membership, user_id: user2.id, role: "mod") }
let(:regular_membership) { create(:chat_channel_membership, user_id: user2.id, role: "member") }
- let(:moderator_email) { described_class.channel_invite_email(moderator_membership, nil) }
- let(:member_email) { described_class.channel_invite_email(regular_membership, user) }
+ let(:moderator_email) { described_class.with(membership: moderator_membership, inviter: nil).channel_invite_email }
+ let(:member_email) { described_class.with(membership: regular_membership, inviter: user).channel_invite_email }
it "renders proper subject" do
expect(moderator_email.subject).to eq("You are invited to the #{moderator_membership.chat_channel.channel_name} channel as moderator.")
diff --git a/spec/mailers/previews/notify_mailer_preview.rb b/spec/mailers/previews/notify_mailer_preview.rb
index 1f67bda00..0b725c038 100644
--- a/spec/mailers/previews/notify_mailer_preview.rb
+++ b/spec/mailers/previews/notify_mailer_preview.rb
@@ -35,7 +35,7 @@ class NotifyMailerPreview < ActionMailer::Preview
def channel_invite_email
user = User.first
membership = ChatChannelMembership.last
- NotifyMailer.channel_invite_email(membership, user)
+ NotifyMailer.with(membership: membership, inviter: user).channel_invite_email
end
def tag_moderator_confirmation_email
diff --git a/spec/models/organization_spec.rb b/spec/models/organization_spec.rb
index 84d7eb933..5855084cb 100644
--- a/spec/models/organization_spec.rb
+++ b/spec/models/organization_spec.rb
@@ -255,14 +255,22 @@ RSpec.describe Organization, type: :model do
it "updates the paths of the organization's articles" do
new_slug = "slug_#{rand(10_000)}"
- organization.update(slug: new_slug)
+
+ sidekiq_perform_enqueued_jobs(only: Organizations::UpdateOrganizationArticlesPathsWorker) do
+ organization.update(slug: new_slug)
+ end
+
article = Article.find_by(organization_id: organization.id)
expect(article.path).to include(new_slug)
end
it "updates article cached_organizations" do
new_slug = "slug_#{rand(10_000)}"
- organization.update(slug: new_slug)
+
+ sidekiq_perform_enqueued_jobs(only: Organizations::UpdateOrganizationArticlesPathsWorker) do
+ organization.update(slug: new_slug)
+ end
+
article = Article.find_by(organization_id: organization.id)
expect(article.cached_organization.slug).to eq(new_slug)
end
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index dc46fd341..70749a4d7 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -143,6 +143,9 @@ RSpec.configure do |config|
stub_request(:any, /dummyimage.com/).
to_return(status: 200, body: "", headers: {})
+
+ stub_request(:post, "http://www.google-analytics.com/collect").
+ to_return(status: 200, body: "", headers: {})
end
OmniAuth.config.test_mode = true
diff --git a/spec/requests/api/v0/articles_spec.rb b/spec/requests/api/v0/articles_spec.rb
index 281686b61..c6465e1cf 100644
--- a/spec/requests/api/v0/articles_spec.rb
+++ b/spec/requests/api/v0/articles_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe "Api::V0::Articles", type: :request do
context "without params" do
it "returns json response" do
get api_articles_path
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
it "returns nothing if params state=all is not found" do
@@ -371,20 +371,20 @@ RSpec.describe "Api::V0::Articles", type: :request do
headers = { "authorization" => "Bearer #{access_token.token}", "content-type" => "application/json" }
get me_api_articles_path, headers: headers
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
expect(response).to have_http_status(:ok)
end
it "returns proper response specification" do
get me_api_articles_path, params: { access_token: access_token.token }
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
expect(response).to have_http_status(:ok)
end
it "returns success when requesting publiched articles with public token" do
public_token = create(:doorkeeper_access_token, resource_owner: user, scopes: "public")
get me_api_articles_path(status: :published), params: { access_token: public_token.token }
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
expect(response).to have_http_status(:ok)
end
diff --git a/spec/requests/api/v0/listings_spec.rb b/spec/requests/api/v0/listings_spec.rb
index 77331a28b..d29913b56 100644
--- a/spec/requests/api/v0/listings_spec.rb
+++ b/spec/requests/api/v0/listings_spec.rb
@@ -59,7 +59,8 @@ RSpec.describe "Api::V0::Listings", type: :request do
it "returns json response and ok status" do
get api_listings_path
- expect(response.content_type).to eq("application/json")
+
+ expect(response.media_type).to eq("application/json")
expect(response).to have_http_status(:ok)
end
diff --git a/spec/requests/api/v0/podcasts_episodes_spec.rb b/spec/requests/api/v0/podcasts_episodes_spec.rb
index 4306bb08c..32f393fe0 100644
--- a/spec/requests/api/v0/podcasts_episodes_spec.rb
+++ b/spec/requests/api/v0/podcasts_episodes_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe "Api::V0::PodcastEpisodes", type: :request do
it "returns json response" do
get api_podcast_episodes_path
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
it "does not return unreachable podcasts" do
diff --git a/spec/requests/api/v0/webhooks_spec.rb b/spec/requests/api/v0/webhooks_spec.rb
index f2de6c4fd..1d3ff9641 100644
--- a/spec/requests/api/v0/webhooks_spec.rb
+++ b/spec/requests/api/v0/webhooks_spec.rb
@@ -162,7 +162,7 @@ RSpec.describe "Api::V0::Webhooks", type: :request do
it "returns :created and json response on success" do
post api_webhooks_path, params: { webhook_endpoint: webhook_params }
expect(response).to have_http_status(:created)
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
json = JSON.parse(response.body)
expect(json["target_url"]).to eq(webhook_params[:target_url])
end
@@ -205,7 +205,7 @@ RSpec.describe "Api::V0::Webhooks", type: :request do
it "renders index successfully" do
get api_webhooks_path, params: { access_token: access_token.token }
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
expect(response).to have_http_status(:ok)
end
diff --git a/spec/requests/articles/articles_spec.rb b/spec/requests/articles/articles_spec.rb
index 9de5fde3b..3fc2843c4 100644
--- a/spec/requests/articles/articles_spec.rb
+++ b/spec/requests/articles/articles_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe "Articles", type: :request do
create(:article, featured: true)
get "/feed"
expect(response.status).to eq(200)
- expect(response.content_type).to eq("application/rss+xml")
+ expect(response.media_type).to eq("application/rss+xml")
end
it "contains the full app URL" do
diff --git a/spec/requests/buffered_articles_spec.rb b/spec/requests/buffered_articles_spec.rb
index cc44cd465..9b8623936 100644
--- a/spec/requests/buffered_articles_spec.rb
+++ b/spec/requests/buffered_articles_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe "BufferedArticles", type: :request do
it "responds with json" do
get buffered_articles_path
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
it "responds with at least one url" do
diff --git a/spec/requests/chat_channel_memberships_spec.rb b/spec/requests/chat_channel_memberships_spec.rb
index 12587ba3c..f245e8a89 100644
--- a/spec/requests/chat_channel_memberships_spec.rb
+++ b/spec/requests/chat_channel_memberships_spec.rb
@@ -380,7 +380,7 @@ RSpec.describe "ChatChannelMemberships", type: :request do
end
it "returns in json" do
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
end
@@ -392,7 +392,7 @@ RSpec.describe "ChatChannelMemberships", type: :request do
end
it "returns in json" do
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
end
end
diff --git a/spec/requests/comments_spec.rb b/spec/requests/comments_spec.rb
index ea1c07d2f..2c01e5dbe 100644
--- a/spec/requests/comments_spec.rb
+++ b/spec/requests/comments_spec.rb
@@ -286,7 +286,7 @@ RSpec.describe "Comments", type: :request do
end
it "returns json" do
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
end
end
diff --git a/spec/requests/editor_spec.rb b/spec/requests/editor_spec.rb
index 035aa784b..84b9f4bf4 100644
--- a/spec/requests/editor_spec.rb
+++ b/spec/requests/editor_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe "Editor", type: :request do
it "returns json" do
sign_in user
post "/articles/preview", headers: headers
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
end
end
diff --git a/spec/requests/github_repos_spec.rb b/spec/requests/github_repos_spec.rb
index 7024f5ec3..4b010d052 100644
--- a/spec/requests/github_repos_spec.rb
+++ b/spec/requests/github_repos_spec.rb
@@ -94,7 +94,7 @@ RSpec.describe "GithubRepos", type: :request do
post update_or_create_github_repos_path(params), headers: headers
expect(response).to have_http_status(:ok)
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
it "returns 404 if no repository is found" do
diff --git a/spec/requests/image_uploads_spec.rb b/spec/requests/image_uploads_spec.rb
index 020c31b82..ecf056426 100644
--- a/spec/requests/image_uploads_spec.rb
+++ b/spec/requests/image_uploads_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe "ImageUploads", type: :request do
it "returns json" do
post "/image_uploads", headers: headers
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
it "provides a link" do
diff --git a/spec/requests/messages_spec.rb b/spec/requests/messages_spec.rb
index 893c62bd9..fcee6c749 100644
--- a/spec/requests/messages_spec.rb
+++ b/spec/requests/messages_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe "Messages", type: :request do
end
it "returns in json" do
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
end
@@ -68,7 +68,7 @@ RSpec.describe "Messages", type: :request do
end
it "returns in json" do
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
end
end
@@ -100,7 +100,7 @@ RSpec.describe "Messages", type: :request do
end
it "returns in json" do
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
end
end
end
diff --git a/spec/requests/notification_subscriptions_spec.rb b/spec/requests/notification_subscriptions_spec.rb
index 2322523c7..feb8a5f4f 100644
--- a/spec/requests/notification_subscriptions_spec.rb
+++ b/spec/requests/notification_subscriptions_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe "NotificationSubscriptions", type: :request do
it "returns a JSON response" do
get "/notification_subscriptions/Article/#{article.id}",
headers: headers
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
end
it "returns the correct subscription boolean as JSON" do
@@ -43,7 +43,7 @@ RSpec.describe "NotificationSubscriptions", type: :request do
it "returns a JSON response 'null' if there is no logged in user" do
get "/notification_subscriptions/Article/#{article.id}", headers: headers
expect(response.body).to eq "null"
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
end
end
diff --git a/spec/requests/page_views_spec.rb b/spec/requests/page_views_spec.rb
index 2a7e8a371..06a3563c2 100644
--- a/spec/requests/page_views_spec.rb
+++ b/spec/requests/page_views_spec.rb
@@ -107,7 +107,9 @@ RSpec.describe "PageViews", type: :request do
it "updates a new page view time on page by 15" do
post "/page_views", params: { article_id: article.id }
+
put "/page_views/#{article.id}"
+
expect(PageView.last.time_tracked_in_seconds).to eq(30)
end
diff --git a/spec/requests/response_templates_spec.rb b/spec/requests/response_templates_spec.rb
index f34846179..e2ce2ae65 100644
--- a/spec/requests/response_templates_spec.rb
+++ b/spec/requests/response_templates_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe "ResponseTemplate", type: :request do
it "responds with JSON" do
create(:response_template, user: user, type_of: "personal_comment")
get response_templates_path, headers: { HTTP_ACCEPT: "application/json" }
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
end
it "raises RoutingError if the format is not JSON" do
@@ -61,7 +61,7 @@ RSpec.describe "ResponseTemplate", type: :request do
it "responds with JSON" do
create(:response_template, user: moderator, type_of: "personal_comment")
get response_templates_path, params: { type_of: "mod_comment" }, headers: { HTTP_ACCEPT: "application/json" }
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
end
it "returns the correct amount of moderator response templates" do
diff --git a/spec/requests/sitemaps_spec.rb b/spec/requests/sitemaps_spec.rb
index 714fc0fc2..b2d835c86 100644
--- a/spec/requests/sitemaps_spec.rb
+++ b/spec/requests/sitemaps_spec.rb
@@ -4,7 +4,7 @@ RSpec.describe "Sitemaps", type: :request do
describe "GET /sitemap-*" do
it "renders xml file" do
get "/sitemap-Mar-2011.xml"
- expect(response.content_type).to eq("application/xml")
+ expect(response.media_type).to eq("application/xml")
end
it "renders not found if incorrect input" do
@@ -33,7 +33,7 @@ RSpec.describe "Sitemaps", type: :request do
expect(response.body).to include("#{ApplicationConfig['APP_PROTOCOL']}#{ApplicationConfig['APP_DOMAIN']}#{article.path}")
expect(response.body).to include("#{article.last_comment_at.strftime('%F')}")
expect(response.body).not_to include(Article.last.path)
- expect(response.content_type).to eq("application/xml")
+ expect(response.media_type).to eq("application/xml")
end
end
end
diff --git a/spec/requests/stories/feeds_spec.rb b/spec/requests/stories/feeds_spec.rb
index 888450660..b4bcea67d 100644
--- a/spec/requests/stories/feeds_spec.rb
+++ b/spec/requests/stories/feeds_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe "Stories::Feeds", type: :request do
it "renders article list as json" do
get "/stories/feed", headers: headers
- expect(response.content_type).to eq("application/json")
+ expect(response.media_type).to eq("application/json")
expect(response_article).to include(
"id" => article.id,
"title" => title,
diff --git a/spec/requests/user_blocks_spec.rb b/spec/requests/user_blocks_spec.rb
index 07445cc02..330379449 100644
--- a/spec/requests/user_blocks_spec.rb
+++ b/spec/requests/user_blocks_spec.rb
@@ -10,21 +10,21 @@ RSpec.describe "UserBlock", type: :request do
it "rejects when not-logged-in" do
sign_out(blocker)
get "/user_blocks/#{blocked.id}"
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
expect(response.status).to eq 401
expect(response.parsed_body["result"]).to eq "not-logged-in"
end
it "returns 'not-blocking' when the user is not blocked" do
get "/user_blocks/#{blocked.id}"
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
expect(response.parsed_body["result"]).to eq "not-blocking"
end
it "returns 'blocking' when blocking" do
create(:user_block, blocker: blocker, blocked: blocked)
get "/user_blocks/#{blocked.id}"
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
expect(response.parsed_body["result"]).to eq "blocking"
end
end
@@ -33,7 +33,7 @@ RSpec.describe "UserBlock", type: :request do
it "renders 'not-logged-in' when not logged in" do
sign_out blocker
post "/user_blocks", params: { user_block: { blocked_id: blocked.id } }
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
expect(response.status).to eq 401
expect(response.parsed_body["result"]).to eq "not-logged-in"
end
@@ -47,7 +47,7 @@ RSpec.describe "UserBlock", type: :request do
it "returns a JSON response with blocked" do
post "/user_blocks", params: { user_block: { blocked_id: blocked.id } }
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
expect(response.parsed_body["result"]).to eq "blocked"
end
@@ -69,7 +69,7 @@ RSpec.describe "UserBlock", type: :request do
it "renders 'not-logged-in' when not logged in" do
sign_out blocker
delete "/user_blocks/#{blocked.id}", params: { user_block: { blocked_id: blocked.id } }
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
expect(response.status).to eq 401
expect(response.parsed_body["result"]).to eq "not-logged-in"
end
@@ -78,7 +78,7 @@ RSpec.describe "UserBlock", type: :request do
UserBlock.delete_all
blocker.update(blocking_others_count: 0)
delete "/user_blocks/#{blocked.id}", params: { user_block: { blocked_id: blocked.id } }
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
expect(response.parsed_body["result"]).to eq "not-blocking-anyone"
end
diff --git a/spec/support/api_analytics_shared_examples.rb b/spec/support/api_analytics_shared_examples.rb
index ee342f910..8f4bc7602 100644
--- a/spec/support/api_analytics_shared_examples.rb
+++ b/spec/support/api_analytics_shared_examples.rb
@@ -38,7 +38,7 @@ RSpec.shared_examples "GET /api/analytics/:endpoint authorization examples" do |
before { get "/api/analytics/#{endpoint}?#{params}", headers: { "api-key" => pro_api_token.secret } }
it "renders JSON as the content type" do
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
end
end
@@ -63,7 +63,7 @@ RSpec.shared_examples "GET /api/analytics/:endpoint authorization examples" do |
end
it "renders JSON as the content type" do
- expect(response.content_type).to eq "application/json"
+ expect(response.media_type).to eq "application/json"
end
end
diff --git a/spec/system/notifications/notifications_page_spec.rb b/spec/system/notifications/notifications_page_spec.rb
index 632a5625a..aa568faa1 100644
--- a/spec/system/notifications/notifications_page_spec.rb
+++ b/spec/system/notifications/notifications_page_spec.rb
@@ -10,8 +10,9 @@ RSpec.describe "Notifications page", type: :system, js: true do
fill_in "comment-textarea-for-#{id}", with: "thanks i guess"
click_button("SUBMIT")
expect(page).to have_css("div.reply-sent-notice")
+
click_link("Check it out")
- expect(page).to have_text(/thanks i guess/)
+ expect(page).to have_text("thanks i guess")
end
it "shows 1 notification and disappear after clicking it" do
@@ -33,10 +34,14 @@ RSpec.describe "Notifications page", type: :system, js: true do
end
visit "/notifications"
+
expect(page).to have_css("div.single-notification")
click_button("heart")
+
expect(page).to have_css("img.reacted-emoji")
+
click_link("Reply")
+
validate_reply(leslie.comments.first.id)
end
@@ -53,7 +58,7 @@ RSpec.describe "Notifications page", type: :system, js: true do
before do
dev_user = create(:user)
allow(User).to receive(:dev_account).and_return(dev_user)
- alex.add_role :trusted
+ alex.add_role(:trusted)
end
def interact_with_each_emojis
@@ -67,12 +72,16 @@ RSpec.describe "Notifications page", type: :system, js: true do
it "allows trusted user to moderate content" do
article = create(:article, user: alex)
- comment = nil
- sidekiq_perform_enqueued_jobs { comment = create(:comment, commentable: article, user: leslie) }
+ comment = create(:comment, commentable: article, user: leslie)
+
+ sidekiq_perform_enqueued_jobs
+
visit "/notifications"
expect(page).to have_css("div.single-notification")
+
interact_with_each_emojis
click_link("Reply")
+
validate_reply(comment.id)
end
end
diff --git a/vendor/cache/actioncable-5.2.4.3.gem b/vendor/cache/actioncable-5.2.4.3.gem
deleted file mode 100644
index 53e9596b6..000000000
Binary files a/vendor/cache/actioncable-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/actioncable-6.0.3.1.gem b/vendor/cache/actioncable-6.0.3.1.gem
new file mode 100644
index 000000000..66b16f8d0
Binary files /dev/null and b/vendor/cache/actioncable-6.0.3.1.gem differ
diff --git a/vendor/cache/actionmailbox-6.0.3.1.gem b/vendor/cache/actionmailbox-6.0.3.1.gem
new file mode 100644
index 000000000..b727a4361
Binary files /dev/null and b/vendor/cache/actionmailbox-6.0.3.1.gem differ
diff --git a/vendor/cache/actionmailer-5.2.4.3.gem b/vendor/cache/actionmailer-5.2.4.3.gem
deleted file mode 100644
index ee6d27fb4..000000000
Binary files a/vendor/cache/actionmailer-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/actionmailer-6.0.3.1.gem b/vendor/cache/actionmailer-6.0.3.1.gem
new file mode 100644
index 000000000..bbe9bb3f1
Binary files /dev/null and b/vendor/cache/actionmailer-6.0.3.1.gem differ
diff --git a/vendor/cache/actionpack-5.2.4.3.gem b/vendor/cache/actionpack-5.2.4.3.gem
deleted file mode 100644
index 24c8250f5..000000000
Binary files a/vendor/cache/actionpack-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/actionpack-6.0.3.1.gem b/vendor/cache/actionpack-6.0.3.1.gem
new file mode 100644
index 000000000..e187a5dd7
Binary files /dev/null and b/vendor/cache/actionpack-6.0.3.1.gem differ
diff --git a/vendor/cache/actiontext-6.0.3.1.gem b/vendor/cache/actiontext-6.0.3.1.gem
new file mode 100644
index 000000000..0b18092dd
Binary files /dev/null and b/vendor/cache/actiontext-6.0.3.1.gem differ
diff --git a/vendor/cache/actionview-5.2.4.3.gem b/vendor/cache/actionview-5.2.4.3.gem
deleted file mode 100644
index 51db0d345..000000000
Binary files a/vendor/cache/actionview-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/actionview-6.0.3.1.gem b/vendor/cache/actionview-6.0.3.1.gem
new file mode 100644
index 000000000..7485dae48
Binary files /dev/null and b/vendor/cache/actionview-6.0.3.1.gem differ
diff --git a/vendor/cache/activejob-5.2.4.3.gem b/vendor/cache/activejob-5.2.4.3.gem
deleted file mode 100644
index 49dec673f..000000000
Binary files a/vendor/cache/activejob-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/activejob-6.0.3.1.gem b/vendor/cache/activejob-6.0.3.1.gem
new file mode 100644
index 000000000..4aa0b8983
Binary files /dev/null and b/vendor/cache/activejob-6.0.3.1.gem differ
diff --git a/vendor/cache/activemodel-5.2.4.3.gem b/vendor/cache/activemodel-5.2.4.3.gem
deleted file mode 100644
index a223197a2..000000000
Binary files a/vendor/cache/activemodel-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/activemodel-6.0.3.1.gem b/vendor/cache/activemodel-6.0.3.1.gem
new file mode 100644
index 000000000..9cedfb032
Binary files /dev/null and b/vendor/cache/activemodel-6.0.3.1.gem differ
diff --git a/vendor/cache/activerecord-5.2.4.3.gem b/vendor/cache/activerecord-5.2.4.3.gem
deleted file mode 100644
index 143e75ab2..000000000
Binary files a/vendor/cache/activerecord-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/activerecord-6.0.3.1.gem b/vendor/cache/activerecord-6.0.3.1.gem
new file mode 100644
index 000000000..ff3c1be2d
Binary files /dev/null and b/vendor/cache/activerecord-6.0.3.1.gem differ
diff --git a/vendor/cache/activestorage-5.2.4.3.gem b/vendor/cache/activestorage-5.2.4.3.gem
deleted file mode 100644
index b7f115d12..000000000
Binary files a/vendor/cache/activestorage-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/activestorage-6.0.3.1.gem b/vendor/cache/activestorage-6.0.3.1.gem
new file mode 100644
index 000000000..d67e0a37c
Binary files /dev/null and b/vendor/cache/activestorage-6.0.3.1.gem differ
diff --git a/vendor/cache/activesupport-5.2.4.3.gem b/vendor/cache/activesupport-5.2.4.3.gem
deleted file mode 100644
index c2ec837ad..000000000
Binary files a/vendor/cache/activesupport-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/activesupport-6.0.3.1.gem b/vendor/cache/activesupport-6.0.3.1.gem
new file mode 100644
index 000000000..c9fdab7db
Binary files /dev/null and b/vendor/cache/activesupport-6.0.3.1.gem differ
diff --git a/vendor/cache/acts_as_follower-288690cd99bc/acts_as_follower.gemspec b/vendor/cache/acts_as_follower-288690cd99bc/acts_as_follower.gemspec
index bf1c50a6b..f82f4866d 100644
--- a/vendor/cache/acts_as_follower-288690cd99bc/acts_as_follower.gemspec
+++ b/vendor/cache/acts_as_follower-288690cd99bc/acts_as_follower.gemspec
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
s.require_paths = ["lib".freeze]
s.authors = ["Tom Cocca".freeze]
- s.date = "2020-05-26"
+ s.date = "2020-06-01"
s.description = "acts_as_follower is a Rubygem to allow any model to follow any other model. This is accomplished through a double polymorphic relationship on the Follow model. There is also built in support for blocking/un-blocking follow records. Main uses would be for Users to follow other Users or for Users to follow Books, etc\u2026 (Basically, to develop the type of follow system that GitHub has)".freeze
s.email = ["tom dot cocca at gmail dot com".freeze]
s.files = [".gitignore".freeze, ".travis.yml".freeze, "Gemfile".freeze, "MIT-LICENSE".freeze, "README.rdoc".freeze, "Rakefile".freeze, "acts_as_follower.gemspec".freeze, "init.rb".freeze, "lib/acts_as_follower.rb".freeze, "lib/acts_as_follower/follow_scopes.rb".freeze, "lib/acts_as_follower/followable.rb".freeze, "lib/acts_as_follower/follower.rb".freeze, "lib/acts_as_follower/follower_lib.rb".freeze, "lib/acts_as_follower/railtie.rb".freeze, "lib/acts_as_follower/version.rb".freeze, "lib/generators/USAGE".freeze, "lib/generators/acts_as_follower_generator.rb".freeze, "lib/generators/templates/migration.rb".freeze, "lib/generators/templates/model.rb".freeze, "test/README".freeze, "test/acts_as_followable_test.rb".freeze, "test/acts_as_follower_test.rb".freeze, "test/dummy30/Gemfile".freeze, "test/dummy30/Rakefile".freeze, "test/dummy30/app/models/application_record.rb".freeze, "test/dummy30/app/models/band.rb".freeze, "test/dummy30/app/models/band/punk.rb".freeze, "test/dummy30/app/models/band/punk/pop_punk.rb".freeze, "test/dummy30/app/models/custom_record.rb".freeze, "test/dummy30/app/models/some.rb".freeze, "test/dummy30/app/models/user.rb".freeze, "test/dummy30/config.ru".freeze, "test/dummy30/config/application.rb".freeze, "test/dummy30/config/boot.rb".freeze, "test/dummy30/config/database.yml".freeze, "test/dummy30/config/environment.rb".freeze, "test/dummy30/config/environments/development.rb".freeze, "test/dummy30/config/environments/test.rb".freeze, "test/dummy30/config/initializers/backtrace_silencers.rb".freeze, "test/dummy30/config/initializers/inflections.rb".freeze, "test/dummy30/config/initializers/secret_token.rb".freeze, "test/dummy30/config/initializers/session_store.rb".freeze, "test/dummy30/config/locales/en.yml".freeze, "test/dummy30/config/routes.rb".freeze, "test/factories/bands.rb".freeze, "test/factories/somes.rb".freeze, "test/factories/users.rb".freeze, "test/follow_test.rb".freeze, "test/schema.rb".freeze, "test/test_helper.rb".freeze]
diff --git a/vendor/cache/arel-9.0.0.gem b/vendor/cache/arel-9.0.0.gem
deleted file mode 100644
index a2c51af40..000000000
Binary files a/vendor/cache/arel-9.0.0.gem and /dev/null differ
diff --git a/vendor/cache/rails-5.2.4.3.gem b/vendor/cache/rails-5.2.4.3.gem
deleted file mode 100644
index 6831ba9fc..000000000
Binary files a/vendor/cache/rails-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/rails-6.0.3.1.gem b/vendor/cache/rails-6.0.3.1.gem
new file mode 100644
index 000000000..a1718f83e
Binary files /dev/null and b/vendor/cache/rails-6.0.3.1.gem differ
diff --git a/vendor/cache/railties-5.2.4.3.gem b/vendor/cache/railties-5.2.4.3.gem
deleted file mode 100644
index 7c8dc53fd..000000000
Binary files a/vendor/cache/railties-5.2.4.3.gem and /dev/null differ
diff --git a/vendor/cache/railties-6.0.3.1.gem b/vendor/cache/railties-6.0.3.1.gem
new file mode 100644
index 000000000..9a9dbb4e8
Binary files /dev/null and b/vendor/cache/railties-6.0.3.1.gem differ
diff --git a/vendor/cache/timber-rails-1.0.1.gem b/vendor/cache/timber-rails-1.0.1.gem
deleted file mode 100644
index 86f58abd2..000000000
Binary files a/vendor/cache/timber-rails-1.0.1.gem and /dev/null differ
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/.bundlecache b/vendor/cache/timber-ruby-rails-250326b0926d/.bundlecache
new file mode 100644
index 000000000..e69de29bb
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/.gitignore b/vendor/cache/timber-ruby-rails-250326b0926d/.gitignore
new file mode 100644
index 000000000..537ede7c2
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/.gitignore
@@ -0,0 +1,14 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+
+# rspec failure tracking
+.rspec_status
+
+# Ignore gemset
+/.gem
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/.rspec b/vendor/cache/timber-ruby-rails-250326b0926d/.rspec
new file mode 100644
index 000000000..34c5164d9
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/.rspec
@@ -0,0 +1,3 @@
+--format documentation
+--color
+--require spec_helper
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/.travis.yml b/vendor/cache/timber-ruby-rails-250326b0926d/.travis.yml
new file mode 100644
index 000000000..ce778226b
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/.travis.yml
@@ -0,0 +1,68 @@
+sudo: false
+language: ruby
+cache: bundler
+rvm:
+- 1.9.3
+- 2.2.10
+- 2.3.8
+- 2.4.7
+- 2.5.6
+- 2.6.4
+- jruby-9.2.8.0
+before_install: gem install bundler -v 1.17.3
+gemfile:
+- gemfiles/rails-3.2.gemfile
+- gemfiles/rails-4.0.gemfile
+- gemfiles/rails-4.1.gemfile
+- gemfiles/rails-4.2.gemfile
+- gemfiles/rails-5.0.gemfile
+- gemfiles/rails-5.1.gemfile
+- gemfiles/rails-5.2.gemfile
+- gemfiles/rails-6.0.gemfile
+- gemfiles/rails-edge.gemfile
+env:
+ global: RAILS_ENV=test
+before_script:
+- echo $BUNDLE_GEMFILE
+- bundle install
+script:
+ - bundle exec rspec --format documentation
+matrix:
+ fast_finish: true
+ exclude:
+ - rvm: 1.9.3
+ - gemfile: gemfiles/rails-edge.gemfile
+ - rvm: 2.2.10
+ gemfile: gemfiles/rails-6.0.gemfile
+ - rvm: 2.3.8
+ gemfile: gemfiles/rails-6.0.gemfile
+ - rvm: 2.4.7
+ gemfile: gemfiles/rails-4.0.gemfile
+ - rvm: 2.4.7
+ gemfile: gemfiles/rails-4.1.gemfile
+ - rvm: 2.4.7
+ gemfile: gemfiles/rails-6.0.gemfile
+ - rvm: 2.5.6
+ gemfile: gemfiles/rails-3.2.gemfile
+ - rvm: 2.5.6
+ gemfile: gemfiles/rails-4.0.gemfile
+ - rvm: 2.5.6
+ gemfile: gemfiles/rails-4.1.gemfile
+ - rvm: 2.6.4
+ gemfile: gemfiles/rails-4.0.gemfile
+ - rvm: 2.6.4
+ gemfile: gemfiles/rails-4.1.gemfile
+ include:
+ - rvm: 2.5.6
+ gemfile: gemfiles/rails-edge.gemfile
+ - rvm: 1.9.3
+ gemfile: gemfiles/rails-3.2.gemfile
+ allow_failures:
+ - rvm: 1.9.3 # bundler wont install the gems
+ - gemfile: gemfiles/rails-edge.gemfile
+ - rvm: jruby-9.2.8.0
+notifications:
+ email: false
+ slack:
+ rooms:
+ secure: F4BGVLUnaDqJ3YXfuIwx+m6047E8YstCUXs33Tfcs7SUlSuOSChuXqvCfVtnfNy2muF7xgB6VRL3xpFIRm7qNStqGUWCQJXmKq2OEgq1DYGkhAVle4d/LBtVcfBgeLelsoi+1TI9MrUtpZDHPl0li3PLoC+dq7rzSuhrxQ9EOhZlZGVn6LTeVcgNw6cLNzHSWJJ8zpYWLjBWUXgJ75MQvo5qaNbQxyfzm7GzEgRNfSzabFBwpKwB1Tog9X9TKTtPrn30O9Ur9+wmTu6EnwaDWZjaTK6I+AbxE8huIfUGvSrq1aV2JaDIra6zHEQ+d4j0oRYutgFM4YfyN9124MbPE2yH/5lXNQHMpUOsP0bl2U+KGDzq/V5APyrZ6irsvwGYpo3fSXrW8nDIAK4Mh8KB+Ta0zN5H8PmIRK76wJ+wG2zAtrfl+ailxMrdpK6J04fl3pCBuO6eW+AKEJ7Wfi5GiE7a9lk/YewAeDHyyLSnUNFIP0/iFAbTtRh5denCk0ZUS1XyfZNQuFoku7jk5lpe41SNItqOO0jv/jXPF+wensNa2UgMBIP0XkRw55LKn9eY0MKm9P+zp9ePaXs0T0Ttv4e0T4Jxrgf5QBynefgHwAsOI1nHr7GhlPaFQ6u8iNmjNYLB9v1JZMlO08LkytzZFpUuJoHbYYoBaRtUtEosBHg=
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/Gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/Gemfile
new file mode 100644
index 000000000..b4e2a20bb
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gemspec
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/LICENSE.md b/vendor/cache/timber-ruby-rails-250326b0926d/LICENSE.md
new file mode 100644
index 000000000..c1a72ce15
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/LICENSE.md
@@ -0,0 +1,15 @@
+# License
+
+Copyright (c) 2019, Timber Technologies, Inc.
+
+Permission to use, copy, modify, and/or distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright notice
+and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/README.md b/vendor/cache/timber-ruby-rails-250326b0926d/README.md
new file mode 100644
index 000000000..a3ab4c225
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/README.md
@@ -0,0 +1,14 @@
+# 🌲 Timber Integration For Rails
+
+[](LICENSE.md)
+[](http://www.rubydoc.info/github/timberio/timber-ruby-rails)
+[](https://travis-ci.org/timberio/timber-ruby-rails)
+
+This library integrates the
+[`timber` Ruby library](https://github.com/timberio/timber-ruby) with the
+[rails](https://github.com/rails/rails) framework, turning your rails logs into
+rich structured events.
+
+- **Sign-up: [https://app.timber.io](https://app.timber.io)**
+- **Documentation:
+ [https://docs.timber.io/setup/languages/ruby/integrations/rails](https://docs.timber.io/setup/languages/ruby/integrations/rails)**
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/Rakefile b/vendor/cache/timber-ruby-rails-250326b0926d/Rakefile
new file mode 100644
index 000000000..b7e9ed549
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/Rakefile
@@ -0,0 +1,6 @@
+require "bundler/gem_tasks"
+require "rspec/core/rake_task"
+
+RSpec::Core::RakeTask.new(:spec)
+
+task :default => :spec
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/bin/console b/vendor/cache/timber-ruby-rails-250326b0926d/bin/console
new file mode 100755
index 000000000..8bbc5f456
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/bin/console
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+
+require "bundler/setup"
+require "timber-rails"
+
+# You can add fixtures and/or initialization code here to make experimenting
+# with your gem easier. You can also use a different console, if you like.
+
+# (If you use this, don't forget to add pry to your Gemfile!)
+# require "pry"
+# Pry.start
+
+require "irb"
+IRB.start(__FILE__)
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/bin/setup b/vendor/cache/timber-ruby-rails-250326b0926d/bin/setup
new file mode 100755
index 000000000..dce67d860
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/bin/setup
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+set -vx
+
+bundle install
+
+# Do any other automated setup that you need to do here
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.0.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.0.gemfile
new file mode 100644
index 000000000..22194130c
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.0.gemfile
@@ -0,0 +1,8 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 3.0.0'
+
+gem 'timber',
+gem 'timber-rack'
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.1.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.1.gemfile
new file mode 100644
index 000000000..ed455abc9
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.1.gemfile
@@ -0,0 +1,8 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 3.1.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.2.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.2.gemfile
new file mode 100644
index 000000000..74111c421
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-3.2.gemfile
@@ -0,0 +1,8 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 3.2.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.0.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.0.gemfile
new file mode 100644
index 000000000..7b6f29647
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.0.gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 4.0.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+if RUBY_PLATFORM == "java"
+ gem 'mime-types', '2.6.2'
+end
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.1.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.1.gemfile
new file mode 100644
index 000000000..2735403bc
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.1.gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 4.1.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+if RUBY_PLATFORM == "java"
+ gem 'mime-types', '2.6.2'
+end
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.2.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.2.gemfile
new file mode 100644
index 000000000..a5365c0f1
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-4.2.gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 4.2.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+if RUBY_PLATFORM == "java"
+ gem 'mime-types', '2.6.2'
+end
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.0.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.0.gemfile
new file mode 100644
index 000000000..c3af66b33
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.0.gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 5.0.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+if RUBY_PLATFORM == "java"
+ gem 'mime-types', '2.6.2'
+end
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.1.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.1.gemfile
new file mode 100644
index 000000000..d7af51d02
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.1.gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 5.1.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+if RUBY_PLATFORM == "java"
+ gem 'mime-types', '2.6.2'
+end
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.2.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.2.gemfile
new file mode 100644
index 000000000..2a441bc33
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-5.2.gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 5.2.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+if RUBY_PLATFORM == "java"
+ gem 'mime-types', '2.6.2'
+end
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-6.0.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-6.0.gemfile
new file mode 100644
index 000000000..5361b7143
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-6.0.gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rails', '~> 6.0.0'
+
+gem 'timber'
+gem 'timber-rack'
+
+if RUBY_PLATFORM == "java"
+ gem 'mime-types', '2.6.2'
+end
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-edge.gemfile b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-edge.gemfile
new file mode 100644
index 000000000..52727186a
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/gemfiles/rails-edge.gemfile
@@ -0,0 +1,10 @@
+source 'https://rubygems.org'
+
+gem 'rack', git: 'https://github.com/rack/rack', branch: 'master'
+gem 'arel', git: 'https://github.com/rails/arel', branch: 'master'
+gem 'rails', git: 'https://github.com/rails/rails', branch: 'master'
+
+gem 'timber'
+gem 'timber-rack'
+
+gemspec :path => '../'
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails.rb
new file mode 100644
index 000000000..450cd5865
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails.rb
@@ -0,0 +1,65 @@
+require "timber-rails/overrides"
+
+require "timber"
+require "rails"
+require "timber-rails/active_support_log_subscriber"
+require "timber-rails/config"
+require "timber-rails/railtie"
+
+require "timber-rack/http_context"
+require "timber-rack/http_events"
+require "timber-rack/user_context"
+require "timber-rails/session_context"
+require "timber-rails/rack_logger"
+require "timber-rails/error_event"
+
+require "timber-rails/action_controller"
+require "timber-rails/action_dispatch"
+require "timber-rails/action_view"
+require "timber-rails/active_record"
+
+
+require "timber-rails/logger"
+
+module Timber
+ module Integrations
+ # Module for holding *all* Rails integrations. This module does *not*
+ # extend {Integration} because it's dependent on {Rack::HTTPEvents}. This
+ # module simply disables the default HTTP request logging.
+ module Rails
+ def self.enabled?
+ Timber::Integrations::Rack::HTTPEvents.enabled?
+ end
+
+ def self.integrate!
+ return false if !enabled?
+
+ ActionController.integrate!
+ ActionDispatch.integrate!
+ ActionView.integrate!
+ ActiveRecord.integrate!
+ RackLogger.integrate!
+ end
+
+ def self.enabled=(value)
+ Timber::Integrations::Rails::ErrorEvent.enabled = value
+ Timber::Integrations::Rack::HTTPContext.enabled = value
+ Timber::Integrations::Rack::HTTPEvents.enabled = value
+ Timber::Integrations::Rack::UserContext.enabled = value
+ SessionContext.enabled = value
+
+ ActionController.enabled = value
+ ActionView.enabled = value
+ ActiveRecord.enabled = value
+ end
+
+ # All enabled middlewares. The order is relevant. Middlewares that set
+ # context are added first so that context is included in subsequent log lines.
+ def self.middlewares
+ @middlewares ||= [Timber::Integrations::Rack::HTTPContext, SessionContext, Timber::Integrations::Rack::UserContext,
+ Timber::Integrations::Rack::HTTPEvents, Timber::Integrations::Rails::ErrorEvent].select(&:enabled?)
+ end
+ end
+ end
+end
+
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller.rb
new file mode 100644
index 000000000..75ea0a21f
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller.rb
@@ -0,0 +1,17 @@
+require "timber-rails/action_controller/log_subscriber"
+
+module Timber
+ module Integrations
+ # Module for holding *all* ActionController integrations. See {Integration} for
+ # configuration details for all integrations.
+ module ActionController
+ extend Integration
+
+ def self.integrate!
+ return false if !enabled?
+
+ LogSubscriber.integrate!
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller/log_subscriber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller/log_subscriber.rb
new file mode 100644
index 000000000..16d25c67f
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller/log_subscriber.rb
@@ -0,0 +1,25 @@
+module Timber
+ module Integrations
+ module ActionController
+ # Responsible for removing the default ActionController::LogSubscriber and installing
+ # the TimberLogSubscriber
+ #
+ # @private
+ class LogSubscriber < Integrator
+ def initialize
+ require "action_controller/log_subscriber"
+ require "timber-rails/action_controller/log_subscriber/timber_log_subscriber"
+ rescue LoadError => e
+ raise RequirementNotMetError.new(e.message)
+ end
+
+ def integrate!
+ return true if Timber::Integrations::Rails::ActiveSupportLogSubscriber.subscribed?(:action_controller, TimberLogSubscriber)
+
+ Timber::Integrations::Rails::ActiveSupportLogSubscriber.unsubscribe!(:action_controller, ::ActionController::LogSubscriber)
+ TimberLogSubscriber.attach_to(:action_controller)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller/log_subscriber/timber_log_subscriber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller/log_subscriber/timber_log_subscriber.rb
new file mode 100644
index 000000000..9a1fa8f25
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_controller/log_subscriber/timber_log_subscriber.rb
@@ -0,0 +1,46 @@
+module Timber
+ module Integrations
+ module ActionController
+ class LogSubscriber < Integrator
+ # The log subscriber that replaces the default `ActionController::LogSubscriber`.
+ # The intent of this subscriber is to, as transparently as possible, properly
+ # track events that are being logged here. This LogSubscriber will never change
+ # default behavior / log messages.
+ #
+ # @private
+ class TimberLogSubscriber < ::ActionController::LogSubscriber
+ def start_processing(event)
+ return true if silence?
+
+ info do
+ payload = event.payload
+ params = payload[:params].except(*INTERNAL_PARAMS)
+ format = extract_format(payload)
+ format = format.to_s.upcase if format.is_a?(Symbol)
+
+ Events::ControllerCall.new(
+ controller: payload[:controller],
+ action: payload[:action],
+ format: format,
+ params: params
+ )
+ end
+ end
+
+ private
+ def extract_format(payload)
+ if payload.key?(:format)
+ payload[:format] # rails > 4.X
+ elsif payload.key?(:formats)
+ payload[:formats].first # rails 3.X
+ end
+ end
+
+ def silence?
+ ActionController.silence?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_dispatch.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_dispatch.rb
new file mode 100644
index 000000000..0e9cb2c45
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_dispatch.rb
@@ -0,0 +1,20 @@
+require "timber-rails/action_dispatch/debug_exceptions"
+
+module Timber
+ module Integrations
+ # Module for holding *all* ActionDispatch integrations. This
+ # module simply disables the exception tracking middleware so that our middleware
+ # works as expected.
+ module ActionDispatch
+ def self.enabled?
+ Rails::ErrorEvent.enabled?
+ end
+
+ def self.integrate!
+ return false if !enabled?
+
+ DebugExceptions.integrate!
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_dispatch/debug_exceptions.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_dispatch/debug_exceptions.rb
new file mode 100644
index 000000000..5b4a4ebe2
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_dispatch/debug_exceptions.rb
@@ -0,0 +1,51 @@
+module Timber
+ module Integrations
+ module ActionDispatch
+ # Reponsible for disabled logging in the ActionDispatch::DebugExceptions
+ # Rack middleware. We cannot simply remove the middleware because it is
+ # coupled with displaying an exception debug screen if debug exceptions is enabled.
+ #
+ # @private
+ class DebugExceptions < Integrator
+
+ # Patch for disabling logging
+ #
+ # @private
+ module InstanceMethods
+ def self.included(klass)
+ klass.class_eval do
+ private
+ def logger(*args)
+ nil
+ end
+ end
+ end
+ end
+
+ def initialize
+ begin
+ # Rails >= 3.1
+ require "action_dispatch/middleware/debug_exceptions"
+ rescue LoadError
+ # Rails < 3.1
+ require "action_dispatch/middleware/show_exceptions"
+ end
+ rescue LoadError => e
+ raise RequirementNotMetError.new(e.message)
+ end
+
+ def integrate!
+ if defined?(::ActionDispatch::DebugExceptions) && !::ActionDispatch::DebugExceptions.include?(InstanceMethods)
+ ::ActionDispatch::DebugExceptions.send(:include, InstanceMethods)
+ end
+
+ if defined?(::ActionDispatch::ShowExceptions) && !::ActionDispatch::ShowExceptions.include?(InstanceMethods)
+ ::ActionDispatch::ShowExceptions.send(:include, InstanceMethods)
+ end
+
+ true
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view.rb
new file mode 100644
index 000000000..c2e8af249
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view.rb
@@ -0,0 +1,17 @@
+require "timber-rails/action_view/log_subscriber"
+
+module Timber
+ module Integrations
+ # Module for holding *all* ActionView integrations. See {Integration} for
+ # configuration details for all integrations.
+ module ActionView
+ extend Integration
+
+ def self.integrate!
+ return false if !enabled?
+
+ LogSubscriber.integrate!
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view/log_subscriber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view/log_subscriber.rb
new file mode 100644
index 000000000..4d63ab7af
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view/log_subscriber.rb
@@ -0,0 +1,25 @@
+module Timber
+ module Integrations
+ module ActionView
+ # Reponsible for uninstalling the default `ActionView::LogSubscriber` and installing
+ # the TimberLogSubscriber.
+ #
+ # @private
+ class LogSubscriber < Integrator
+ def initialize
+ require "action_view/log_subscriber"
+ require "timber-rails/action_view/log_subscriber/timber_log_subscriber"
+ rescue LoadError => e
+ raise RequirementNotMetError.new(e.message)
+ end
+
+ def integrate!
+ return true if Timber::Integrations::Rails::ActiveSupportLogSubscriber.subscribed?(:action_view, TimberLogSubscriber)
+
+ Timber::Integrations::Rails::ActiveSupportLogSubscriber.unsubscribe!(:action_view, ::ActionView::LogSubscriber)
+ TimberLogSubscriber.attach_to(:action_view)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view/log_subscriber/timber_log_subscriber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view/log_subscriber/timber_log_subscriber.rb
new file mode 100644
index 000000000..f4aed95a0
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/action_view/log_subscriber/timber_log_subscriber.rb
@@ -0,0 +1,83 @@
+module Timber
+ module Integrations
+ module ActionView
+ class LogSubscriber < Integrator
+
+ # The log subscriber that replaces the default `ActionView::LogSubscriber`.
+ # The intent of this subscriber is to, as transparently as possible, properly
+ # track events that are being logged here.
+ #
+ # @private
+ class TimberLogSubscriber < ::ActionView::LogSubscriber
+ def render_template(event)
+ return true if silence?
+
+ info do
+ full_name = from_rails_root(event.payload[:identifier])
+ message = " Rendered #{full_name}"
+ message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
+ message << " (#{event.duration.round(1)}ms)"
+
+ Events::TemplateRender.new(
+ name: full_name,
+ duration_ms: event.duration,
+ message: message
+ )
+ end
+ end
+
+ def render_partial(event)
+ return true if silence?
+
+ info do
+ full_name = from_rails_root(event.payload[:identifier])
+ message = " Rendered #{full_name}"
+ message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
+ message << " (#{event.duration.round(1)}ms)"
+ message << " #{cache_message(event.payload)}" if event.payload.key?(:cache_hit)
+
+ Events::TemplateRender.new(
+ name: full_name,
+ duration_ms: event.duration,
+ message: message
+ )
+ end
+ end
+
+ def render_collection(event)
+ return true if silence?
+
+ if respond_to?(:render_count, true)
+ info do
+ identifier = event.payload[:identifier] || "templates"
+ full_name = from_rails_root(identifier)
+ message = " Rendered collection of #{full_name}" \
+ " #{render_count(event.payload)} (#{event.duration.round(1)}ms)"
+
+ Events::TemplateRender.new(
+ name: full_name,
+ duration_ms: event.duration,
+ message: message
+ )
+ end
+ else
+ # Older versions of rails delegate this method to #render_template
+ render_template(event)
+ end
+ end
+
+ private
+ def log_rendering_start(payload)
+ # Consolidates 2 template rendering events into 1. We don't need 2 events for
+ # rendering a template. If you disagree, please feel free to open a PR and we
+ # can make this an option.
+ end
+
+ def silence?
+ ActionView.silence?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record.rb
new file mode 100644
index 000000000..00e0eb0a2
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record.rb
@@ -0,0 +1,17 @@
+require "timber-rails/active_record/log_subscriber"
+
+module Timber
+ module Integrations
+ # Module for holding *all* ActiveRecord integrations. See {Integration} for
+ # configuration details for all integrations.
+ module ActiveRecord
+ extend Integration
+
+ def self.integrate!
+ return false if !enabled?
+
+ LogSubscriber.integrate!
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record/log_subscriber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record/log_subscriber.rb
new file mode 100644
index 000000000..6e2d4376c
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record/log_subscriber.rb
@@ -0,0 +1,20 @@
+require "timber-rails/active_record/log_subscriber/timber_log_subscriber"
+
+module Timber
+ module Integrations
+ module ActiveRecord
+ # Reponsible for uninstalling the default `ActiveRecord::LogSubscriber` and replacing it
+ # with the `TimberLogSubscriber`.
+ #
+ # @private
+ class LogSubscriber < Integrator
+ def integrate!
+ return true if Timber::Integrations::Rails::ActiveSupportLogSubscriber.subscribed?(:active_record, TimberLogSubscriber)
+
+ Timber::Integrations::Rails::ActiveSupportLogSubscriber.unsubscribe!(:active_record, ::ActiveRecord::LogSubscriber)
+ TimberLogSubscriber.attach_to(:active_record)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record/log_subscriber/timber_log_subscriber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record/log_subscriber/timber_log_subscriber.rb
new file mode 100644
index 000000000..af402a8c2
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_record/log_subscriber/timber_log_subscriber.rb
@@ -0,0 +1,52 @@
+# We require all of ActiveRecord because the #logger method in ::ActiveRecord::LogSubscriber
+# uses ActiveRecord::Base. We can't require active_record/base directly because ActiveRecord
+# does not require files properly and we receive unintialized constant errors.
+require "active_record"
+require "active_record/log_subscriber"
+
+module Timber
+ module Integrations
+ module ActiveRecord
+ class LogSubscriber < Integrator
+ # The log subscriber that replaces the default `ActiveRecord::LogSubscriber`.
+ # The intent of this subscriber is to, as transparently as possible, properly
+ # track events that are being logged here. This LogSubscriber will never change
+ # default behavior / log messages.
+ #
+ # @private
+ class TimberLogSubscriber < ::ActiveRecord::LogSubscriber
+ def sql(event)
+ return true if silence?
+
+ r = super(event)
+
+ if @message
+ payload = event.payload
+
+ sql_event = Events::SQLQuery.new(
+ sql: payload[:sql],
+ duration_ms: event.duration,
+ message: @message,
+ )
+
+ logger.debug sql_event
+
+ @message = nil
+ end
+
+ r
+ end
+
+ private
+ def debug(message)
+ @message = message
+ end
+
+ def silence?
+ ActiveRecord.silence?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_support_log_subscriber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_support_log_subscriber.rb
new file mode 100644
index 000000000..a3f702326
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/active_support_log_subscriber.rb
@@ -0,0 +1,39 @@
+module Timber
+ module Integrations
+ module Rails
+ # @private
+ module ActiveSupportLogSubscriber
+ extend self
+
+ def find(component, type)
+ ::ActiveSupport::LogSubscriber.log_subscribers.find do |subscriber|
+ subscriber.class == type
+ end
+ end
+
+ def subscribed?(component, type)
+ !find(component, type).nil?
+ end
+
+ # I don't know why this has to be so complicated, but it is. This code was taken from
+ # lograge :/
+ def unsubscribe!(component, type)
+ subscriber = find(component, type)
+
+ if !subscriber
+ raise "We could not find a log subscriber for #{component.inspect} of type #{type.inspect}"
+ end
+
+ events = subscriber.public_methods(false).reject { |method| method.to_s == 'call' }
+ events.each do |event|
+ ::ActiveSupport::Notifications.notifier.listeners_for("#{event}.#{component}").each do |listener|
+ if listener.instance_variable_get('@delegate') == subscriber
+ ::ActiveSupport::Notifications.unsubscribe listener
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config.rb
new file mode 100644
index 000000000..ee3a45833
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config.rb
@@ -0,0 +1,12 @@
+require 'timber/config'
+require 'timber-rack/config'
+require 'timber-rails/config/action_view'
+require 'timber-rails/config/active_record'
+require 'timber-rails/config/action_controller'
+
+Timber::Config.instance.define_singleton_method(:logrageify!) do
+ integrations.action_controller.silence = true
+ integrations.action_view.silence = true
+ integrations.active_record.silence = true
+ integrations.rack.http_events.collapse_into_single_event = true
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/action_controller.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/action_controller.rb
new file mode 100644
index 000000000..2e9410e1b
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/action_controller.rb
@@ -0,0 +1,29 @@
+require "timber-rails/action_controller"
+
+module Timber
+ class Config
+ # Convenience module for accessing the various `Timber::Integrations::*` classes
+ # through the {Timber::Config} object. Timber couples configuration with the class
+ # responsible for implementing it. This provides for a tighter design, but also
+ # requires the user to understand and access the various classes. This module aims
+ # to provide a simple ruby-like configuration interface for internal Timber classes.
+ #
+ # For example:
+ #
+ # config = Timber::Config.instance
+ # config.integrations.active_record.silence = true
+ module Integrations
+ extend self
+
+ # Convenience method for accessing the {Timber::Integrations::ActionController} class
+ # specific configuration.
+ #
+ # @example
+ # config = Timber::Config.instance
+ # config.integrations.action_controller.silence = true
+ def action_controller
+ Timber::Integrations::ActionController
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/action_view.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/action_view.rb
new file mode 100644
index 000000000..78a08f676
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/action_view.rb
@@ -0,0 +1,29 @@
+require "timber-rails/action_view"
+
+module Timber
+ class Config
+ # Convenience module for accessing the various `Timber::Integrations::*` classes
+ # through the {Timber::Config} object. Timber couples configuration with the class
+ # responsible for implementing it. This provides for a tighter design, but also
+ # requires the user to understand and access the various classes. This module aims
+ # to provide a simple ruby-like configuration interface for internal Timber classes.
+ #
+ # For example:
+ #
+ # config = Timber::Config.instance
+ # config.integrations.active_record.silence = true
+ module Integrations
+ extend self
+
+ # Convenience method for accessing the {Timber::Integrations::ActionView} class
+ # specific configuration.
+ #
+ # @example
+ # config = Timber::Config.instance
+ # config.integrations.action_view.silence = true
+ def action_view
+ Timber::Integrations::ActionView
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/active_record.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/active_record.rb
new file mode 100644
index 000000000..95b6dac73
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/config/active_record.rb
@@ -0,0 +1,29 @@
+require "timber-rails/active_record"
+
+module Timber
+ class Config
+ # Convenience module for accessing the various `Timber::Integrations::*` classes
+ # through the {Timber::Config} object. Timber couples configuration with the class
+ # responsible for implementing it. This provides for a tighter design, but also
+ # requires the user to understand and access the various classes. This module aims
+ # to provide a simple ruby-like configuration interface for internal Timber classes.
+ #
+ # For example:
+ #
+ # config = Timber::Config.instance
+ # config.integrations.active_record.silence = true
+ module Integrations
+ extend self
+
+ # Convenience method for accessing the {Timber::Integrations::ActiveRecord} class
+ # specific configuration.
+ #
+ # @example
+ # config = Timber::Config.instance
+ # config.integrations.active_record.silence = true
+ def active_record
+ Timber::Integrations::ActiveRecord
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/error_event.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/error_event.rb
new file mode 100644
index 000000000..36a58de6b
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/error_event.rb
@@ -0,0 +1,61 @@
+begin
+ # Rails 3.2 requires you to require all of Rails before requiring
+ # the exception wrapper.
+ require "action_dispatch/middleware/exception_wrapper"
+rescue Exception
+end
+
+require "timber/events/error"
+require "timber-rack/middleware"
+require "timber/util"
+
+module Timber
+ module Integrations
+ module Rails
+ # A Rack middleware that is reponsible for capturing exception and error events
+ # {Timber::Events::Error}.
+ class ErrorEvent < Timber::Integrations::Rack::Middleware
+ # We determine this when the app loads to avoid the overhead on a per request basis.
+ EXCEPTION_WRAPPER_TAKES_CLEANER = defined?(::ActionDispatch::ExceptionWrapper) &&
+ !::ActionDispatch::ExceptionWrapper.instance_methods.include?(:env)
+
+ def call(env)
+ begin
+ status, headers, body = @app.call(env)
+ rescue Exception => exception
+ Config.instance.logger.fatal do
+ backtrace = extract_backtrace(env, exception)
+ Events::Error.new(
+ name: exception.class.name,
+ error_message: exception.message,
+ backtrace: backtrace
+ )
+ end
+
+ raise exception
+ end
+ end
+
+ private
+ # Rails provides a backtrace cleaner, so we use it here.
+ def extract_backtrace(env, exception)
+ if defined?(::ActionDispatch::ExceptionWrapper)
+ wrapper = if EXCEPTION_WRAPPER_TAKES_CLEANER
+ request = Util::Request.new(env)
+ backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")
+ ::ActionDispatch::ExceptionWrapper.new(backtrace_cleaner, exception)
+ else
+ ::ActionDispatch::ExceptionWrapper.new(env, exception)
+ end
+
+ trace = wrapper.application_trace
+ trace = wrapper.framework_trace if trace.empty?
+ trace
+ else
+ exception.backtrace
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/logger.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/logger.rb
new file mode 100644
index 000000000..f940ff04e
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/logger.rb
@@ -0,0 +1,20 @@
+module Timber
+ # The Timber Logger behaves exactly like the standard Ruby `::Logger`, except that it supports a
+ # transparent API for logging structured data and events.
+ #
+ # @example Basic logging
+ # logger.info "Payment rejected for customer #{customer_id}"
+ #
+ # @example Logging an event
+ # logger.info "Payment rejected", payment_rejected: {customer_id: customer_id, amount: 100}
+ class Logger < ::Logger
+ include ::ActiveSupport::LoggerThreadSafeLevel if defined?(::ActiveSupport::LoggerThreadSafeLevel)
+
+ if defined?(::ActiveSupport::LoggerSilence)
+ include ::ActiveSupport::LoggerSilence
+ elsif defined?(::LoggerSilence)
+ include ::LoggerSilence
+ end
+ end
+end
+
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides.rb
new file mode 100644
index 000000000..7ba034efc
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides.rb
@@ -0,0 +1,12 @@
+# The order is relevant
+require "timber-rails/overrides/active_support_3_tagged_logging"
+require "timber-rails/overrides/active_support_tagged_logging"
+require "timber-rails/overrides/active_support_buffered_logger"
+require "timber-rails/overrides/lograge"
+require "timber-rails/overrides/rails_stdout_logging"
+
+module Timber
+ # @private
+ module Overrides
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_3_tagged_logging.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_3_tagged_logging.rb
new file mode 100644
index 000000000..f2a87f08f
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_3_tagged_logging.rb
@@ -0,0 +1,111 @@
+# Please note, this patch is merely an upgrade, backporting improved tagged logging code
+# from newer versions of Rails:
+# https://github.com/rails/rails/blob/5-1-stable/activesupport/lib/active_support/tagged_logging.rb
+# The behavior of tagged logging will not change in any way.
+#
+# This patch is specifically for Rails 3. The legacy approach to wrapping the logger in
+# ActiveSupport::TaggedLogging is rather poor, hence the reason it was changed entirely
+# for Rails 4 and 5. The problem is that ActiveSupport::TaggedLogging is a wrapping
+# class that entirely redefines the public API for the logger. As a result, any deviations
+# from this API in the logger are not exposed (such as accepting event data as a second argument).
+# This is assuming, so we're fixing it here.
+
+begin
+ require "active_support/tagged_logging"
+
+ # Instead of patching the class we're pulling the code from Rails master. This brings in
+ # a number of improvements while also addressing the issue above.
+ if ActiveSupport::TaggedLogging.instance_of?(Class)
+ ActiveSupport.send(:remove_const, :TaggedLogging)
+
+ require "active_support/core_ext/module/delegation"
+ require "active_support/core_ext/object/blank"
+ require "logger"
+
+ module ActiveSupport
+ # Wraps any standard Logger object to provide tagging capabilities.
+ #
+ # logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
+ # logger.tagged('BCX') { logger.info 'Stuff' } # Logs "[BCX] Stuff"
+ # logger.tagged('BCX', "Jason") { logger.info 'Stuff' } # Logs "[BCX] [Jason] Stuff"
+ # logger.tagged('BCX') { logger.tagged('Jason') { logger.info 'Stuff' } } # Logs "[BCX] [Jason] Stuff"
+ #
+ # This is used by the default Rails.logger as configured by Railties to make
+ # it easy to stamp log lines with subdomains, request ids, and anything else
+ # to aid debugging of multi-user production applications.
+ module TaggedLogging
+ module Formatter # :nodoc:
+ # This method is invoked when a log event occurs.
+ def call(severity, timestamp, progname, msg)
+ super(severity, timestamp, progname, "#{tags_text}#{msg}")
+ end
+
+ def tagged(*tags)
+ new_tags = push_tags(*tags)
+ yield self
+ ensure
+ pop_tags(new_tags.size)
+ end
+
+ def push_tags(*tags)
+ tags.flatten.reject(&:blank?).tap do |new_tags|
+ current_tags.concat new_tags
+ end
+ end
+
+ def pop_tags(size = 1)
+ current_tags.pop size
+ end
+
+ def clear_tags!
+ current_tags.clear
+ end
+
+ def current_tags
+ # We use our object ID here to avoid conflicting with other instances
+ thread_key = @thread_key ||= "activesupport_tagged_logging_tags:#{object_id}".freeze
+ Thread.current[thread_key] ||= []
+ end
+
+ def tags_text
+ tags = current_tags
+ if tags.any?
+ tags.collect { |tag| "[#{tag}] " }.join
+ end
+ end
+ end
+
+ # Simple formatter which only displays the message.
+ class SimpleFormatter < ::Logger::Formatter
+ # This method is invoked when a log event occurs
+ def call(severity, timestamp, progname, msg)
+ "#{String === msg ? msg : msg.inspect}\n"
+ end
+ end
+
+ def self.new(logger)
+ if logger.respond_to?(:formatter=) && logger.respond_to?(:formatter)
+ # Ensure we set a default formatter so we aren't extending nil!
+ logger.formatter ||= SimpleFormatter.new
+ logger.formatter.extend Formatter
+ end
+
+ logger.extend(self)
+ end
+
+ delegate :push_tags, :pop_tags, :clear_tags!, to: :formatter
+
+ def tagged(*tags)
+ formatter.tagged(*tags) { yield self }
+ end
+
+ def flush
+ clear_tags!
+ super if defined?(super)
+ end
+ end
+ end
+ end
+
+rescue Exception
+end
\ No newline at end of file
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_buffered_logger.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_buffered_logger.rb
new file mode 100644
index 000000000..b5e9f3210
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_buffered_logger.rb
@@ -0,0 +1,22 @@
+# This adds a #formatter and #formatter= method to the legacy ActiveSupport::BufferedLogger
+# class. This bug was never resolved due to it being phased out past Rails >= 4.
+
+begin
+ require "active_support/buffered_logger"
+
+ class ActiveSupport::BufferedLogger
+ def formatter
+ if @log.respond_to?(:formatter)
+ @log.formatter
+ end
+ end
+
+ def formatter=(value)
+ if @log.respond_to?(:formatter=)
+ @log.formatter = value
+ end
+ end
+ end
+
+rescue Exception
+end
\ No newline at end of file
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_tagged_logging.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_tagged_logging.rb
new file mode 100644
index 000000000..69a7ccbab
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/active_support_tagged_logging.rb
@@ -0,0 +1,66 @@
+# This is an override instead of an integration because without this Timber would not
+# work properly if ActiveSupport::TaggedLogging is used.
+#
+# This is called after 'active_support_3_tagged_logging' where the constant is loaded and
+# replaced. I want to make sure we don't attempt to load it again undoing the patches
+# applied there.
+if defined?(ActiveSupport::TaggedLogging)
+ module Timber
+ module Overrides
+ # @private
+ module ActiveSupportTaggedLogging
+ # @private
+ module FormatterMethods
+ def self.included(mod)
+ mod.module_eval do
+ alias_method :_timber_original_push_tags, :push_tags
+ alias_method :_timber_original_pop_tags, :pop_tags
+
+ def call(severity, timestamp, progname, msg)
+ if is_a?(Timber::Logger::Formatter)
+ # Don't convert the message into a string
+ super(severity, timestamp, progname, msg)
+ else
+ super(severity, timestamp, progname, "#{tags_text}#{msg}")
+ end
+ end
+ end
+ end
+ end
+
+ # @private
+ module LoggerMethods
+ def self.included(klass)
+ klass.class_eval do
+ def add(severity, message = nil, progname = nil, &block)
+ if message.nil?
+ if block_given?
+ message = block.call
+ else
+ message = progname
+ progname = nil #No instance variable for this like Logger
+ end
+ end
+ if @logger.is_a?(Timber::Logger)
+ @logger.add(severity, message, progname)
+ else
+ @logger.add(severity, "#{tags_text}#{message}", progname)
+ end
+ end
+ end
+ end
+ end
+
+ if defined?(::ActiveSupport::TaggedLogging::Formatter)
+ if !::ActiveSupport::TaggedLogging::Formatter.include?(FormatterMethods)
+ ::ActiveSupport::TaggedLogging::Formatter.send(:include, FormatterMethods)
+ end
+ else
+ if !::ActiveSupport::TaggedLogging.include?(LoggerMethods)
+ ::ActiveSupport::TaggedLogging.send(:include, LoggerMethods)
+ end
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/lograge.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/lograge.rb
new file mode 100644
index 000000000..8d47ce8ba
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/lograge.rb
@@ -0,0 +1,18 @@
+# Timber and lograge are not compatible installed together. Using lograge
+# with the Timber.io *service* is perfectly fine, but not with the Timber *gem*.
+#
+# Timber does ship with a {Timber::Config#logrageify!} option that configures
+# Timber to behave similarly to Lograge (silencing various logs). Check out
+# the aforementioned method or the README for info.
+begin
+ require "lograge"
+
+ module Lograge
+ module_function
+
+ def setup(app)
+ return true
+ end
+ end
+rescue Exception
+end
\ No newline at end of file
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/rails_stdout_logging.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/rails_stdout_logging.rb
new file mode 100644
index 000000000..5a42cc912
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/overrides/rails_stdout_logging.rb
@@ -0,0 +1,21 @@
+# See https://github.com/heroku/rails_stdout_logging
+# I have no idea why this library was created, but most Heroku / Rails apps use it.
+# This library completely obliterates any logger configuration you set.
+# So this patch fixes that.
+
+begin
+ require "rails_stdout_logging"
+
+ module RailsStdoutLogging
+ class Rails2 < Rails
+ def self.set_logger
+ end
+ end
+
+ class Rails3 < Rails
+ def self.set_logger(config)
+ end
+ end
+ end
+rescue Exception
+end
\ No newline at end of file
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/rack_logger.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/rack_logger.rb
new file mode 100644
index 000000000..d435cb92c
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/rack_logger.rb
@@ -0,0 +1,58 @@
+module Timber
+ module Integrations
+ module Rails
+ # Disables the default rail's rack logging. Note, we cannot simply uninstall this rack
+ # middleware because rails couples this with ActiveSupport instrumentation. As such,
+ # we simply disable the logger and let our Rack middleware handle the logging.
+ #
+ # See: https://github.com/rails/rails/blob/80e66cc4d90bf8c15d1a5f6e3152e90147f00772/railties/lib/rails/rack/logger.rb#L34
+ #
+ # @private
+ class RackLogger < Integrator
+
+ # @private
+ module InstanceMethods
+ LOGGER = ::Logger.new(nil)
+
+ def self.included(klass)
+ klass.class_eval do
+ private
+ if ::Rails::VERSION::MAJOR == 3
+ # Rails 3.2 calls Rails.logger directly in call_app, so we
+ # will just replace it with a version that doesn't
+ def call_app(_, env)
+ # Put some space between requests in development logs.
+ if ::Rails.env.development?
+ ::Rails.logger.info ''
+ ::Rails.logger.info ''
+ end
+ @app.call(env)
+ ensure
+ ActiveSupport::LogSubscriber.flush_all!
+ end
+ end
+
+ # Rails > 3.2 uses a logger method. Muting logs is accomplished by
+ # passing a dummy logger instance with a nil log device.
+ def logger
+ LOGGER
+ end
+ end
+ end
+ end
+
+ def initialize
+ require "rails/rack/logger"
+ rescue LoadError => e
+ raise RequirementNotMetError.new(e.message)
+ end
+
+ def integrate!
+ return true if ::Rails::Rack::Logger.include?(InstanceMethods)
+
+ ::Rails::Rack::Logger.send(:include, InstanceMethods)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/railtie.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/railtie.rb
new file mode 100644
index 000000000..0c029e3f5
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/railtie.rb
@@ -0,0 +1,27 @@
+module Timber
+ module Frameworks
+ # Module for Rails specific code, such as the Railtie and any methods that assist
+ # with Rails setup.
+ module Rails
+ # Installs Timber into your Rails app automatically.
+ class Railtie < ::Rails::Railtie
+ config.timber = Config.instance
+
+ config.before_initialize do
+ Timber::Config.instance.logger = Proc.new { ::Rails.logger }
+ end
+
+ # Must be loaded after initializers so that we respect any Timber configuration set
+ initializer(:timber, before: :build_middleware_stack, after: :load_config_initializers) do
+ Integrations::Rails.integrate!
+
+ # Install the Rack middlewares so that we capture structured data instead of
+ # raw text logs.
+ Integrations::Rails.middlewares.collect do |middleware_class|
+ config.app_middleware.use middleware_class
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/session_context.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/session_context.rb
new file mode 100644
index 000000000..4d776f27a
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/session_context.rb
@@ -0,0 +1,37 @@
+require "timber/contexts/session"
+require "timber-rack/middleware"
+
+module Timber
+ module Integrations
+ module Rails
+ # A Rack middleware that is responsible for adding the Session context
+ # {Timber::Contexts::Session}.
+ class SessionContext < Timber::Integrations::Rack::Middleware
+ def call(env)
+ id = get_session_id(env)
+ if id
+ context = Contexts::Session.new(id: id)
+ CurrentContext.add(context.to_hash)
+ end
+ @app.call(env)
+ end
+
+ private
+ def get_session_id(env)
+ session_key = ::Rails.application.config.session_options[:key]
+ request = ::ActionDispatch::Request.new(env)
+ extract_from_cookie(request, session_key)
+ rescue Exception => e
+ nil
+ end
+
+ def extract_from_cookie(request, session_key)
+ data = request
+ .cookie_jar
+ .signed_or_encrypted[session_key] || {}
+ data["session_id"]
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/version.rb b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/version.rb
new file mode 100644
index 000000000..c7ba4a56b
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/lib/timber-rails/version.rb
@@ -0,0 +1,7 @@
+module Timber
+ module Integrations
+ module Rails
+ VERSION = "1.0.2"
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/README.md b/vendor/cache/timber-ruby-rails-250326b0926d/spec/README.md
new file mode 100644
index 000000000..04c5f6a49
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/README.md
@@ -0,0 +1,19 @@
+# Testing
+
+To get started:
+
+```shell
+bundle install
+```
+
+Be sure to install specific Gemfile dependencies:
+
+```
+BUNDLE_GEMFILE=gemfiles/rails-4.2.gemfile bundle install
+```
+
+You can run tests like this:
+
+```shell
+BUNDLE_GEMFILE=gemfiles/rails-4.2.gemfile bundle exec rspec
+```
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/spec_helper.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/spec_helper.rb
new file mode 100644
index 000000000..354cdcc17
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/spec_helper.rb
@@ -0,0 +1,39 @@
+# Base
+# require 'rubygems'
+require 'bundler/setup'
+
+# Testing
+require 'rspec'
+require 'rspec/its'
+require 'rspec/mocks'
+
+# Support files, order is relevant
+require File.join(File.dirname(__FILE__), 'support', 'socket_hostname')
+require File.join(File.dirname(__FILE__), 'support', 'timecop')
+require File.join(File.dirname(__FILE__), 'support', 'webmock')
+require File.join(File.dirname(__FILE__), 'support', 'timber')
+
+# Load framework files after we've setup everything
+if !ENV["RAILS_23"]
+ require File.join(File.dirname(__FILE__), 'support', 'rails')
+ require File.join(File.dirname(__FILE__), 'support', 'action_controller')
+ require File.join(File.dirname(__FILE__), 'support', 'active_record')
+end
+
+RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length = 5_000
+
+RSpec.configure do |config|
+ config.color = true
+ config.order = :random
+ config.warnings = false
+
+ # Enable flags like --only-failures and --next-failure
+ config.example_status_persistence_file_path = ".rspec_status"
+
+ # Disable RSpec exposing methods globally on `Module` and `main`
+ config.disable_monkey_patching!
+
+ config.expect_with :rspec do |c|
+ c.syntax = :expect
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/action_controller.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/action_controller.rb
new file mode 100644
index 000000000..b8c7c0dda
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/action_controller.rb
@@ -0,0 +1,2 @@
+require "action_controller"
+::ActionController::Base.prepend_view_path("#{File.dirname(__FILE__)}/rails/templates")
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/active_record.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/active_record.rb
new file mode 100644
index 000000000..8e49544a2
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/active_record.rb
@@ -0,0 +1,26 @@
+require 'active_record'
+ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
+ActiveRecord::Schema.define do
+ self.verbose = false
+
+ create_table :organizations, :force => true do |t|
+ t.string :name
+
+ t.timestamps :null => false
+ end
+
+ create_table :users, :force => true do |t|
+ t.integer :age
+ t.string :email
+ t.string :first_name
+
+ t.timestamps :null => false
+ end
+
+end
+
+class Organization < ::ActiveRecord::Base
+end
+
+class User < ::ActiveRecord::Base
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails.rb
new file mode 100644
index 000000000..4bafd3c0f
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails.rb
@@ -0,0 +1,77 @@
+require "rails"
+require "timber-rails/railtie"
+
+# Defualt the rails logger to nothing, each test shoould be
+# responsible for setting up the logger
+logger = Timber::Logger.new(nil) # change to STDOUT to see rails logs
+Rails.logger = logger
+
+class RailsApp < Rails::Application
+ if ::Rails.version =~ /^3\./
+ config.secret_token = '1e05af2b349457936a41427e63450937'
+ else
+ config.secret_key_base = '1e05af2b349457936a41427e63450937'
+ end
+
+ # This ensures our tests fail, otherwise exceptions get swallowed by ActionDispatch::DebugExceptions
+ config.action_dispatch.show_exceptions = false
+ config.active_support.deprecation = :stderr
+ config.eager_load = false
+end
+
+RailsApp.initialize!
+
+module Support
+ module Rails
+ def dispatch_rails_request(path, additional_env_options = {})
+ application = ::Rails.application
+ env = application.respond_to?(:env_config) ? application.env_config.clone : application.env_defaults.clone
+ env["rack.request.cookie_hash"] = {}.with_indifferent_access
+ env["CONTENT_LENGTH"] = 100
+ env["REMOTE_ADDR"] = "123.456.789.10"
+ env["HTTP_X_REQUEST_ID"] = "unique-request-id-1234"
+ env["action_dispatch.request_id"] = env["HTTP_X_REQUEST_ID"]
+ env = env.merge(additional_env_options)
+ ::Rack::MockRequest.new(application).get(path, env)
+ end
+
+ def with_rails_logger(logger)
+ old_logger = ::Rails.logger
+
+ # We have to set these again because rails set's these after initialization.
+ # Since we've already booted the rails app we need to update them all as we
+ # change the logger.
+ #
+ # You can see here that they use simple class attribute, hence the reason we need
+ # to update all of them: https://github.com/rails/rails/blob/700ec897f97c60016ad748236bf3a49ef15a20de/actionview/lib/action_view/base.rb#L157
+ ::ActionCable::Server::Base.logger = logger if defined?(::ActionCable::Server::Base) && ::ActionCable::Server::Base.respond_to?(:logger=)
+ ::ActionController::Base.logger = logger if defined?(::ActionController::Base) && ::ActionController::Base.respond_to?(:logger=)
+ ::ActionMailer::Base.logger = logger if defined?(::ActionMailer::Base) && ::ActionMailer::Base.respond_to?(:logger=)
+ ::ActionView::Base.logger = logger if defined?(::ActionView::Base) && ::ActionView::Base.respond_to?(:logger=)
+ ::ActiveRecord::Base.logger = logger if defined?(::ActiveRecord::Base) && ::ActiveRecord::Base.respond_to?(:logger=)
+ ::Rails.logger = logger
+
+ yield
+
+ ::Rails.logger = old_logger
+ end
+ end
+end
+
+# This is necessary as tests use Timber::Config.send(:new) to create
+# an instance of the Config class instead of the Timber::Config
+# singleton.
+module Timber
+ class Config
+ def logrageify!
+ integrations.action_controller.silence = true
+ integrations.action_view.silence = true
+ integrations.active_record.silence = true
+ integrations.rack.http_events.collapse_into_single_event = true
+ end
+ end
+end
+
+RSpec.configure do |config|
+ config.include Support::Rails
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails/templates/_partial.html b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails/templates/_partial.html
new file mode 100644
index 000000000..e4e340572
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails/templates/_partial.html
@@ -0,0 +1 @@
+I am a partial
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails/templates/template.html b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails/templates/template.html
new file mode 100644
index 000000000..9258d279e
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/rails/templates/template.html
@@ -0,0 +1 @@
+I am a template
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/socket_hostname.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/socket_hostname.rb
new file mode 100644
index 000000000..730c21fa4
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/socket_hostname.rb
@@ -0,0 +1,12 @@
+require "socket"
+
+# Stub out the hostname for tests only. This can't use a normal stub in the
+# test life cycle since our test rails app is loaded once upon initialization.
+# In other words, the rails app gets loaded with the server context inserted
+# before any tests are run.
+
+class ::Socket
+ def self.gethostname
+ "computer-name.domain.com"
+ end
+end
\ No newline at end of file
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/timber.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/timber.rb
new file mode 100644
index 000000000..33080027f
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/timber.rb
@@ -0,0 +1,6 @@
+require "timber-rails"
+require "timber"
+require "timber/config"
+
+config = Timber::Config.instance
+config.environment = "production"
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/timecop.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/timecop.rb
new file mode 100644
index 000000000..3586b3d6f
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/timecop.rb
@@ -0,0 +1,3 @@
+require 'timecop'
+
+Timecop.safe_mode = true
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/webmock.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/webmock.rb
new file mode 100644
index 000000000..40c8b8eab
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/support/webmock.rb
@@ -0,0 +1,3 @@
+require 'webmock/rspec'
+
+WebMock.disable_net_connect!
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_controller/log_subscriber_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_controller/log_subscriber_spec.rb
new file mode 100644
index 000000000..1ac3ea550
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_controller/log_subscriber_spec.rb
@@ -0,0 +1,53 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::ActionController::LogSubscriber do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::INFO
+ logger
+ end
+
+ describe "#insert!" do
+ around(:each) do |example|
+ class LogSubscriberController < ActionController::Base
+ layout nil
+
+ def index
+ render json: {}
+ end
+
+ def method_for_action(action_name)
+ action_name
+ end
+ end
+
+ ::RailsApp.routes.draw do
+ get 'log_subscriber' => 'log_subscriber#index'
+ end
+
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+
+ Object.send(:remove_const, :LogSubscriberController)
+ end
+
+ it "should log a controller_call event once" do
+ # Rails uses this to calculate the view runtime below
+ allow(Benchmark).to receive(:ms).and_return(1).and_yield
+
+ dispatch_rails_request("/log_subscriber?query=value")
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines.length).to eq(3)
+ expect(lines[1]).to include("Processing by LogSubscriberController#index as HTML")
+ expect(lines[1]).to include('"controller_called":{"controller":"LogSubscriberController","action":"index","params_json"')
+ end
+
+ # Remove blank lines since Rails does this to space out requests in the logs
+ def clean_lines(lines)
+ lines.select { |line| !line.start_with?(" @metadat") }
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_dispatch/debug_exceptions_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_dispatch/debug_exceptions_spec.rb
new file mode 100644
index 000000000..95af57dde
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_dispatch/debug_exceptions_spec.rb
@@ -0,0 +1,52 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::ActionDispatch::DebugExceptions do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::DEBUG
+ logger
+ end
+
+ describe "#insert!" do
+ around(:each) do |example|
+ class ExceptionController < ActionController::Base
+ layout nil
+
+ def index
+ raise "boom"
+ end
+
+ def method_for_action(action_name)
+ action_name
+ end
+ end
+
+ ::RailsApp.routes.draw do
+ get 'exception' => 'exception#index'
+ end
+
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+
+ Object.send(:remove_const, :ExceptionController)
+ end
+
+ it "should log an exception event once" do
+ expect { dispatch_rails_request("/exception") }.to raise_error(RuntimeError)
+
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines.length).to eq(3)
+ expect(lines[2]).to include('RuntimeError (boom)')
+ expect(lines[2]).to include('fatal')
+ expect(lines[2]).to include("\"error\":{\"name\":\"RuntimeError\",\"message\":\"boom\",\"backtrace_json\":\"[")
+ end
+
+ # Remove blank lines since Rails does this to space out requests in the logs
+ def clean_lines(lines)
+ lines.select { |line| !line.start_with?(" @metadat") }
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_view/log_subscriber_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_view/log_subscriber_spec.rb
new file mode 100644
index 000000000..2dc6e4c2e
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/action_view/log_subscriber_spec.rb
@@ -0,0 +1,113 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::ActionView::LogSubscriber do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::WARN
+ logger
+ end
+
+ describe "insert!" do
+ around(:each) do |example|
+ class ActionViewLogSubscriberController < ActionController::Base
+ layout nil
+
+ def index
+ render template: "template"
+ end
+
+ def method_for_action(action_name)
+ action_name
+ end
+ end
+
+ ::RailsApp.routes.draw do
+ get 'action_view_log_subscriber' => 'action_view_log_subscriber#index'
+ end
+
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+
+ Object.send(:remove_const, :ActionViewLogSubscriberController)
+ end
+
+ describe "#render_template" do
+ it "should not log if the level is not sufficient" do
+ dispatch_rails_request("/action_view_log_subscriber")
+ expect(io.string).to eq("")
+ end
+
+ context "with an info level" do
+ around(:each) do |example|
+ old_level = logger.level
+ logger.level = ::Logger::INFO
+ example.run
+ logger.level = old_level
+ end
+
+ it "should log a template render event once" do
+ dispatch_rails_request("/action_view_log_subscriber")
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines[2].strip).to match(/Rendered spec\/support\/rails\/templates\/template.html \(\d+\.\d+ms\)/)
+ expect(lines[2]).to include("\"template_rendered\":{\"name\":\"spec/support/rails/templates/template.html\"")
+ end
+ end
+ end
+ end
+
+ if defined?(described_class::TimberLogSubscriber)
+ describe described_class::TimberLogSubscriber do
+ let(:event) do
+ event = Struct.new(:duration, :payload)
+ event.new(2.0, identifier: "path/to/template.html")
+ end
+
+ around(:each) do |example|
+ old_level = logger.level
+ logger.level = ::Logger::INFO
+ example.run
+ logger.level = old_level
+ end
+
+ describe "#render_template" do
+ it "should render the collection" do
+ log_subscriber = described_class.new
+ allow(log_subscriber).to receive(:logger).and_return(logger)
+ log_subscriber.render_template(event)
+ expect(io.string.strip).to include("Rendered path/to/template.html (2.0ms)")
+ end
+ end
+
+ describe "#render_partial" do
+ it "should render the collection" do
+ log_subscriber = described_class.new
+ allow(log_subscriber).to receive(:logger).and_return(logger)
+ log_subscriber.render_partial(event)
+ expect(io.string.strip).to include("Rendered path/to/template.html (2.0ms)")
+ end
+ end
+
+ describe "#render_collection" do
+ it "should render the collection" do
+ log_subscriber = described_class.new
+ allow(log_subscriber).to receive(:logger).and_return(logger)
+ log_subscriber.render_collection(event)
+
+ if log_subscriber.respond_to?(:render_count, true)
+ expect(io.string.strip).to include("Rendered collection of path/to/template.html [ times] (2.0ms)")
+ else
+ expect(io.string.strip).to include("Rendered path/to/template.html (2.0ms)")
+ end
+ end
+ end
+ end
+ end
+
+ # Remove blank lines since Rails does this to space out requests in the logs
+ def clean_lines(lines)
+ lines.select { |line| !line.start_with?(" @metadata") }
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/active_record/log_subscriber_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/active_record/log_subscriber_spec.rb
new file mode 100644
index 000000000..2545964da
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/active_record/log_subscriber_spec.rb
@@ -0,0 +1,44 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::ActiveRecord::LogSubscriber do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::INFO
+ logger
+ end
+
+ describe "#insert!" do
+ around(:each) do |example|
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+ end
+
+ it "should not log if the level is not sufficient" do
+ ActiveRecord::Base.connection.execute("select * from users")
+ expect(io.string).to eq("")
+ end
+
+ context "with an info level" do
+ around(:each) do |example|
+ old_level = logger.level
+ logger.level = ::Logger::DEBUG
+ example.run
+ logger.level = old_level
+ end
+
+ it "should log the sql query" do
+ ActiveRecord::Base.connection.execute("select * from users")
+ # Rails 4.X adds random spaces :/
+ string = io.string.gsub(" ORDER BY", " ORDER BY")
+ string = string.gsub(" ORDER BY", " ORDER BY")
+ expect(string).to include("select * from users")
+ expect(string).to include("duration_ms")
+ expect(string).to include("\"level\":\"debug\"")
+ expect(string).to include("\"sql_query_executed\":")
+ end
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/config_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/config_spec.rb
new file mode 100644
index 000000000..42af0e69c
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/config_spec.rb
@@ -0,0 +1,30 @@
+require "singleton"
+require "spec_helper"
+
+RSpec.describe Timber::Config, :rails_23 => true do
+ let(:config) { Timber::Config.send(:new) }
+
+ describe ".logrageify!" do
+ it "should logrageify!" do
+ expect(Timber::Integrations::ActionController.silence?).to eq(false)
+ expect(Timber::Integrations::ActionView.silence?).to eq(false)
+ expect(Timber::Integrations::ActiveRecord.silence?).to eq(false)
+ expect(Timber::Integrations::Rack::HTTPEvents.collapse_into_single_event?).to eq(false)
+
+
+ config.logrageify!
+
+ expect(Timber::Integrations::ActionController.silence?).to eq(true)
+ expect(Timber::Integrations::ActionView.silence?).to eq(true)
+ expect(Timber::Integrations::ActiveRecord.silence?).to eq(true)
+ expect(Timber::Integrations::Rack::HTTPEvents.collapse_into_single_event?).to eq(true)
+
+
+ # Reset
+ Timber::Integrations::ActionController.silence = false
+ Timber::Integrations::ActionView.silence = false
+ Timber::Integrations::ActiveRecord.silence = false
+ Timber::Integrations::Rack::HTTPEvents.collapse_into_single_event = false
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/error_event_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/error_event_spec.rb
new file mode 100644
index 000000000..f327d1451
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/error_event_spec.rb
@@ -0,0 +1,62 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::Rails::ErrorEvent do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::INFO
+ logger
+ end
+
+ around(:each) do |example|
+ class RackErrorController < ActionController::Base
+ layout nil
+
+ hook_name = respond_to?(:before_action) ? "before_action" : "before_filter"
+ send(hook_name) do
+ raise "Boom!"
+ end
+
+ def index
+ Thread.current[:_timber_context_snapshot] = Timber::CurrentContext.instance.snapshot
+ render json: {}
+ end
+
+ def method_for_action(action_name)
+ action_name
+ end
+ end
+
+ ::RailsApp.routes.draw do
+ get '/rack_error' => 'rack_error#index'
+ end
+
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+
+ Object.send(:remove_const, :RackErrorController)
+ end
+
+ describe "#process" do
+ it "should log the exception" do
+ allow(Benchmark).to receive(:ms).and_return(1).and_yield
+
+ expect { dispatch_rails_request("/rack_error") }.to raise_error(RuntimeError)
+
+ lines = clean_lines(io.string.split("\n"))
+
+ expect(lines.length).to eq(3)
+
+ expect(lines[0]).to include("Started GET \\\"/rack_error\\\"")
+ expect(lines[1]).to include("Processing by RackErrorController#index as HTML")
+ expect(lines[2]).to include("RuntimeError (Boom!)")
+ end
+ end
+
+ # Remove blank lines since Rails does this to space out requests in the logs
+ def clean_lines(lines)
+ lines.select { |line| !line.start_with?(" @metadat") }
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/http_context_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/http_context_spec.rb
new file mode 100644
index 000000000..170b8287e
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/http_context_spec.rb
@@ -0,0 +1,58 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::Rack::HTTPContext do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::INFO
+ logger
+ end
+
+ around(:each) do |example|
+ class RackHttpController < ActionController::Base
+ layout nil
+
+ def index
+ Thread.current[:_timber_context_snapshot] = Timber::CurrentContext.instance.snapshot
+ render json: {}
+ end
+
+ def method_for_action(action_name)
+ action_name
+ end
+ end
+
+ ::RailsApp.routes.draw do
+ get '/rack_http' => 'rack_http#index'
+ end
+
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+
+ Object.send(:remove_const, :RackHttpController)
+ end
+
+ describe "#process" do
+ it "should set the context" do
+ allow(Benchmark).to receive(:ms).and_return(1).and_yield
+
+ dispatch_rails_request("/rack_http")
+ http_context = Thread.current[:_timber_context_snapshot][:http]
+
+ expect(http_context).to eq({:host => "example.org", :method=>"GET", :path=>"/rack_http", :remote_addr=>"123.456.789.10", :request_id=>"unique-request-id-1234"})
+
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines.length).to eq(3)
+ lines.each do |line|
+ expect(line).to include("\"http\":{\"host\":\"example.org\",\"method\":\"GET\",\"path\":\"/rack_http\",\"remote_addr\":\"123.456.789.10\",\"request_id\":\"unique-request-id-1234\"}")
+ end
+ end
+ end
+
+ # Remove blank lines since Rails does this to space out requests in the logs
+ def clean_lines(lines)
+ lines.select { |line| !line.start_with?(" @metadat") }
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/http_events_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/http_events_spec.rb
new file mode 100644
index 000000000..b63b00fb2
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/http_events_spec.rb
@@ -0,0 +1,99 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::Rack::HTTPEvents do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::INFO
+ logger
+ end
+
+ around(:each) do |example|
+ class RackHttpController < ActionController::Base
+ layout nil
+
+ def index
+ Thread.current[:_timber_context_snapshot] = Timber::CurrentContext.instance.snapshot
+ render json: {}
+ end
+
+ def method_for_action(action_name)
+ action_name
+ end
+ end
+
+ ::RailsApp.routes.draw do
+ get '/rack_http' => 'rack_http#index'
+ end
+
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+
+ Object.send(:remove_const, :RackHttpController)
+ end
+
+ describe "#process" do
+ it "should log the events" do
+ allow(Benchmark).to receive(:ms).and_return(1).and_yield
+
+ dispatch_rails_request("/rack_http")
+
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines.length).to eq(3)
+
+ expect(lines[0]).to include("Started GET \\\"/rack_http\\\"")
+ expect(lines[1]).to include("Processing by RackHttpController#index as HTML")
+ expect(lines[2]).to include("Completed 200 OK in 0.0ms")
+ end
+
+ context "with the route silenced" do
+ around(:each) do |example|
+ described_class.silence_request = lambda do |rack_env, rack_request|
+ rack_request.path == "/rack_http"
+ end
+
+ example.run
+
+ described_class.silence_request = nil
+ end
+
+ it "should silence the logs" do
+ allow(Benchmark).to receive(:ms).and_return(1).and_yield
+
+ dispatch_rails_request("/rack_http")
+
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines.length).to eq(0)
+ end
+ end
+
+ context "collapsed into a single event" do
+ around(:each) do |example|
+ described_class.collapse_into_single_event = true
+
+ example.run
+
+ described_class.collapse_into_single_event = nil
+ end
+
+ it "should silence the logs" do
+ allow(Benchmark).to receive(:ms).and_return(1).and_yield
+
+ dispatch_rails_request("/rack_http")
+
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines.length).to eq(2)
+
+ expect(lines[0]).to include("Processing by RackHttpController#index as HTML")
+ expect(lines[1]).to include("GET /rack_http completed with 200 OK in 0.0ms")
+ end
+ end
+ end
+
+ # Remove blank lines since Rails does this to space out requests in the logs
+ def clean_lines(lines)
+ lines.select { |line| !line.start_with?(" @metadat") }
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/logger_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/logger_spec.rb
new file mode 100644
index 000000000..dfd6bf64e
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/logger_spec.rb
@@ -0,0 +1,16 @@
+require "spec_helper"
+
+RSpec.describe Timber::Logger, :rails_23 => true do
+ describe "#silence" do
+ let(:io) { StringIO.new }
+ let(:logger) { Timber::Logger.new(io) }
+
+ it "should silence the logs" do
+ logger.silence do
+ logger.info("test")
+ end
+
+ expect(io.string).to eq("")
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/rack_logger_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/rack_logger_spec.rb
new file mode 100644
index 000000000..eb46e0755
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/rack_logger_spec.rb
@@ -0,0 +1,56 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::Rails::RackLogger do
+ describe described_class::InstanceMethods do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::INFO
+ logger
+ end
+
+ around(:each) do |example|
+ class RailsRackLoggerController < ActionController::Base
+ layout nil
+
+ def index
+ render json: {}
+ end
+
+ def method_for_action(action_name)
+ action_name
+ end
+ end
+
+ ::RailsApp.routes.draw do
+ get '/rails_rack_logger' => 'rails_rack_logger#index'
+ end
+
+ with_rails_logger(logger) do
+ Timecop.freeze(time) { example.run }
+ end
+
+ Object.send(:remove_const, :RailsRackLoggerController)
+ end
+
+ describe "#started_request_message" do
+ it "should mute the default rails logs" do
+ allow(::Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production")) # Rails 3.2.X
+
+ dispatch_rails_request("/rails_rack_logger")
+
+ lines = clean_lines(io.string.split("\n"))
+ expect(lines.length).to eq(3)
+ expect(lines[0]).to include("Started GET \\\"/rails_rack_logger\\\"")
+ expect(lines[1]).to include("Processing by RailsRackLoggerController#index as HTML")
+ expect(lines[2]).to include("Completed 200 OK in 0.0ms")
+ end
+ end
+ end
+
+ # Remove blank lines since Rails does this to space out requests in the logs
+ def clean_lines(lines)
+ lines.select { |line| !line.start_with?(" @metadat") }
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/session_context_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/session_context_spec.rb
new file mode 100644
index 000000000..2a9d76ce3
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/session_context_spec.rb
@@ -0,0 +1,11 @@
+require "spec_helper"
+
+RSpec.describe Timber::Integrations::Rails::SessionContext do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) do
+ logger = Timber::Logger.new(io)
+ logger.level = ::Logger::INFO
+ logger
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/tagged_logging_spec.rb b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/tagged_logging_spec.rb
new file mode 100644
index 000000000..2c564d082
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/spec/timber-rails/tagged_logging_spec.rb
@@ -0,0 +1,29 @@
+require "spec_helper"
+
+RSpec.describe ActiveSupport::TaggedLogging, :rails_23 => true do
+ describe "#new" do
+ let(:io) { StringIO.new }
+
+ it "should instantiate for Timber::Logger object" do
+ ActiveSupport::TaggedLogging.new(Timber::Logger.new(io))
+ end
+
+ if defined?(ActiveSupport::BufferedLogger)
+ it "should instantiate for a ActiveSupport::BufferedLogger object" do
+ ActiveSupport::TaggedLogging.new(ActiveSupport::BufferedLogger.new(io))
+ end
+ end
+ end
+
+ describe "#info" do
+ let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
+ let(:io) { StringIO.new }
+ let(:logger) { ActiveSupport::TaggedLogging.new(Timber::Logger.new(io)) }
+
+ it "should accept events as the second argument" do
+ logger.info("SQL query", payment_rejected: {customer_id: "abcd1234", amount: 100, reason: "Card expired"})
+ expect(io.string).to include("SQL query")
+ expect(io.string).to include("\"payment_rejected\":")
+ end
+ end
+end
diff --git a/vendor/cache/timber-ruby-rails-250326b0926d/timber-rails.gemspec b/vendor/cache/timber-ruby-rails-250326b0926d/timber-rails.gemspec
new file mode 100644
index 000000000..e2ba9c652
--- /dev/null
+++ b/vendor/cache/timber-ruby-rails-250326b0926d/timber-rails.gemspec
@@ -0,0 +1,55 @@
+# -*- encoding: utf-8 -*-
+# stub: timber-rails 1.0.2 ruby lib
+
+Gem::Specification.new do |s|
+ s.name = "timber-rails".freeze
+ s.version = "1.0.2"
+
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+ s.metadata = { "changelog_uri" => "https://github.com/timberio/timber-ruby-rails/blob/master/README.md", "homepage_uri" => "https://docs.timber.io/languages/ruby/", "source_code_uri" => "https://github.com/timberio/timber-ruby-rails" } if s.respond_to? :metadata=
+ s.require_paths = ["lib".freeze]
+ s.authors = ["Timber Technologies, Inc.".freeze]
+ s.bindir = "exe".freeze
+ s.date = "2020-06-01"
+ s.email = ["hi@timber.io".freeze]
+ s.files = [".gitignore".freeze, ".rspec".freeze, ".travis.yml".freeze, "Gemfile".freeze, "LICENSE.md".freeze, "README.md".freeze, "Rakefile".freeze, "bin/console".freeze, "bin/setup".freeze, "gemfiles/rails-3.0.gemfile".freeze, "gemfiles/rails-3.1.gemfile".freeze, "gemfiles/rails-3.2.gemfile".freeze, "gemfiles/rails-4.0.gemfile".freeze, "gemfiles/rails-4.1.gemfile".freeze, "gemfiles/rails-4.2.gemfile".freeze, "gemfiles/rails-5.0.gemfile".freeze, "gemfiles/rails-5.1.gemfile".freeze, "gemfiles/rails-5.2.gemfile".freeze, "gemfiles/rails-6.0.gemfile".freeze, "gemfiles/rails-edge.gemfile".freeze, "lib/timber-rails.rb".freeze, "lib/timber-rails/action_controller.rb".freeze, "lib/timber-rails/action_controller/log_subscriber.rb".freeze, "lib/timber-rails/action_controller/log_subscriber/timber_log_subscriber.rb".freeze, "lib/timber-rails/action_dispatch.rb".freeze, "lib/timber-rails/action_dispatch/debug_exceptions.rb".freeze, "lib/timber-rails/action_view.rb".freeze, "lib/timber-rails/action_view/log_subscriber.rb".freeze, "lib/timber-rails/action_view/log_subscriber/timber_log_subscriber.rb".freeze, "lib/timber-rails/active_record.rb".freeze, "lib/timber-rails/active_record/log_subscriber.rb".freeze, "lib/timber-rails/active_record/log_subscriber/timber_log_subscriber.rb".freeze, "lib/timber-rails/active_support_log_subscriber.rb".freeze, "lib/timber-rails/config.rb".freeze, "lib/timber-rails/config/action_controller.rb".freeze, "lib/timber-rails/config/action_view.rb".freeze, "lib/timber-rails/config/active_record.rb".freeze, "lib/timber-rails/error_event.rb".freeze, "lib/timber-rails/logger.rb".freeze, "lib/timber-rails/overrides.rb".freeze, "lib/timber-rails/overrides/active_support_3_tagged_logging.rb".freeze, "lib/timber-rails/overrides/active_support_buffered_logger.rb".freeze, "lib/timber-rails/overrides/active_support_tagged_logging.rb".freeze, "lib/timber-rails/overrides/lograge.rb".freeze, "lib/timber-rails/overrides/rails_stdout_logging.rb".freeze, "lib/timber-rails/rack_logger.rb".freeze, "lib/timber-rails/railtie.rb".freeze, "lib/timber-rails/session_context.rb".freeze, "lib/timber-rails/version.rb".freeze, "timber-rails.gemspec".freeze]
+ s.homepage = "https://docs.timber.io/languages/ruby/".freeze
+ s.licenses = ["ISC".freeze]
+ s.required_ruby_version = Gem::Requirement.new(">= 1.9.0".freeze)
+ s.rubygems_version = "3.1.2".freeze
+ s.summary = "Timber.io Rails integration".freeze
+
+ s.installed_by_version = "3.1.2" if s.respond_to? :installed_by_version
+
+ if s.respond_to? :specification_version then
+ s.specification_version = 4
+ end
+
+ if s.respond_to? :add_runtime_dependency then
+ s.add_runtime_dependency(%q.freeze, [">= 3.0.0"])
+ s.add_runtime_dependency(%q.freeze, ["~> 3.0"])
+ s.add_runtime_dependency(%q.freeze, ["~> 1.0"])
+ s.add_development_dependency(%q.freeze, [">= 0.0"])
+ s.add_development_dependency(%q.freeze, [">= 0.8"])
+ s.add_development_dependency(%q.freeze, ["~> 3.0"])
+ s.add_development_dependency(%q.freeze, [">= 0"])
+ s.add_development_dependency(%q.freeze, [">= 0"])
+ s.add_development_dependency(%q.freeze, [">= 0"])
+ s.add_development_dependency(%q.freeze, [">= 0"])
+ s.add_development_dependency(%q.freeze, ["= 1.3.13"])
+ s.add_development_dependency(%q.freeze, ["~> 2.3"])
+ else
+ s.add_dependency(%q.freeze, [">= 3.0.0"])
+ s.add_dependency(%q.freeze, ["~> 3.0"])
+ s.add_dependency(%q.freeze, ["~> 1.0"])
+ s.add_dependency(%q.freeze, [">= 0.0"])
+ s.add_dependency(%q.freeze, [">= 0.8"])
+ s.add_dependency(%q.freeze, ["~> 3.0"])
+ s.add_dependency(%q.freeze, [">= 0"])
+ s.add_dependency(%q.freeze, [">= 0"])
+ s.add_dependency(%q.freeze, [">= 0"])
+ s.add_dependency(%q.freeze, [">= 0"])
+ s.add_dependency(%q.freeze, ["= 1.3.13"])
+ s.add_dependency(%q.freeze, ["~> 2.3"])
+ end
+end
diff --git a/vendor/cache/websocket-driver-0.7.1.gem b/vendor/cache/websocket-driver-0.7.1.gem
deleted file mode 100644
index b32e50e9a..000000000
Binary files a/vendor/cache/websocket-driver-0.7.1.gem and /dev/null differ
diff --git a/vendor/cache/websocket-driver-0.7.2.gem b/vendor/cache/websocket-driver-0.7.2.gem
new file mode 100644
index 000000000..67b83033d
Binary files /dev/null and b/vendor/cache/websocket-driver-0.7.2.gem differ
diff --git a/vendor/cache/zeitwerk-2.3.0.gem b/vendor/cache/zeitwerk-2.3.0.gem
new file mode 100644
index 000000000..3fa3ea9da
Binary files /dev/null and b/vendor/cache/zeitwerk-2.3.0.gem differ