Class: SpaceArchitect::Terminal

Inherits:
Object
  • Object
show all
Defined in:
lib/space_architect/terminal.rb

Constant Summary collapse

SPINNER_FRAMES =
%w[         ].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config:, stdout: $stdout, stderr: $stderr, color_mode: "auto") ⇒ Terminal

Returns a new instance of Terminal.



12
13
14
15
16
17
18
# File 'lib/space_architect/terminal.rb', line 12

def initialize(config:, stdout: $stdout, stderr: $stderr, color_mode: "auto")
  @config = config
  @stdout = stdout
  @stderr = stderr
  @color_mode = color_mode.to_s.downcase
  color_mode
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



10
11
12
# File 'lib/space_architect/terminal.rb', line 10

def config
  @config
end

#stderrObject (readonly)

Returns the value of attribute stderr.



10
11
12
# File 'lib/space_architect/terminal.rb', line 10

def stderr
  @stderr
end

#stdoutObject (readonly)

Returns the value of attribute stdout.



10
11
12
# File 'lib/space_architect/terminal.rb', line 10

def stdout
  @stdout
end

Instance Method Details

#error(message) ⇒ Object



32
33
34
# File 'lib/space_architect/terminal.rb', line 32

def error(message)
  stderr.puts(colors_enabled? ? pastel.red(message) : message)
end

#interactive?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/space_architect/terminal.rb', line 20

def interactive?
  stderr.tty?
end

#pastelObject



24
25
26
# File 'lib/space_architect/terminal.rb', line 24

def pastel
  @pastel ||= Pastel.new(enabled: colors_enabled?)
end

#path(path) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/space_architect/terminal.rb', line 50

def path(path)
  value = path.to_s
  homes.each do |home|
    return "~" if value == home
    return "~#{value.delete_prefix(home)}" if value.start_with?("#{home}/")
  end

  value
end

#say(message = "") ⇒ Object



28
29
30
# File 'lib/space_architect/terminal.rb', line 28

def say(message = "")
  stdout.puts(message)
end

#success(message) ⇒ Object



36
37
38
# File 'lib/space_architect/terminal.rb', line 36

def success(message)
  say pastel.green(message)
end

#table(headers, rows) ⇒ Object



40
41
42
43
44
45
46
47
48
# File 'lib/space_architect/terminal.rb', line 40

def table(headers, rows)
  column_widths = headers.each_index.map do |index|
    ([headers[index]] + rows.map { |row| row[index].to_s }).map(&:length).max
  end

  ([headers] + rows).each_with_index.map do |row, row_index|
    table_row(headers, row, column_widths, header: row_index.zero?)
  end.join("\n")
end

#with_spinner(message) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/space_architect/terminal.rb', line 60

def with_spinner(message)
  return yield unless interactive?

  Async do |task|
    spinner_task = start_spinner(task, message)
    yield
  ensure
    spinner_task&.stop
    begin
      spinner_task&.wait
    rescue StandardError
      nil
    end
    clear_spinner
  end.wait
end