Module: Lowline
- Defined in:
- lib/lowline.rb
Instance Method Summary collapse
- #ask(q, opts = {}) ⇒ Object
- #ask_for_many(plural_name, name = nil) ⇒ Object
- #ask_for_selection(stuff, name, to_string = :to_s) ⇒ Object
- #ask_multiline(q) ⇒ Object
- #ask_via_editor(q, default = nil) ⇒ Object
- #ask_yon(q) ⇒ Object
- #run_editor {|f| ... } ⇒ Object
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
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 |