class Pry::History

both internally and within Readline.
The History class is responsible for maintaining the user’s input history,

def self.default_file

def self.default_file
  history_file =
    if (xdg_home = Pry::Env['XDG_DATA_HOME'])
      # See XDG Base Directory Specification at
      # https://standards.freedesktop.org/basedir-spec/basedir-spec-0.8.html
      xdg_home + '/pry/pry_history'
    elsif File.exist?(File.expand_path('~/.pry_history'))
      '~/.pry_history'
    else
      '~/.local/share/pry/pry_history'
    end
  File.expand_path(history_file)
end

def clear

history file.
Clear this session's history. This won't affect the contents of the
def clear
  @history.clear
  @history_line_count = 0
  @original_lines = 0
end

def filter(history)

Returns:
  • (Array) - An array containing all the lines that are not
def filter(history)
  history.select { |l| l unless should_ignore?(l) }
end

def history_file

The history file, opened for appending.
def history_file
  if defined?(@history_file)
    @history_file
  else
    unless File.exist?(history_file_path)
      FileUtils.mkdir_p(File.dirname(history_file_path))
    end
    @history_file = File.open(history_file_path, 'a', 0o600).tap do |file|
      file.sync = true
    end
  end
rescue SystemCallError => error
  warn "Unable to write history file: #{error.message}"
  @history_file = false
end

def history_file_path

def history_file_path
  File.expand_path(@file_path || Pry.config.history_file)
end

def initialize(options = {})

def initialize(options = {})
  @history = options[:history] || []
  @history_line_count = @history.count
  @file_path = options[:file_path]
  @original_lines = 0
  @loader = method(:read_from_file)
  @saver = method(:save_to_file)
end

def invalid_readline_line?(line)

def invalid_readline_line?(line)
  # `Readline::HISTORY << line` raises an `ArgumentError` if `line`
  # includes a null byte
  line.include?("\0")
end

def load

Returns:
  • (Integer) - The number of lines loaded
def load
  @loader.call do |line|
    next if invalid_readline_line?(line)
    @history << line.chomp
    @original_lines += 1
    @history_line_count += 1
  end
end

def push(line)

Returns:
  • (String) - The same line that was passed in

Parameters:
  • line (String) --
def push(line)
  return line if line.empty? || invalid_readline_line?(line)
  begin
    last_line = @history[-1]
  rescue IndexError
    last_line = nil
  end
  return line if line == last_line
  @history << line
  @history_line_count += 1
  @saver.call(line) if !should_ignore?(line) && Pry.config.history_save
  line
end

def read_from_file

The default loader. Yields lines from `Pry.config.history_file`.
def read_from_file
  path = history_file_path
  File.foreach(path) { |line| yield(line) } if File.exist?(path)
rescue SystemCallError => error
  warn "Unable to read history file: #{error.message}"
end

def save_to_file(line)

The default saver. Appends the given line to `Pry.config.history_file`.
def save_to_file(line)
  history_file.puts line if history_file
end

def session_line_count

Returns:
  • (Fixnum) - The number of lines in history from just this session.
def session_line_count
  @history_line_count - @original_lines
end

def should_ignore?(line)

Returns:
  • (Boolean) - a boolean that notifies if the line was found in the
def should_ignore?(line)
  hist_ignore = Pry.config.history_ignorelist
  return false if hist_ignore.nil? || hist_ignore.empty?
  hist_ignore.any? { |p| line.to_s.match(p) }
end

def to_a

Returns:
  • (Array) - An Array containing all lines of history loaded
def to_a
  @history.to_a
end