escort 0.3.0 → 0.4.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 +6 -14
- data/.ruby-version +1 -0
- data/README.md +4 -1
- data/TODO.md +71 -75
- data/escort.gemspec +2 -0
- data/lib/escort.rb +63 -44
- data/lib/escort/error/error.rb +1 -18
- data/lib/escort/setup_accessor.rb +0 -5
- data/lib/escort/version.rb +1 -1
- data/spec/integration/basic_config_file_spec.rb +44 -0
- data/spec/integration/basic_spec.rb +15 -0
- data/spec/integration/basic_with_arguments_spec.rb +2 -0
- data/spec/lib/escort/setup_accessor_spec.rb +192 -9
- data/spec/support/shared_contexts/integration_setup.rb +1 -1
- metadata +27 -13
- data/.rvmrc +0 -22
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
ZjBiNWM4N2MyMDQ3NDI2ZmQyZjI4NjBmZjg3YmZhZTRjNGU5ZDFlNjljYzYw
|
10
|
-
Y2Q0MThjMDQyYTg5YjAzZWE3ZDQ2NGFhZWIwZDE0MjU2MTZiZTk5MDdmZGVl
|
11
|
-
MWVmMTUzMTYzODc5NzcxYmEyZmE5MGI4NmNlNjI3MThkMWEyMDI=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ODkwMzNlN2Q0NTMwOGY2ZGQzYTA3YjA3ZTNiMjdkYTgzMjBmYmI1ZTVjNDQy
|
14
|
-
ZTM0ZGU2ZGZjNmVhYjhiMjdmZTVjY2NiNGY2ZGRmNmUzMTcyNmViMzNmYjQ4
|
15
|
-
NzQzN2MxMjlhOGFiN2UxZGE2ODc2MWZmY2IxODAzNjFkM2ViMmQ=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f31a0746ef3bb6c559b04f55e87fa8e48900f32c
|
4
|
+
data.tar.gz: 236d3d50f9e7ac297dbb444e44e6628329aacba1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 44545a6c19ecde7615c819c702744af2bd0810e5df6a755ce3fbc644b1c4a7154317da87a4c3c944cfbf3614799b3d76be0e6736fe58927c407961ae5532e83f
|
7
|
+
data.tar.gz: f8ffe0f3f296f16ca3f8d709a4101e746d505b321c5a42ec3280d48293e96f8414472184bfe546bab4e184a4adb9cd94119a5a1ab622e28a7279491859d90197
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p0
|
data/README.md
CHANGED
@@ -684,7 +684,10 @@ TODO
|
|
684
684
|
|
685
685
|
## Command-Line Tools Built With Escort
|
686
686
|
|
687
|
-
|
687
|
+
If you've used Escort to build a command-line tool that you have made publicly available, feel free to add a link to it here.
|
688
|
+
|
689
|
+
* https://github.com/skorks/ppjson - pretty print your JSON on the command-line (works with JSON strings as well as files containing JSON, can uglify as well as pretty print)
|
690
|
+
|
688
691
|
|
689
692
|
## Alternatives
|
690
693
|
|
data/TODO.md
CHANGED
@@ -1,88 +1,24 @@
|
|
1
1
|
ROADMAP
|
2
|
-
|
3
|
-
v0.3.0
|
4
|
-
- tag and release
|
5
|
-
|
6
|
-
|
7
|
-
- up the version to 0.3.0 DONE
|
8
|
-
- test the base command for actions well DONE
|
9
|
-
- BUG parent_options when parent of command is global context doesn't seem to work??? DONE
|
10
|
-
- integration test for commands DONE
|
11
|
-
- integration test for sub-commands DONE
|
12
|
-
- readme a basic app with config file, integration test (don't worry about explaining all the helper stuff that gets created) DONE
|
13
|
-
- test the configuration loader DONE
|
14
|
-
- test the descend to home locator DONE
|
15
|
-
- test the configuration merge tool DONE
|
16
|
-
- test the configuration generator DONE
|
17
|
-
- test all the locators (descend, specfic dir, current script dir, chaining) DONE
|
18
|
-
- we should always be using the chaining locator, with more or less sub locators depending on setup DONE
|
19
|
-
- create other locators (dir of currently executing script locator, i.e. not the working directory, specified dir locator) DONE
|
20
|
-
- create a chaining locator so we can put all our locators together DONE
|
21
|
-
- test the configuration reader DONE
|
22
|
-
- test the configuration writer DONE
|
23
|
-
- a basic app example with all the trimmings DONE
|
24
|
-
- app with config file example DONE
|
25
|
-
- readme implementing and action for a basic app DONE
|
26
|
-
- rejig for betterness the validations help outputs DONE
|
27
|
-
- test the string grid DONE
|
28
|
-
- start using the new stream output formatter DONE
|
29
|
-
- refactor terminal formatter and test it DONE
|
30
|
-
- finish testing the output formatter DONE
|
31
|
-
- get rid of shell command executor new shell stuff (doesn't work in Jruby and not really needed anyway) DONE
|
32
|
-
- extract all the dsl command stuff into a helper module so that global and command can be handled by the same code DONE
|
33
|
-
|
34
|
-
v0.4.0
|
35
|
-
- test all the config file helper stuff
|
36
|
-
- a few more tests (setup accessor, all the dsl classes)
|
37
|
-
- fix ppjson so that dependency suport feature is actually used
|
38
|
-
- up the version to 0.4.0
|
39
|
-
- tag and release
|
40
|
-
|
41
|
-
|
42
|
-
- delete the stuff from the attic once it is no longer needed DONE
|
43
|
-
- readme a sub command app with options, validations, description, summary, require arguments and config file, integration tests, example DONE
|
44
|
-
- readme for requires arguments overriding and inheritance DONE
|
45
|
-
- readme explain all the helper stuff that automatically gets created with config file support DONE
|
46
|
-
|
47
|
-
|
48
2
|
v1.0.0
|
49
|
-
-
|
50
|
-
-
|
51
|
-
-
|
3
|
+
- thoroughly test the setup accessor
|
4
|
+
- refactor setup accessor to break it up into multiple objects so that it is easier to test and less monolithic
|
5
|
+
- pull out the action execution into a separate class and test it
|
6
|
+
- a way have helpers available when you don't want to have to create a command
|
7
|
+
- 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
|
52
8
|
- up the version to 1.0.0
|
53
9
|
- tag and release
|
54
|
-
- get the blog updated with a new theme
|
55
|
-
- put a new subscriber count widget on blog
|
56
|
-
- blog Build Command-Line Apps Like a Pro Using Ruby and Escort
|
57
10
|
|
58
11
|
|
59
|
-
- in trollop when errors are raised they should be wrapped as escort errors and propagate rather than being caught by trollop itself DONE
|
60
|
-
- rework the examples again to show of some/most of the features (along the lines of the integration tests and readme) DONE
|
61
|
-
- 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
|
62
|
-
- readme for a basic app with conflicting options DONE
|
63
|
-
- readme for a basic app with dependent options DONE
|
64
12
|
|
65
13
|
v1.0.1
|
66
|
-
- pull out the action execution into a separate class and test it
|
67
|
-
- add a section to readme for command line tools built with escort (e.g. ppjson)
|
68
|
-
- more specs (all the dsl classes possibly)
|
69
|
-
- more integration specs (more specs for the different types of options)
|
70
|
-
- a way have helpers available when you don't want to have to create a command
|
71
|
-
- the config auto option should not be included in the config file, same with other auto options???
|
72
|
-
- 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
|
73
|
-
|
74
|
-
|
75
|
-
- rework the integration specs and matchers so there are less moving parts (perhaps push some stuff down into a base class etc.) DONE
|
76
|
-
- rewrite the help formatter to be a bit easier to understand (more like man output for output) DONE
|
77
|
-
- add depends support to dsl DONE
|
78
14
|
|
79
15
|
v1.0.2
|
16
|
+
- create a table of contents for the readme so that it is easier to navigate it
|
80
17
|
- refactor the app class so it is a bit nicer etc
|
81
|
-
- more specs
|
82
18
|
- need a suite for escort itself using escort to bootstrap etc
|
83
|
-
- scaffold for app with no sub commands
|
84
|
-
- scaffold for app with one level of commands
|
85
|
-
- scaffold for app with nested sub commands
|
19
|
+
- scaffold for app with no sub commands (escort g -o blah -o yadda bin/app.rb)
|
20
|
+
- scaffold for app with one level of commands (escort g -o blah -o yadda suite -o blah -o yadda -c foo -c bar bin/app.rb)
|
21
|
+
- scaffold for app with nested sub commands (escort g -o blah -o yadda suite -o blah -o yadda -c foo -c bar --nested bin/app.rb) ???
|
86
22
|
|
87
23
|
v1.0.3
|
88
24
|
- an option for setup that indicates it is a project specific CLI app
|
@@ -90,8 +26,7 @@ v1.0.3
|
|
90
26
|
- make the configuration environment aware
|
91
27
|
- make escort environment aware (app.environment_aware)
|
92
28
|
- json configuration should support defaults config
|
93
|
-
-
|
94
|
-
- pull nested exception stuff into separate gem
|
29
|
+
- if necessary, extra helpers to work with environment specific config sections (xxx -e production escort --create-config-environment-section)
|
95
30
|
|
96
31
|
|
97
32
|
- much better documentation and usage patterns DONE
|
@@ -101,9 +36,16 @@ v2.0.0
|
|
101
36
|
- implement servants for dealing with clumps of functionality, and action commands have access to all servants that were executed before them
|
102
37
|
- ability to break up a big config into chucks, e.g. per command etc. so that it is more modular and easier to read
|
103
38
|
- whether or not action is specified things should not blow up
|
39
|
+
- rework ppjson to take advantage of servants and non-block actions and release a new version
|
104
40
|
|
105
41
|
v2.0.1
|
106
42
|
- lots more logging at different levels for debug purposes
|
43
|
+
- more integration specs (more specs for the different types of options)
|
44
|
+
- more specs (dsl classes, validator, option_parser, dependency validator, global_pre_parser, auto_options, app)
|
45
|
+
- perhaps verbosity should be at the highest level by default and allow toning it down via the setup
|
46
|
+
- blog Build Command-Line Apps Like a Pro Using Ruby and Escort
|
47
|
+
- pull the terminal formatting stuff into separate gem
|
48
|
+
- pull nested exception stuff into separate gem
|
107
49
|
|
108
50
|
|
109
51
|
|
@@ -151,6 +93,7 @@ BUCKET
|
|
151
93
|
- json configuration should support having environment configs in multiple files
|
152
94
|
- blog the crap out of all aspects of how to use it, how it is constructed, some fancy things you can do with it etc.
|
153
95
|
- ability to ask for user input for a command (e.g. for passwords, this can possibly be done via validations)
|
96
|
+
- do a homebrew config for ppjson so that it can easily be installed using brew
|
154
97
|
|
155
98
|
- blog about what makes a good command line app (this and the one below are possibly one post)
|
156
99
|
- blog about how to use escort and why the other libraries possibly fall short
|
@@ -163,6 +106,7 @@ BUCKET
|
|
163
106
|
- blog about nested exceptions and how to make them nice in your app, also metion exceptional ruby book as well as nestegg gem
|
164
107
|
- blog about dependencies with bundler, the spermy operator and what version will be chosen
|
165
108
|
- blog about ppjson and how to use it
|
109
|
+
- reply to a bunch of stackoverflow posts about pretty printing json on the command-line
|
166
110
|
|
167
111
|
- 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
|
168
112
|
- BUG the help formatting is still not quite right as far as respecting the char limits and wrapping properly when doing tabular output!!!! DONE
|
@@ -310,3 +254,55 @@ v0.2.0
|
|
310
254
|
- integration test all the permutations of dependency specification with error and success cases etc DONE
|
311
255
|
- create a shortcut for dependency specification on the opt method options hash itself DONE
|
312
256
|
- fix up example for basic app with dependencies for options DONE
|
257
|
+
|
258
|
+
v0.3.0
|
259
|
+
- tag and release DONE
|
260
|
+
- up the version to 0.3.0 DONE
|
261
|
+
- test the base command for actions well DONE
|
262
|
+
- BUG parent_options when parent of command is global context doesn't seem to work??? DONE
|
263
|
+
- integration test for commands DONE
|
264
|
+
- integration test for sub-commands DONE
|
265
|
+
- readme a basic app with config file, integration test (don't worry about explaining all the helper stuff that gets created) DONE
|
266
|
+
- test the configuration loader DONE
|
267
|
+
- test the descend to home locator DONE
|
268
|
+
- test the configuration merge tool DONE
|
269
|
+
- test the configuration generator DONE
|
270
|
+
- test all the locators (descend, specfic dir, current script dir, chaining) DONE
|
271
|
+
- we should always be using the chaining locator, with more or less sub locators depending on setup DONE
|
272
|
+
- create other locators (dir of currently executing script locator, i.e. not the working directory, specified dir locator) DONE
|
273
|
+
- create a chaining locator so we can put all our locators together DONE
|
274
|
+
- test the configuration reader DONE
|
275
|
+
- test the configuration writer DONE
|
276
|
+
- a basic app example with all the trimmings DONE
|
277
|
+
- app with config file example DONE
|
278
|
+
- readme implementing and action for a basic app DONE
|
279
|
+
- rejig for betterness the validations help outputs DONE
|
280
|
+
- test the string grid DONE
|
281
|
+
- start using the new stream output formatter DONE
|
282
|
+
- refactor terminal formatter and test it DONE
|
283
|
+
- finish testing the output formatter DONE
|
284
|
+
- get rid of shell command executor new shell stuff (doesn't work in Jruby and not really needed anyway) DONE
|
285
|
+
- extract all the dsl command stuff into a helper module so that global and command can be handled by the same code DONE
|
286
|
+
|
287
|
+
v0.4.0
|
288
|
+
- a few more integration tests (test that basic app automatically gets help and version and that they are correct) DONE
|
289
|
+
- 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 DONE
|
290
|
+
- clean up all the extraneous branches DONE
|
291
|
+
- in trollop when errors are raised they should be wrapped as escort errors and propagate rather than being caught by trollop itself DONE
|
292
|
+
- rework the examples again to show of some/most of the features (along the lines of the integration tests and readme) DONE
|
293
|
+
- 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
|
294
|
+
- readme for a basic app with conflicting options DONE
|
295
|
+
- readme for a basic app with dependent options DONE
|
296
|
+
- integration test all the config file helper stuff DONE
|
297
|
+
- fix ppjson so that dependency suport feature is actually used DONE
|
298
|
+
- delete the stuff from the attic once it is no longer needed DONE
|
299
|
+
- readme a sub command app with options, validations, description, summary, require arguments and config file, integration tests, example DONE
|
300
|
+
- readme for requires arguments overriding and inheritance DONE
|
301
|
+
- readme explain all the helper stuff that automatically gets created with config file support DONE
|
302
|
+
- get the blog updated with a new theme DONE
|
303
|
+
- put a new subscriber count widget on blog DONE
|
304
|
+
- the config auto option should not be included in the config file, same with other auto options??? N/A
|
305
|
+
- add a section to readme for command line tools built with escort (e.g. ppjson) DONE
|
306
|
+
- rework the integration specs and matchers so there are less moving parts (perhaps push some stuff down into a base class etc.) DONE
|
307
|
+
- rewrite the help formatter to be a bit easier to understand (more like man output for output) DONE
|
308
|
+
- add depends support to dsl DONE
|
data/escort.gemspec
CHANGED
@@ -12,6 +12,8 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.description = %q{Writing even complex command-line apps should be quick, easy and fun. Escort takes the excellent Trollop option parser and adds a whole bunch of awesome features to produce a library you will always want to turn to when a 'quick script' is in order.}
|
13
13
|
gem.homepage = "https://github.com/skorks/escort"
|
14
14
|
|
15
|
+
gem.add_runtime_dependency('nesty')
|
16
|
+
|
15
17
|
gem.add_development_dependency('rspec')
|
16
18
|
gem.add_development_dependency('fakefs')
|
17
19
|
gem.add_development_dependency('rake')
|
data/lib/escort.rb
CHANGED
@@ -1,54 +1,73 @@
|
|
1
|
-
|
2
|
-
require 'escort/trollop'
|
3
|
-
require 'escort/utils'
|
4
|
-
require 'escort/arguments'
|
5
|
-
require 'escort/logger'
|
1
|
+
autoload :Nesty, "nesty"
|
6
2
|
|
7
|
-
|
3
|
+
module Escort
|
4
|
+
autoload :VERSION, "escort/version"
|
5
|
+
autoload :Trollop, "escort/trollop"
|
6
|
+
autoload :Utils, "escort/utils"
|
7
|
+
autoload :Arguments, "escort/arguments"
|
8
|
+
autoload :Logger, "escort/logger"
|
9
|
+
autoload :SetupAccessor, "escort/setup_accessor"
|
10
|
+
autoload :OptionDependencyValidator, "escort/option_dependency_validator"
|
11
|
+
autoload :Validator, "escort/validator"
|
12
|
+
autoload :AutoOptions, "escort/auto_options"
|
13
|
+
autoload :GlobalPreParser, "escort/global_pre_parser"
|
14
|
+
autoload :OptionParser, "escort/option_parser"
|
15
|
+
autoload :App, "escort/app"
|
8
16
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
require 'escort/formatter/terminal'
|
16
|
-
require 'escort/formatter/string_splitter'
|
17
|
-
require 'escort/formatter/cursor_position'
|
18
|
-
require 'escort/formatter/stream_output_formatter'
|
19
|
-
require 'escort/formatter/string_grid'
|
20
|
-
require 'escort/formatter/default_help_formatter'
|
17
|
+
autoload :Error, "escort/error/error"
|
18
|
+
autoload :BaseError, "escort/error/error"
|
19
|
+
autoload :UserError, "escort/error/error"
|
20
|
+
autoload :InternalError, "escort/error/error"
|
21
|
+
autoload :ClientError, "escort/error/error"
|
22
|
+
autoload :TransientError, "escort/error/error"
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
module Formatter
|
25
|
+
autoload :Option, "escort/formatter/option"
|
26
|
+
autoload :Options, "escort/formatter/options"
|
27
|
+
autoload :Command, "escort/formatter/command"
|
28
|
+
autoload :Commands, "escort/formatter/commands"
|
29
|
+
autoload :GlobalCommand, "escort/formatter/global_command"
|
30
|
+
autoload :ShellCommandExecutor, "escort/formatter/shell_command_executor"
|
31
|
+
autoload :Terminal, "escort/formatter/terminal"
|
32
|
+
autoload :StringSplitter, "escort/formatter/string_splitter"
|
33
|
+
autoload :CursorPosition, "escort/formatter/cursor_position"
|
34
|
+
autoload :StreamOutputFormatter, "escort/formatter/stream_output_formatter"
|
35
|
+
autoload :StringGrid, "escort/formatter/string_grid"
|
36
|
+
autoload :DefaultHelpFormatter, "escort/formatter/default_help_formatter"
|
37
|
+
end
|
27
38
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
require 'escort/setup/configuration/writer'
|
37
|
-
require 'escort/setup/configuration/generator'
|
38
|
-
require 'escort/setup/configuration/loader'
|
39
|
+
module Setup
|
40
|
+
module Dsl
|
41
|
+
autoload :Options, "escort/setup/dsl/options"
|
42
|
+
autoload :Action, "escort/setup/dsl/action"
|
43
|
+
autoload :Command, "escort/setup/dsl/command"
|
44
|
+
autoload :ConfigFile, "escort/setup/dsl/config_file"
|
45
|
+
autoload :Global, "escort/setup/dsl/global"
|
46
|
+
end
|
39
47
|
|
40
|
-
|
48
|
+
module Configuration
|
49
|
+
module Locator
|
50
|
+
autoload :Base, "escort/setup/configuration/locator/base"
|
51
|
+
autoload :DescendingToHome, "escort/setup/configuration/locator/descending_to_home"
|
52
|
+
autoload :ExecutingScriptDirectory, "escort/setup/configuration/locator/executing_script_directory"
|
53
|
+
autoload :SpecifiedDirectory, "escort/setup/configuration/locator/specified_directory"
|
54
|
+
autoload :Chaining, "escort/setup/configuration/locator/chaining"
|
55
|
+
end
|
41
56
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
57
|
+
autoload :MergeTool, "escort/setup/configuration/merge_tool"
|
58
|
+
autoload :Instance, "escort/setup/configuration/instance"
|
59
|
+
autoload :Reader, "escort/setup/configuration/reader"
|
60
|
+
autoload :Writer, "escort/setup/configuration/writer"
|
61
|
+
autoload :Generator, "escort/setup/configuration/generator"
|
62
|
+
autoload :Loader, "escort/setup/configuration/loader"
|
63
|
+
end
|
64
|
+
end
|
47
65
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
66
|
+
module ActionCommand
|
67
|
+
autoload :Base, "escort/action_command/base"
|
68
|
+
autoload :EscortUtilityCommand, "escort/action_command/escort_utility_command"
|
69
|
+
end
|
70
|
+
end
|
52
71
|
|
53
72
|
at_exit do
|
54
73
|
Escort::Logger.close
|
data/lib/escort/error/error.rb
CHANGED
@@ -11,25 +11,8 @@ module Escort
|
|
11
11
|
#all our exceptions will supported nesting other exceptions
|
12
12
|
#also all our exception will be a kind_of? Escort::Error
|
13
13
|
class BaseError < StandardError
|
14
|
+
include Nesty::NestedError
|
14
15
|
include Error
|
15
|
-
attr_reader :original
|
16
|
-
|
17
|
-
def initialize(msg, original=$!)
|
18
|
-
super(msg)
|
19
|
-
@original = original
|
20
|
-
end
|
21
|
-
|
22
|
-
def set_backtrace(bt)
|
23
|
-
if original
|
24
|
-
original.backtrace.reverse.each do |line|
|
25
|
-
bt.last == line ? bt.pop : break
|
26
|
-
end
|
27
|
-
original_first = original.backtrace.shift
|
28
|
-
bt.concat ["#{original_first}: #{original.message}"]
|
29
|
-
bt.concat original.backtrace
|
30
|
-
end
|
31
|
-
super(bt)
|
32
|
-
end
|
33
16
|
end
|
34
17
|
|
35
18
|
#user did something invalid
|
@@ -112,11 +112,6 @@ module Escort
|
|
112
112
|
|
113
113
|
def add_global_command(name, options = {}, &block)
|
114
114
|
global_instance.command(name, options, &block)
|
115
|
-
|
116
|
-
#with_context([]) do |current_context|
|
117
|
-
#commands = fetch_instance_variable_from(current_context, :commands)
|
118
|
-
#options_object.opt name, desc, options
|
119
|
-
#end
|
120
115
|
end
|
121
116
|
|
122
117
|
private
|
data/lib/escort/version.rb
CHANGED
@@ -79,4 +79,48 @@ describe "Escort basic app with config file defined", :integration => true do
|
|
79
79
|
it("should not have created a config file in default location") { File.should_not exist path }
|
80
80
|
end
|
81
81
|
end
|
82
|
+
|
83
|
+
context "when config file specified" do
|
84
|
+
let(:autocreate) {false}
|
85
|
+
|
86
|
+
before do
|
87
|
+
FileUtils.mkdir_p(File.dirname path)
|
88
|
+
File.open(path, 'w') {|f| f.write(JSON.pretty_generate({:global => {:commands => {}, :options => {:option1 => 'hello'}}, :user => {}})) }
|
89
|
+
|
90
|
+
begin
|
91
|
+
subject
|
92
|
+
rescue SystemExit => e
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "--config global option should exist" do
|
97
|
+
let(:option_string) { "--config=#{path}" }
|
98
|
+
it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
|
99
|
+
end
|
100
|
+
|
101
|
+
context "escort command should exist" do
|
102
|
+
let(:option_string) { "escort -h" }
|
103
|
+
it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
|
104
|
+
|
105
|
+
context "--create-config option for escort command should exist" do
|
106
|
+
let(:option_string) { "escort --create-config=#{path}" }
|
107
|
+
it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
|
108
|
+
end
|
109
|
+
|
110
|
+
context "--create-default-config option for escort command should exist" do
|
111
|
+
let(:option_string) { "escort --create-default-config" }
|
112
|
+
it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
|
113
|
+
end
|
114
|
+
|
115
|
+
context "--update-config option for escort command should exist" do
|
116
|
+
let(:option_string) { "escort --update-config=#{path}" }
|
117
|
+
it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
|
118
|
+
end
|
119
|
+
|
120
|
+
context "--update-default-config option for escort command should exist" do
|
121
|
+
let(:option_string) { "escort --update-default-config" }
|
122
|
+
it("should exit with code 0") { expect{ subject }.to exit_with_code(0) }
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
82
126
|
end
|
@@ -20,4 +20,19 @@ describe "Escort basic app with no options defined", :integration => true do
|
|
20
20
|
it("exit code should be 0") { expect{ subject }.to exit_with_code(0) }
|
21
21
|
it("should execute the global action") { expect{subject}.to execute_action_for_command(result, :global) }
|
22
22
|
end
|
23
|
+
|
24
|
+
context "gets --help option automatically" do
|
25
|
+
let(:option_string) { "--help" }
|
26
|
+
it("exit code should be 0") { expect{ subject }.to exit_with_code(0) }
|
27
|
+
end
|
28
|
+
|
29
|
+
context "gets --verbosity option automatically" do
|
30
|
+
let(:option_string) { "--verbosity=DEBUG" }
|
31
|
+
it("exit code should be 0") { expect{ subject }.to exit_with_code(0) }
|
32
|
+
end
|
33
|
+
|
34
|
+
context "gets --error-output-format option automatically" do
|
35
|
+
let(:option_string) { "--error-output-format=advanced" }
|
36
|
+
it("exit code should be 0") { expect{ subject }.to exit_with_code(0) }
|
37
|
+
end
|
23
38
|
end
|
@@ -4,7 +4,15 @@ describe Escort::SetupAccessor do
|
|
4
4
|
let(:global_app_configuration) do
|
5
5
|
Escort::Setup::Dsl::Global.new do |app|
|
6
6
|
app.options do |opts|
|
7
|
-
opts.opt :option1, "
|
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 }
|
8
16
|
end
|
9
17
|
|
10
18
|
app.action do |options, arguments|
|
@@ -13,31 +21,206 @@ describe Escort::SetupAccessor do
|
|
13
21
|
end
|
14
22
|
|
15
23
|
let(:command_app_configuration) do
|
24
|
+
Escort::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
|
16
57
|
end
|
17
58
|
|
18
59
|
let(:sub_command_app_configuration) do
|
60
|
+
Escort::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
|
19
100
|
end
|
20
101
|
|
21
|
-
#context is nil
|
22
|
-
#no context supplied at all
|
23
|
-
#context is not an array
|
24
102
|
describe '#options_for' do
|
25
|
-
|
103
|
+
let(:options) {setup.options_for(context)}
|
26
104
|
|
27
105
|
context "when app has no sub commands" do
|
28
106
|
let(:app_configuration) {global_app_configuration}
|
29
107
|
|
30
108
|
context "and context is global" do
|
31
109
|
let(:context) { [] }
|
32
|
-
it(":option1 should be present") {
|
110
|
+
it(":option1 should be present") {options[:option1].should_not be_nil}
|
33
111
|
end
|
34
112
|
|
35
113
|
context "and context is an unknown command" do
|
36
114
|
let(:context) { ['hello'] }
|
37
|
-
it("should not raise an exception") { expect{
|
38
|
-
it("result should be a hash") {
|
39
|
-
it("result should be empty") {
|
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 }
|
40
133
|
end
|
41
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
|
42
225
|
end
|
43
226
|
end
|
metadata
CHANGED
@@ -1,69 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: escort
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Skorkin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-04-21 00:00:00.000000000 Z
|
12
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: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rspec
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- -
|
31
|
+
- - '>='
|
18
32
|
- !ruby/object:Gem::Version
|
19
33
|
version: '0'
|
20
34
|
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- -
|
38
|
+
- - '>='
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: fakefs
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - '>='
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - '>='
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - '>='
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - '>='
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: travis-lint
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - '>='
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - '>='
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
description: Writing even complex command-line apps should be quick, easy and fun.
|
@@ -79,7 +93,7 @@ files:
|
|
79
93
|
- .gitignore
|
80
94
|
- .irbrc
|
81
95
|
- .rspec
|
82
|
-
- .
|
96
|
+
- .ruby-version
|
83
97
|
- .travis.yml
|
84
98
|
- Gemfile
|
85
99
|
- LICENSE.txt
|
@@ -194,12 +208,12 @@ require_paths:
|
|
194
208
|
- lib
|
195
209
|
required_ruby_version: !ruby/object:Gem::Requirement
|
196
210
|
requirements:
|
197
|
-
- -
|
211
|
+
- - '>='
|
198
212
|
- !ruby/object:Gem::Version
|
199
213
|
version: '0'
|
200
214
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
201
215
|
requirements:
|
202
|
-
- -
|
216
|
+
- - '>='
|
203
217
|
- !ruby/object:Gem::Version
|
204
218
|
version: '0'
|
205
219
|
requirements: []
|
data/.rvmrc
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
#!/usr/bin/env bash
|
2
|
-
|
3
|
-
failed=1
|
4
|
-
gemset=escort
|
5
|
-
rubies="ruby-1.9.3-p362 ruby-1.9.3-p194 ruby-1.9.2-p290 "
|
6
|
-
|
7
|
-
for ruby in $rubies; do
|
8
|
-
rvm use $ruby@$gemset --create 1>/dev/null 2>&1
|
9
|
-
if [ $? == 0 ]; then
|
10
|
-
echo
|
11
|
-
echo ">>" rvm is using $ruby@$gemset
|
12
|
-
echo
|
13
|
-
failed=0
|
14
|
-
break
|
15
|
-
fi
|
16
|
-
done
|
17
|
-
|
18
|
-
if [ $failed == 1 ]; then
|
19
|
-
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
20
|
-
echo cannot find a ruby runtime in the set: $rubies, please install one
|
21
|
-
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
22
|
-
fi
|