optplus 0.0.8 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/Bugs.rdoc +2 -2
- data/History.txt +32 -0
- data/README.md +16 -6
- data/lib/optplus.rb +51 -2
- data/lib/optplus/IO.rb +69 -0
- data/lib/optplus/nested.rb +22 -14
- data/lib/optplus/version.rb +8 -8
- data/test/io.rb +54 -0
- metadata +14 -15
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NjRmMGU3Zjg3ZjJmOGI3MDE1MDJlODBlM2U5NWQ1NjA3ZjQyYzBmODg3OWM5
|
10
|
-
MzA5YTE1ODRlMDNmMTdmYmNjYjhjNmQzNmRmZmRhMDM3YmZkMzJhOWQ5MGFj
|
11
|
-
ZGM0Y2FkNmJjOTRlYjkwN2ZmOGE2MDY5MzkyYzMwZGUzZTY1YzA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YWZkNDdlMzBmNzI5OTMwOTc4MGFlNDU5Njg4NGViNDE0Njk0ZDFhOTcwMmU3
|
14
|
-
NDQ4ZDI1NTFmMjQ3ODQzODQ5MmM2NzJlZmYyZTZmMjVmOGZlOWFlMTc5YTUz
|
15
|
-
MDUyYWFkYzI2MTI1MzUwOWQ0MzRiNGE4MzY0ZDZiOWM2ZmE5NWI=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 837e2be0083321ed2ac1f4c2f7bc55c1364d5c1d
|
4
|
+
data.tar.gz: e6f5c0104b89eefa6d90a7a4fe37087820e95a77
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 90149013724f89a2d134c9092ee2714704113cf7a3edf0375f72fe7b77654ce103cd41ccef1443ddce4d20751ac6326144ad4337ea580deac499453d1cae47e0
|
7
|
+
data.tar.gz: 2d285f5e7484927b1ce73e87cef4b98b7f5f4d84dade24b4461938f7e69216f9593effaade57b7742c4383e9c53a33785c70d04ab1c5caa4c61da935b5c0226a
|
data/Bugs.rdoc
CHANGED
data/History.txt
CHANGED
@@ -2,6 +2,38 @@
|
|
2
2
|
# @title Change History
|
3
3
|
|
4
4
|
== History
|
5
|
+
[optplus-0.0.16 28-Nov-2014]
|
6
|
+
|
7
|
+
Add instance attribute to read options hash
|
8
|
+
|
9
|
+
[optplus-0.0.15 12-Dec-2013]
|
10
|
+
|
11
|
+
Clean up spacing etc
|
12
|
+
|
13
|
+
[optplus-0.0.14 12-Dec-2013]
|
14
|
+
|
15
|
+
Added in a sort of man facility with --man to print out all the help in one go
|
16
|
+
|
17
|
+
[optplus-0.0.13 11-Dec-2013]
|
18
|
+
|
19
|
+
Set IO to output on $stderr - testing in RL to see if this is workable
|
20
|
+
|
21
|
+
[optplus-0.0.12 25-Oct-2013]
|
22
|
+
|
23
|
+
Test for @@_help before assuming it exists in nested parser (140)
|
24
|
+
|
25
|
+
[optplus-0.0.11 25-Oct-2013]
|
26
|
+
|
27
|
+
Add IO convenience methods for displyaing output and getting responses
|
28
|
+
|
29
|
+
[optplus-0.0.10 24-Oct-2013]
|
30
|
+
|
31
|
+
Add empty help hash if no help defined when calling run!
|
32
|
+
|
33
|
+
[optplus-0.0.9 24-Oct-2013]
|
34
|
+
|
35
|
+
Drop call to before_all in nested - should be called anyway by run!
|
36
|
+
|
5
37
|
[optplus-0.0.8 13-Sep-2013]
|
6
38
|
|
7
39
|
Release Candidate with nesting etc.
|
data/README.md
CHANGED
@@ -49,16 +49,17 @@ Here is a simple example:
|
|
49
49
|
end
|
50
50
|
|
51
51
|
describe :show, 'show all of the items that match the string given'
|
52
|
+
|
53
|
+
help :show, "A more details description of the show action",
|
54
|
+
"that can again spread over multiple lines",
|
55
|
+
"and is displayed when the user types mycli show -h"
|
56
|
+
|
52
57
|
def show
|
53
58
|
matches = next_argument_or_error('You must provide a string to match')
|
54
59
|
|
55
60
|
# do the stuff
|
56
61
|
|
57
62
|
end
|
58
|
-
help :show, "A more details description of the show action",
|
59
|
-
"that can again spread over multiple lines",
|
60
|
-
"and is displayed when the user types mycli show -h"
|
61
|
-
|
62
63
|
end
|
63
64
|
|
64
65
|
Mycli.run! # don't forget!
|
@@ -104,11 +105,11 @@ Using Optplus involves the following:
|
|
104
105
|
|
105
106
|
> **describe** -- links an action (as a symbol) to a one line description.
|
106
107
|
|
107
|
-
> **action_ method** -- for the action itself, having the same name as the symbol above
|
108
|
-
|
109
108
|
> **help** - links the action to multi-line help text that will be displayed when
|
110
109
|
the --help option is used with the action
|
111
110
|
|
111
|
+
> **action_ method** -- for the action itself, having the same name as the symbol above
|
112
|
+
|
112
113
|
* And finally, if you need to tidy up afterwards you can define an after_actions
|
113
114
|
method.
|
114
115
|
|
@@ -142,6 +143,10 @@ simply by calling helper methods:
|
|
142
143
|
You can change the short-form switch by adding a different one:
|
143
144
|
|
144
145
|
debug_option(opts, '-d')
|
146
|
+
|
147
|
+
Finally, there is a "--man" switch that generates a help manual (a bit like man)
|
148
|
+
by concatenating all of the help definitions into a single output. Particularly
|
149
|
+
useful if you have a complex utility with nested actions (see below).
|
145
150
|
|
146
151
|
### Options helpers
|
147
152
|
|
@@ -168,6 +173,11 @@ For example:
|
|
168
173
|
|
169
174
|
You can always define instance variables if you prefer.
|
170
175
|
|
176
|
+
### IO
|
177
|
+
|
178
|
+
Optplus uses a module of {Optplus::IO IO} helpers to provide coloured output and to ease asking
|
179
|
+
simple questions. Note all of the outputs are to $stderr rather than $stdout.
|
180
|
+
|
171
181
|
### Handling Errors
|
172
182
|
|
173
183
|
Optplus should take care of parsing errors and the like without you having to get involved.
|
data/lib/optplus.rb
CHANGED
@@ -97,6 +97,7 @@ module Optplus
|
|
97
97
|
def run!
|
98
98
|
|
99
99
|
@_parent ||= nil
|
100
|
+
@_help ||= Hash.new
|
100
101
|
|
101
102
|
begin
|
102
103
|
me = self.new
|
@@ -201,6 +202,7 @@ module Optplus
|
|
201
202
|
@klass = self.class
|
202
203
|
@klass._help ||= Hash.new
|
203
204
|
@_help = false
|
205
|
+
@_man = false
|
204
206
|
@options = Hash.new
|
205
207
|
|
206
208
|
self.before_all if self.respond_to?(:before_all)
|
@@ -245,6 +247,11 @@ module Optplus
|
|
245
247
|
@_help = true
|
246
248
|
end
|
247
249
|
|
250
|
+
opts.on_tail('--man', 'output man-like help') do
|
251
|
+
@_help = true
|
252
|
+
@_man = true
|
253
|
+
end
|
254
|
+
|
248
255
|
end
|
249
256
|
|
250
257
|
@_args = @_optparse.permute(ARGV)
|
@@ -262,6 +269,9 @@ module Optplus
|
|
262
269
|
# provides convenient access to the name of the program
|
263
270
|
attr_reader :program_name
|
264
271
|
|
272
|
+
# provides access to all the options set
|
273
|
+
attr_reader :options
|
274
|
+
|
265
275
|
# add optparse option for debug mode
|
266
276
|
#
|
267
277
|
# @param [Optparse] opts being the optparse instance
|
@@ -328,8 +338,11 @@ module Optplus
|
|
328
338
|
|
329
339
|
|
330
340
|
# @!visibility private
|
331
|
-
def _get_help
|
332
|
-
|
341
|
+
def _get_help(indent=0)
|
342
|
+
prefix = " " * indent
|
343
|
+
@_optparse.help.split("/n").each do |line|
|
344
|
+
puts prefix + line
|
345
|
+
end
|
333
346
|
puts ""
|
334
347
|
end
|
335
348
|
|
@@ -374,6 +387,10 @@ module Optplus
|
|
374
387
|
|
375
388
|
# @!visibility private
|
376
389
|
def _help_me
|
390
|
+
if @_man then
|
391
|
+
self.man
|
392
|
+
return
|
393
|
+
end
|
377
394
|
# is there an action on the line?
|
378
395
|
if _args.length > 0 then
|
379
396
|
# yes, but is it legit?
|
@@ -411,6 +428,38 @@ module Optplus
|
|
411
428
|
|
412
429
|
end
|
413
430
|
|
431
|
+
# output all the help in one go!
|
432
|
+
def man
|
433
|
+
puts "Help Manual for #{@program_name}"
|
434
|
+
puts ""
|
435
|
+
_get_help
|
436
|
+
@klass._help.each_pair do |action, help|
|
437
|
+
puts "Action: #{action}"
|
438
|
+
puts ""
|
439
|
+
if help.kind_of?(Array) then
|
440
|
+
help.each do |hline|
|
441
|
+
puts " " + hline
|
442
|
+
end
|
443
|
+
else
|
444
|
+
|
445
|
+
np = help.new(self)
|
446
|
+
np._get_help(2)
|
447
|
+
puts ""
|
448
|
+
|
449
|
+
help._help.each_pair do |subaction, subhelp|
|
450
|
+
puts " Subaction: #{subaction}"
|
451
|
+
puts ""
|
452
|
+
subhelp.each do |hline|
|
453
|
+
puts " " + hline
|
454
|
+
end
|
455
|
+
puts ""
|
456
|
+
end
|
457
|
+
end
|
458
|
+
puts " "
|
459
|
+
end
|
460
|
+
puts ""
|
461
|
+
end #man
|
462
|
+
|
414
463
|
end
|
415
464
|
|
416
465
|
end
|
data/lib/optplus/IO.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Robert Sharp
|
3
|
+
# Copyright:: Copyright (c) 2013 Robert Sharp
|
4
|
+
# License:: Open Software Licence v3.0
|
5
|
+
#
|
6
|
+
# This software is licensed for use under the Open Software Licence v. 3.0
|
7
|
+
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
8
|
+
# and in the file copyright.txt. Under the terms of this licence, all derivative works
|
9
|
+
# must themselves be licensed under the Open Software Licence v. 3.0
|
10
|
+
#
|
11
|
+
#
|
12
|
+
require 'colored'
|
13
|
+
|
14
|
+
module Optplus
|
15
|
+
|
16
|
+
# bunch of convenience methods to output messages and get inputs for
|
17
|
+
# command-line scripts
|
18
|
+
module IO
|
19
|
+
|
20
|
+
# lookup to map between symbols and responses
|
21
|
+
Answers = Hash.new(false).merge({:no=>'n', :yes=>'y', :skip=>'s', :diff=>'d', :list=>'l'})
|
22
|
+
|
23
|
+
def say(txt)
|
24
|
+
$stderr.puts txt
|
25
|
+
end
|
26
|
+
|
27
|
+
def say_ok(txt)
|
28
|
+
$stderr.puts txt.green
|
29
|
+
end
|
30
|
+
|
31
|
+
def warn(txt)
|
32
|
+
$stderr.puts txt.yellow
|
33
|
+
end
|
34
|
+
|
35
|
+
def alert(txt)
|
36
|
+
$stderr.puts txt.red.bold
|
37
|
+
end
|
38
|
+
|
39
|
+
def ask(question, default=:no, answers=nil)
|
40
|
+
answers ||= Answers
|
41
|
+
default = answers.keys.first unless answers.has_key?(default)
|
42
|
+
def_key = answers[default]
|
43
|
+
answer_options = answers.values.collect {|k| k == def_key ? k.upcase : k}.join('')
|
44
|
+
loop do
|
45
|
+
$stderr.print "#{question}(#{answer_options})? "
|
46
|
+
response = $stdin.gets[0,1].downcase
|
47
|
+
if response == '?' then
|
48
|
+
answers.each_pair do |key, val|
|
49
|
+
$stderr.puts "#{key}"
|
50
|
+
end
|
51
|
+
next
|
52
|
+
end
|
53
|
+
if answers.has_value?(response) then
|
54
|
+
return answers.key(response)
|
55
|
+
else
|
56
|
+
return default
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
def continue?(question, default=false)
|
63
|
+
def_response = default ? :yes : :no
|
64
|
+
response = ask(question, def_response, {:yes=>'y', :no=>'n'})
|
65
|
+
return response == :yes
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
data/lib/optplus/nested.rb
CHANGED
@@ -77,7 +77,7 @@ module Optplus
|
|
77
77
|
@klass = self.class
|
78
78
|
@_parent = parent || @klass._parent
|
79
79
|
self.before_all if self.respond_to?(:before_all)
|
80
|
-
self.before_actions if self.respond_to?(:before_actions)
|
80
|
+
#self.before_actions if self.respond_to?(:before_actions)
|
81
81
|
end
|
82
82
|
|
83
83
|
# @!visibility private
|
@@ -127,30 +127,38 @@ module Optplus
|
|
127
127
|
end
|
128
128
|
|
129
129
|
# @!visibility private
|
130
|
-
def _get_help
|
130
|
+
def _get_help(indent=0)
|
131
|
+
helps = []
|
132
|
+
prefix = " " * indent
|
133
|
+
|
131
134
|
prog_name = File.basename($0, File.extname($0))
|
132
|
-
|
133
|
-
|
135
|
+
helps << "Usage: #{prog_name} #{self.class._banner}"
|
136
|
+
helps << ""
|
134
137
|
self.class._description.each do |line|
|
135
|
-
|
138
|
+
helps << line
|
136
139
|
end
|
137
|
-
|
140
|
+
helps << ""
|
138
141
|
flags = 0
|
139
142
|
self.class._descriptions.each_pair do |action, description|
|
140
|
-
flag = @klass._help.has_key?(action.to_sym) ? '(-h)' : ''
|
143
|
+
flag = @klass._help && @klass._help.has_key?(action.to_sym) ? '(-h)' : ''
|
141
144
|
flags += 1 unless flag == ''
|
142
|
-
|
145
|
+
helps << " #{action} - #{description} #{flag}"
|
143
146
|
end
|
144
147
|
|
145
148
|
if flags > 0 then
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
+
helps << ""
|
150
|
+
helps << " (-h indicates actions with additional help)"
|
151
|
+
helps << ""
|
149
152
|
end
|
150
153
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
+
helps << ""
|
155
|
+
helps << "For full details of options etc:"
|
156
|
+
helps << " #{prog_name} -h"
|
157
|
+
|
158
|
+
helps.each do |hline|
|
159
|
+
puts prefix + hline
|
160
|
+
end
|
161
|
+
|
154
162
|
end
|
155
163
|
|
156
164
|
|
data/lib/optplus/version.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# Created by Jevoom
|
2
2
|
#
|
3
|
-
#
|
4
|
-
#
|
3
|
+
# 28-Nov-2014
|
4
|
+
# Add instance attribute to read options hash
|
5
5
|
|
6
6
|
module Optplus
|
7
|
-
# version set to 0.0.
|
8
|
-
Version = '0.0.
|
9
|
-
# date set to
|
10
|
-
Version_Date = '
|
11
|
-
#ident string set to: optplus-0.0.
|
12
|
-
Ident = 'optplus-0.0.
|
7
|
+
# version set to 0.0.16
|
8
|
+
Version = '0.0.16'
|
9
|
+
# date set to 28-Nov-2014
|
10
|
+
Version_Date = '28-Nov-2014'
|
11
|
+
#ident string set to: optplus-0.0.16 28-Nov-2014
|
12
|
+
Ident = 'optplus-0.0.16 28-Nov-2014'
|
13
13
|
end
|
data/test/io.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
#
|
4
|
+
#
|
5
|
+
# = Test IO
|
6
|
+
#
|
7
|
+
# == Optplus
|
8
|
+
#
|
9
|
+
# Author:: Robert Sharp
|
10
|
+
# Copyright:: Copyright (c) 2013 Robert Sharp
|
11
|
+
# License:: Open Software Licence v3.0
|
12
|
+
#
|
13
|
+
# This software is licensed for use under the Open Software Licence v. 3.0
|
14
|
+
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
15
|
+
# and in the file copyright.txt. Under the terms of this licence, all derivative works
|
16
|
+
# must themselves be licensed under the Open Software Licence v. 3.0
|
17
|
+
#
|
18
|
+
#
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'optplus/IO'
|
22
|
+
|
23
|
+
include Optplus::IO
|
24
|
+
|
25
|
+
say "hello"
|
26
|
+
|
27
|
+
say_ok "That's OK"
|
28
|
+
|
29
|
+
warn "This is getting tricky"
|
30
|
+
|
31
|
+
alert "Too late!"
|
32
|
+
|
33
|
+
if ask("Overwrite?") == :yes then
|
34
|
+
warn "Overwriting"
|
35
|
+
else
|
36
|
+
alert "You really should have"
|
37
|
+
end
|
38
|
+
|
39
|
+
if continue?("Do you want to continue?") then
|
40
|
+
say_ok "Continuing"
|
41
|
+
else
|
42
|
+
warn "Not continuing"
|
43
|
+
end
|
44
|
+
|
45
|
+
if continue?("Do you want to stop?", true) then
|
46
|
+
say_ok "Stopped"
|
47
|
+
else
|
48
|
+
warn "Not stopping"
|
49
|
+
end
|
50
|
+
|
51
|
+
colour = ask("What colour?", :red, {red:'r', green:'g', blue:'b'})
|
52
|
+
|
53
|
+
say "You chose #{colour.to_s}"
|
54
|
+
|
metadata
CHANGED
@@ -1,36 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optplus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dr Robert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
-
Y29sb3JlZA==
|
14
|
+
name: colored
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
|
-
- -
|
17
|
+
- - '>='
|
19
18
|
- !ruby/object:Gem::Version
|
20
19
|
version: '0'
|
21
20
|
type: :runtime
|
22
21
|
prerelease: false
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
24
23
|
requirements:
|
25
|
-
- -
|
24
|
+
- - '>='
|
26
25
|
- !ruby/object:Gem::Version
|
27
26
|
version: '0'
|
28
|
-
description:
|
29
|
-
few meta-methods
|
30
|
-
|
27
|
+
description: |-
|
28
|
+
Wraps Optparser into a class to enable thor-like scripting with a few meta-methods
|
31
29
|
and a built-in command or action dispatcher. Its much smaller than Thor and aimed
|
32
|
-
|
33
|
-
at saving time when scripting with Optparser.'
|
30
|
+
at saving time when scripting with Optparser.
|
34
31
|
email: robert@osburn-sharp.ath.cx
|
35
32
|
executables:
|
36
33
|
- optplus
|
@@ -53,6 +50,7 @@ files:
|
|
53
50
|
- lib/optplus/version.rb
|
54
51
|
- lib/optplus/errors.rb
|
55
52
|
- lib/optplus/nested.rb
|
53
|
+
- lib/optplus/IO.rb
|
56
54
|
- lib/optplus.rb
|
57
55
|
- bin/optplus
|
58
56
|
- bin/optplus-installer
|
@@ -61,7 +59,8 @@ files:
|
|
61
59
|
- test/conf.d/optplus.rb
|
62
60
|
- test/my_parser.rb
|
63
61
|
- test/my_nested_parser.rb
|
64
|
-
|
62
|
+
- test/io.rb
|
63
|
+
homepage: https://github.com/osburn-sharp
|
65
64
|
licenses:
|
66
65
|
- Open Software Licence v3.0
|
67
66
|
metadata: {}
|
@@ -72,17 +71,17 @@ require_paths:
|
|
72
71
|
- lib
|
73
72
|
required_ruby_version: !ruby/object:Gem::Requirement
|
74
73
|
requirements:
|
75
|
-
- -
|
74
|
+
- - '>='
|
76
75
|
- !ruby/object:Gem::Version
|
77
76
|
version: '0'
|
78
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
78
|
requirements:
|
80
|
-
- -
|
79
|
+
- - '>='
|
81
80
|
- !ruby/object:Gem::Version
|
82
81
|
version: '0'
|
83
82
|
requirements: []
|
84
83
|
rubyforge_project:
|
85
|
-
rubygems_version: 2.0.
|
84
|
+
rubygems_version: 2.0.14
|
86
85
|
signing_key:
|
87
86
|
specification_version: 4
|
88
87
|
summary: A simple wrapper class to make optparser-based scripts easy to write.
|