prompt 0.0.2 → 0.0.3
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.
- data/CHANGELOG.md +23 -0
- data/LICENSE.txt +20 -0
- data/README.md +16 -16
- data/examples/file_manager +8 -1
- data/examples/mud +2 -2
- data/lib/prompt/application.rb +13 -7
- data/lib/prompt/command.rb +47 -31
- data/lib/prompt/console/builtins.rb +5 -5
- data/lib/prompt/dsl.rb +15 -14
- data/lib/prompt/dsl_helper.rb +25 -0
- data/lib/prompt/glob_parameter.rb +17 -0
- data/lib/prompt/{variable.rb → parameter.rb} +14 -4
- data/lib/prompt/{proc_variable.rb → proc_parameter.rb} +6 -2
- data/lib/prompt/prompt_module.rb +1 -1
- data/spec/prompt/command_spec.rb +112 -73
- metadata +9 -6
- data/lib/prompt/glob_variable.rb +0 -14
data/CHANGELOG.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
This is updated when a new version is pushed to http://rubygems.org
|
4
|
+
|
5
|
+
## 0.0.3 (Feb 22, 2011)
|
6
|
+
|
7
|
+
* DSL change: `variable` & `dynamic_variable` were renamed to `param`
|
8
|
+
* A glob parameter (e.g. `*param`) will now return its matches as an array of strings
|
9
|
+
* Quoted strings will now work as expected with glob parameters
|
10
|
+
* Dynamic variables are cached until the next command is run
|
11
|
+
* Added LICENSE.txt
|
12
|
+
|
13
|
+
## 0.0.2 (Feb 17, 2011)
|
14
|
+
|
15
|
+
* Allow the command prompt to be changed while it's running
|
16
|
+
* Quoted strings will now match to a single `:param`
|
17
|
+
* Use a `*param` to match one or more words
|
18
|
+
* [BUG] Don't memoize Command#regex. This prevented dynamic variables
|
19
|
+
from working correctly after the values changed
|
20
|
+
|
21
|
+
## 0.0.1 (Feb 16, 2011)
|
22
|
+
|
23
|
+
* Initial release
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Mu Dynamics
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ extend Prompt::DSL
|
|
18
18
|
|
19
19
|
desc "Move"
|
20
20
|
|
21
|
-
|
21
|
+
param :direction, "A cardinal direction", %w(north east south west)
|
22
22
|
|
23
23
|
command "go :direction", "Walk in the specified direction" do |direction|
|
24
24
|
puts "You walked #{direction} and were eaten by a grue."
|
@@ -39,7 +39,7 @@ Prompt::Console.start
|
|
39
39
|
|
40
40
|
### Tab completion
|
41
41
|
|
42
|
-
Tab completion is hooked up automatically after you define your commands and
|
42
|
+
Tab completion is hooked up automatically after you define your commands and parameters
|
43
43
|
|
44
44
|
$ my_app
|
45
45
|
> g<TAB>
|
@@ -68,8 +68,8 @@ The `help` command is built-in. It will print all of the commands that you've d
|
|
68
68
|
> help
|
69
69
|
Console commands
|
70
70
|
|
71
|
-
help
|
72
|
-
help
|
71
|
+
help List all commands
|
72
|
+
help -v List all commands, including parameters
|
73
73
|
exit
|
74
74
|
|
75
75
|
Move
|
@@ -96,9 +96,9 @@ desc "Burger commands"
|
|
96
96
|
command ...
|
97
97
|
```
|
98
98
|
|
99
|
-
## Using
|
99
|
+
## Using Parameters
|
100
100
|
|
101
|
-
|
101
|
+
Parameters can be used in a command:
|
102
102
|
|
103
103
|
```ruby
|
104
104
|
command "name :first :last" do |first, last|
|
@@ -106,39 +106,39 @@ command "name :first :last" do |first, last|
|
|
106
106
|
end
|
107
107
|
```
|
108
108
|
|
109
|
-
Here, the
|
109
|
+
Here, the parameters are named `first` and `last`. Their values are be passed as arguments to the command's block, in the order in which they appear.
|
110
110
|
|
111
111
|
|
112
|
-
Each `:
|
112
|
+
Each `:parameter` only matches a single word. If you want to match multiple words to one parameter, use a `*parameter`.
|
113
113
|
|
114
114
|
```ruby
|
115
115
|
command "say *sentence" do |sentence|
|
116
|
-
puts "You
|
116
|
+
puts "You said #{sentence.length} words"
|
117
117
|
end
|
118
118
|
```
|
119
119
|
|
120
|
-
### Defining
|
120
|
+
### Defining parameters
|
121
121
|
|
122
|
-
It's not necessary to define a
|
122
|
+
It's not necessary to define a parameter before using it in a command, but doing so will allow you to provide a useful description and valid values for the parameter.
|
123
123
|
|
124
124
|
```ruby
|
125
|
-
|
125
|
+
param :name, "Description"
|
126
126
|
```
|
127
127
|
|
128
128
|
### Specifying a static list of valid values
|
129
129
|
|
130
|
-
You can specify a static list of valid values for a
|
130
|
+
You can specify a static list of valid values for a parameter. These will be expanded when using tab completion.
|
131
131
|
|
132
132
|
```ruby
|
133
|
-
|
133
|
+
param :name, "Description", %w(value1 value2)
|
134
134
|
```
|
135
135
|
|
136
136
|
### Specifying a dynamic list of valid values
|
137
137
|
|
138
|
-
Instead of
|
138
|
+
Instead of a static list, you can specify a block that will dynamically return a list of valid values for a parameter. These will also be expanded when using tab completion.
|
139
139
|
|
140
140
|
```ruby
|
141
|
-
|
141
|
+
param :file, "JPG file" do
|
142
142
|
Dir.glob "*.jpg"
|
143
143
|
end
|
144
144
|
```
|
data/examples/file_manager
CHANGED
@@ -11,7 +11,7 @@ end
|
|
11
11
|
@pwd = File.absolute_path Dir.pwd
|
12
12
|
change_prompt @pwd
|
13
13
|
|
14
|
-
|
14
|
+
param :dir, "Directory" do
|
15
15
|
Dir.entries(@pwd).select do |e|
|
16
16
|
File.directory?(File.join(@pwd, e))
|
17
17
|
end
|
@@ -38,4 +38,11 @@ command "pwd", "Print current directory" do
|
|
38
38
|
puts @pwd
|
39
39
|
end
|
40
40
|
|
41
|
+
param :files, "A list of files"
|
42
|
+
|
43
|
+
command "cp *files :dir", "Copy one or more files to dest" do |files, dir|
|
44
|
+
puts "Copying #{files.length} file(s) to #{dir}"
|
45
|
+
# doesn't actually do it...
|
46
|
+
end
|
47
|
+
|
41
48
|
Prompt::Console.start
|
data/examples/mud
CHANGED
@@ -9,7 +9,7 @@ GRUE = 3
|
|
9
9
|
|
10
10
|
desc "Move"
|
11
11
|
|
12
|
-
|
12
|
+
param :direction, "A cardinal direction", %w(north east south west)
|
13
13
|
|
14
14
|
command "go :direction", "Walk in the specified direction" do |direction|
|
15
15
|
puts "You walked #{direction}"
|
@@ -31,7 +31,7 @@ command "look", "Look around" do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
command "say *something", "Say something" do |something|
|
34
|
-
puts "You say '#{something}'"
|
34
|
+
puts "You say '#{something.join(" ")}'"
|
35
35
|
end
|
36
36
|
|
37
37
|
Prompt::Console.start
|
data/lib/prompt/application.rb
CHANGED
@@ -15,8 +15,8 @@ module Prompt
|
|
15
15
|
@current_command_group_name = desc
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
current_command_group.commands <<
|
18
|
+
def add_command command
|
19
|
+
current_command_group.commands << command
|
20
20
|
end
|
21
21
|
|
22
22
|
def exec command_str
|
@@ -25,22 +25,28 @@ module Prompt
|
|
25
25
|
return command.run(args) if args
|
26
26
|
end
|
27
27
|
raise CommandNotFound.new(command_str)
|
28
|
+
ensure
|
29
|
+
clear_cached_values
|
28
30
|
end
|
29
31
|
|
30
|
-
def completions starting_with
|
31
|
-
return all_expansions unless starting_with
|
32
|
-
|
32
|
+
def completions starting_with
|
33
33
|
all_expansions.grep /^#{Regexp.escape(starting_with)}/
|
34
34
|
end
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
+
def clear_cached_values
|
39
|
+
commands.each do |c|
|
40
|
+
c.clear_cached_values
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
38
44
|
def commands
|
39
|
-
@command_groups.map(&:commands).
|
45
|
+
@command_groups.map(&:commands).flatten(1)
|
40
46
|
end
|
41
47
|
|
42
48
|
def all_expansions
|
43
|
-
commands.map(&:expansions).flatten
|
49
|
+
commands.map(&:expansions).flatten(1)
|
44
50
|
end
|
45
51
|
|
46
52
|
def current_command_group
|
data/lib/prompt/command.rb
CHANGED
@@ -1,38 +1,45 @@
|
|
1
|
+
require 'strscan'
|
2
|
+
require 'prompt/parameter'
|
3
|
+
|
1
4
|
module Prompt
|
2
5
|
class Command
|
3
6
|
|
7
|
+
SEP = "\036" # RS - record separator
|
8
|
+
S_QUOTED_ARG = /'([^']*)'/
|
9
|
+
D_QUOTED_ARG = /"([^"]*)"/
|
10
|
+
UNQUOTED_ARG = /[^\s]+/
|
11
|
+
|
4
12
|
attr :name
|
5
13
|
attr :desc
|
14
|
+
attr :parameters
|
6
15
|
|
7
|
-
def initialize(
|
8
|
-
@
|
16
|
+
def initialize(words, desc = nil, &block)
|
17
|
+
@words = words
|
9
18
|
@desc = desc
|
10
|
-
@all_variables = all_variables
|
11
19
|
@action = block
|
20
|
+
|
21
|
+
@name = words.join(" ")
|
22
|
+
@parameters = words.select {|w| w.kind_of? Parameter}
|
12
23
|
end
|
13
24
|
|
14
25
|
def run args
|
15
26
|
@action.call *args
|
16
27
|
end
|
17
28
|
|
18
|
-
def match
|
19
|
-
if m = regex.match(str.
|
20
|
-
|
29
|
+
def match str
|
30
|
+
if m = regex.match(to_args(str).join(SEP))
|
31
|
+
@parameters.map {|v| v.matches(m[v.name]) }
|
21
32
|
end
|
22
33
|
end
|
23
34
|
|
24
|
-
def variables
|
25
|
-
@variables ||= words.select {|w| w.kind_of? Variable}
|
26
|
-
end
|
27
|
-
|
28
35
|
def expansions
|
29
|
-
expand words
|
36
|
+
expand @words
|
30
37
|
end
|
31
38
|
|
32
39
|
def usage
|
33
|
-
words.map do |word|
|
40
|
+
@words.map do |word|
|
34
41
|
case word
|
35
|
-
when
|
42
|
+
when Parameter
|
36
43
|
"<#{word.name}>"
|
37
44
|
else
|
38
45
|
word
|
@@ -40,33 +47,42 @@ module Prompt
|
|
40
47
|
end.join(" ")
|
41
48
|
end
|
42
49
|
|
50
|
+
def clear_cached_values
|
51
|
+
@parameters.each do |p|
|
52
|
+
p.clear_cached_value if p.respond_to?(:clear_cached_value)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
43
56
|
private
|
44
57
|
|
58
|
+
# Splits a command string into an argument list.
|
59
|
+
# This understands how to make "quoted strings" into a single arg
|
60
|
+
def to_args command
|
61
|
+
args = []
|
62
|
+
ss = StringScanner.new(command)
|
63
|
+
ss.scan(/\s+/)
|
64
|
+
until ss.eos?
|
65
|
+
if ss.scan(S_QUOTED_ARG) or ss.scan(D_QUOTED_ARG)
|
66
|
+
args << ss[1]
|
67
|
+
elsif arg = ss.scan(UNQUOTED_ARG)
|
68
|
+
args << arg
|
69
|
+
end
|
70
|
+
ss.scan(/\s+/)
|
71
|
+
end
|
72
|
+
args
|
73
|
+
end
|
74
|
+
|
45
75
|
def regex
|
46
76
|
begin
|
47
|
-
regex_strs = words.map do |word|
|
77
|
+
regex_strs = @words.map do |word|
|
48
78
|
case word
|
49
|
-
when
|
79
|
+
when Parameter
|
50
80
|
word.regex
|
51
81
|
else
|
52
82
|
Regexp.escape(word)
|
53
83
|
end
|
54
84
|
end
|
55
|
-
Regexp.new("^#{regex_strs.join(
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def words
|
60
|
-
@words ||= @name.split(/\s/).map do |word|
|
61
|
-
if word[0] == ":"
|
62
|
-
sym = word[1..-1].to_sym
|
63
|
-
@all_variables.find {|v| v.name == sym} || Variable.new(sym, sym.to_s)
|
64
|
-
elsif word[0] == "*"
|
65
|
-
sym = word[1..-1].to_sym
|
66
|
-
@all_variables.find {|v| v.name == sym} || GlobVariable.new(sym, sym.to_s)
|
67
|
-
else
|
68
|
-
word
|
69
|
-
end
|
85
|
+
Regexp.new("^#{regex_strs.join(SEP)}$")
|
70
86
|
end
|
71
87
|
end
|
72
88
|
|
@@ -77,7 +93,7 @@ module Prompt
|
|
77
93
|
tail = a[1..-1]
|
78
94
|
|
79
95
|
case head
|
80
|
-
when
|
96
|
+
when Parameter
|
81
97
|
head = head.expansions
|
82
98
|
else
|
83
99
|
head = [head]
|
@@ -8,12 +8,12 @@ module Prompt
|
|
8
8
|
|
9
9
|
desc "Console commands"
|
10
10
|
|
11
|
-
command "help
|
12
|
-
print_help
|
11
|
+
command "help", "List all commands" do
|
12
|
+
print_help
|
13
13
|
end
|
14
14
|
|
15
|
-
command "help" do
|
16
|
-
print_help
|
15
|
+
command "help -v", "List all commands, including parameters" do
|
16
|
+
print_help true
|
17
17
|
end
|
18
18
|
|
19
19
|
command "exit" do
|
@@ -30,7 +30,7 @@ module Prompt
|
|
30
30
|
cg.commands.each do |cmd|
|
31
31
|
puts " %-40s %s" % [cmd.usage, cmd.desc]
|
32
32
|
if verbose
|
33
|
-
cmd.
|
33
|
+
cmd.parameters.each do |v|
|
34
34
|
puts " "*43 + ("%-10s %s" % ["<#{v.name}>", "#{v.desc}"])
|
35
35
|
end
|
36
36
|
end
|
data/lib/prompt/dsl.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require 'prompt/
|
2
|
-
require 'prompt/
|
3
|
-
require 'prompt/
|
1
|
+
require 'prompt/parameter'
|
2
|
+
require 'prompt/proc_parameter'
|
3
|
+
require 'prompt/glob_parameter'
|
4
|
+
require 'prompt/dsl_helper'
|
4
5
|
|
5
6
|
module Prompt
|
6
7
|
module DSL
|
@@ -19,19 +20,19 @@ module Prompt
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def command(name, desc = nil, &block)
|
22
|
-
|
23
|
+
words = DSLHelper.words(name, @parameters || [])
|
24
|
+
command = Command.new(words, desc, &block)
|
25
|
+
Prompt.application.add_command(command)
|
23
26
|
end
|
24
27
|
|
25
|
-
def
|
26
|
-
@
|
27
|
-
raise "
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
raise "variable :#{name} is already defined" if @variables.find {|v| v.name == name}
|
34
|
-
@variables << ProcVariable.new(name, desc, &block)
|
28
|
+
def param(name, desc, values = nil, &block)
|
29
|
+
@parameters = [] unless defined? @parameters
|
30
|
+
raise "parameter :#{name} is already defined" if @parameters.find {|v| v.name == name}
|
31
|
+
if block
|
32
|
+
@parameters << ProcParameter.new(name, desc, &block)
|
33
|
+
else
|
34
|
+
@parameters << Parameter.new(name, desc, values)
|
35
|
+
end
|
35
36
|
end
|
36
37
|
|
37
38
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Prompt
|
2
|
+
module DSLHelper
|
3
|
+
|
4
|
+
# Split command into an array of Strings and Parameters
|
5
|
+
def self.words command_name, parameters
|
6
|
+
command_name.strip.split(/\s+/).map do |word|
|
7
|
+
if word[0] == ":"
|
8
|
+
sym = word[1..-1].to_sym
|
9
|
+
parameters.find {|p| p.name == sym} || Parameter.new(sym)
|
10
|
+
elsif word[0] == "*"
|
11
|
+
sym = word[1..-1].to_sym
|
12
|
+
param = parameters.find {|p| p.name == sym}
|
13
|
+
# Since GlobParameters can't be defined ahead of time in the DSL, we
|
14
|
+
# always create a new one and copy the description
|
15
|
+
# This is kinda jankey
|
16
|
+
desc = param ? param.desc : nil
|
17
|
+
GlobParameter.new(sym, desc)
|
18
|
+
else
|
19
|
+
word
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Prompt
|
2
|
+
class GlobParameter < Parameter
|
3
|
+
|
4
|
+
def initialize(name, desc = nil)
|
5
|
+
super(name, desc)
|
6
|
+
end
|
7
|
+
|
8
|
+
def regex
|
9
|
+
"(?<#{name}>(([^#{Prompt::Command::SEP}]*)#{Prompt::Command::SEP}?)+)"
|
10
|
+
end
|
11
|
+
|
12
|
+
def matches s
|
13
|
+
s.split(Prompt::Command::SEP)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Prompt
|
2
|
-
class
|
2
|
+
class Parameter
|
3
3
|
|
4
4
|
attr :name
|
5
5
|
attr :desc
|
6
6
|
attr :values
|
7
7
|
|
8
|
-
def initialize(name, desc, values = nil)
|
8
|
+
def initialize(name, desc = nil, values = nil)
|
9
9
|
@name = name
|
10
10
|
@desc = desc
|
11
11
|
@values = values
|
@@ -15,12 +15,22 @@ module Prompt
|
|
15
15
|
if values
|
16
16
|
"(?<#{name}>#{values.map{|v| Regexp.escape(v)}.join("|")})"
|
17
17
|
else
|
18
|
-
"(
|
18
|
+
"(?<#{name}>([^#{Prompt::Command::SEP}]*))"
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def expansions
|
23
|
-
values
|
23
|
+
if values
|
24
|
+
values.map do |v|
|
25
|
+
(v =~ /\s/) ? "\"#{v}\"" : v
|
26
|
+
end
|
27
|
+
else
|
28
|
+
["<#{name}>"]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def matches s
|
33
|
+
s
|
24
34
|
end
|
25
35
|
|
26
36
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Prompt
|
2
|
-
class
|
2
|
+
class ProcParameter < Parameter
|
3
3
|
|
4
4
|
def initialize(name, desc, &block)
|
5
5
|
super(name, desc, nil)
|
@@ -7,7 +7,11 @@ module Prompt
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def values
|
10
|
-
@proc.call
|
10
|
+
@cached_value ||= @proc.call
|
11
|
+
end
|
12
|
+
|
13
|
+
def clear_cached_value
|
14
|
+
@cached_value = nil
|
11
15
|
end
|
12
16
|
|
13
17
|
end
|
data/lib/prompt/prompt_module.rb
CHANGED
data/spec/prompt/command_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'prompt/command'
|
2
|
-
require 'prompt/
|
3
|
-
require 'prompt/
|
2
|
+
require 'prompt/parameter'
|
3
|
+
require 'prompt/glob_parameter'
|
4
4
|
|
5
5
|
include Prompt
|
6
6
|
|
@@ -10,119 +10,158 @@ describe Prompt::Command do
|
|
10
10
|
SPEEDS = %w{quickly slowly}
|
11
11
|
|
12
12
|
describe "#match" do
|
13
|
-
it "matches correctly" do
|
14
|
-
c = Command.new("hi")
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
describe "hi" do
|
15
|
+
|
16
|
+
it "matches correctly" do
|
17
|
+
c = Command.new ["hi"]
|
18
|
+
|
19
|
+
c.match("hi").should == []
|
20
|
+
c.match("hi ").should == []
|
21
|
+
c.match(" hi").should == []
|
22
|
+
|
23
|
+
c.match("bye").should be_nil
|
24
|
+
c.match("h").should be_nil
|
25
|
+
c.match("").should be_nil
|
26
|
+
end
|
19
27
|
|
20
|
-
c.match("bye").should be_nil
|
21
|
-
c.match("h").should be_nil
|
22
|
-
c.match("").should be_nil
|
23
28
|
end
|
24
29
|
|
25
|
-
|
26
|
-
c = Command.new("hi :name")
|
30
|
+
describe "hi :name" do
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
c.match("hi ''").should == [""]
|
31
|
-
c.match('hi "some guy"').should == ["some guy"]
|
32
|
-
c.match('hi ""').should == [""]
|
32
|
+
it "matches correctly" do
|
33
|
+
c = Command.new ["hi", Parameter.new(:name)]
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
c.match("hi guy").should == ["guy"]
|
36
|
+
c.match("hi 'some guy'").should == ["some guy"]
|
37
|
+
c.match("hi ''").should == [""]
|
38
|
+
c.match('hi "some guy"').should == ["some guy"]
|
39
|
+
c.match('hi ""').should == [""]
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
+
c.match("hi '").should == ["'"]
|
42
|
+
c.match('hi "').should == ['"']
|
43
|
+
c.match('hi \'"').should == ['\'"']
|
44
|
+
|
45
|
+
c.match("higuy").should be_nil
|
46
|
+
c.match("higuy guy").should be_nil
|
41
47
|
|
42
|
-
|
43
|
-
|
48
|
+
c.match(" hi guy").should == ["guy"]
|
49
|
+
c.match("hi guy").should == ["guy"]
|
50
|
+
c.match("hi guy ").should == ["guy"]
|
51
|
+
end
|
52
|
+
|
53
|
+
it "matches correctly (with parameter value constraint)" do
|
54
|
+
c = Command.new ["hi", Parameter.new(:name, "", ["alice", "bob", "charlie rose"])]
|
55
|
+
|
56
|
+
c.match("hi alice").should == ["alice"]
|
57
|
+
c.match("hi bob").should == ["bob"]
|
58
|
+
c.match("hi 'charlie rose'").should == ["charlie rose"]
|
59
|
+
c.match("hi charlie rose").should be_nil
|
60
|
+
c.match("hi zack").should be_nil
|
61
|
+
c.match("hi ali").should be_nil
|
62
|
+
end
|
44
63
|
|
45
|
-
c.match(" hi guy").should == ["guy"]
|
46
|
-
c.match("hi guy").should == ["guy"]
|
47
|
-
c.match("hi guy ").should == ["guy"]
|
48
64
|
end
|
49
65
|
|
50
|
-
|
51
|
-
|
66
|
+
describe "hi :first :last" do
|
67
|
+
|
68
|
+
it "matches correctly" do
|
69
|
+
c = Command.new ["hi", Parameter.new(:first), Parameter.new(:last)]
|
70
|
+
|
71
|
+
c.match("hi agent smith").should == ["agent", "smith"]
|
72
|
+
c.match("hi agent").should be_nil
|
73
|
+
c.match("hi agent smith guy").should be_nil
|
74
|
+
end
|
52
75
|
|
53
|
-
c.match("hi agent smith").should == ["agent", "smith"]
|
54
|
-
c.match("hi agent").should be_nil
|
55
|
-
c.match("hi agent smith guy").should be_nil
|
56
76
|
end
|
57
77
|
|
58
|
-
|
59
|
-
|
60
|
-
|
78
|
+
describe "say *stuff" do
|
79
|
+
|
80
|
+
it "matches correctly" do
|
81
|
+
c = Command.new ["say", GlobParameter.new(:stuff)]
|
82
|
+
|
83
|
+
c.match("say hello").should == [["hello"]]
|
84
|
+
c.match("say hello world").should == [["hello", "world"]]
|
85
|
+
c.match("say hello world").should == [["hello", "world"]]
|
86
|
+
c.match("say hello world").should == [["hello", "world"]]
|
87
|
+
c.match("say 'hello world'").should == [["hello world"]]
|
88
|
+
c.match('say "hello world"').should == [["hello world"]]
|
89
|
+
end
|
61
90
|
|
62
|
-
c.match("go n").should == ["n"]
|
63
|
-
c.match("go s").should == ["s"]
|
64
|
-
c.match("go x").should be_nil
|
65
|
-
c.match("go nn").should be_nil
|
66
91
|
end
|
67
92
|
|
68
|
-
|
69
|
-
|
93
|
+
describe "say *stuff :adverb" do
|
94
|
+
|
95
|
+
it "matches correctly" do
|
96
|
+
c = Command.new ["say", GlobParameter.new(:stuff), Parameter.new(:adverb)]
|
97
|
+
|
98
|
+
c.match("say hello").should be_nil
|
99
|
+
c.match("say hello loudly").should == [["hello"], "loudly"]
|
100
|
+
c.match("say hello world loudly").should == [["hello", "world"], "loudly"]
|
101
|
+
c.match("say hello 'world loudly'").should == [["hello"], "world loudly"]
|
102
|
+
end
|
70
103
|
|
71
|
-
c.match("say hello").should == ["hello"]
|
72
|
-
c.match("say hello world").should == ["hello world"]
|
73
104
|
end
|
74
105
|
|
75
|
-
|
76
|
-
|
106
|
+
describe "say *first *second" do
|
107
|
+
|
108
|
+
it "matches correctly" do
|
109
|
+
c = Command.new ["say", GlobParameter.new(:first), GlobParameter.new(:second)]
|
110
|
+
|
111
|
+
c.match("say one").should be_nil
|
112
|
+
c.match("say one two").should == [["one"], ["two"]]
|
113
|
+
c.match("say one two three").should == [["one", "two"], ["three"]]
|
114
|
+
c.match("say one 'two three'").should == [["one"], ["two three"]]
|
115
|
+
end
|
77
116
|
|
78
|
-
c.match("say hello").should be_nil
|
79
|
-
c.match("say hello loudly").should == ["hello", "loudly"]
|
80
|
-
c.match("say hello world loudly").should == ["hello world", "loudly"]
|
81
117
|
end
|
82
|
-
end
|
83
118
|
|
84
|
-
describe "#
|
119
|
+
end # describe "#match"
|
120
|
+
|
121
|
+
describe "#parameters" do
|
85
122
|
it "returns correctly" do
|
86
|
-
color =
|
87
|
-
flavor =
|
88
|
-
|
89
|
-
Command.new("one").
|
90
|
-
|
91
|
-
|
92
|
-
vs.first.name.should == :color
|
93
|
-
Command.new("one :color", nil, [color]).variables.should == [color]
|
94
|
-
Command.new("one :color", nil, [color, flavor]).variables.should == [color]
|
123
|
+
color = Parameter.new(:color, "")
|
124
|
+
flavor = GlobParameter.new(:flavor, "")
|
125
|
+
|
126
|
+
Command.new(["one"]).parameters.should == []
|
127
|
+
Command.new(["one", color]).parameters.should == [color]
|
128
|
+
Command.new(["one", color, flavor]).parameters == [color, flavor]
|
95
129
|
end
|
96
130
|
end
|
97
131
|
|
98
132
|
describe "#expansions" do
|
99
|
-
it "expands correctly with no
|
100
|
-
Command.new("one").expansions.should == ["one"]
|
133
|
+
it "expands correctly with no parameters" do
|
134
|
+
Command.new(["one"]).expansions.should == ["one"]
|
101
135
|
end
|
102
136
|
|
103
|
-
it "expands correctly with undefined
|
104
|
-
Command.new("go :dir
|
137
|
+
it "expands correctly with undefined parameters" do
|
138
|
+
Command.new(["go", Parameter.new(:dir)]).expansions.should == ["go <dir>"]
|
105
139
|
end
|
106
140
|
|
107
|
-
it "expands correctly with defined
|
108
|
-
|
109
|
-
|
110
|
-
Command.new("go
|
141
|
+
it "expands correctly with defined parameters" do
|
142
|
+
dir = Parameter.new(:dir, "", DIRECTIONS)
|
143
|
+
speed = Parameter.new(:speed, "", SPEEDS)
|
144
|
+
Command.new(["go", dir]).expansions.should == ["go n", "go e", "go s", "go w"]
|
145
|
+
Command.new(["go", dir, speed]).expansions.should ==
|
111
146
|
["go n quickly", "go n slowly",
|
112
147
|
"go e quickly", "go e slowly",
|
113
148
|
"go s quickly", "go s slowly",
|
114
149
|
"go w quickly", "go w slowly"]
|
115
150
|
end
|
151
|
+
|
152
|
+
it"expands correctly if parameter values have spaces" do
|
153
|
+
speed = Parameter.new(:speed, "", ["fast", "very fast"])
|
154
|
+
Command.new(["go", speed]).expansions.should == ['go fast', 'go "very fast"']
|
155
|
+
end
|
116
156
|
end
|
117
157
|
|
118
158
|
describe "#usage" do
|
119
159
|
it "returns correctly" do
|
120
|
-
color =
|
160
|
+
color = Parameter.new(:color, "")
|
121
161
|
|
122
|
-
Command.new("one").usage.should == "one"
|
123
|
-
Command.new("one
|
124
|
-
Command.new("one
|
125
|
-
Command.new("one :color three").usage.should == "one <color> three"
|
162
|
+
Command.new(["one"]).usage.should == "one"
|
163
|
+
Command.new(["one", color]).usage.should == "one <color>"
|
164
|
+
Command.new(["one", color, "three"]).usage.should == "one <color> three"
|
126
165
|
end
|
127
166
|
end
|
128
167
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prompt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Prompt makes it easy to build slick command-line applications with Tab
|
15
15
|
Completion, Command History, and Built-in Help
|
@@ -19,6 +19,8 @@ extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
21
|
- README.md
|
22
|
+
- CHANGELOG.md
|
23
|
+
- LICENSE.txt
|
22
24
|
- lib/prompt/application.rb
|
23
25
|
- lib/prompt/command.rb
|
24
26
|
- lib/prompt/command_group.rb
|
@@ -27,10 +29,11 @@ files:
|
|
27
29
|
- lib/prompt/console/console_module.rb
|
28
30
|
- lib/prompt/console.rb
|
29
31
|
- lib/prompt/dsl.rb
|
30
|
-
- lib/prompt/
|
31
|
-
- lib/prompt/
|
32
|
+
- lib/prompt/dsl_helper.rb
|
33
|
+
- lib/prompt/glob_parameter.rb
|
34
|
+
- lib/prompt/parameter.rb
|
35
|
+
- lib/prompt/proc_parameter.rb
|
32
36
|
- lib/prompt/prompt_module.rb
|
33
|
-
- lib/prompt/variable.rb
|
34
37
|
- lib/prompt.rb
|
35
38
|
- spec/prompt/command_spec.rb
|
36
39
|
- examples/file_manager
|
@@ -55,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
58
|
version: 1.3.6
|
56
59
|
requirements: []
|
57
60
|
rubyforge_project:
|
58
|
-
rubygems_version: 1.8.
|
61
|
+
rubygems_version: 1.8.15
|
59
62
|
signing_key:
|
60
63
|
specification_version: 3
|
61
64
|
summary: A small framework that makes it easy to build slick command-line applications
|