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 + +[![ISC License](https://img.shields.io/badge/license-ISC-ff69b4.svg)](LICENSE.md) +[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/timberio/timber-ruby-rails) +[![Build Status](https://travis-ci.org/timberio/timber-ruby-rails.svg?branch=master)](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