rtt 0.0.0.21 → 0.0.0.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/Manifest +1 -31
  2. data/Rakefile +2 -2
  3. data/db/rtt.sqlite3 +0 -0
  4. data/db/test.sqlite3 +0 -0
  5. data/lib/rtt.rb +3 -1
  6. data/lib/rtt/cmd_line_parser.rb +13 -1
  7. data/lib/rtt/storage.rb +12 -0
  8. data/rtt.gemspec +6 -6
  9. metadata +14 -36
  10. data/todo.txt +0 -1
  11. data/vendor/highline-1.5.2/CHANGELOG +0 -227
  12. data/vendor/highline-1.5.2/INSTALL +0 -41
  13. data/vendor/highline-1.5.2/LICENSE +0 -7
  14. data/vendor/highline-1.5.2/README +0 -63
  15. data/vendor/highline-1.5.2/Rakefile +0 -82
  16. data/vendor/highline-1.5.2/TODO +0 -6
  17. data/vendor/highline-1.5.2/examples/ansi_colors.rb +0 -38
  18. data/vendor/highline-1.5.2/examples/asking_for_arrays.rb +0 -18
  19. data/vendor/highline-1.5.2/examples/basic_usage.rb +0 -75
  20. data/vendor/highline-1.5.2/examples/color_scheme.rb +0 -32
  21. data/vendor/highline-1.5.2/examples/limit.rb +0 -12
  22. data/vendor/highline-1.5.2/examples/menus.rb +0 -65
  23. data/vendor/highline-1.5.2/examples/overwrite.rb +0 -19
  24. data/vendor/highline-1.5.2/examples/page_and_wrap.rb +0 -322
  25. data/vendor/highline-1.5.2/examples/password.rb +0 -7
  26. data/vendor/highline-1.5.2/examples/trapping_eof.rb +0 -22
  27. data/vendor/highline-1.5.2/examples/using_readline.rb +0 -17
  28. data/vendor/highline-1.5.2/lib/highline.rb +0 -758
  29. data/vendor/highline-1.5.2/lib/highline/color_scheme.rb +0 -120
  30. data/vendor/highline-1.5.2/lib/highline/compatibility.rb +0 -17
  31. data/vendor/highline-1.5.2/lib/highline/import.rb +0 -43
  32. data/vendor/highline-1.5.2/lib/highline/menu.rb +0 -395
  33. data/vendor/highline-1.5.2/lib/highline/question.rb +0 -463
  34. data/vendor/highline-1.5.2/lib/highline/system_extensions.rb +0 -240
  35. data/vendor/highline-1.5.2/setup.rb +0 -1360
  36. data/vendor/highline-1.5.2/test/tc_color_scheme.rb +0 -56
  37. data/vendor/highline-1.5.2/test/tc_highline.rb +0 -823
  38. data/vendor/highline-1.5.2/test/tc_import.rb +0 -54
  39. data/vendor/highline-1.5.2/test/tc_menu.rb +0 -429
  40. data/vendor/highline-1.5.2/test/ts_all.rb +0 -15
@@ -1,463 +0,0 @@
1
- #!/usr/local/bin/ruby -w
2
-
3
- # question.rb
4
- #
5
- # Created by James Edward Gray II on 2005-04-26.
6
- # Copyright 2005 Gray Productions. All rights reserved.
7
- #
8
- # This is Free Software. See LICENSE and COPYING for details.
9
-
10
- require "optparse"
11
- require "date"
12
- require "pathname"
13
-
14
- class HighLine
15
- #
16
- # Question objects contain all the details of a single invocation of
17
- # HighLine.ask(). The object is initialized by the parameters passed to
18
- # HighLine.ask() and then queried to make sure each step of the input
19
- # process is handled according to the users wishes.
20
- #
21
- class Question
22
- # An internal HighLine error. User code does not need to trap this.
23
- class NoAutoCompleteMatch < StandardError
24
- # do nothing, just creating a unique error type
25
- end
26
-
27
- #
28
- # Create an instance of HighLine::Question. Expects a _question_ to ask
29
- # (can be <tt>""</tt>) and an _answer_type_ to convert the answer to.
30
- # The _answer_type_ parameter must be a type recongnized by
31
- # Question.convert(). If given, a block is yeilded the new Question
32
- # object to allow custom initializaion.
33
- #
34
- def initialize( question, answer_type )
35
- # initialize instance data
36
- @question = question
37
- @answer_type = answer_type
38
-
39
- @character = nil
40
- @limit = nil
41
- @echo = true
42
- @readline = false
43
- @whitespace = :strip
44
- @case = nil
45
- @default = nil
46
- @validate = nil
47
- @above = nil
48
- @below = nil
49
- @in = nil
50
- @confirm = nil
51
- @gather = false
52
- @first_answer = nil
53
- @directory = Pathname.new(File.expand_path(File.dirname($0)))
54
- @glob = "*"
55
- @responses = Hash.new
56
- @overwrite = false
57
-
58
- # allow block to override settings
59
- yield self if block_given?
60
-
61
- # finalize responses based on settings
62
- build_responses
63
- end
64
-
65
- # The ERb template of the question to be asked.
66
- attr_accessor :question
67
- # The type that will be used to convert this answer.
68
- attr_accessor :answer_type
69
- #
70
- # Can be set to +true+ to use HighLine's cross-platform character reader
71
- # instead of fetching an entire line of input. (Note: HighLine's
72
- # character reader *ONLY* supports STDIN on Windows and Unix and may not
73
- # work correctly if STDIN is redirected.) Can also be set to <tt>:getc</tt>
74
- # to use that method on the input stream.
75
- #
76
- # *WARNING*: The _echo_ and _overwrite_ attributes for a question are
77
- # ignored when using the <tt>:getc</tt> method.
78
- #
79
- attr_accessor :character
80
- #
81
- # Allows you to set a character limit for input.
82
- #
83
- # *WARNING*: This option forces a character by character read.
84
- #
85
- attr_accessor :limit
86
- #
87
- # Can be set to +true+ or +false+ to control whether or not input will
88
- # be echoed back to the user. A setting of +true+ will cause echo to
89
- # match input, but any other true value will be treated as to String to
90
- # echo for each character typed.
91
- #
92
- # This requires HighLine's character reader. See the _character_
93
- # attribute for details.
94
- #
95
- # *Note*: When using HighLine to manage echo on Unix based systems, we
96
- # recommend installing the termios gem. Without it, it's possible to type
97
- # fast enough to have letters still show up (when reading character by
98
- # character only).
99
- #
100
- attr_accessor :echo
101
- #
102
- # Use the Readline library to fetch input. This allows input editing as
103
- # well as keeping a history. In addition, tab will auto-complete
104
- # within an Array of choices or a file listing.
105
- #
106
- # *WARNING*: This option is incompatible with all of HighLine's
107
- # character reading modes and it causes HighLine to ignore the
108
- # specified _input_ stream.
109
- #
110
- attr_accessor :readline
111
- #
112
- # Used to control whitespace processing for the answer to this question.
113
- # See HighLine::Question.remove_whitespace() for acceptable settings.
114
- #
115
- attr_accessor :whitespace
116
- #
117
- # Used to control character case processing for the answer to this question.
118
- # See HighLine::Question.change_case() for acceptable settings.
119
- #
120
- attr_accessor :case
121
- # Used to provide a default answer to this question.
122
- attr_accessor :default
123
- #
124
- # If set to a Regexp, the answer must match (before type conversion).
125
- # Can also be set to a Proc which will be called with the provided
126
- # answer to validate with a +true+ or +false+ return.
127
- #
128
- attr_accessor :validate
129
- # Used to control range checks for answer.
130
- attr_accessor :above, :below
131
- # If set, answer must pass an include?() check on this object.
132
- attr_accessor :in
133
- #
134
- # Asks a yes or no confirmation question, to ensure a user knows what
135
- # they have just agreed to. If set to +true+ the question will be,
136
- # "Are you sure? " Any other true value for this attribute is assumed
137
- # to be the question to ask. When +false+ or +nil+ (the default),
138
- # answers are not confirmed.
139
- #
140
- attr_accessor :confirm
141
- #
142
- # When set, the user will be prompted for multiple answers which will
143
- # be collected into an Array or Hash and returned as the final answer.
144
- #
145
- # You can set _gather_ to an Integer to have an Array of exactly that
146
- # many answers collected, or a String/Regexp to match an end input which
147
- # will not be returned in the Array.
148
- #
149
- # Optionally _gather_ can be set to a Hash. In this case, the question
150
- # will be asked once for each key and the answers will be returned in a
151
- # Hash, mapped by key. The <tt>@key</tt> variable is set before each
152
- # question is evaluated, so you can use it in your question.
153
- #
154
- attr_accessor :gather
155
- #
156
- # When set to a non *nil* value, this will be tried as an answer to the
157
- # question. If this answer passes validations, it will become the result
158
- # without the user ever being prompted. Otherwise this value is discarded,
159
- # and this Question is resolved as a normal call to HighLine.ask().
160
- #
161
- attr_writer :first_answer
162
- #
163
- # The directory from which a user will be allowed to select files, when
164
- # File or Pathname is specified as an _answer_type_. Initially set to
165
- # <tt>Pathname.new(File.expand_path(File.dirname($0)))</tt>.
166
- #
167
- attr_accessor :directory
168
- #
169
- # The glob pattern used to limit file selection when File or Pathname is
170
- # specified as an _answer_type_. Initially set to <tt>"*"</tt>.
171
- #
172
- attr_accessor :glob
173
- #
174
- # A Hash that stores the various responses used by HighLine to notify
175
- # the user. The currently used responses and their purpose are as
176
- # follows:
177
- #
178
- # <tt>:ambiguous_completion</tt>:: Used to notify the user of an
179
- # ambiguous answer the auto-completion
180
- # system cannot resolve.
181
- # <tt>:ask_on_error</tt>:: This is the question that will be
182
- # redisplayed to the user in the event
183
- # of an error. Can be set to
184
- # <tt>:question</tt> to repeat the
185
- # original question.
186
- # <tt>:invalid_type</tt>:: The error message shown when a type
187
- # conversion fails.
188
- # <tt>:no_completion</tt>:: Used to notify the user that their
189
- # selection does not have a valid
190
- # auto-completion match.
191
- # <tt>:not_in_range</tt>:: Used to notify the user that a
192
- # provided answer did not satisfy
193
- # the range requirement tests.
194
- # <tt>:not_valid</tt>:: The error message shown when
195
- # validation checks fail.
196
- #
197
- attr_reader :responses
198
- #
199
- # When set to +true+ the question is asked, but output does not progress to
200
- # the next line. The Cursor is moved back to the beginning of the question
201
- # line and it is cleared so that all the contents of the line disappear from
202
- # the screen.
203
- #
204
- attr_accessor :overwrite
205
-
206
- #
207
- # Returns the provided _answer_string_ or the default answer for this
208
- # Question if a default was set and the answer is empty.
209
- #
210
- def answer_or_default( answer_string )
211
- if answer_string.length == 0 and not @default.nil?
212
- @default
213
- else
214
- answer_string
215
- end
216
- end
217
-
218
- #
219
- # Called late in the initialization process to build intelligent
220
- # responses based on the details of this Question object.
221
- #
222
- def build_responses( )
223
- ### WARNING: This code is quasi-duplicated in ###
224
- ### Menu.update_responses(). Check there too when ###
225
- ### making changes! ###
226
- append_default unless default.nil?
227
- @responses = { :ambiguous_completion =>
228
- "Ambiguous choice. " +
229
- "Please choose one of #{@answer_type.inspect}.",
230
- :ask_on_error =>
231
- "? ",
232
- :invalid_type =>
233
- "You must enter a valid #{@answer_type}.",
234
- :no_completion =>
235
- "You must choose one of " +
236
- "#{@answer_type.inspect}.",
237
- :not_in_range =>
238
- "Your answer isn't within the expected range " +
239
- "(#{expected_range}).",
240
- :not_valid =>
241
- "Your answer isn't valid (must match " +
242
- "#{@validate.inspect})." }.merge(@responses)
243
- ### WARNING: This code is quasi-duplicated in ###
244
- ### Menu.update_responses(). Check there too when ###
245
- ### making changes! ###
246
- end
247
-
248
- #
249
- # Returns the provided _answer_string_ after changing character case by
250
- # the rules of this Question. Valid settings for whitespace are:
251
- #
252
- # +nil+:: Do not alter character case.
253
- # (Default.)
254
- # <tt>:up</tt>:: Calls upcase().
255
- # <tt>:upcase</tt>:: Calls upcase().
256
- # <tt>:down</tt>:: Calls downcase().
257
- # <tt>:downcase</tt>:: Calls downcase().
258
- # <tt>:capitalize</tt>:: Calls capitalize().
259
- #
260
- # An unrecognized choice (like <tt>:none</tt>) is treated as +nil+.
261
- #
262
- def change_case( answer_string )
263
- if [:up, :upcase].include?(@case)
264
- answer_string.upcase
265
- elsif [:down, :downcase].include?(@case)
266
- answer_string.downcase
267
- elsif @case == :capitalize
268
- answer_string.capitalize
269
- else
270
- answer_string
271
- end
272
- end
273
-
274
- #
275
- # Transforms the given _answer_string_ into the expected type for this
276
- # Question. Currently supported conversions are:
277
- #
278
- # <tt>[...]</tt>:: Answer must be a member of the passed Array.
279
- # Auto-completion is used to expand partial
280
- # answers.
281
- # <tt>lambda {...}</tt>:: Answer is passed to lambda for conversion.
282
- # Date:: Date.parse() is called with answer.
283
- # DateTime:: DateTime.parse() is called with answer.
284
- # File:: The entered file name is auto-completed in
285
- # terms of _directory_ + _glob_, opened, and
286
- # returned.
287
- # Float:: Answer is converted with Kernel.Float().
288
- # Integer:: Answer is converted with Kernel.Integer().
289
- # +nil+:: Answer is left in String format. (Default.)
290
- # Pathname:: Same as File, save that a Pathname object is
291
- # returned.
292
- # String:: Answer is converted with Kernel.String().
293
- # Regexp:: Answer is fed to Regexp.new().
294
- # Symbol:: The method to_sym() is called on answer and
295
- # the result returned.
296
- # <i>any other Class</i>:: The answer is passed on to
297
- # <tt>Class.parse()</tt>.
298
- #
299
- # This method throws ArgumentError, if the conversion cannot be
300
- # completed for any reason.
301
- #
302
- def convert( answer_string )
303
- if @answer_type.nil?
304
- answer_string
305
- elsif [Float, Integer, String].include?(@answer_type)
306
- Kernel.send(@answer_type.to_s.to_sym, answer_string)
307
- elsif @answer_type == Symbol
308
- answer_string.to_sym
309
- elsif @answer_type == Regexp
310
- Regexp.new(answer_string)
311
- elsif @answer_type.is_a?(Array) or [File, Pathname].include?(@answer_type)
312
- # cheating, using OptionParser's Completion module
313
- choices = selection
314
- choices.extend(OptionParser::Completion)
315
- answer = choices.complete(answer_string)
316
- if answer.nil?
317
- raise NoAutoCompleteMatch
318
- end
319
- if @answer_type.is_a?(Array)
320
- answer.last
321
- elsif @answer_type == File
322
- File.open(File.join(@directory.to_s, answer.last))
323
- else
324
- Pathname.new(File.join(@directory.to_s, answer.last))
325
- end
326
- elsif [Date, DateTime].include?(@answer_type) or @answer_type.is_a?(Class)
327
- @answer_type.parse(answer_string)
328
- elsif @answer_type.is_a?(Proc)
329
- @answer_type[answer_string]
330
- end
331
- end
332
-
333
- # Returns a english explination of the current range settings.
334
- def expected_range( )
335
- expected = [ ]
336
-
337
- expected << "above #{@above}" unless @above.nil?
338
- expected << "below #{@below}" unless @below.nil?
339
- expected << "included in #{@in.inspect}" unless @in.nil?
340
-
341
- case expected.size
342
- when 0 then ""
343
- when 1 then expected.first
344
- when 2 then expected.join(" and ")
345
- else expected[0..-2].join(", ") + ", and #{expected.last}"
346
- end
347
- end
348
-
349
- # Returns _first_answer_, which will be unset following this call.
350
- def first_answer( )
351
- @first_answer
352
- ensure
353
- @first_answer = nil
354
- end
355
-
356
- # Returns true if _first_answer_ is set.
357
- def first_answer?( )
358
- not @first_answer.nil?
359
- end
360
-
361
- #
362
- # Returns +true+ if the _answer_object_ is greater than the _above_
363
- # attribute, less than the _below_ attribute and included?()ed in the
364
- # _in_ attribute. Otherwise, +false+ is returned. Any +nil+ attributes
365
- # are not checked.
366
- #
367
- def in_range?( answer_object )
368
- (@above.nil? or answer_object > @above) and
369
- (@below.nil? or answer_object < @below) and
370
- (@in.nil? or @in.include?(answer_object))
371
- end
372
-
373
- #
374
- # Returns the provided _answer_string_ after processing whitespace by
375
- # the rules of this Question. Valid settings for whitespace are:
376
- #
377
- # +nil+:: Do not alter whitespace.
378
- # <tt>:strip</tt>:: Calls strip(). (Default.)
379
- # <tt>:chomp</tt>:: Calls chomp().
380
- # <tt>:collapse</tt>:: Collapses all whitspace runs to a
381
- # single space.
382
- # <tt>:strip_and_collapse</tt>:: Calls strip(), then collapses all
383
- # whitspace runs to a single space.
384
- # <tt>:chomp_and_collapse</tt>:: Calls chomp(), then collapses all
385
- # whitspace runs to a single space.
386
- # <tt>:remove</tt>:: Removes all whitespace.
387
- #
388
- # An unrecognized choice (like <tt>:none</tt>) is treated as +nil+.
389
- #
390
- # This process is skipped, for single character input.
391
- #
392
- def remove_whitespace( answer_string )
393
- if @whitespace.nil?
394
- answer_string
395
- elsif [:strip, :chomp].include?(@whitespace)
396
- answer_string.send(@whitespace)
397
- elsif @whitespace == :collapse
398
- answer_string.gsub(/\s+/, " ")
399
- elsif [:strip_and_collapse, :chomp_and_collapse].include?(@whitespace)
400
- result = answer_string.send(@whitespace.to_s[/^[a-z]+/])
401
- result.gsub(/\s+/, " ")
402
- elsif @whitespace == :remove
403
- answer_string.gsub(/\s+/, "")
404
- else
405
- answer_string
406
- end
407
- end
408
-
409
- #
410
- # Returns an Array of valid answers to this question. These answers are
411
- # only known when _answer_type_ is set to an Array of choices, File, or
412
- # Pathname. Any other time, this method will return an empty Array.
413
- #
414
- def selection( )
415
- if @answer_type.is_a?(Array)
416
- @answer_type
417
- elsif [File, Pathname].include?(@answer_type)
418
- Dir[File.join(@directory.to_s, @glob)].map do |file|
419
- File.basename(file)
420
- end
421
- else
422
- [ ]
423
- end
424
- end
425
-
426
- # Stringifies the question to be asked.
427
- def to_str( )
428
- @question
429
- end
430
-
431
- #
432
- # Returns +true+ if the provided _answer_string_ is accepted by the
433
- # _validate_ attribute or +false+ if it's not.
434
- #
435
- # It's important to realize that an answer is validated after whitespace
436
- # and case handling.
437
- #
438
- def valid_answer?( answer_string )
439
- @validate.nil? or
440
- (@validate.is_a?(Regexp) and answer_string =~ @validate) or
441
- (@validate.is_a?(Proc) and @validate[answer_string])
442
- end
443
-
444
- private
445
-
446
- #
447
- # Adds the default choice to the end of question between <tt>|...|</tt>.
448
- # Trailing whitespace is preserved so the function of HighLine.say() is
449
- # not affected.
450
- #
451
- def append_default( )
452
- if @question =~ /([\t ]+)\Z/
453
- @question << "|#{@default}|#{$1}"
454
- elsif @question == ""
455
- @question << "|#{@default}| "
456
- elsif @question[-1, 1] == "\n"
457
- @question[-2, 0] = " |#{@default}|"
458
- else
459
- @question << " |#{@default}|"
460
- end
461
- end
462
- end
463
- end