argparser 1.0.rc1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +102 -0
- data/argparser.gemspec +1 -1
- data/lib/argparser/examples/example.rb +32 -0
- data/lib/argparser.rb +16 -28
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dfd904524c50a0940710fd85f7739820409c9e10
|
4
|
+
data.tar.gz: a17ea81dc8409f8bd8eaab57a7c2a31ef87dade9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90663f798ea4eced3de8423b969f61203f921e9a32a794d1f4b9b040e70ffe40db88275744da3f7e225288600e5a0e4ce64a2ccb93d840ddb9e2079ff4d15bfb
|
7
|
+
data.tar.gz: 2cdcea748f35be75a1cf26a78cb7b550a94656b4b60ccc1251000211d05afa0f31f63b4b0cd0e6b7c02054ffc8c326169ce6465e594d6e009708add47768752f
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -0,0 +1,102 @@
|
|
1
|
+
# argparser
|
2
|
+
Command line argument parser library, trying to follow POSIX and GNU guidelines.
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
`gem install argparser`, as usual.
|
6
|
+
|
7
|
+
## Usage by example
|
8
|
+
Suppose there's a file named `example.rb` like this:
|
9
|
+
````ruby
|
10
|
+
require 'argparser'
|
11
|
+
args= ArgParser.new( # Here goes the manifest.
|
12
|
+
:program => 'example.rb', # Use additional properties like these:
|
13
|
+
:version => '1.0', # :info, :copyright, :license,
|
14
|
+
:options => [{ # :package, :bugs, :homepage
|
15
|
+
:names => %w[m mode],
|
16
|
+
:argument => 'first|second|third',
|
17
|
+
:default => 'first',
|
18
|
+
:multiple => true,
|
19
|
+
:help => 'Example mode.',
|
20
|
+
:validate => (lambda {|this, parser| # Validating value in-line
|
21
|
+
possible = this.argument.split('|')
|
22
|
+
this.value.select{|v| possible.include?(v)}.size == this.value.size })
|
23
|
+
}, {
|
24
|
+
:names => 'file',
|
25
|
+
:input => true,
|
26
|
+
:required => true,
|
27
|
+
:help => 'Filename or - for stdin.',
|
28
|
+
:validate => (lambda {|this, parser|
|
29
|
+
if this.value == '-'
|
30
|
+
this.value = $stdin.read
|
31
|
+
else
|
32
|
+
parser.terminate(2, 'No such file') unless File.exists?(this.value)
|
33
|
+
this.value = File.read(this.value)
|
34
|
+
end
|
35
|
+
true })
|
36
|
+
}]
|
37
|
+
).parse! # Uses ARGV by default, you may supply your own arguments.
|
38
|
+
# It exits if bad arguments given or they aren't validated.
|
39
|
+
|
40
|
+
puts args['mode'].value.inspect # So we could use our options...
|
41
|
+
puts args['file'].value # Prints contents of a file
|
42
|
+
````
|
43
|
+
|
44
|
+
Now, let's look at the output of example given in various cases.
|
45
|
+
|
46
|
+
`$ ruby example.rb` is unsufficient:
|
47
|
+
````
|
48
|
+
example.rb [-m, --mode first|second|third]... file
|
49
|
+
Expected argument: file
|
50
|
+
````
|
51
|
+
|
52
|
+
`$ ruby example.rb --help` helps:
|
53
|
+
````
|
54
|
+
example.rb [-m, --mode first|second|third]... file
|
55
|
+
[-m, --mode first|second|third]...
|
56
|
+
Example mode.
|
57
|
+
Defaults to: first
|
58
|
+
[--help]
|
59
|
+
Print this help and exit.
|
60
|
+
[--version]
|
61
|
+
Print version and exit.
|
62
|
+
file
|
63
|
+
Filename or - for stdin.
|
64
|
+
````
|
65
|
+
|
66
|
+
`$ echo "content" | ruby example.rb -` does the trick:
|
67
|
+
````
|
68
|
+
["first"]
|
69
|
+
content
|
70
|
+
````
|
71
|
+
|
72
|
+
`$ echo "content" | ruby example.rb --mode fourth -` oopses:
|
73
|
+
````
|
74
|
+
example.rb [-m, --mode first|second|third]... file
|
75
|
+
Invalid option: m
|
76
|
+
````
|
77
|
+
|
78
|
+
`$ echo "content" | ruby example.rb -abcm first -`:
|
79
|
+
````
|
80
|
+
example.rb [-m, --mode first|second|third]... file
|
81
|
+
Unknown option: a
|
82
|
+
````
|
83
|
+
|
84
|
+
## Consider more rules
|
85
|
+
* `--help` and `--version` options provided for free unless specified.
|
86
|
+
* printed synopsys provided for free unless specified
|
87
|
+
* `:default` used if option has :argument and no value given, lowest priority
|
88
|
+
* `:env => 'ENV_VAR'` to pick default value from ENV, high priority
|
89
|
+
* `:eval => 'ruby expr'` to pick default from eval(...), useful for read defaults from config files, so it has low priority
|
90
|
+
* `--`-argument honored
|
91
|
+
|
92
|
+
## Documentation
|
93
|
+
This README is all i could say in a rush. No other documentation provided at this moment, see the sources.
|
94
|
+
|
95
|
+
## If you've found a bug or drawback
|
96
|
+
Don't hesistate to leave a report.
|
97
|
+
|
98
|
+
## License
|
99
|
+
MIT for now.
|
100
|
+
|
101
|
+
## TODO
|
102
|
+
* Go steal milk for the hazards applied.
|
data/argparser.gemspec
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'argparser'
|
2
|
+
args= ArgParser.new( # Here goes the manifest.
|
3
|
+
:program => 'example.rb', # Use additional properties like these:
|
4
|
+
:version => '1.0', # :info, :copyright, :license,
|
5
|
+
:options => [{ # :package, :bugs, :homepage
|
6
|
+
:names => %w[m mode],
|
7
|
+
:argument => 'first|second|third',
|
8
|
+
:default => 'first',
|
9
|
+
:multiple => true,
|
10
|
+
:help => 'Example mode.',
|
11
|
+
:validate => (lambda {|this, parser| # Validating value in-line
|
12
|
+
possible = this.argument.split('|')
|
13
|
+
this.value.select{|v| possible.include?(v)}.size == this.value.size })
|
14
|
+
}, {
|
15
|
+
:names => 'file',
|
16
|
+
:input => true,
|
17
|
+
:required => true,
|
18
|
+
:help => 'Filename or - for stdin.',
|
19
|
+
:validate => (lambda {|this, parser|
|
20
|
+
if this.value == '-'
|
21
|
+
this.value = $stdin.read
|
22
|
+
else
|
23
|
+
parser.terminate(2, 'No such file') unless File.exists?(this.value)
|
24
|
+
this.value = File.read(this.value)
|
25
|
+
end
|
26
|
+
true })
|
27
|
+
}]
|
28
|
+
).parse! # Uses ARGV by default, you may supply your own arguments.
|
29
|
+
# It exits if bad arguments given or they aren't validated.
|
30
|
+
|
31
|
+
puts args['mode'].value.inspect # So we could use our options...
|
32
|
+
puts args['file'].value # Prints contents of a file
|
data/lib/argparser.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
#__END__
|
3
2
|
module Tulz
|
4
3
|
def hash2vars!(hash)
|
@@ -42,9 +41,13 @@ class ArgParser
|
|
42
41
|
OUT_ARGUMENT_EXPECTED = 'Expected argument: %s'
|
43
42
|
OUT_UNIQUE_NAME = 'Option name should be unique: %s'
|
44
43
|
INVALID_OPTION = 'Invalid option: %s'
|
44
|
+
OPT_ENOUGH = '--'
|
45
|
+
|
46
|
+
# These options don't display their synopsis and given for free unless
|
47
|
+
# explicitly specified in the manifest.
|
45
48
|
OPT_HELP = 'help'
|
46
49
|
OPT_VERSION = 'version'
|
47
|
-
|
50
|
+
OPTS_RESERVED = [OPT_HELP, OPT_VERSION]
|
48
51
|
|
49
52
|
class Option
|
50
53
|
include Tulz
|
@@ -200,7 +203,7 @@ class ArgParser
|
|
200
203
|
end
|
201
204
|
end
|
202
205
|
|
203
|
-
|
206
|
+
OPTS_RESERVED.each { |o|
|
204
207
|
next unless arguments.include?("--#{o}")
|
205
208
|
o = self[o]
|
206
209
|
o.set_value(nil)
|
@@ -229,7 +232,7 @@ class ArgParser
|
|
229
232
|
option.set_value(nil)
|
230
233
|
end
|
231
234
|
else
|
232
|
-
terminate(2, OUT_UNKNOWN_OPTION %
|
235
|
+
terminate(2, OUT_UNKNOWN_OPTION % $1)
|
233
236
|
end
|
234
237
|
elsif a =~ /^-([^-].*)/ # short option, may combine and has an arg at end
|
235
238
|
(opts = $1).chars.to_a.each_with_index do |char, index|
|
@@ -249,7 +252,7 @@ class ArgParser
|
|
249
252
|
option.set_value(nil)
|
250
253
|
end
|
251
254
|
else
|
252
|
-
terminate(2, OUT_UNKNOWN_OPTION %
|
255
|
+
terminate(2, OUT_UNKNOWN_OPTION % char)
|
253
256
|
end
|
254
257
|
end
|
255
258
|
else
|
@@ -334,33 +337,18 @@ class ArgParser
|
|
334
337
|
|
335
338
|
def printed_synopsis
|
336
339
|
s = synopsis ||
|
337
|
-
(options.select{|o| !o.input} + inputs).map{|o|
|
340
|
+
(options.select{|o| !o.input} + inputs).map{|o|
|
341
|
+
OPTS_RESERVED.include?(o.name) ? nil : o.synopsis}.compact.join(' ')
|
338
342
|
"#{program} #{s}"
|
339
343
|
end
|
340
344
|
|
341
|
-
if __FILE__ == $0 # Some selftests
|
345
|
+
if __FILE__ == $0 # Some selftests... while hakin in an editor
|
342
346
|
$stdout.sync = true
|
343
347
|
$stderr.sync = true
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
:options => [{
|
349
|
-
:names => 'group',
|
350
|
-
:input => true,
|
351
|
-
:required => true,
|
352
|
-
:help => 'Name of a group'
|
353
|
-
},{
|
354
|
-
:names => 'command',
|
355
|
-
:input => true,
|
356
|
-
:required => true,
|
357
|
-
:multiple => true,
|
358
|
-
:help => 'command to execute'
|
359
|
-
}]
|
360
|
-
).parse!(%w[--help])
|
361
|
-
|
362
|
-
puts args.options.map(&:to_s).join("\n")
|
363
|
-
puts 'OK!'
|
348
|
+
ARGV = %w[--abcm first]
|
349
|
+
example = File.read('argparser/examples/example.rb')
|
350
|
+
example = example.split("\n")[1..-1].join("\n") # Cut 'require' string
|
351
|
+
eval(example) # Last line
|
364
352
|
end
|
365
353
|
|
366
|
-
end #
|
354
|
+
end # the very end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: argparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sinm
|
@@ -21,6 +21,7 @@ files:
|
|
21
21
|
- README.md
|
22
22
|
- argparser.gemspec
|
23
23
|
- lib/argparser.rb
|
24
|
+
- lib/argparser/examples/example.rb
|
24
25
|
homepage: https://github.com/sinm/argparser
|
25
26
|
licenses:
|
26
27
|
- MIT
|
@@ -36,9 +37,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
36
37
|
version: '0'
|
37
38
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
39
|
requirements:
|
39
|
-
- - "
|
40
|
+
- - ">="
|
40
41
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
42
|
+
version: '0'
|
42
43
|
requirements: []
|
43
44
|
rubyforge_project:
|
44
45
|
rubygems_version: 2.2.2
|