diff --git a/lib/vagrant/util/presence.rb b/lib/vagrant/util/presence.rb new file mode 100644 index 000000000..d0788efde --- /dev/null +++ b/lib/vagrant/util/presence.rb @@ -0,0 +1,41 @@ +module Vagrant + module Util + module Presence + extend self + + # Determines if the given object is "present". A String is considered + # present if the stripped contents are not empty. An Array/Hash is + # considered present if they have a length of more than 1. "true" is + # always present and `false` and `nil` are always not present. Any other + # object is considered to be present. + # + # @return [true, false] + def present?(obj) + case obj + when String + !obj.strip.empty? + when Array, Hash + !obj.empty? + when TrueClass, FalseClass + obj + when NilClass + false + when Object + true + end + end + + # Returns the presence of the object. If the object is {present?}, it is + # returned. Otherwise `false` is returned. + # + # @return [Object, false] + def presence(obj) + if present?(obj) + obj + else + false + end + end + end + end +end diff --git a/test/unit/vagrant/util/presence_test.rb b/test/unit/vagrant/util/presence_test.rb new file mode 100644 index 000000000..c20cc046e --- /dev/null +++ b/test/unit/vagrant/util/presence_test.rb @@ -0,0 +1,46 @@ +require File.expand_path("../../../base", __FILE__) + +require "vagrant/util/presence" + +describe Vagrant::Util::Presence do + subject { described_class } + + describe "#presence" do + it "returns false for nil" do + expect(subject.presence(nil)).to be(false) + end + + it "returns false for false" do + expect(subject.presence(false)).to be(false) + end + + it "returns false for an empty string" do + expect(subject.presence("")).to be(false) + end + + it "returns false for a string with null bytes" do + expect(subject.presence("\u0000")).to be(false) + end + + it "returns false for an empty array" do + expect(subject.presence([])).to be(false) + end + + it "returns false for an empty hash" do + expect(subject.presence({})).to be(false) + end + + it "returns true for true" do + expect(subject.presence(true)).to be(true) + end + + it "returns the object for an object" do + obj = Object.new + expect(subject.presence(obj)).to be(obj) + end + + it "returns the class for a class" do + expect(subject.presence(String)).to be(String) + end + end +end