argshelper 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/argshelper.rb +299 -0
  3. metadata +65 -0
@@ -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
@@ -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: []