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
# File lib/gemsearch.rb, line 105 def print_prompt $stdout.print prompt_line end
print_results()
click to toggle source
# File lib/gemsearch.rb, line 98 def print_results results.each_with_index do |r, i| selected = i == index $stdout.print prompt.decorate("#{selected ? ">" : " "} #{r}", selected ? :bright_blue : :bright_black) end end
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