lib/mini_profiler/config.rb
# frozen_string_literal: true
module Rack
class MiniProfiler
class Config
def self.attr_accessor(*vars)
@attributes ||= []
@attributes.concat vars
super(*vars)
end
def self.attributes
@attributes
end
def self.default
new.instance_eval {
@auto_inject = true # automatically inject on every html page
@base_url_path = "/mini-profiler-resources/".dup
@cookie_path = "/".dup
@disable_caching = true
# called prior to rack chain, to ensure we are allowed to profile
@pre_authorize_cb = lambda { |env| true }
# called after rack chain, to ensure we are REALLY allowed to profile
@skip_schema_queries = false
@storage = MiniProfiler::MemoryStore
@user_provider = Proc.new { |env| Rack::Request.new(env).ip }
@authorization_mode = :allow_all
@backtrace_threshold_ms = 0
@flamegraph_sample_rate = 0.5
@flamegraph_mode = :wall
@flamegraph_ignore_gc = false
@storage_failure = Proc.new do |exception|
if @logger
@logger.warn("MiniProfiler storage failure: #{exception.message}")
end
end
@enabled = true
@max_sql_param_length = 0 # disable sql parameter collection by default
@skip_sql_param_names = /password/ # skips parameters with the name password by default
@enable_advanced_debugging_tools = false
@snapshot_every_n_requests = -1
@max_snapshot_groups = 50
@max_snapshots_per_group = 15
# ui parameters
@autorized = true
@collapse_results = true
@max_traces_to_show = 20
@show_children = false
@show_controls = false
@show_trivial = false
@show_total_sql_count = false
@start_hidden = false
@toggle_shortcut = 'alt+p'
@html_container = 'body'
@position = "top-left"
@snapshot_hidden_custom_fields = []
@snapshots_transport_destination_url = nil
@snapshots_transport_auth_key = nil
@snapshots_redact_sql_queries = true
@snapshots_transport_gzip_requests = false
@enable_hotwire_turbo_drive_support = false
@profile_parameter = "pp"
self
}
end
attr_accessor :authorization_mode, :auto_inject, :backtrace_ignores,
:backtrace_includes, :backtrace_remove, :backtrace_threshold_ms,
:base_url_path, :cookie_path, :disable_caching, :enabled,
:flamegraph_sample_rate, :logger, :pre_authorize_cb, :skip_paths,
:skip_schema_queries, :storage, :storage_failure, :storage_instance,
:storage_options, :user_provider, :enable_advanced_debugging_tools,
:skip_sql_param_names, :suppress_encoding, :max_sql_param_length,
:content_security_policy_nonce, :enable_hotwire_turbo_drive_support,
:flamegraph_mode, :flamegraph_ignore_gc, :profile_parameter
# ui accessors
attr_accessor :collapse_results, :max_traces_to_show, :position,
:show_children, :show_controls, :show_trivial, :show_total_sql_count,
:start_hidden, :toggle_shortcut, :html_container
# snapshot related config
attr_accessor :snapshot_every_n_requests, :max_snapshots_per_group,
:snapshot_hidden_custom_fields, :snapshots_transport_destination_url,
:snapshots_transport_auth_key, :snapshots_redact_sql_queries,
:snapshots_transport_gzip_requests, :max_snapshot_groups
# Deprecated options
attr_accessor :use_existing_jquery
attr_reader :assets_url
# redefined - since the accessor defines it first
undef :authorization_mode=
# rubocop:disable Lint/DuplicateMethods
def authorization_mode=(mode)
# rubocop:enable Lint/DuplicateMethods
if mode == :whitelist
warn "[DEPRECATION] `:whitelist` authorization mode is deprecated. Please use `:allow_authorized` instead."
mode = :allow_authorized
end
warn <<~DEP unless mode == :allow_authorized || mode == :allow_all
[DEPRECATION] unknown authorization mode #{mode}. Expected `:allow_all` or `:allow_authorized`.
DEP
@authorization_mode = mode
end
def assets_url=(lmbda)
if defined?(Rack::MiniProfilerRails)
Rack::MiniProfilerRails.create_engine
end
@assets_url = lmbda
end
def vertical_position
position.include?('bottom') ? 'bottom' : 'top'
end
def horizontal_position
position.include?('right') ? 'right' : 'left'
end
def merge!(config)
if config
if Hash === config
config.each { |k, v| instance_variable_set "@#{k}", v }
else
self.class.attributes.each { |k|
v = config.send k
instance_variable_set "@#{k}", v if v
}
end
end
end
end
end
end