1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# frozen_string_literal: true
module Mercenary
class Option
attr_reader :config_key, :description, :short, :long, :return_type
# Public: Create a new Option
#
# config_key - the key in the config hash to which the value of this option
# will map
# info - an array containing first the switches, then an optional
# return type (e.g. Array), then a description of the option
#
# Returns nothing
def initialize(config_key, info)
@config_key = config_key
while arg = info.shift
begin
@return_type = Object.const_get(arg.to_s)
next
rescue NameError
end
if arg.start_with?("-")
if arg.start_with?("--")
@long = arg
else
@short = arg
end
next
end
@description = arg
end
end
# Public: Fetch the array containing the info OptionParser is interested in
#
# Returns the array which OptionParser#on wants
def for_option_parser
[short, long, return_type, description].flatten.reject { |o| o.to_s.empty? }
end
# Public: Build a string representation of this option including the
# switches and description
#
# Returns a string representation of this option
def to_s
"#{formatted_switches} #{description}"
end
# Public: Build a beautifully-formatted string representation of the switches
#
# Returns a formatted string representation of the switches
def formatted_switches
[
switches.first.rjust(10),
switches.last.ljust(13),
].join(", ").gsub(%r! , !, " ").gsub(%r!, !, " ")
end
# Public: Hash based on the hash value of instance variables
#
# Returns a Fixnum which is unique to this Option based on the instance variables
def hash
instance_variables.map do |var|
instance_variable_get(var).hash
end.reduce(:^)
end
# Public: Check equivalence of two Options based on equivalence of their
# instance variables
#
# Returns true if all the instance variables are equal, false otherwise
def eql?(other)
return false unless self.class.eql?(other.class)
instance_variables.map do |var|
instance_variable_get(var).eql?(other.instance_variable_get(var))
end.all?
end
# Public: Fetch an array of switches, including the short and long versions
#
# Returns an array of two strings. An empty string represents no switch in
# that position.
def switches
[short, long].map(&:to_s)
end
end
end
|