gli 2.9.0 → 2.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +28 -0
- data/.gitignore +3 -3
- data/.tool-versions +1 -0
- data/Gemfile +0 -2
- data/README.rdoc +29 -18
- data/Rakefile +15 -37
- data/bin/ci +29 -0
- data/bin/gli +24 -54
- data/bin/rake +29 -0
- data/bin/setup +5 -0
- data/exe/gli +68 -0
- data/gli.gemspec +20 -24
- data/gli.rdoc +9 -9
- data/lib/gli/app.rb +42 -8
- data/lib/gli/app_support.rb +17 -5
- data/lib/gli/argument.rb +20 -0
- data/lib/gli/command.rb +27 -2
- data/lib/gli/command_finder.rb +42 -25
- data/lib/gli/command_support.rb +13 -7
- data/lib/gli/commands/doc.rb +9 -3
- data/lib/gli/commands/help.rb +2 -1
- data/lib/gli/commands/help_modules/arg_name_formatter.rb +29 -2
- data/lib/gli/commands/help_modules/command_help_format.rb +19 -1
- data/lib/gli/commands/help_modules/full_synopsis_formatter.rb +5 -4
- data/lib/gli/commands/help_modules/global_help_format.rb +1 -1
- data/lib/gli/commands/help_modules/options_formatter.rb +4 -6
- data/lib/gli/commands/initconfig.rb +3 -6
- data/lib/gli/commands/rdoc_document_listener.rb +2 -1
- data/lib/gli/commands/scaffold.rb +71 -142
- data/lib/gli/dsl.rb +25 -1
- data/lib/gli/exceptions.rb +26 -0
- data/lib/gli/flag.rb +23 -2
- data/lib/gli/gli_option_parser.rb +73 -21
- data/lib/gli/option_parser_factory.rb +10 -3
- data/lib/gli/options.rb +2 -2
- data/lib/gli/switch.rb +4 -0
- data/lib/gli/terminal.rb +6 -2
- data/lib/gli/version.rb +1 -1
- data/lib/gli.rb +2 -0
- data/object-model.dot +29 -0
- data/object-model.png +0 -0
- data/test/apps/todo/Gemfile +1 -1
- data/test/apps/todo/bin/todo +16 -6
- data/test/apps/todo/lib/todo/commands/create.rb +48 -18
- data/test/apps/todo/lib/todo/commands/list.rb +48 -35
- data/test/apps/todo/lib/todo/commands/ls.rb +25 -24
- data/test/apps/todo/lib/todo/commands/make.rb +42 -39
- data/test/apps/todo/todo.gemspec +1 -2
- data/test/apps/todo_legacy/todo.gemspec +1 -2
- data/test/apps/todo_plugins/commands/third.rb +2 -0
- data/test/integration/gli_cli_test.rb +69 -0
- data/test/integration/gli_powered_app_test.rb +52 -0
- data/test/integration/scaffold_test.rb +30 -0
- data/test/integration/test_helper.rb +52 -0
- data/test/unit/command_finder_test.rb +54 -0
- data/test/{tc_command.rb → unit/command_test.rb} +20 -7
- data/test/unit/compound_command_test.rb +17 -0
- data/test/{tc_doc.rb → unit/doc_test.rb} +38 -51
- data/test/{tc_flag.rb → unit/flag_test.rb} +19 -25
- data/test/{tc_gli.rb → unit/gli_test.rb} +92 -49
- data/test/{tc_help.rb → unit/help_test.rb} +54 -113
- data/test/{init_simplecov.rb → unit/init_simplecov.rb} +0 -0
- data/test/{tc_options.rb → unit/options_test.rb} +4 -4
- data/test/unit/subcommand_parsing_test.rb +263 -0
- data/test/unit/subcommands_test.rb +245 -0
- data/test/{fake_std_out.rb → unit/support/fake_std_out.rb} +0 -0
- data/test/{config.yaml → unit/support/gli_test_config.yml} +1 -0
- data/test/unit/switch_test.rb +49 -0
- data/test/{tc_terminal.rb → unit/terminal_test.rb} +28 -3
- data/test/unit/test_helper.rb +13 -0
- data/test/unit/verbatim_wrapper_test.rb +24 -0
- metadata +86 -141
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -12
- data/ObjectModel.graffle +0 -1191
- data/bin/report_on_rake_results +0 -10
- data/bin/test_all_rubies.sh +0 -6
- data/features/gli_executable.feature +0 -90
- data/features/gli_init.feature +0 -232
- data/features/step_definitions/gli_executable_steps.rb +0 -18
- data/features/step_definitions/gli_init_steps.rb +0 -11
- data/features/step_definitions/todo_steps.rb +0 -96
- data/features/support/env.rb +0 -54
- data/features/todo.feature +0 -449
- data/features/todo_legacy.feature +0 -128
- data/test/option_test_helper.rb +0 -13
- data/test/tc_compound_command.rb +0 -22
- data/test/tc_subcommand_parsing.rb +0 -104
- data/test/tc_subcommands.rb +0 -259
- data/test/tc_switch.rb +0 -55
- data/test/tc_verbatim_wrapper.rb +0 -36
- data/test/test_helper.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f99bcd6fc563c75307924a23694720c7a5a68d0957afbb7b25fb15e21257011c
|
4
|
+
data.tar.gz: 9e508b67d421593391c447f3778c90df01565f36e5db41cab83fce806bdc6417
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
data/.tool-versions
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby 2.7.1
|
data/Gemfile
CHANGED
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
|
4
|
-
simpler command-line application, check out methadone[http://www.github.com/davetron5000/methadone]).
|
5
|
-
|
6
|
-
GLI allows you to make a very 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.
|
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,17 +92,9 @@ Get a more detailed walkthrough on the {main site}[http://davetron5000.github.co
|
|
73
92
|
|
74
93
|
== Supported Platforms
|
75
94
|
|
76
|
-
|
77
|
-
|
78
|
-
* 1.8.7
|
79
|
-
* 1.9.2
|
80
|
-
* 1.9.3
|
81
|
-
* 2.0.0
|
82
|
-
* Ruby Enterprise Edition 1.8.7
|
83
|
-
* Rubinius 1.0.1
|
84
|
-
* 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.
|
85
96
|
|
86
|
-
|
97
|
+
GLI should work on older Rubies and JRuby, but it's too much work to keep tests passing for those.
|
87
98
|
|
88
99
|
== Documentation
|
89
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
|
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.
|
79
|
+
t.libs << "lib"
|
80
|
+
t.test_files = FileList["test/unit/**/*_test.rb"]
|
82
81
|
end
|
83
82
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
-
|
111
|
-
|
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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
52
|
-
|
53
|
-
true
|
54
|
-
end
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
55
28
|
|
56
|
-
|
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
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__),
|
2
|
+
require File.join([File.dirname(__FILE__),"lib","gli","version.rb"])
|
3
3
|
|
4
|
-
spec = Gem::Specification.new do |s|
|
5
|
-
s.name =
|
4
|
+
spec = Gem::Specification.new do |s|
|
5
|
+
s.name = "gli"
|
6
6
|
s.version = GLI::VERSION
|
7
|
-
s.
|
8
|
-
s.
|
9
|
-
s.
|
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 =
|
12
|
-
s.description =
|
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.
|
20
|
-
s.
|
21
|
-
|
22
|
-
s.bindir
|
23
|
-
s.
|
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
|
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 [
|
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.
|
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|
|
@@ -62,6 +62,17 @@ module GLI
|
|
62
62
|
@program_long_desc
|
63
63
|
end
|
64
64
|
|
65
|
+
# Provide a flag to choose whether to hide or not from the help the undescribed commands.
|
66
|
+
# By default the undescribed commands will be shown in the help.
|
67
|
+
#
|
68
|
+
# hide:: A Bool for hide the undescribed commands
|
69
|
+
def hide_commands_without_desc(hide=nil)
|
70
|
+
unless hide.nil?
|
71
|
+
@hide_commands_without_desc = hide
|
72
|
+
end
|
73
|
+
@hide_commands_without_desc || false
|
74
|
+
end
|
75
|
+
|
65
76
|
# Use this if the following command should not have the pre block executed.
|
66
77
|
# By default, the pre block is executed before each command and can result in
|
67
78
|
# aborting the call. Using this will avoid that behavior for the following command
|
@@ -83,7 +94,7 @@ module GLI
|
|
83
94
|
@skips_around = true
|
84
95
|
end
|
85
96
|
|
86
|
-
# 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.
|
87
98
|
#
|
88
99
|
# +filename+:: A String representing the path to the file to use for the config file. If it's an absolute
|
89
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
|
@@ -141,7 +152,7 @@ module GLI
|
|
141
152
|
# Define a block to run if an error occurs.
|
142
153
|
# The block will receive any Exception that was caught.
|
143
154
|
# It should evaluate to false to avoid the built-in error handling (which basically just
|
144
|
-
# 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
|
145
156
|
# errors might've occurred during command-line parsing:
|
146
157
|
# * GLI::CustomExit
|
147
158
|
# * GLI::UnknownCommandArgument
|
@@ -154,7 +165,7 @@ module GLI
|
|
154
165
|
|
155
166
|
# Indicate the version of your application
|
156
167
|
#
|
157
|
-
# +version+:: String containing the version of your application.
|
168
|
+
# +version+:: String containing the version of your application.
|
158
169
|
def version(version)
|
159
170
|
@version = version
|
160
171
|
desc 'Display the program version'
|
@@ -180,7 +191,7 @@ module GLI
|
|
180
191
|
end
|
181
192
|
|
182
193
|
# Configure a type conversion not already provided by the underlying OptionParser.
|
183
|
-
# This works more or less like the OptionParser version.
|
194
|
+
# This works more or less like the OptionParser version. It's global.
|
184
195
|
#
|
185
196
|
# object:: the class (or whatever) that triggers the type conversion
|
186
197
|
# block:: the block that will be given the string argument and is expected
|
@@ -190,7 +201,7 @@ module GLI
|
|
190
201
|
#
|
191
202
|
# accept(Hash) do |value|
|
192
203
|
# result = {}
|
193
|
-
# value.split(/,/) do |pair|
|
204
|
+
# value.split(/,/).each do |pair|
|
194
205
|
# k,v = pair.split(/:/)
|
195
206
|
# result[k] = v
|
196
207
|
# end
|
@@ -202,7 +213,7 @@ module GLI
|
|
202
213
|
accepts[object] = block
|
203
214
|
end
|
204
215
|
|
205
|
-
# Simpler means of exiting with a custom exit code. This will
|
216
|
+
# Simpler means of exiting with a custom exit code. This will
|
206
217
|
# raise a CustomExit with the given message and exit code, which will ultimatley
|
207
218
|
# cause your application to exit with the given exit_code as its exit status
|
208
219
|
# Use #help_now! if you want to show the help in addition to the error message
|
@@ -280,10 +291,33 @@ module GLI
|
|
280
291
|
@subcommand_option_handling_strategy = handling_strategy
|
281
292
|
end
|
282
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
|
+
|
283
317
|
private
|
284
318
|
|
285
319
|
def load_commands(path)
|
286
|
-
if File.
|
320
|
+
if File.exist? path
|
287
321
|
Dir.entries(path).sort.each do |entry|
|
288
322
|
file = File.join(path,entry)
|
289
323
|
if file =~ /\.rb$/
|