-
-
Notifications
You must be signed in to change notification settings - Fork 9.3k
/
options.rb
148 lines (115 loc) 路 2.25 KB
/
options.rb
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# typed: false
# frozen_string_literal: true
# A formula option.
#
# @api private
class Option
extend T::Sig
attr_reader :name, :description, :flag
def initialize(name, description = "")
@name = name
@flag = "--#{name}"
@description = description
end
def to_s
flag
end
def <=>(other)
return unless other.is_a?(Option)
name <=> other.name
end
def ==(other)
instance_of?(other.class) && name == other.name
end
alias eql? ==
def hash
name.hash
end
sig { returns(String) }
def inspect
"#<#{self.class.name}: #{flag.inspect}>"
end
end
# A deprecated formula option.
#
# @api private
class DeprecatedOption
extend T::Sig
attr_reader :old, :current
def initialize(old, current)
@old = old
@current = current
end
sig { returns(String) }
def old_flag
"--#{old}"
end
sig { returns(String) }
def current_flag
"--#{current}"
end
def ==(other)
instance_of?(other.class) && old == other.old && current == other.current
end
alias eql? ==
end
# A collection of formula options.
#
# @api private
class Options
extend T::Sig
include Enumerable
def self.create(array)
new Array(array).map { |e| Option.new(e[/^--([^=]+=?)(.+)?$/, 1] || e) }
end
def initialize(*args)
@options = Set.new(*args)
end
def each(*args, &block)
@options.each(*args, &block)
end
def <<(other)
@options << other
self
end
def +(other)
self.class.new(@options + other)
end
def -(other)
self.class.new(@options - other)
end
def &(other)
self.class.new(@options & other)
end
def |(other)
self.class.new(@options | other)
end
def *(other)
@options.to_a * other
end
def ==(other)
instance_of?(other.class) &&
to_a == other.to_a
end
alias eql? ==
def empty?
@options.empty?
end
def as_flags
map(&:flag)
end
def include?(o)
any? { |opt| opt == o || opt.name == o || opt.flag == o }
end
alias to_ary to_a
sig { returns(String) }
def inspect
"#<#{self.class.name}: #{to_a.inspect}>"
end
def self.dump_for_formula(f)
f.options.sort_by(&:flag).each do |opt|
puts "#{opt.flag}\n\t#{opt.description}"
end
puts "--HEAD\n\tInstall HEAD version" if f.head
end
end