lib/dial/railtie.rb



# frozen_string_literal: true

require "rails"
require "active_record"
require "prosopite"

require_relative "middleware"
require_relative "prosopite_logger"

module Dial
  class Railtie < ::Rails::Railtie
    initializer "dial.use_middleware", after: :load_config_initializers do |app|
      app.middleware.insert_before 0, Middleware
    end

    initializer "dial.set_up_vernier", after: :load_config_initializers do |app|
      app.config.after_initialize do
        FileUtils.mkdir_p ::Rails.root.join VERNIER_PROFILE_OUT_RELATIVE_DIRNAME
      end
    end

    initializer "dial.clean_up_vernier_profile_out_files", after: :load_config_initializers do |app|
      stale_files("#{profile_out_dir_pathname}/*.json.gz").each do |profile_out_file|
        File.delete profile_out_file rescue nil
      end
    end

    initializer "dial.set_up_prosopite", after: :load_config_initializers do |app|
      app.config.after_initialize do
        if ::ActiveRecord::Base.configurations.configurations.any? { |config| config.adapter == "postgresql" }
          require "pg_query"
        end

        ::Prosopite.custom_logger = ProsopiteLogger.new PROSOPITE_LOG_IO
      end
    end

    initializer "dial.setup", after: :load_config_initializers do |app|
      app.config.after_initialize do
        Dial._configuration.freeze

        ::Prosopite.ignore_queries = Dial._configuration.prosopite_ignore_queries
      end
    end

    private

    def stale_files glob_pattern
      Dir.glob(glob_pattern).select do |file|
        timestamp = Util.uuid_timestamp Util.file_name_uuid File.basename file
        timestamp < Time.now - FILE_STALE_SECONDS
      end
    end

    def profile_out_dir_pathname
      ::Rails.root.join VERNIER_PROFILE_OUT_RELATIVE_DIRNAME
    end
  end
end