argshelper 0.1.11
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 +7 -0
- data/lib/argshelper.rb +299 -0
- metadata +65 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2d5bb8eae8869a2448e7d257c605be81b82f3ad46735527b88c67c0b4fcfb791
|
4
|
+
data.tar.gz: ce1e418d747f131e08d7e478736467e984d84a8ba7cafd277fa06d3f3d1cb245
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dc60f0cd146e98b5fd1c35f771aec842aa23d410fb53c4ccd58dd0c9dbaad702a92e7fc0aad1eadef926e6e7c29b54d278843f0d69c71f86c846016937f681d8
|
7
|
+
data.tar.gz: 2f0f960f994ffeded325e3fbfc42dfdab3bb363c47a7e37642dc653031d7374c316419db8cf3db2a639bab01e212b55deda0c32977f4944b76beff0b8dde5725
|
data/lib/argshelper.rb
ADDED
@@ -0,0 +1,299 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
class Hash
|
4
|
+
|
5
|
+
def has_blank?
|
6
|
+
self.values.any?{|v| v.nil? || v.length == 0}
|
7
|
+
end
|
8
|
+
|
9
|
+
def contains_keys?(keys)
|
10
|
+
keys.any? do |key|
|
11
|
+
self.key?(key)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @author sleepless-p03t
|
17
|
+
class ArgsHelper
|
18
|
+
|
19
|
+
class BiHash
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
@forward = {}
|
23
|
+
@reverse = {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def insert(k, v)
|
27
|
+
@forward[k] = v
|
28
|
+
@reverse[v] = k
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_value(v)
|
32
|
+
if @forward.has_key?(v)
|
33
|
+
return @forward[v]
|
34
|
+
elsif @reverse.has_key?(v)
|
35
|
+
return @reverse[v]
|
36
|
+
else
|
37
|
+
return nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private_constant :BiHash
|
43
|
+
attr_reader :BiHash
|
44
|
+
|
45
|
+
# Initialize the helper
|
46
|
+
# @param args [Array] Argument array to process
|
47
|
+
def initialize(args)
|
48
|
+
@args_a = args
|
49
|
+
@args = nil
|
50
|
+
@skeys = []
|
51
|
+
@lkeys = []
|
52
|
+
@kvals = []
|
53
|
+
@kdescriptions = []
|
54
|
+
|
55
|
+
@static = {}
|
56
|
+
|
57
|
+
@no_vals = []
|
58
|
+
|
59
|
+
@flag_pairs = BiHash.new
|
60
|
+
end
|
61
|
+
|
62
|
+
# Define specific options available for a certain flag
|
63
|
+
# @param sflag [String] Short flag
|
64
|
+
# @param lflag [String] Long flag
|
65
|
+
# @param opts [Array] Flag options
|
66
|
+
def add_static_flag_opts(sflag = nil, lflag = nil, opts = [])
|
67
|
+
if sflag != nil
|
68
|
+
@static[sflag] = opts
|
69
|
+
end
|
70
|
+
|
71
|
+
if lflag != nil
|
72
|
+
@static[lflag] = opts
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Add argument keys
|
77
|
+
# @param skey [Array, String] Short keys or short key
|
78
|
+
# @param lkey [Array, String] Long keys or long key
|
79
|
+
# @param kval [Array, String] Value description(s) or possible value(s)
|
80
|
+
# @param kdescription [Array, String] Key description(s)
|
81
|
+
def add_keys(skey = nil, lkey = nil, kval = nil, kdescription = nil)
|
82
|
+
|
83
|
+
arrays = [ skey.is_a?(Array) || skey == nil, lkey.is_a?(Array) || lkey == nil, kval.is_a?(Array) || kval == nil, kdescription.is_a?(Array) || kdescription == nil ]
|
84
|
+
strings = [ skey.is_a?(String) || skey == nil, lkey.is_a?(String) || lkey == nil, kval.is_a?(String) || kval == nil, kdescription.is_a?(String) || kdescription == nil ]
|
85
|
+
|
86
|
+
if arrays.include?(true) && arrays.include?(false)
|
87
|
+
puts "Mismatched types: Expected either Arrays or Strings"
|
88
|
+
exit
|
89
|
+
end
|
90
|
+
|
91
|
+
if arrays.include?(true)
|
92
|
+
skey = [] if skey == nil
|
93
|
+
lkey = [] if lkey == nil
|
94
|
+
kval = [] if kval == nil
|
95
|
+
kdescription = [] if kdescription == nil
|
96
|
+
|
97
|
+
if skey != []
|
98
|
+
skey.each_with_index do |sk, i|
|
99
|
+
if lkey != []
|
100
|
+
@flag_pairs.insert(sk, lkey[i])
|
101
|
+
else
|
102
|
+
@flag_pairs.insert(sk, nil)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
if lkey != [] && skey == []
|
108
|
+
lkey.each do |lk|
|
109
|
+
@flag_pairs.insert(lk, nil)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
@skeys = skey
|
114
|
+
@lkeys = lkey
|
115
|
+
@kvals = kval
|
116
|
+
@kdescriptions = kdescription
|
117
|
+
return
|
118
|
+
end
|
119
|
+
|
120
|
+
if strings.include?(true)
|
121
|
+
skey = '' if skey == nil
|
122
|
+
lkey = '' if lkey == nil
|
123
|
+
kval = '' if kval == nil
|
124
|
+
kdescription = '' if kdescription == nil
|
125
|
+
@skeys.push(skey)
|
126
|
+
@lkeys.push(lkey)
|
127
|
+
@kvals.push(kval)
|
128
|
+
@kdescriptions.push(kdescription)
|
129
|
+
if skey != ''
|
130
|
+
@flag_pairs.insert(skey, lkey)
|
131
|
+
end
|
132
|
+
|
133
|
+
if lkey != '' && skey == ''
|
134
|
+
@flag_pairs.insert(lkey, skey)
|
135
|
+
end
|
136
|
+
return
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Flag doesn't have a corresponding value
|
141
|
+
# @param sflag [String] Short flag
|
142
|
+
# @param lflag [String] Long flag
|
143
|
+
def set_no_value(sflag = nil, lflag = nil)
|
144
|
+
if sflag == nil && lflag == nil
|
145
|
+
return
|
146
|
+
end
|
147
|
+
|
148
|
+
if sflag != nil
|
149
|
+
if @args_a.include?(sflag)
|
150
|
+
index = @args_a.find_index(sflag)
|
151
|
+
@args_a = @args_a.insert(index + 1, nil)
|
152
|
+
@no_vals.push(sflag)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
if lflag != nil
|
157
|
+
if @args_a.include?(lflag)
|
158
|
+
index = @args_a.find_index(lflag)
|
159
|
+
@args_a = @args_a.insert(index + 1, nil)
|
160
|
+
@no_vals.push(lflag)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Main processing of argument flags
|
166
|
+
# Handles errors in flags and flag values
|
167
|
+
def parse_args
|
168
|
+
@args = @args_a.each_slice(2).to_a.inject({}) { |h, k| h[k[0]] = k[1]; h }
|
169
|
+
keys = @skeys + @lkeys
|
170
|
+
@args.each do |k, v|
|
171
|
+
if !keys.include?(k)
|
172
|
+
puts "Unknown option `#{k}'"
|
173
|
+
exit
|
174
|
+
end
|
175
|
+
|
176
|
+
if keys.include?(v)
|
177
|
+
puts "Missing values for `#{k}' and `#{v}'"
|
178
|
+
exit
|
179
|
+
end
|
180
|
+
|
181
|
+
if v != nil
|
182
|
+
if v.start_with?('-')
|
183
|
+
puts "Warning: Value of `#{k}' appears to be a flag"
|
184
|
+
end
|
185
|
+
|
186
|
+
if @static.has_key?(k)
|
187
|
+
if !@static[k].include?(v)
|
188
|
+
puts "Unknown option `#{v}' for `#{k}'"
|
189
|
+
exit
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
if remove_keys(@no_vals).has_blank?
|
196
|
+
puts "Missing argument(s)"
|
197
|
+
exit
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Returns whether a flag has been found
|
202
|
+
# @param flag [String] Short or long flag
|
203
|
+
# @return [Boolean] If argument passed from command line
|
204
|
+
def has_arg?(flag)
|
205
|
+
fp = @flag_pairs.get_value(flag)
|
206
|
+
return fp != nil && (@args_a.include?(flag) || @args_a.include?(fp))
|
207
|
+
end
|
208
|
+
|
209
|
+
# Returns the value of a given flag
|
210
|
+
# @param flag [String] Short or long flag
|
211
|
+
# @return [String, nil]
|
212
|
+
def get_value(flag)
|
213
|
+
fp = @flag_pairs.get_value(flag)
|
214
|
+
if !@no_vals.include?(flag)
|
215
|
+
if @args.has_key?(flag)
|
216
|
+
return @args[flag]
|
217
|
+
elsif @args.has_key?(fp) && fp != nil
|
218
|
+
return @args[fp]
|
219
|
+
else
|
220
|
+
return nil
|
221
|
+
end
|
222
|
+
else
|
223
|
+
return nil
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# Display a help table
|
228
|
+
def show_default_table
|
229
|
+
show_table("Options", 2, @skeys, @lkeys, @kvals, @kdescriptions)
|
230
|
+
end
|
231
|
+
|
232
|
+
# Display contents in a table
|
233
|
+
# @param title [String] Table title
|
234
|
+
# @param pad [Integer] Minimum space between left and right sides of column
|
235
|
+
# @param cols [Array] Array(s) of table column data
|
236
|
+
def show_table(title, pad, *cols)
|
237
|
+
mlcols = []
|
238
|
+
cols = cols.map { |x| x == [] ? nil : x }
|
239
|
+
cols.compact!
|
240
|
+
cols.each do |c|
|
241
|
+
if c.is_a? Array
|
242
|
+
mlcols.push(c.map(&:to_s).max_by(&:length).length)
|
243
|
+
elsif c.is_a? String
|
244
|
+
mlcols.push(c.length)
|
245
|
+
elsif c.is_a? Numeric
|
246
|
+
mlcols.push(c.to_s.length)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
clens = []
|
251
|
+
mlcols.each { |m| clens.push((pad * 2) + m) }
|
252
|
+
rows = cols.transpose
|
253
|
+
|
254
|
+
sum = clens.inject(0){ |s, x| s + x }
|
255
|
+
|
256
|
+
sum += cols.length - 1
|
257
|
+
tlen = title.length
|
258
|
+
tpadl = (sum - tlen) / 2
|
259
|
+
tpadr = sum - (tlen + tpadl)
|
260
|
+
|
261
|
+
print '+'
|
262
|
+
print '-' * sum
|
263
|
+
puts '+'
|
264
|
+
print '|'
|
265
|
+
print ' ' * tpadl
|
266
|
+
print title
|
267
|
+
print ' ' * tpadr
|
268
|
+
puts '|'
|
269
|
+
clens.each do |l|
|
270
|
+
print '+'
|
271
|
+
print '-' * l
|
272
|
+
end
|
273
|
+
puts '+'
|
274
|
+
|
275
|
+
rows.each do |row|
|
276
|
+
row.each_with_index do |col, i|
|
277
|
+
len = clens[i] - col.length - pad
|
278
|
+
print '|'
|
279
|
+
print ' ' * pad
|
280
|
+
print col
|
281
|
+
print ' ' * len
|
282
|
+
end
|
283
|
+
puts '|'
|
284
|
+
end
|
285
|
+
|
286
|
+
clens.each do |l|
|
287
|
+
print '+'
|
288
|
+
print '-' * l
|
289
|
+
end
|
290
|
+
puts '+'
|
291
|
+
end
|
292
|
+
|
293
|
+
private
|
294
|
+
def remove_keys(keys)
|
295
|
+
args = @args
|
296
|
+
keys.each { |k| args.delete(k) }
|
297
|
+
return args
|
298
|
+
end
|
299
|
+
end
|
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: argshelper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.11
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- sleepless-p03t
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-10-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: yard
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.9'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.9.20
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.9'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.9.20
|
33
|
+
description: A simple command line argument helper
|
34
|
+
email: sleepless.genesis6@gmail.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- lib/argshelper.rb
|
40
|
+
homepage: https://rubygems.org/gems/argshelper
|
41
|
+
licenses:
|
42
|
+
- MIT
|
43
|
+
metadata:
|
44
|
+
yard.run: yri
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
requirements: []
|
60
|
+
rubyforge_project:
|
61
|
+
rubygems_version: 2.7.6.2
|
62
|
+
signing_key:
|
63
|
+
specification_version: 4
|
64
|
+
summary: Command line arg aid
|
65
|
+
test_files: []
|