tcollier-commando 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/lib/commando.rb +12 -34
- data/lib/commando/config.rb +2 -0
- data/lib/commando/io_handler.rb +61 -0
- data/lib/commando/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bab78dc964fa7ce13e372cfed2902f152c3a0a2
|
4
|
+
data.tar.gz: c34eddbfb57a271a68c635d79d278c76053cb38b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57425515b9b2cd72748222130d6ea4ea39b65834c4315b3921c7e933505b70b4af0112ebb81f68c03155139437fd1af496f6dc842abe27b18d7df0fc5ee6df91
|
7
|
+
data.tar.gz: 8a7870cfe6aed8d9bab534d3161fbfacd448e7a0a1639b8682cc496db9b892197f20fd1ff78a454c4e113fbf3845cea2bbf79aa221f6ad47d71465cf5939bf19
|
data/README.md
CHANGED
@@ -7,6 +7,7 @@ A command line interface builder with Readline support
|
|
7
7
|
* `0.1.0` - Initial release
|
8
8
|
* `0.1.1` - Alphabetize commands printed via `help`
|
9
9
|
* `0.1.2` - Remove empty lines from history
|
10
|
+
* `0.2.0` - Persist history across CLI sessions
|
10
11
|
|
11
12
|
## Installation
|
12
13
|
|
@@ -31,9 +32,16 @@ of available commands to use.
|
|
31
32
|
|
32
33
|
```ruby
|
33
34
|
Commando.configure do |config|
|
35
|
+
# The greeting to print when the CLI is started
|
34
36
|
config.greeting = 'Welcome to my CLI. Type "help" for a list of commands'
|
37
|
+
|
38
|
+
# The prompt to print every time a new command is desired
|
35
39
|
config.prompt = 'my-app> '
|
36
40
|
|
41
|
+
# An optional file where command line history is stored across sessions
|
42
|
+
config.history_file = '/tmp/.commando_history'
|
43
|
+
|
44
|
+
# Register multiple commands
|
37
45
|
config.register 'addfriend', MyApp::AddFriend, 'Adds a friend to your network'
|
38
46
|
end
|
39
47
|
```
|
data/lib/commando.rb
CHANGED
@@ -1,16 +1,10 @@
|
|
1
1
|
require_relative 'commando/config'
|
2
2
|
require_relative 'commando/interpreter'
|
3
|
+
require_relative 'commando/io_handler'
|
3
4
|
require_relative 'commando/quit_exception'
|
4
5
|
require_relative 'commando/validation_error'
|
5
6
|
require_relative 'commando/version'
|
6
7
|
|
7
|
-
require 'readline'
|
8
|
-
# Configure readline
|
9
|
-
comp = proc { |s| Commando.config.commands.grep(/^#{Regexp.escape(s)}/) }
|
10
|
-
|
11
|
-
Readline.completion_append_character = " "
|
12
|
-
Readline.completion_proc = comp
|
13
|
-
|
14
8
|
# Entry point for the Command Line Interface (CLI).
|
15
9
|
#
|
16
10
|
# Present the user with a text-based interface, where a prompt is printed,
|
@@ -29,38 +23,22 @@ module Commando
|
|
29
23
|
|
30
24
|
# Begin the prompt, get input, process loop.
|
31
25
|
def self.start(output: $stdout)
|
32
|
-
Readline.output = output
|
33
26
|
output.puts config.greeting
|
34
|
-
quit = false
|
35
27
|
|
36
|
-
|
37
|
-
line = Readline.readline(config.prompt, true)
|
28
|
+
io = IOHandler.new(output: output)
|
38
29
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
# If the user just hit enter without typing a command, remove that line
|
46
|
-
# from history.
|
47
|
-
Readline::HISTORY.pop
|
48
|
-
else
|
49
|
-
# When the user enters a non-empty string, pass the line to the
|
50
|
-
# interpreter and handle the command.
|
51
|
-
#
|
52
|
-
# If the user enters an empty string (e.g. "" or " "), we simply
|
53
|
-
# go back to the top of the loop to print out the prompt and wait
|
54
|
-
# for the next command.
|
55
|
-
interpreter = Interpreter.new(input: line, output: output)
|
56
|
-
|
57
|
-
begin
|
30
|
+
loop do
|
31
|
+
begin
|
32
|
+
if line = io.readline
|
33
|
+
# When the user enters a non-empty string, pass the line to the
|
34
|
+
# interpreter and handle the command.
|
35
|
+
interpreter = Interpreter.new(input: line, output: output)
|
58
36
|
interpreter.interpret
|
59
|
-
rescue ValidationError => error
|
60
|
-
output.puts "Error: #{error}"
|
61
|
-
rescue QuitException
|
62
|
-
break
|
63
37
|
end
|
38
|
+
rescue ValidationError => error
|
39
|
+
output.puts "Error: #{error}"
|
40
|
+
rescue QuitException
|
41
|
+
break
|
64
42
|
end
|
65
43
|
end
|
66
44
|
end
|
data/lib/commando/config.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'readline'
|
2
|
+
|
3
|
+
require_relative 'quit_exception'
|
4
|
+
|
5
|
+
module Commando
|
6
|
+
# Handle the prompt/input for the command line interface
|
7
|
+
class IOHandler
|
8
|
+
def initialize(output:)
|
9
|
+
@output = output
|
10
|
+
|
11
|
+
configure_readline
|
12
|
+
load_history
|
13
|
+
end
|
14
|
+
|
15
|
+
def readline
|
16
|
+
line = Readline.readline(Commando.config.prompt, true)
|
17
|
+
if line.nil?
|
18
|
+
# When the user presses <CMD>+D, this comes through as nil. In that
|
19
|
+
# case we want to exit
|
20
|
+
output.puts
|
21
|
+
raise QuitException
|
22
|
+
elsif line.strip == ''
|
23
|
+
# If the user just hit enter without typing a command, remove that line
|
24
|
+
# from history.
|
25
|
+
Readline::HISTORY.pop
|
26
|
+
nil
|
27
|
+
else
|
28
|
+
save_history(line)
|
29
|
+
line
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :output
|
36
|
+
|
37
|
+
def configure_readline
|
38
|
+
Readline.output = output
|
39
|
+
Readline.completion_proc =
|
40
|
+
proc { |s| Commando.config.commands.grep(/^#{Regexp.escape(s)}/) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_history
|
44
|
+
if Commando.config.history_file
|
45
|
+
File.readlines(Commando.config.history_file).each do |line|
|
46
|
+
Readline::HISTORY.push(line.chomp)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def save_history(line)
|
52
|
+
if Commando.config.history_file
|
53
|
+
File.open(Commando.config.history_file, 'a') do |f|
|
54
|
+
f.puts line
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private_constant :IOHandler
|
61
|
+
end
|
data/lib/commando/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcollier-commando
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Collier
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/commando/action/quit.rb
|
77
77
|
- lib/commando/config.rb
|
78
78
|
- lib/commando/interpreter.rb
|
79
|
+
- lib/commando/io_handler.rb
|
79
80
|
- lib/commando/quit_exception.rb
|
80
81
|
- lib/commando/validation_error.rb
|
81
82
|
- lib/commando/version.rb
|