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.
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: []