escort 0.1.0 → 0.2.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.
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