command_kit 0.1.0.pre1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +15 -0
- data/.rubocop.yml +138 -0
- data/ChangeLog.md +34 -2
- data/Gemfile +3 -0
- data/README.md +135 -214
- data/Rakefile +3 -2
- data/command_kit.gemspec +4 -4
- data/examples/colors.rb +30 -0
- data/examples/command.rb +65 -0
- data/examples/pager.rb +30 -0
- data/gemspec.yml +10 -2
- data/lib/command_kit/arguments/argument.rb +16 -44
- data/lib/command_kit/arguments/argument_value.rb +3 -30
- data/lib/command_kit/arguments.rb +66 -20
- data/lib/command_kit/colors.rb +253 -45
- data/lib/command_kit/command.rb +50 -3
- data/lib/command_kit/command_name.rb +9 -0
- data/lib/command_kit/commands/auto_load/subcommand.rb +3 -0
- data/lib/command_kit/commands/auto_load.rb +16 -0
- data/lib/command_kit/commands/auto_require.rb +16 -0
- data/lib/command_kit/commands/command.rb +3 -0
- data/lib/command_kit/commands/help.rb +2 -0
- data/lib/command_kit/commands/parent_command.rb +7 -0
- data/lib/command_kit/commands/subcommand.rb +15 -0
- data/lib/command_kit/commands.rb +40 -4
- data/lib/command_kit/description.rb +15 -2
- data/lib/command_kit/env/home.rb +9 -0
- data/lib/command_kit/env/path.rb +15 -0
- data/lib/command_kit/env.rb +4 -0
- data/lib/command_kit/examples.rb +15 -2
- data/lib/command_kit/exception_handler.rb +4 -0
- data/lib/command_kit/help/man.rb +74 -47
- data/lib/command_kit/help.rb +10 -1
- data/lib/command_kit/inflector.rb +49 -17
- data/lib/command_kit/interactive.rb +239 -0
- data/lib/command_kit/main.rb +20 -9
- data/lib/command_kit/man.rb +44 -0
- data/lib/command_kit/open_app.rb +69 -0
- data/lib/command_kit/options/option.rb +36 -9
- data/lib/command_kit/options/option_value.rb +42 -3
- data/lib/command_kit/options/parser.rb +44 -17
- data/lib/command_kit/options/quiet.rb +3 -0
- data/lib/command_kit/options/verbose.rb +5 -0
- data/lib/command_kit/options/version.rb +6 -0
- data/lib/command_kit/options.rb +59 -10
- data/lib/command_kit/os/linux.rb +157 -0
- data/lib/command_kit/os.rb +165 -11
- data/lib/command_kit/package_manager.rb +200 -0
- data/lib/command_kit/pager.rb +84 -9
- data/lib/command_kit/printing/indent.rb +25 -2
- data/lib/command_kit/printing.rb +23 -0
- data/lib/command_kit/program_name.rb +7 -0
- data/lib/command_kit/stdio.rb +24 -0
- data/lib/command_kit/sudo.rb +40 -0
- data/lib/command_kit/terminal.rb +159 -0
- data/lib/command_kit/usage.rb +14 -0
- data/lib/command_kit/version.rb +1 -1
- data/lib/command_kit/xdg.rb +21 -1
- data/lib/command_kit.rb +1 -0
- data/spec/arguments/argument_spec.rb +5 -41
- data/spec/arguments/argument_value_spec.rb +1 -61
- data/spec/arguments_spec.rb +8 -25
- data/spec/colors_spec.rb +277 -13
- data/spec/command_name_spec.rb +1 -1
- data/spec/command_spec.rb +4 -1
- data/spec/commands/auto_load/subcommand_spec.rb +1 -1
- data/spec/commands/auto_load_spec.rb +1 -1
- data/spec/commands/auto_require_spec.rb +2 -2
- data/spec/commands/help_spec.rb +1 -1
- data/spec/commands/parent_command_spec.rb +1 -1
- data/spec/commands/subcommand_spec.rb +1 -1
- data/spec/commands_spec.rb +2 -2
- data/spec/description_spec.rb +1 -25
- data/spec/env/home_spec.rb +1 -1
- data/spec/env/path_spec.rb +1 -1
- data/spec/examples_spec.rb +1 -25
- data/spec/exception_handler_spec.rb +1 -1
- data/spec/help/man_spec.rb +316 -0
- data/spec/help_spec.rb +0 -25
- data/spec/inflector_spec.rb +71 -9
- data/spec/interactive_spec.rb +415 -0
- data/spec/main_spec.rb +7 -7
- data/spec/man_spec.rb +46 -0
- data/spec/open_app_spec.rb +85 -0
- data/spec/options/option_spec.rb +48 -9
- data/spec/options/option_value_spec.rb +53 -4
- data/spec/options_spec.rb +1 -1
- data/spec/os/linux_spec.rb +154 -0
- data/spec/os_spec.rb +201 -14
- data/spec/package_manager_spec.rb +806 -0
- data/spec/pager_spec.rb +78 -15
- data/spec/printing/indent_spec.rb +1 -1
- data/spec/printing_spec.rb +10 -2
- data/spec/program_name_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -3
- data/spec/sudo_spec.rb +51 -0
- data/spec/{console_spec.rb → terminal_spec.rb} +65 -35
- data/spec/usage_spec.rb +2 -2
- data/spec/xdg_spec.rb +1 -1
- metadata +32 -13
- data/lib/command_kit/arguments/usage.rb +0 -6
- data/lib/command_kit/console.rb +0 -141
- data/lib/command_kit/options/usage.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5dc00be598fd9cee093dbfaf32a03118897179587d4dc17c97fdde2b020d3ac7
|
4
|
+
data.tar.gz: 88e498fa844b4db50dc194f6ec474d7c85bbea1619bf1340e6d2abfc4c13c0b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fd2683d7d3fb3f4c1258019d209b9f8ca348b0fc71c21c9f292b6799502dcfbc39d8f5ff8e50d54b822aaf229eedd85c3e151bea0f9c92d13dc08bb5b6d947e
|
7
|
+
data.tar.gz: 4276756c0495b2583303c9db090cd0e1221681d7eb357b34d4078a7e59167695f3250552c58ff0be24ee27535fb49ab2ce15d8e0711ee44cebbb93a52f6dfac0
|
data/.github/workflows/ruby.yml
CHANGED
@@ -3,6 +3,7 @@ name: CI
|
|
3
3
|
on: [ push, pull_request ]
|
4
4
|
|
5
5
|
jobs:
|
6
|
+
# run tests
|
6
7
|
tests:
|
7
8
|
runs-on: ubuntu-latest
|
8
9
|
strategy:
|
@@ -27,3 +28,17 @@ jobs:
|
|
27
28
|
run: bundle install --jobs 4 --retry 3
|
28
29
|
- name: Run tests
|
29
30
|
run: bundle exec rake test
|
31
|
+
|
32
|
+
# rubocop linting
|
33
|
+
rubocop:
|
34
|
+
runs-on: ubuntu-latest
|
35
|
+
steps:
|
36
|
+
- uses: actions/checkout@v2
|
37
|
+
- name: Set up Ruby
|
38
|
+
uses: ruby/setup-ruby@v1
|
39
|
+
with:
|
40
|
+
ruby-version: 2.7
|
41
|
+
- name: Install dependencies
|
42
|
+
run: bundle install --jobs 4 --retry 3
|
43
|
+
- name: Run rubocop
|
44
|
+
run: bundle exec rubocop --parallel
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
AllCops:
|
2
|
+
NewCops: enable
|
3
|
+
SuggestExtensions: false
|
4
|
+
TargetRubyVersion: 2.7
|
5
|
+
|
6
|
+
#
|
7
|
+
# our rules
|
8
|
+
#
|
9
|
+
|
10
|
+
Layout/FirstArrayElementIndentation: { EnforcedStyle: consistent }
|
11
|
+
Layout/LineLength: { Enabled: false }
|
12
|
+
Layout/SpaceAroundEqualsInParameterDefault: { EnforcedStyle: no_space }
|
13
|
+
Lint/ConstantDefinitionInBlock: { Exclude: ['spec/**/*'] }
|
14
|
+
Metrics: { Enabled: false }
|
15
|
+
Style/SymbolArray: { EnforcedStyle: brackets }
|
16
|
+
Style/IfInsideElse: { Enabled: false } # Offense count: 1
|
17
|
+
Style/PercentLiteralDelimiters:
|
18
|
+
Enabled: true
|
19
|
+
PreferredDelimiters:
|
20
|
+
default: '{}'
|
21
|
+
'%i': '[]'
|
22
|
+
'%I': '[]'
|
23
|
+
'%w': '[]'
|
24
|
+
'%W': '[]'
|
25
|
+
|
26
|
+
#
|
27
|
+
# rules that are in flux
|
28
|
+
#
|
29
|
+
|
30
|
+
# consider enabling these and autocorrecting?
|
31
|
+
# Layout/SpaceAfterComma
|
32
|
+
# Layout/SpaceAroundKeyword
|
33
|
+
# Layout/SpaceBeforeComma
|
34
|
+
# Layout/SpaceInsideHashLiteralBraces
|
35
|
+
# Layout/SpaceInsideParens
|
36
|
+
# Layout/TrailingWhitespace
|
37
|
+
# Lint/UnreachableLoop
|
38
|
+
# Lint/UnusedBlockArgument
|
39
|
+
# Style/ClassCheck
|
40
|
+
# Style/Documentation
|
41
|
+
# Style/ExpandPathArguments
|
42
|
+
# Style/GlobalStdStream
|
43
|
+
# Style/HashSyntax
|
44
|
+
# Style/KeywordParametersOrder
|
45
|
+
# Style/MethodCallWithoutArgsParentheses
|
46
|
+
# Style/MutableConstant
|
47
|
+
# Style/QuotedSymbols: { EnforcedStyle: double_quotes }
|
48
|
+
# Style/RedundantReturn
|
49
|
+
# Style/SafeNavigation
|
50
|
+
# Style/SpecialGlobalVars
|
51
|
+
# Style/StringLiterals: { EnforcedStyle: double_quotes }
|
52
|
+
# Style/WordArray
|
53
|
+
|
54
|
+
# these have been fixed
|
55
|
+
# Gemspec/DuplicatedAssignment: { Enabled: false } # Offense count: 1
|
56
|
+
# Layout/ElseAlignment: { Enabled: false } # Offense count: 1
|
57
|
+
# Layout/EndAlignment: { Enabled: false } # Offense count: 1
|
58
|
+
# Lint/DuplicateMethods: { Enabled: false } # Offense count: 1
|
59
|
+
# Lint/UselessAssignment: { Enabled: false } # Offense count: 1
|
60
|
+
# Style/Encoding: { Enabled: false } # Offense count: 2
|
61
|
+
# Style/RedundantBegin: { Enabled: false } # Offense count: 2
|
62
|
+
# Style/RedundantInterpolation: { Enabled: false } # Offense count: 1
|
63
|
+
# Style/TrailingCommaInArrayLiteral: { Enabled: false } # Offense count: 1
|
64
|
+
|
65
|
+
#
|
66
|
+
# This list was generated with:
|
67
|
+
# bundle exec rubocop --auto-gen-config --exclude-limit 1
|
68
|
+
#
|
69
|
+
|
70
|
+
# > 10 violations
|
71
|
+
Layout/AssignmentIndentation: { Enabled: false } # Offense count: 11
|
72
|
+
Layout/EmptyLinesAroundClassBody: { Enabled: false } # Offense count: 76
|
73
|
+
Layout/HashAlignment: { Enabled: false } # Offense count: 28
|
74
|
+
Layout/SpaceAfterComma: { Enabled: false } # Offense count: 141
|
75
|
+
Layout/SpaceInsideHashLiteralBraces: { Enabled: false } # Offense count: 57
|
76
|
+
Layout/TrailingWhitespace: { Enabled: false } # Offense count: 50
|
77
|
+
Naming/RescuedExceptionsVariableName: { Enabled: false } # Offense count: 11
|
78
|
+
Style/BlockDelimiters: { Enabled: false } # Offense count: 17
|
79
|
+
Style/ClassCheck: { Enabled: false } # Offense count: 10
|
80
|
+
Style/ClassEqualityComparison: { Enabled: false } # Offense count: 16
|
81
|
+
Style/FrozenStringLiteralComment: { Enabled: false } # Offense count: 77
|
82
|
+
Style/GlobalStdStream: { Enabled: false } # Offense count: 13
|
83
|
+
Style/GuardClause: { Enabled: false } # Offense count: 10
|
84
|
+
Style/IfUnlessModifier: { Enabled: false } # Offense count: 13
|
85
|
+
Style/MethodCallWithoutArgsParentheses: { Enabled: false } # Offense count: 10
|
86
|
+
Style/SpecialGlobalVars: { Enabled: false } # Offense count: 28
|
87
|
+
Style/StringLiterals: { Enabled: false } # Offense count: 774
|
88
|
+
|
89
|
+
# < 10 violations
|
90
|
+
Layout/EmptyLinesAroundModuleBody: { Enabled: false } # Offense count: 5
|
91
|
+
Layout/ExtraSpacing: { Enabled: false } # Offense count: 6
|
92
|
+
Layout/FirstHashElementIndentation: { Enabled: false } # Offense count: 4
|
93
|
+
Layout/ParameterAlignment: { Enabled: false } # Offense count: 9
|
94
|
+
Layout/SpaceAroundKeyword: { Enabled: false } # Offense count: 7
|
95
|
+
Layout/SpaceBeforeComma: { Enabled: false } # Offense count: 4
|
96
|
+
Layout/SpaceInsideParens: { Enabled: false } # Offense count: 4
|
97
|
+
Lint/EmptyClass: { Enabled: false } # Offense count: 3
|
98
|
+
Lint/SuppressedException: { Enabled: false } # Offense count: 4
|
99
|
+
Lint/UnusedMethodArgument: { Enabled: false } # Offense count: 5
|
100
|
+
Style/AccessorGrouping: { Enabled: false } # Offense count: 7
|
101
|
+
Style/Documentation: { Enabled: false } # Offense count: 3
|
102
|
+
Style/ExpandPathArguments: { Enabled: false } # Offense count: 8
|
103
|
+
Style/HashSyntax: { Exclude: ['Rakefile'] } # Offense count: 3
|
104
|
+
Style/KeywordParametersOrder: { Enabled: false } # Offense count: 8
|
105
|
+
Style/Lambda: { Enabled: false } # Offense count: 3
|
106
|
+
Style/MutableConstant: { Enabled: false } # Offense count: 4
|
107
|
+
Style/RaiseArgs: { Enabled: false } # Offense count: 4
|
108
|
+
Style/RedundantReturn: { Enabled: false } # Offense count: 7
|
109
|
+
Style/SafeNavigation: { Enabled: false } # Offense count: 5
|
110
|
+
Style/StringConcatenation: { Enabled: false } # Offense count: 8
|
111
|
+
Style/WordArray: { Enabled: false } # Offense count: 4
|
112
|
+
|
113
|
+
# 1 or 2 violations
|
114
|
+
Layout/ArgumentAlignment: { Enabled: false } # Offense count: 1
|
115
|
+
Layout/BlockAlignment: { Enabled: false } # Offense count: 1
|
116
|
+
Layout/IndentationWidth: { Enabled: false } # Offense count: 2
|
117
|
+
Layout/SpaceAroundOperators: { Enabled: false } # Offense count: 1
|
118
|
+
Layout/SpaceBeforeBlockBraces: { Enabled: false } # Offense count: 1
|
119
|
+
Lint/MissingSuper: { Enabled: false } # Offense count: 2
|
120
|
+
Lint/RescueException: { Enabled: false } # Offense count: 1
|
121
|
+
Lint/UnreachableLoop: { Enabled: false } # Offense count: 1
|
122
|
+
Lint/UnusedBlockArgument: { Enabled: false } # Offense count: 1
|
123
|
+
Naming/MethodParameterName: { Enabled: false } # Offense count: 1
|
124
|
+
Style/EmptyMethod: { Enabled: false } # Offense count: 2
|
125
|
+
Style/HashConversion: { Enabled: false } # Offense count: 1
|
126
|
+
Style/MultilineMemoization: { Enabled: false } # Offense count: 1
|
127
|
+
Style/NumericPredicate: { Enabled: false } # Offense count: 1
|
128
|
+
Style/OptionalArguments: { Enabled: false } # Offense count: 1
|
129
|
+
Style/ParenthesesAroundCondition: { Enabled: false } # Offense count: 1
|
130
|
+
Style/PreferredHashMethods: { Enabled: false } # Offense count: 1
|
131
|
+
Style/QuotedSymbols: { Enabled: false } # Offense count: 1
|
132
|
+
Style/RedundantException: { Enabled: false } # Offense count: 1
|
133
|
+
Style/RedundantRegexpEscape: { Enabled: false } # Offense count: 1
|
134
|
+
Style/RegexpLiteral: { Enabled: false } # Offense count: 1
|
135
|
+
Style/RescueStandardError: { Enabled: false } # Offense count: 1
|
136
|
+
Style/SoleNestedConditional: { Enabled: false } # Offense count: 1
|
137
|
+
Style/TrailingCommaInHashLiteral: { Enabled: false } # Offense count: 2
|
138
|
+
Style/PercentLiteralDelimiters: { Enabled: false } # Offense count: 2
|
data/ChangeLog.md
CHANGED
@@ -1,13 +1,41 @@
|
|
1
|
-
### 0.
|
1
|
+
### 0.2.0 / 2021-08-31
|
2
|
+
|
3
|
+
* Added {CommandKit::Colors::ANSI#on_black}.
|
4
|
+
* Added {CommandKit::Colors::ANSI#on_red}.
|
5
|
+
* Added {CommandKit::Colors::ANSI#on_green}.
|
6
|
+
* Added {CommandKit::Colors::ANSI#on_yellow}.
|
7
|
+
* Added {CommandKit::Colors::ANSI#on_blue}.
|
8
|
+
* Added {CommandKit::Colors::ANSI#on_magenta}.
|
9
|
+
* Added {CommandKit::Colors::ANSI#on_cyan}.
|
10
|
+
* Added {CommandKit::Colors::ANSI#on_white}.
|
11
|
+
* Added {CommandKit::Man}.
|
12
|
+
* Added {CommandKit::OS#bsd?}.
|
13
|
+
* Added {CommandKit::OS#freebsd?}.
|
14
|
+
* Added {CommandKit::OS#netbsd?}.
|
15
|
+
* Added {CommandKit::OS#openbsd?}.
|
16
|
+
* Added {CommandKit::OS#os}.
|
17
|
+
* Added {CommandKit::OS#unix?}.
|
18
|
+
* Added {CommandKit::OS::Linux}.
|
19
|
+
* Added {CommandKit::OpenApp}.
|
20
|
+
* Added {CommandKit::PackageManager}.
|
21
|
+
* Added {CommandKit::Pager#pipe_to_pager}.
|
22
|
+
* Added {CommandKit::Sudo}.
|
23
|
+
* Added {CommandKit::Terminal#tty?}.
|
24
|
+
* Refactor {CommandKit::Inflector.camelize} and
|
25
|
+
{CommandKit::Inflector.underscore} to use StringScanner.
|
26
|
+
* Allow {CommandKit::OS#initialize} to accept an `os:` keyword to override the
|
27
|
+
detected OS.
|
28
|
+
|
29
|
+
### 0.1.0 / 2021-07-16
|
2
30
|
|
3
31
|
* Initial release:
|
4
32
|
* {CommandKit::Arguments}
|
5
33
|
* {CommandKit::Colors}
|
34
|
+
* {CommandKit::Command}
|
6
35
|
* {CommandKit::CommandName}
|
7
36
|
* {CommandKit::Commands}
|
8
37
|
* {CommandKit::Commands::AutoLoad}
|
9
38
|
* {CommandKit::Commands::AutoRequire}
|
10
|
-
* {CommandKit::Console}
|
11
39
|
* {CommandKit::Description}
|
12
40
|
* {CommandKit::Env}
|
13
41
|
* {CommandKit::Env::Home}
|
@@ -16,14 +44,18 @@
|
|
16
44
|
* {CommandKit::ExceptionHandler}
|
17
45
|
* {CommandKit::Help}
|
18
46
|
* {CommandKit::Help::Man}
|
47
|
+
* {CommandKit::Interactive}
|
19
48
|
* {CommandKit::Main}
|
20
49
|
* {CommandKit::Options}
|
21
50
|
* {CommandKit::Options::Quiet}
|
22
51
|
* {CommandKit::Options::Verbose}
|
52
|
+
* {CommandKit::OS}
|
23
53
|
* {CommandKit::Pager}
|
24
54
|
* {CommandKit::Printing}
|
55
|
+
* {CommandKit::Printing::Indent}
|
25
56
|
* {CommandKit::ProgramName}
|
26
57
|
* {CommandKit::Stdio}
|
58
|
+
* {CommandKit::Terminal}
|
27
59
|
* {CommandKit::Usage}
|
28
60
|
* {CommandKit::XDG}
|
29
61
|
|
data/Gemfile
CHANGED
@@ -6,9 +6,12 @@ group :development do
|
|
6
6
|
gem 'rake'
|
7
7
|
gem 'rubygems-tasks', '~> 0.2'
|
8
8
|
|
9
|
+
gem 'rubocop', '~> 1.18'
|
10
|
+
|
9
11
|
gem 'rspec', '~> 3.0'
|
10
12
|
gem 'simplecov', '~> 0.20', require: false
|
11
13
|
|
12
14
|
gem 'kramdown'
|
13
15
|
gem 'yard', '~> 0.9'
|
16
|
+
gem 'yard-spellcheck', require: false
|
14
17
|
end
|
data/README.md
CHANGED
@@ -1,57 +1,39 @@
|
|
1
1
|
# command_kit
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
[](https://github.com/postmodern/command_kit.rb/actions)
|
4
|
+
|
5
|
+
* [Homepage](https://github.com/postmodern/command_kit.rb#readme)
|
6
|
+
* [Forum](https://github.com/postmodern/command_kit.rb/discussions) |
|
7
|
+
[Issues](https://github.com/postmodern/command_kit.rb/issues)
|
5
8
|
* [Documentation](http://rubydoc.info/gems/command_kit/frames)
|
6
|
-
* [Email](mailto:postmodern.mod3 at gmail.com)
|
7
9
|
|
8
10
|
## Description
|
9
11
|
|
10
|
-
A Ruby toolkit for building clean, correct, and robust CLI commands as
|
11
|
-
classes.
|
12
|
+
A Ruby toolkit for building clean, correct, and robust CLI commands as
|
13
|
+
plain-old Ruby classes.
|
12
14
|
|
13
15
|
## Features
|
14
16
|
|
15
|
-
*
|
16
|
-
|
17
|
-
|
18
|
-
*
|
19
|
-
*
|
20
|
-
*
|
21
|
-
*
|
22
|
-
*
|
23
|
-
|
24
|
-
*
|
25
|
-
*
|
26
|
-
*
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
*
|
31
|
-
*
|
32
|
-
*
|
33
|
-
*
|
34
|
-
|
35
|
-
* {CommandKit::Commands::AutoRequire}
|
36
|
-
* {CommandKit::Console}
|
37
|
-
* {CommandKit::Description}
|
38
|
-
* {CommandKit::Env}
|
39
|
-
* {CommandKit::Env::Home}
|
40
|
-
* {CommandKit::Env::Path}
|
41
|
-
* {CommandKit::Examples}
|
42
|
-
* {CommandKit::ExceptionHandler}
|
43
|
-
* {CommandKit::Help}
|
44
|
-
* {CommandKit::Help::Man}
|
45
|
-
* {CommandKit::Main}
|
46
|
-
* {CommandKit::Options}
|
47
|
-
* {CommandKit::Options::Quiet}
|
48
|
-
* {CommandKit::Options::Verbose}
|
49
|
-
* {CommandKit::Pager}
|
50
|
-
* {CommandKit::Printing}
|
51
|
-
* {CommandKit::ProgramName}
|
52
|
-
* {CommandKit::Stdio}
|
53
|
-
* {CommandKit::Usage}
|
54
|
-
* {CommandKit::XDG}
|
17
|
+
* **Simple** - Commands are plain-old ruby classes, with options and
|
18
|
+
arguments declared as attributes. All features are ruby modules that can be
|
19
|
+
included into command classes.
|
20
|
+
* **Correct** - CommandKit behaves like a standard UNIX command.
|
21
|
+
* Safely handles Ctrl^C / SIGINT interrupts and [exits with 130](https://tldp.org/LDP/abs/html/exitcodes.html).
|
22
|
+
* Safely handles broken pipes (aka `mycmd | head`).
|
23
|
+
* Respects common environment variables (ex: `TERM=dumb`).
|
24
|
+
* Uses [OptionParser][optparse] for POSIX option parsing.
|
25
|
+
* Disables ANSI color when output is redirected to a file.
|
26
|
+
* **Complete** - Provides many additional CLI features.
|
27
|
+
* OS detection.
|
28
|
+
* Terminal size detection.
|
29
|
+
* ANSI coloring support.
|
30
|
+
* Interactive input.
|
31
|
+
* Subcommands (explicit or lazy-loaded) and command aliases.
|
32
|
+
* Displaying man pages for `--help`/`help`.
|
33
|
+
* Using the pager (aka `less`).
|
34
|
+
* [XDG directories](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) (aka `~/.config/`, `~/.local/share/`, `~/.cache/`).
|
35
|
+
* **Testable** - Since commands are plain-old ruby classes, it's easy to
|
36
|
+
initialize them and call `#main` or `#run`.
|
55
37
|
|
56
38
|
## Anti-Features
|
57
39
|
|
@@ -59,209 +41,148 @@ classes.
|
|
59
41
|
* Does not implement it's own option parser.
|
60
42
|
* Not named after a comic-book Superhero.
|
61
43
|
|
62
|
-
##
|
63
|
-
|
64
|
-
### Command
|
65
|
-
|
66
|
-
#### lib/foo/cli/my_cmd.rb
|
67
|
-
|
68
|
-
require 'command_kit'
|
69
|
-
|
70
|
-
module Foo
|
71
|
-
module CLI
|
72
|
-
class MyCmd < CommandKit::Command
|
73
|
-
|
74
|
-
usage '[OPTIONS] [-o OUTPUT] FILE'
|
75
|
-
|
76
|
-
option :count, short: '-c',
|
77
|
-
value: {
|
78
|
-
type: Integer,
|
79
|
-
default: 1
|
80
|
-
},
|
81
|
-
desc: "Number of times"
|
82
|
-
|
83
|
-
option :output, short: '-o',
|
84
|
-
value: {
|
85
|
-
type: String,
|
86
|
-
usage: 'FILE'
|
87
|
-
},
|
88
|
-
desc: "Optional output file"
|
89
|
-
|
90
|
-
option :verbose, short: '-v', desc: "Increase verbose level" do
|
91
|
-
@verbose += 1
|
92
|
-
end
|
93
|
-
|
94
|
-
argument :file, type: String,
|
95
|
-
required: true,
|
96
|
-
usage: 'FILE',
|
97
|
-
desc: "Input file"
|
98
|
-
|
99
|
-
examples [
|
100
|
-
'-o path/to/output.txt path/to/input.txt',
|
101
|
-
'-v -c 2 -o path/to/output.txt path/to/input.txt',
|
102
|
-
]
|
103
|
-
|
104
|
-
description 'Example command'
|
105
|
-
|
106
|
-
def initialize(**kwargs)
|
107
|
-
super(**kwargs)
|
108
|
-
|
109
|
-
@verbose = 0
|
110
|
-
end
|
111
|
-
|
112
|
-
def run(file)
|
113
|
-
puts "count=#{options[:count].inspect}"
|
114
|
-
puts "output=#{options[:output].inspect}"
|
115
|
-
puts "file=#{file.inspect}"
|
116
|
-
puts "verbose=#{@verbose.inspect}"
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
#### bin/my_cmd
|
124
|
-
|
125
|
-
#!/usr/bin/env ruby
|
126
|
-
|
127
|
-
$LOAD_PATH.unshift(File.expand_path('../../lib',__FILE__))
|
128
|
-
require 'foo/cli/my_cmd'
|
129
|
-
|
130
|
-
Foo::CLI::MyCmd.start
|
131
|
-
|
132
|
-
#### --help
|
133
|
-
|
134
|
-
Usage: my_cmd [OPTIONS] [-o OUTPUT] FILE
|
135
|
-
|
136
|
-
Options:
|
137
|
-
-c, --count INT Number of times (Default: 1)
|
138
|
-
-o, --output FILE Optional output file
|
139
|
-
-v, --verbose Increase verbose level
|
140
|
-
-h, --help Print help information
|
141
|
-
|
142
|
-
Arguments:
|
143
|
-
FILE Input file
|
144
|
-
|
145
|
-
Examples:
|
146
|
-
my_cmd -o path/to/output.txt path/to/input.txt
|
147
|
-
my_cmd -v -c 2 -o path/to/output.txt path/to/input.txt
|
148
|
-
|
149
|
-
Example command
|
150
|
-
|
151
|
-
### Options
|
152
|
-
|
153
|
-
Define an option:
|
154
|
-
|
155
|
-
option :foo, desc: "Foo option"
|
156
|
-
|
157
|
-
With a custom short option:
|
158
|
-
|
159
|
-
option :foo, short: '-f',
|
160
|
-
desc: "Foo option"
|
161
|
-
|
162
|
-
With a custom long option:
|
163
|
-
|
164
|
-
option :foo, short: '--foo-opt',
|
165
|
-
desc: "Foo option"
|
166
|
-
|
167
|
-
With a custom usage string:
|
44
|
+
## Requirements
|
168
45
|
|
169
|
-
|
170
|
-
desc: "Foo option"
|
46
|
+
* [ruby] >= 2.7.0
|
171
47
|
|
172
|
-
|
48
|
+
## Install
|
173
49
|
|
174
|
-
|
175
|
-
|
176
|
-
|
50
|
+
```sh
|
51
|
+
$ gem install command_kit
|
52
|
+
```
|
177
53
|
|
178
|
-
|
54
|
+
### gemspec
|
179
55
|
|
180
|
-
|
181
|
-
|
56
|
+
```ruby
|
57
|
+
gem.add_dependency 'command_kit', '~> 0.2'
|
58
|
+
```
|
182
59
|
|
183
|
-
|
60
|
+
### Gemfile
|
184
61
|
|
185
|
-
|
186
|
-
|
62
|
+
```ruby
|
63
|
+
gem 'command_kit', '~> 0.2'
|
64
|
+
```
|
187
65
|
|
188
|
-
|
66
|
+
## Examples
|
189
67
|
|
190
|
-
|
191
|
-
desc: "Foo option"
|
68
|
+
### lib/foo/cli/my_cmd.rb
|
192
69
|
|
193
|
-
|
70
|
+
```ruby
|
71
|
+
require 'command_kit'
|
194
72
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
'yes' => :enabled,
|
199
|
-
'disabled' => :disabled,
|
200
|
-
'no' => :disabled
|
201
|
-
}
|
202
|
-
},
|
203
|
-
desc: "Flag option"
|
73
|
+
module Foo
|
74
|
+
module CLI
|
75
|
+
class MyCmd < CommandKit::Command
|
204
76
|
|
205
|
-
|
77
|
+
usage '[OPTIONS] [-o OUTPUT] FILE'
|
206
78
|
|
207
|
-
|
208
|
-
|
79
|
+
option :count, short: '-c',
|
80
|
+
value: {
|
81
|
+
type: Integer,
|
82
|
+
default: 1
|
83
|
+
},
|
84
|
+
desc: "Number of times"
|
209
85
|
|
210
|
-
|
86
|
+
option :output, short: '-o',
|
87
|
+
value: {
|
88
|
+
type: String,
|
89
|
+
usage: 'FILE'
|
90
|
+
},
|
91
|
+
desc: "Optional output file"
|
211
92
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
end
|
93
|
+
option :verbose, short: '-v', desc: "Increase verbose level" do
|
94
|
+
@verbose += 1
|
95
|
+
end
|
216
96
|
|
217
|
-
|
97
|
+
argument :file, required: true,
|
98
|
+
usage: 'FILE',
|
99
|
+
desc: "Input file"
|
218
100
|
|
219
|
-
|
101
|
+
examples [
|
102
|
+
'-o path/to/output.txt path/to/input.txt',
|
103
|
+
'-v -c 2 -o path/to/output.txt path/to/input.txt',
|
104
|
+
]
|
220
105
|
|
221
|
-
|
106
|
+
description 'Example command'
|
222
107
|
|
223
|
-
|
108
|
+
def initialize(**kwargs)
|
109
|
+
super(**kwargs)
|
224
110
|
|
225
|
-
|
226
|
-
|
111
|
+
@verbose = 0
|
112
|
+
end
|
227
113
|
|
228
|
-
|
114
|
+
def run(file)
|
115
|
+
puts "count=#{options[:count].inspect}"
|
116
|
+
puts "output=#{options[:output].inspect}"
|
117
|
+
puts "file=#{file.inspect}"
|
118
|
+
puts "verbose=#{@verbose.inspect}"
|
119
|
+
end
|
229
120
|
|
230
|
-
argument :bar, desc: "Bar argument" do |bar|
|
231
|
-
# ...
|
232
121
|
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
```
|
233
125
|
|
234
|
-
|
235
|
-
|
236
|
-
argument :bar, type: Integer,
|
237
|
-
desc: "Bar argument"
|
238
|
-
|
239
|
-
With a default value:
|
126
|
+
### bin/my_cmd
|
240
127
|
|
241
|
-
|
242
|
-
|
128
|
+
```ruby
|
129
|
+
#!/usr/bin/env ruby
|
243
130
|
|
244
|
-
|
131
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib',__FILE__))
|
132
|
+
require 'foo/cli/my_cmd'
|
245
133
|
|
246
|
-
|
247
|
-
|
134
|
+
Foo::CLI::MyCmd.start
|
135
|
+
```
|
248
136
|
|
249
|
-
|
137
|
+
### --help
|
250
138
|
|
251
|
-
|
252
|
-
desc: "Bar argument"
|
253
|
-
|
254
|
-
## Requirements
|
139
|
+
Usage: my_cmd [OPTIONS] [-o OUTPUT] FILE
|
255
140
|
|
256
|
-
|
141
|
+
Options:
|
142
|
+
-c, --count INT Number of times (Default: 1)
|
143
|
+
-o, --output FILE Optional output file
|
144
|
+
-v, --verbose Increase verbose level
|
145
|
+
-h, --help Print help information
|
257
146
|
|
258
|
-
|
147
|
+
Arguments:
|
148
|
+
FILE Input file
|
259
149
|
|
260
|
-
|
150
|
+
Examples:
|
151
|
+
my_cmd -o path/to/output.txt path/to/input.txt
|
152
|
+
my_cmd -v -c 2 -o path/to/output.txt path/to/input.txt
|
261
153
|
|
262
|
-
|
154
|
+
Example command
|
263
155
|
|
264
|
-
|
156
|
+
### Reference
|
157
|
+
|
158
|
+
* [CommandKit::Arguments](https://rubydoc.info/gems/command_kit/CommandKit/Arguments)
|
159
|
+
* [CommandKit::Colors](https://rubydoc.info/gems/command_kit/CommandKit/Colors)
|
160
|
+
* [CommandKit::Command](https://rubydoc.info/gems/command_kit/CommandKit/Command)
|
161
|
+
* [CommandKit::CommandName](https://rubydoc.info/gems/command_kit/CommandKit/CommandName)
|
162
|
+
* [CommandKit::Commands](https://rubydoc.info/gems/command_kit/CommandKit/Commands)
|
163
|
+
* [CommandKit::Commands::AutoLoad](https://rubydoc.info/gems/command_kit/CommandKit/Commands/AutoLoad)
|
164
|
+
* [CommandKit::Commands::AutoRequire](https://rubydoc.info/gems/command_kit/CommandKit/Commands/AutoRequire)
|
165
|
+
* [CommandKit::Description](https://rubydoc.info/gems/command_kit/CommandKit/Description)
|
166
|
+
* [CommandKit::Env](https://rubydoc.info/gems/command_kit/CommandKit/Env)
|
167
|
+
* [CommandKit::Env::Home](https://rubydoc.info/gems/command_kit/CommandKit/Env/Home)
|
168
|
+
* [CommandKit::Env::Path](https://rubydoc.info/gems/command_kit/CommandKit/Env/Path)
|
169
|
+
* [CommandKit::Examples](https://rubydoc.info/gems/command_kit/CommandKit/Examples)
|
170
|
+
* [CommandKit::ExceptionHandler](https://rubydoc.info/gems/command_kit/CommandKit/ExceptionHandler)
|
171
|
+
* [CommandKit::Help](https://rubydoc.info/gems/command_kit/CommandKit/Help)
|
172
|
+
* [CommandKit::Help::Man](https://rubydoc.info/gems/command_kit/CommandKit/Help/Man)
|
173
|
+
* [CommandKit::Interactive](https://rubydoc.info/gems/command_kit/CommandKit/Interactive)
|
174
|
+
* [CommandKit::Main](https://rubydoc.info/gems/command_kit/CommandKit/Main)
|
175
|
+
* [CommandKit::Options](https://rubydoc.info/gems/command_kit/CommandKit/Options)
|
176
|
+
* [CommandKit::Options::Quiet](https://rubydoc.info/gems/command_kit/CommandKit/Options/Quiet)
|
177
|
+
* [CommandKit::Options::Verbose](https://rubydoc.info/gems/command_kit/CommandKit/Options/Verbose)
|
178
|
+
* [CommandKit::Pager](https://rubydoc.info/gems/command_kit/CommandKit/Pager)
|
179
|
+
* [CommandKit::Printing](https://rubydoc.info/gems/command_kit/CommandKit/Printing)
|
180
|
+
* [CommandKit::Printing::Indent](https://rubydoc.info/gems/command_kit/CommandKit/Printing/Indent)
|
181
|
+
* [CommandKit::ProgramName](https://rubydoc.info/gems/command_kit/CommandKit/ProgramName)
|
182
|
+
* [CommandKit::Stdio](https://rubydoc.info/gems/command_kit/CommandKit/Stdio)
|
183
|
+
* [CommandKit::Terminal](https://rubydoc.info/gems/command_kit/CommandKit/Terminal)
|
184
|
+
* [CommandKit::Usage](https://rubydoc.info/gems/command_kit/CommandKit/Usage)
|
185
|
+
* [CommandKit::XDG](https://rubydoc.info/gems/command_kit/CommandKit/XDG)
|
265
186
|
|
266
187
|
## Alternatives
|
267
188
|
|