clamp 0.1.2 → 0.1.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/examples/speak +4 -0
- data/lib/clamp/command.rb +2 -2
- data/lib/clamp/help.rb +15 -0
- data/lib/clamp/subcommand.rb +23 -0
- data/lib/clamp/subcommand/declaration.rb +4 -8
- data/lib/clamp/version.rb +1 -1
- data/spec/clamp/command_group_spec.rb +37 -0
- data/spec/clamp/command_spec.rb +23 -0
- metadata +5 -4
data/examples/speak
CHANGED
data/lib/clamp/command.rb
CHANGED
@@ -115,13 +115,13 @@ module Clamp
|
|
115
115
|
# @param [Array<String>] arguments command-line arguments
|
116
116
|
# @param [Hash] context additional data the command may need
|
117
117
|
#
|
118
|
-
def run(invocation_path = $0, arguments = ARGV, context = {})
|
118
|
+
def run(invocation_path = File.basename($0), arguments = ARGV, context = {})
|
119
119
|
begin
|
120
120
|
new(invocation_path, context).run(arguments)
|
121
121
|
rescue Clamp::UsageError => e
|
122
122
|
$stderr.puts "ERROR: #{e.message}"
|
123
123
|
$stderr.puts ""
|
124
|
-
$stderr.puts "See: '#{invocation_path} --help'"
|
124
|
+
$stderr.puts "See: '#{e.command.invocation_path} --help'"
|
125
125
|
exit(1)
|
126
126
|
rescue Clamp::HelpWanted => e
|
127
127
|
puts e.command.help
|
data/lib/clamp/help.rb
CHANGED
@@ -11,6 +11,17 @@ module Clamp
|
|
11
11
|
|
12
12
|
attr_reader :declared_usage_descriptions
|
13
13
|
|
14
|
+
def description=(description)
|
15
|
+
@description = description.dup
|
16
|
+
if @description =~ /^\A\n*( +)/
|
17
|
+
indent = $1
|
18
|
+
@description.gsub!(/^#{indent}/, '')
|
19
|
+
end
|
20
|
+
@description.strip!
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :description
|
24
|
+
|
14
25
|
def derived_usage_description
|
15
26
|
parts = parameters.map { |a| a.name }
|
16
27
|
parts.unshift("[OPTIONS]") if has_options?
|
@@ -27,6 +38,10 @@ module Clamp
|
|
27
38
|
usage_descriptions.each_with_index do |usage, i|
|
28
39
|
help.puts " #{invocation_path} #{usage}".rstrip
|
29
40
|
end
|
41
|
+
if description
|
42
|
+
help.puts ""
|
43
|
+
help.puts description.gsub(/^/, " ")
|
44
|
+
end
|
30
45
|
detail_format = " %-29s %s"
|
31
46
|
if has_parameters?
|
32
47
|
help.puts "\nParameters:"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Clamp
|
2
|
+
|
3
|
+
class Subcommand < Struct.new(:name, :description, :subcommand_class)
|
4
|
+
|
5
|
+
def initialize(names, description, subcommand_class)
|
6
|
+
@names = Array(names)
|
7
|
+
@description = description
|
8
|
+
@subcommand_class = subcommand_class
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :names, :description, :subcommand_class
|
12
|
+
|
13
|
+
def is_called?(name)
|
14
|
+
names.member?(name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def help
|
18
|
+
[names.join(", "), description]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -1,10 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class Subcommand < Struct.new(:name, :description, :subcommand_class)
|
1
|
+
require 'clamp/subcommand'
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
end
|
3
|
+
module Clamp
|
4
|
+
class Subcommand
|
8
5
|
|
9
6
|
module Declaration
|
10
7
|
|
@@ -26,7 +23,7 @@ module Clamp
|
|
26
23
|
end
|
27
24
|
|
28
25
|
def find_subcommand(name)
|
29
|
-
recognised_subcommands.find { |sc| sc.name
|
26
|
+
recognised_subcommands.find { |sc| sc.is_called?(name) }
|
30
27
|
end
|
31
28
|
|
32
29
|
def has_subcommands!
|
@@ -40,5 +37,4 @@ module Clamp
|
|
40
37
|
end
|
41
38
|
|
42
39
|
end
|
43
|
-
|
44
40
|
end
|
data/lib/clamp/version.rb
CHANGED
@@ -52,6 +52,43 @@ describe Clamp::Command do
|
|
52
52
|
|
53
53
|
end
|
54
54
|
|
55
|
+
describe "with an aliased subcommand" do
|
56
|
+
|
57
|
+
given_command "blah" do
|
58
|
+
|
59
|
+
subcommand ["say", "talk"], "Say something" do
|
60
|
+
|
61
|
+
parameter "WORD ...", "stuff to say"
|
62
|
+
|
63
|
+
def execute
|
64
|
+
puts word_list
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
it "responds to both aliases" do
|
72
|
+
|
73
|
+
@command.run(["say", "boo"])
|
74
|
+
stdout.should =~ /boo/
|
75
|
+
|
76
|
+
@command.run(["talk", "jive"])
|
77
|
+
stdout.should =~ /jive/
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#help" do
|
82
|
+
|
83
|
+
it "lists all aliases" do
|
84
|
+
@help = @command.help
|
85
|
+
@help.should =~ /say, talk .* Say something/
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
55
92
|
describe "with nested subcommands" do
|
56
93
|
|
57
94
|
given_command "fubar" do
|
data/spec/clamp/command_spec.rb
CHANGED
@@ -385,6 +385,29 @@ describe Clamp::Command do
|
|
385
385
|
|
386
386
|
end
|
387
387
|
|
388
|
+
describe "with a description" do
|
389
|
+
|
390
|
+
given_command("punt") do
|
391
|
+
|
392
|
+
self.description = <<-EOF
|
393
|
+
Punt is an example command. It doesn't do much, really.
|
394
|
+
|
395
|
+
The prefix at the beginning of this description should be normalised
|
396
|
+
to two spaces.
|
397
|
+
EOF
|
398
|
+
|
399
|
+
end
|
400
|
+
|
401
|
+
describe "#help" do
|
402
|
+
|
403
|
+
it "includes the description" do
|
404
|
+
@command.help.should =~ /^ Punt is an example command/
|
405
|
+
@command.help.should =~ /^ The prefix/
|
406
|
+
end
|
407
|
+
|
408
|
+
end
|
409
|
+
|
410
|
+
end
|
388
411
|
describe ".run" do
|
389
412
|
|
390
413
|
it "creates a new Command instance and runs it" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clamp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mike Williams
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-24 00:00:00 +11:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- lib/clamp/parameter.rb
|
51
51
|
- lib/clamp/parameter/declaration.rb
|
52
52
|
- lib/clamp/parameter/parsing.rb
|
53
|
+
- lib/clamp/subcommand.rb
|
53
54
|
- lib/clamp/subcommand/declaration.rb
|
54
55
|
- lib/clamp/subcommand/execution.rb
|
55
56
|
- lib/clamp/version.rb
|