convoy 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.irbrc +3 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +705 -0
- data/Rakefile +1 -0
- data/convoy.gemspec +24 -0
- data/examples/.my_apprc +24 -0
- data/examples/basic +10 -0
- data/examples/basic_config_file +16 -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/basic_with_everything +30 -0
- data/examples/commands/example_command.rb +13 -0
- data/examples/suite_complex +65 -0
- data/examples/suite_simple +19 -0
- data/examples/suite_with_sub_commands +94 -0
- data/lib/convoy.rb +83 -0
- data/lib/convoy/action_command/base.rb +85 -0
- data/lib/convoy/action_command/escort_utility_command.rb +53 -0
- data/lib/convoy/app.rb +127 -0
- data/lib/convoy/arguments.rb +20 -0
- data/lib/convoy/auto_options.rb +71 -0
- data/lib/convoy/error/error.rb +33 -0
- data/lib/convoy/formatter/command.rb +87 -0
- data/lib/convoy/formatter/commands.rb +37 -0
- data/lib/convoy/formatter/cursor_position.rb +29 -0
- data/lib/convoy/formatter/default_help_formatter.rb +117 -0
- data/lib/convoy/formatter/global_command.rb +17 -0
- data/lib/convoy/formatter/option.rb +152 -0
- data/lib/convoy/formatter/options.rb +28 -0
- data/lib/convoy/formatter/shell_command_executor.rb +49 -0
- data/lib/convoy/formatter/stream_output_formatter.rb +88 -0
- data/lib/convoy/formatter/string_grid.rb +108 -0
- data/lib/convoy/formatter/string_splitter.rb +50 -0
- data/lib/convoy/formatter/terminal.rb +30 -0
- data/lib/convoy/global_pre_parser.rb +43 -0
- data/lib/convoy/logger.rb +75 -0
- data/lib/convoy/option_dependency_validator.rb +82 -0
- data/lib/convoy/option_parser.rb +155 -0
- data/lib/convoy/setup/configuration/generator.rb +75 -0
- data/lib/convoy/setup/configuration/instance.rb +34 -0
- data/lib/convoy/setup/configuration/loader.rb +43 -0
- data/lib/convoy/setup/configuration/locator/base.rb +19 -0
- data/lib/convoy/setup/configuration/locator/chaining.rb +29 -0
- data/lib/convoy/setup/configuration/locator/descending_to_home.rb +23 -0
- data/lib/convoy/setup/configuration/locator/executing_script_directory.rb +15 -0
- data/lib/convoy/setup/configuration/locator/specified_directory.rb +21 -0
- data/lib/convoy/setup/configuration/merge_tool.rb +38 -0
- data/lib/convoy/setup/configuration/reader.rb +36 -0
- data/lib/convoy/setup/configuration/writer.rb +46 -0
- data/lib/convoy/setup/dsl/action.rb +17 -0
- data/lib/convoy/setup/dsl/command.rb +67 -0
- data/lib/convoy/setup/dsl/config_file.rb +13 -0
- data/lib/convoy/setup/dsl/global.rb +29 -0
- data/lib/convoy/setup/dsl/options.rb +81 -0
- data/lib/convoy/setup_accessor.rb +206 -0
- data/lib/convoy/trollop.rb +861 -0
- data/lib/convoy/utils.rb +21 -0
- data/lib/convoy/validator.rb +45 -0
- data/spec/integration/basic_config_file_spec.rb +126 -0
- 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 +41 -0
- data/spec/integration/basic_options_with_multi_spec.rb +30 -0
- data/spec/integration/basic_spec.rb +38 -0
- data/spec/integration/basic_validations_spec.rb +77 -0
- data/spec/integration/basic_with_arguments_spec.rb +35 -0
- data/spec/integration/basic_with_text_fields_spec.rb +21 -0
- data/spec/integration/suite_simple_spec.rb +45 -0
- data/spec/integration/suite_sub_command_spec.rb +51 -0
- data/spec/lib/convoy/action_command/base_spec.rb +200 -0
- data/spec/lib/convoy/formatter/command_spec.rb +238 -0
- data/spec/lib/convoy/formatter/global_command_spec.rb +50 -0
- data/spec/lib/convoy/formatter/option_spec.rb +300 -0
- data/spec/lib/convoy/formatter/shell_command_executor_spec.rb +59 -0
- data/spec/lib/convoy/formatter/stream_output_formatter_spec.rb +214 -0
- data/spec/lib/convoy/formatter/string_grid_spec.rb +59 -0
- data/spec/lib/convoy/formatter/string_splitter_spec.rb +50 -0
- data/spec/lib/convoy/formatter/terminal_spec.rb +19 -0
- data/spec/lib/convoy/setup/configuration/generator_spec.rb +101 -0
- data/spec/lib/convoy/setup/configuration/loader_spec.rb +79 -0
- data/spec/lib/convoy/setup/configuration/locator/chaining_spec.rb +81 -0
- data/spec/lib/convoy/setup/configuration/locator/descending_to_home_spec.rb +57 -0
- data/spec/lib/convoy/setup/configuration/locator/executing_script_directory_spec.rb +29 -0
- data/spec/lib/convoy/setup/configuration/locator/specified_directory_spec.rb +33 -0
- data/spec/lib/convoy/setup/configuration/merge_tool_spec.rb +41 -0
- data/spec/lib/convoy/setup/configuration/reader_spec.rb +41 -0
- data/spec/lib/convoy/setup/configuration/writer_spec.rb +75 -0
- data/spec/lib/convoy/setup_accessor_spec.rb +226 -0
- data/spec/lib/convoy/utils_spec.rb +30 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/integration_helpers.rb +2 -0
- data/spec/support/matchers/execute_action_for_command_matcher.rb +21 -0
- 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 +292 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
describe Convoy::Formatter::ShellCommandExecutor do
|
|
2
|
+
let(:executor) { Convoy::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 == Convoy::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 == Convoy::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
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
describe Convoy::Formatter::StreamOutputFormatter do
|
|
2
|
+
let(:formatter) { Convoy::Formatter::StreamOutputFormatter.new(stream, :max_output_width => output_width) }
|
|
3
|
+
let(:stream) { StringIO.new }
|
|
4
|
+
let(:output_width) { 10 }
|
|
5
|
+
let(:output) { stream.readlines }
|
|
6
|
+
|
|
7
|
+
describe "#print" do
|
|
8
|
+
subject { formatter.print(string) }
|
|
9
|
+
|
|
10
|
+
before { subject; stream.rewind }
|
|
11
|
+
|
|
12
|
+
context "when string is less than output_width" do
|
|
13
|
+
let(:string) { '12345' }
|
|
14
|
+
it("stream should have one line") { output.first.should == string }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "when string is greater than output width" do
|
|
18
|
+
let(:string) { '123456789abcd' }
|
|
19
|
+
it("stream should have two lines") { output.should == ["123456789a\n", "bcd"] }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "when string is has newlines in it" do
|
|
23
|
+
context "and both lines less than output width" do
|
|
24
|
+
let(:string) { "1234567\n89abcd" }
|
|
25
|
+
it("stream should have two lines") { output.should == ["1234567\n", "89abcd"] }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "and first line greater than output width" do
|
|
29
|
+
let(:string) { "123456789abcd\nefg" }
|
|
30
|
+
it("stream should have three lines") { output.should == ["123456789a\n", "bcd\n", "efg"] }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "#puts" do
|
|
36
|
+
subject { formatter.puts(string, options) }
|
|
37
|
+
let(:string) { 'hello' }
|
|
38
|
+
let(:options) { {:newlines => newlines} }
|
|
39
|
+
let(:newlines) { 1 }
|
|
40
|
+
|
|
41
|
+
before { subject; stream.rewind }
|
|
42
|
+
|
|
43
|
+
context "when newlines" do
|
|
44
|
+
context "is zero" do
|
|
45
|
+
let(:newlines) { 0 }
|
|
46
|
+
let(:string) { "123456789abcd\nefg" }
|
|
47
|
+
it("stream should have three lines") { output.should == ["123456789a\n", "bcd\n", "efg"] }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "not specified" do
|
|
51
|
+
subject { formatter.puts(string) }
|
|
52
|
+
let(:string) { "123" }
|
|
53
|
+
it("stream should have one newline") { output.should == ["123\n"] }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context "is two" do
|
|
57
|
+
let(:string) { "123" }
|
|
58
|
+
let(:newlines) { 2 }
|
|
59
|
+
it("stream should have two newlines") { output.should == ["123\n", "\n"] }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe "#newline" do
|
|
65
|
+
subject { formatter.newline(newline_count) }
|
|
66
|
+
let(:newline_count) { 1 }
|
|
67
|
+
|
|
68
|
+
before { subject; stream.rewind }
|
|
69
|
+
|
|
70
|
+
context "when newline count not specified" do
|
|
71
|
+
subject { formatter.newline }
|
|
72
|
+
it("stream should have one newline") { output.should == ["\n"] }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "when newline count is 2" do
|
|
76
|
+
let(:newline_count) { 2 }
|
|
77
|
+
it("stream should have two newlines") { output.should == ["\n", "\n"] }
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "#indent" do
|
|
82
|
+
subject { formatter.indent(indent_width, &indented_block) }
|
|
83
|
+
|
|
84
|
+
let(:indented_block) do
|
|
85
|
+
lambda { |f| f.print string }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
before { subject; stream.rewind }
|
|
89
|
+
|
|
90
|
+
context "when indent is 0" do
|
|
91
|
+
let(:indent_width) { 0 }
|
|
92
|
+
|
|
93
|
+
context "and we print a string less than output_width" do
|
|
94
|
+
let(:string) { '12345' }
|
|
95
|
+
it("stream should have one line") { output.should == ['12345'] }
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context "and we print a string greater than output width" do
|
|
99
|
+
let(:string) { '123456789abcd' }
|
|
100
|
+
it("stream should have two lines") { output.should == ["123456789a\n", "bcd"] }
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
context "and we print a string that has newlines in it" do
|
|
104
|
+
context "and both lines are less than output width" do
|
|
105
|
+
let(:string) { "1234567\n89abcd" }
|
|
106
|
+
it("stream should have two lines") { output.should == ["1234567\n", "89abcd"] }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "and first line is greater than output width" do
|
|
110
|
+
let(:string) { "123456789abcd\nefg" }
|
|
111
|
+
it("stream should have three lines") { output.should == ["123456789a\n", "bcd\n", "efg"] }
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context "when indent is 1" do
|
|
117
|
+
let(:indent_width) { 1 }
|
|
118
|
+
|
|
119
|
+
context "and we print a string less than output_width" do
|
|
120
|
+
let(:string) { '12345' }
|
|
121
|
+
it("stream should have one line") { output.should == [' 12345'] }
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "and we print a string greater than output width" do
|
|
125
|
+
let(:string) { '123456789abcd' }
|
|
126
|
+
it("stream should have two lines") { output.should == [" 123456789\n", " abcd"] }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context "and we print a string that has newlines in it" do
|
|
130
|
+
context "and both lines are less than output width" do
|
|
131
|
+
let(:string) { "1234567\n89abcd" }
|
|
132
|
+
it("stream should have two lines") { output.should == [" 1234567\n", " 89abcd"] }
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
context "and first line is greater than output width" do
|
|
136
|
+
let(:string) { "123456789abcd\nefg" }
|
|
137
|
+
it("stream should have three lines") { output.should == [" 123456789\n", " abcd\n", " efg"] }
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
context "when indent is 3" do
|
|
143
|
+
let(:indent_width) { 3 }
|
|
144
|
+
|
|
145
|
+
context "and we print a string less than output_width" do
|
|
146
|
+
let(:string) { '12345' }
|
|
147
|
+
it("stream should have one line") { output.should == [' 12345'] }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
context "and we print a string greater than output width" do
|
|
151
|
+
let(:string) { '123456789abcd' }
|
|
152
|
+
it("stream should have two lines") { output.should == [" 1234567\n", " 89abcd"] }
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
context "and we print a string that has newlines in it" do
|
|
156
|
+
context "and both lines are less than output width" do
|
|
157
|
+
let(:string) { "1234567\n89abcd" }
|
|
158
|
+
it("stream should have two lines") { output.should == [" 1234567\n", " 89abcd"] }
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
context "and first line is greater than output width" do
|
|
162
|
+
let(:string) { "123456789abcd\nefg" }
|
|
163
|
+
it("stream should have three lines") { output.should == [" 1234567\n", " 89abcd\n", " efg"] }
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
context "output combinations" do
|
|
170
|
+
subject do
|
|
171
|
+
Convoy::Formatter::StreamOutputFormatter.new(stream, :max_output_width => output_width) do |f|
|
|
172
|
+
f.print "the quick"
|
|
173
|
+
f.newline
|
|
174
|
+
f.print "brown fox"
|
|
175
|
+
f.print "jumped over the"
|
|
176
|
+
f.print "lazy dog"
|
|
177
|
+
f.newline
|
|
178
|
+
f.puts 'rainbow suspenders'
|
|
179
|
+
f.indent(3) do |f|
|
|
180
|
+
f.puts "blah blah blah blah"
|
|
181
|
+
f.newline(2)
|
|
182
|
+
f.indent(2) do |f|
|
|
183
|
+
f.puts "indent me good"
|
|
184
|
+
f.print "foo"
|
|
185
|
+
f.print "foo"
|
|
186
|
+
f.print "foo"
|
|
187
|
+
f.newline
|
|
188
|
+
f.puts "exit", :newlines => 4
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
let(:stream) { StringIO.new }
|
|
194
|
+
let(:output_width) { 10 }
|
|
195
|
+
|
|
196
|
+
let(:output) { stream.readlines }
|
|
197
|
+
|
|
198
|
+
before { subject; stream.rewind }
|
|
199
|
+
|
|
200
|
+
context "lines should not be greater than output width" do
|
|
201
|
+
it do
|
|
202
|
+
output.each do |line|
|
|
203
|
+
line.strip.length.should be <= output_width
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
context "stream should contain" do
|
|
209
|
+
it do
|
|
210
|
+
output.should == ["the quick\n", "brown foxj\n", "umped over\n", " thelazy d\n", "og\n", "rainbow su\n", "spenders\n", " blah bl\n", " ah blah\n", " blah\n", "\n", "\n", " inden\n", " t me \n", " good\n", " foofo\n", " ofoo\n", " exit\n", "\n", "\n", "\n"]
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
describe Convoy::Formatter::StringGrid do
|
|
2
|
+
let(:width) { 20 }
|
|
3
|
+
|
|
4
|
+
describe "#to_s" do
|
|
5
|
+
subject { grid.to_s }
|
|
6
|
+
|
|
7
|
+
context "when 2 rows and 3 columns" do
|
|
8
|
+
context "no strings span multiple rows" do
|
|
9
|
+
let(:grid) do
|
|
10
|
+
Convoy::Formatter::StringGrid.new(:columns => 3, :width => width) do |g|
|
|
11
|
+
g.row 'a', 'b', 'c'
|
|
12
|
+
g.row 1, 2, 3
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
it("all rows should equal table width") do
|
|
16
|
+
subject.split("\n").each do |val|
|
|
17
|
+
val.length.should == width
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
it { subject.should == "a b c \n1 2 3 " }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "first column string spans 4 rows" do
|
|
24
|
+
let(:grid) do
|
|
25
|
+
Convoy::Formatter::StringGrid.new(:columns => 3, :width => width) do |g|
|
|
26
|
+
g.row '123456789abcdefgh', 'b', 'c'
|
|
27
|
+
g.row 1, 2, 3
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
it("should have 5 rows") do
|
|
31
|
+
subject.split("\n").size.should == 5
|
|
32
|
+
end
|
|
33
|
+
it("all rows should equal table width") do
|
|
34
|
+
subject.split("\n").each do |val|
|
|
35
|
+
val.length.should == width
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
it { subject.should == "12345 b c \n6789a \nbcdef \ngh \n1 2 3 " }
|
|
39
|
+
end
|
|
40
|
+
context "last column string spans 2 rows" do
|
|
41
|
+
let(:grid) do
|
|
42
|
+
Convoy::Formatter::StringGrid.new(:columns => 3, :width => width) do |g|
|
|
43
|
+
g.row 'a', 'b', 'c'
|
|
44
|
+
g.row 1, 2, "123456789abcdefghijk"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
it("should have 3 rows") do
|
|
48
|
+
subject.split("\n").size.should == 3
|
|
49
|
+
end
|
|
50
|
+
it("all rows should equal table width") do
|
|
51
|
+
subject.split("\n").each do |val|
|
|
52
|
+
val.length.should == width
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
it { subject.should == "a b c \n1 2 123456789abcdef \n ghijk " }
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
describe Convoy::Formatter::StringSplitter do
|
|
2
|
+
let(:splitter) { Convoy::Formatter::StringSplitter.new(max_segment_width) }
|
|
3
|
+
|
|
4
|
+
describe "#split" do
|
|
5
|
+
subject { splitter.split(string) }
|
|
6
|
+
|
|
7
|
+
context "when segment width is 10" do
|
|
8
|
+
let(:max_segment_width) { 10 }
|
|
9
|
+
|
|
10
|
+
context "and string is 'abc123'" do
|
|
11
|
+
let(:string) { 'abc123' }
|
|
12
|
+
it("should produce 1 segment") { subject.size.should == 1 }
|
|
13
|
+
it("first segment should be 'abc123'") { subject[0].should == 'abc123' }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "and string is 'abc1234567'" do
|
|
17
|
+
let(:string) { 'abc1234567' }
|
|
18
|
+
it("should produce 1 segment") { subject.size.should == 1 }
|
|
19
|
+
it("first segment should be 'abc1234567'") { subject[0].should == 'abc1234567' }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "and string is 'abc123abc456'" do
|
|
23
|
+
let(:string) { 'abc123abc456' }
|
|
24
|
+
it("should produce 2 segments") { subject.size.should == 2 }
|
|
25
|
+
it("first segment should be 'abc123abc4'") { subject[0].should == 'abc123abc4' }
|
|
26
|
+
it("first segment should be '56'") { subject[1].should == '56' }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "and string is 'abc123abc456bbbcccddd'" do
|
|
30
|
+
let(:string) { 'abc123abc456bbbcccddd' }
|
|
31
|
+
it("should produce 3 segments") { subject.size.should == 3 }
|
|
32
|
+
it("first segment should be 'abc123abc4'") { subject[0].should == 'abc123abc4' }
|
|
33
|
+
it("first segment should be '56bbbcccdd'") { subject[1].should == '56bbbcccdd' }
|
|
34
|
+
it("first segment should be 'd'") { subject[2].should == 'd' }
|
|
35
|
+
end
|
|
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
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
describe Convoy::Formatter::Terminal do
|
|
2
|
+
let(:terminal) { Convoy::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
|
+
Convoy::Formatter::ShellCommandExecutor.any_instance.stub(:execute_in_current_shell).and_return(nil)
|
|
15
|
+
end
|
|
16
|
+
it("should be equal to default width") { subject.should == Convoy::Formatter::Terminal::DEFAULT_WIDTH }
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
describe Convoy::Setup::Configuration::Generator do
|
|
2
|
+
|
|
3
|
+
let(:generator) { Convoy::Setup::Configuration::Generator.new(setup) }
|
|
4
|
+
let(:setup) { Convoy::SetupAccessor.new(app_configuration) }
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
describe "#default_data" do
|
|
8
|
+
subject { generator.default_data }
|
|
9
|
+
|
|
10
|
+
context "when basic configuration" do
|
|
11
|
+
let(:app_configuration) do
|
|
12
|
+
Convoy::Setup::Dsl::Global.new do |app|
|
|
13
|
+
app.options do |opts|
|
|
14
|
+
opts.opt :option1, "option1", :short => :none, :long => '--option1', :type => :string
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
app.action do |options, arguments|
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
it("should have a user config") { subject[:user].should_not be_nil }
|
|
22
|
+
it("user config should be empty") { subject[:user].should be_empty }
|
|
23
|
+
it("shoud have a global config") { subject[:global].should_not be_nil }
|
|
24
|
+
it("global config should not be empty") { subject[:global].should_not be_empty }
|
|
25
|
+
it("should have a global commands config") { subject[:global][:commands].should_not be_nil }
|
|
26
|
+
it("global commands config should be empty") { subject[:global][:commands].should be_empty }
|
|
27
|
+
it("should have a global options config") { subject[:global][:options].should_not be_nil }
|
|
28
|
+
it("global options config should not be empty") { subject[:global][:options].should_not be_empty }
|
|
29
|
+
it("options config should have a key for configured option") { subject[:global][:options].keys.size.should == 1 }
|
|
30
|
+
it("options config key for configured config should be nil when no default value") { subject[:global][:options][:option1].should be_nil }
|
|
31
|
+
|
|
32
|
+
context "and configured option has default value" do
|
|
33
|
+
let(:app_configuration) do
|
|
34
|
+
Convoy::Setup::Dsl::Global.new do |app|
|
|
35
|
+
app.options do |opts|
|
|
36
|
+
opts.opt :option1, "option1", :short => :none, :long => '--option1', :type => :string, :default => "hello"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
app.action do |options, arguments|
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
it("options config key for configured config should equal to default value") { subject[:global][:options][:option1].should == 'hello' }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "when suite configuration" do
|
|
48
|
+
let(:app_configuration) do
|
|
49
|
+
Convoy::Setup::Dsl::Global.new do |app|
|
|
50
|
+
app.options do |opts|
|
|
51
|
+
opts.opt :option1, "option1", :short => :none, :long => '--option1', :type => :string
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
app.command :command1, :aliases => [:c1, :com1] do |command|
|
|
55
|
+
command.options do |opts|
|
|
56
|
+
opts.opt :option2, "option2", :short => :none, :long => '--option2', :type => :string, :default => 'blah'
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it("should have a global commands config") { subject[:global][:commands].should_not be_nil }
|
|
63
|
+
it("global commands config should be empty") { subject[:global][:commands].should_not be_empty }
|
|
64
|
+
it("command1 commands config should not be nil") { subject[:global][:commands][:command1][:commands].should_not be_nil }
|
|
65
|
+
it("command1 commands config should be empty") { subject[:global][:commands][:command1][:commands].should be_empty }
|
|
66
|
+
it("command1 options config should not be nil") { subject[:global][:commands][:command1][:options].should_not be_nil }
|
|
67
|
+
it("command1 options config should not be empty") { subject[:global][:commands][:command1][:options].should_not be_empty }
|
|
68
|
+
it("command1 options option value should be the same as default value") { subject[:global][:commands][:command1][:options][:option2].should == 'blah' }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context "when suite with sub commands configuration" do
|
|
72
|
+
let(:app_configuration) do
|
|
73
|
+
Convoy::Setup::Dsl::Global.new do |app|
|
|
74
|
+
app.options do |opts|
|
|
75
|
+
opts.opt :option1, "option1", :short => :none, :long => '--option1', :type => :string
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
app.command :command1, :aliases => [:c1, :com1] do |command|
|
|
79
|
+
command.options do |opts|
|
|
80
|
+
opts.opt :option2, "option2", :short => :none, :long => '--option2', :type => :string, :default => 'blah'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
command.command :sub_command1 do |command|
|
|
84
|
+
command.options do |opts|
|
|
85
|
+
opts.opt :option3, "option3", :short => :none, :long => '--option3', :type => :string, :default => 'yadda'
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it("command1 commands config should not be nil") { subject[:global][:commands][:command1][:commands].should_not be_nil }
|
|
93
|
+
it("command1 commands config should not be empty") { subject[:global][:commands][:command1][:commands].should_not be_empty }
|
|
94
|
+
it("sub_command1 command config should not be nil") { subject[:global][:commands][:command1][:commands][:sub_command1][:commands].should_not be_nil }
|
|
95
|
+
it("sub_command1 command config should be empty") { subject[:global][:commands][:command1][:commands][:sub_command1][:commands].should be_empty }
|
|
96
|
+
it("sub_command1 options config should not be nil") { subject[:global][:commands][:command1][:commands][:sub_command1][:options].should_not be_nil }
|
|
97
|
+
it("sub_command1 options config should not be empty") { subject[:global][:commands][:command1][:commands][:sub_command1][:options].should_not be_empty }
|
|
98
|
+
it("sub_command1 options option value should be the same as default value") { subject[:global][:commands][:command1][:commands][:sub_command1][:options][:option3].should == 'yadda' }
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|