escort 0.0.1 → 0.1.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 +15 -0
- data/.gitignore +1 -0
- data/.irbrc +1 -0
- data/.rspec +3 -0
- data/.rvmrc +22 -0
- data/README.md +31 -56
- data/TODO.md +152 -0
- data/escort.gemspec +6 -2
- data/examples/1_1_basic.rb +15 -0
- data/examples/1_2_basic_requires_arguments.rb +15 -0
- data/examples/2_2_command.rb +18 -0
- data/examples/2_2_command_requires_arguments.rb +20 -0
- data/examples/2_3_nested_commands.rb +26 -0
- data/examples/3_validations.rb +31 -0
- data/examples/4_1_config_file.rb +42 -0
- data/examples/argument_handling/basic.rb +12 -0
- data/examples/argument_handling/basic_command.rb +18 -0
- data/examples/argument_handling/no_arguments.rb +14 -0
- data/examples/argument_handling/no_arguments_command.rb +20 -0
- data/examples/basic/app.rb +16 -0
- data/examples/command_aliases/app.rb +31 -0
- data/examples/config_file/.apprc2 +16 -0
- data/examples/config_file/app.rb +78 -0
- data/examples/config_file/sub_commands.rb +35 -0
- data/examples/default_command/app.rb +20 -0
- data/examples/sub_commands/app.rb +18 -0
- data/examples/validation_basic/app.rb +31 -0
- data/lib/escort.rb +51 -4
- data/lib/escort/action_command/base.rb +79 -0
- data/lib/escort/action_command/escort_utility_command.rb +53 -0
- data/lib/escort/app.rb +89 -36
- data/lib/escort/arguments.rb +20 -0
- data/lib/escort/auto_options.rb +71 -0
- data/lib/escort/error/error.rb +50 -0
- data/lib/escort/formatter/borderless_table.rb +102 -0
- data/lib/escort/formatter/common.rb +58 -0
- data/lib/escort/formatter/default_help_formatter.rb +106 -0
- data/lib/escort/formatter/options.rb +13 -0
- data/lib/escort/formatter/string_splitter.rb +30 -0
- data/lib/escort/formatter/terminal.rb +22 -0
- data/lib/escort/formatter/terminal_formatter.rb +52 -0
- data/lib/escort/global_pre_parser.rb +43 -0
- data/lib/escort/logger.rb +75 -0
- data/lib/escort/option_parser.rb +145 -0
- data/lib/escort/setup/configuration/generator.rb +75 -0
- data/lib/escort/setup/configuration/instance.rb +33 -0
- data/lib/escort/setup/configuration/loader.rb +37 -0
- data/lib/escort/setup/configuration/locator/base.rb +19 -0
- data/lib/escort/setup/configuration/locator/descending_to_home.rb +23 -0
- data/lib/escort/setup/configuration/merge_tool.rb +38 -0
- data/lib/escort/setup/configuration/reader.rb +36 -0
- data/lib/escort/setup/configuration/writer.rb +44 -0
- data/lib/escort/setup/dsl/action.rb +17 -0
- data/lib/escort/setup/dsl/command.rb +74 -0
- data/lib/escort/setup/dsl/config_file.rb +13 -0
- data/lib/escort/setup/dsl/global.rb +84 -0
- data/lib/escort/setup/dsl/options.rb +25 -0
- data/lib/escort/setup/dsl/validations.rb +25 -0
- data/lib/escort/setup_accessor.rb +194 -0
- data/lib/escort/trollop.rb +15 -4
- data/lib/escort/utils.rb +21 -0
- data/lib/escort/validator.rb +42 -0
- data/lib/escort/version.rb +1 -1
- data/spec/helpers/execute_action_matcher.rb +21 -0
- data/spec/helpers/exit_with_code_matcher.rb +21 -0
- data/spec/helpers/give_option_to_action_with_value_matcher.rb +22 -0
- data/spec/integration/basic_options_spec.rb +53 -0
- data/spec/integration/basic_spec.rb +24 -0
- data/spec/lib/escort/formatter/string_splitter_spec.rb +38 -0
- data/spec/lib/escort/setup_accessor_spec.rb +42 -0
- data/spec/lib/escort/utils_spec.rb +30 -0
- data/spec/spec_helper.rb +22 -0
- metadata +128 -16
- data/lib/escort/command.rb +0 -23
- data/lib/escort/dsl.rb +0 -20
- data/lib/escort/global_dsl.rb +0 -11
@@ -0,0 +1,25 @@
|
|
1
|
+
module Escort
|
2
|
+
module Setup
|
3
|
+
module Dsl
|
4
|
+
class Options
|
5
|
+
class << self
|
6
|
+
def options(command_name, instance, &block)
|
7
|
+
block.call(instance) if block_given?
|
8
|
+
rescue => e
|
9
|
+
raise Escort::ClientError.new("Problem with syntax of #{instance.instance_variable_get(:"@command_name")} options block", e)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(command_name = :global)
|
14
|
+
@command_name = command_name
|
15
|
+
@options = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def opt(name, desc="", opts={})
|
19
|
+
opts[:desc] ||= desc
|
20
|
+
@options[name] ||= opts
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Escort
|
2
|
+
module Setup
|
3
|
+
module Dsl
|
4
|
+
class Validations
|
5
|
+
class << self
|
6
|
+
def validations(command_name, instance, &block)
|
7
|
+
block.call(instance) if block_given?
|
8
|
+
rescue => e
|
9
|
+
raise Escort::ClientError.new("Problem with syntax of #{instance.instance_variable_get(:"@command_name")} validations block", e)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(command_name = :global)
|
14
|
+
@command_name = command_name
|
15
|
+
@validations = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate(name, description, &block)
|
19
|
+
@validations[name] ||= []
|
20
|
+
@validations[name] << {:desc => description, :block => block}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
module Escort
|
2
|
+
class SetupAccessor
|
3
|
+
attr_reader :global_instance
|
4
|
+
|
5
|
+
def initialize(global_instance)
|
6
|
+
@global_instance = global_instance
|
7
|
+
end
|
8
|
+
|
9
|
+
def options_for(context = [])
|
10
|
+
with_context(context) do |current_context|
|
11
|
+
options_hash_from(current_context)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def conflicting_options_for(context = [])
|
16
|
+
with_context(context) do |current_context|
|
17
|
+
conflict_lists_for(current_context)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def validations_for(context = [])
|
23
|
+
with_context(context) do |current_context|
|
24
|
+
validations_hash_from(current_context)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def command_names_for(context = [])
|
29
|
+
with_context(context) do |current_context|
|
30
|
+
command_names_from(current_context)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def canonical_command_names_for(context = [])
|
35
|
+
with_context(context) do |current_context|
|
36
|
+
canonical_command_names_from(current_context)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def action_for(context = [])
|
41
|
+
with_context(context) do |current_context|
|
42
|
+
action_block_from(current_context)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def arguments_required_for(context = [])
|
47
|
+
with_context(context) do |current_context|
|
48
|
+
context_requires_arguments(current_context)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def has_config_file?
|
53
|
+
config_file_object != nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def config_file_autocreatable?
|
57
|
+
autocreatable = fetch_instance_variable_from(config_file_object, :autocreate)
|
58
|
+
end
|
59
|
+
|
60
|
+
def config_file
|
61
|
+
name = fetch_instance_variable_from(config_file_object, :name)
|
62
|
+
end
|
63
|
+
|
64
|
+
def version
|
65
|
+
version_string = fetch_instance_variable_from(global_instance, :version)
|
66
|
+
end
|
67
|
+
|
68
|
+
def summary_for(context = [])
|
69
|
+
with_context(context) do |current_context|
|
70
|
+
fetch_instance_variable_from(current_context, :summary)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def description_for(context = [])
|
75
|
+
with_context(context) do |current_context|
|
76
|
+
fetch_instance_variable_from(current_context, :description)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def command_description_for(command_name, context = [])
|
81
|
+
with_context(context) do |current_context|
|
82
|
+
commands = fetch_instance_variable_from(current_context, :commands)
|
83
|
+
fetch_instance_variable_from(commands[command_name], :description)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def command_summary_for(command_name, context = [])
|
88
|
+
with_context(context) do |current_context|
|
89
|
+
commands = fetch_instance_variable_from(current_context, :commands)
|
90
|
+
fetch_instance_variable_from(commands[command_name], :summary)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def command_aliases_for(command_name, context = [])
|
95
|
+
with_context(context) do |current_context|
|
96
|
+
commands = fetch_instance_variable_from(current_context, :commands)
|
97
|
+
description = fetch_instance_variable_from(commands[command_name], :aliases)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def add_global_option(name, desc, options = {})
|
102
|
+
with_context([]) do |current_context|
|
103
|
+
options_object = options_object_from(current_context)
|
104
|
+
options_object.opt name, desc, options
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def add_global_command(name, options = {}, &block)
|
109
|
+
global_instance.command(name, options, &block)
|
110
|
+
|
111
|
+
#with_context([]) do |current_context|
|
112
|
+
#commands = fetch_instance_variable_from(current_context, :commands)
|
113
|
+
#options_object.opt name, desc, options
|
114
|
+
#end
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def config_file_object
|
120
|
+
config_file = fetch_instance_variable_from(global_instance, :config_file)
|
121
|
+
end
|
122
|
+
|
123
|
+
def with_context(context = [], &block)
|
124
|
+
context = [] if context.nil? || context.empty?
|
125
|
+
context = [context] unless context.kind_of?(Array)
|
126
|
+
current_context = global_instance
|
127
|
+
context.each do |command_name|
|
128
|
+
commands = fetch_instance_variable_from(current_context, :commands)
|
129
|
+
current_context = commands[command_name.to_sym]
|
130
|
+
end
|
131
|
+
block.call(current_context)
|
132
|
+
end
|
133
|
+
|
134
|
+
def context_requires_arguments(context_object)
|
135
|
+
requires_arguments = fetch_instance_variable_from(context_object, :requires_arguments)
|
136
|
+
end
|
137
|
+
|
138
|
+
def action_block_from(context_object)
|
139
|
+
action_object = fetch_instance_variable_from(context_object, :action)
|
140
|
+
block = fetch_instance_variable_from(action_object, :block)
|
141
|
+
#TODO make sure that if there is no block we exit with a client error
|
142
|
+
end
|
143
|
+
|
144
|
+
def command_names_from(context_object)
|
145
|
+
commands = fetch_instance_variable_from(context_object, :commands)
|
146
|
+
commands.keys
|
147
|
+
#TODO make sure there can be no errors here and at worst it is an empty array
|
148
|
+
end
|
149
|
+
|
150
|
+
def canonical_command_names_from(context_object)
|
151
|
+
commands = fetch_instance_variable_from(context_object, :commands)
|
152
|
+
commands.select do |key, command|
|
153
|
+
aliases = fetch_instance_variable_from(command, :aliases)
|
154
|
+
!aliases.include?(key)
|
155
|
+
end.keys
|
156
|
+
#TODO make sure there can be no errors here and at worst it is an empty array
|
157
|
+
end
|
158
|
+
|
159
|
+
def options_hash_from(context_object)
|
160
|
+
ensure_context_object(context_object, {}) do
|
161
|
+
options_object = options_object_from(context_object)
|
162
|
+
fetch_instance_variable_from(options_object, :options)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def options_object_from(context_object)
|
167
|
+
ensure_context_object(context_object, nil) do
|
168
|
+
fetch_instance_variable_from(context_object, :options)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def conflict_lists_for(context_object)
|
173
|
+
fetch_instance_variable_from(context_object, :conflicts)
|
174
|
+
end
|
175
|
+
|
176
|
+
def validations_hash_from(context_object)
|
177
|
+
validations_object = fetch_instance_variable_from(context_object, :validations)
|
178
|
+
fetch_instance_variable_from(validations_object, :validations)
|
179
|
+
end
|
180
|
+
|
181
|
+
def fetch_instance_variable_from_setup(instance_variable)
|
182
|
+
fetch_instance_variable_from(global_instance, instance_variable)
|
183
|
+
end
|
184
|
+
|
185
|
+
def fetch_instance_variable_from(instance, instance_variable)
|
186
|
+
instance_variable_symbol = :"@#{instance_variable.to_s}"
|
187
|
+
instance.instance_variable_get(instance_variable_symbol)
|
188
|
+
end
|
189
|
+
|
190
|
+
def ensure_context_object(context_object, default_value, &block)
|
191
|
+
context_object ? block.call : default_value
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
data/lib/escort/trollop.rb
CHANGED
@@ -66,6 +66,8 @@ class Parser
|
|
66
66
|
## for testing.)
|
67
67
|
attr_reader :specs
|
68
68
|
|
69
|
+
attr_reader :order
|
70
|
+
|
69
71
|
## Initializes the parser, and instance-evaluates any block given.
|
70
72
|
def initialize *a, &b
|
71
73
|
@version = nil
|
@@ -77,6 +79,7 @@ class Parser
|
|
77
79
|
@constraints = []
|
78
80
|
@stop_words = []
|
79
81
|
@stop_on_unknown = false
|
82
|
+
@help_formatter = nil
|
80
83
|
|
81
84
|
#instance_eval(&b) if b # can't take arguments
|
82
85
|
cloaker(&b).bind(self).call(*a) if b
|
@@ -238,6 +241,14 @@ class Parser
|
|
238
241
|
def banner s; @order << [:text, s] end
|
239
242
|
alias :text :banner
|
240
243
|
|
244
|
+
def help_formatter(formatter)
|
245
|
+
@help_formatter = formatter
|
246
|
+
end
|
247
|
+
|
248
|
+
def current_help_formatter
|
249
|
+
@help_formatter
|
250
|
+
end
|
251
|
+
|
241
252
|
## Marks two (or more!) options as requiring each other. Only handles
|
242
253
|
## undirected (i.e., mutual) dependencies. Directed dependencies are
|
243
254
|
## better modeled with Trollop::die.
|
@@ -518,7 +529,7 @@ class Parser
|
|
518
529
|
$stderr.puts "Error: #{arg}."
|
519
530
|
end
|
520
531
|
$stderr.puts "Try --help for help."
|
521
|
-
exit(
|
532
|
+
exit(1)
|
522
533
|
end
|
523
534
|
|
524
535
|
private
|
@@ -735,15 +746,15 @@ end
|
|
735
746
|
##
|
736
747
|
## Requires passing in the parser object.
|
737
748
|
|
738
|
-
def with_standard_exception_handling
|
749
|
+
def with_standard_exception_handling(parser)
|
739
750
|
begin
|
740
751
|
yield
|
741
752
|
rescue CommandlineError => e
|
742
753
|
$stderr.puts "Error: #{e.message}."
|
743
754
|
$stderr.puts "Try --help for help."
|
744
|
-
exit(
|
755
|
+
exit(1)
|
745
756
|
rescue HelpNeeded
|
746
|
-
parser.educate
|
757
|
+
parser.current_help_formatter ? parser.current_help_formatter.print(parser) : parser.educate
|
747
758
|
exit
|
748
759
|
rescue VersionNeeded
|
749
760
|
puts parser.version
|
data/lib/escort/utils.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module Escort
|
4
|
+
class Utils
|
5
|
+
class << self
|
6
|
+
def symbolize_keys(hash)
|
7
|
+
hash.inject({}) do |result, (key, value)|
|
8
|
+
new_key = (key.kind_of?(String) ? key.to_sym : key)
|
9
|
+
new_value = (value.kind_of?(Hash) ? symbolize_keys(value) : value)
|
10
|
+
result[new_key] = new_value
|
11
|
+
result
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def tokenize_option_string(option_string)
|
16
|
+
option_string ||= ''
|
17
|
+
Shellwords.shellwords(option_string)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Escort
|
2
|
+
class Validator
|
3
|
+
class << self
|
4
|
+
def for(parser)
|
5
|
+
self.new(parser)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :parser
|
10
|
+
|
11
|
+
def initialize(parser)
|
12
|
+
@parser = parser
|
13
|
+
end
|
14
|
+
|
15
|
+
def validate(options, validations)
|
16
|
+
validations.each do |option, validations_array|
|
17
|
+
if option_exists?(option)
|
18
|
+
validate_option(option, options, validations_array)
|
19
|
+
else
|
20
|
+
raise Escort::ClientError.new("Unable to create validation for '#{option}' as no such option was defined, maybe you misspelled it")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
options
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def option_exists?(option)
|
29
|
+
parser.specs.keys.include?(option)
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_option(option, options, validations_array)
|
33
|
+
validations_array.each do |validation_data|
|
34
|
+
parser.die(option, validation_data[:desc]) if invalid?(option, options, validation_data)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def invalid?(option, options, validation_data)
|
39
|
+
options[option] && !validation_data[:block].call(options[option])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/escort/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
RSpec::Matchers.define :execute_action do |command_name, result|
|
2
|
+
match do |block|
|
3
|
+
begin
|
4
|
+
block.call
|
5
|
+
rescue SystemExit => e
|
6
|
+
end
|
7
|
+
result.first == command_name
|
8
|
+
end
|
9
|
+
|
10
|
+
failure_message_for_should do |block|
|
11
|
+
"'#{command_name}' action should have been executed as a result of block, but instead '#{result.first}' was executed"
|
12
|
+
end
|
13
|
+
|
14
|
+
failure_message_for_should_not do |block|
|
15
|
+
"'#{command_name}' action should not have been executed as a result of block"
|
16
|
+
end
|
17
|
+
|
18
|
+
description do
|
19
|
+
"'#{command_name}' action should have been executed as a result of block"
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
RSpec::Matchers.define :exit_with_code do |exp_code|
|
2
|
+
actual = nil
|
3
|
+
match do |block|
|
4
|
+
begin
|
5
|
+
block.call
|
6
|
+
rescue SystemExit => e
|
7
|
+
actual = e.status
|
8
|
+
end
|
9
|
+
actual and actual == exp_code
|
10
|
+
end
|
11
|
+
failure_message_for_should do |block|
|
12
|
+
"expected block to call exit(#{exp_code}) but exit" +
|
13
|
+
(actual.nil? ? " not called" : "(#{actual}) was called")
|
14
|
+
end
|
15
|
+
failure_message_for_should_not do |block|
|
16
|
+
"expected block not to call exit(#{exp_code})"
|
17
|
+
end
|
18
|
+
description do
|
19
|
+
"expect block to call exit(#{exp_code})"
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
RSpec::Matchers.define :give_option_to_action_with_value do |option_name, expected_value, result|
|
2
|
+
match do |block|
|
3
|
+
begin
|
4
|
+
block.call
|
5
|
+
rescue SystemExit => e
|
6
|
+
end
|
7
|
+
options = result[1] || {}
|
8
|
+
options.keys.include?(option_name) && options[option_name] == expected_value
|
9
|
+
end
|
10
|
+
|
11
|
+
failure_message_for_should do |block|
|
12
|
+
"'#{option_name}' should have been passed to action with value '#{expected_value}', but instead we got '#{(result[1] || {})[option_name]}'"
|
13
|
+
end
|
14
|
+
|
15
|
+
failure_message_for_should_not do |block|
|
16
|
+
"'#{option_name}' should not have been passed to action with value '#{expected_value}'"
|
17
|
+
end
|
18
|
+
|
19
|
+
description do
|
20
|
+
"'#{option_name}' should have been passed to action with value '#{expected_value}'"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
describe "Escort basic app with options defined" do
|
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
|
+
|
15
|
+
let(:app_configuration) do
|
16
|
+
->(app) do
|
17
|
+
app.options do |opts|
|
18
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
|
19
|
+
end
|
20
|
+
|
21
|
+
app.action do |options, arguments|
|
22
|
+
result << :global
|
23
|
+
result << {:option1 => options[:global][:options][:option1]}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when called with empty option string" do
|
29
|
+
let(:option_string) { "" }
|
30
|
+
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) }
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when called with option string with short code option" do
|
36
|
+
let(:option_string) { "-o blah" }
|
37
|
+
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) }
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when called with option string with long code option" do
|
43
|
+
let(:option_string) { "--option1=blah" }
|
44
|
+
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) }
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when called with option string with unknown option" do
|
50
|
+
let(:option_string) { "-k" }
|
51
|
+
it("should not exit with code 0") { expect{ subject }.not_to exit_with_code(0) }
|
52
|
+
end
|
53
|
+
end
|