escort 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +8 -0
  3. data/README.md +365 -14
  4. data/TODO.md +157 -44
  5. data/escort.gemspec +1 -0
  6. data/examples/{1_1_basic.rb → attic/1_1_basic.rb} +0 -0
  7. data/examples/{1_2_basic_requires_arguments.rb → attic/1_2_basic_requires_arguments.rb} +0 -0
  8. data/examples/{2_2_command.rb → attic/2_2_command.rb} +0 -0
  9. data/examples/{2_2_command_requires_arguments.rb → attic/2_2_command_requires_arguments.rb} +0 -0
  10. data/examples/{2_3_nested_commands.rb → attic/2_3_nested_commands.rb} +0 -0
  11. data/examples/{3_validations.rb → attic/3_validations.rb} +0 -0
  12. data/examples/{4_1_config_file.rb → attic/4_1_config_file.rb} +0 -0
  13. data/examples/{argument_handling → attic/argument_handling}/basic.rb +0 -0
  14. data/examples/{argument_handling → attic/argument_handling}/basic_command.rb +0 -0
  15. data/examples/{argument_handling → attic/argument_handling}/no_arguments.rb +0 -0
  16. data/examples/{argument_handling → attic/argument_handling}/no_arguments_command.rb +0 -0
  17. data/examples/{command_aliases → attic/command_aliases}/app.rb +0 -0
  18. data/examples/{config_file → attic/config_file}/.apprc2 +0 -0
  19. data/examples/{config_file → attic/config_file}/app.rb +0 -0
  20. data/examples/{config_file → attic/config_file}/sub_commands.rb +0 -0
  21. data/examples/{default_command → attic/default_command}/app.rb +0 -0
  22. data/examples/{sub_commands → attic/sub_commands}/app.rb +0 -0
  23. data/examples/{validation_basic → attic/validation_basic}/app.rb +0 -0
  24. data/examples/basic +10 -0
  25. data/examples/basic_conflicts +17 -0
  26. data/examples/basic_depends_on +25 -0
  27. data/examples/basic_flags +15 -0
  28. data/examples/basic_options +14 -0
  29. data/examples/basic_options_multi +15 -0
  30. data/examples/basic_require_arguments +17 -0
  31. data/examples/basic_texts +21 -0
  32. data/examples/basic_validations +21 -0
  33. data/examples/command +19 -0
  34. data/examples/commands/example_command.rb +13 -0
  35. data/lib/escort/action_command/base.rb +4 -0
  36. data/lib/escort/app.rb +33 -11
  37. data/lib/escort/formatter/borderless_table.rb +4 -0
  38. data/lib/escort/formatter/command.rb +87 -0
  39. data/lib/escort/formatter/commands.rb +36 -0
  40. data/lib/escort/formatter/default_help_formatter.rb +68 -73
  41. data/lib/escort/formatter/global_command.rb +17 -0
  42. data/lib/escort/formatter/option.rb +138 -0
  43. data/lib/escort/formatter/options.rb +17 -3
  44. data/lib/escort/formatter/shell_command_executor.rb +49 -0
  45. data/lib/escort/formatter/terminal.rb +17 -9
  46. data/lib/escort/formatter/terminal_formatter.rb +6 -0
  47. data/lib/escort/logger.rb +4 -4
  48. data/lib/escort/option_dependency_validator.rb +83 -0
  49. data/lib/escort/option_parser.rb +11 -1
  50. data/lib/escort/setup/configuration/reader.rb +0 -2
  51. data/lib/escort/setup/configuration/writer.rb +0 -2
  52. data/lib/escort/setup/dsl/command.rb +2 -7
  53. data/lib/escort/setup/dsl/global.rb +2 -9
  54. data/lib/escort/setup/dsl/options.rb +56 -0
  55. data/lib/escort/setup_accessor.rb +23 -6
  56. data/lib/escort/trollop.rb +4 -3
  57. data/lib/escort/validator.rb +4 -1
  58. data/lib/escort/version.rb +1 -1
  59. data/lib/escort.rb +8 -1
  60. data/spec/integration/basic_conflicts_spec.rb +47 -0
  61. data/spec/integration/basic_depends_on_spec.rb +275 -0
  62. data/spec/integration/basic_options_spec.rb +9 -21
  63. data/spec/integration/basic_options_with_multi_spec.rb +30 -0
  64. data/spec/integration/basic_spec.rb +5 -6
  65. data/spec/integration/basic_validations_spec.rb +77 -0
  66. data/spec/integration/basic_with_arguments_spec.rb +33 -0
  67. data/spec/integration/basic_with_text_fields_spec.rb +21 -0
  68. data/spec/lib/escort/formatter/command_spec.rb +238 -0
  69. data/spec/lib/escort/formatter/global_command_spec.rb +50 -0
  70. data/spec/lib/escort/formatter/option_spec.rb +300 -0
  71. data/spec/lib/escort/formatter/shell_command_executor_spec.rb +59 -0
  72. data/spec/lib/escort/formatter/string_splitter_spec.rb +12 -0
  73. data/spec/lib/escort/formatter/terminal_spec.rb +19 -0
  74. data/spec/lib/escort/setup_accessor_spec.rb +1 -0
  75. data/spec/spec_helper.rb +9 -3
  76. data/spec/support/integration_helpers.rb +2 -0
  77. data/spec/{helpers/execute_action_matcher.rb → support/matchers/execute_action_for_command_matcher.rb} +3 -3
  78. data/spec/support/matchers/execute_action_with_arguments_matcher.rb +25 -0
  79. data/spec/support/matchers/execute_action_with_options_matcher.rb +29 -0
  80. data/spec/support/matchers/exit_with_code_matcher.rb +29 -0
  81. data/spec/support/shared_contexts/integration_setup.rb +34 -0
  82. metadata +86 -28
  83. data/examples/basic/app.rb +0 -16
  84. data/lib/escort/formatter/common.rb +0 -58
  85. data/spec/helpers/exit_with_code_matcher.rb +0 -21
  86. data/spec/helpers/give_option_to_action_with_value_matcher.rb +0 -22
@@ -0,0 +1,275 @@
1
+ describe "Escort basic app with dependent options", :integration => true do
2
+ subject { Escort::App.create(option_string, &app_configuration) }
3
+
4
+ context "when dependency specification has no 'on' parameter" do
5
+ let(:app_configuration) do
6
+ lambda do |app|
7
+ app.options do |opts|
8
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
9
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
10
+
11
+ opts.dependency :option1
12
+ end
13
+
14
+ app.action do |options, arguments|
15
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
16
+ end
17
+ end
18
+ end
19
+ let(:option_string) { "-f" }
20
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
21
+ end
22
+
23
+ context "when option dependent on presence of flag" do
24
+ let(:app_configuration) do
25
+ lambda do |app|
26
+ app.options do |opts|
27
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
28
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
29
+
30
+ opts.dependency :option1, :on => :flag1
31
+ end
32
+
33
+ app.action do |options, arguments|
34
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
35
+ end
36
+ end
37
+ end
38
+
39
+ context "and flag is not present" do
40
+ let(:option_string) { "-o foo" }
41
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
42
+ end
43
+
44
+ context "and flag is present" do
45
+ let(:option_string) { "-f -o foo" }
46
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
47
+ end
48
+ end
49
+
50
+ context "when flag depends on another flag" do
51
+ let(:app_configuration) do
52
+ lambda do |app|
53
+ app.options do |opts|
54
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
55
+ opts.opt :flag2, "Flag 2", :short => :none, :long => '--flag2', :type => :boolean, :default => true
56
+ opts.opt :flag3, "Flag 3", :short => :none, :long => '--flag3', :type => :boolean
57
+ opts.opt :flag4, "Flag 4", :short => :none, :long => '--flag4', :type => :boolean
58
+
59
+ opts.dependency :flag3, :on => :flag1
60
+ opts.dependency :flag4, :on => :flag2
61
+ end
62
+
63
+ app.action do |options, arguments|
64
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
65
+ end
66
+ end
67
+ end
68
+
69
+ context "and other flag has a default value of false" do
70
+ context "and other flag is present" do
71
+ let(:option_string) { "--flag1 --flag3" }
72
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
73
+ end
74
+
75
+ context "and other flag is not present" do
76
+ let(:option_string) { "--flag3" }
77
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
78
+ end
79
+ end
80
+
81
+ context "and other flag has a default value of true" do
82
+ context "and other flag is present" do
83
+ let(:option_string) { "--flag2 --flag4" }
84
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
85
+ end
86
+
87
+ context "and other flag is not present" do
88
+ let(:option_string) { "--flag4" }
89
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
90
+ end
91
+
92
+ context "and other flag negative option is used" do
93
+ let(:option_string) { "--no-flag2 --flag4" }
94
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
95
+ end
96
+ end
97
+ end
98
+
99
+ context "when option dependent on presence of multiple other options" do
100
+ let(:app_configuration) do
101
+ lambda do |app|
102
+ app.options do |opts|
103
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
104
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
105
+ opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
106
+
107
+ opts.dependency :option2, :on => [:flag1, :option1]
108
+ end
109
+
110
+ app.action do |options, arguments|
111
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
112
+ end
113
+ end
114
+ end
115
+
116
+ context "and one of the other options is not present" do
117
+ let(:option_string) { "-f --option2=foo" }
118
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
119
+ end
120
+
121
+ context "and none of the other options are present" do
122
+ let(:option_string) { "--option2=foo" }
123
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
124
+ end
125
+
126
+ context "and all of the other options are present" do
127
+ let(:option_string) { "-f -o bar --option2=foo" }
128
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
129
+ end
130
+ end
131
+
132
+ context "when option dependent on other option value" do
133
+ let(:app_configuration) do
134
+ lambda do |app|
135
+ app.options do |opts|
136
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
137
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
138
+ opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
139
+
140
+ opts.dependency :option2, :on => {:option1 => 'bar'}
141
+ end
142
+
143
+ app.action do |options, arguments|
144
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
145
+ end
146
+ end
147
+ end
148
+
149
+ context "and other option is supplied with this value" do
150
+ let(:option_string) { "-o bar --option2=foo" }
151
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
152
+ end
153
+
154
+ context "and other option is supplied with different value" do
155
+ let(:option_string) { "-o baz --option2=foo" }
156
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
157
+ end
158
+
159
+ context "and other option is not supplied" do
160
+ let(:option_string) { "--option2=foo" }
161
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
162
+ end
163
+ end
164
+
165
+ context "when option dependent on other option value and presence of yet another option" do
166
+ let(:app_configuration) do
167
+ lambda do |app|
168
+ app.options do |opts|
169
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
170
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
171
+ opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
172
+
173
+ opts.dependency :option2, :on => [:flag1, {:option1 => 'bar'}]
174
+ end
175
+
176
+ app.action do |options, arguments|
177
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
178
+ end
179
+ end
180
+ end
181
+
182
+ context "and yet another option is not present" do
183
+ let(:option_string) { "-o bar --option2=foo" }
184
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
185
+ end
186
+
187
+ context "and other option has different value" do
188
+ let(:option_string) { "-o baz -f --option2=foo" }
189
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
190
+ end
191
+
192
+ context "and other option has the right value and yet another option is present" do
193
+ let(:option_string) { "-o bar -f --option2=foo" }
194
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
195
+ end
196
+ end
197
+
198
+ context "when option dependent on itself" do
199
+ let(:app_configuration) do
200
+ lambda do |app|
201
+ app.options do |opts|
202
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
203
+
204
+ opts.dependency :option1, :on => :option1
205
+ end
206
+
207
+ app.action do |options, arguments|
208
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
209
+ end
210
+ end
211
+ end
212
+ let(:option_string) { "-o bar" }
213
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
214
+ end
215
+
216
+ context "when dependency specified for non-existant option" do
217
+ let(:app_configuration) do
218
+ lambda do |app|
219
+ app.options do |opts|
220
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
221
+
222
+ opts.dependency :option2, :on => :option1
223
+ end
224
+
225
+ app.action do |options, arguments|
226
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
227
+ end
228
+ end
229
+ end
230
+ let(:option_string) { "-o bar" }
231
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
232
+ end
233
+
234
+ context "when option dependent on non-existant option" do
235
+ let(:app_configuration) do
236
+ lambda do |app|
237
+ app.options do |opts|
238
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
239
+
240
+ opts.dependency :option1, :on => :option2
241
+ end
242
+
243
+ app.action do |options, arguments|
244
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
245
+ end
246
+ end
247
+ end
248
+ let(:option_string) { "-o bar" }
249
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
250
+ end
251
+
252
+ context "when dependency is specified inline" do
253
+ let(:app_configuration) do
254
+ lambda do |app|
255
+ app.options do |opts|
256
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
257
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :depends_on => :flag1
258
+ end
259
+
260
+ app.action do |options, arguments|
261
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
262
+ end
263
+ end
264
+ end
265
+ context "and dependency is satisfied" do
266
+ let(:option_string) { "-f -o bar" }
267
+ it("it should exit successfully") { expect{subject}.to exit_with_code(0) }
268
+ end
269
+
270
+ context "and dependency is not satisfied" do
271
+ let(:option_string) { "-o bar" }
272
+ it("it should not exit successfully") { expect{subject}.to_not exit_with_code(0) }
273
+ end
274
+ end
275
+ end
@@ -1,26 +1,14 @@
1
- describe "Escort basic app with options defined" do
1
+ describe "Escort basic app with options defined", :integration => true do
2
2
  subject { Escort::App.create(option_string, &app_configuration) }
3
- let(:result) { [] }
4
-
5
- before do
6
- $stderr = StringIO.new
7
- $stdout = StringIO.new
8
- end
9
-
10
- after do
11
- $stderr = STDERR
12
- $stdout = STDOUT
13
- end
14
3
 
15
4
  let(:app_configuration) do
16
- ->(app) do
5
+ lambda do |app|
17
6
  app.options do |opts|
18
7
  opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
19
8
  end
20
9
 
21
10
  app.action do |options, arguments|
22
- result << :global
23
- result << {:option1 => options[:global][:options][:option1]}
11
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
24
12
  end
25
13
  end
26
14
  end
@@ -28,22 +16,22 @@ describe "Escort basic app with options defined" do
28
16
  context "when called with empty option string" do
29
17
  let(:option_string) { "" }
30
18
  it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
31
- it("should execute the global action") { expect{subject}.to execute_action(:global, result) }
32
- it("option1 have its default value in action") { expect{subject}.to give_option_to_action_with_value(:option1, 'option 1', result) }
19
+ it("should execute the global action") { expect{subject}.to execute_action_for_command(result, :global) }
20
+ it("option1 have its default value in action") { expect{subject}.to execute_action_with_options(result, :option1 => 'option 1') }
33
21
  end
34
22
 
35
23
  context "when called with option string with short code option" do
36
24
  let(:option_string) { "-o blah" }
37
25
  it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
38
- it("should execute the global action") { expect{subject}.to execute_action(:global, result) }
39
- it("option1 have the value 'blah' in action") { expect{subject}.to give_option_to_action_with_value(:option1, 'blah', result) }
26
+ it("should execute the global action") { expect{subject}.to execute_action_for_command(result, :global) }
27
+ it("option1 have the value 'blah' in action") { expect{subject}.to execute_action_with_options(result, :option1 => 'blah') }
40
28
  end
41
29
 
42
30
  context "when called with option string with long code option" do
43
31
  let(:option_string) { "--option1=blah" }
44
32
  it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
45
- it("should execute the global action") { expect{subject}.to execute_action(:global, result) }
46
- it("option1 have the value 'blah' in action") { expect{subject}.to give_option_to_action_with_value(:option1, 'blah', result) }
33
+ it("should execute the global action") { expect{subject}.to execute_action_for_command(result, :global) }
34
+ it("option1 have the value 'blah' in action") { expect{subject}.to execute_action_with_options(result, :option1 => 'blah') }
47
35
  end
48
36
 
49
37
  context "when called with option string with unknown option" do
@@ -0,0 +1,30 @@
1
+ describe "Escort basic app with multi option", :integration => true do
2
+ subject { Escort::App.create(option_string, &app_configuration) }
3
+
4
+ let(:app_configuration) do
5
+ lambda do |app|
6
+ app.options do |opts|
7
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :multi => true
8
+ end
9
+
10
+ app.action do |options, arguments|
11
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
12
+ end
13
+ end
14
+ end
15
+
16
+ context "when called with empty option string" do
17
+ let(:option_string) { "" }
18
+ it("option1 should be an empty array") { expect{subject}.to execute_action_with_options(result, :option1 => []) }
19
+ end
20
+
21
+ context "when called with option1 specified once" do
22
+ let(:option_string) { "-o blah" }
23
+ it("option1 have the value ['blah'] in action") { expect{subject}.to execute_action_with_options(result, :option1 => ['blah']) }
24
+ end
25
+
26
+ context "when called with option1 specified 3 times" do
27
+ let(:option_string) { "-o blah --option1=blah2 -o blah3" }
28
+ it("option1 have the value ['blah', 'blah2', 'blah3'] in action") { expect{subject}.to execute_action_with_options(result, :option1 => ['blah', 'blah2', 'blah3']) }
29
+ end
30
+ end
@@ -1,11 +1,10 @@
1
- describe "Escort basic app with no options defined" do
1
+ describe "Escort basic app with no options defined", :integration => true do
2
2
  subject { Escort::App.create(option_string, &app_configuration) }
3
- let(:result) { [] }
4
3
 
5
4
  let(:app_configuration) do
6
- ->(app) do
5
+ lambda do |app|
7
6
  app.action do |options, arguments|
8
- result << :global
7
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
9
8
  end
10
9
  end
11
10
  end
@@ -13,12 +12,12 @@ describe "Escort basic app with no options defined" do
13
12
  context "when called with empty option string" do
14
13
  let(:option_string) { "" }
15
14
  it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
16
- it("should execute the global action") { expect{subject}.to execute_action(:global, result) }
15
+ it("should execute the global action") { expect{subject}.to execute_action_for_command(result, :global) }
17
16
  end
18
17
 
19
18
  context "when called with non-empty option string" do
20
19
  let(:option_string) { "hello" }
21
20
  it("exit code should be 0") { expect{ subject }.to exit_with_code(0) }
22
- it("should execute the global action") { expect{subject}.to execute_action(:global, result) }
21
+ it("should execute the global action") { expect{subject}.to execute_action_for_command(result, :global) }
23
22
  end
24
23
  end
@@ -0,0 +1,77 @@
1
+ describe "Escort basic app with validations", :integration => true do
2
+ subject { Escort::App.create(option_string, &app_configuration) }
3
+
4
+ context "when validation exists for non-existant option" do
5
+ let(:app_configuration) do
6
+ lambda do |app|
7
+ app.options do |opts|
8
+ opts.opt :option1, "Option 1", :short => '-o', :long => '--option1', :type => :string
9
+ opts.validate(:option2, "must be either 'foo' or 'bar'") { |option| ["foo", "bar"].include?(option) }
10
+ end
11
+
12
+ app.action do |options, arguments|
13
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
14
+ end
15
+ end
16
+ end
17
+ let(:option_string) { "-o bar" }
18
+
19
+ it("should exit with code 2") { expect{ subject }.to exit_with_code(2) }
20
+ end
21
+
22
+ context "when option has a validation" do
23
+ let(:app_configuration) do
24
+ lambda do |app|
25
+ app.options do |opts|
26
+ opts.opt :option1, "Option 1", :short => '-o', :long => '--option1', :type => :string
27
+ opts.validate(:option1, "must be either 'foo' or 'bar'") { |option| ["foo", "bar"].include?(option) }
28
+ end
29
+
30
+ app.action do |options, arguments|
31
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
32
+ end
33
+ end
34
+ end
35
+
36
+ context "and validation fails" do
37
+ let(:option_string) { "-o baz" }
38
+ it("should exit with code 3") { expect{ subject }.to exit_with_code(3) }
39
+ end
40
+
41
+ context "and validation does not fail" do
42
+ let(:option_string) { "-o foo" }
43
+ it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
44
+ end
45
+ end
46
+
47
+ context "when option has multiple validations" do
48
+ let(:app_configuration) do
49
+ lambda do |app|
50
+ app.options do |opts|
51
+ opts.opt :option2, "Option 2", :short => :none, :long => '--option2', :type => :string
52
+ opts.validate(:option2, "must be two words") {|option| option =~ /\w\s\w/}
53
+ opts.validate(:option2, "must be at least 20 characters long") {|option| option.length >= 20}
54
+ end
55
+
56
+ app.action do |options, arguments|
57
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
58
+ end
59
+ end
60
+ end
61
+
62
+ context "and one validation fails" do
63
+ let(:option_string) { "--option2='hb'" }
64
+ it("should exit with code 3") { expect{ subject }.to exit_with_code(3) }
65
+ end
66
+
67
+ context "and the other validation fails" do
68
+ let(:option_string) { "--option2='h bssfs'" }
69
+ it("should exit with code 3") { expect{ subject }.to exit_with_code(3) }
70
+ end
71
+
72
+ context "and both validations pass" do
73
+ let(:option_string) { "--option2='h bssfsfsdfsdfsfsdsf'" }
74
+ it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,33 @@
1
+ describe "Escort basic app that requires arguments", :integration => true do
2
+ subject { Escort::App.create(option_string, &app_configuration) }
3
+
4
+ let(:app_configuration) do
5
+ lambda do |app|
6
+ app.requires_arguments
7
+
8
+ app.action do |options, arguments|
9
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
10
+ end
11
+ end
12
+ end
13
+
14
+ context "when called with no arguments" do
15
+ let(:option_string) { "" }
16
+
17
+ before do
18
+ Readline.stub(:readline).and_return('1', nil)
19
+ end
20
+
21
+ it("action should receive ['1'] as arguments") { expect{subject}.to execute_action_with_arguments(result, ['1']) }
22
+ end
23
+
24
+ context "when called with one argument" do
25
+ let(:option_string) { "1" }
26
+ it("action should receive ['1'] as arguments") { expect{subject}.to execute_action_with_arguments(result, ['1']) }
27
+ end
28
+
29
+ context "when called with three arguments" do
30
+ let(:option_string) { "1 2 3" }
31
+ it("action should receive ['1', '2', '3'] as arguments") { expect{subject}.to execute_action_with_arguments(result, ['1', '2', '3']) }
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ describe "Escort basic app with version, description, and summary", :integration => true do
2
+ subject { Escort::App.create(option_string, &app_configuration) }
3
+
4
+ let(:app_configuration) do
5
+ lambda do |app|
6
+ app.version "0.1.1"
7
+ app.summary "Sum1"
8
+ app.description "Desc1"
9
+
10
+ app.action do |options, arguments|
11
+ Escort::IntegrationTestCommand.new(options, arguments).execute(result)
12
+ end
13
+ end
14
+ end
15
+
16
+ context "when called" do
17
+ let(:option_string) { "" }
18
+
19
+ it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
20
+ end
21
+ end