optplus 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/Bugs.rdoc +5 -0
- data/Gemfile +3 -0
- data/History.txt +39 -0
- data/Intro.txt +3 -0
- data/LICENCE.rdoc +159 -0
- data/README.md +296 -0
- data/bin/optplus +78 -0
- data/bin/optplus-installer +32 -0
- data/lib/optplus.rb +416 -0
- data/lib/optplus/errors.rb +31 -0
- data/lib/optplus/nested.rb +159 -0
- data/lib/optplus/version.rb +13 -0
- data/spec/optplus_spec.rb +41 -0
- data/spec/spec_helper.rb +12 -0
- data/test/conf.d/optplus.rb +1 -0
- data/test/my_nested_parser.rb +130 -0
- data/test/my_parser.rb +90 -0
- metadata +89 -0
@@ -0,0 +1,31 @@
|
|
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
|
+
|
13
|
+
# This file groups together all the errors for optplus.
|
14
|
+
# Preceed each class with a description of the error
|
15
|
+
|
16
|
+
module Optplus
|
17
|
+
|
18
|
+
# A general class for all errors created by this project. All specific exceptions
|
19
|
+
# should be children of this class
|
20
|
+
class OptplusError < RuntimeError; end
|
21
|
+
|
22
|
+
# add specific errors as required
|
23
|
+
|
24
|
+
# description
|
25
|
+
class ParseError < OptplusError; end
|
26
|
+
|
27
|
+
# force an exit
|
28
|
+
# @note Should only be used by the exit_on_error method
|
29
|
+
class ExitOnError < OptplusError; end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# = Next Parser
|
4
|
+
#
|
5
|
+
# == SubTitle
|
6
|
+
#
|
7
|
+
# Author:: Robert Sharp
|
8
|
+
# Copyright:: Copyright (c) 2013 Robert Sharp
|
9
|
+
# License:: Open Software Licence v3.0
|
10
|
+
#
|
11
|
+
# This software is licensed for use under the Open Software Licence v. 3.0
|
12
|
+
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
13
|
+
# and in the file copyright.txt. Under the terms of this licence, all derivative works
|
14
|
+
# must themselves be licensed under the Open Software Licence v. 3.0
|
15
|
+
#
|
16
|
+
#
|
17
|
+
#
|
18
|
+
require 'optplus'
|
19
|
+
|
20
|
+
module Optplus
|
21
|
+
|
22
|
+
# define a nested parser to add sub-actions to an action
|
23
|
+
#
|
24
|
+
# Useful if you want to group actions together. For example,
|
25
|
+
# if you have a command that does things for services (for example)
|
26
|
+
# and other things for servers (for example) then you can define
|
27
|
+
# a nested parser for each and then define actions 'services' and 'servers'
|
28
|
+
# that use these parsers:
|
29
|
+
#
|
30
|
+
# my_command servers list --all
|
31
|
+
# my_command services list --all
|
32
|
+
#
|
33
|
+
# Optplus does not allow option switches to be specific to any one action -
|
34
|
+
# its an everything and everywhere approach.
|
35
|
+
#
|
36
|
+
# Note that NestedParser inherits everything from Parser and could therefore
|
37
|
+
# nest another parser within itself, ad infinitum. You could also define
|
38
|
+
# methods such as #options which would be a waste because they would never
|
39
|
+
# be called.
|
40
|
+
#
|
41
|
+
class NestedParser < Optplus::Parser
|
42
|
+
|
43
|
+
class << self
|
44
|
+
|
45
|
+
# @!visibility private
|
46
|
+
def run!(parent)
|
47
|
+
# set class attribute so that the instance
|
48
|
+
# can determine its parent class
|
49
|
+
@_parent = parent
|
50
|
+
super()
|
51
|
+
end
|
52
|
+
|
53
|
+
# @!visibility private
|
54
|
+
attr_reader :_parent
|
55
|
+
|
56
|
+
#@!visibility private
|
57
|
+
# def _help_me
|
58
|
+
# prog_name = File.basename($0, File.extname($0))
|
59
|
+
# puts "Usage: #{prog_name} #{self._banner}"
|
60
|
+
# puts ""
|
61
|
+
# self._description.each do |line|
|
62
|
+
# puts line
|
63
|
+
# end
|
64
|
+
# puts ""
|
65
|
+
# self._descriptions.each_pair do |action, description|
|
66
|
+
# puts " #{action} - #{description}"
|
67
|
+
# end
|
68
|
+
# puts ""
|
69
|
+
# puts "For full details of options etc:"
|
70
|
+
# puts " #{prog_name} -h"
|
71
|
+
# end
|
72
|
+
|
73
|
+
end # class << self
|
74
|
+
|
75
|
+
# @!visibility private
|
76
|
+
def initialize(parent=nil)
|
77
|
+
@klass = self.class
|
78
|
+
@_parent = parent || @klass._parent
|
79
|
+
self.before_all if self.respond_to?(:before_all)
|
80
|
+
self.before_actions if self.respond_to?(:before_actions)
|
81
|
+
end
|
82
|
+
|
83
|
+
# @!visibility private
|
84
|
+
def _parent
|
85
|
+
@_parent
|
86
|
+
end
|
87
|
+
|
88
|
+
# @!visibility private
|
89
|
+
def _args
|
90
|
+
_parent._args
|
91
|
+
end
|
92
|
+
|
93
|
+
# return the next argument, if there is one or nil otherwise
|
94
|
+
# @see Optplus::Parser#next_argument
|
95
|
+
def next_argument
|
96
|
+
_parent.next_argument
|
97
|
+
end
|
98
|
+
|
99
|
+
# return the next argument or the given default
|
100
|
+
# @see Optplus::Parser#next_argument
|
101
|
+
def next_argument_or(default)
|
102
|
+
_parent.next_argument_or(default)
|
103
|
+
end
|
104
|
+
|
105
|
+
# return the next argument or raise exception with the given message
|
106
|
+
# @see Optplus::Parser#next_argument
|
107
|
+
def next_argument_or_error(message)
|
108
|
+
_parent.next_argument_or_error(message)
|
109
|
+
end
|
110
|
+
|
111
|
+
# return all of the remaining args, or an empty array
|
112
|
+
# @see Optplus::Parser#next_argument
|
113
|
+
def all_arguments
|
114
|
+
_parent.all_arguments
|
115
|
+
end
|
116
|
+
|
117
|
+
# get the value of the option
|
118
|
+
# @see Optplus::Parser#next_argument
|
119
|
+
def get_option(key)
|
120
|
+
_parent.get_option(key)
|
121
|
+
end
|
122
|
+
|
123
|
+
# check if the option has been set
|
124
|
+
# @see Optplus::Parser#next_argument
|
125
|
+
def option?(key)
|
126
|
+
_parent.option?(key)
|
127
|
+
end
|
128
|
+
|
129
|
+
# @!visibility private
|
130
|
+
def _get_help
|
131
|
+
prog_name = File.basename($0, File.extname($0))
|
132
|
+
puts "Usage: #{prog_name} #{self.class._banner}"
|
133
|
+
puts ""
|
134
|
+
self.class._description.each do |line|
|
135
|
+
puts line
|
136
|
+
end
|
137
|
+
puts ""
|
138
|
+
flags = 0
|
139
|
+
self.class._descriptions.each_pair do |action, description|
|
140
|
+
flag = @klass._help.has_key?(action.to_sym) ? '(-h)' : ''
|
141
|
+
flags += 1 unless flag == ''
|
142
|
+
puts " #{action} - #{description} #{flag}"
|
143
|
+
end
|
144
|
+
|
145
|
+
if flags > 0 then
|
146
|
+
puts ""
|
147
|
+
puts " (-h indicates actions with additional help)"
|
148
|
+
puts ""
|
149
|
+
end
|
150
|
+
|
151
|
+
puts ""
|
152
|
+
puts "For full details of options etc:"
|
153
|
+
puts " #{prog_name} -h"
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Created by Jevoom
|
2
|
+
#
|
3
|
+
# 13-Sep-2013
|
4
|
+
# Release Candidate with nesting etc.
|
5
|
+
|
6
|
+
module Optplus
|
7
|
+
# version set to 0.0.8
|
8
|
+
Version = '0.0.8'
|
9
|
+
# date set to 13-Sep-2013
|
10
|
+
Version_Date = '13-Sep-2013'
|
11
|
+
#ident string set to: optplus-0.0.8 13-Sep-2013
|
12
|
+
Ident = 'optplus-0.0.8 13-Sep-2013'
|
13
|
+
end
|
@@ -0,0 +1,41 @@
|
|
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
|
+
|
13
|
+
|
14
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
15
|
+
require 'optplus/config'
|
16
|
+
require 'optplus/errors'
|
17
|
+
require 'jellog'
|
18
|
+
|
19
|
+
conf_file = File.expand_path(File.dirname(__FILE__) + '/../test/conf.d/optplus.rb')
|
20
|
+
|
21
|
+
describe Optplus do
|
22
|
+
|
23
|
+
before(:all) do
|
24
|
+
@params = Optplus::Config.new(conf_file)
|
25
|
+
Jellog::Logger.disable_syslog
|
26
|
+
end
|
27
|
+
|
28
|
+
before(:each) do
|
29
|
+
@optplus = Optplus::Service.new("Testkey", @params)
|
30
|
+
end
|
31
|
+
|
32
|
+
after(:each) do
|
33
|
+
@optplus.stop_callback("Testkey")
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
it "should do what you want" do
|
38
|
+
pending "Need to do something here"
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
$LOAD_PATH.delete('/usr/local/lib')
|
4
|
+
require 'optplus'
|
5
|
+
require 'rspec'
|
6
|
+
require 'rspec/autorun'
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.color_enabled = true
|
10
|
+
config.formatter = :doc
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
[1m[31mError: could not load lib/optplus/config.rb[0m[0m
|
@@ -0,0 +1,130 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Author:: Robert Sharp
|
4
|
+
# Copyright:: Copyright (c) 2013 Robert Sharp
|
5
|
+
# License:: Open Software Licence v3.0
|
6
|
+
#
|
7
|
+
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
+
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
+
# and in the file copyright.txt. Under the terms of this licence, all derivative works
|
10
|
+
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
+
#
|
12
|
+
#
|
13
|
+
|
14
|
+
|
15
|
+
require 'optplus'
|
16
|
+
require 'optplus/nested'
|
17
|
+
|
18
|
+
|
19
|
+
class MyParser < Optplus::Parser
|
20
|
+
|
21
|
+
usage "[options] action"
|
22
|
+
|
23
|
+
description "A simple test",
|
24
|
+
"that tells you little"
|
25
|
+
|
26
|
+
def before_all
|
27
|
+
set_option :env, :dev
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
# define the options for this command
|
32
|
+
def options(opts)
|
33
|
+
opts.on('-a', '--all', 'show me everything') do
|
34
|
+
set_option :all
|
35
|
+
end
|
36
|
+
opts.on('-A', '--altogether', 'show me everything, really') do
|
37
|
+
set_option :altogether
|
38
|
+
end
|
39
|
+
opts.on('-e', '--environment TYPE', [:dev, :dec, :test, :prod], 'specify the environment') do |env|
|
40
|
+
set_option :env, env
|
41
|
+
end
|
42
|
+
opts.on('-s', '--sob [String]', String, 'sob when telling truth') do |cry|
|
43
|
+
set_option :sob, cry
|
44
|
+
end
|
45
|
+
|
46
|
+
debug_option(opts)
|
47
|
+
end
|
48
|
+
|
49
|
+
# define things that need to be done before any actions
|
50
|
+
def before_actions
|
51
|
+
@secrets = ['The answer to the universe is 42',
|
52
|
+
'The mystery man is Blake',
|
53
|
+
'The beginning of the Universe is the wrong question'
|
54
|
+
]
|
55
|
+
end
|
56
|
+
|
57
|
+
def after_actions
|
58
|
+
puts "Tidying and Cleaning..."
|
59
|
+
sleep 1.0
|
60
|
+
puts "All done"
|
61
|
+
end
|
62
|
+
|
63
|
+
describe :show, "Show me what you know"
|
64
|
+
def show
|
65
|
+
unless get_option :all
|
66
|
+
puts "I know nothing"
|
67
|
+
else
|
68
|
+
puts "OK I will tell you everything"
|
69
|
+
puts get_option :sob if option? :sob
|
70
|
+
puts "You're in: #{get_option :env}"
|
71
|
+
@secrets.each do |secret|
|
72
|
+
puts secret
|
73
|
+
end
|
74
|
+
puts get_option :sob if option? :sob
|
75
|
+
end
|
76
|
+
end
|
77
|
+
help :show, "You can use this to find out what I know",
|
78
|
+
"If you persist with options I may tell you more"
|
79
|
+
|
80
|
+
describe :about, "Tell me about something"
|
81
|
+
def about
|
82
|
+
subject = all_arguments.join(' ')
|
83
|
+
if subject then
|
84
|
+
puts "I know nothing about #{subject}"
|
85
|
+
else
|
86
|
+
puts "Sorry, what do you want to know about?"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe :sheep, "All about sheep"
|
91
|
+
def sheep
|
92
|
+
puts "Baaaa"
|
93
|
+
end
|
94
|
+
|
95
|
+
class Question < Optplus::NestedParser
|
96
|
+
|
97
|
+
usage "question aspect"
|
98
|
+
|
99
|
+
description "ask a question about a particular aspect"
|
100
|
+
|
101
|
+
describe :work, "Ask about work-related things"
|
102
|
+
def work
|
103
|
+
puts "I am unemployed"
|
104
|
+
end
|
105
|
+
|
106
|
+
describe :home, "Ask about home related things"
|
107
|
+
def home
|
108
|
+
topic = next_argument_or('Cooking')
|
109
|
+
puts "I don't do #{topic} at home"
|
110
|
+
end
|
111
|
+
help :home, "suggest something I might do at home, such as ",
|
112
|
+
"cleaning or painting"
|
113
|
+
|
114
|
+
describe :errors, "Ask me about errors"
|
115
|
+
def errors
|
116
|
+
if get_option :altogether
|
117
|
+
exit_on_error("Error: I know nothing about errors")
|
118
|
+
end
|
119
|
+
exit_on_error
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
nest_parser :question, Question, "Interrogate in more detail"
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
MyParser.run!
|
data/test/my_parser.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Author:: Robert Sharp
|
4
|
+
# Copyright:: Copyright (c) 2013 Robert Sharp
|
5
|
+
# License:: Open Software Licence v3.0
|
6
|
+
#
|
7
|
+
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
+
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
+
# and in the file copyright.txt. Under the terms of this licence, all derivative works
|
10
|
+
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
+
#
|
12
|
+
#
|
13
|
+
|
14
|
+
|
15
|
+
require 'optplus'
|
16
|
+
|
17
|
+
|
18
|
+
class MyParser < Optplus::Parser
|
19
|
+
|
20
|
+
usage "[options] action"
|
21
|
+
|
22
|
+
description "A simple test",
|
23
|
+
"that tells you little"
|
24
|
+
|
25
|
+
def before_all
|
26
|
+
set_option :env, :dev
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
# define the options for this command
|
31
|
+
def options(opts)
|
32
|
+
opts.on('-a', '--all', 'show me everything') do
|
33
|
+
set_option :all
|
34
|
+
end
|
35
|
+
opts.on('-A', '--altogether', 'show me everything, really') do
|
36
|
+
set_option :altogether
|
37
|
+
end
|
38
|
+
opts.on('-e', '--environment TYPE', [:dev, :dec, :test, :prod], 'specify the environment') do |env|
|
39
|
+
set_option :env, env
|
40
|
+
end
|
41
|
+
opts.on('-s', '--sob [String]', String, 'sob when telling truth') do |cry|
|
42
|
+
set_option :sob, cry
|
43
|
+
end
|
44
|
+
|
45
|
+
debug_option(opts)
|
46
|
+
end
|
47
|
+
|
48
|
+
# define things that need to be done before any actions
|
49
|
+
def before_actions
|
50
|
+
@secrets = ['The answer to the universe is 42',
|
51
|
+
'The mystery man is Blake',
|
52
|
+
'The beginning of the Universe is the wrong question'
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
56
|
+
describe :show, "Show me what you know"
|
57
|
+
def show
|
58
|
+
unless get_option :all
|
59
|
+
puts "I know nothing"
|
60
|
+
else
|
61
|
+
puts "OK I will tell you everything"
|
62
|
+
puts get_option :sob if option? :sob
|
63
|
+
puts "You're in: #{get_option :env}"
|
64
|
+
@secrets.each do |secret|
|
65
|
+
puts secret
|
66
|
+
end
|
67
|
+
puts get_option :sob if option? :sob
|
68
|
+
end
|
69
|
+
end
|
70
|
+
help :show, "You can use this to find out what I know",
|
71
|
+
"If you persist with options I may tell you more"
|
72
|
+
|
73
|
+
describe :about, "Tell me about something"
|
74
|
+
def about
|
75
|
+
subject = all_arguments.join(' ')
|
76
|
+
if subject then
|
77
|
+
puts "I know nothing about #{subject}"
|
78
|
+
else
|
79
|
+
puts "Sorry, what do you want to know about?"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe :sheep, "All about sheep"
|
84
|
+
def sheep
|
85
|
+
puts "Baaaa"
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
MyParser.run!
|