cmd.rb 0.3.3 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.bundle/config +2 -0
- data/.projectile +1 -1
- data/Gemfile +0 -3
- data/README.md +11 -4
- data/Rakefile.rb +1 -0
- data/VERSION +1 -1
- data/cmd.rb.gemspec +1 -1
- data/lib/cmd/{mixins → mixin}/argv.rb +4 -5
- data/lib/cmd/{mixins → mixin}/help.rb +1 -1
- data/lib/cmd/{mixins → mixin}/option_parser.rb +41 -11
- data/lib/cmd/mixin.rb +5 -0
- data/lib/cmd.rb +4 -6
- data/test/cmd_test.rb +66 -0
- data/test/readme_examples_test.rb +0 -2
- data/test/setup.rb +1 -0
- metadata +12 -12
- data/.yardoc-template/default/fulldoc/html/css/0x1eef.css +0 -15
- data/.yardoc-template/default/layout/html/setup.rb +0 -5
- data/.yardoc-template/default/module/setup.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34d12924cba02103e5b13c1581d948f3fc862a588b452aef90b9797ab7bd605b
|
4
|
+
data.tar.gz: c7a4aa7d0266f6c2ed91c6268189310462135b465d4d6a8cfcbb5b170b360480
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d98a6f7bcd51310076ec57fc8947f7d6922b5402a5e0aac5432174fb2db6cfc44e19e07b7e5f11f87eaffb31eb050774891f9f46cd1ab70a9102e36407c5abea
|
7
|
+
data.tar.gz: 7b4620b67fd778a0f01d61dffb5b5dfde52aa10e92fdf15feb655f132638a3a26d0339840543d50665ec128c8a4a28c5d50508c672d59dfb636ef738175a37fe
|
data/.bundle/config
ADDED
data/.projectile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
-.
|
1
|
+
-.gems/
|
2
2
|
-doc/
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -12,7 +12,8 @@ option parsing implementation is delegated to
|
|
12
12
|
|
13
13
|
The following example demonstrates a simple command that is
|
14
14
|
implemented with `Dir.entries`. The command accepts two options
|
15
|
-
that have fallback default values set
|
15
|
+
that have fallback default values set for when an option is not
|
16
|
+
given:
|
16
17
|
|
17
18
|
**Definition**
|
18
19
|
|
@@ -70,19 +71,25 @@ Options:
|
|
70
71
|
|
71
72
|
## Install
|
72
73
|
|
74
|
+
**Git**
|
75
|
+
|
73
76
|
cmd.rb is distributed as a RubyGem through its git repositories. <br>
|
74
77
|
[GitHub](https://github.com/0x1eef/cmd.rb),
|
75
78
|
and
|
76
79
|
[GitLab](https://gitlab.com/0x1eef/cmd.rb)
|
77
80
|
are available as sources.
|
78
81
|
|
79
|
-
**Gemfile**
|
80
|
-
|
81
82
|
```ruby
|
83
|
+
# Gemfile
|
82
84
|
gem "cmd.rb", github: "0x1eef/cmd.rb"
|
83
|
-
gem "ryo.rb", github: "0x1eef/ryo.rb"
|
84
85
|
```
|
85
86
|
|
87
|
+
**Rubygems.org**
|
88
|
+
|
89
|
+
cmd.rb can also be installed via rubygems.org.
|
90
|
+
|
91
|
+
gem install cmd.rb
|
92
|
+
|
86
93
|
## <a id="license"> License </a>
|
87
94
|
|
88
95
|
[BSD Zero Clause](https://choosealicense.com/licenses/0bsd/).
|
data/Rakefile.rb
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v0.
|
1
|
+
v0.4.1
|
data/cmd.rb.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.summary = "A library for building command-line applications, in Ruby."
|
14
14
|
gem.description = gem.summary
|
15
15
|
gem.add_runtime_dependency "ryo.rb", "~> 0.4"
|
16
|
-
gem.add_runtime_dependency "
|
16
|
+
gem.add_runtime_dependency "cli-option_parser.rb", "~> 0.5"
|
17
17
|
gem.add_development_dependency "test-unit", "~> 3.5.7"
|
18
18
|
gem.add_development_dependency "yard", "~> 0.9"
|
19
19
|
gem.add_development_dependency "redcarpet", "~> 3.5"
|
@@ -1,11 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
##
|
4
|
-
# The {Cmd::ARGV} module provides
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
8
|
-
module Cmd::ARGV
|
4
|
+
# The {Cmd::Mixin::ARGV Cmd::Mixin::ARGV} module provides
|
5
|
+
# an initialize method, and an attribute reader for an
|
6
|
+
# array of strings (usually ARGV).
|
7
|
+
module Cmd::Mixin::ARGV
|
9
8
|
##
|
10
9
|
# @return [Array<String>]
|
11
10
|
# Returns an array of strings.
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "optparse"
|
4
|
-
require "ryo"
|
5
|
-
|
6
3
|
##
|
7
|
-
# The {Cmd::OptionParser Cmd::OptionParser} module
|
8
|
-
#
|
4
|
+
# The {Cmd::Mixin::OptionParser Cmd::Mixin::OptionParser} module enhances
|
5
|
+
# the functionality of Ruby's
|
9
6
|
# [OptionParser](https://docs.ruby-lang.org/en/3.2/OptionParser.html)
|
10
7
|
# class.
|
11
|
-
module Cmd::OptionParser
|
8
|
+
module Cmd::Mixin::OptionParser
|
9
|
+
require "cli-option_parser"
|
10
|
+
require "ryo"
|
11
|
+
|
12
12
|
def self.included(klass)
|
13
13
|
klass.extend(ClassMethods)
|
14
14
|
end
|
@@ -49,8 +49,15 @@ module Cmd::OptionParser
|
|
49
49
|
#
|
50
50
|
# @return [void]
|
51
51
|
def set_option(short, long, desc, as: String, default: nil)
|
52
|
-
option_parser.on(short, long, desc, as)
|
53
|
-
|
52
|
+
option_parser.on(short, long, desc, as) do |v|
|
53
|
+
switch = __switch_search(short, long)
|
54
|
+
v || __optional_switches.any? { _1 === switch } ? v : true
|
55
|
+
end
|
56
|
+
switch = option_parser.top.list[-1]
|
57
|
+
set_default({
|
58
|
+
switch.short[0][1..] => default,
|
59
|
+
switch.long[0][2..] => default
|
60
|
+
})
|
54
61
|
end
|
55
62
|
|
56
63
|
##
|
@@ -60,13 +67,17 @@ module Cmd::OptionParser
|
|
60
67
|
#
|
61
68
|
# @return [void]
|
62
69
|
def set_default(defaults)
|
63
|
-
@defaults
|
70
|
+
if @defaults
|
71
|
+
Ryo.assign(@defaults, defaults)
|
72
|
+
else
|
73
|
+
@defaults = Ryo.from(defaults)
|
74
|
+
end
|
64
75
|
end
|
65
76
|
|
66
77
|
##
|
67
|
-
# (see Cmd::OptionParser#option_parser)
|
78
|
+
# (see Cmd::Mixin::OptionParser#option_parser)
|
68
79
|
def option_parser
|
69
|
-
@option_parser ||= ::OptionParser.new(nil, 26, " " * 2).tap do
|
80
|
+
@option_parser ||= CLI::OptionParser.new(nil, 26, " " * 2).tap do
|
70
81
|
_1.banner = ""
|
71
82
|
_1.on("-h", "--help", "Show help")
|
72
83
|
end
|
@@ -83,12 +94,31 @@ module Cmd::OptionParser
|
|
83
94
|
def defaults
|
84
95
|
@defaults ||= Ryo({})
|
85
96
|
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# @private
|
100
|
+
def __switch_search(short, long)
|
101
|
+
option_parser.top.list.find do |s|
|
102
|
+
s.short[0] == short[/[^\s]*/] &&
|
103
|
+
s.long[0] == long[/[^\s*]*/]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
##
|
108
|
+
# @private
|
109
|
+
def __optional_switches
|
110
|
+
[
|
111
|
+
CLI::OptionParser::Switch::PlacedArgument,
|
112
|
+
CLI::OptionParser::Switch::OptionalArgument
|
113
|
+
]
|
114
|
+
end
|
86
115
|
end
|
87
116
|
|
88
117
|
##
|
89
118
|
# Parses an array of strings with
|
90
119
|
# [OptionParser#parse](https://docs.ruby-lang.org/en/3.2/OptionParser.html#method-i-parse).
|
91
120
|
#
|
121
|
+
|
92
122
|
# @param [Array<String>] argv
|
93
123
|
# An array of strings
|
94
124
|
#
|
data/lib/cmd/mixin.rb
ADDED
data/lib/cmd.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Cmd
|
4
|
-
require_relative "cmd/
|
5
|
-
require_relative "cmd/mixins/help"
|
6
|
-
require_relative "cmd/mixins/option_parser"
|
4
|
+
require_relative "cmd/mixin"
|
7
5
|
|
8
|
-
include ARGV
|
9
|
-
include Help
|
6
|
+
include Mixin::ARGV
|
7
|
+
include Mixin::Help
|
10
8
|
|
11
9
|
def self.inherited(klass)
|
12
|
-
klass.class_eval { include(OptionParser) }
|
10
|
+
klass.class_eval { include(Mixin::OptionParser) }
|
13
11
|
end
|
14
12
|
end
|
data/test/cmd_test.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative "setup"
|
2
|
+
|
3
|
+
class CmdTest < Test::Unit::TestCase
|
4
|
+
class Command < Cmd
|
5
|
+
set_banner usage: "test [OPTIONS]",
|
6
|
+
description: "A test program"
|
7
|
+
set_option '-x', '--xarg', 'An option without an argument'
|
8
|
+
set_option '-y ARG', '--yarg ARG', 'An option with a required argument'
|
9
|
+
set_option '-z [ARG]', '--zarg [ARG]', 'An option with an optional argument'
|
10
|
+
|
11
|
+
def run
|
12
|
+
parse_options(argv)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_none_given
|
17
|
+
options = Command.new([]).run
|
18
|
+
[options.x, options.xarg,
|
19
|
+
options.y, options.yarg,
|
20
|
+
options.z, options.zarg].each do
|
21
|
+
assert_equal nil, _1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# No argument option
|
27
|
+
# -x, --xarg
|
28
|
+
|
29
|
+
def test_xarg_given
|
30
|
+
options = Command.new(['-x']).run
|
31
|
+
assert_equal true, options.x
|
32
|
+
assert_equal true, options.xarg
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Required argument option
|
37
|
+
# -y ARG, --yarg ARG
|
38
|
+
|
39
|
+
def test_yarg_given
|
40
|
+
options = Command.new(['-y', 'required-argument']).run
|
41
|
+
assert_equal 'required-argument', options.y
|
42
|
+
assert_equal 'required-argument', options.yarg
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_yarg_missing_argument
|
46
|
+
assert_raises(CLI::OptionParser::MissingArgument) do
|
47
|
+
Command.new(['-y']).run
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Optional argument option
|
53
|
+
# -z [ARG], --zarg [ARG]
|
54
|
+
|
55
|
+
def test_zarg_given
|
56
|
+
options = Command.new(['-z', 'optional-argument']).run
|
57
|
+
assert_equal 'optional-argument', options.z
|
58
|
+
assert_equal 'optional-argument', options.zarg
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_zarg_missing_argument
|
62
|
+
options = Command.new(['-z']).run
|
63
|
+
assert_equal nil, options.z
|
64
|
+
assert_equal nil, options.zarg
|
65
|
+
end
|
66
|
+
end
|
data/test/setup.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cmd.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- '0x1eef'
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ryo.rb
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: cli-option_parser.rb
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.5'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: test-unit
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,13 +129,11 @@ executables: []
|
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
|
+
- ".bundle/config"
|
132
133
|
- ".github/workflows/tests.yml"
|
133
134
|
- ".gitignore"
|
134
135
|
- ".projectile"
|
135
136
|
- ".rubocop.yml"
|
136
|
-
- ".yardoc-template/default/fulldoc/html/css/0x1eef.css"
|
137
|
-
- ".yardoc-template/default/layout/html/setup.rb"
|
138
|
-
- ".yardoc-template/default/module/setup.rb"
|
139
137
|
- ".yardopts"
|
140
138
|
- Gemfile
|
141
139
|
- LICENSE
|
@@ -144,11 +142,13 @@ files:
|
|
144
142
|
- VERSION
|
145
143
|
- cmd.rb.gemspec
|
146
144
|
- lib/cmd.rb
|
147
|
-
- lib/cmd/
|
148
|
-
- lib/cmd/
|
149
|
-
- lib/cmd/
|
145
|
+
- lib/cmd/mixin.rb
|
146
|
+
- lib/cmd/mixin/argv.rb
|
147
|
+
- lib/cmd/mixin/help.rb
|
148
|
+
- lib/cmd/mixin/option_parser.rb
|
150
149
|
- share/examples/cmd.rb/ls
|
151
150
|
- share/examples/cmd.rb/setup.rb
|
151
|
+
- test/cmd_test.rb
|
152
152
|
- test/fakefs/.gitkeep
|
153
153
|
- test/fakefs/dev/.gitkeep
|
154
154
|
- test/fakefs/etc/.gitkeep
|
@@ -174,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
174
|
- !ruby/object:Gem::Version
|
175
175
|
version: '0'
|
176
176
|
requirements: []
|
177
|
-
rubygems_version: 3.
|
177
|
+
rubygems_version: 3.5.3
|
178
178
|
signing_key:
|
179
179
|
specification_version: 4
|
180
180
|
summary: A library for building command-line applications, in Ruby.
|