gli 2.11.0 → 2.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +28 -0
  3. data/.gitignore +3 -3
  4. data/.tool-versions +1 -0
  5. data/Gemfile +0 -2
  6. data/README.rdoc +29 -19
  7. data/Rakefile +15 -37
  8. data/bin/ci +29 -0
  9. data/bin/gli +24 -54
  10. data/bin/rake +29 -0
  11. data/bin/setup +5 -0
  12. data/exe/gli +68 -0
  13. data/gli.gemspec +20 -24
  14. data/gli.rdoc +9 -9
  15. data/lib/gli/app.rb +31 -8
  16. data/lib/gli/app_support.rb +15 -3
  17. data/lib/gli/command.rb +24 -2
  18. data/lib/gli/command_finder.rb +42 -25
  19. data/lib/gli/command_support.rb +7 -6
  20. data/lib/gli/commands/doc.rb +9 -3
  21. data/lib/gli/commands/help.rb +2 -1
  22. data/lib/gli/commands/help_modules/arg_name_formatter.rb +2 -2
  23. data/lib/gli/commands/help_modules/command_help_format.rb +19 -1
  24. data/lib/gli/commands/help_modules/full_synopsis_formatter.rb +3 -2
  25. data/lib/gli/commands/help_modules/global_help_format.rb +1 -1
  26. data/lib/gli/commands/help_modules/options_formatter.rb +4 -6
  27. data/lib/gli/commands/initconfig.rb +3 -6
  28. data/lib/gli/commands/rdoc_document_listener.rb +2 -1
  29. data/lib/gli/commands/scaffold.rb +71 -142
  30. data/lib/gli/dsl.rb +2 -1
  31. data/lib/gli/flag.rb +23 -2
  32. data/lib/gli/gli_option_parser.rb +66 -15
  33. data/lib/gli/option_parser_factory.rb +9 -2
  34. data/lib/gli/options.rb +2 -2
  35. data/lib/gli/switch.rb +4 -0
  36. data/lib/gli/terminal.rb +6 -2
  37. data/lib/gli/version.rb +1 -1
  38. data/lib/gli.rb +1 -0
  39. data/object-model.dot +29 -0
  40. data/object-model.png +0 -0
  41. data/test/apps/todo/Gemfile +1 -1
  42. data/test/apps/todo/bin/todo +12 -6
  43. data/test/apps/todo/lib/todo/commands/create.rb +42 -41
  44. data/test/apps/todo/lib/todo/commands/list.rb +48 -36
  45. data/test/apps/todo/lib/todo/commands/ls.rb +25 -24
  46. data/test/apps/todo/lib/todo/commands/make.rb +42 -39
  47. data/test/apps/todo/todo.gemspec +1 -2
  48. data/test/apps/todo_legacy/todo.gemspec +1 -2
  49. data/test/apps/todo_plugins/commands/third.rb +2 -0
  50. data/test/integration/gli_cli_test.rb +69 -0
  51. data/test/integration/gli_powered_app_test.rb +52 -0
  52. data/test/integration/scaffold_test.rb +30 -0
  53. data/test/integration/test_helper.rb +52 -0
  54. data/test/unit/command_finder_test.rb +54 -0
  55. data/test/{tc_command.rb → unit/command_test.rb} +20 -7
  56. data/test/unit/compound_command_test.rb +17 -0
  57. data/test/{tc_doc.rb → unit/doc_test.rb} +38 -51
  58. data/test/{tc_flag.rb → unit/flag_test.rb} +19 -25
  59. data/test/{tc_gli.rb → unit/gli_test.rb} +78 -50
  60. data/test/{tc_help.rb → unit/help_test.rb} +54 -113
  61. data/test/{tc_options.rb → unit/options_test.rb} +4 -4
  62. data/test/unit/subcommand_parsing_test.rb +263 -0
  63. data/test/unit/subcommands_test.rb +245 -0
  64. data/test/{config.yaml → unit/support/gli_test_config.yml} +1 -0
  65. data/test/unit/switch_test.rb +49 -0
  66. data/test/{tc_terminal.rb → unit/terminal_test.rb} +28 -3
  67. data/test/unit/test_helper.rb +13 -0
  68. data/test/unit/verbatim_wrapper_test.rb +24 -0
  69. metadata +85 -141
  70. data/.ruby-gemset +0 -1
  71. data/.ruby-version +0 -1
  72. data/.travis.yml +0 -12
  73. data/ObjectModel.graffle +0 -1191
  74. data/bin/report_on_rake_results +0 -10
  75. data/bin/test_all_rubies.sh +0 -6
  76. data/features/gli_executable.feature +0 -90
  77. data/features/gli_init.feature +0 -232
  78. data/features/step_definitions/gli_executable_steps.rb +0 -18
  79. data/features/step_definitions/gli_init_steps.rb +0 -11
  80. data/features/step_definitions/todo_steps.rb +0 -100
  81. data/features/support/env.rb +0 -55
  82. data/features/todo.feature +0 -546
  83. data/features/todo_legacy.feature +0 -128
  84. data/test/option_test_helper.rb +0 -13
  85. data/test/tc_compound_command.rb +0 -22
  86. data/test/tc_subcommand_parsing.rb +0 -104
  87. data/test/tc_subcommands.rb +0 -259
  88. data/test/tc_switch.rb +0 -55
  89. data/test/tc_verbatim_wrapper.rb +0 -36
  90. data/test/test_helper.rb +0 -20
  91. /data/test/{init_simplecov.rb → unit/init_simplecov.rb} +0 -0
  92. /data/test/{fake_std_out.rb → unit/support/fake_std_out.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 362815ed2ee02ae4318a321eca52acb7175f802f
4
- data.tar.gz: 27dadfccc2e537d4ae9824cf1a75075020391d6c
2
+ SHA256:
3
+ metadata.gz: f99bcd6fc563c75307924a23694720c7a5a68d0957afbb7b25fb15e21257011c
4
+ data.tar.gz: 9e508b67d421593391c447f3778c90df01565f36e5db41cab83fce806bdc6417
5
5
  SHA512:
6
- metadata.gz: 261bf4ac97f86f4b2b1d68aba7cb7396da8c6e2651504dfd8ce1a736215cca382b723db02820165b69c71e74721b4ac4588c45cfcf7014596c80e1225845a504
7
- data.tar.gz: 4a12460017ee29eb4dd7f97111ee5cbb8b5112cd44db7dd933c7edc069b3f8053e0245417e4fa3ffaaeb108b4f85384ab2a86bf0483b7811ad52dbdafb9d6110
6
+ metadata.gz: bbfbd6572090c9a8b86ae7e165cbb3b12d5500fa3dda114bb1add6375ea32864e38b0857d29ba399deb3f45250d655ec61c6acb78d8c5bc9172c1e0eebfa0d20
7
+ data.tar.gz: 8ad9e606b644c9374a616cfd0d013ffc90909851d77f0b96fc366debb274e55698388e749756318db2437d23a640f4118459ada89b8d1ca1e035f507576611ff
@@ -0,0 +1,28 @@
1
+ version: 2.1
2
+ orbs:
3
+ # See https://circleci.com/developer/orbs/orb/circleci/ruby
4
+ ruby: circleci/ruby@1.1.2
5
+ jobs: # keyword
6
+ test: # my name for the job
7
+ parameters: # keyword
8
+ ruby-version: # my parameter name
9
+ type: string # type is a keyword
10
+ docker: # keyword
11
+ - image: cimg/base:stable
12
+ steps: # keyword
13
+ - checkout # magic name
14
+ - ruby/install: # ruby/ is from the orb name, install is a command in that orb
15
+ version: << parameters.ruby-version >> # magic nonsense for param subst (version param to the command)
16
+ - run:
17
+ command: "bin/setup"
18
+ - run:
19
+ command: "bin/ci"
20
+ workflows: # keyword
21
+ all-rubies: # my name for the workflow
22
+ jobs: # keyword
23
+ - test: # my name for the job
24
+ matrix: # keyword
25
+ parameters: # keyword
26
+ # All rubies being maintained per this page:
27
+ # https://www.ruby-lang.org/en/downloads/branches/
28
+ ruby-version: [ "2.5", "2.6", "2.7", "3.0" ]
data/.gitignore CHANGED
@@ -5,9 +5,9 @@ pkg
5
5
  coverage
6
6
  .bundle
7
7
  tmp
8
- cruddo.rdoc
9
- gli.wiki
10
8
  Gemfile.lock
9
+ *.gem
11
10
  results.html
12
- .rbx
13
11
  .DS_Store
12
+ Session.vim
13
+ scaffold_test
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 2.7.1
data/Gemfile CHANGED
@@ -2,7 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem "rcov", ">= 0.9.8", :platforms => :mri_18
6
5
  gem "simplecov", "~> 0.6.4", :platforms => :mri_19
7
6
  gem "psych", :platforms => :mri_19
8
-
data/README.rdoc CHANGED
@@ -1,16 +1,24 @@
1
- = Git-Like Interface Command Line Parser
1
+ = GLI, the Git-Like Interface Command Line Parser
2
2
 
3
- GLI is the best way to make a "command-suite" command-line application, e.g. one like <tt>git</tt> (for the best way to make a
4
- simpler command-line application, check out methadone[http://www.github.com/davetron5000/methadone]).
5
-
6
- GLI allows you to make a polished, easy-to-maintain command-line application without a lot
7
- of syntax, but without restricting you in any way from the power of +OptionParser+.
3
+ GLI allows you to create command-line app in Ruby that behaves like <tt>git</tt> in that it takes subcommands to perform a series of complex action, e.g. <tt>git remote add</tt>.
8
4
 
9
5
  * {Overview}[http://davetron5000.github.com/gli]
10
6
  * {Source on Github}[http://github.com/davetron5000/gli]
11
7
  * RDoc[http://davetron5000.github.com/gli/rdoc/index.html]
12
8
 
13
- {<img src="https://secure.travis-ci.org/davetron5000/gli.png?branch=gli-2" alt="Build Status" />}[https://travis-ci.org/davetron5000/gli]
9
+ {<img src="https://secure.travis-ci.org/davetron5000/gli.svg?branch=gli-2" alt="Build Status" />}[https://travis-ci.org/davetron5000/gli]
10
+
11
+ == What Problem does GLI Solve?
12
+
13
+ Creating a command-line app that uses subcommands, each of which might accept different command-line options, is somewhat difficult with Ruby's built-in <tt>OptionParser</tt>. GLI provides an API that wraps <tt>OptionParser</tt> so that you can create a subcommand-based command-line app with minimal boilerplate. This API also produces complete documentation for your command-line app.
14
+
15
+ == Why is GLI's solution different from others?
16
+
17
+ There are other RubyGems that allow you to create a command-line app that takes subcommands. These solutions are often quite limited (e.g. they don't allow deeply nested subcommand structures or sophisticated command-line options per subcommand), or require more code that we think is needed. Some solutions make it difficult or impossible to properly document your command-line app.
18
+
19
+ == What you need to know to use GLI
20
+
21
+ You should know Ruby, and have a basic understanding of how the UNIX command line works: standard input, standard output, standard error, and exit codes.
14
22
 
15
23
  == Use
16
24
 
@@ -18,15 +26,26 @@ Install if you need to:
18
26
 
19
27
  gem install gli
20
28
 
29
+ You can validate you have installed it correctly by running <tt>gli help</tt>. You should see formatted help output.
30
+
31
+ If you are using GLI in another application, add it to your <tt>Gemfile</tt>:
32
+
33
+ gem "gli"
34
+
35
+ You can test your install via Bundler by running <tt>bundle exec gli help</tt>. This should produce formatted help output from GLI.
36
+
37
+ == Getting Started
38
+
21
39
  The simplest way to get started is to create a scaffold project
22
40
 
23
41
  gli init todo list add complete
24
42
 
43
+ (note if you installed via Bundler you will need to execute <tt>bundle exec gli init todo list add complete</tt>)
44
+
25
45
  This will create a basic scaffold project in <tt>./todo</tt> with:
26
46
 
27
47
  * executable in <tt>./todo/bin/todo</tt>. This file demonstrates most of what you need to describe your command line interface.
28
48
  * an empty test in <tt>./todo/test/default_test.rb</tt> that can bootstrap your tests
29
- * an empty feature in <tt>./todo/features/todo.feature</tt> that can bootstrap testing your CLI via Aruba.
30
49
  * a gemspec shell
31
50
  * a README shell
32
51
  * Rakefile that can generate RDoc, package your Gem and run tests
@@ -73,18 +92,9 @@ Get a more detailed walkthrough on the {main site}[http://davetron5000.github.co
73
92
 
74
93
  == Supported Platforms
75
94
 
76
- Known to work on
77
-
78
- * 1.8.7
79
- * 1.9.2
80
- * 1.9.3
81
- * 2.0.0
82
- * 2.1.0
83
- * Ruby Enterprise Edition 1.8.7
84
- * Rubinius 1.0.1
85
- * JRuby 1.6.4
95
+ See `.circleci/config.yml` for the supported rubies, but general we're running tests on the all MRI rubies receiving support, which tends to be the most recent four versions.
86
96
 
87
- If you're interested in other versions of Ruby, let me know, and I'll add them to my test suite
97
+ GLI should work on older Rubies and JRuby, but it's too much work to keep tests passing for those.
88
98
 
89
99
  == Documentation
90
100
 
data/Rakefile CHANGED
@@ -3,8 +3,6 @@ require 'bundler'
3
3
  require 'rake/clean'
4
4
  require 'rake/testtask'
5
5
  require 'rdoc/task'
6
- require 'cucumber'
7
- require 'cucumber/rake/task'
8
6
 
9
7
  include Rake::DSL
10
8
 
@@ -75,48 +73,28 @@ end
75
73
 
76
74
  Bundler::GemHelper.install_tasks
77
75
 
78
- desc 'run unit tests'
79
- Rake::TestTask.new do |t|
76
+ desc "run unit tests"
77
+ Rake::TestTask.new("test:unit") do |t|
80
78
  t.libs << "test"
81
- t.test_files = FileList['test/init_simplecov.rb','test/tc_*.rb']
79
+ t.libs << "lib"
80
+ t.test_files = FileList["test/unit/**/*_test.rb"]
82
81
  end
83
82
 
84
- CUKE_RESULTS = 'results.html'
85
- CLEAN << CUKE_RESULTS
86
- Cucumber::Rake::Task.new(:features) do |t|
87
- opts = "features --format html -o #{CUKE_RESULTS} --format progress -x"
88
- opts += " --tags #{ENV['TAGS']}" if ENV['TAGS']
89
- t.cucumber_opts = opts
90
- t.fork = false
91
- end
92
- Cucumber::Rake::Task.new('features:wip') do |t|
93
- tag_opts = ' --tags ~@pending'
94
- tag_opts = ' --tags @wip'
95
- t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty -x -s#{tag_opts}"
96
- t.fork = false
97
- end
98
-
99
- begin
100
- require 'rcov/rcovtask'
101
- task :clobber_coverage do
102
- rm_rf "coverage"
83
+ desc "run integration tests"
84
+ Rake::TestTask.new("test:integration") do |t|
85
+ t.libs << "test"
86
+ explicitly_named_files = ARGV[1..-1]
87
+ if Array(explicitly_named_files).size == 0
88
+ t.test_files = FileList["test/integration/**/*_test.rb"]
89
+ else
90
+ t.test_files = explicitly_named_files
103
91
  end
92
+ end
104
93
 
105
- desc 'Measures test coverage'
106
- task :coverage => :rcov do
107
- puts "coverage/index.html contains what you need"
108
- end
109
94
 
110
- Rcov::RcovTask.new do |t|
111
- t.libs << 'lib'
112
- t.test_files = FileList['test/tc_*.rb']
113
- end
95
+ begin
96
+ require 'simplecov'
114
97
  rescue LoadError
115
- begin
116
- require 'simplecov'
117
- rescue LoadError
118
- $stderr.puts "neither rcov nor simplecov are installed; you won't be able to check code coverage"
119
- end
120
98
  end
121
99
 
122
100
  desc 'Publish rdoc on github pages and push to github'
data/bin/ci ADDED
@@ -0,0 +1,29 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+ if [ -z $1 ]; then
5
+ echo "[bin/ci] Running with default warnings"
6
+ export RUBYOPT=
7
+ else
8
+ if [ $1 == 'warnings' ]; then
9
+ echo "[bin/ci] Running with all warnings on"
10
+ export RUBYOPT=-w
11
+ else
12
+ if [ $1 == 'none' ]; then
13
+ echo "[bin/ci] Running with all warnings off"
14
+ export RUBYOPT='-W0'
15
+ else
16
+ echo "[bin/ci] '$1' is not a supported option"
17
+ echo "[bin/ci] usage: $0 # run with default warnings"
18
+ echo "[bin/ci] usage: $0 warnings # run with all warnings"
19
+ echo "[bin/ci] usage: $0 none # run with warnings disabled"
20
+ exit 1
21
+ fi
22
+ fi
23
+ fi
24
+
25
+ echo "[bin/ci] Running unit tests"
26
+ bin/rake test:unit
27
+
28
+ echo "[bin/ci] Running integration tests"
29
+ bin/rake test:integration
data/bin/gli CHANGED
@@ -1,59 +1,29 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- require 'gli'
4
- require 'gli/commands/scaffold'
5
-
6
- include GLI::App
7
-
8
- program_desc 'create scaffolding for a GLI-powered application'
9
-
10
- version GLI::VERSION
11
-
12
- switch :v, :desc => 'Be verbose'
13
-
14
- switch :n, :desc => 'Dry run; don''t change the disk'
15
-
16
- desc 'Root dir of project'
17
- long_desc <<EOS
18
- This is the directory where the project''s directory will be made, so if you
19
- specify a project name ''foo'' and the root dir of ''.'', the directory
20
- ''./foo'' will be created'
21
- EOS
22
-
23
- flag :r,:root, :default_value => '.'
24
-
25
- desc 'Create a new GLI-based project'
26
- long_desc <<EOS
27
- This will create a scaffold command line project that uses GLI
28
- for command line processing. Specifically, this will create
29
- an executable ready to go, as well as a lib and test directory, all
30
- inside the directory named for your project
31
- EOS
32
- arg_name 'project_name [command[ command]*]'
33
- command [:init,:scaffold] do |c|
34
-
35
- c.switch :e,:ext, :desc => 'Create an ext dir'
36
-
37
- c.switch :notest, :desc => 'Do not create a test or features dir', :negatable => false
38
-
39
- c.switch :force, :desc => 'Overwrite/ignore existing files and directories'
40
-
41
- c.switch :rvmrc, :desc => 'Create an .rvmrc based on your current RVM setup'
42
-
43
- c.action do |g,o,args|
44
- if args.length < 1
45
- raise 'You must specify the name of your project'
46
- end
47
- GLI::Commands::Scaffold.create_scaffold(g[:r],!o[:notest],o[:e],args[0],args[1..-1],o[:force],g[:n],o[:rvmrc])
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'gli' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
48
23
  end
49
24
  end
50
25
 
51
- pre do |global,command,options,args|
52
- puts "Executing #{command.name}" if global[:v]
53
- true
54
- end
26
+ require "rubygems"
27
+ require "bundler/setup"
55
28
 
56
- post do |global,command,options,args|
57
- puts "Executed #{command.name}" if global[:v]
58
- end
59
- exit run(ARGV)
29
+ load Gem.bin_path("gli", "gli")
data/bin/rake ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
data/bin/setup ADDED
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ bundle check || bundle install
data/exe/gli ADDED
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gli'
4
+ require 'gli/commands/scaffold'
5
+
6
+ class App
7
+ extend GLI::App
8
+
9
+ program_desc 'create scaffolding for a GLI-powered application'
10
+
11
+ version GLI::VERSION
12
+
13
+ # Can't use these without changing the current behavior of gli
14
+ # arguments :strict
15
+ # subcommand_option_handling :normal
16
+
17
+ switch :v, :desc => 'Be verbose'
18
+
19
+ switch :n, :desc => 'Dry run; don''t change the disk'
20
+
21
+ desc 'Root dir of project'
22
+ long_desc <<EOS
23
+ This is the directory where the project''s directory will be made, so if you
24
+ specify a project name ''foo'' and the root dir of ''.'', the directory
25
+ ''./foo'' will be created'
26
+ EOS
27
+
28
+ flag :r,:root, :default_value => '.'
29
+
30
+ desc 'Create a new GLI-based project'
31
+ long_desc <<EOS
32
+ This will create a scaffold command line project that uses GLI
33
+ for command line processing. Specifically, this will create
34
+ an executable ready to go, as well as a lib and test directory, all
35
+ inside the directory named for your project
36
+ EOS
37
+ arg :project_name
38
+ arg :command_name, [:optional, :multiple]
39
+ arg_name "project_name [command_name]..."
40
+ command [:init,:scaffold] do |c|
41
+
42
+ c.switch :e,:ext, :desc => 'Create an ext dir'
43
+
44
+ c.switch :notest, :desc => 'Do not create a test or features dir', :negatable => false
45
+
46
+ c.switch :force, :desc => 'Overwrite/ignore existing files and directories'
47
+
48
+ c.switch :rvmrc, :desc => 'Create an .rvmrc based on your current RVM setup'
49
+
50
+ c.action do |g,o,args|
51
+ if args.length < 1
52
+ raise 'You must specify the name of your project'
53
+ end
54
+ GLI::Commands::Scaffold.create_scaffold(g[:r],!o[:notest],o[:e],args[0],args[1..-1],o[:force],g[:n],o[:rvmrc])
55
+ end
56
+ end
57
+
58
+ pre do |global,command,options,args|
59
+ puts "Executing #{command.name}" if global[:v]
60
+ true
61
+ end
62
+
63
+ post do |global,command,options,args|
64
+ puts "Executed #{command.name}" if global[:v]
65
+ end
66
+ end
67
+
68
+ exit App.run(ARGV)
data/gli.gemspec CHANGED
@@ -1,34 +1,30 @@
1
1
  # Make sure we get the gli that's local
2
- require File.join([File.dirname(__FILE__),'lib','gli','version.rb'])
2
+ require File.join([File.dirname(__FILE__),"lib","gli","version.rb"])
3
3
 
4
- spec = Gem::Specification.new do |s|
5
- s.name = 'gli'
4
+ spec = Gem::Specification.new do |s|
5
+ s.name = "gli"
6
6
  s.version = GLI::VERSION
7
- s.author = 'David Copeland'
8
- s.email = 'davidcopeland@naildrivin5.com'
9
- s.homepage = 'http://davetron5000.github.com/gli'
7
+ s.licenses = ["Apache-2.0"]
8
+ s.author = "David Copeland"
9
+ s.email = "davidcopeland@naildrivin5.com"
10
+ s.homepage = "http://davetron5000.github.com/gli"
10
11
  s.platform = Gem::Platform::RUBY
11
- s.summary = 'Build command-suite CLI apps that are awesome.'
12
- s.description = 'Build command-suite CLI apps that are awesome. Bootstrap your app, add commands, options and documentation while maintaining a well-tested idiomatic command-line app'
12
+ s.summary = "Build command-suite CLI apps that are awesome."
13
+ s.description = "Build command-suite CLI apps that are awesome. Bootstrap your app, add commands, options and documentation while maintaining a well-tested idiomatic command-line app"
13
14
 
14
15
  s.files = `git ls-files`.split("\n")
15
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
- s.executables = 'gli'
17
17
  s.require_paths = ["lib"]
18
18
 
19
- s.has_rdoc = true
20
- s.extra_rdoc_files = ['README.rdoc', 'gli.rdoc']
21
- s.rdoc_options << '--title' << 'Git Like Interface' << '--main' << 'README.rdoc'
22
- s.bindir = 'bin'
23
- s.rubyforge_project = 'gli'
24
- s.add_development_dependency('rake', '~> 0.9.2.2')
25
- s.add_development_dependency('rdoc', '~> 3.11')
26
- s.add_development_dependency('rainbow', '~> 1.1.1')
27
- s.add_development_dependency('clean_test')
28
- s.add_development_dependency('cucumber', '1.2.3')
29
- s.add_development_dependency('gherkin', '<= 2.11.6')
30
- s.add_development_dependency('aruba', '0.5.1') # 0.5.3 randomly breaks with "LaunchError: no such file or directory" and only sometimes.
31
- s.add_development_dependency('sdoc')
32
- s.add_development_dependency('faker','1.0.0')
33
- end
19
+ s.extra_rdoc_files = ["README.rdoc", "gli.rdoc"]
20
+ s.rdoc_options << "--title" << "Git Like Interface" << "--main" << "README.rdoc"
21
+
22
+ s.bindir = "exe"
23
+ s.executables = "gli"
34
24
 
25
+ s.add_development_dependency("rake", "~> 0.9.2.2")
26
+ s.add_development_dependency("rdoc", "~> 4.2")
27
+ s.add_development_dependency("rainbow", "~> 1.1", "~> 1.1.1")
28
+ s.add_development_dependency("sdoc", "~> 0.4")
29
+ s.add_development_dependency("minitest")
30
+ end
data/gli.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  == gli - create scaffolding for a GLI-powered application
2
2
 
3
- v2.2.1
3
+ v2.19.2
4
4
 
5
5
  === Global Options
6
6
  === -r|--root arg
@@ -8,9 +8,9 @@ v2.2.1
8
8
  Root dir of project
9
9
 
10
10
  [Default Value] .
11
- This is the directory where the project''s directory will be made, so if you
12
- specify a project name ''foo'' and the root dir of ''.'', the directory
13
- ''./foo'' will be created'
11
+ This is the directory where the project''s directory will be made, so if you
12
+ specify a project name ''foo'' and the root dir of ''.'', the directory
13
+ ''./foo'' will be created'
14
14
 
15
15
  === --help
16
16
  Show this message
@@ -28,7 +28,7 @@ Be verbose
28
28
 
29
29
 
30
30
  === --version
31
-
31
+ Display the program version
32
32
 
33
33
 
34
34
 
@@ -43,13 +43,13 @@ List commands one per line, to assist with shell completion
43
43
 
44
44
 
45
45
 
46
- ==== Command: <tt>init|scaffold project_name [command[ command]*]</tt>
46
+ ==== Command: <tt>init|scaffold project_name [command_name]...</tt>
47
47
  Create a new GLI-based project
48
48
 
49
49
  This will create a scaffold command line project that uses GLI
50
- for command line processing. Specifically, this will create
51
- an executable ready to go, as well as a lib and test directory, all
52
- inside the directory named for your project
50
+ for command line processing. Specifically, this will create
51
+ an executable ready to go, as well as a lib and test directory, all
52
+ inside the directory named for your project
53
53
  ===== Options
54
54
  ===== -e|--[no-]ext
55
55
  Create an ext dir
data/lib/gli/app.rb CHANGED
@@ -30,7 +30,7 @@ module GLI
30
30
  # # loads *.rb files from the user's home dir - great and an extension/plugin mechanism
31
31
  # commands_from File.join(ENV["HOME"],".my_app","plugins")
32
32
  def commands_from(path)
33
- if Pathname.new(path).absolute? and File.exists?(path)
33
+ if Pathname.new(path).absolute? and File.exist?(path)
34
34
  load_commands(path)
35
35
  else
36
36
  $LOAD_PATH.each do |load_path|
@@ -94,7 +94,7 @@ module GLI
94
94
  @skips_around = true
95
95
  end
96
96
 
97
- # Sets that this app uses a config file as well as the name of the config file.
97
+ # Sets that this app uses a config file as well as the name of the config file.
98
98
  #
99
99
  # +filename+:: A String representing the path to the file to use for the config file. If it's an absolute
100
100
  # path, this is treated as the path to the file. If it's *not*, it's treated as relative to the user's home
@@ -152,7 +152,7 @@ module GLI
152
152
  # Define a block to run if an error occurs.
153
153
  # The block will receive any Exception that was caught.
154
154
  # It should evaluate to false to avoid the built-in error handling (which basically just
155
- # prints out a message). GLI uses a variety of exceptions that you can use to find out what
155
+ # prints out a message). GLI uses a variety of exceptions that you can use to find out what
156
156
  # errors might've occurred during command-line parsing:
157
157
  # * GLI::CustomExit
158
158
  # * GLI::UnknownCommandArgument
@@ -165,7 +165,7 @@ module GLI
165
165
 
166
166
  # Indicate the version of your application
167
167
  #
168
- # +version+:: String containing the version of your application.
168
+ # +version+:: String containing the version of your application.
169
169
  def version(version)
170
170
  @version = version
171
171
  desc 'Display the program version'
@@ -191,7 +191,7 @@ module GLI
191
191
  end
192
192
 
193
193
  # Configure a type conversion not already provided by the underlying OptionParser.
194
- # This works more or less like the OptionParser version.
194
+ # This works more or less like the OptionParser version. It's global.
195
195
  #
196
196
  # object:: the class (or whatever) that triggers the type conversion
197
197
  # block:: the block that will be given the string argument and is expected
@@ -201,7 +201,7 @@ module GLI
201
201
  #
202
202
  # accept(Hash) do |value|
203
203
  # result = {}
204
- # value.split(/,/) do |pair|
204
+ # value.split(/,/).each do |pair|
205
205
  # k,v = pair.split(/:/)
206
206
  # result[k] = v
207
207
  # end
@@ -213,7 +213,7 @@ module GLI
213
213
  accepts[object] = block
214
214
  end
215
215
 
216
- # Simpler means of exiting with a custom exit code. This will
216
+ # Simpler means of exiting with a custom exit code. This will
217
217
  # raise a CustomExit with the given message and exit code, which will ultimatley
218
218
  # cause your application to exit with the given exit_code as its exit status
219
219
  # Use #help_now! if you want to show the help in addition to the error message
@@ -291,10 +291,33 @@ module GLI
291
291
  @subcommand_option_handling_strategy = handling_strategy
292
292
  end
293
293
 
294
+ # How to handle argument validation.
295
+ #
296
+ # handling_strategy:: One of:
297
+ # +:loose+:: no argument validation. Use of `arg` or `arg_name` is for documentation purposes only. (Default)
298
+ # +:strict+:: arguments are validated according to their specification. +action+ blocks may assume
299
+ # the value of `arguments` matches the specification provided in `arg`. Note that to use
300
+ # this strategy, you must also be sure that +subcommand_option_handling+ is set.
301
+ def arguments(handling_strategy)
302
+ @argument_handling_strategy = handling_strategy
303
+ end
304
+
305
+
306
+ # Enables/Disables command autocomplete, where partially spelled commands are automatically expanded to their full form
307
+ #
308
+ # Example:
309
+ # When enabled, executing 'shake' would execute 'shake_hand' (if no 'shake' command is defined).
310
+ # When disabled, executing 'shake' would throw an UnknownCommand error
311
+ #
312
+ # +boolean+:: Boolean value to enable or disable autocomplete, respectively. True by default.
313
+ def autocomplete_commands(boolean)
314
+ @autocomplete = boolean
315
+ end
316
+
294
317
  private
295
318
 
296
319
  def load_commands(path)
297
- if File.exists? path
320
+ if File.exist? path
298
321
  Dir.entries(path).sort.each do |entry|
299
322
  file = File.join(path,entry)
300
323
  if file =~ /\.rb$/