
- I couldn't figure out what this would stand for, so I asked on Slack if anyone had better ideas otherwise I'd go with "ostrich" or "octopus". Rylan suggested "option", which is very sensible.
165 lines
2.6 KiB
Ruby
165 lines
2.6 KiB
Ruby
# 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)
|
|
# Ensure this is synced with `initialize_dup` and `freeze` (excluding simple objects like integers and booleans)
|
|
@options = Set.new(*args)
|
|
end
|
|
|
|
def initialize_dup(other)
|
|
super
|
|
@options = @options.dup
|
|
end
|
|
|
|
def freeze
|
|
@options.dup
|
|
super
|
|
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?(option)
|
|
any? { |opt| opt == option || opt.name == option || opt.flag == option }
|
|
end
|
|
|
|
alias to_ary to_a
|
|
|
|
sig { returns(String) }
|
|
def to_s
|
|
@options.map(&:to_s).join(" ")
|
|
end
|
|
|
|
sig { returns(String) }
|
|
def inspect
|
|
"#<#{self.class.name}: #{to_a.inspect}>"
|
|
end
|
|
|
|
def self.dump_for_formula(formula)
|
|
formula.options.sort_by(&:flag).each do |opt|
|
|
puts "#{opt.flag}\n\t#{opt.description}"
|
|
end
|
|
puts "--HEAD\n\tInstall HEAD version" if formula.head
|
|
end
|
|
end
|