class Gemsearch::Runner

Attributes

exit_string[R]
fetcher[R]
index[RW]
installer[R]
last_response[RW]
prompt[R]
query[RW]
spinner[R]
spinner_enabled[R]
test_mode[R]
utils[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/gemsearch.rb, line 12
def initialize(opts = {})
  @query            = ""
  @last_response    = []
  @index            = -1

  @spinner          = opts.fetch(:spinner) { TTY::Spinner.new("[:spinner] Searching") }
  @prompt           = opts.fetch(:prompt) { TTY::Prompt.new }
  @spinner_enabled  = opts.fetch(:spinner_enabled) { true }
  @test_mode        = opts.fetch(:test_mode) { false }
  @exit_string      = opts.fetch(:exit_string) { "exit" }

  @utils            = Utils.new(prompt: @prompt,
                                spinner: @spinner,
                                spinner_enabled: @spinner_enabled)
  @fetcher          = Fetcher.new
  @installer        = Installer.new(prompt: @prompt)
end

Public Instance Methods

start() click to toggle source
# File lib/gemsearch.rb, line 30
def start
  utils.temp_hide_cursor do
    loop do
      print_prompt
      print_results
      handle_input
      break if test_mode && query == exit_string
    end
  end
end

Private Instance Methods

after_enter() click to toggle source
# File lib/gemsearch.rb, line 134
def after_enter
  clear_screen(query.length > 0 ? 2 : 1)
  self.query = ""
  self.index = last_response.empty? ? -1 : 0
end
clear_screen(n = 1) click to toggle source
# File lib/gemsearch.rb, line 109
def clear_screen(n = 1)
  $stdout.print(prompt.clear_lines((prompt_line + results.join).count("\n") + n) + prompt.cursor.clear_screen_down)
end
delete_last_char() click to toggle source
# File lib/gemsearch.rb, line 113
def delete_last_char
  self.query = query[0..-2]
end
handle_backspace() click to toggle source
# File lib/gemsearch.rb, line 117
def handle_backspace
  delete_last_char
  clear_screen
end
handle_enter() click to toggle source
# File lib/gemsearch.rb, line 122
def handle_enter
  if query.length > 0
    utils.with_spinner do
      self.last_response = fetcher.fetch(query)[0..3]
    end
  else
    install
  end

  after_enter
end
handle_input() click to toggle source
# File lib/gemsearch.rb, line 61
def handle_input
  input = prompt.read_char

  case input
  when /#{Regexp.escape(KEYS[:arrow_up])}|#{Regexp.escape(KEYS[:ctrl_k])}/
    clear_screen
    self.index -= 1 if index > 0
  when /#{Regexp.escape(KEYS[:arrow_down])}|#{Regexp.escape(KEYS[:ctrl_j])}/
    clear_screen
    self.index += 1 if index < last_response.length - 1
  when /#{Regexp.escape(KEYS[:backspace])}/
    handle_backspace
  when /#{Regexp.escape(KEYS[:enter])}/
    handle_enter
  else
    query << input
    clear_screen
  end
end
install() click to toggle source
# File lib/gemsearch.rb, line 140
def install
  return if last_response.empty?

  installer.install(selected_gem)
end
print_prompt() click to toggle source
print_results() click to toggle source
prompt_line() click to toggle source
# File lib/gemsearch.rb, line 57
def prompt_line
  "📦  " + prompt.decorate("Search:", :bold) + " #{query}\n\n"
end
result_line(object) click to toggle source
# File lib/gemsearch.rb, line 91
def result_line(object)
  "#{utils.humanize_number(object["downloads"])}".ljust(7) +
  "#{utils.remove_special_characters(utils.truncate(object["name"], 23))}".ljust(23) +
  "#{utils.remove_special_characters(utils.truncate(object["info"], 45)).strip}".ljust(45) + 
  "\n"
end
results() click to toggle source
# File lib/gemsearch.rb, line 81
def results
  ([""] * 5).zip(last_response).map do |_, object| 
    if object
      result_line(object)
    else
      "\n"
    end
  end
end
selected_gem() click to toggle source
# File lib/gemsearch.rb, line 146
def selected_gem
  last_response[index]
end