2023-11-26 09:33:42 -08:00
|
|
|
# typed: true
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class Object
|
|
|
|
# An object is blank if it's false, empty, or a whitespace string.
|
|
|
|
# For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
|
|
|
|
#
|
|
|
|
# This simplifies
|
|
|
|
#
|
|
|
|
# !address || address.empty?
|
|
|
|
#
|
|
|
|
# to
|
|
|
|
#
|
|
|
|
# address.blank?
|
|
|
|
#
|
|
|
|
# @return [true, false]
|
|
|
|
def blank?
|
|
|
|
respond_to?(:empty?) ? !!T.unsafe(self).empty? : false
|
|
|
|
end
|
|
|
|
|
|
|
|
# An object is present if it's not blank.
|
|
|
|
#
|
|
|
|
# @return [true, false]
|
|
|
|
def present?
|
|
|
|
!blank?
|
|
|
|
end
|
|
|
|
|
|
|
|
# Returns the receiver if it's present otherwise returns +nil+.
|
|
|
|
# <tt>object.presence</tt> is equivalent to
|
|
|
|
#
|
|
|
|
# object.present? ? object : nil
|
|
|
|
#
|
|
|
|
# For example, something like
|
|
|
|
#
|
|
|
|
# state = params[:state] if params[:state].present?
|
|
|
|
# country = params[:country] if params[:country].present?
|
|
|
|
# region = state || country || 'US'
|
|
|
|
#
|
|
|
|
# becomes
|
|
|
|
#
|
|
|
|
# region = params[:state].presence || params[:country].presence || 'US'
|
|
|
|
#
|
|
|
|
# @return [Object]
|
|
|
|
def presence
|
|
|
|
self if present?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class NilClass
|
|
|
|
# +nil+ is blank:
|
|
|
|
#
|
|
|
|
# nil.blank? # => true
|
|
|
|
#
|
|
|
|
# @return [true]
|
|
|
|
def blank?
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def present? # :nodoc:
|
|
|
|
false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class FalseClass
|
|
|
|
# +false+ is blank:
|
|
|
|
#
|
|
|
|
# false.blank? # => true
|
|
|
|
#
|
|
|
|
# @return [true]
|
|
|
|
def blank?
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def present? # :nodoc:
|
|
|
|
false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TrueClass
|
|
|
|
# +true+ is not blank:
|
|
|
|
#
|
|
|
|
# true.blank? # => false
|
|
|
|
#
|
|
|
|
# @return [false]
|
|
|
|
def blank?
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
|
|
|
def present? # :nodoc:
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Array
|
|
|
|
# An array is blank if it's empty:
|
|
|
|
#
|
|
|
|
# [].blank? # => true
|
|
|
|
# [1,2,3].blank? # => false
|
|
|
|
#
|
|
|
|
# @return [true, false]
|
|
|
|
alias_method :blank?, :empty?
|
|
|
|
|
|
|
|
def present? # :nodoc:
|
|
|
|
!empty?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Hash
|
|
|
|
# A hash is blank if it's empty:
|
|
|
|
#
|
|
|
|
# {}.blank? # => true
|
|
|
|
# { key: 'value' }.blank? # => false
|
|
|
|
#
|
|
|
|
# @return [true, false]
|
|
|
|
alias_method :blank?, :empty?
|
|
|
|
|
|
|
|
def present? # :nodoc:
|
|
|
|
!empty?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Symbol
|
|
|
|
# A Symbol is blank if it's empty:
|
|
|
|
#
|
|
|
|
# :''.blank? # => true
|
|
|
|
# :symbol.blank? # => false
|
|
|
|
alias_method :blank?, :empty?
|
|
|
|
|
|
|
|
def present? # :nodoc:
|
|
|
|
!empty?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class String
|
|
|
|
BLANK_RE = /\A[[:space:]]*\z/
|
|
|
|
|
|
|
|
# A string is blank if it's empty or contains whitespaces only:
|
|
|
|
#
|
|
|
|
# ''.blank? # => true
|
|
|
|
# ' '.blank? # => true
|
|
|
|
# "\t\n\r".blank? # => true
|
|
|
|
# ' blah '.blank? # => false
|
|
|
|
#
|
|
|
|
# Unicode whitespace is supported:
|
|
|
|
#
|
|
|
|
# "\u00a0".blank? # => true
|
|
|
|
#
|
|
|
|
# @return [true, false]
|
|
|
|
def blank?
|
|
|
|
# The regexp that matches blank strings is expensive. For the case of empty
|
|
|
|
# strings we can speed up this method (~3.5x) with an empty? call. The
|
|
|
|
# penalty for the rest of strings is marginal.
|
|
|
|
empty? ||
|
|
|
|
begin
|
|
|
|
BLANK_RE.match?(self)
|
|
|
|
rescue Encoding::CompatibilityError
|
2023-11-26 09:57:48 -08:00
|
|
|
Regexp.new(BLANK_RE.source.encode(self.encoding), BLANK_RE.options | Regexp::FIXEDENCODING).match?(self)
|
2023-11-26 09:33:42 -08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def present? # :nodoc:
|
|
|
|
!blank?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Numeric # :nodoc:
|
|
|
|
# No number is blank:
|
|
|
|
#
|
|
|
|
# 1.blank? # => false
|
|
|
|
# 0.blank? # => false
|
|
|
|
#
|
|
|
|
# @return [false]
|
|
|
|
def blank?
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
|
|
|
def present?
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Time # :nodoc:
|
|
|
|
# No Time is blank:
|
|
|
|
#
|
|
|
|
# Time.now.blank? # => false
|
|
|
|
#
|
|
|
|
# @return [false]
|
|
|
|
def blank?
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
|
|
|
def present?
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end
|