clamp 0.2.0 → 0.2.1
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/README.markdown +1 -1
- data/examples/gitdown +61 -0
- data/lib/clamp/option/declaration.rb +4 -10
- data/lib/clamp/version.rb +1 -1
- data/spec/clamp/command_group_spec.rb +15 -3
- data/spec/clamp/option_spec.rb +24 -1
- metadata +5 -4
data/README.markdown
CHANGED
@@ -221,7 +221,7 @@ You can mark a subcommand as "default" by using `default_subcommand` to declare
|
|
221
221
|
|
222
222
|
### Subcommand options and parameters
|
223
223
|
|
224
|
-
Options are inheritable, so any options declared for a
|
224
|
+
Options are inheritable, so any options declared for a command are supported for it's sub-classes (e.g. those created using `subcommand`). Parameters, on the other hand, are not inherited - each subcommand must declare it's own parameter list.
|
225
225
|
|
226
226
|
Note that, if a subcommand accepts options, they must be specified on the command-line _after_ the subcommand name.
|
227
227
|
|
data/examples/gitdown
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# Demonstrate how subcommands can be declared as classes
|
4
|
+
|
5
|
+
require "clamp"
|
6
|
+
|
7
|
+
module GitDown
|
8
|
+
|
9
|
+
class AbstractCommand < Clamp::Command
|
10
|
+
|
11
|
+
option ["-v", "--verbose"], :flag, "be verbose"
|
12
|
+
|
13
|
+
option "--version", :flag, "show version" do
|
14
|
+
puts "GitDown-0.0.0a"
|
15
|
+
exit(0)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
class CloneCommand < AbstractCommand
|
21
|
+
|
22
|
+
parameter "REPOSITORY", "repository to clone"
|
23
|
+
parameter "[DIR]", "working directory", :default => "."
|
24
|
+
|
25
|
+
def execute
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
class PullCommand < AbstractCommand
|
32
|
+
|
33
|
+
option "--[no-]commit", :flag, "Perform the merge and commit the result."
|
34
|
+
|
35
|
+
def execute
|
36
|
+
raise NotImplementedError
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class StatusCommand < AbstractCommand
|
42
|
+
|
43
|
+
option ["-s", "--short"], :flag, "Give the output in the short-format."
|
44
|
+
|
45
|
+
def execute
|
46
|
+
raise NotImplementedError
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
class MainCommand < AbstractCommand
|
52
|
+
|
53
|
+
subcommand "clone", "Clone a remote repository.", CloneCommand
|
54
|
+
subcommand "pull", "Fetch and merge updates.", PullCommand
|
55
|
+
subcommand "status", "Display status of local repository.", StatusCommand
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
GitDown::MainCommand.run
|
@@ -27,16 +27,6 @@ module Clamp
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def documented_options
|
30
|
-
declared_options + inherited_declared_options
|
31
|
-
end
|
32
|
-
|
33
|
-
def recognised_options
|
34
|
-
documented_options + standard_options
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def inherited_declared_options
|
40
30
|
ancestors.inject([]) do |options, ancestor|
|
41
31
|
if ancestor.kind_of?(Clamp::Option::Declaration)
|
42
32
|
options + ancestor.declared_options
|
@@ -46,6 +36,10 @@ module Clamp
|
|
46
36
|
end
|
47
37
|
end
|
48
38
|
|
39
|
+
def recognised_options
|
40
|
+
documented_options + standard_options
|
41
|
+
end
|
42
|
+
|
49
43
|
HELP_OPTION = Clamp::Option.new("--help", :flag, "print help", :attribute_name => :help_requested)
|
50
44
|
|
51
45
|
def standard_options
|
data/lib/clamp/version.rb
CHANGED
@@ -131,15 +131,22 @@ describe Clamp::Command do
|
|
131
131
|
|
132
132
|
before do
|
133
133
|
|
134
|
+
speed_options = Module.new do
|
135
|
+
extend Clamp::Option::Declaration
|
136
|
+
option "--speed", "SPEED", "how fast", :default => "slowly"
|
137
|
+
end
|
138
|
+
|
134
139
|
@command_class = Class.new(Clamp::Command) do
|
135
140
|
|
136
141
|
option "--direction", "DIR", "which way", :default => "home"
|
137
142
|
|
143
|
+
include speed_options
|
144
|
+
|
138
145
|
subcommand "move", "move in the appointed direction" do
|
139
146
|
|
140
147
|
def execute
|
141
148
|
motion = context[:motion] || "walking"
|
142
|
-
puts "#{motion} #{direction}"
|
149
|
+
puts "#{motion} #{direction} #{speed}"
|
143
150
|
end
|
144
151
|
|
145
152
|
end
|
@@ -150,16 +157,21 @@ describe Clamp::Command do
|
|
150
157
|
|
151
158
|
end
|
152
159
|
|
153
|
-
it "accepts
|
160
|
+
it "accepts options defined in superclass (specified after the subcommand)" do
|
154
161
|
@command.run(["move", "--direction", "north"])
|
155
162
|
stdout.should =~ /walking north/
|
156
163
|
end
|
157
164
|
|
158
|
-
it "accepts
|
165
|
+
it "accepts options defined in superclass (specified before the subcommand)" do
|
159
166
|
@command.run(["--direction", "north", "move"])
|
160
167
|
stdout.should =~ /walking north/
|
161
168
|
end
|
162
169
|
|
170
|
+
it "accepts options defined in included modules" do
|
171
|
+
@command.run(["move", "--speed", "very quickly"])
|
172
|
+
stdout.should =~ /walking home very quickly/
|
173
|
+
end
|
174
|
+
|
163
175
|
it "has access to command context" do
|
164
176
|
@command = @command_class.new("go", :motion => "wandering")
|
165
177
|
@command.run(["move"])
|
data/spec/clamp/option_spec.rb
CHANGED
@@ -122,5 +122,28 @@ describe Clamp::Option do
|
|
122
122
|
end
|
123
123
|
|
124
124
|
end
|
125
|
+
|
126
|
+
describe "in subcommand" do
|
127
|
+
before do
|
128
|
+
|
129
|
+
@command = Class.new(Clamp::Command) do
|
130
|
+
subcommand "foo", "FOO!" do
|
131
|
+
option "--bar", "BAR", "Bars foo."
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "Command#help" do
|
138
|
+
|
139
|
+
it "includes help for each option exactly once" do
|
140
|
+
subcommand = @command.new("").send(:find_subcommand, 'foo')
|
141
|
+
subcommand_help = subcommand.subcommand_class.help("")
|
142
|
+
subcommand_help.lines.grep(/--bar BAR/).count.should == 1
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
125
148
|
|
126
|
-
end
|
149
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: clamp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Mike Williams
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-06-27 00:00:00 Z
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: |
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- clamp.gemspec
|
33
33
|
- examples/flipflop
|
34
34
|
- examples/fubar
|
35
|
+
- examples/gitdown
|
35
36
|
- examples/speak
|
36
37
|
- lib/clamp.rb
|
37
38
|
- lib/clamp/attribute.rb
|
@@ -68,7 +69,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
68
69
|
requirements:
|
69
70
|
- - ">="
|
70
71
|
- !ruby/object:Gem::Version
|
71
|
-
hash:
|
72
|
+
hash: -3288603544677427312
|
72
73
|
segments:
|
73
74
|
- 0
|
74
75
|
version: "0"
|
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
78
|
requirements:
|
78
79
|
- - ">="
|
79
80
|
- !ruby/object:Gem::Version
|
80
|
-
hash:
|
81
|
+
hash: -3288603544677427312
|
81
82
|
segments:
|
82
83
|
- 0
|
83
84
|
version: "0"
|