-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Drop runtime dependency on ActiveSupport due to minimum ruby requirement
more_core_extensions/core_ext/object/blank.rb was copied from https://github.com/rails/rails/blob/v5.0.0/activesupport/lib/active_support/core_ext/object/blank.rb With the release of ActiveSupport v5.0.0 a minimum required_ruby_version of '>= 2.2.2' was added. The code for Blank has been copied here so that we can continue to support ruby versions that don't meet that requirement. The test was mostly copied as well, but rewritten in rspec syntax. ActiveSupport has been added as a development dependency for ruby >= 2.2.2 to allow for testing nested hash features with HashWithIndifferentAccess
- Loading branch information
Showing
7 changed files
with
239 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
require 'more_core_extensions/core_ext/object/blank' | ||
require 'more_core_extensions/core_ext/object/namespace' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
# Copied from https://github.com/rails/rails/blob/v5.0.0/activesupport/lib/active_support/core_ext/object/blank.rb | ||
# With the release of ActiveSupport v5.0.0 a minimum required_ruby_version of '>= 2.2.2' was added. | ||
# This code has been copied here so that we can continue to support ruby versions that don't meet that requirement. | ||
|
||
unless Object.respond_to?(:blank?) | ||
class Object | ||
# An object is blank if it's false, empty, or a whitespace string. | ||
# For example, +false+, '', ' ', +nil+, [], and {} are all blank. | ||
# | ||
# This simplifies | ||
# | ||
# !address || address.empty? | ||
# | ||
# to | ||
# | ||
# address.blank? | ||
# | ||
# @return [true, false] | ||
def blank? | ||
respond_to?(:empty?) ? !!empty? : !self | ||
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 | ||
end | ||
|
||
class FalseClass | ||
# +false+ is blank: | ||
# | ||
# false.blank? # => true | ||
# | ||
# @return [true] | ||
def blank? | ||
true | ||
end | ||
end | ||
|
||
class TrueClass | ||
# +true+ is not blank: | ||
# | ||
# true.blank? # => false | ||
# | ||
# @return [false] | ||
def blank? | ||
false | ||
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? | ||
end | ||
|
||
class Hash | ||
# A hash is blank if it's empty: | ||
# | ||
# {}.blank? # => true | ||
# { key: 'value' }.blank? # => false | ||
# | ||
# @return [true, false] | ||
alias_method :blank?, :empty? | ||
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? || BLANK_RE === self | ||
end | ||
end | ||
|
||
class Numeric #:nodoc: | ||
# No number is blank: | ||
# | ||
# 1.blank? # => false | ||
# 0.blank? # => false | ||
# | ||
# @return [false] | ||
def blank? | ||
false | ||
end | ||
end | ||
|
||
class Time #:nodoc: | ||
# No Time is blank: | ||
# | ||
# Time.now.blank? # => false | ||
# | ||
# @return [false] | ||
def blank? | ||
false | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
describe "blank" do | ||
class EmptyTrue | ||
def empty? | ||
0 | ||
end | ||
end | ||
|
||
class EmptyFalse | ||
def empty? | ||
nil | ||
end | ||
end | ||
|
||
BLANK = [ EmptyTrue.new, nil, false, '', ' ', " \n\t \r ", ' ', "\u00a0", [], {} ] | ||
PRESENT = [ EmptyFalse.new, Object.new, true, 0, 1, 'a', [nil], { nil => 0 } ] | ||
|
||
describe "#blank?" do | ||
context "true" do | ||
BLANK.each { |v| it("#{v.inspect}") { expect(v).to be_blank } } | ||
end | ||
|
||
context "false" do | ||
PRESENT.each { |v| it("#{v.inspect}") { expect(v).to_not be_blank } } | ||
end | ||
end | ||
|
||
describe "#present?" do | ||
context "true" do | ||
PRESENT.each { |v| it("#{v.inspect}") { expect(v).to be_present } } | ||
end | ||
|
||
context "false" do | ||
BLANK.each { |v| it("#{v.inspect}") { expect(v).to_not be_present } } | ||
end | ||
end | ||
|
||
describe "#presence" do | ||
context "object" do | ||
PRESENT.each { |v| it("#{v.inspect}") { expect(v.presence).to eq(v) } } | ||
end | ||
|
||
context "nil" do | ||
BLANK.each { |v| it("#{v.inspect}") { expect(v.presence).to be_nil } } | ||
end | ||
end | ||
end |