mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
106 lines
3.4 KiB
Ruby
106 lines
3.4 KiB
Ruby
# typed: strong
|
|
# frozen_string_literal: true
|
|
|
|
module Homebrew
|
|
module Livecheck
|
|
# Options to modify livecheck's behavior. These primarily come from
|
|
# `livecheck` blocks but they can also be set by livecheck at runtime.
|
|
#
|
|
# Option values use a `nil` default to indicate that the value has not been
|
|
# set.
|
|
class Options < T::Struct
|
|
# Whether to use brewed curl.
|
|
prop :homebrew_curl, T.nilable(T::Boolean)
|
|
|
|
# Form data to use when making a `POST` request.
|
|
prop :post_form, T.nilable(T::Hash[Symbol, String])
|
|
|
|
# JSON data to use when making a `POST` request.
|
|
prop :post_json, T.nilable(T::Hash[Symbol, T.anything])
|
|
|
|
# Returns a `Hash` of options that are provided as arguments to `url`.
|
|
sig { returns(T::Hash[Symbol, T.untyped]) }
|
|
def url_options
|
|
{
|
|
homebrew_curl:,
|
|
post_form:,
|
|
post_json:,
|
|
}
|
|
end
|
|
|
|
# Returns a `Hash` of all instance variables, using `String` keys.
|
|
sig { returns(T::Hash[String, T.untyped]) }
|
|
def to_hash
|
|
T.let(serialize, T::Hash[String, T.untyped])
|
|
end
|
|
|
|
# Returns a `Hash` of all instance variables, using `Symbol` keys.
|
|
sig { returns(T::Hash[Symbol, T.untyped]) }
|
|
def to_h = to_hash.transform_keys(&:to_sym)
|
|
|
|
# Returns a new object formed by merging `other` values with a copy of
|
|
# `self`.
|
|
#
|
|
# `nil` values are removed from `other` before merging if it is an
|
|
# `Options` object, as these are unitiailized values. This ensures that
|
|
# existing values in `self` aren't unexpectedly overwritten with defaults.
|
|
sig { params(other: T.any(Options, T::Hash[Symbol, T.untyped])).returns(Options) }
|
|
def merge(other)
|
|
return dup if other.empty?
|
|
|
|
this_hash = to_h
|
|
other_hash = other.is_a?(Options) ? other.to_h : other
|
|
return dup if this_hash == other_hash
|
|
|
|
new_options = this_hash.merge(other_hash)
|
|
Options.new(**new_options)
|
|
end
|
|
|
|
# Merges values from `other` into `self` and returns `self`.
|
|
#
|
|
# `nil` values are removed from `other` before merging if it is an
|
|
# `Options` object, as these are unitiailized values. This ensures that
|
|
# existing values in `self` aren't unexpectedly overwritten with defaults.
|
|
sig { params(other: T.any(Options, T::Hash[Symbol, T.untyped])).returns(Options) }
|
|
def merge!(other)
|
|
return self if other.empty?
|
|
|
|
if other.is_a?(Options)
|
|
return self if self == other
|
|
|
|
other.instance_variables.each do |ivar|
|
|
next if (v = T.let(other.instance_variable_get(ivar), Object)).nil?
|
|
|
|
instance_variable_set(ivar, v)
|
|
end
|
|
else
|
|
other.each do |k, v|
|
|
cmd = :"#{k}="
|
|
send(cmd, v) if respond_to?(cmd)
|
|
end
|
|
end
|
|
|
|
self
|
|
end
|
|
|
|
sig { params(other: Object).returns(T::Boolean) }
|
|
def ==(other)
|
|
return false unless other.is_a?(Options)
|
|
|
|
@homebrew_curl == other.homebrew_curl &&
|
|
@post_form == other.post_form &&
|
|
@post_json == other.post_json
|
|
end
|
|
alias eql? ==
|
|
|
|
# Whether the object has only default values.
|
|
sig { returns(T::Boolean) }
|
|
def empty? = to_hash.empty?
|
|
|
|
# Whether the object has any non-default values.
|
|
sig { returns(T::Boolean) }
|
|
def present? = !empty?
|
|
end
|
|
end
|
|
end
|