class Appsignal::CLI::Diagnose::Paths

def gem_path

this gem when installed.
Returns the AppSignal gem installation path. The root directory of
def gem_path
  gemspec.full_gem_path
end

def gemspec

def gemspec
  Gem.loaded_specs["appsignal"]
end

def makefile_install_log_path

Returns the AppSignal gem's Makefile log path, if it exists.
def makefile_install_log_path
  possible_locations = [
    # Installed gem location
    File.join(gemspec.extension_dir, "mkmf.log"),
    # Local development location
    File.join(gem_path, "ext", "mkmf.log")
  ]
  possible_locations.find do |location|
    File.exist?(location)
  end || possible_locations.first
end

def path_stat(path)

def path_stat(path)
  {
    :path => path,
    :exists => false
  }.tap do |info|
    next unless info[:path]
    info[:exists] = File.exist?(path)
    next unless info[:exists]
    stat = File.stat(path)
    info[:type] = stat.directory? ? "directory" : "file"
    info[:mode] = format("%o", stat.mode)
    info[:writable] = stat.writable?
    path_uid = stat.uid
    path_gid = stat.gid
    info[:ownership] = {
      :uid => path_uid,
      :user => Utils.username_for_uid(path_uid),
      :gid => path_gid,
      :group => Utils.group_for_gid(path_gid)
    }
    if info[:type] == "file"
      begin
        info[:content] = Utils.read_file_content(
          path,
          BYTES_TO_READ_FOR_FILES
        ).split("\n")
      rescue => error
        info[:read_error] = "#{error.class}: #{error.message}"
      end
    end
  end
end

def paths

def paths
  @paths ||=
    begin
      config = Appsignal.config
      log_file_path = config.log_file_path
      {
        :package_install_path => {
          :label => "AppSignal gem path",
          :path => gem_path
        },
        :working_dir => {
          :label => "Current working directory",
          :path => Dir.pwd
        },
        :root_path => {
          :label => "Root path",
          :path => config.root_path
        },
        :log_dir_path => {
          :label => "Log directory",
          :path => log_file_path ? File.dirname(log_file_path) : ""
        },
        "ext/mkmf.log" => {
          :label => "Makefile install log",
          :path => makefile_install_log_path
        },
        "appsignal.log" => {
          :label => "AppSignal log",
          :path => log_file_path
        }
      }
    end
end

def report

def report
  {}.tap do |hash|
    paths.each do |filename, config|
      hash[filename] = path_stat(config[:path])
    end
  end
end