easyprompt 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/easyprompt.rb +57 -33
- data/lib/easyprompt.rb~ +6 -5
- metadata +2 -2
data/lib/easyprompt.rb
CHANGED
@@ -24,42 +24,30 @@ require 'contxtlservice'
|
|
24
24
|
require 'observer'
|
25
25
|
|
26
26
|
class EasyPrompt
|
27
|
-
Version = '0.1.
|
27
|
+
Version = '0.1.3'
|
28
28
|
|
29
|
-
def initialize
|
29
|
+
def initialize
|
30
|
+
@stdout = MockableStdout.get_mockable_stdout
|
31
|
+
@stdin = MockableStdin.get_mockable_stdin
|
32
|
+
end
|
30
33
|
|
31
34
|
# Asks the user for input.
|
32
35
|
# msg:: The prompt that tells the user what information to enter next.
|
33
36
|
# default:: The default value that will be returned if the user enters a newline (usually by pressing "Enter") without typing any information. The default value will be displayed in square brackets after +msg+.
|
34
37
|
# response_class:: The sort of value that EasyPrompt#ask should return. Valid response classes are:
|
35
38
|
# [:string] This is the default.
|
39
|
+
# [:array] Takes an arbitrary number of lines entered by the user, and returns them as an array. The entry stops when the user enters a blank line.
|
36
40
|
# [:boolean] Values will be turned into <tt>true</tt> or <tt>false</tt> depending on whether the user enters "y" or "n".
|
37
41
|
# [:regexp] Values will be read as a regular expression source. If the user enters an invalid regexp source, EasyPrompt will re-prompt until a valid regexp source is entered.
|
38
42
|
def ask( msg, default = nil, response_class = :string )
|
39
|
-
success = false
|
40
|
-
last_error = nil
|
41
|
-
until success
|
42
|
-
success = true
|
43
|
+
@success = false
|
44
|
+
@last_error = nil
|
45
|
+
until @success
|
46
|
+
@success = true
|
43
47
|
full_msg = msg
|
44
|
-
full_msg = last_error + ' ' + full_msg if last_error
|
48
|
+
full_msg = @last_error + ' ' + full_msg if @last_error
|
45
49
|
@stdout.write( prompt( full_msg, default, response_class ) + ' ' )
|
46
|
-
|
47
|
-
response = stdin.gets
|
48
|
-
response.chomp!
|
49
|
-
if response == ''
|
50
|
-
response = default
|
51
|
-
else
|
52
|
-
if response_class == :boolean
|
53
|
-
response = response =~ /^y/i
|
54
|
-
elsif response_class == :regexp
|
55
|
-
begin
|
56
|
-
response = Regexp.new response
|
57
|
-
rescue RegexpError
|
58
|
-
success = false
|
59
|
-
last_error = "I'm sorry, but that was not a valid regular expression."
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
50
|
+
response = try_parse_response( default, response_class )
|
63
51
|
end
|
64
52
|
response
|
65
53
|
end
|
@@ -78,6 +66,40 @@ class EasyPrompt
|
|
78
66
|
end
|
79
67
|
prompt
|
80
68
|
end
|
69
|
+
|
70
|
+
def try_parse_array_response( response ) #:nodoc:
|
71
|
+
response = [ response ]
|
72
|
+
while ( ( next_line = @stdin.gets ) != "\n" )
|
73
|
+
response << next_line.chomp
|
74
|
+
end
|
75
|
+
response
|
76
|
+
end
|
77
|
+
|
78
|
+
def try_parse_regexp_response( response ) #:nodoc:
|
79
|
+
begin
|
80
|
+
Regexp.new response
|
81
|
+
rescue RegexpError
|
82
|
+
@success = false
|
83
|
+
@last_error = "I'm sorry, but that was not a valid regular expression."
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def try_parse_response( default, response_class ) #:nodoc:
|
89
|
+
response = @stdin.gets
|
90
|
+
response.chomp!
|
91
|
+
if response == ''
|
92
|
+
default
|
93
|
+
else
|
94
|
+
if response_class == :boolean
|
95
|
+
response =~ /^y/i
|
96
|
+
elsif response_class == :regexp
|
97
|
+
try_parse_regexp_response response
|
98
|
+
elsif response_class == :array
|
99
|
+
try_parse_array_response response
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
81
103
|
|
82
104
|
# The MockCommandLineUser can be used if you want to unit-test the command-line part of a program.
|
83
105
|
#
|
@@ -139,13 +161,17 @@ class EasyPrompt
|
|
139
161
|
|
140
162
|
def match_regexp #:nodoc:
|
141
163
|
arg = @mock_stdout.string
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
164
|
+
if arg != ''
|
165
|
+
@mock_stdout.string = ''
|
166
|
+
matching = @responses.map { |regexp, response_pair |
|
167
|
+
( loc = arg =~ regexp ) ? [ regexp, loc ] : nil
|
168
|
+
}
|
169
|
+
matching.compact!
|
170
|
+
fail "Can't match \"#{ arg }\"" if matching.empty?
|
171
|
+
( matching.sort_by { |regexp, loc| loc } ).last.first
|
172
|
+
else
|
173
|
+
nil
|
174
|
+
end
|
149
175
|
end
|
150
176
|
|
151
177
|
def respond( response ) #:nodoc:
|
@@ -171,8 +197,6 @@ class EasyPrompt
|
|
171
197
|
@match_count[regexp] += 1
|
172
198
|
elsif regexp
|
173
199
|
raise "Exceeded limit of #{ @responses[regexp].last } for #{ regexp }"
|
174
|
-
else
|
175
|
-
raise "Can't find a response for " + arg
|
176
200
|
end
|
177
201
|
end
|
178
202
|
end
|
data/lib/easyprompt.rb~
CHANGED
@@ -20,10 +20,11 @@
|
|
20
20
|
#
|
21
21
|
# The Rubyforge project page can be found at http://rubyforge.org/projects/easyprompt/ .
|
22
22
|
|
23
|
-
require '
|
23
|
+
require 'contxtlservice'
|
24
|
+
require 'observer'
|
24
25
|
|
25
26
|
class EasyPrompt
|
26
|
-
Version = '0.1.
|
27
|
+
Version = '0.1.2'
|
27
28
|
|
28
29
|
def initialize; @stdout = MockableStdout.get_mockable_stdout; end
|
29
30
|
|
@@ -124,7 +125,7 @@ class EasyPrompt
|
|
124
125
|
def initialize
|
125
126
|
@responses = {}
|
126
127
|
flush
|
127
|
-
context =
|
128
|
+
context = ContextualService::Context.instance
|
128
129
|
@mock_stdin = StringIO.new
|
129
130
|
@mock_stdin.add_observer( self )
|
130
131
|
context.set_resource( MockableStdin, @mock_stdin )
|
@@ -176,13 +177,13 @@ class EasyPrompt
|
|
176
177
|
end
|
177
178
|
end
|
178
179
|
|
179
|
-
class MockableStdin <
|
180
|
+
class MockableStdin < ContextualService::Service #:nodoc:
|
180
181
|
def method_missing( symbol, *args )
|
181
182
|
$stdin.send( symbol, *args )
|
182
183
|
end
|
183
184
|
end
|
184
185
|
|
185
|
-
class MockableStdout <
|
186
|
+
class MockableStdout < ContextualService::Service #:nodoc:
|
186
187
|
def method_missing( symbol, *args )
|
187
188
|
$stdout.send( symbol, *args )
|
188
189
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.6
|
|
3
3
|
specification_version: 1
|
4
4
|
name: easyprompt
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.1.3
|
7
|
+
date: 2005-09-14
|
8
8
|
summary: EasyPrompt is a utility for command-line scripts.
|
9
9
|
require_paths:
|
10
10
|
- lib
|