ame 0.1.1 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README +541 -3
- data/Rakefile +15 -6
- data/lib/ame-1.0.rb +31 -0
- data/lib/ame-1.0/argument.rb +63 -0
- data/lib/ame-1.0/arguments.rb +44 -0
- data/lib/ame-1.0/arguments/complete.rb +37 -0
- data/lib/ame-1.0/arguments/optional.rb +34 -0
- data/lib/ame-1.0/arguments/undefined.rb +71 -0
- data/lib/ame-1.0/class.rb +436 -0
- data/lib/ame-1.0/flag.rb +101 -0
- data/lib/{ame → ame-1.0}/help.rb +1 -1
- data/lib/ame-1.0/help/delegate.rb +19 -0
- data/lib/ame-1.0/help/terminal.rb +132 -0
- data/lib/ame-1.0/method.rb +75 -0
- data/lib/ame-1.0/method/undefined.rb +184 -0
- data/lib/ame-1.0/methods.rb +40 -0
- data/lib/ame-1.0/multioption.rb +36 -0
- data/lib/ame-1.0/option.rb +37 -0
- data/lib/ame-1.0/optional.rb +31 -0
- data/lib/ame-1.0/options.rb +68 -0
- data/lib/ame-1.0/options/undefined.rb +114 -0
- data/lib/ame-1.0/root.rb +174 -0
- data/lib/ame-1.0/splat.rb +16 -0
- data/lib/ame-1.0/splus.rb +22 -0
- data/lib/ame-1.0/switch.rb +39 -0
- data/lib/ame-1.0/types.rb +60 -0
- data/lib/ame-1.0/types/boolean.rb +13 -0
- data/lib/ame-1.0/types/enumeration.rb +40 -0
- data/lib/ame-1.0/types/float.rb +11 -0
- data/lib/{ame → ame-1.0}/types/integer.rb +3 -3
- data/lib/{ame → ame-1.0}/types/string.rb +2 -2
- data/lib/ame-1.0/types/symbol.rb +9 -0
- data/lib/ame-1.0/version.rb +62 -0
- data/test/unit/ame-1.0.rb +4 -0
- data/test/unit/ame-1.0/argument.rb +46 -0
- data/test/unit/ame-1.0/arguments.rb +63 -0
- data/test/unit/ame-1.0/arguments/complete.rb +4 -0
- data/test/unit/ame-1.0/arguments/optional.rb +4 -0
- data/test/unit/ame-1.0/arguments/undefined.rb +63 -0
- data/test/unit/ame-1.0/class.rb +4 -0
- data/test/unit/ame-1.0/flag.rb +31 -0
- data/test/unit/ame-1.0/help.rb +4 -0
- data/test/unit/ame-1.0/help/delegate.rb +4 -0
- data/test/unit/{ame/help/console.rb → ame-1.0/help/terminal.rb} +34 -23
- data/test/unit/ame-1.0/method.rb +4 -0
- data/test/unit/ame-1.0/method/undefined.rb +33 -0
- data/test/unit/ame-1.0/methods.rb +9 -0
- data/test/unit/ame-1.0/multioption.rb +4 -0
- data/test/unit/ame-1.0/option.rb +11 -0
- data/test/unit/ame-1.0/optional.rb +9 -0
- data/test/unit/ame-1.0/options.rb +149 -0
- data/test/unit/ame-1.0/options/undefined.rb +33 -0
- data/test/unit/ame-1.0/root.rb +4 -0
- data/test/unit/ame-1.0/splat.rb +9 -0
- data/test/unit/ame-1.0/splus.rb +4 -0
- data/test/unit/ame-1.0/switch.rb +15 -0
- data/test/unit/ame-1.0/types.rb +4 -0
- data/test/{ame → unit/ame-1.0}/types/boolean.rb +0 -0
- data/test/unit/ame-1.0/types/enumeration.rb +4 -0
- data/test/unit/ame-1.0/types/float.rb +7 -0
- data/test/{ame → unit/ame-1.0}/types/integer.rb +0 -0
- data/test/{ame → unit/ame-1.0}/types/string.rb +0 -0
- data/test/unit/ame-1.0/types/symbol.rb +5 -0
- data/test/unit/ame-1.0/version.rb +4 -0
- metadata +690 -60
- data/lib/ame.rb +0 -26
- data/lib/ame/argument.rb +0 -56
- data/lib/ame/arguments.rb +0 -65
- data/lib/ame/class.rb +0 -117
- data/lib/ame/help/console.rb +0 -96
- data/lib/ame/method.rb +0 -94
- data/lib/ame/methods.rb +0 -30
- data/lib/ame/option.rb +0 -50
- data/lib/ame/options.rb +0 -102
- data/lib/ame/root.rb +0 -57
- data/lib/ame/splat.rb +0 -12
- data/lib/ame/types.rb +0 -29
- data/lib/ame/types/array.rb +0 -16
- data/lib/ame/types/boolean.rb +0 -16
- data/lib/ame/version.rb +0 -5
- data/test/ame/types/array.rb +0 -13
- data/test/unit/ame/argument.rb +0 -66
- data/test/unit/ame/arguments.rb +0 -106
- data/test/unit/ame/method.rb +0 -40
- data/test/unit/ame/methods.rb +0 -10
- data/test/unit/ame/option.rb +0 -75
- data/test/unit/ame/options.rb +0 -136
- data/test/unit/ame/root.rb +0 -15
- data/test/unit/ame/splat.rb +0 -11
data/lib/ame-1.0/flag.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Represents a boolean option to a {Method} that doesn’t take an argument,
|
4
|
+
# though an argument is actually allowed if it’s made explicit by following the
|
5
|
+
# option name with a ‘=’ character and the argument value. Does the potential
|
6
|
+
# processing of the argument or simply returns the inverse {#default} value of
|
7
|
+
# the flag.
|
8
|
+
# @api developer
|
9
|
+
class Ame::Flag
|
10
|
+
# @api internal
|
11
|
+
# @param [String] short
|
12
|
+
# @param [String] long
|
13
|
+
# @param [Boolean] default
|
14
|
+
# @param [String] description
|
15
|
+
# @yield [?]
|
16
|
+
# @yieldparam [Hash<String, Object>] options
|
17
|
+
# @yieldparam [Boolean] value
|
18
|
+
# @raise [ArgumentError] If SHORT and LONG are #strip#empty?
|
19
|
+
# @raise [ArgumentError] If SHORT#strip#length > 1
|
20
|
+
def initialize(short, long, default, description, &validate)
|
21
|
+
@short, @long, @default, @description, @validate =
|
22
|
+
(s = short.strip).empty? ? nil : s, (l = long.strip).empty? ? nil : l,
|
23
|
+
default, description, validate || proc{ |_, a| a }
|
24
|
+
raise ArgumentError, 'both short and long can’t be empty' if
|
25
|
+
@short.nil? and @long.nil?
|
26
|
+
raise ArgumentError, 'short can’t be longer than 1: %s' % @short if
|
27
|
+
@short and @short.length > 1
|
28
|
+
end
|
29
|
+
|
30
|
+
# Invokes the optional block passed to the receiver when it was created for
|
31
|
+
# additional validation and parsing after optionally parsing one or more of
|
32
|
+
# the ARGUMENTS passed to it (see subclasses’ {#parse} methods for their
|
33
|
+
# behaviour).
|
34
|
+
# @api internal
|
35
|
+
# @param [Hash<String, Object>] options
|
36
|
+
# @param [Array<String>] arguments
|
37
|
+
# @param [String] name
|
38
|
+
# @raise [MissingArgument] If a required argument to an option is missing
|
39
|
+
# @raise [MalformedArgument] If an argument to an option can’t be parsed
|
40
|
+
# @return [Boolean]
|
41
|
+
def process(options, arguments, name, explicit)
|
42
|
+
@validate.call(options, parse(arguments, explicit))
|
43
|
+
rescue Ame::MalformedArgument, ArgumentError, TypeError => e
|
44
|
+
raise Ame::MalformedArgument, '%s: %s' % [name, e]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Invokes {#process} with arguments depending on whether REMAINDER, which is
|
48
|
+
# any content following a short option, should be seen as an argument to the
|
49
|
+
# receiver or not (see subclasses’ {#process_combined} methods for their
|
50
|
+
# behaviour), returning the result of {#process} and REMAINDER if it was
|
51
|
+
# used, or an empty String if it was.
|
52
|
+
# @api internal
|
53
|
+
# @param (see #process)
|
54
|
+
# @param [String] remainder
|
55
|
+
# @return [[Boolean, String]]
|
56
|
+
def process_combined(options, arguments, name, remainder)
|
57
|
+
[process(options, arguments, name, nil), remainder]
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [String] The long or short name of the option
|
61
|
+
def name
|
62
|
+
@name ||= names.first
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [Array<String>] The long and/or short name of the option
|
66
|
+
def names
|
67
|
+
@names ||= [long, short].reject{ |e| e.nil? }
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return True if the receiver shouldn’t be included in the Hash of option
|
71
|
+
# names and their values
|
72
|
+
def ignored?
|
73
|
+
default.nil?
|
74
|
+
end
|
75
|
+
|
76
|
+
# @return [String] The short name of the receiver
|
77
|
+
attr_reader :short
|
78
|
+
|
79
|
+
# @return [String] The long name of the receiver
|
80
|
+
attr_reader :long
|
81
|
+
|
82
|
+
# @return [Boolean] The default value of the receiver
|
83
|
+
attr_reader :default
|
84
|
+
|
85
|
+
# @return [String] The description of the receiver
|
86
|
+
attr_reader :description
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
# Returns the parsed value of EXPLICIT, or the inverse of {#default} if nil.
|
91
|
+
# Should be overridden by subclasses that want different behaviour for
|
92
|
+
# missing arguments.
|
93
|
+
# @api internal
|
94
|
+
# @param [Array<String>] arguments
|
95
|
+
# @param [String, nil] explicit
|
96
|
+
# @return [Boolean]
|
97
|
+
# @raise [MalformedArgument] If EXPLICIT is non-nil and can’t be parsed
|
98
|
+
def parse(arguments, explicit)
|
99
|
+
explicit ? Ame::Types[TrueClass].parse(explicit) : !default
|
100
|
+
end
|
101
|
+
end
|
data/lib/{ame → ame-1.0}/help.rb
RENAMED
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Delegates help output requests to another help output.
|
4
|
+
# @api internal
|
5
|
+
class Ame::Help::Delegate
|
6
|
+
def initialize(help)
|
7
|
+
@help = help
|
8
|
+
end
|
9
|
+
|
10
|
+
def dispatch(method, klass)
|
11
|
+
@help.dispatch method, klass
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def method(method)
|
16
|
+
@help.method method
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# Outputs help requests to a pair of IO objects, defaulting to `$stdout` and
|
4
|
+
# `$stderr`. An instance of this class is used by default for outputting help
|
5
|
+
# requests from {Root}, but can be overridden by invoking {Root.help} with
|
6
|
+
# another object (such as an instance of this class that’s been constructed
|
7
|
+
# with different parameters).
|
8
|
+
# @api developer/user
|
9
|
+
class Ame::Help::Terminal
|
10
|
+
# Sets up help requests to be made to OUTPUT ({#dispatch}, {#method}, and
|
11
|
+
# {#version}) and ERROR ({#error}), as well as specifying whether to
|
12
|
+
# EXIT_ON_ERROR or not, see {#error}.
|
13
|
+
# @param [#puts] output
|
14
|
+
# @param [#puts] error
|
15
|
+
# @param [Boolean] exit_on_error
|
16
|
+
def initialize(output = $stdout, error = $stderr, exit_on_error = true)
|
17
|
+
@output, @error, @exit_on_error = output, error, exit_on_error
|
18
|
+
end
|
19
|
+
|
20
|
+
# Outputs a help request for a {Class.dispatch} METHOD to KLASS, displaying
|
21
|
+
# all options and arguments to the method and listing the possible dispatch
|
22
|
+
# methods.
|
23
|
+
# @param [Method] method
|
24
|
+
# @param [Class] klass
|
25
|
+
# @return [self]
|
26
|
+
def dispatch(method, klass)
|
27
|
+
output(method_s(method).tap{ |result|
|
28
|
+
append_group result, 'Methods', klass.methods.sort_by{ |m| m.name } do |m|
|
29
|
+
m.name
|
30
|
+
end
|
31
|
+
})
|
32
|
+
end
|
33
|
+
|
34
|
+
# Outputs a help request for METHOD, displaying all its options and
|
35
|
+
# arguments.
|
36
|
+
# @param [Method] method
|
37
|
+
# @return [self]
|
38
|
+
def method(method)
|
39
|
+
output(method_s(method))
|
40
|
+
end
|
41
|
+
|
42
|
+
# Outputs VERSION information for METHOD.
|
43
|
+
# @param [Method] method
|
44
|
+
# @param [String] version
|
45
|
+
# @return [self]
|
46
|
+
def version(method, version)
|
47
|
+
output('%s %s' % [method.name, version])
|
48
|
+
end
|
49
|
+
|
50
|
+
# Outputs ERROR that occurred while processing METHOD.
|
51
|
+
# @raise [SystemExit] If exit_on_error was given as true to the receiver’s
|
52
|
+
# constructor
|
53
|
+
# @raise [error] If exit_on_error wasn’t given as true to the receiver’s
|
54
|
+
# constructor
|
55
|
+
def error(method, error)
|
56
|
+
errput '%s: %s' % [method, error]
|
57
|
+
exit 1 if @exit_on_error
|
58
|
+
raise error
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def output(string)
|
64
|
+
@output.puts string
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
def errput(string)
|
69
|
+
@error.puts string
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
def method_s(method)
|
74
|
+
['Usage:'].tap{ |result|
|
75
|
+
append result, ' ', method.qualified_name
|
76
|
+
append result, ' ', method.options.count > 0 ? '[OPTIONS]...' : ''
|
77
|
+
append result, ' ', method.arguments.map{ |a|
|
78
|
+
case a
|
79
|
+
when Ame::Splat then '[%s]...'
|
80
|
+
when Ame::Splus then '%s...'
|
81
|
+
when Ame::Optional then '[%s]'
|
82
|
+
else '%s'
|
83
|
+
end % a
|
84
|
+
}.join(' ')
|
85
|
+
result << "\n"
|
86
|
+
append result, ' ', method.description
|
87
|
+
append_group result, 'Arguments', method.arguments do |argument|
|
88
|
+
case argument
|
89
|
+
when Ame::Splat then '[%s]...' % argument
|
90
|
+
when Ame::Splus then '%s...' % argument
|
91
|
+
when Ame::Optional then '[%s=%s]' % [argument, argument.default]
|
92
|
+
else argument.to_s
|
93
|
+
end
|
94
|
+
end
|
95
|
+
os = method.options.select{ |o| o.description }.sort_by{ |o| (o.short or o.long).to_s }
|
96
|
+
short = os.any?{ |o| o.short }
|
97
|
+
append_group result, 'Options', os do |o|
|
98
|
+
case o
|
99
|
+
when Ame::Multioption then '%s*' % option(o, short)
|
100
|
+
when Ame::Option then option(o, short)
|
101
|
+
when Ame::Switch then '%s[=%s]' % [flag(o, short), o.argument]
|
102
|
+
else flag(o, short)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
}.join('')
|
106
|
+
end
|
107
|
+
|
108
|
+
def append(result, prefix, string)
|
109
|
+
result << prefix << string unless string.empty?
|
110
|
+
end
|
111
|
+
|
112
|
+
def append_group(result, heading, objects)
|
113
|
+
strings = objects.map{ |o| [o, yield(o)] }
|
114
|
+
longest = strings.map{ |_, s| s.length }.max
|
115
|
+
append result, "\n\n%s:\n" % heading,
|
116
|
+
strings.map{ |o, s| ' %-*s %s' % [longest, s, o.description] }.join("\n")
|
117
|
+
end
|
118
|
+
|
119
|
+
def flag(option, short)
|
120
|
+
if option.short and option.long
|
121
|
+
'-%s, --%s' % [option.short, option.long]
|
122
|
+
elsif option.short
|
123
|
+
'-%s' % option.short
|
124
|
+
else
|
125
|
+
'%s--%s' % [short ? ' ' : '', option.long]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def option(option, short)
|
130
|
+
'%s%s%s' % [flag(option, short), option.long ? '=' : '', option.argument]
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# A method in its defined state.
|
4
|
+
# @api developer
|
5
|
+
class Ame::Method
|
6
|
+
class << self
|
7
|
+
# @param [String] name
|
8
|
+
# @return [Symbol] The Ruby version of NAME, possibly the name of the
|
9
|
+
# method given on the command-line, replacing any ‘-’ with ‘_’.
|
10
|
+
def ruby_name(name)
|
11
|
+
name.gsub('-', '_').to_sym
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param [Symbol] ruby_name
|
15
|
+
# @return [String] The command-line version of RUBY_NAME, replacing any ‘_’
|
16
|
+
# with ‘-’
|
17
|
+
def name(ruby_name)
|
18
|
+
ruby_name.to_s.gsub('_', '-')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(ruby_name, klass, description, options, arguments)
|
23
|
+
@ruby_name, @class, @description, @options, @arguments =
|
24
|
+
ruby_name, klass, description, options, arguments
|
25
|
+
end
|
26
|
+
|
27
|
+
# Process ARGUMENTS as a set of {Options} and {Arguments}, then {#call} the
|
28
|
+
# receiver’s method on INSTANCE with them.
|
29
|
+
# @api internal
|
30
|
+
# @param [Class] instance
|
31
|
+
# @param [Array<String>] arguments
|
32
|
+
# @raise (see Options#process)
|
33
|
+
# @raise (see Arguments#process)
|
34
|
+
# @return [self]
|
35
|
+
def process(instance, arguments)
|
36
|
+
options, remainder = @options.process(arguments)
|
37
|
+
call(instance, @arguments.process(options, remainder), options)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Call the receiver’s method on INSTANCE with ARGUMENTS and OPTIONS,
|
41
|
+
# retrieving any default values for them if they’re nil.
|
42
|
+
# @api internal
|
43
|
+
# @param [Class] instance
|
44
|
+
# @param [Array<Object>, nil] arguments
|
45
|
+
# @param [Hash<String, Object>] options
|
46
|
+
# @raise (see Options#process)
|
47
|
+
# @raise (see Arguments#process)
|
48
|
+
# @return [self]
|
49
|
+
def call(instance, arguments = nil, options = nil)
|
50
|
+
options, _ = @options.process([]) unless options
|
51
|
+
arguments ||= @arguments.process(options, [])
|
52
|
+
instance.send @ruby_name, *(arguments + (options.empty? ? [] : [options]))
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [String] The description of the receiver
|
57
|
+
attr_reader :description
|
58
|
+
|
59
|
+
# @return [Options] The options of the receiver
|
60
|
+
attr_reader :options
|
61
|
+
|
62
|
+
# @return [Arguments] The arguments of the receiver
|
63
|
+
attr_reader :arguments
|
64
|
+
|
65
|
+
# @return [String] The command-line name of the receiver
|
66
|
+
def name
|
67
|
+
@name ||= self.class.name(@ruby_name)
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [String] The full command-line name of the receiver, including the
|
71
|
+
# class that this method belongs to’s {Class.fullname}
|
72
|
+
def qualified_name
|
73
|
+
[@class.fullname, name].reject(&:empty?).join(' ')
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# A {Method} in its undefined state. This class is used to construct the
|
4
|
+
# method before it gets defined, setting up a description, specifying that
|
5
|
+
# options_must_precede_arguments, adding flags, toggles, switches, options,
|
6
|
+
# multioptions, arguments, optional arguments, splats, spluses, and finally
|
7
|
+
# defining it.
|
8
|
+
# @api developer
|
9
|
+
class Ame::Method::Undefined
|
10
|
+
# Sets up an as yet undefined method on KLASS.
|
11
|
+
# @api internal
|
12
|
+
# @param [Class] klass
|
13
|
+
def initialize(klass)
|
14
|
+
@class = klass
|
15
|
+
@description = nil
|
16
|
+
@options = Ame::Options::Undefined.new
|
17
|
+
@arguments = Ame::Arguments::Undefined.new
|
18
|
+
end
|
19
|
+
|
20
|
+
# Sets the DESCRIPTION of the method, or returns it if DESCRIPTION is nil.
|
21
|
+
# The description is used in help output and similar circumstances.
|
22
|
+
# @api internal
|
23
|
+
# @param [String, nil] description
|
24
|
+
# @return [String]
|
25
|
+
def description(description = nil)
|
26
|
+
return @description unless description
|
27
|
+
@description = description
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# Forces options to the method to precede any arguments to be processed
|
32
|
+
# correctly.
|
33
|
+
# @api internal
|
34
|
+
# @return [self]
|
35
|
+
def options_must_precede_arguments
|
36
|
+
@options.options_must_precede_arguments
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
# Delegates {Class.flag} to {Options::Undefined#flag}.
|
41
|
+
# @api internal
|
42
|
+
# @param (see Options::Undefined#flag)
|
43
|
+
# @yield (see Options::Undefined#flag)
|
44
|
+
# @yieldparam (see Options::Undefined#flag)
|
45
|
+
# @raise (see Options::Undefined#flag)
|
46
|
+
# @return [self]
|
47
|
+
def flag(short, long, default, description, &validate)
|
48
|
+
@options.flag short, long, default, description, &validate
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
# Delegates {Class.toggle} to {Options::Undefined#toggle}.
|
53
|
+
# @api internal
|
54
|
+
# @param (see Options::Undefined#toggle)
|
55
|
+
# @yield (see Options::Undefined#toggle)
|
56
|
+
# @yieldparam (see Options::Undefined#toggle)
|
57
|
+
# @raise (see Options::Undefined#toggle)
|
58
|
+
# @return [self]
|
59
|
+
def toggle(short, long, default, description, &validate)
|
60
|
+
@options.toggle short, long, default, description, &validate
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
# Delegates {Class.switch} to {Options::Undefined#switch}.
|
65
|
+
# @api internal
|
66
|
+
# @param (see Options::Undefined#switch)
|
67
|
+
# @yield (see Options::Undefined#switch)
|
68
|
+
# @yieldparam (see Options::Undefined#switch)
|
69
|
+
# @raise (see Options::Undefined#switch)
|
70
|
+
# @return [self]
|
71
|
+
def switch(short, long, argument, default, argument_default, description, &validate)
|
72
|
+
@options.switch short, long, argument, default, argument_default, description, &validate
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
# Delegates {Class.option} to {Options::Undefined#option}.
|
77
|
+
# @api internal
|
78
|
+
# @param (see Options::Undefined#option)
|
79
|
+
# @yield (see Options::Undefined#option)
|
80
|
+
# @yieldparam (see Options::Undefined#option)
|
81
|
+
# @raise (see Options::Undefined#option)
|
82
|
+
# @return [self]
|
83
|
+
def option(short, long, argument, default, description, &validate)
|
84
|
+
@options.option short, long, argument, default, description, &validate
|
85
|
+
self
|
86
|
+
end
|
87
|
+
|
88
|
+
# Delegates {Class.multioption} to {Options::Undefined#multioption}.
|
89
|
+
# @api internal
|
90
|
+
# @param (see Options::Undefined#multioption)
|
91
|
+
# @yield (see Options::Undefined#multioption)
|
92
|
+
# @yieldparam (see Options::Undefined#multioption)
|
93
|
+
# @raise (see Options::Undefined#multioption)
|
94
|
+
# @return [self]
|
95
|
+
def multioption(short, long, argument, type, description, &validate)
|
96
|
+
@options.multioption short, long, argument, type, description, &validate
|
97
|
+
self
|
98
|
+
end
|
99
|
+
|
100
|
+
# Delegates {Class.argument} to {Arguments::Undefined#argument}.
|
101
|
+
# @api internal
|
102
|
+
# @param (see Arguments::Undefined#argument)
|
103
|
+
# @yield (see Arguments::Undefined#argument)
|
104
|
+
# @yieldparam (see Arguments::Undefined#argument)
|
105
|
+
# @raise (see Arguments::Undefined#argument)
|
106
|
+
# @raise (see Arguments::Optional#argument)
|
107
|
+
# @raise (see Arguments::Complete#argument)
|
108
|
+
# @return [self]
|
109
|
+
def argument(name, type, description, &validate)
|
110
|
+
@arguments.argument(name, type, description, &validate)
|
111
|
+
self
|
112
|
+
end
|
113
|
+
|
114
|
+
# Delegates {Class.argument} to {Arguments::Undefined#optional} or
|
115
|
+
# {Arguments::Optional#optional}.
|
116
|
+
# @api internal
|
117
|
+
# @param (see Arguments::Undefined#optional)
|
118
|
+
# @yield (see Arguments::Undefined#optional)
|
119
|
+
# @yieldparam (see Arguments::Undefined#optional)
|
120
|
+
# @param (see Arguments::Undefined#optional)
|
121
|
+
# @raise (see Arguments::Undefined#optional)
|
122
|
+
# @raise (see Arguments::Complete#optional)
|
123
|
+
# @return [self]
|
124
|
+
def optional(name, default, description, &validate)
|
125
|
+
@arguments = @arguments.optional(name, default, description, &validate)
|
126
|
+
self
|
127
|
+
end
|
128
|
+
|
129
|
+
# Delegates {Class.argument} to {Arguments::Undefined#splat}.
|
130
|
+
# @api internal
|
131
|
+
# @param (see Arguments::Undefined#splat)
|
132
|
+
# @option (see Arguments::Undefined#splat)
|
133
|
+
# @yield (see Arguments::Undefined#splat)
|
134
|
+
# @yieldparam (see Arguments::Undefined#splat)
|
135
|
+
# @raise (see Arguments::Undefined#splat)
|
136
|
+
# @raise (see Arguments::Complete#splat)
|
137
|
+
# @return [self]
|
138
|
+
def splat(name, type, description, &validate)
|
139
|
+
@arguments = @arguments.splat(name, type, description, &validate)
|
140
|
+
self
|
141
|
+
end
|
142
|
+
|
143
|
+
# Delegates {Class.argument} to {Arguments::Undefined#splus}.
|
144
|
+
# @api internal
|
145
|
+
# @param (see Arguments::Undefined#splus)
|
146
|
+
# @option (see Arguments::Undefined#splus)
|
147
|
+
# @yield (see Arguments::Undefined#splus)
|
148
|
+
# @yieldparam (see Arguments::Undefined#splus)
|
149
|
+
# @raise (see Arguments::Undefined#splus)
|
150
|
+
# @raise (see Arguments::Optional#splus)
|
151
|
+
# @raise (see Arguments::Complete#splus)
|
152
|
+
# @return [self]
|
153
|
+
def splus(name, type, description, &validate)
|
154
|
+
@arguments = @arguments.splus(name, type, description, &validate)
|
155
|
+
self
|
156
|
+
end
|
157
|
+
|
158
|
+
# @api internal
|
159
|
+
# @return [Method] The method RUBY_NAME after adding a “help” flag that’ll
|
160
|
+
# display help via {Class.help}#method and raise {AbortAllProcessing}
|
161
|
+
def define(ruby_name)
|
162
|
+
flag '', 'help', nil, 'Display help for this method' do
|
163
|
+
@class.help.method @class.methods[Ame::Method.name(ruby_name)]
|
164
|
+
throw Ame::AbortAllProcessing
|
165
|
+
end unless @options.include? 'help'
|
166
|
+
Ame::Method.new(ruby_name, @class, @description, @options.define, @arguments.define)
|
167
|
+
end
|
168
|
+
|
169
|
+
# @param [String] option
|
170
|
+
# @return [Boolean] True if OPTION has been defined on the receiver
|
171
|
+
def option?(option)
|
172
|
+
@options.include? option
|
173
|
+
end
|
174
|
+
|
175
|
+
# @return [Boolean] True if any arguments have been defined on the receiver
|
176
|
+
def arguments?
|
177
|
+
not @arguments.empty?
|
178
|
+
end
|
179
|
+
|
180
|
+
# @return [Boolean] True if a description has been defined on the receiver
|
181
|
+
def valid?
|
182
|
+
not description.nil?
|
183
|
+
end
|
184
|
+
end
|