jls-clamp 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Clamp::Command do
4
+
5
+ include OutputCapture
6
+
7
+ describe "with included module" do
8
+
9
+ before do
10
+
11
+ shared_options = Module.new do
12
+ extend Clamp::Option::Declaration
13
+ option "--size", "SIZE", :default => 4
14
+ end
15
+
16
+ @command_class = Class.new(Clamp::Command) do
17
+
18
+ include shared_options
19
+
20
+ def execute
21
+ puts "size = #{size}"
22
+ end
23
+
24
+ end
25
+
26
+ @command = @command_class.new("foo")
27
+
28
+ end
29
+
30
+ it "accepts options from included module" do
31
+ @command.run(["--size", "42"])
32
+ stdout.should == "size = 42\n"
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+
3
+ describe Clamp::Option do
4
+
5
+ describe "with String argument" do
6
+
7
+ before do
8
+ @option = Clamp::Option.new("--key-file", "FILE", "SSH identity")
9
+ end
10
+
11
+ it "has a long_switch" do
12
+ @option.long_switch.should == "--key-file"
13
+ end
14
+
15
+ it "has a type" do
16
+ @option.type.should == "FILE"
17
+ end
18
+
19
+ it "has a description" do
20
+ @option.description.should == "SSH identity"
21
+ end
22
+
23
+ describe "#attribute_name" do
24
+
25
+ it "is derived from the (long) switch" do
26
+ @option.attribute_name.should == "key_file"
27
+ end
28
+
29
+ it "can be overridden" do
30
+ @option = Clamp::Option.new("--key-file", "FILE", "SSH identity", :attribute_name => "ssh_identity")
31
+ @option.attribute_name.should == "ssh_identity"
32
+ end
33
+
34
+ end
35
+
36
+ describe "#default_value" do
37
+
38
+ it "defaults to nil" do
39
+ @option.default_value.should == nil
40
+ end
41
+
42
+ it "can be overridden" do
43
+ @option = Clamp::Option.new("-n", "N", "iterations", :default => 1)
44
+ @option.default_value.should == 1
45
+ end
46
+
47
+ end
48
+
49
+ describe "#help" do
50
+
51
+ it "combines switch, type and description" do
52
+ @option.help.should == ["--key-file FILE", "SSH identity"]
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ describe "flag" do
60
+
61
+ before do
62
+ @option = Clamp::Option.new("--verbose", :flag, "Blah blah blah")
63
+ end
64
+
65
+ describe "#help" do
66
+
67
+ it "excludes option argument" do
68
+ @option.help.should == ["--verbose", "Blah blah blah"]
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ describe "negatable flag" do
76
+
77
+ before do
78
+ @option = Clamp::Option.new("--[no-]force", :flag, "Force installation")
79
+ end
80
+
81
+ it "handles both positive and negative forms" do
82
+ @option.handles?("--force").should be_true
83
+ @option.handles?("--no-force").should be_true
84
+ end
85
+
86
+ describe "#flag_value" do
87
+
88
+ it "returns true for the positive variant" do
89
+ @option.flag_value("--force").should be_true
90
+ @option.flag_value("--no-force").should be_false
91
+ end
92
+
93
+ end
94
+
95
+ describe "#attribute_name" do
96
+
97
+ it "is derived from the (long) switch" do
98
+ @option.attribute_name.should == "force"
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+
105
+ describe "with both short and long switches" do
106
+
107
+ before do
108
+ @option = Clamp::Option.new(["-k", "--key-file"], "FILE", "SSH identity")
109
+ end
110
+
111
+ it "handles both switches" do
112
+ @option.handles?("--key-file").should be_true
113
+ @option.handles?("-k").should be_true
114
+ end
115
+
116
+ describe "#help" do
117
+
118
+ it "includes both switches" do
119
+ @option.help.should == ["-k, --key-file FILE", "SSH identity"]
120
+ end
121
+
122
+ end
123
+
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
148
+
149
+ end
@@ -0,0 +1,201 @@
1
+ require 'spec_helper'
2
+
3
+ describe Clamp::Parameter do
4
+
5
+ describe "normal" do
6
+
7
+ before do
8
+ @parameter = Clamp::Parameter.new("COLOR", "hue of choice")
9
+ end
10
+
11
+ it "has a name" do
12
+ @parameter.name.should == "COLOR"
13
+ end
14
+
15
+ it "has a description" do
16
+ @parameter.description.should == "hue of choice"
17
+ end
18
+
19
+ describe "#attribute_name" do
20
+
21
+ it "is derived from the name" do
22
+ @parameter.attribute_name.should == "color"
23
+ end
24
+
25
+ it "can be overridden" do
26
+ @parameter = Clamp::Parameter.new("COLOR", "hue of choice", :attribute_name => "hue")
27
+ @parameter.attribute_name.should == "hue"
28
+ end
29
+
30
+ end
31
+
32
+ describe "#consume" do
33
+
34
+ it "consumes one argument" do
35
+ @arguments = %w(a b c)
36
+ @parameter.consume(@arguments).should == "a"
37
+ @arguments.should == %w(b c)
38
+ end
39
+
40
+ describe "with no arguments" do
41
+
42
+ it "raises an Argument error" do
43
+ @arguments = []
44
+ lambda do
45
+ @parameter.consume(@arguments)
46
+ end.should raise_error(ArgumentError)
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ end
54
+
55
+ describe "optional (name in square brackets)" do
56
+
57
+ before do
58
+ @parameter = Clamp::Parameter.new("[COLOR]", "hue of choice")
59
+ end
60
+
61
+ describe "#attribute_name" do
62
+
63
+ it "omits the brackets" do
64
+ @parameter.attribute_name.should == "color"
65
+ end
66
+
67
+ end
68
+
69
+ describe "#consume" do
70
+
71
+ it "consumes one argument" do
72
+ @arguments = %w(a b c)
73
+ @parameter.consume(@arguments).should == "a"
74
+ @arguments.should == %w(b c)
75
+ end
76
+
77
+ describe "with no arguments" do
78
+
79
+ it "returns nil" do
80
+ @arguments = []
81
+ @parameter.consume(@arguments).should == nil
82
+ end
83
+
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+
90
+ describe "list (name followed by ellipsis)" do
91
+
92
+ before do
93
+ @parameter = Clamp::Parameter.new("FILE ...", "files to process")
94
+ end
95
+
96
+ describe "#attribute_name" do
97
+
98
+ it "indicates multiplicity" do
99
+ @parameter.attribute_name.should == "file_list"
100
+ end
101
+
102
+ end
103
+
104
+ describe "#consume" do
105
+
106
+ it "consumes all the remaining arguments" do
107
+ @arguments = %w(a b c)
108
+ @parameter.consume(@arguments).should == %w(a b c)
109
+ @arguments.should == []
110
+ end
111
+
112
+ describe "with no arguments" do
113
+
114
+ it "raises an Argument error" do
115
+ @arguments = []
116
+ lambda do
117
+ @parameter.consume(@arguments)
118
+ end.should raise_error(ArgumentError)
119
+ end
120
+
121
+ end
122
+
123
+ end
124
+ end
125
+
126
+ describe "optional list" do
127
+
128
+ before do
129
+ @parameter = Clamp::Parameter.new("[FILES] ...", "files to process")
130
+ end
131
+
132
+ describe "#attribute_name" do
133
+
134
+ it "indicates multiplicity" do
135
+ @parameter.attribute_name.should == "files_list"
136
+ end
137
+
138
+ end
139
+
140
+ describe "#default_value" do
141
+
142
+ it "is an empty list" do
143
+ @parameter.default_value.should == []
144
+ end
145
+
146
+ end
147
+
148
+ describe "#help" do
149
+
150
+ it "does not include default" do
151
+ @parameter.help_rhs.should_not include("default:")
152
+ end
153
+
154
+ end
155
+
156
+ describe "with specified default value" do
157
+
158
+ before do
159
+ @parameter = Clamp::Parameter.new("[FILES] ...", "files to process", :default => %w(a b c))
160
+ end
161
+
162
+ describe "#default_value" do
163
+
164
+ it "is that specified" do
165
+ @parameter.default_value.should == %w(a b c)
166
+ end
167
+
168
+ end
169
+
170
+ describe "#help" do
171
+
172
+ it "includes the default value" do
173
+ @parameter.help_rhs.should include("default:")
174
+ end
175
+
176
+ end
177
+
178
+ describe "#consume" do
179
+
180
+ it "consumes all the remaining arguments" do
181
+ @arguments = %w(a b c)
182
+ @parameter.consume(@arguments).should == %w(a b c)
183
+ @arguments.should == []
184
+ end
185
+
186
+ describe "with no arguments" do
187
+
188
+ it "don't override defaults" do
189
+ @arguments = []
190
+ @parameter.consume(@arguments).should == nil
191
+ end
192
+
193
+ end
194
+
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+
201
+ end
@@ -0,0 +1,45 @@
1
+ require "rspec"
2
+ require "clamp"
3
+ require 'stringio'
4
+
5
+ RSpec.configure do |config|
6
+
7
+ config.mock_with :rr
8
+
9
+ end
10
+
11
+ module OutputCapture
12
+
13
+ def self.included(target)
14
+
15
+ target.before do
16
+ $stdout = @out = StringIO.new
17
+ $stderr = @err = StringIO.new
18
+ end
19
+
20
+ target.after do
21
+ $stdout = STDOUT
22
+ $stderr = STDERR
23
+ end
24
+
25
+ end
26
+
27
+ def stdout
28
+ @out.string
29
+ end
30
+
31
+ def stderr
32
+ @err.string
33
+ end
34
+
35
+ end
36
+
37
+ module CommandFactory
38
+
39
+ def given_command(name, &block)
40
+ before do
41
+ @command = Class.new(Clamp::Command, &block).new(name)
42
+ end
43
+ end
44
+
45
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jls-clamp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mike Williams
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-25 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! "Clamp provides an object-model for command-line utilities. \nIt handles
15
+ parsing of command-line options, and generation of usage help.\n"
16
+ email: mdub@dogbiscuit.org
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - .travis.yml
23
+ - Gemfile
24
+ - README.markdown
25
+ - Rakefile
26
+ - clamp.gemspec
27
+ - examples/flipflop
28
+ - examples/fubar
29
+ - examples/gitdown
30
+ - examples/speak
31
+ - lib/clamp.rb
32
+ - lib/clamp/attribute.rb
33
+ - lib/clamp/attribute_declaration.rb
34
+ - lib/clamp/command.rb
35
+ - lib/clamp/errors.rb
36
+ - lib/clamp/help.rb
37
+ - lib/clamp/option.rb
38
+ - lib/clamp/option/declaration.rb
39
+ - lib/clamp/option/parsing.rb
40
+ - lib/clamp/parameter.rb
41
+ - lib/clamp/parameter/declaration.rb
42
+ - lib/clamp/parameter/parsing.rb
43
+ - lib/clamp/subcommand.rb
44
+ - lib/clamp/subcommand/declaration.rb
45
+ - lib/clamp/subcommand/parsing.rb
46
+ - lib/clamp/version.rb
47
+ - spec/clamp/command_group_spec.rb
48
+ - spec/clamp/command_spec.rb
49
+ - spec/clamp/option_module_spec.rb
50
+ - spec/clamp/option_spec.rb
51
+ - spec/clamp/parameter_spec.rb
52
+ - spec/spec_helper.rb
53
+ homepage: http://github.com/mdub/clamp
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 1.8.21
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: a minimal framework for command-line utilities
77
+ test_files:
78
+ - spec/clamp/command_group_spec.rb
79
+ - spec/clamp/command_spec.rb
80
+ - spec/clamp/option_module_spec.rb
81
+ - spec/clamp/option_spec.rb
82
+ - spec/clamp/parameter_spec.rb
83
+ - spec/spec_helper.rb
84
+ has_rdoc: