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.
- checksums.yaml +8 -8
- data/.travis.yml +8 -0
- data/README.md +365 -14
- data/TODO.md +157 -44
- data/escort.gemspec +1 -0
- data/examples/{1_1_basic.rb → attic/1_1_basic.rb} +0 -0
- data/examples/{1_2_basic_requires_arguments.rb → attic/1_2_basic_requires_arguments.rb} +0 -0
- data/examples/{2_2_command.rb → attic/2_2_command.rb} +0 -0
- data/examples/{2_2_command_requires_arguments.rb → attic/2_2_command_requires_arguments.rb} +0 -0
- data/examples/{2_3_nested_commands.rb → attic/2_3_nested_commands.rb} +0 -0
- data/examples/{3_validations.rb → attic/3_validations.rb} +0 -0
- data/examples/{4_1_config_file.rb → attic/4_1_config_file.rb} +0 -0
- data/examples/{argument_handling → attic/argument_handling}/basic.rb +0 -0
- data/examples/{argument_handling → attic/argument_handling}/basic_command.rb +0 -0
- data/examples/{argument_handling → attic/argument_handling}/no_arguments.rb +0 -0
- data/examples/{argument_handling → attic/argument_handling}/no_arguments_command.rb +0 -0
- data/examples/{command_aliases → attic/command_aliases}/app.rb +0 -0
- data/examples/{config_file → attic/config_file}/.apprc2 +0 -0
- data/examples/{config_file → attic/config_file}/app.rb +0 -0
- data/examples/{config_file → attic/config_file}/sub_commands.rb +0 -0
- data/examples/{default_command → attic/default_command}/app.rb +0 -0
- data/examples/{sub_commands → attic/sub_commands}/app.rb +0 -0
- data/examples/{validation_basic → attic/validation_basic}/app.rb +0 -0
- data/examples/basic +10 -0
- data/examples/basic_conflicts +17 -0
- data/examples/basic_depends_on +25 -0
- data/examples/basic_flags +15 -0
- data/examples/basic_options +14 -0
- data/examples/basic_options_multi +15 -0
- data/examples/basic_require_arguments +17 -0
- data/examples/basic_texts +21 -0
- data/examples/basic_validations +21 -0
- data/examples/command +19 -0
- data/examples/commands/example_command.rb +13 -0
- data/lib/escort/action_command/base.rb +4 -0
- data/lib/escort/app.rb +33 -11
- data/lib/escort/formatter/borderless_table.rb +4 -0
- data/lib/escort/formatter/command.rb +87 -0
- data/lib/escort/formatter/commands.rb +36 -0
- data/lib/escort/formatter/default_help_formatter.rb +68 -73
- data/lib/escort/formatter/global_command.rb +17 -0
- data/lib/escort/formatter/option.rb +138 -0
- data/lib/escort/formatter/options.rb +17 -3
- data/lib/escort/formatter/shell_command_executor.rb +49 -0
- data/lib/escort/formatter/terminal.rb +17 -9
- data/lib/escort/formatter/terminal_formatter.rb +6 -0
- data/lib/escort/logger.rb +4 -4
- data/lib/escort/option_dependency_validator.rb +83 -0
- data/lib/escort/option_parser.rb +11 -1
- data/lib/escort/setup/configuration/reader.rb +0 -2
- data/lib/escort/setup/configuration/writer.rb +0 -2
- data/lib/escort/setup/dsl/command.rb +2 -7
- data/lib/escort/setup/dsl/global.rb +2 -9
- data/lib/escort/setup/dsl/options.rb +56 -0
- data/lib/escort/setup_accessor.rb +23 -6
- data/lib/escort/trollop.rb +4 -3
- data/lib/escort/validator.rb +4 -1
- data/lib/escort/version.rb +1 -1
- data/lib/escort.rb +8 -1
- data/spec/integration/basic_conflicts_spec.rb +47 -0
- data/spec/integration/basic_depends_on_spec.rb +275 -0
- data/spec/integration/basic_options_spec.rb +9 -21
- data/spec/integration/basic_options_with_multi_spec.rb +30 -0
- data/spec/integration/basic_spec.rb +5 -6
- data/spec/integration/basic_validations_spec.rb +77 -0
- data/spec/integration/basic_with_arguments_spec.rb +33 -0
- data/spec/integration/basic_with_text_fields_spec.rb +21 -0
- data/spec/lib/escort/formatter/command_spec.rb +238 -0
- data/spec/lib/escort/formatter/global_command_spec.rb +50 -0
- data/spec/lib/escort/formatter/option_spec.rb +300 -0
- data/spec/lib/escort/formatter/shell_command_executor_spec.rb +59 -0
- data/spec/lib/escort/formatter/string_splitter_spec.rb +12 -0
- data/spec/lib/escort/formatter/terminal_spec.rb +19 -0
- data/spec/lib/escort/setup_accessor_spec.rb +1 -0
- data/spec/spec_helper.rb +9 -3
- data/spec/support/integration_helpers.rb +2 -0
- data/spec/{helpers/execute_action_matcher.rb → support/matchers/execute_action_for_command_matcher.rb} +3 -3
- data/spec/support/matchers/execute_action_with_arguments_matcher.rb +25 -0
- data/spec/support/matchers/execute_action_with_options_matcher.rb +29 -0
- data/spec/support/matchers/exit_with_code_matcher.rb +29 -0
- data/spec/support/shared_contexts/integration_setup.rb +34 -0
- metadata +86 -28
- data/examples/basic/app.rb +0 -16
- data/lib/escort/formatter/common.rb +0 -58
- data/spec/helpers/exit_with_code_matcher.rb +0 -21
- data/spec/helpers/give_option_to_action_with_value_matcher.rb +0 -22
data/TODO.md
CHANGED
@@ -1,62 +1,107 @@
|
|
1
1
|
ROADMAP
|
2
2
|
|
3
|
-
v0.
|
4
|
-
-
|
5
|
-
- a couple of basic specs DONE
|
6
|
-
- some integration test infrastructure DONE
|
7
|
-
- a couple of basic integration tests DONE
|
8
|
-
- pull classes for formatting out into files DONE
|
9
|
-
- summary and description for commands DONE
|
10
|
-
- include command summary and description in help formatter DONE
|
11
|
-
- rework how help is displayed for commands with summary and description DONE
|
12
|
-
- the sub commands for command should use summary instead of description DONE
|
13
|
-
- do for validation and action what I did for option within the dsl DONE
|
14
|
-
- look again at conflicts support in dsl, we can probably do better naming for it DONE
|
15
|
-
- up the version to 0.1.0
|
3
|
+
v0.2.0
|
4
|
+
- up the version to 0.2.0
|
16
5
|
- tag and release
|
17
6
|
|
18
|
-
|
19
|
-
-
|
20
|
-
-
|
21
|
-
-
|
22
|
-
-
|
23
|
-
-
|
24
|
-
-
|
7
|
+
|
8
|
+
- test conflicts for non-exstant options (integration) DONE
|
9
|
+
- test all the new help stuff on option, for conflicts, dependencies, validations DONE
|
10
|
+
- fix up readme for conflicts block DONE
|
11
|
+
- rework validations to be part of the options block rather than in their own block DONE
|
12
|
+
- fix example, fix tests, fix readme DONE
|
13
|
+
- need to rework conflicts as currently not really very good DONE
|
14
|
+
- add dependencies to help text DONE
|
15
|
+
- add conflicts to help text DONE
|
16
|
+
- add validation texts to help text so that people can see what kind of values are valid DONE
|
17
|
+
- make sure we check conflicts for non-existant options DONE
|
18
|
+
- refactor the formatting code some more DONE
|
19
|
+
- pull some formatting code into separate classes DONE
|
20
|
+
- test some of the utility formatting code DONE
|
21
|
+
- fix up help text so that if arguments are mandatory they are shown as mandatory not optional DONE
|
22
|
+
- basic example with validations DONE
|
23
|
+
- integration test for validations DONE
|
24
|
+
- readme for validations DONE
|
25
|
+
- test the shell command executor, and the terminal class for width command DONE
|
26
|
+
- improve the readme to explain
|
27
|
+
- a basic app with no options DONE
|
28
|
+
- a basic app with options DONE
|
29
|
+
- supplying multiple of the same parameter using multi DONE
|
30
|
+
- a basic app with require arguments DONE
|
31
|
+
- a basic app specifying version, description and summary DONE
|
32
|
+
- test the readme for flags to make sure it works as expected DONE
|
33
|
+
- a basic app with dependant options (mention that a deadlock situation can occur if you're not careful) DONE
|
34
|
+
- example for conflicting options DONE
|
35
|
+
- integration test for conflicting options DONE
|
36
|
+
- readme for conflicting options DONE
|
37
|
+
- for print stacktrace, change it to print in INFO mode so that stacktrace not printed by default DONE
|
38
|
+
- BUG when a script requires arguments and user doesn't supply any escort treats this as an internal error and asks you to report it, this shouldn't be the case DONE
|
39
|
+
- depends_on support
|
40
|
+
- option depends on flag DONE
|
41
|
+
- flag depends on another flag DONE
|
42
|
+
- one option depends on another (the other must be not false not nil and not empty) DONE
|
43
|
+
- one option depends on specific value of another (the other must be of a specific values) DONE
|
44
|
+
- one option depends on several others (where are must be not false not nil and not empty) DONE
|
45
|
+
- one option depends on several others where some must have a specific value (some options have specific value, others are not false not nil and not empty) DONE
|
46
|
+
- error if option for which dependecy is being defined does not exist DONE
|
47
|
+
- error if depends on non-existant option DONE
|
48
|
+
- error if depends on itself DONE
|
49
|
+
- error if dependency not satisfied DONE
|
50
|
+
- error if missing on condition when specifying dependency DONE
|
51
|
+
- refactor the options dsl class dependency code DONE
|
52
|
+
- refactor the option_dependency_validator class to be nicer DONE
|
53
|
+
- integration test all the permutations of dependency specification with error and success cases etc DONE
|
54
|
+
- create a shortcut for dependency specification on the opt method options hash itself DONE
|
55
|
+
- fix up example for basic app with dependencies for options DONE
|
56
|
+
|
57
|
+
v0.4.0
|
58
|
+
- readme a basic app with config file (don't worry about explaining all the helper stuff that gets created)
|
59
|
+
- readme implementing and action for a basic app
|
60
|
+
- refactor terminal formatter and test it
|
61
|
+
- refactor borderless table and test it
|
62
|
+
- BUG parent_options when parent of command is global context doesn't seem to work???
|
63
|
+
- test the base command for actions well
|
64
|
+
- fix ppjson so that dependency suport feature is actually used
|
65
|
+
- readme a command app with options, validations, description, summary, require arguments and config file, integration tests for commands, example
|
66
|
+
- readme a sub command app with options, validations, description, summary, require arguments and config file
|
67
|
+
- extract all the dsl command stuff into a helper module so that global and command can be handled by the same code
|
68
|
+
- delete the stuff from the attic once it is no longer needed
|
69
|
+
- get rid of shell command executor new shell stuff (doesn't work in Jruby and not really needed anyway)
|
70
|
+
- up the version to 0.4.0
|
25
71
|
- tag and release
|
26
72
|
|
73
|
+
|
27
74
|
v1.0.0
|
28
|
-
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
- implementing and action for a basic app
|
36
|
-
- a basic app with config file (don't worry about explaining all the helper stuff that gets created)
|
37
|
-
- a basic app with conflicting options
|
38
|
-
- a basic app with dependent options
|
39
|
-
- a command app with options, validations, description, summary, require arguments and config file
|
40
|
-
- a sub command app with options, validations, description, summary, require arguments and config file
|
41
|
-
- rework the examples again to show of some/most of the features (along the lines of the integration tests and readme)
|
42
|
-
- extract all the dsl command stuff into a helper module so that global and command can be handled by the same code
|
75
|
+
- perhaps rework actions with passing a class and having it being auto called
|
76
|
+
- implement servants for dealing with clumps of functionality, and action commands have access to all servants that were executed before them
|
77
|
+
- a few more tests (setup accessor, all the dsl classes)
|
78
|
+
- for borderless table, should be able to create another borderless table within a cell of an existing table
|
79
|
+
- have a think about how to make the integration tests a bit more robust, so that failures don't get swallowed (test for specific exit codes instead of non-zero exit code), fix the existing integration tests
|
80
|
+
- in trollop when errors are raised they should be wrapped as escort errors and propagate rather than being caught by trollop itself
|
81
|
+
- a few more integration tests (test that basic app automatically gets help and other automatic options)
|
43
82
|
- up the version to 1.0.0
|
44
83
|
- tag and release
|
45
84
|
- get the blog updated with a new theme
|
46
85
|
- put a new subscriber count widget on blog
|
47
86
|
- blog Build Command-Line Apps Like a Pro Using Ruby and Escort
|
48
87
|
|
88
|
+
- rework the examples again to show of some/most of the features (along the lines of the integration tests and readme) DONE
|
89
|
+
- errors coming straigh out of configuration should still be caught by error handlers to only display stack trace when needed (refactor app create method) DONE
|
90
|
+
- readme for a basic app with conflicting options DONE
|
91
|
+
- readme for a basic app with dependent options DONE
|
92
|
+
|
49
93
|
v1.0.1
|
50
|
-
- more specs
|
94
|
+
- more specs
|
51
95
|
- more integration specs (more specs for the different types of options)
|
52
|
-
- rework the integration specs and matchers so there are less moving parts (perhaps push some stuff down into a base class etc.)
|
53
96
|
- lots more logging at different levels for debug purposes
|
54
|
-
- add validation messages to help text
|
55
97
|
- a way have helpers available when you don't want to have to create a command
|
56
98
|
- the config auto option should not be included in the config file, same with other auto options
|
57
99
|
- readme about how to actually pass the user config through to action and the fact that regardless if you have a config file or not, you can have a config var or not as part of the block variables
|
58
|
-
-
|
59
|
-
|
100
|
+
- ability to specify a different command based on options declaratively or a convention for how to do different things for the same action based on options (bunch of options that are flags, options that are a clump of values etc)
|
101
|
+
|
102
|
+
- rework the integration specs and matchers so there are less moving parts (perhaps push some stuff down into a base class etc.) DONE
|
103
|
+
- rewrite the help formatter to be a bit easier to understand (more like man output for output) DONE
|
104
|
+
- add depends support to dsl DONE
|
60
105
|
|
61
106
|
v1.0.2
|
62
107
|
- more specs
|
@@ -68,7 +113,7 @@ v1.0.3
|
|
68
113
|
- an option for setup that indicates it is a project specific CLI app
|
69
114
|
- an options for setup that indicates it is an environment aware CLI app
|
70
115
|
- make the configuration environment aware
|
71
|
-
- make escort environment aware
|
116
|
+
- make escort environment aware (app.environment_aware)
|
72
117
|
- json configuration should support defaults config
|
73
118
|
- much better documentation and usage patterns
|
74
119
|
- pull the terminal formatting stuff into separate gem
|
@@ -77,6 +122,33 @@ v1.0.3
|
|
77
122
|
|
78
123
|
|
79
124
|
BUCKET
|
125
|
+
- dependencies for command options on options from parent commands or global
|
126
|
+
- a better way of executing action and servants for the actions
|
127
|
+
|
128
|
+
- specify the options via classes
|
129
|
+
#command.action StreamProvider::Commands::StopServer
|
130
|
+
- define servants for actions within context
|
131
|
+
#app.before_action :stop, :start, :restart do |action|
|
132
|
+
#action.servant :configatron, StreamProvider::Servants::ConfigatronServant
|
133
|
+
#end
|
134
|
+
|
135
|
+
#app.before_action :restart do |action|
|
136
|
+
#action.servant :blah, StreamProvider::Servants::BlahServant
|
137
|
+
#end
|
138
|
+
- a before action without command names in context
|
139
|
+
app.before :actions => :this - only action in current context
|
140
|
+
app.before :actions => :child - only child action in current context
|
141
|
+
app.before :actions => [:this, :child] - this action and child actions
|
142
|
+
app.before :actions => :descendant - all actions that descend from this one, but not this one
|
143
|
+
|
144
|
+
- can split out the shell command executor into a tiny gem for later use
|
145
|
+
- get the build working on ruby 1.8.7
|
146
|
+
- formatting code should support colours and styles for output
|
147
|
+
- formatting code should support a table with borders and stuff
|
148
|
+
- formatting code should support a simple progress bar for showing progress
|
149
|
+
- formatting code should be more well factored
|
150
|
+
- highline support should be added so that values can be asked for
|
151
|
+
- values should be asked for before validations are executed, since entered values should be validated
|
80
152
|
- instead of before and after blocks, add before, after filters for commands, maybe
|
81
153
|
- when no action found in the context we want to execute, it should error or at least print an error
|
82
154
|
- can we flatten the configuration (as an option)
|
@@ -97,9 +169,9 @@ BUCKET
|
|
97
169
|
- blog about dependencies with bundler, the spermy operator and what version will be chosen
|
98
170
|
- blog about ppjson and how to use it
|
99
171
|
|
100
|
-
- improve the terminal formatter, allowing wrapping text to anywhere, and tabular like output without an actual table, allowing configuring terminal of any size not just 80, spin it off a little separate project, with an example of how to possibly build a menu in it or something
|
101
|
-
- BUG the help formatting is still not quite right as far as respecting the char limits and wrapping properly when doing tabular output!!!!
|
102
|
-
- do a readme for how trollop was slightly modified to accept a formatter
|
172
|
+
- improve the terminal formatter, allowing wrapping text to anywhere, and tabular like output without an actual table, allowing configuring terminal of any size not just 80, spin it off a little separate project, with an example of how to possibly build a menu in it or something DONE
|
173
|
+
- BUG the help formatting is still not quite right as far as respecting the char limits and wrapping properly when doing tabular output!!!! DONE
|
174
|
+
- do a readme for how trollop was slightly modified to accept a formatter
|
103
175
|
- gemspec summary and description should be taken from the app definition/maybe
|
104
176
|
- perhaps add a copyright with license to readme
|
105
177
|
- via method missing we can make the dsl classes more robust by printing errors and exting when non-dsl methods are attempted
|
@@ -112,6 +184,32 @@ BUCKET
|
|
112
184
|
PIE IN SKY
|
113
185
|
- choosing default output format based on where the output is going STDOUT.tty?
|
114
186
|
- look at ruby curses support a bit more closely and maybe use that for terminal stuff instead as it would be much better at it
|
187
|
+
- a library for specifying conditions and matching on those conditions
|
188
|
+
- possible syntax for conditions library:
|
189
|
+
Conditions.new do
|
190
|
+
_and do
|
191
|
+
_= a, 1
|
192
|
+
_not do
|
193
|
+
_or do
|
194
|
+
_nil :b
|
195
|
+
_empty :b
|
196
|
+
_false :b
|
197
|
+
end
|
198
|
+
end
|
199
|
+
_present :b
|
200
|
+
_present [:c, :d]
|
201
|
+
_nil :e
|
202
|
+
_empty :f
|
203
|
+
_false :g
|
204
|
+
_or do
|
205
|
+
_= :h, 5
|
206
|
+
_and do
|
207
|
+
_= :i, 7
|
208
|
+
_empty :j
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
115
213
|
|
116
214
|
|
117
215
|
|
@@ -150,3 +248,18 @@ DONE
|
|
150
248
|
- better support for on_error blocks with explanations and examples of usage (roll exit code support into here), default handling of errors in block N/A
|
151
249
|
- a convention for how to actually do the code that will handle the commands etc. DONE
|
152
250
|
- support for infinitely nesting sub commands (is this really necessary) DONE
|
251
|
+
|
252
|
+
v0.1.0
|
253
|
+
- some spec infrastructure DONE
|
254
|
+
- a couple of basic specs DONE
|
255
|
+
- some integration test infrastructure DONE
|
256
|
+
- a couple of basic integration tests DONE
|
257
|
+
- pull classes for formatting out into files DONE
|
258
|
+
- summary and description for commands DONE
|
259
|
+
- include command summary and description in help formatter DONE
|
260
|
+
- rework how help is displayed for commands with summary and description DONE
|
261
|
+
- the sub commands for command should use summary instead of description DONE
|
262
|
+
- do for validation and action what I did for option within the dsl DONE
|
263
|
+
- look again at conflicts support in dsl, we can probably do better naming for it DONE
|
264
|
+
- up the version to 0.1.0 DONE
|
265
|
+
- tag and release DONE
|
data/escort.gemspec
CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.add_development_dependency('rspec')
|
16
16
|
gem.add_development_dependency('fakefs')
|
17
17
|
gem.add_development_dependency('rake')
|
18
|
+
gem.add_development_dependency('travis-lint')
|
18
19
|
|
19
20
|
gem.files = `git ls-files`.split($/)
|
20
21
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/examples/basic
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.action do |options, arguments|
|
8
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.options do |opts|
|
8
|
+
opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
|
9
|
+
opts.opt :flag2, "Flag 2", :short => :none, :long => '--flag2', :type => :boolean
|
10
|
+
|
11
|
+
opts.conflict :flag1, :flag2, :flag3
|
12
|
+
end
|
13
|
+
|
14
|
+
app.action do |options, arguments|
|
15
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.options do |opts|
|
8
|
+
opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean
|
9
|
+
opts.opt :flag2, "Flag 2", :short => :none, :long => '--flag2', :type => :boolean, :default => true
|
10
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string
|
11
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
|
12
|
+
opts.opt :option3, "Option3", :short => :none, :long => '--option3', :type => :string
|
13
|
+
opts.opt :option4, "Option4", :short => :none, :long => '--option4', :type => :string
|
14
|
+
|
15
|
+
opts.dependency :option1, :on => :flag1
|
16
|
+
opts.dependency :option2, :on => [:flag1, :option1]
|
17
|
+
opts.dependency :option3, :on => {:option1 => 'foo'}
|
18
|
+
#opts.dependency :option4, :on => [{:flag1 => false}, :option1] #This will get you into big trouble as it can never be fulfilled
|
19
|
+
opts.dependency :option4, :on => [{:flag2 => false}, :option1]
|
20
|
+
end
|
21
|
+
|
22
|
+
app.action do |options, arguments|
|
23
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.options do |opts|
|
8
|
+
opts.opt :flag1, "Flag 1", :short => '-f', :long => '--flag1', :type => :boolean, :default => true
|
9
|
+
opts.opt :flag2, "Flag 2", :short => :none, :long => '--flag2', :type => :boolean
|
10
|
+
end
|
11
|
+
|
12
|
+
app.action do |options, arguments|
|
13
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.options do |opts|
|
8
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
|
9
|
+
end
|
10
|
+
|
11
|
+
app.action do |options, arguments|
|
12
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.options do |opts|
|
8
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
|
9
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
|
10
|
+
end
|
11
|
+
|
12
|
+
app.action do |options, arguments|
|
13
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.requires_arguments
|
8
|
+
|
9
|
+
app.options do |opts|
|
10
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
|
11
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
|
12
|
+
end
|
13
|
+
|
14
|
+
app.action do |options, arguments|
|
15
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.version "0.1.1"
|
8
|
+
app.summary "Summary 1"
|
9
|
+
app.description "Description 1"
|
10
|
+
|
11
|
+
app.requires_arguments
|
12
|
+
|
13
|
+
app.options do |opts|
|
14
|
+
opts.opt :option1, "Option1", :short => '-o', :long => '--option1', :type => :string, :default => "option 1"
|
15
|
+
opts.opt :option2, "Option2", :short => :none, :long => '--option2', :type => :string, :multi => true
|
16
|
+
end
|
17
|
+
|
18
|
+
app.action do |options, arguments|
|
19
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.options do |opts|
|
8
|
+
opts.opt :option1, "Option 1", :short => '-o', :long => '--option1', :type => :string
|
9
|
+
opts.opt :int1, "Int 1", :short => '-i', :long => '--int1', :type => :int
|
10
|
+
opts.opt :option2, "Option 2", :short => :none, :long => '--option2', :type => :string
|
11
|
+
|
12
|
+
opts.validate(:option1, "must be either 'foo' or 'bar'") { |option| ["foo", "bar"].include?(option) }
|
13
|
+
opts.validate(:int1, "must be between 10 and 20 exclusive") { |option| option > 10 && option < 20 }
|
14
|
+
opts.validate(:option2, "must be two words") {|option| option =~ /\w\s\w/}
|
15
|
+
opts.validate(:option2, "must be at least 20 characters long") {|option| option.length >= 20}
|
16
|
+
end
|
17
|
+
|
18
|
+
app.action do |options, arguments|
|
19
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
20
|
+
end
|
21
|
+
end
|
data/examples/command
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.expand_path(__FILE__), "..", "..", "lib", "escort"))
|
4
|
+
require File.join(File.expand_path(__FILE__), "..", "commands", "example_command")
|
5
|
+
|
6
|
+
Escort::App.create do |app|
|
7
|
+
app.command :command1, :aliases => [:c1, :com1] do |command|
|
8
|
+
command.summary "Command summary 1"
|
9
|
+
command.description "Command description 1"
|
10
|
+
|
11
|
+
command.action do |options, arguments|
|
12
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
app.action do |options, arguments|
|
17
|
+
Escort::ExampleCommand.new(options, arguments).execute
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Escort
|
2
|
+
class ExampleCommand < ::Escort::ActionCommand::Base
|
3
|
+
def execute
|
4
|
+
Escort::Logger.output.puts "Command: #{command_name}"
|
5
|
+
Escort::Logger.output.puts "Options: #{options}"
|
6
|
+
Escort::Logger.output.puts "Command options: #{command_options}"
|
7
|
+
Escort::Logger.output.puts "Arguments: #{arguments}"
|
8
|
+
if config
|
9
|
+
Escort::Logger.output.puts "User config: #{config}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/escort/app.rb
CHANGED
@@ -2,20 +2,40 @@ module Escort
|
|
2
2
|
class App
|
3
3
|
#TODO ensure that every command must have an action
|
4
4
|
class << self
|
5
|
+
#def create(option_string = '', &block)
|
6
|
+
#cli_app_configuration = Escort::Setup::Dsl::Global.new(&block)
|
7
|
+
#setup = Escort::SetupAccessor.new(cli_app_configuration)
|
8
|
+
#app = self.new(option_string, setup)
|
9
|
+
#app.execute
|
10
|
+
#exit(0)
|
11
|
+
#end
|
12
|
+
|
5
13
|
def create(option_string = '', &block)
|
6
|
-
|
7
|
-
setup = Escort::SetupAccessor.new(cli_app_configuration)
|
8
|
-
app = self.new(option_string, setup)
|
9
|
-
app.execute
|
14
|
+
self.new(option_string, &block).setup_application.execute
|
10
15
|
exit(0)
|
11
16
|
end
|
12
17
|
end
|
13
18
|
|
14
19
|
attr_reader :setup, :option_string
|
15
20
|
|
16
|
-
def initialize(option_string,
|
17
|
-
@setup = setup
|
21
|
+
def initialize(option_string, &block)
|
18
22
|
@option_string = option_string
|
23
|
+
@setup = nil
|
24
|
+
@block = block
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup_application
|
28
|
+
old_error_sev_threshold = error_logger.sev_threshold
|
29
|
+
begin
|
30
|
+
error_logger.sev_threshold = ::Logger::DEBUG
|
31
|
+
cli_app_configuration = Escort::Setup::Dsl::Global.new(&@block)
|
32
|
+
@setup = Escort::SetupAccessor.new(cli_app_configuration)
|
33
|
+
self
|
34
|
+
rescue => e
|
35
|
+
handle_escort_error(e)
|
36
|
+
ensure
|
37
|
+
error_logger.sev_threshold = old_error_sev_threshold
|
38
|
+
end
|
19
39
|
end
|
20
40
|
|
21
41
|
def execute
|
@@ -50,7 +70,9 @@ module Escort
|
|
50
70
|
|
51
71
|
def execute_action(action, options, arguments, user_config)
|
52
72
|
begin
|
73
|
+
#execute before servants here
|
53
74
|
action.call(options, arguments, user_config)
|
75
|
+
#execute after servants here
|
54
76
|
rescue => e
|
55
77
|
handle_action_error(e)
|
56
78
|
end
|
@@ -72,11 +94,11 @@ module Escort
|
|
72
94
|
|
73
95
|
def handle_escort_error(e)
|
74
96
|
if e.kind_of?(Escort::UserError)
|
75
|
-
|
97
|
+
print_stacktrace(e)
|
76
98
|
error_logger.debug{ "Escort app failed to execute successfully, due to user error" }
|
77
99
|
exit(Escort::USER_ERROR_EXIT_CODE)
|
78
100
|
elsif e.kind_of?(Escort::ClientError)
|
79
|
-
|
101
|
+
print_stacktrace(e)
|
80
102
|
error_logger.debug{ "Escort app failed to execute successfully, due to client setup error" }
|
81
103
|
exit(Escort::CLIENT_ERROR_EXIT_CODE)
|
82
104
|
else
|
@@ -99,13 +121,13 @@ module Escort
|
|
99
121
|
end
|
100
122
|
|
101
123
|
def print_stacktrace(e)
|
102
|
-
error_logger.error{ e }
|
124
|
+
error_logger.error{ e.message }
|
125
|
+
error_logger.debug{ e }
|
103
126
|
end
|
104
127
|
|
105
128
|
def print_escort_error_message(e)
|
106
129
|
print_stacktrace(e)
|
107
|
-
error_logger.warn{ "
|
108
|
-
error_logger.warn{ "An internal Escort error has occurred, you should probably report it by creating an issue on github!" }
|
130
|
+
error_logger.warn{ "An internal Escort error has occurred, you should probably report it by creating an issue on github! To get a stacktrace, up the verbosity level to DEBUG and execute your command again. Use --help for details." }
|
109
131
|
end
|
110
132
|
end
|
111
133
|
end
|
@@ -1,3 +1,7 @@
|
|
1
|
+
#TODO needs some serious testing stuffs
|
2
|
+
#split out into many classes VirtuaRow, PhysicalRow, FormatterRow
|
3
|
+
#needs method each_formatted_row
|
4
|
+
#the printing out should only happen in the outputter class not in the table intself
|
1
5
|
module Escort
|
2
6
|
module Formatter
|
3
7
|
class BorderlessTable
|