interactive 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +10 -5
- data/README.md +52 -6
- data/lib/interactive.rb +1 -0
- data/lib/interactive/options.rb +31 -6
- data/lib/interactive/question.rb +2 -3
- data/lib/interactive/question_with_eager_full_explanation.rb +1 -1
- data/lib/interactive/question_with_lazy_full_explanation.rb +1 -1
- data/lib/interactive/response.rb +24 -5
- data/lib/interactive/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9dcea125c70a876fcb818733193c9d9554a4455
|
4
|
+
data.tar.gz: f992006a8ae904ccf96f52bd227892edccabef92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95ce90bea80d01932067744d6dbd7c7581ba971a4736968b4562361124cce93fa5a2e70f3004ece8bb98d61c94c0b8218f9be6dfe2d1df25e3da78f00ceeaf73
|
7
|
+
data.tar.gz: f50ec4bc741764e1a8eb07c4afe6380f9e07575afd5ed9ed921bd300a7365d6a3318cc07d6310ab2ac1954ea0b335430131489e2d995ca90f38049e13d4e8687
|
data/CHANGELOG.markdown
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
v0.
|
1
|
+
v0.3.0 -- Wed Mar 18 11:28:05 EDT 2015
|
2
2
|
--------------------------------------
|
3
|
-
- Added support for
|
4
|
-
-
|
5
|
-
use?", where whole number responses such as "1", "2", etc. makes sense.
|
6
|
-
- Refactored, DRY'er.
|
3
|
+
- Added support for questions without options
|
4
|
+
- Aliased `Question#ask_and_wait_for_valid_response` as `Question#ask`
|
7
5
|
|
8
6
|
v0.2.0 -- Mon Mar 16 21:52:21 EDT 2015
|
9
7
|
--------------------------------------
|
@@ -13,3 +11,10 @@ v0.2.0 -- Mon Mar 16 21:52:21 EDT 2015
|
|
13
11
|
corresponding to the index in the array.
|
14
12
|
- Putting in an array will eagerly trigger the full explanation of
|
15
13
|
the shortcut (i.e. show the full explanation right after the question)
|
14
|
+
|
15
|
+
v0.1.0 -- Mon Mar 16 07:17:53 EDT 2015
|
16
|
+
--------------------------------------
|
17
|
+
- Added support for handling ranges.
|
18
|
+
- Useful for processing responses of questions like "Which item do you want to
|
19
|
+
use?", where whole number responses such as "1", "2", etc. makes sense.
|
20
|
+
- Refactored, DRY'er.
|
data/README.md
CHANGED
@@ -23,13 +23,55 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
|
26
|
+
### Questions Without any Options
|
27
|
+
If you want to ask a user a question accepting all answers:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
require 'interactive'
|
31
|
+
include 'interactive'
|
32
|
+
|
33
|
+
question = Question.new do |q|
|
34
|
+
q.question = "What is your api token password?"
|
35
|
+
end
|
36
|
+
|
37
|
+
question.ask do |response|
|
38
|
+
# response is an object that responds to string methods
|
39
|
+
puts response.split
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
This will ask:
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
=> What are your project ids?
|
47
|
+
```
|
48
|
+
|
49
|
+
You can respond like so, for example:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
$ 123someid hello4545 12992hhoo
|
53
|
+
```
|
54
|
+
|
55
|
+
That will give us the following:
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
=> 123someid
|
59
|
+
hello4545
|
60
|
+
12992hhoo
|
61
|
+
```
|
62
|
+
|
26
63
|
### Questions With Lazy Shortcut Explanations
|
64
|
+
|
27
65
|
If you want to ask a user a question expecting certain answers:
|
28
66
|
|
67
|
+
|
29
68
|
```ruby
|
30
|
-
|
31
|
-
|
32
|
-
|
69
|
+
require 'interactive'
|
70
|
+
include 'interactive'
|
71
|
+
|
72
|
+
question = Question.new do |q|
|
73
|
+
q.question = "Which item do you want to use?"
|
74
|
+
q.options = [1..3, :cancel, :quit]
|
33
75
|
end
|
34
76
|
```
|
35
77
|
|
@@ -37,7 +79,7 @@ You can run the loop and wait for a valid response and do query methods on the
|
|
37
79
|
response:
|
38
80
|
|
39
81
|
```ruby
|
40
|
-
question.
|
82
|
+
question.ask do |response|
|
41
83
|
if response.whole_num_1?
|
42
84
|
# do stuff if user responded with "1"
|
43
85
|
elsif response.whole_num?
|
@@ -82,14 +124,18 @@ Providing an array of options to the options array will trigger the shortcut
|
|
82
124
|
explanation right after asking the question:
|
83
125
|
|
84
126
|
```ruby
|
127
|
+
require 'interactive'
|
128
|
+
include 'interactive'
|
129
|
+
|
130
|
+
# ...
|
85
131
|
|
86
132
|
options_list = ["/some/path", "/some/other/path"]
|
87
|
-
iq =
|
133
|
+
iq = Question.new do |q|
|
88
134
|
q.question = "Which path do you want to use?"
|
89
135
|
q.options = [options_list, :cancel]
|
90
136
|
end
|
91
137
|
|
92
|
-
iq.
|
138
|
+
iq.ask do |response|
|
93
139
|
if response.whole_number?
|
94
140
|
# response.to_i will convert the response string to an integer.
|
95
141
|
# useful for getting the index (i.e. options_list[response.to_i])
|
data/lib/interactive.rb
CHANGED
data/lib/interactive/options.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
require 'delegate'
|
2
|
+
require 'interactive'
|
2
3
|
|
3
4
|
module Interactive
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
module_function
|
6
|
+
def Options(options=[])
|
7
|
+
options.empty? ? EmptyOptions.new([]) : NonEmptyOptions.new(options)
|
8
|
+
end
|
7
9
|
|
10
|
+
class NonEmptyOptions < SimpleDelegator
|
11
|
+
include Interactive
|
8
12
|
def initialize(options)
|
9
|
-
|
13
|
+
@options = options
|
14
|
+
flatten_ranges(@options)
|
10
15
|
wrap_each_option
|
11
16
|
super(@options)
|
12
17
|
end
|
@@ -16,7 +21,7 @@ module Interactive
|
|
16
21
|
end
|
17
22
|
|
18
23
|
def shortcuts_meanings
|
19
|
-
options.inject("") { |accum, opt| "#{accum} #{opt.shortcut_value} -- #{opt.value}\n"}
|
24
|
+
@options.inject("") { |accum, opt| "#{accum} #{opt.shortcut_value} -- #{opt.value}\n"}
|
20
25
|
end
|
21
26
|
|
22
27
|
def has_hash?
|
@@ -42,11 +47,31 @@ module Interactive
|
|
42
47
|
end
|
43
48
|
|
44
49
|
def first_chars
|
45
|
-
options.inject("") { |accum, opt| "#{accum}#{ opt.shortcut_value}/" }
|
50
|
+
@options.inject("") { |accum, opt| "#{accum}#{ opt.shortcut_value}/" }
|
46
51
|
end
|
47
52
|
|
48
53
|
def first_chars_without_last_slash(first_chars)
|
49
54
|
first_chars[0..first_chars.length-2]
|
50
55
|
end
|
51
56
|
end
|
57
|
+
|
58
|
+
|
59
|
+
class EmptyOptions < SimpleDelegator
|
60
|
+
def initialize(options)
|
61
|
+
@options = options
|
62
|
+
super(@options)
|
63
|
+
end
|
64
|
+
|
65
|
+
def shortcuts_string
|
66
|
+
''
|
67
|
+
end
|
68
|
+
|
69
|
+
def shortcuts_meanings
|
70
|
+
''
|
71
|
+
end
|
72
|
+
|
73
|
+
def has_hash?
|
74
|
+
false
|
75
|
+
end
|
76
|
+
end
|
52
77
|
end
|
data/lib/interactive/question.rb
CHANGED
@@ -5,12 +5,11 @@ module Interactive
|
|
5
5
|
def initialize(&block)
|
6
6
|
yield self
|
7
7
|
|
8
|
-
@options = Interactive::Options
|
8
|
+
@options = Interactive::Options(Array(@options))
|
9
9
|
|
10
10
|
raise ArgumentError, "question cannot be nil nor empty." if question.nil? || question.empty?
|
11
|
-
raise ArgumentError, "options cannot be empty." if options.empty?
|
12
|
-
|
13
11
|
@question_type = @options.has_hash? ? QuestionWithEagerFullExplanation.new(self) : QuestionWithLazyFullExplanation.new(self)
|
12
|
+
alias :ask :ask_and_wait_for_valid_response
|
14
13
|
end
|
15
14
|
|
16
15
|
def ask_and_wait_for_valid_response(&block)
|
@@ -3,7 +3,7 @@ class QuestionWithEagerFullExplanation < SimpleDelegator
|
|
3
3
|
loop do
|
4
4
|
puts "#{question} #{options.shortcuts_string}"
|
5
5
|
puts options.shortcuts_meanings
|
6
|
-
resp = Interactive::Response
|
6
|
+
resp = Interactive::Response(options)
|
7
7
|
|
8
8
|
yield resp
|
9
9
|
break unless resp.invalid?
|
@@ -2,7 +2,7 @@ class QuestionWithLazyFullExplanation < SimpleDelegator
|
|
2
2
|
def ask_and_wait_for_valid_response(&block)
|
3
3
|
loop do
|
4
4
|
puts "#{question} #{options.shortcuts_string}"
|
5
|
-
resp = Interactive::Response
|
5
|
+
resp = Interactive::Response(options)
|
6
6
|
puts options.shortcuts_meanings if resp.invalid?
|
7
7
|
|
8
8
|
yield resp
|
data/lib/interactive/response.rb
CHANGED
@@ -1,7 +1,29 @@
|
|
1
1
|
require 'interactive'
|
2
2
|
|
3
3
|
module Interactive
|
4
|
-
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def Response(*args)
|
7
|
+
args = Array(args).flatten
|
8
|
+
args.empty? ? ResponseWithNoArgs.new(args) : ResponseWithArgs.new(args)
|
9
|
+
end
|
10
|
+
|
11
|
+
class ResponseWithNoArgs < SimpleDelegator
|
12
|
+
def initialize(*args)
|
13
|
+
@_response = STDIN.gets.chomp
|
14
|
+
super(@_response)
|
15
|
+
end
|
16
|
+
|
17
|
+
def valid?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
def invalid?
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class ResponseWithArgs < SimpleDelegator
|
5
27
|
def initialize(*args)
|
6
28
|
@args = Array(args).flatten
|
7
29
|
check_validity
|
@@ -11,10 +33,8 @@ module Interactive
|
|
11
33
|
define_methods
|
12
34
|
define_invalid
|
13
35
|
define_whole_number
|
14
|
-
end
|
15
36
|
|
16
|
-
|
17
|
-
@_response.to_i
|
37
|
+
super(@_response)
|
18
38
|
end
|
19
39
|
|
20
40
|
private
|
@@ -23,7 +43,6 @@ module Interactive
|
|
23
43
|
raise ArgumentError, "may not use :invalid or 'invalid' as an argument. Private method." if @args.map(&:to_s).include?('invalid')
|
24
44
|
raise ArgumentError, "may not use :whole_number or 'whole_number' as an argument. Private method." if @args.map(&:to_s).include?('whole_number')
|
25
45
|
raise ArgumentError, "may not have keyword options that have the same first letter." if first_chars_not_unique
|
26
|
-
raise ArgumentError, "wrong number of arguments (need at least two arguments)." if @args.length < 2
|
27
46
|
end
|
28
47
|
|
29
48
|
def define_methods
|
data/lib/interactive/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interactive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edderic Ugaddan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|