escort 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +8 -0
- data/README.md +365 -14
- data/TODO.md +157 -44
- data/escort.gemspec +1 -0
- data/examples/{1_1_basic.rb → attic/1_1_basic.rb} +0 -0
- data/examples/{1_2_basic_requires_arguments.rb → attic/1_2_basic_requires_arguments.rb} +0 -0
- data/examples/{2_2_command.rb → attic/2_2_command.rb} +0 -0
- data/examples/{2_2_command_requires_arguments.rb → attic/2_2_command_requires_arguments.rb} +0 -0
- data/examples/{2_3_nested_commands.rb → attic/2_3_nested_commands.rb} +0 -0
- data/examples/{3_validations.rb → attic/3_validations.rb} +0 -0
- data/examples/{4_1_config_file.rb → attic/4_1_config_file.rb} +0 -0
- data/examples/{argument_handling → attic/argument_handling}/basic.rb +0 -0
- data/examples/{argument_handling → attic/argument_handling}/basic_command.rb +0 -0
- data/examples/{argument_handling → attic/argument_handling}/no_arguments.rb +0 -0
- data/examples/{argument_handling → attic/argument_handling}/no_arguments_command.rb +0 -0
- data/examples/{command_aliases → attic/command_aliases}/app.rb +0 -0
- data/examples/{config_file → attic/config_file}/.apprc2 +0 -0
- data/examples/{config_file → attic/config_file}/app.rb +0 -0
- data/examples/{config_file → attic/config_file}/sub_commands.rb +0 -0
- data/examples/{default_command → attic/default_command}/app.rb +0 -0
- data/examples/{sub_commands → attic/sub_commands}/app.rb +0 -0
- data/examples/{validation_basic → attic/validation_basic}/app.rb +0 -0
- data/examples/basic +10 -0
- data/examples/basic_conflicts +17 -0
- data/examples/basic_depends_on +25 -0
- data/examples/basic_flags +15 -0
- data/examples/basic_options +14 -0
- data/examples/basic_options_multi +15 -0
- data/examples/basic_require_arguments +17 -0
- data/examples/basic_texts +21 -0
- data/examples/basic_validations +21 -0
- data/examples/command +19 -0
- data/examples/commands/example_command.rb +13 -0
- data/lib/escort/action_command/base.rb +4 -0
- data/lib/escort/app.rb +33 -11
- data/lib/escort/formatter/borderless_table.rb +4 -0
- data/lib/escort/formatter/command.rb +87 -0
- data/lib/escort/formatter/commands.rb +36 -0
- data/lib/escort/formatter/default_help_formatter.rb +68 -73
- data/lib/escort/formatter/global_command.rb +17 -0
- data/lib/escort/formatter/option.rb +138 -0
- data/lib/escort/formatter/options.rb +17 -3
- data/lib/escort/formatter/shell_command_executor.rb +49 -0
- data/lib/escort/formatter/terminal.rb +17 -9
- data/lib/escort/formatter/terminal_formatter.rb +6 -0
- data/lib/escort/logger.rb +4 -4
- data/lib/escort/option_dependency_validator.rb +83 -0
- data/lib/escort/option_parser.rb +11 -1
- data/lib/escort/setup/configuration/reader.rb +0 -2
- data/lib/escort/setup/configuration/writer.rb +0 -2
- data/lib/escort/setup/dsl/command.rb +2 -7
- data/lib/escort/setup/dsl/global.rb +2 -9
- data/lib/escort/setup/dsl/options.rb +56 -0
- data/lib/escort/setup_accessor.rb +23 -6
- data/lib/escort/trollop.rb +4 -3
- data/lib/escort/validator.rb +4 -1
- data/lib/escort/version.rb +1 -1
- data/lib/escort.rb +8 -1
- data/spec/integration/basic_conflicts_spec.rb +47 -0
- data/spec/integration/basic_depends_on_spec.rb +275 -0
- data/spec/integration/basic_options_spec.rb +9 -21
- data/spec/integration/basic_options_with_multi_spec.rb +30 -0
- data/spec/integration/basic_spec.rb +5 -6
- data/spec/integration/basic_validations_spec.rb +77 -0
- data/spec/integration/basic_with_arguments_spec.rb +33 -0
- data/spec/integration/basic_with_text_fields_spec.rb +21 -0
- data/spec/lib/escort/formatter/command_spec.rb +238 -0
- data/spec/lib/escort/formatter/global_command_spec.rb +50 -0
- data/spec/lib/escort/formatter/option_spec.rb +300 -0
- data/spec/lib/escort/formatter/shell_command_executor_spec.rb +59 -0
- data/spec/lib/escort/formatter/string_splitter_spec.rb +12 -0
- data/spec/lib/escort/formatter/terminal_spec.rb +19 -0
- data/spec/lib/escort/setup_accessor_spec.rb +1 -0
- data/spec/spec_helper.rb +9 -3
- data/spec/support/integration_helpers.rb +2 -0
- data/spec/{helpers/execute_action_matcher.rb → support/matchers/execute_action_for_command_matcher.rb} +3 -3
- data/spec/support/matchers/execute_action_with_arguments_matcher.rb +25 -0
- data/spec/support/matchers/execute_action_with_options_matcher.rb +29 -0
- data/spec/support/matchers/exit_with_code_matcher.rb +29 -0
- data/spec/support/shared_contexts/integration_setup.rb +34 -0
- metadata +86 -28
- data/examples/basic/app.rb +0 -16
- data/lib/escort/formatter/common.rb +0 -58
- data/spec/helpers/exit_with_code_matcher.rb +0 -21
- data/spec/helpers/give_option_to_action_with_value_matcher.rb +0 -22
@@ -0,0 +1,238 @@
|
|
1
|
+
describe Escort::Formatter::Command do
|
2
|
+
let(:command) { Escort::Formatter::Command.new(name, setup, context)}
|
3
|
+
let(:setup) { Escort::SetupAccessor.new(app_configuration) }
|
4
|
+
let(:context) {[]}
|
5
|
+
let(:name) {:command1}
|
6
|
+
let(:command_alias) {:c1}
|
7
|
+
let(:aliases) {[command_alias]}
|
8
|
+
let(:summary) {'command summary'}
|
9
|
+
let(:description) {'command description'}
|
10
|
+
|
11
|
+
let(:app_configuration) do
|
12
|
+
Escort::Setup::Dsl::Global.new do |app|
|
13
|
+
app.command name, :aliases => aliases do |command|
|
14
|
+
command.summary summary
|
15
|
+
command.description description
|
16
|
+
|
17
|
+
command.action do |options, arguments|
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "#description" do
|
24
|
+
subject {command.description}
|
25
|
+
|
26
|
+
context "when no description" do
|
27
|
+
let(:description) {nil}
|
28
|
+
it{subject.should == ''}
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when has description" do
|
32
|
+
let(:description) {'command description'}
|
33
|
+
it{subject.should == description}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "#summary" do
|
38
|
+
subject {command.summary}
|
39
|
+
|
40
|
+
context "when no summary" do
|
41
|
+
let(:summary) {nil}
|
42
|
+
it{subject.should == ''}
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when has summary" do
|
46
|
+
let(:summary) {'command summary'}
|
47
|
+
it{subject.should == summary}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "#has_aliases?" do
|
52
|
+
subject {command.has_aliases?}
|
53
|
+
|
54
|
+
context "when no aliases" do
|
55
|
+
let(:aliases) {[]}
|
56
|
+
it {subject.should be_false}
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when has an alias" do
|
60
|
+
let(:aliases) {[command_alias]}
|
61
|
+
it {subject.should be_true}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "#aliases" do
|
66
|
+
subject {command.aliases}
|
67
|
+
|
68
|
+
context "when no aliases" do
|
69
|
+
let(:aliases) {[]}
|
70
|
+
it {subject.should == []}
|
71
|
+
end
|
72
|
+
|
73
|
+
context "when has an alias" do
|
74
|
+
let(:aliases) {[command_alias]}
|
75
|
+
it {subject.first.should == command_alias}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context "#outline" do
|
80
|
+
subject {command.outline}
|
81
|
+
|
82
|
+
context "when no summary or description" do
|
83
|
+
let(:summary) {nil}
|
84
|
+
let(:description) {nil}
|
85
|
+
it {subject.should == ''}
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when no summary" do
|
89
|
+
let(:summary) {nil}
|
90
|
+
let(:description) {'desc 1'}
|
91
|
+
it {subject.should == 'desc 1'}
|
92
|
+
end
|
93
|
+
|
94
|
+
context "when no description" do
|
95
|
+
let(:summary) {'summary 1'}
|
96
|
+
let(:description) {nil}
|
97
|
+
it {subject.should == 'summary 1'}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "#aliases" do
|
102
|
+
subject {command.name_with_aliases}
|
103
|
+
|
104
|
+
context "when no aliases" do
|
105
|
+
let(:aliases) {[]}
|
106
|
+
it {subject.should == "command1"}
|
107
|
+
end
|
108
|
+
|
109
|
+
context "when has an alias" do
|
110
|
+
let(:aliases) {[command_alias]}
|
111
|
+
it {subject.should == "command1, #{command_alias}"}
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "#script_name" do
|
116
|
+
subject {command.script_name}
|
117
|
+
|
118
|
+
context "when context is global" do
|
119
|
+
let(:context) {[]}
|
120
|
+
it{subject.split(" ").count.should == 1}
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when context is not global" do
|
124
|
+
let(:context) {[:hello]}
|
125
|
+
it{subject.split(" ").count.should == 2}
|
126
|
+
it{subject.split(" ").include?('hello').should be_true}
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "#child_commands" do
|
131
|
+
subject {command.child_commands}
|
132
|
+
|
133
|
+
context "when no child commands" do
|
134
|
+
let(:app_configuration) do
|
135
|
+
Escort::Setup::Dsl::Global.new do |app|
|
136
|
+
app.action do |options, arguments|
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
it {subject.should be_empty}
|
141
|
+
end
|
142
|
+
|
143
|
+
context "when has child commands" do
|
144
|
+
it {subject.should_not be_empty}
|
145
|
+
it {subject.count.should == 1}
|
146
|
+
it {subject.first.should == :command1}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "#has_child_commands?" do
|
151
|
+
subject {command.has_child_commands?}
|
152
|
+
|
153
|
+
context "when no child commands" do
|
154
|
+
let(:app_configuration) do
|
155
|
+
Escort::Setup::Dsl::Global.new do |app|
|
156
|
+
app.action do |options, arguments|
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
it {subject.should be_false}
|
161
|
+
end
|
162
|
+
|
163
|
+
context "when has child commands" do
|
164
|
+
it {subject.should be_true}
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context "#requires_arguments?" do
|
169
|
+
subject {command.requires_arguments?}
|
170
|
+
|
171
|
+
context "when arguments not required" do
|
172
|
+
it {subject.should be_false}
|
173
|
+
end
|
174
|
+
|
175
|
+
context "when arguments are required" do
|
176
|
+
let(:app_configuration) do
|
177
|
+
Escort::Setup::Dsl::Global.new do |app|
|
178
|
+
app.requires_arguments
|
179
|
+
app.action do |options, arguments|
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
it {subject.should be_true}
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context "#usage" do
|
188
|
+
subject {command.usage}
|
189
|
+
|
190
|
+
before do
|
191
|
+
$0 = 'hello'
|
192
|
+
end
|
193
|
+
|
194
|
+
context "when global command with no children" do
|
195
|
+
let(:app_configuration) do
|
196
|
+
Escort::Setup::Dsl::Global.new do |app|
|
197
|
+
app.action do |options, arguments|
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
it {subject.split(" ").first.should == 'hello'}
|
202
|
+
it {subject.split(" ")[1].should == '[options]'}
|
203
|
+
it {subject.split(" ")[2].should == '[arguments]'}
|
204
|
+
end
|
205
|
+
|
206
|
+
context "when global command with children" do
|
207
|
+
it {subject.split(" ").first.should == 'hello'}
|
208
|
+
it {subject.split(" ")[1].should == '[options]'}
|
209
|
+
it {subject.split(" ")[2].should == 'command'}
|
210
|
+
it {subject.split(" ")[3].should == '[command_options]'}
|
211
|
+
it {subject.split(" ")[4].should == '[arguments]'}
|
212
|
+
end
|
213
|
+
|
214
|
+
context "when global command and requires arguments" do
|
215
|
+
let(:app_configuration) do
|
216
|
+
Escort::Setup::Dsl::Global.new do |app|
|
217
|
+
app.requires_arguments
|
218
|
+
app.action do |options, arguments|
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
it {subject.split(" ").last.should == 'arguments'}
|
223
|
+
end
|
224
|
+
|
225
|
+
context "when does not require arguments" do
|
226
|
+
it {subject.split(" ").last.should == '[arguments]'}
|
227
|
+
end
|
228
|
+
|
229
|
+
context "when child command context with no children of its own" do
|
230
|
+
let(:context){[:command1]}
|
231
|
+
it {subject.split(" ").first.should == 'hello'}
|
232
|
+
it {subject.split(" ")[1].should == '[options]'}
|
233
|
+
it {subject.split(" ")[2].should == 'command1'}
|
234
|
+
it {subject.split(" ")[3].should == '[command1_options]'}
|
235
|
+
it {subject.split(" ")[4].should == '[arguments]'}
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
describe Escort::Formatter::GlobalCommand do
|
2
|
+
let(:command) { Escort::Formatter::GlobalCommand.new(setup)}
|
3
|
+
let(:setup) { Escort::SetupAccessor.new(app_configuration) }
|
4
|
+
let(:context) {[]}
|
5
|
+
let(:name) {:command1}
|
6
|
+
let(:command_alias) {:c1}
|
7
|
+
let(:aliases) {[command_alias]}
|
8
|
+
let(:summary) {'app summary'}
|
9
|
+
let(:description) {'app description'}
|
10
|
+
|
11
|
+
let(:app_configuration) do
|
12
|
+
Escort::Setup::Dsl::Global.new do |app|
|
13
|
+
app.summary summary
|
14
|
+
app.description description
|
15
|
+
|
16
|
+
app.command name, :aliases => aliases do |command|
|
17
|
+
command.action do |options, arguments|
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "#description" do
|
24
|
+
subject {command.description}
|
25
|
+
|
26
|
+
context "when no description" do
|
27
|
+
let(:description) {nil}
|
28
|
+
it{subject.should == ''}
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when has description" do
|
32
|
+
let(:description) {'app description'}
|
33
|
+
it{subject.should == description}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "#summary" do
|
38
|
+
subject {command.summary}
|
39
|
+
|
40
|
+
context "when no summary" do
|
41
|
+
let(:summary) {nil}
|
42
|
+
it{subject.should == ''}
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when has summary" do
|
46
|
+
let(:summary) {'app summary'}
|
47
|
+
it{subject.should == summary}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,300 @@
|
|
1
|
+
describe Escort::Formatter::Option do
|
2
|
+
let(:option) {Escort::Formatter::Option.new(name, details, setup, context)}
|
3
|
+
let(:setup) { Escort::SetupAccessor.new(app_configuration) }
|
4
|
+
let(:context) {[]}
|
5
|
+
let(:name) { 'option1' }
|
6
|
+
let(:details) do
|
7
|
+
{:short=>short, :long=>"option1", :type=>type, :default=>default, :desc=>desc, :multi=>false}
|
8
|
+
end
|
9
|
+
let(:short) {:none}
|
10
|
+
let(:type) {:string}
|
11
|
+
let(:default) {'foo'}
|
12
|
+
let(:desc) {'Option 1'}
|
13
|
+
let(:app_configuration) do
|
14
|
+
Escort::Setup::Dsl::Global.new do |app|
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#usage" do
|
19
|
+
subject {option.usage}
|
20
|
+
|
21
|
+
context "when option is a flag" do
|
22
|
+
let(:type) {:flag}
|
23
|
+
|
24
|
+
context "and it has a default value of 'true'" do
|
25
|
+
let(:default) {true}
|
26
|
+
it {subject.should == '--option1, --no-option1'}
|
27
|
+
end
|
28
|
+
|
29
|
+
context "and its default value is 'false'" do
|
30
|
+
let(:default) {false}
|
31
|
+
it {subject.should == '--option1'}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when option is not a flag' do
|
36
|
+
let(:type) {:string}
|
37
|
+
|
38
|
+
context "and it has no short specification" do
|
39
|
+
let(:short) {:none}
|
40
|
+
it {subject.should == '--option1 <s>'}
|
41
|
+
end
|
42
|
+
|
43
|
+
context "and it has a short specification" do
|
44
|
+
let(:short) {'o'}
|
45
|
+
it {subject.should == '--option1 -o <s>'}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#description" do
|
51
|
+
subject {option.description}
|
52
|
+
|
53
|
+
context "when no description" do
|
54
|
+
let(:desc) {nil}
|
55
|
+
context "and has no default value" do
|
56
|
+
let(:default) {nil}
|
57
|
+
it {subject.should == ''}
|
58
|
+
end
|
59
|
+
|
60
|
+
context "and has a default value" do
|
61
|
+
let(:default) {"blah"}
|
62
|
+
it {subject.should == '(default: blah)'}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "when has description" do
|
67
|
+
context "and description end with dot" do
|
68
|
+
let(:desc) {"Option 1."}
|
69
|
+
|
70
|
+
context "and has no default value" do
|
71
|
+
let(:default) {nil}
|
72
|
+
it {subject.should == 'Option 1.'}
|
73
|
+
end
|
74
|
+
|
75
|
+
context "and has a default value" do
|
76
|
+
let(:default) {"blah"}
|
77
|
+
it {subject.should == 'Option 1. (Default: blah)'}
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "and description does not end with dot" do
|
82
|
+
let(:desc) {"Option 1"}
|
83
|
+
|
84
|
+
context "and has no default value" do
|
85
|
+
let(:default) {nil}
|
86
|
+
it {subject.should == 'Option 1'}
|
87
|
+
end
|
88
|
+
|
89
|
+
context "and has a default value" do
|
90
|
+
let(:default) {"blah"}
|
91
|
+
it {subject.should == 'Option 1 (default: blah)'}
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#has_conflicts?" do
|
98
|
+
subject {option.has_conflicts?}
|
99
|
+
context "when no conflicts defined" do
|
100
|
+
let(:app_configuration) do
|
101
|
+
Escort::Setup::Dsl::Global.new do |app|
|
102
|
+
app.options do |opts|
|
103
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
104
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
105
|
+
end
|
106
|
+
|
107
|
+
app.action do |options, arguments|
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
it {subject.should be_false}
|
112
|
+
end
|
113
|
+
|
114
|
+
context "when conflict is defined" do
|
115
|
+
let(:app_configuration) do
|
116
|
+
Escort::Setup::Dsl::Global.new do |app|
|
117
|
+
app.options do |opts|
|
118
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :conflicts_with => :option2
|
119
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
120
|
+
end
|
121
|
+
|
122
|
+
app.action do |options, arguments|
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
it {subject.should be_true}
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#has_dependencies?" do
|
131
|
+
subject {option.has_dependencies?}
|
132
|
+
context "when no dependencies defined" do
|
133
|
+
let(:app_configuration) do
|
134
|
+
Escort::Setup::Dsl::Global.new do |app|
|
135
|
+
app.options do |opts|
|
136
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
137
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
138
|
+
end
|
139
|
+
|
140
|
+
app.action do |options, arguments|
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
it {subject.should be_false}
|
145
|
+
end
|
146
|
+
|
147
|
+
context "when dependency is defined" do
|
148
|
+
let(:app_configuration) do
|
149
|
+
Escort::Setup::Dsl::Global.new do |app|
|
150
|
+
app.options do |opts|
|
151
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :depends_on => :option2
|
152
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
153
|
+
end
|
154
|
+
|
155
|
+
app.action do |options, arguments|
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
it {subject.should be_true}
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "#has_validations?" do
|
164
|
+
subject {option.has_validations?}
|
165
|
+
context "when no validations defined" do
|
166
|
+
let(:app_configuration) do
|
167
|
+
Escort::Setup::Dsl::Global.new do |app|
|
168
|
+
app.options do |opts|
|
169
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
170
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
171
|
+
end
|
172
|
+
|
173
|
+
app.action do |options, arguments|
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
it {subject.should be_false}
|
178
|
+
end
|
179
|
+
|
180
|
+
context "when validations is defined" do
|
181
|
+
let(:app_configuration) do
|
182
|
+
Escort::Setup::Dsl::Global.new do |app|
|
183
|
+
app.options do |opts|
|
184
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
185
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
186
|
+
|
187
|
+
opts.validate(:option1, "must be 'foo'") {|option| option == 'foo'}
|
188
|
+
end
|
189
|
+
|
190
|
+
app.action do |options, arguments|
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
it {subject.should be_true}
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe "#conflicts" do
|
199
|
+
subject {option.conflicts}
|
200
|
+
context "when no conflicts defined" do
|
201
|
+
let(:app_configuration) do
|
202
|
+
Escort::Setup::Dsl::Global.new do |app|
|
203
|
+
app.options do |opts|
|
204
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
205
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
206
|
+
end
|
207
|
+
|
208
|
+
app.action do |options, arguments|
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
it {subject.should == ''}
|
213
|
+
end
|
214
|
+
|
215
|
+
context "when conflict is defined" do
|
216
|
+
let(:app_configuration) do
|
217
|
+
Escort::Setup::Dsl::Global.new do |app|
|
218
|
+
app.options do |opts|
|
219
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :conflicts_with => [:option2, :option3]
|
220
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
221
|
+
opts.opt :option3, "Option3", :short => :none, :long => '--option3', :type => :string
|
222
|
+
end
|
223
|
+
|
224
|
+
app.action do |options, arguments|
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
it {subject.should == 'conflicts with: --option2, --option3'}
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
describe "#dependencies" do
|
233
|
+
subject {option.dependencies}
|
234
|
+
context "when no dependencies defined" do
|
235
|
+
let(:app_configuration) do
|
236
|
+
Escort::Setup::Dsl::Global.new do |app|
|
237
|
+
app.options do |opts|
|
238
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
239
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
240
|
+
end
|
241
|
+
|
242
|
+
app.action do |options, arguments|
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
it {subject.should == ''}
|
247
|
+
end
|
248
|
+
|
249
|
+
context "when dependency is defined" do
|
250
|
+
let(:app_configuration) do
|
251
|
+
Escort::Setup::Dsl::Global.new do |app|
|
252
|
+
app.options do |opts|
|
253
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :depends_on => :option2
|
254
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
255
|
+
end
|
256
|
+
|
257
|
+
app.action do |options, arguments|
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
it {subject.should == 'depends on: --option2'}
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
describe "#validations" do
|
266
|
+
subject {option.validations}
|
267
|
+
context "when no validations defined" do
|
268
|
+
let(:app_configuration) do
|
269
|
+
Escort::Setup::Dsl::Global.new do |app|
|
270
|
+
app.options do |opts|
|
271
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
272
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
273
|
+
end
|
274
|
+
|
275
|
+
app.action do |options, arguments|
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
it {subject.should == ''}
|
280
|
+
end
|
281
|
+
|
282
|
+
context "when validations is defined" do
|
283
|
+
let(:app_configuration) do
|
284
|
+
Escort::Setup::Dsl::Global.new do |app|
|
285
|
+
app.options do |opts|
|
286
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
287
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string
|
288
|
+
|
289
|
+
opts.validate(:option1, "must be 'foo'") {|option| option == 'foo'}
|
290
|
+
opts.validate(:option1, "must not be 'bar'") {|option| option != 'bar'}
|
291
|
+
end
|
292
|
+
|
293
|
+
app.action do |options, arguments|
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
it {subject.should == "must be 'foo'\n- must not be 'bar'"}
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
describe Escort::Formatter::ShellCommandExecutor do
|
2
|
+
let(:executor) {Escort::Formatter::ShellCommandExecutor.new(command)}
|
3
|
+
let(:result) { [] }
|
4
|
+
let(:error_callback) {lambda{ |command, error| result << 'error'; result << error.class }}
|
5
|
+
|
6
|
+
#describe "#execute_in_new_shell" do
|
7
|
+
#subject {executor.execute_in_new_shell(success_callback, error_callback)}
|
8
|
+
|
9
|
+
#let(:success_callback) {lambda{ |command, stdin, stdout, stderr| result << 'success' }}
|
10
|
+
|
11
|
+
#context "when command is invalid" do
|
12
|
+
#let(:command) { 'lx -z' }
|
13
|
+
#it("error callback should be executed") {subject; result.first.should == 'error'}
|
14
|
+
#it("should return nil") {subject.should be_nil}
|
15
|
+
#end
|
16
|
+
|
17
|
+
#context "when command is valid" do
|
18
|
+
#context "but options passed to it are invalid" do
|
19
|
+
#let(:command) { 'ls --foobar' }
|
20
|
+
#it("error callback should be executed") {subject; result.first.should == 'error'}
|
21
|
+
#it("command should produce an exit status error") {subject; result[1].should == Escort::InternalError}
|
22
|
+
#it("should return nil") {subject.should be_nil}
|
23
|
+
#end
|
24
|
+
|
25
|
+
#context "and options passed to it are valid" do
|
26
|
+
#let(:command) { 'ls -al' }
|
27
|
+
#it("success callback should be executed") {subject; result.first.should == 'success'}
|
28
|
+
#it("should not return nil") {subject.should_not be_nil}
|
29
|
+
#end
|
30
|
+
#end
|
31
|
+
#end
|
32
|
+
|
33
|
+
describe "#execute_in_current_shell" do
|
34
|
+
subject {executor.execute_in_current_shell(success_callback, error_callback)}
|
35
|
+
|
36
|
+
let(:success_callback) {lambda{ |command, final_result| result << 'success' }}
|
37
|
+
|
38
|
+
context "when command is invalid" do
|
39
|
+
let(:command) { 'lx -z' }
|
40
|
+
it("error callback should be executed") {subject; result.first.should == 'error'}
|
41
|
+
it("should return nil") {subject.should be_nil}
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when command is valid" do
|
45
|
+
context "but options passed to it are invalid" do
|
46
|
+
let(:command) { 'ls --foobar' }
|
47
|
+
it("error callback should be executed") {subject; result.first.should == 'error'}
|
48
|
+
it("command should produce an exit status error") {subject; result[1].should == Escort::InternalError}
|
49
|
+
it("should return nil") {subject.should be_nil}
|
50
|
+
end
|
51
|
+
|
52
|
+
context "and options passed to it are valid" do
|
53
|
+
let(:command) { 'ls -al' }
|
54
|
+
it("success callback should be executed") {subject; result.first.should == 'success'}
|
55
|
+
it("should not return nil") {subject.should_not be_nil}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -34,5 +34,17 @@ describe Escort::Formatter::StringSplitter do
|
|
34
34
|
it("first segment should be 'd'") { subject[2].should == 'd' }
|
35
35
|
end
|
36
36
|
end
|
37
|
+
|
38
|
+
context "when segment width is 5" do
|
39
|
+
let(:max_segment_width) { 5 }
|
40
|
+
|
41
|
+
context "and string is 'abc\\n123456'" do
|
42
|
+
let(:string) {"abc\n123456"}
|
43
|
+
it("should produce 3 segments") { subject.size.should == 3 }
|
44
|
+
it("first segment should be 'abc'") { subject[0].should == 'abc' }
|
45
|
+
it("second segment should be '12345'") { subject[1].should == '12345' }
|
46
|
+
it("last segment should be '6'") { subject[2].should == '6' }
|
47
|
+
end
|
48
|
+
end
|
37
49
|
end
|
38
50
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe Escort::Formatter::Terminal do
|
2
|
+
let(:terminal) {Escort::Formatter::Terminal}
|
3
|
+
|
4
|
+
describe "#width" do
|
5
|
+
subject {terminal.width}
|
6
|
+
|
7
|
+
context "when width can be found successfully" do
|
8
|
+
let(:current_width) {`/usr/bin/env tput cols`.to_i}
|
9
|
+
it("should be equal to current width") {subject.should == current_width}
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when width could not be found successfully" do
|
13
|
+
before do
|
14
|
+
Escort::Formatter::ShellCommandExecutor.any_instance.stub(:execute_in_current_shell).and_return(nil)
|
15
|
+
end
|
16
|
+
it("should be equal to default width") {subject.should == Escort::Formatter::Terminal::DEFAULT_WIDTH}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|