convoy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.irbrc +3 -0
  4. data/.rspec +3 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +8 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE +22 -0
  9. data/README.md +705 -0
  10. data/Rakefile +1 -0
  11. data/convoy.gemspec +24 -0
  12. data/examples/.my_apprc +24 -0
  13. data/examples/basic +10 -0
  14. data/examples/basic_config_file +16 -0
  15. data/examples/basic_conflicts +17 -0
  16. data/examples/basic_depends_on +25 -0
  17. data/examples/basic_flags +15 -0
  18. data/examples/basic_options +14 -0
  19. data/examples/basic_options_multi +15 -0
  20. data/examples/basic_require_arguments +17 -0
  21. data/examples/basic_texts +21 -0
  22. data/examples/basic_validations +21 -0
  23. data/examples/basic_with_everything +30 -0
  24. data/examples/commands/example_command.rb +13 -0
  25. data/examples/suite_complex +65 -0
  26. data/examples/suite_simple +19 -0
  27. data/examples/suite_with_sub_commands +94 -0
  28. data/lib/convoy.rb +83 -0
  29. data/lib/convoy/action_command/base.rb +85 -0
  30. data/lib/convoy/action_command/escort_utility_command.rb +53 -0
  31. data/lib/convoy/app.rb +127 -0
  32. data/lib/convoy/arguments.rb +20 -0
  33. data/lib/convoy/auto_options.rb +71 -0
  34. data/lib/convoy/error/error.rb +33 -0
  35. data/lib/convoy/formatter/command.rb +87 -0
  36. data/lib/convoy/formatter/commands.rb +37 -0
  37. data/lib/convoy/formatter/cursor_position.rb +29 -0
  38. data/lib/convoy/formatter/default_help_formatter.rb +117 -0
  39. data/lib/convoy/formatter/global_command.rb +17 -0
  40. data/lib/convoy/formatter/option.rb +152 -0
  41. data/lib/convoy/formatter/options.rb +28 -0
  42. data/lib/convoy/formatter/shell_command_executor.rb +49 -0
  43. data/lib/convoy/formatter/stream_output_formatter.rb +88 -0
  44. data/lib/convoy/formatter/string_grid.rb +108 -0
  45. data/lib/convoy/formatter/string_splitter.rb +50 -0
  46. data/lib/convoy/formatter/terminal.rb +30 -0
  47. data/lib/convoy/global_pre_parser.rb +43 -0
  48. data/lib/convoy/logger.rb +75 -0
  49. data/lib/convoy/option_dependency_validator.rb +82 -0
  50. data/lib/convoy/option_parser.rb +155 -0
  51. data/lib/convoy/setup/configuration/generator.rb +75 -0
  52. data/lib/convoy/setup/configuration/instance.rb +34 -0
  53. data/lib/convoy/setup/configuration/loader.rb +43 -0
  54. data/lib/convoy/setup/configuration/locator/base.rb +19 -0
  55. data/lib/convoy/setup/configuration/locator/chaining.rb +29 -0
  56. data/lib/convoy/setup/configuration/locator/descending_to_home.rb +23 -0
  57. data/lib/convoy/setup/configuration/locator/executing_script_directory.rb +15 -0
  58. data/lib/convoy/setup/configuration/locator/specified_directory.rb +21 -0
  59. data/lib/convoy/setup/configuration/merge_tool.rb +38 -0
  60. data/lib/convoy/setup/configuration/reader.rb +36 -0
  61. data/lib/convoy/setup/configuration/writer.rb +46 -0
  62. data/lib/convoy/setup/dsl/action.rb +17 -0
  63. data/lib/convoy/setup/dsl/command.rb +67 -0
  64. data/lib/convoy/setup/dsl/config_file.rb +13 -0
  65. data/lib/convoy/setup/dsl/global.rb +29 -0
  66. data/lib/convoy/setup/dsl/options.rb +81 -0
  67. data/lib/convoy/setup_accessor.rb +206 -0
  68. data/lib/convoy/trollop.rb +861 -0
  69. data/lib/convoy/utils.rb +21 -0
  70. data/lib/convoy/validator.rb +45 -0
  71. data/spec/integration/basic_config_file_spec.rb +126 -0
  72. data/spec/integration/basic_conflicts_spec.rb +47 -0
  73. data/spec/integration/basic_depends_on_spec.rb +275 -0
  74. data/spec/integration/basic_options_spec.rb +41 -0
  75. data/spec/integration/basic_options_with_multi_spec.rb +30 -0
  76. data/spec/integration/basic_spec.rb +38 -0
  77. data/spec/integration/basic_validations_spec.rb +77 -0
  78. data/spec/integration/basic_with_arguments_spec.rb +35 -0
  79. data/spec/integration/basic_with_text_fields_spec.rb +21 -0
  80. data/spec/integration/suite_simple_spec.rb +45 -0
  81. data/spec/integration/suite_sub_command_spec.rb +51 -0
  82. data/spec/lib/convoy/action_command/base_spec.rb +200 -0
  83. data/spec/lib/convoy/formatter/command_spec.rb +238 -0
  84. data/spec/lib/convoy/formatter/global_command_spec.rb +50 -0
  85. data/spec/lib/convoy/formatter/option_spec.rb +300 -0
  86. data/spec/lib/convoy/formatter/shell_command_executor_spec.rb +59 -0
  87. data/spec/lib/convoy/formatter/stream_output_formatter_spec.rb +214 -0
  88. data/spec/lib/convoy/formatter/string_grid_spec.rb +59 -0
  89. data/spec/lib/convoy/formatter/string_splitter_spec.rb +50 -0
  90. data/spec/lib/convoy/formatter/terminal_spec.rb +19 -0
  91. data/spec/lib/convoy/setup/configuration/generator_spec.rb +101 -0
  92. data/spec/lib/convoy/setup/configuration/loader_spec.rb +79 -0
  93. data/spec/lib/convoy/setup/configuration/locator/chaining_spec.rb +81 -0
  94. data/spec/lib/convoy/setup/configuration/locator/descending_to_home_spec.rb +57 -0
  95. data/spec/lib/convoy/setup/configuration/locator/executing_script_directory_spec.rb +29 -0
  96. data/spec/lib/convoy/setup/configuration/locator/specified_directory_spec.rb +33 -0
  97. data/spec/lib/convoy/setup/configuration/merge_tool_spec.rb +41 -0
  98. data/spec/lib/convoy/setup/configuration/reader_spec.rb +41 -0
  99. data/spec/lib/convoy/setup/configuration/writer_spec.rb +75 -0
  100. data/spec/lib/convoy/setup_accessor_spec.rb +226 -0
  101. data/spec/lib/convoy/utils_spec.rb +30 -0
  102. data/spec/spec_helper.rb +29 -0
  103. data/spec/support/integration_helpers.rb +2 -0
  104. data/spec/support/matchers/execute_action_for_command_matcher.rb +21 -0
  105. data/spec/support/matchers/execute_action_with_arguments_matcher.rb +25 -0
  106. data/spec/support/matchers/execute_action_with_options_matcher.rb +29 -0
  107. data/spec/support/matchers/exit_with_code_matcher.rb +29 -0
  108. data/spec/support/shared_contexts/integration_setup.rb +34 -0
  109. metadata +292 -0
@@ -0,0 +1,226 @@
1
+ describe Convoy::SetupAccessor do
2
+ let(:setup) { Convoy::SetupAccessor.new(app_configuration) }
3
+
4
+ let(:global_app_configuration) do
5
+ Convoy::Setup::Dsl::Global.new do |app|
6
+ app.options do |opts|
7
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
8
+ opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
9
+ opts.opt :int_option, "Int option", :short => '-i', :long => '--int-option', :type => :int
10
+ opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean, :default => true
11
+ opts.opt :flag2, "Flag 2", :short => :none, :long => '--flag2', :type => :boolean
12
+
13
+ opts.conflict :flag1, :flag2
14
+ opts.dependency :option1, :on => :flag1
15
+ opts.validate(:int_option, "must be greater than 10") { |option| option > 10 }
16
+ end
17
+
18
+ app.action do |options, arguments|
19
+ end
20
+ end
21
+ end
22
+
23
+ let(:command_app_configuration) do
24
+ Convoy::Setup::Dsl::Global.new do |app|
25
+ app.options do |opts|
26
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
27
+ end
28
+
29
+ app.command :command1 do |command|
30
+ command.options do |opts|
31
+ opts.opt :option1, "Option1 for command1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1 command 1"
32
+ opts.opt :flag_for_command1, "Flag for command 1", :short => :none, :long => '--flag-for-command1', :type => :boolean
33
+
34
+ opts.dependency :option1, :on => :flag_for_command1
35
+ end
36
+
37
+ command.action do |options, arguments|
38
+ end
39
+ end
40
+
41
+ app.command :command2, :aliases => :c2 do |command|
42
+ command.options do |opts|
43
+ opts.opt :optionb, "Optionb", :short => :none, :long => '--optionb', :type => :string, :multi => true
44
+ opts.opt :float_option, "Float option", :short => '-d', :long => '--float-option', :type => :float
45
+
46
+ opts.conflict :optionb, :float_option
47
+ opts.validate(:float_option, "must be less than 5") { |option| option < 5 }
48
+ end
49
+
50
+ command.action do |options, arguments|
51
+ end
52
+ end
53
+
54
+ app.action do |options, arguments|
55
+ end
56
+ end
57
+ end
58
+
59
+ let(:sub_command_app_configuration) do
60
+ Convoy::Setup::Dsl::Global.new do |app|
61
+ app.options do |opts|
62
+ opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
63
+ end
64
+
65
+ app.command :command2, :aliases => :c2 do |command|
66
+ command.options do |opts|
67
+ opts.opt :optionb, "Optionb", :short => :none, :long => '--optionb', :type => :string, :multi => true
68
+ opts.opt :float_option, "Float option", :short => '-d', :long => '--float-option', :type => :float
69
+
70
+ opts.conflict :optionb, :float_option
71
+ opts.validate(:float_option, "must be less than 5") { |option| option < 5 }
72
+ end
73
+
74
+ command.command :sub_command1 do |command|
75
+ command.options do |opts|
76
+ opts.opt :flag2, "Flag 2", :short => :none, :long => '--flag2', :type => :boolean
77
+ end
78
+
79
+ command.action do |options, arguments|
80
+ end
81
+ end
82
+
83
+ command.command :sub_command2 do |command|
84
+ command.options do |opts|
85
+ opts.opt :sub_option1, "Sub option1", :short => '-s', :long => '--sub-option1', :type => :string
86
+ opts.validate(:sub_option1, "must be 'x' or 'y'") { |option| ['x', 'y'].include? option }
87
+ end
88
+
89
+ command.action do |options, arguments|
90
+ end
91
+ end
92
+
93
+ command.action do |options, arguments|
94
+ end
95
+ end
96
+
97
+ app.action do |options, arguments|
98
+ end
99
+ end
100
+ end
101
+
102
+ describe '#options_for' do
103
+ let(:options) { setup.options_for(context) }
104
+
105
+ context "when app has no sub commands" do
106
+ let(:app_configuration) { global_app_configuration }
107
+
108
+ context "and context is global" do
109
+ let(:context) { [] }
110
+ it(":option1 should be present") { options[:option1].should_not be_nil }
111
+ end
112
+
113
+ context "and context is an unknown command" do
114
+ let(:context) { ['hello'] }
115
+ it("should not raise an exception") { expect { options }.to_not raise_error }
116
+ it("result should be a hash") { options.class.should == Hash }
117
+ it("result should be empty") { options.should be_empty }
118
+ end
119
+
120
+ context "and no context passed in at all" do
121
+ let(:options) { setup.options_for }
122
+ it(":option1 should be present") { options[:option1].should_not be_nil }
123
+ end
124
+
125
+ context "and context is nil" do
126
+ let(:context) { nil }
127
+ it(":option1 should be present") { options[:option1].should_not be_nil }
128
+ end
129
+
130
+ context "and context is not an array" do
131
+ let(:context) { 'hello' }
132
+ it("should not raise an exception") { expect { options }.to_not raise_error }
133
+ end
134
+ end
135
+
136
+ context "when app has one level of sub commands" do
137
+ let(:app_configuration) { command_app_configuration }
138
+
139
+ context "and context is a known command" do
140
+ let(:context) { ['command1'] }
141
+ it("result should be a hash") { options.class.should == Hash }
142
+ it("result should not be empty") { options.should_not be_empty }
143
+ it(":option1 should be present") { options[:option1].should_not be_nil }
144
+ end
145
+ end
146
+
147
+ context "when app has multiple levels of sub commands" do
148
+ let(:app_configuration) { sub_command_app_configuration }
149
+
150
+ context "and context is a known sub command" do
151
+ let(:context) { ['command2', 'sub_command2'] }
152
+ it("result should be a hash") { options.class.should == Hash }
153
+ it("result should not be empty") { options.should_not be_empty }
154
+ it(":sub_option1 should be present") { options[:sub_option1].should_not be_nil }
155
+ end
156
+ end
157
+ end
158
+
159
+ describe '#conflicting_options_for' do
160
+ #TODO implement
161
+ end
162
+
163
+ describe '#validations_for' do
164
+ #TODO implement
165
+ end
166
+
167
+ describe '#dependencies_for' do
168
+ #TODO implement
169
+ end
170
+
171
+ describe '#command_names_for' do
172
+ #TODO implement
173
+ end
174
+
175
+ describe '#canonical_command_names_for' do
176
+ #TODO implement
177
+ end
178
+
179
+ describe '#action_for' do
180
+ #TODO implement
181
+ end
182
+
183
+ describe '#arguments_required_for' do
184
+ #TODO implement
185
+ end
186
+
187
+ describe '#has_config_file?' do
188
+ #TODO implement
189
+ end
190
+
191
+ describe '#config_file_autocreatable?' do
192
+ #TODO implement
193
+ end
194
+
195
+ describe '#config_file' do
196
+ #TODO implement
197
+ end
198
+
199
+ describe '#summary_for' do
200
+ #TODO implement
201
+ end
202
+
203
+ describe '#description_for' do
204
+ #TODO implement
205
+ end
206
+
207
+ describe '#command_description_for' do
208
+ #TODO implement
209
+ end
210
+
211
+ describe '#command_summary_for' do
212
+ #TODO implement
213
+ end
214
+
215
+ describe '#command_aliases_for' do
216
+ #TODO implement
217
+ end
218
+
219
+ describe '#add_global_option' do
220
+ #TODO implement
221
+ end
222
+
223
+ describe '#add_global_command' do
224
+ #TODO implement
225
+ end
226
+ end
@@ -0,0 +1,30 @@
1
+ describe Convoy::Utils do
2
+ describe '::symbolize_keys' do
3
+ subject { Convoy::Utils.symbolize_keys(hash) }
4
+
5
+ context "when single level hash" do
6
+ let(:hash) { {'a' => 1, :b => 2} }
7
+ it("the :a key should be a symbol") { subject[:a].should == 1 }
8
+ it("the :b key should be a symbol") { subject[:b].should == 2 }
9
+ end
10
+
11
+ context "when hash has nested hashes" do
12
+ let(:hash) { {'a' => 1, :b => {'c' => {'d' => 2}}} }
13
+ it("the :a key should be a symbol") { subject[:a].should == 1 }
14
+ it("the nested keys, :b, :c and :d should all be symbols") { subject[:b][:c][:d].should == 2 }
15
+ end
16
+ end
17
+
18
+ describe '::tokenize_option_string' do
19
+ subject { Convoy::Utils.tokenize_option_string(option_string) }
20
+
21
+ context "when option string has short option, long option and argument" do
22
+ let(:option_string) { "-a 1 --foo='bar blah' yadda" }
23
+ it("tokenized string should have 4 values") { subject.size.should == 4 }
24
+ it("the short option should be a separate token") { subject[0].should == '-a' }
25
+ it("the short option value should be a separate token") { subject[1].should == '1' }
26
+ it("the long option and value should be one token") { subject[2].should == '--foo=bar blah' }
27
+ it("the argument should be a separate token") { subject[3].should == 'yadda' }
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ require 'convoy'
2
+ require 'fakefs/safe'
3
+ require 'fakefs/spec_helpers'
4
+
5
+ Dir[File.join(File.dirname(__FILE__), 'support', '**', "*.rb").to_s].each { |file| require file }
6
+
7
+ #helpers
8
+ #require 'helpers/exit_with_code_matcher'
9
+ #require 'helpers/execute_action_matcher'
10
+ #require 'helpers/give_option_to_action_with_value_matcher'
11
+ # This file was generated by the `rspec --init` command. Conventionally, all
12
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
13
+ # Require this file using `require "spec_helper"` to ensure that it is only
14
+ # loaded once.
15
+ #
16
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
17
+ RSpec.configure do |config|
18
+ config.treat_symbols_as_metadata_keys_with_true_values = true
19
+ config.run_all_when_everything_filtered = true
20
+ config.filter_run :focus
21
+
22
+ config.include IntegrationHelpers, :integration => true
23
+
24
+ # Run specs in random order to surface order dependencies. If you find an
25
+ # order dependency and want to debug it, you can fix the order by providing
26
+ # the seed, which is printed after each run.
27
+ # --seed 1234
28
+ config.order = 'random'
29
+ end
@@ -0,0 +1,2 @@
1
+ module IntegrationHelpers
2
+ end
@@ -0,0 +1,21 @@
1
+ RSpec::Matchers.define :execute_action_for_command do |result, command_name|
2
+ match do |block|
3
+ begin
4
+ block.call
5
+ rescue SystemExit => e
6
+ end
7
+ result[:command_name] == 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[:command_name]}' 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,25 @@
1
+ RSpec::Matchers.define :execute_action_with_arguments do |result, expected_arguments|
2
+ match do |block|
3
+ begin
4
+ block.call
5
+ rescue SystemExit => e
6
+ end
7
+ successful_match?(result, expected_arguments)
8
+ end
9
+
10
+ def successful_match?(result, expected_arguments)
11
+ result[:arguments] == expected_arguments
12
+ end
13
+
14
+ failure_message_for_should do |block|
15
+ "'#{expected_arguments}' should have been passed to action, but we got '#{result[:arguments]}'"
16
+ end
17
+
18
+ failure_message_for_should_not do |block|
19
+ "'#{expected_arguments}' should not have been passed to action"
20
+ end
21
+
22
+ description do
23
+ "'#{expected_arguments}' should have been passed to action"
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ RSpec::Matchers.define :execute_action_with_options do |result, expected_options|
2
+ match do |block|
3
+ begin
4
+ block.call
5
+ rescue SystemExit => e
6
+ end
7
+ successful_match?(result, expected_options)
8
+ end
9
+
10
+ def successful_match?(result, expected_options)
11
+ options = result[:command_options]
12
+ expected_options.keys.each do |key|
13
+ return false unless options[key] == expected_options[key]
14
+ end
15
+ true
16
+ end
17
+
18
+ failure_message_for_should do |block|
19
+ "'#{expected_options}' should have been passed to action, but we got '#{result[:command_options]}'"
20
+ end
21
+
22
+ failure_message_for_should_not do |block|
23
+ "'#{expected_options}' should not have been passed to action"
24
+ end
25
+
26
+ description do
27
+ "'#{expected_options}' should have been passed to action"
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ RSpec::Matchers.define :exit_with_code do |*expected_code|
2
+ actual = nil
3
+ match do |block|
4
+ begin
5
+ block.call
6
+ rescue SystemExit => e
7
+ actual = e.status
8
+ end
9
+ has_expected_exit_code?(actual, *expected_code)
10
+ #actual && actual == expected_code
11
+ end
12
+
13
+ def has_expected_exit_code?(actual, *expected_code)
14
+ expected_code.each do |code|
15
+ return true if actual && actual == code
16
+ end
17
+ false
18
+ end
19
+
20
+ failure_message_for_should do |block|
21
+ "expected block to call exit(#{expected_code}) but exit #{actual.nil? ? "not called" : "(#{actual}) was called"}"
22
+ end
23
+ failure_message_for_should_not do |block|
24
+ "expected block not to call exit(#{expected_code})"
25
+ end
26
+ description do
27
+ "expect block to call exit(#{expected_code})"
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ shared_context "integration test setup", :integration => true do
2
+ let(:result) { {} }
3
+
4
+ before do
5
+ empty_argv
6
+ #$stderr = StringIO.new
7
+ #$stdout = StringIO.new
8
+ #$stdin = StringIO.new
9
+ end
10
+
11
+ after do
12
+ $stderr = STDERR
13
+ $stdout = STDOUT
14
+ $stdin = STDIN
15
+ end
16
+
17
+ module Convoy
18
+ class IntegrationTestCommand < ::Convoy::ActionCommand::Base
19
+ def execute(result)
20
+ result[:command_name] = command_name
21
+ result[:command_options] = command_options
22
+ result[:options] = options
23
+ result[:arguments] = arguments
24
+ result[:config] = config if config
25
+ end
26
+ end
27
+ end
28
+
29
+ def empty_argv
30
+ while !ARGV.empty? do
31
+ ARGV.delete_at(0)
32
+ end
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,292 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: convoy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Albert Rannetsperger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nesty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.2
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 3.1.0
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 3.1.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: fakefs
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '0.5'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 0.5.3
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.5'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 0.5.3
73
+ - !ruby/object:Gem::Dependency
74
+ name: rake
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '10.3'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 10.3.2
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.3'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 10.3.2
93
+ - !ruby/object:Gem::Dependency
94
+ name: travis-lint
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '2.0'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 2.0.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.0'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 2.0.0
113
+ description: Writing even complex command-line apps should be quick, easy and fun.
114
+ Convoy takes the excellent Trollop option parser and adds a whole bunch of awesome
115
+ features to produce a library you will always want to turn to when a 'quick script'
116
+ is in order.
117
+ email: alb3rtuk@hotmail.com
118
+ executables: []
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - ".gitignore"
123
+ - ".irbrc"
124
+ - ".rspec"
125
+ - ".ruby-version"
126
+ - ".travis.yml"
127
+ - Gemfile
128
+ - LICENSE
129
+ - README.md
130
+ - Rakefile
131
+ - convoy.gemspec
132
+ - examples/.my_apprc
133
+ - examples/basic
134
+ - examples/basic_config_file
135
+ - examples/basic_conflicts
136
+ - examples/basic_depends_on
137
+ - examples/basic_flags
138
+ - examples/basic_options
139
+ - examples/basic_options_multi
140
+ - examples/basic_require_arguments
141
+ - examples/basic_texts
142
+ - examples/basic_validations
143
+ - examples/basic_with_everything
144
+ - examples/commands/example_command.rb
145
+ - examples/suite_complex
146
+ - examples/suite_simple
147
+ - examples/suite_with_sub_commands
148
+ - lib/convoy.rb
149
+ - lib/convoy/action_command/base.rb
150
+ - lib/convoy/action_command/escort_utility_command.rb
151
+ - lib/convoy/app.rb
152
+ - lib/convoy/arguments.rb
153
+ - lib/convoy/auto_options.rb
154
+ - lib/convoy/error/error.rb
155
+ - lib/convoy/formatter/command.rb
156
+ - lib/convoy/formatter/commands.rb
157
+ - lib/convoy/formatter/cursor_position.rb
158
+ - lib/convoy/formatter/default_help_formatter.rb
159
+ - lib/convoy/formatter/global_command.rb
160
+ - lib/convoy/formatter/option.rb
161
+ - lib/convoy/formatter/options.rb
162
+ - lib/convoy/formatter/shell_command_executor.rb
163
+ - lib/convoy/formatter/stream_output_formatter.rb
164
+ - lib/convoy/formatter/string_grid.rb
165
+ - lib/convoy/formatter/string_splitter.rb
166
+ - lib/convoy/formatter/terminal.rb
167
+ - lib/convoy/global_pre_parser.rb
168
+ - lib/convoy/logger.rb
169
+ - lib/convoy/option_dependency_validator.rb
170
+ - lib/convoy/option_parser.rb
171
+ - lib/convoy/setup/configuration/generator.rb
172
+ - lib/convoy/setup/configuration/instance.rb
173
+ - lib/convoy/setup/configuration/loader.rb
174
+ - lib/convoy/setup/configuration/locator/base.rb
175
+ - lib/convoy/setup/configuration/locator/chaining.rb
176
+ - lib/convoy/setup/configuration/locator/descending_to_home.rb
177
+ - lib/convoy/setup/configuration/locator/executing_script_directory.rb
178
+ - lib/convoy/setup/configuration/locator/specified_directory.rb
179
+ - lib/convoy/setup/configuration/merge_tool.rb
180
+ - lib/convoy/setup/configuration/reader.rb
181
+ - lib/convoy/setup/configuration/writer.rb
182
+ - lib/convoy/setup/dsl/action.rb
183
+ - lib/convoy/setup/dsl/command.rb
184
+ - lib/convoy/setup/dsl/config_file.rb
185
+ - lib/convoy/setup/dsl/global.rb
186
+ - lib/convoy/setup/dsl/options.rb
187
+ - lib/convoy/setup_accessor.rb
188
+ - lib/convoy/trollop.rb
189
+ - lib/convoy/utils.rb
190
+ - lib/convoy/validator.rb
191
+ - spec/integration/basic_config_file_spec.rb
192
+ - spec/integration/basic_conflicts_spec.rb
193
+ - spec/integration/basic_depends_on_spec.rb
194
+ - spec/integration/basic_options_spec.rb
195
+ - spec/integration/basic_options_with_multi_spec.rb
196
+ - spec/integration/basic_spec.rb
197
+ - spec/integration/basic_validations_spec.rb
198
+ - spec/integration/basic_with_arguments_spec.rb
199
+ - spec/integration/basic_with_text_fields_spec.rb
200
+ - spec/integration/suite_simple_spec.rb
201
+ - spec/integration/suite_sub_command_spec.rb
202
+ - spec/lib/convoy/action_command/base_spec.rb
203
+ - spec/lib/convoy/formatter/command_spec.rb
204
+ - spec/lib/convoy/formatter/global_command_spec.rb
205
+ - spec/lib/convoy/formatter/option_spec.rb
206
+ - spec/lib/convoy/formatter/shell_command_executor_spec.rb
207
+ - spec/lib/convoy/formatter/stream_output_formatter_spec.rb
208
+ - spec/lib/convoy/formatter/string_grid_spec.rb
209
+ - spec/lib/convoy/formatter/string_splitter_spec.rb
210
+ - spec/lib/convoy/formatter/terminal_spec.rb
211
+ - spec/lib/convoy/setup/configuration/generator_spec.rb
212
+ - spec/lib/convoy/setup/configuration/loader_spec.rb
213
+ - spec/lib/convoy/setup/configuration/locator/chaining_spec.rb
214
+ - spec/lib/convoy/setup/configuration/locator/descending_to_home_spec.rb
215
+ - spec/lib/convoy/setup/configuration/locator/executing_script_directory_spec.rb
216
+ - spec/lib/convoy/setup/configuration/locator/specified_directory_spec.rb
217
+ - spec/lib/convoy/setup/configuration/merge_tool_spec.rb
218
+ - spec/lib/convoy/setup/configuration/reader_spec.rb
219
+ - spec/lib/convoy/setup/configuration/writer_spec.rb
220
+ - spec/lib/convoy/setup_accessor_spec.rb
221
+ - spec/lib/convoy/utils_spec.rb
222
+ - spec/spec_helper.rb
223
+ - spec/support/integration_helpers.rb
224
+ - spec/support/matchers/execute_action_for_command_matcher.rb
225
+ - spec/support/matchers/execute_action_with_arguments_matcher.rb
226
+ - spec/support/matchers/execute_action_with_options_matcher.rb
227
+ - spec/support/matchers/exit_with_code_matcher.rb
228
+ - spec/support/shared_contexts/integration_setup.rb
229
+ homepage: http://github.com/alb3rtuk/convoy
230
+ licenses:
231
+ - MIT
232
+ metadata: {}
233
+ post_install_message:
234
+ rdoc_options: []
235
+ require_paths:
236
+ - lib
237
+ required_ruby_version: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ required_rubygems_version: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: '0'
247
+ requirements: []
248
+ rubyforge_project:
249
+ rubygems_version: 2.4.1
250
+ signing_key:
251
+ specification_version: 4
252
+ summary: A library that makes building command line apps in ruby so easy, you'll feel
253
+ like an expert is guiding you through it
254
+ test_files:
255
+ - spec/integration/basic_config_file_spec.rb
256
+ - spec/integration/basic_conflicts_spec.rb
257
+ - spec/integration/basic_depends_on_spec.rb
258
+ - spec/integration/basic_options_spec.rb
259
+ - spec/integration/basic_options_with_multi_spec.rb
260
+ - spec/integration/basic_spec.rb
261
+ - spec/integration/basic_validations_spec.rb
262
+ - spec/integration/basic_with_arguments_spec.rb
263
+ - spec/integration/basic_with_text_fields_spec.rb
264
+ - spec/integration/suite_simple_spec.rb
265
+ - spec/integration/suite_sub_command_spec.rb
266
+ - spec/lib/convoy/action_command/base_spec.rb
267
+ - spec/lib/convoy/formatter/command_spec.rb
268
+ - spec/lib/convoy/formatter/global_command_spec.rb
269
+ - spec/lib/convoy/formatter/option_spec.rb
270
+ - spec/lib/convoy/formatter/shell_command_executor_spec.rb
271
+ - spec/lib/convoy/formatter/stream_output_formatter_spec.rb
272
+ - spec/lib/convoy/formatter/string_grid_spec.rb
273
+ - spec/lib/convoy/formatter/string_splitter_spec.rb
274
+ - spec/lib/convoy/formatter/terminal_spec.rb
275
+ - spec/lib/convoy/setup/configuration/generator_spec.rb
276
+ - spec/lib/convoy/setup/configuration/loader_spec.rb
277
+ - spec/lib/convoy/setup/configuration/locator/chaining_spec.rb
278
+ - spec/lib/convoy/setup/configuration/locator/descending_to_home_spec.rb
279
+ - spec/lib/convoy/setup/configuration/locator/executing_script_directory_spec.rb
280
+ - spec/lib/convoy/setup/configuration/locator/specified_directory_spec.rb
281
+ - spec/lib/convoy/setup/configuration/merge_tool_spec.rb
282
+ - spec/lib/convoy/setup/configuration/reader_spec.rb
283
+ - spec/lib/convoy/setup/configuration/writer_spec.rb
284
+ - spec/lib/convoy/setup_accessor_spec.rb
285
+ - spec/lib/convoy/utils_spec.rb
286
+ - spec/spec_helper.rb
287
+ - spec/support/integration_helpers.rb
288
+ - spec/support/matchers/execute_action_for_command_matcher.rb
289
+ - spec/support/matchers/execute_action_with_arguments_matcher.rb
290
+ - spec/support/matchers/execute_action_with_options_matcher.rb
291
+ - spec/support/matchers/exit_with_code_matcher.rb
292
+ - spec/support/shared_contexts/integration_setup.rb