gli 2.18.1 → 2.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +28 -0
  3. data/.gitignore +1 -3
  4. data/.tool-versions +1 -1
  5. data/Gemfile +0 -6
  6. data/README.rdoc +28 -18
  7. data/Rakefile +15 -37
  8. data/bin/ci +29 -0
  9. data/bin/gli +25 -64
  10. data/bin/rake +29 -0
  11. data/bin/setup +5 -0
  12. data/exe/gli +68 -0
  13. data/gli.gemspec +19 -22
  14. data/gli.rdoc +2 -2
  15. data/lib/gli/command_support.rb +2 -6
  16. data/lib/gli/commands/help_modules/arg_name_formatter.rb +2 -2
  17. data/lib/gli/commands/help_modules/command_help_format.rb +1 -1
  18. data/lib/gli/commands/help_modules/global_help_format.rb +1 -1
  19. data/lib/gli/commands/scaffold.rb +18 -93
  20. data/lib/gli/dsl.rb +1 -1
  21. data/lib/gli/options.rb +2 -2
  22. data/lib/gli/version.rb +1 -1
  23. data/object-model.dot +29 -0
  24. data/object-model.png +0 -0
  25. data/test/apps/todo/Gemfile +1 -1
  26. data/test/apps/todo/bin/todo +1 -1
  27. data/test/integration/gli_cli_test.rb +69 -0
  28. data/test/integration/gli_powered_app_test.rb +52 -0
  29. data/test/integration/scaffold_test.rb +30 -0
  30. data/test/integration/test_helper.rb +52 -0
  31. data/test/{tc_command_finder.rb → unit/command_finder_test.rb} +6 -6
  32. data/test/{tc_command.rb → unit/command_test.rb} +4 -4
  33. data/test/unit/compound_command_test.rb +17 -0
  34. data/test/{tc_doc.rb → unit/doc_test.rb} +38 -51
  35. data/test/{tc_flag.rb → unit/flag_test.rb} +19 -25
  36. data/test/{tc_gli.rb → unit/gli_test.rb} +28 -47
  37. data/test/{tc_help.rb → unit/help_test.rb} +48 -107
  38. data/test/{init_simplecov.rb → unit/init_simplecov.rb} +0 -0
  39. data/test/{tc_options.rb → unit/options_test.rb} +4 -4
  40. data/test/unit/subcommand_parsing_test.rb +263 -0
  41. data/test/unit/subcommands_test.rb +245 -0
  42. data/test/{fake_std_out.rb → unit/support/fake_std_out.rb} +0 -0
  43. data/test/{config.yaml → unit/support/gli_test_config.yml} +0 -0
  44. data/test/unit/switch_test.rb +49 -0
  45. data/test/{tc_terminal.rb → unit/terminal_test.rb} +4 -3
  46. data/test/unit/test_helper.rb +13 -0
  47. data/test/unit/verbatim_wrapper_test.rb +24 -0
  48. metadata +61 -126
  49. data/.ruby-gemset +0 -1
  50. data/.ruby-version +0 -1
  51. data/.travis.yml +0 -11
  52. data/ObjectModel.graffle +0 -1191
  53. data/bin/report_on_rake_results +0 -10
  54. data/bin/test_all_rubies.sh +0 -6
  55. data/features/gli_executable.feature +0 -90
  56. data/features/gli_init.feature +0 -234
  57. data/features/step_definitions/gli_executable_steps.rb +0 -18
  58. data/features/step_definitions/gli_init_steps.rb +0 -11
  59. data/features/step_definitions/todo_steps.rb +0 -100
  60. data/features/support/env.rb +0 -54
  61. data/features/todo.feature +0 -579
  62. data/features/todo_legacy.feature +0 -130
  63. data/test/option_test_helper.rb +0 -13
  64. data/test/tc_compound_command.rb +0 -22
  65. data/test/tc_subcommand_parsing.rb +0 -280
  66. data/test/tc_subcommands.rb +0 -259
  67. data/test/tc_switch.rb +0 -55
  68. data/test/tc_verbatim_wrapper.rb +0 -36
  69. data/test/test_helper.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5687d6e6cfea1165eba186bdee08325eaa1588d21e7d0ef5b0aa283a6fcb79ab
4
- data.tar.gz: 3f157eef5e5e3d8fe7137adb71ec1885e723705574a87229bbf34fd2b46ecfb8
3
+ metadata.gz: f99bcd6fc563c75307924a23694720c7a5a68d0957afbb7b25fb15e21257011c
4
+ data.tar.gz: 9e508b67d421593391c447f3778c90df01565f36e5db41cab83fce806bdc6417
5
5
  SHA512:
6
- metadata.gz: 071cd902d777a38f668edbbe0d71814d56d727b9238b0e40e6601fe35e50f29bf7f9ab382a073a21dc17801d4351ea1379f2d0467148bbbd885e5ef5a5dd3fb1
7
- data.tar.gz: 45b16d82f3410716380cda524b631fdf38b44ce702c7a2f92ded226a42932eeff274b8afbf9e735a40bc515add4328ad940f22b82e98c61634f51b8cf73de0fd
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,11 +5,9 @@ pkg
5
5
  coverage
6
6
  .bundle
7
7
  tmp
8
- cruddo.rdoc
9
- gli.wiki
10
8
  Gemfile.lock
11
9
  *.gem
12
10
  results.html
13
- .rbx
14
11
  .DS_Store
15
12
  Session.vim
13
+ scaffold_test
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 2.6.3
1
+ ruby 2.7.1
data/Gemfile CHANGED
@@ -2,11 +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
-
9
- major,minor = RUBY_VERSION.split(/\./)
10
- if major.to_i >=2 && minor.to_i >= 2
11
- gem "test-unit"
12
- end
data/README.rdoc CHANGED
@@ -1,10 +1,6 @@
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]
@@ -12,21 +8,44 @@ of syntax, but without restricting you in any way from the power of +OptionParse
12
8
 
13
9
  {<img src="https://secure.travis-ci.org/davetron5000/gli.svg?branch=gli-2" alt="Build Status" />}[https://travis-ci.org/davetron5000/gli]
14
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.
22
+
15
23
  == Use
16
24
 
17
25
  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
- Tests should be passing supported MRI Rubies (see +.travis.yml+ for specifics).
77
-
78
- Due to the vagaries of Travis, I can't keep the test suite running on unsupported Rubies, but we currently support:
79
-
80
- * 2.1
81
- * 2.2
82
- * 2.3
83
- * 2.4
84
- * JRuby
85
-
86
- GLI likely works on older rubies, but the cost of keeping tests passing on those versions (which are now totally unsupported by Ruby core) is too high.
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.
87
96
 
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,68 +1,29 @@
1
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][, [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]
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.")
65
23
  end
66
24
  end
67
25
 
68
- exit App.run(ARGV)
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
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)