Module: Lowline

Defined in:
lib/lowline.rb

Instance Method Summary collapse

Instance Method Details

#ask(q, opts = {}) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/lowline.rb', line 71

def ask q, opts={}
  default_s = case opts[:default]
    when nil; nil
    when ""; " (enter for none)"
    else; " (enter for #{opts[:default].inspect})"
  end

  tail = case q
    when /[:?]$/; " "
    when /[:?]\s+$/; ""
    else; ": "
  end

  while true
    print [q, default_s, tail].compact.join
    ans = gets.strip
    if opts[:default]
      ans = opts[:default] if ans.blank?
    else
      next if ans.blank? && !opts[:empty_ok]
    end
    break ans unless (opts[:restrict] && ans !~ opts[:restrict])
  end
end

#ask_for_many(plural_name, name = nil) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/lowline.rb', line 135

def ask_for_many plural_name, name=nil
  name ||= plural_name.gsub(/s$/, "")
  stuff = []

  while true
    puts
    puts "Current #{plural_name}:"
    if stuff.empty?
      puts "None!"
    else
      stuff.each_with_index { |c, i| puts "  #{i + 1}) #{c}" }
    end
    puts
    ans = ask "(A)dd #{name}, (r)emove #{name}, or (d)one"
    case ans
    when "a", "A"
      ans = ask "#{name.ucfirst} name", ""
      stuff << ans unless ans =~ /^\s*$/
    when "r", "R"
      ans = ask "Remove which component? (1--#{stuff.size})"
      stuff.delete_at(ans.to_i - 1) if ans
    when "d", "D"
      break
    end
  end
  stuff
end

#ask_for_selection(stuff, name, to_string = :to_s) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/lowline.rb', line 163

def ask_for_selection stuff, name, to_string=:to_s
  puts "Choose a #{name}:"
  stuff.each_with_index do |c, i|
    pretty = case to_string
    when block_given? && to_string # heh
      yield c
    when Symbol
      c.send to_string
    when Proc
      to_string.call c
    else
      raise ArgumentError, "unknown to_string argument type; expecting Proc or Symbol"
    end
    puts "  #{i + 1}) #{pretty}"
  end

  j = while true
    i = ask "#{name.ucfirst} (1--#{stuff.size})"
    break i.to_i if i && (1 .. stuff.size).member?(i.to_i)
  end

  stuff[j - 1]
end

#ask_multiline(q) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/lowline.rb', line 108

def ask_multiline q
  puts "#{q} (ctrl-d, ., or /stop to stop, /edit to edit, /reset to reset):"
  ans = ""
  while true
    print "> "
    case(line = gets) && line.strip!
    when /^\.$/, nil, "/stop"
      break
    when "/reset"
      return ask_multiline(q)
    when "/edit"
      return ask_via_editor(q, ans)
    else
      ans << line + "\n"
    end
  end
  ans.multistrip
end

#ask_via_editor(q, default = nil) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/lowline.rb', line 96

def ask_via_editor q, default=nil
  fn = run_editor do |f|
    f.puts q.gsub(/^/, "## ")
    f.puts "##"
    f.puts "## Enter your text below. Lines starting with a '#' will be ignored."
    f.puts
    f.puts default if default
  end
  return unless fn
  IO.read(fn).gsub(/^#.*$/, "").multistrip
end

#ask_yon(q) ⇒ Object



127
128
129
130
131
132
133
# File 'lib/lowline.rb', line 127

def ask_yon q
  while true
    print "#{q} (y/n): "
    a = gets.strip
    break a if a =~ /^[yn]$/i
  end =~ /y/i
end

#run_editor {|f| ... } ⇒ Object

Yields:

  • (f)


57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/lowline.rb', line 57

def run_editor
  f = Tempfile.new "ditz"
  yield f
  f.close

  editor = ENV["EDITOR"] || "/usr/bin/vi"
  cmd = "#{editor} #{f.path.inspect}"

  mtime = File.mtime f.path
  system cmd or raise Error, "cannot execute command: #{cmd.inspect}"

  File.mtime(f.path) == mtime ? nil : f.path
end