optsparser_generator 2.6 → 4.4
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 +5 -5
- data/README.md +12 -3
- data/lib/optsparser_generator.rb +91 -37
- metadata +47 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a46c488e646d9dd044a7532ded2d73e30b039a33941641b2a7869cad28e747f7
|
4
|
+
data.tar.gz: 9aeeff83f3124af811a4e7ac07c36ce4d7482462d4bb1815dc5c2deddba52aac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f42a1fbf5276adc74bbf913d397e7d2365de057f6be342b651cdd08b7d87d8948dc5d8f401a9d7c3bf8628b267613a9b31368fb2f53b4e33fa1ef84604a420ba
|
7
|
+
data.tar.gz: 06f009faa14e5be34cf0069d03a58fd8e6682839e3c86c6432de5aa3aff0b9c44c7da074d36fac9d18bde9e40c37e2d2c4a625c184e07d7284232e2c4495aabc
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# OptionParser Generator
|
2
|
-
[](http://inch-ci.org/github/madblobfish/optionparser-generator)
|
3
2
|
[](https://travis-ci.org/madblobfish/optionparser-generator)
|
3
|
+
[](https://gemnasium.com/github.com/madblobfish/optionparser-generator)
|
4
|
+
[](http://inch-ci.org/github/madblobfish/optionparser-generator)
|
4
5
|
|
5
6
|
Small gem which generates an OptionParser object from an OpenStruct.
|
6
7
|
|
@@ -10,7 +11,7 @@ Small gem which generates an OptionParser object from an OpenStruct.
|
|
10
11
|
# Usage
|
11
12
|
```ruby
|
12
13
|
require 'optsparser_generator'
|
13
|
-
# step one define OpenStruct with default values
|
14
|
+
# step one define OpenStruct with default and special values
|
14
15
|
os = OpenStruct.new
|
15
16
|
os.default = 'value'
|
16
17
|
os.val = 123
|
@@ -19,11 +20,19 @@ os.val__class = Numeric
|
|
19
20
|
os.bool = true
|
20
21
|
os.bool__help = 'description of argument'
|
21
22
|
os.bool__short = 'b'
|
23
|
+
os.test = "don't know"
|
24
|
+
os.test__proc = Proc.new do |value|
|
25
|
+
puts value
|
26
|
+
"some-#{value}-conversion"
|
27
|
+
end
|
22
28
|
os.freeze
|
23
29
|
|
24
30
|
# step two generate OptionParser
|
25
31
|
opt_parser = OptParseGen(os)
|
26
32
|
opt_parser = OptionParserGenerator(os)
|
33
|
+
opt_parser.parse!(ARGV)
|
34
|
+
# or parse options directly
|
35
|
+
OptParseGen.parse(os) # takes ARGV or an array
|
27
36
|
```
|
28
37
|
|
29
38
|
## Special values
|
@@ -31,11 +40,11 @@ opt_parser = OptionParserGenerator(os)
|
|
31
40
|
* __values defines possible values in an Array
|
32
41
|
* __short defines the short trigger
|
33
42
|
* __class defines the Class which OptionParser then tries to coerce to
|
43
|
+
* __proc a Proc which will be executed to compute the value
|
34
44
|
|
35
45
|
# Version numbers
|
36
46
|
I choose two digit version numbers.
|
37
47
|
The first digit indicates breaking changes.
|
38
48
|
Second digit increases per release.
|
39
49
|
|
40
|
-
|
41
50
|
Enjoy
|
data/lib/optsparser_generator.rb
CHANGED
@@ -3,6 +3,15 @@ require 'optparse'
|
|
3
3
|
|
4
4
|
# Small lib for generating an OptionParser from an OpenStruct
|
5
5
|
module OptionParserGenerator
|
6
|
+
# Special postfixes for Hash keys
|
7
|
+
SPECIAL_POSTFIXES = [
|
8
|
+
'--help',
|
9
|
+
'--values',
|
10
|
+
'--short',
|
11
|
+
'--class',
|
12
|
+
'--proc'
|
13
|
+
].freeze
|
14
|
+
|
6
15
|
# Raised when not given an OpenStruct
|
7
16
|
class WrongArgumentType < ArgumentError
|
8
17
|
end
|
@@ -13,6 +22,16 @@ module OptionParserGenerator
|
|
13
22
|
class OptionCollision < ArgumentError
|
14
23
|
end
|
15
24
|
|
25
|
+
# utility methods
|
26
|
+
# @api private
|
27
|
+
module OpenStructExtension
|
28
|
+
# extracts a special value from the openstruct
|
29
|
+
def special_value(key, string)
|
30
|
+
self["#{key}__#{string}"]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
private_constant :OpenStructExtension
|
34
|
+
|
16
35
|
# Does some sanity checks and prepares the OpenStruct
|
17
36
|
# @todo preprocess data here instead of doing it adhoc
|
18
37
|
# @todo raise more exceptions
|
@@ -21,8 +40,11 @@ module OptionParserGenerator
|
|
21
40
|
unless ostruct.is_a?(OpenStruct)
|
22
41
|
raise WrongArgumentType, 'needs an OpenStruct'
|
23
42
|
end
|
24
|
-
ostruct.dup
|
43
|
+
ostruct = ostruct.dup
|
44
|
+
ostruct.extend(OpenStructExtension)
|
45
|
+
ostruct.freeze # freeze is not needed but makes development easier
|
25
46
|
end
|
47
|
+
private_class_method :handle_arguments
|
26
48
|
|
27
49
|
# Does the magic
|
28
50
|
#
|
@@ -30,92 +52,124 @@ module OptionParserGenerator
|
|
30
52
|
# @todo split this up
|
31
53
|
# @param ostruct [OpenStruct] Default values with special values
|
32
54
|
# @param options [Hash]
|
33
|
-
# @option options [Boolean]
|
55
|
+
# @option options [Boolean]
|
56
|
+
# :ignore_collisions ignore bool key collisions see OptionCollision
|
57
|
+
# :generate_no_help when set to true donesn't generates help command
|
34
58
|
def self.[](ostruct, **options)
|
35
59
|
defaults = handle_arguments(ostruct)
|
36
60
|
|
37
61
|
optparser = OptionParser.new do |opts|
|
38
62
|
defaults.each_pair do |key, val|
|
39
63
|
trigger = key.to_s.tr('_', '-')
|
40
|
-
next if trigger.end_with?(
|
41
|
-
|
42
|
-
|
43
|
-
values = defaults["#{key}__values"] || []
|
44
|
-
short = defaults["#{key}__short"] || ''
|
45
|
-
arguments = []
|
46
|
-
arguments << help
|
47
|
-
arguments << "-#{short}" unless short.empty?
|
64
|
+
next if trigger.end_with?(*SPECIAL_POSTFIXES)
|
65
|
+
|
66
|
+
arguments = generate_arguments(defaults, key, val)
|
48
67
|
case val
|
49
68
|
when FalseClass, TrueClass
|
69
|
+
uneven_no = /\Ano(-no-no)*-(?!no)/ =~ trigger
|
50
70
|
if trigger.start_with?('no-')
|
51
|
-
trigger
|
52
|
-
|
53
|
-
raise OptionCollision, "on #{key}"
|
54
|
-
end
|
71
|
+
trigger.gsub!(/\A(no-)+/, '') # removes no- prefixes
|
72
|
+
check_collisions(trigger, key, defaults) unless options[:ignore_collisions]
|
55
73
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
!b
|
61
|
-
else
|
62
|
-
b
|
63
|
-
end
|
74
|
+
arguments.unshift "--[no-]#{trigger}"
|
75
|
+
block = lambda do |bool|
|
76
|
+
# inverted when it starts with no_
|
77
|
+
bool ^ uneven_no
|
64
78
|
end
|
65
79
|
else
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
80
|
+
klass = val.class
|
81
|
+
klass = val.is_a?(Integer) ? Integer : klass
|
82
|
+
klass = defaults.special_value(key, 'class') || klass
|
83
|
+
arguments.push klass
|
84
|
+
|
85
|
+
values = defaults.special_value(key, 'values')
|
86
|
+
arguments.push values if values
|
87
|
+
arguments.unshift "--#{trigger}=ARG"
|
88
|
+
block = lambda do |str|
|
89
|
+
str
|
71
90
|
end
|
72
91
|
end
|
92
|
+
if (proc = defaults.special_value(key, 'proc'))
|
93
|
+
block = proc
|
94
|
+
end
|
95
|
+
opts.on(*arguments) do |arg|
|
96
|
+
opts.instance_variable_get(:@out)[key] = block.call(arg)
|
97
|
+
end
|
73
98
|
end
|
74
99
|
|
75
|
-
|
76
|
-
|
77
|
-
|
100
|
+
unless options[:generate_no_help]
|
101
|
+
opts.on('-h', '--help') do
|
102
|
+
puts opts
|
103
|
+
exit
|
104
|
+
end
|
78
105
|
end
|
79
106
|
end
|
80
107
|
|
81
108
|
# add default values
|
82
109
|
optparser.instance_variable_set(:@defaults, defaults)
|
83
110
|
optparser.extend(OptParsePatch)
|
84
|
-
optparser
|
85
111
|
end
|
86
112
|
|
113
|
+
# returns an array of helptext and
|
114
|
+
# if set the short version of trigger
|
115
|
+
# @api private
|
116
|
+
def self.generate_arguments(defaults, key, val)
|
117
|
+
short = defaults.special_value(key, 'short') || ''
|
118
|
+
if short.length > 1
|
119
|
+
raise ArgumentError, 'short is too long, it has to be only one character'
|
120
|
+
end
|
121
|
+
|
122
|
+
help = "#{defaults.special_value(key, 'help')} (Default: #{val})"
|
123
|
+
|
124
|
+
if short.empty?
|
125
|
+
[help]
|
126
|
+
else
|
127
|
+
[help, "-#{short}"]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
private_class_method :generate_arguments
|
131
|
+
|
132
|
+
# @api private
|
133
|
+
def self.check_collisions(trigger, key, defaults)
|
134
|
+
if defaults.each_pair.map{ |v| v.first.to_s }.include?(trigger)
|
135
|
+
raise OptionCollision, "on #{key}"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
private_class_method :check_collisions
|
139
|
+
|
87
140
|
# patch for OptionParser redefines parse and parse!
|
88
141
|
# @api private
|
89
142
|
module OptParsePatch
|
90
143
|
# @return [OpenStruct]
|
91
|
-
def parse!(*params)
|
144
|
+
def parse!(*params, **opts)
|
92
145
|
@out = @defaults.dup
|
93
146
|
super
|
94
147
|
@out
|
95
148
|
end
|
96
149
|
|
97
150
|
# @return [OpenStruct]
|
98
|
-
def parse(*params)
|
151
|
+
def parse(*params, **opts)
|
99
152
|
@out = @defaults.dup
|
100
153
|
super
|
101
154
|
@out
|
102
155
|
end
|
103
156
|
end
|
157
|
+
private_constant :OptParsePatch
|
104
158
|
|
105
159
|
# Shorthand when parsing is only needed once.
|
106
160
|
#
|
107
161
|
# Generates an OptionParser and calls parse on it
|
108
162
|
# @see OptionParserGenerator#[]
|
109
163
|
# @return [OpenStruct]
|
110
|
-
def self.parse(ostruct, argv
|
111
|
-
self[ostruct, opt].parse(argv)
|
164
|
+
def self.parse(ostruct, argv, **opt)
|
165
|
+
self[ostruct, **opt].parse(argv)
|
112
166
|
end
|
113
167
|
|
114
168
|
# Same as parse, removes parsed elements from argv
|
115
169
|
# @see OptionParserGenerator#parse
|
116
170
|
# @return [OpenStruct]
|
117
171
|
def self.parse!(ostruct, argv = ARGV, **opt)
|
118
|
-
self[ostruct, opt].parse!(argv)
|
172
|
+
self[ostruct, **opt].parse!(argv)
|
119
173
|
end
|
120
174
|
end
|
121
175
|
# Object alias
|
@@ -130,7 +184,7 @@ OptParseGen = OptionParserGenerator
|
|
130
184
|
# @return [OptionParser]
|
131
185
|
# @see OptionParserGenerator
|
132
186
|
def OptionParserGenerator(arg, **opt)
|
133
|
-
OptionParserGenerator[arg, opt]
|
187
|
+
OptionParserGenerator[arg, **opt]
|
134
188
|
end
|
135
189
|
alias OptParseGen OptionParserGenerator
|
136
190
|
|
metadata
CHANGED
@@ -1,87 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optsparser_generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '4.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marvin Zerulla
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
+
- - "<"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '13'
|
17
20
|
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
22
|
+
version: 11.2.0
|
20
23
|
type: :development
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
27
|
+
- - "<"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '13'
|
24
30
|
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
32
|
+
version: 11.2.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
34
|
+
name: rspec
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
37
|
+
- - "<"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '4'
|
31
40
|
- - ">="
|
32
41
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
42
|
+
version: 3.5.0
|
34
43
|
type: :development
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
47
|
+
- - "<"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '4'
|
38
50
|
- - ">="
|
39
51
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
52
|
+
version: 3.5.0
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
54
|
+
name: rubocop
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
57
|
- - ">="
|
46
58
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
59
|
+
version: '0'
|
48
60
|
type: :development
|
49
61
|
prerelease: false
|
50
62
|
version_requirements: !ruby/object:Gem::Requirement
|
51
63
|
requirements:
|
52
64
|
- - ">="
|
53
65
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
66
|
+
version: '0'
|
55
67
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
68
|
+
name: simplecov
|
57
69
|
requirement: !ruby/object:Gem::Requirement
|
58
70
|
requirements:
|
71
|
+
- - "<"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '1'
|
59
74
|
- - ">="
|
60
75
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
76
|
+
version: 0.12.0
|
62
77
|
type: :development
|
63
78
|
prerelease: false
|
64
79
|
version_requirements: !ruby/object:Gem::Requirement
|
65
80
|
requirements:
|
81
|
+
- - "<"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '1'
|
66
84
|
- - ">="
|
67
85
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
86
|
+
version: 0.12.0
|
69
87
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
88
|
+
name: yard
|
71
89
|
requirement: !ruby/object:Gem::Requirement
|
72
90
|
requirements:
|
91
|
+
- - "<"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1'
|
73
94
|
- - ">="
|
74
95
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
96
|
+
version: '0.8'
|
76
97
|
type: :development
|
77
98
|
prerelease: false
|
78
99
|
version_requirements: !ruby/object:Gem::Requirement
|
79
100
|
requirements:
|
101
|
+
- - "<"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1'
|
80
104
|
- - ">="
|
81
105
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
83
|
-
description:
|
84
|
-
email:
|
106
|
+
version: '0.8'
|
107
|
+
description:
|
108
|
+
email:
|
85
109
|
executables: []
|
86
110
|
extensions: []
|
87
111
|
extra_rdoc_files:
|
@@ -95,7 +119,7 @@ homepage: https://github.com/madblobfish/optionparser-generator
|
|
95
119
|
licenses:
|
96
120
|
- AGPL-1.0
|
97
121
|
metadata: {}
|
98
|
-
post_install_message:
|
122
|
+
post_install_message:
|
99
123
|
rdoc_options: []
|
100
124
|
require_paths:
|
101
125
|
- lib
|
@@ -110,9 +134,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
134
|
- !ruby/object:Gem::Version
|
111
135
|
version: '0'
|
112
136
|
requirements: []
|
113
|
-
|
114
|
-
|
115
|
-
signing_key:
|
137
|
+
rubygems_version: 3.2.15
|
138
|
+
signing_key:
|
116
139
|
specification_version: 4
|
117
140
|
summary: Generates OptionParser using an OpenStruct
|
118
141
|
test_files: []
|