prompt 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## What is this?
4
4
 
5
- Prompt makes it easy to build slick command-line applications with [Tab Completion](#tabcompletion), [Command History](#commandhistory), and [Built-in Help](#built-inhelp)
5
+ Prompt makes it easy to build slick command-line applications with Tab Completion, Command History, and Built-in Help
6
6
 
7
7
  ## Installation
8
8
 
@@ -108,6 +108,15 @@ end
108
108
 
109
109
  Here, the variables 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
+
112
+ Each `:variable` only matches a single word. If you want to match multiple words to one variable, use a `*variable`.
113
+
114
+ ```ruby
115
+ command "say *sentence" do |sentence|
116
+ puts "You say '#{sentence}'"
117
+ end
118
+ ```
119
+
111
120
  ### Defining variables
112
121
 
113
122
  It's not necessary to define a variable before using it in a command, but doing so will allow you to provide a useful description and valid values for the variable.
@@ -136,8 +145,8 @@ end
136
145
 
137
146
  ## Configuration options
138
147
 
139
- The default prompt `"> "` can be changed before starting the console.
148
+ The default prompt `"> "` can be changed before starting the console, or while it's running.
140
149
 
141
150
  ```ruby
142
- Prompt::Console.prompt = "#{Dir.pwd}> "
151
+ Prompt.application.prompt = "#{Dir.pwd}> "
143
152
  ```
@@ -4,21 +4,34 @@ require 'prompt'
4
4
 
5
5
  extend Prompt::DSL
6
6
 
7
+ def change_prompt dir
8
+ Prompt.application.prompt = "#{@pwd}> "
9
+ end
10
+
7
11
  @pwd = File.absolute_path Dir.pwd
12
+ change_prompt @pwd
8
13
 
9
14
  dynamic_variable :dir, "Directory" do
10
15
  Dir.entries(@pwd).select do |e|
11
- File.directory? e
16
+ File.directory?(File.join(@pwd, e))
12
17
  end
13
18
  end
14
19
 
15
20
  command "cd :dir", "Change directory" do |dir|
16
21
  @pwd = File.absolute_path File.join(@pwd, dir)
22
+ change_prompt @pwd
17
23
  end
18
24
 
19
25
  command "ls", "List files" do
20
26
  puts @pwd
21
- puts Dir.entries(@pwd)
27
+ Dir.entries(@pwd).select do |e|
28
+ path = File.join(@pwd, e)
29
+ if File.directory?(path)
30
+ puts "#{e}/"
31
+ else
32
+ puts e
33
+ end
34
+ end
22
35
  end
23
36
 
24
37
  command "pwd", "Print current directory" do
data/examples/mud CHANGED
@@ -30,7 +30,7 @@ command "look", "Look around" do
30
30
  end
31
31
  end
32
32
 
33
- command "say :something", "Say something" do |something|
33
+ command "say *something", "Say something" do |something|
34
34
  puts "You say '#{something}'"
35
35
  end
36
36
 
@@ -4,9 +4,11 @@ require 'prompt/command'
4
4
  module Prompt
5
5
  class Application
6
6
  attr :command_groups
7
+ attr_accessor :prompt
7
8
 
8
9
  def initialize
9
10
  @command_groups = []
11
+ @prompt = "> "
10
12
  end
11
13
 
12
14
  def use_command_group desc
@@ -17,7 +17,7 @@ module Prompt
17
17
 
18
18
  def match(str)
19
19
  if m = regex.match(str.strip)
20
- m[1..-1]
20
+ variables.map {|v| m[v.name.to_s] }
21
21
  end
22
22
  end
23
23
 
@@ -43,7 +43,7 @@ module Prompt
43
43
  private
44
44
 
45
45
  def regex
46
- @regex ||= begin
46
+ begin
47
47
  regex_strs = words.map do |word|
48
48
  case word
49
49
  when Variable
@@ -61,6 +61,9 @@ module Prompt
61
61
  if word[0] == ":"
62
62
  sym = word[1..-1].to_sym
63
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)
64
67
  else
65
68
  word
66
69
  end
@@ -5,15 +5,12 @@ module Prompt
5
5
  module Console
6
6
 
7
7
  HISTORY_MAX_SIZE = 100
8
- PROMPT = "> "
9
8
 
10
9
  CompletionProc = proc do |s|
11
10
  Prompt.application.completions(s)
12
11
  end
13
12
 
14
13
  def self.start(history_file = nil)
15
- @prompt = PROMPT
16
-
17
14
  # Store the state of the terminal
18
15
  stty_save = `stty -g`.chomp
19
16
  # and restore it when exiting
@@ -28,7 +25,7 @@ module Prompt
28
25
 
29
26
  load_history history_file if history_file
30
27
 
31
- while line = Readline.readline(@prompt, true)
28
+ while line = Readline.readline(Prompt.application.prompt, true)
32
29
  begin
33
30
  Prompt.application.exec(line).nil?
34
31
  rescue ::Prompt::CommandNotFound => e
@@ -37,14 +34,6 @@ module Prompt
37
34
  end
38
35
  end
39
36
 
40
- def self.prompt= prompt
41
- @prompt = prompt
42
- end
43
-
44
- def self.prompt
45
- @prompt
46
- end
47
-
48
37
  def self.save_history file
49
38
  history_no_dups = Readline::HISTORY.to_a.reverse.uniq[0,HISTORY_MAX_SIZE].reverse
50
39
  File.open(file, "w") do |f|
data/lib/prompt/dsl.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'prompt/variable'
2
2
  require 'prompt/proc_variable'
3
+ require 'prompt/glob_variable'
3
4
 
4
5
  module Prompt
5
6
  module DSL
@@ -0,0 +1,14 @@
1
+ module Prompt
2
+ class GlobVariable < Variable
3
+
4
+ def initialize(name, desc, &block)
5
+ super(name, desc, nil)
6
+ @proc = block
7
+ end
8
+
9
+ def regex
10
+ "(?<#{name}>.+)"
11
+ end
12
+
13
+ end
14
+ end
@@ -1,4 +1,6 @@
1
1
  module Prompt
2
+ VERSION = "0.0.2"
3
+
2
4
  class << self
3
5
 
4
6
  # Singleton instance
@@ -13,9 +13,9 @@ module Prompt
13
13
 
14
14
  def regex
15
15
  if values
16
- "(#{values.map{|v| Regexp.escape(v)}.join("|")})"
16
+ "(?<#{name}>#{values.map{|v| Regexp.escape(v)}.join("|")})"
17
17
  else
18
- "([^\s]+)"
18
+ "('(?<#{name}>[^\']*)'|\"(?<#{name}>[^\"]*)\"|(?<#{name}>[^\s]+))"
19
19
  end
20
20
  end
21
21
 
@@ -1,5 +1,6 @@
1
1
  require 'prompt/command'
2
2
  require 'prompt/variable'
3
+ require 'prompt/glob_variable'
3
4
 
4
5
  include Prompt
5
6
 
@@ -25,6 +26,15 @@ describe Prompt::Command do
25
26
  c = Command.new("hi :name")
26
27
 
27
28
  c.match("hi guy").should == ["guy"]
29
+ c.match("hi 'some guy'").should == ["some guy"]
30
+ c.match("hi ''").should == [""]
31
+ c.match('hi "some guy"').should == ["some guy"]
32
+ c.match('hi ""').should == [""]
33
+
34
+ c.match("hi '").should == ["'"]
35
+ c.match('hi "').should == ['"']
36
+ c.match('hi \'"').should == ['\'"']
37
+
28
38
  c.match("higuy").should be_nil
29
39
  c.match("higuy guy").should be_nil
30
40
  end
@@ -54,6 +64,21 @@ describe Prompt::Command do
54
64
  c.match("go x").should be_nil
55
65
  c.match("go nn").should be_nil
56
66
  end
67
+
68
+ it "matches correctly with glob variable" do
69
+ c = Command.new("say *stuff")
70
+
71
+ c.match("say hello").should == ["hello"]
72
+ c.match("say hello world").should == ["hello world"]
73
+ end
74
+
75
+ it "matches correctly with glob variable and other variable" do
76
+ c = Command.new("say *stuff :adverb")
77
+
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
+ end
57
82
  end
58
83
 
59
84
  describe "#variables" do
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.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -27,6 +27,7 @@ files:
27
27
  - lib/prompt/console/console_module.rb
28
28
  - lib/prompt/console.rb
29
29
  - lib/prompt/dsl.rb
30
+ - lib/prompt/glob_variable.rb
30
31
  - lib/prompt/proc_variable.rb
31
32
  - lib/prompt/prompt_module.rb
32
33
  - lib/prompt/variable.rb