shellopts 2.4.1 → 2.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -6
- data/TODO +10 -0
- data/lib/shellopts/argument_type.rb +23 -20
- data/lib/shellopts/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93dc09edd7bd318c85134a93f7c45352f4b2e550663c1a80a029d4fcb1d8ab16
|
4
|
+
data.tar.gz: c9e0b523c15f372d5dd988d2fd804c01539e90f0ee02ef68d284b4a1340e7c9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 520132f149801fb6d2bb8e325e38cdb6bf81a01c9d881f88165b02550dfae4a0f95706bcbd558e34b2232015b327c87f779cbf2cdef6d0355640db6e87acaaea
|
7
|
+
data.tar.gz: 7a26fe6f1a8501f9a52103224ea4cdfa2d95441e6253af6ecfcb71f09f8f57c84bae7734079fa5ab1c47756f859ac0eaddbac3c350ce1d8a6b845be011ecedc3
|
data/README.md
CHANGED
@@ -193,7 +193,6 @@ indicate that the option can be repeated
|
|
193
193
|
--gamma=ARG? @ --gamma, takes an optional argument
|
194
194
|
```
|
195
195
|
|
196
|
-
|
197
196
|
An option argument has a name and a type. The type can be specified as '#'
|
198
197
|
(integer), '$' (float), or as a comma-separated list of allowed values. It can
|
199
198
|
also be defined by a keyword that expects a file or directory argument:
|
@@ -202,15 +201,17 @@ also be defined by a keyword that expects a file or directory argument:
|
|
202
201
|
| --------- | ---- |
|
203
202
|
| FILE | A file if present or in an existing directory if not |
|
204
203
|
| DIR | A directory if present or in an existing directory if not |
|
205
|
-
| PATH |
|
204
|
+
| PATH | FILE or DIR |
|
206
205
|
| EFILE | An existing file |
|
207
206
|
| EDIR | An existing directory |
|
208
|
-
| EPATH |
|
207
|
+
| EPATH | EFILE or EDIR |
|
209
208
|
| NFILE | A new file |
|
210
209
|
| NDIR | A new directory |
|
211
|
-
| NPATH |
|
210
|
+
| NPATH | NFILE or NDIR |
|
211
|
+
|
212
212
|
|
213
|
-
By default the option name is inferred from the type but it can be specified
|
213
|
+
By default the option name is inferred from the type but it can be specified
|
214
|
+
explicitly by separating it from the type with a ':'. Examples:
|
214
215
|
|
215
216
|
```
|
216
217
|
-a=# @ -a takes an integer argument
|
@@ -244,7 +245,7 @@ In single-line format, subcommands are specified by prefixing the supercommand's
|
|
244
245
|
|
245
246
|
## Example
|
246
247
|
|
247
|
-
The rm(1) command could be specified like this:
|
248
|
+
The standard rm(1) command could be specified like this:
|
248
249
|
|
249
250
|
```ruby
|
250
251
|
|
data/TODO
CHANGED
@@ -1,4 +1,14 @@
|
|
1
1
|
|
2
|
+
o Remove IFILE and OFILE. Alternatively document them
|
3
|
+
o Document special-case file argument '-'
|
4
|
+
o Accept both strings and symbols for commands (maybe... ruins the global namespace in #[])
|
5
|
+
o ShellOpts#command -> Full path. Eg. ':command.subcommand!'
|
6
|
+
ShellOpts#commands -> Array of commands. Eg. [:command!, :subcommand!]
|
7
|
+
o Exclude -h, -v, and -q from short description and only include them in the
|
8
|
+
detailed option description
|
9
|
+
o Output handling: mesg, verb, ... should record eols. error and failure should
|
10
|
+
use that to end the current line with a newline if necessary
|
11
|
+
o Strings from ShellOpts are frozen. Is that what we want?
|
2
12
|
o Assigner methods for options
|
3
13
|
o Make opts[] point at the main object
|
4
14
|
opts[].subcommand is the direct subcommand of main
|
@@ -26,7 +26,7 @@ module ShellOpts
|
|
26
26
|
def to_s() name end
|
27
27
|
|
28
28
|
protected
|
29
|
-
# it is important that #set_message return false
|
29
|
+
# Note that it is important that #set_message return false
|
30
30
|
def set_message(msg)
|
31
31
|
@message = msg
|
32
32
|
false
|
@@ -63,7 +63,8 @@ module ShellOpts
|
|
63
63
|
def subject # Used in error messages
|
64
64
|
@subject ||=
|
65
65
|
case kind
|
66
|
-
when :file, :efile
|
66
|
+
when :file, :efile; "regular file"
|
67
|
+
when :nfile, :ifile, :ofile; "file"
|
67
68
|
when :dir, :edir, :ndir; "directory"
|
68
69
|
when :path, :epath, :npath; "path"
|
69
70
|
else
|
@@ -81,19 +82,18 @@ module ShellOpts
|
|
81
82
|
if literal == '-' && [:ifile, :ofile].include?(kind)
|
82
83
|
true
|
83
84
|
|
84
|
-
# Special-case standard I/O files
|
85
|
+
# Special-case standard I/O files. These files have read-write (rw)
|
86
|
+
# filesystem permissions so they need to be handled individually
|
85
87
|
elsif %w(/dev/stdin /dev/stdout /dev/stderr /dev/null).include?(literal)
|
86
88
|
case kind
|
87
89
|
when :file, :path, :efile, :epath, :nfile, :npath
|
88
90
|
true
|
89
91
|
when :ifile
|
90
|
-
%w(/dev/stdin /dev/null).include? literal or
|
91
|
-
set_message "Can't read #{literal}"
|
92
|
+
%w(/dev/stdin /dev/null).include? literal or set_message "Can't read #{literal}"
|
92
93
|
when :ofile
|
93
|
-
%w(/dev/stdout /dev/stderr /dev/null).include?(literal) or
|
94
|
-
set_message "Can't write to #{literal}"
|
94
|
+
%w(/dev/stdout /dev/stderr /dev/null).include?(literal) or set_message "Can't write to #{literal}"
|
95
95
|
when :dir, :edir, :ndir
|
96
|
-
set_message "
|
96
|
+
set_message "#{literal} is not a directory"
|
97
97
|
else
|
98
98
|
raise ArgumentError, "Unhandled kind: #{kind.inspect}"
|
99
99
|
end
|
@@ -139,44 +139,47 @@ module ShellOpts
|
|
139
139
|
|
140
140
|
protected
|
141
141
|
def match_path(name, literal, kind, method, mode)
|
142
|
-
# file exists and
|
142
|
+
# file exists and the method returned true
|
143
143
|
if File.send(method, literal)
|
144
144
|
if mode == :new
|
145
|
-
set_message "
|
145
|
+
set_message "Won't overwrite #{literal}"
|
146
146
|
elsif kind == :path || kind == :epath
|
147
147
|
if File.file?(literal) || File.directory?(literal)
|
148
148
|
true
|
149
149
|
else
|
150
|
-
set_message "
|
150
|
+
set_message "#{literal} is not a file or a directory"
|
151
151
|
end
|
152
152
|
elsif (kind == :ifile || kind == :ofile) && File.directory?(literal)
|
153
|
-
set_message "
|
153
|
+
set_message "#{literal} is not a device file"
|
154
154
|
else
|
155
155
|
true
|
156
156
|
end
|
157
157
|
|
158
|
-
# file exists but
|
158
|
+
# file exists but the method returned false
|
159
159
|
elsif File.exist?(literal)
|
160
160
|
if kind == :ifile
|
161
161
|
set_message "Can't read #{literal}"
|
162
162
|
elsif kind == :ofile
|
163
163
|
set_message "Can't write to #{literal}"
|
164
164
|
elsif mode == :new
|
165
|
-
set_message "
|
165
|
+
set_message "Won't overwrite #{literal}"
|
166
166
|
else
|
167
|
-
set_message "
|
167
|
+
set_message "#{literal} is not a #{subject}"
|
168
168
|
end
|
169
169
|
|
170
170
|
# file does not exist
|
171
171
|
else
|
172
172
|
if [:default, :new].include? mode
|
173
|
-
|
174
|
-
|
173
|
+
dir = File.dirname(literal)
|
174
|
+
if !File.directory?(dir)
|
175
|
+
set_message "Illegal path - #{literal}"
|
176
|
+
elsif !File.writable?(dir)
|
177
|
+
set_message "Can't create #{subject} #{literal}"
|
175
178
|
else
|
176
|
-
|
179
|
+
true
|
177
180
|
end
|
178
181
|
else
|
179
|
-
set_message "Can't find #{
|
182
|
+
set_message "Can't find #{literal}"
|
180
183
|
end
|
181
184
|
end
|
182
185
|
end
|
@@ -185,7 +188,7 @@ module ShellOpts
|
|
185
188
|
class EnumArgument < ArgumentType
|
186
189
|
attr_reader :values
|
187
190
|
def initialize(values) @values = values.dup end
|
188
|
-
def match?(name, literal) value?(literal) or set_message "Illegal value
|
191
|
+
def match?(name, literal) value?(literal) or set_message "Illegal value - #{literal}" end
|
189
192
|
def value?(value) @values.include?(value) end
|
190
193
|
end
|
191
194
|
end
|
data/lib/shellopts/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shellopts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claus Rasmussen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: forward_to
|