Permalink
Browse files

Merge pull request #25914 from jmccartie/jm/not_in

Adds `not_in?` onto Object
  • Loading branch information...
rafaelfranca committed Jul 22, 2016
2 parents 92c60f8 + 4db6ac2 commit 0020f1a4c96731a17ac4f84fa67058b5bc459fe2
@@ -1,3 +1,15 @@
* Introduce `not_in?` on `Object`.

As an opposite method for `in?`, `not_in?` provides equivalent support for exclusion. This turns this:

[1,2].exclude?(user_id)

...into this:

user_id.not_in?([1,2])

*Jon McCartie*

* Defines `Regexp.match?` for Ruby versions prior to 2.4. The predicate
has the same interface, but it does not have the performance boost. Its
purpose is to be able to write 2.4 compatible code.
@@ -4,6 +4,7 @@
require 'active_support/core_ext/object/deep_dup'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/object/inclusion'
require 'active_support/core_ext/object/exclusion'

require 'active_support/core_ext/object/conversions'
require 'active_support/core_ext/object/instance_variables'
@@ -0,0 +1,15 @@
class Object
# Returns true if this object is excluded in the argument. Argument must be
# any object which responds to +#include?+. Usage:
#
# characters = ["Konata", "Kagami", "Tsukasa"]
# "MoshiMoshi".not_in?(characters) # => true
#
# This will throw an +ArgumentError+ if the argument doesn't respond
# to +#include?+.
def not_in?(another_object)
!another_object.include?(self)
rescue NoMethodError
raise ArgumentError.new("The parameter passed to #not_in? must respond to #include?")
end
end
@@ -0,0 +1,53 @@
require 'abstract_unit'
require 'active_support/core_ext/object/exclusion'

class NotInTest < ActiveSupport::TestCase
def test_not_in_array
assert 1.not_in?([2, 3])
assert_not 2.not_in?([1,2])
end

def test_not_in_hash
h = { "a" => 100, "b" => 200 }
assert "z".not_in?(h)
assert_not "a".not_in?(h)
end

def test_not_in_string
assert "ol".not_in?("hello")
assert_not "lo".not_in?("hello")
assert ?z.not_in?("hello")
end

def test_not_in_range
assert 75.not_in?(1..50)
assert_not 25.not_in?(1..50)
end

def test_not_in_set
s = Set.new([1,2])
assert 3.not_in?(s)
assert_not 1.not_in?(s)
end

module A
end
class B
include A
end
class C < B
end
class D
end

def test_not_in_module
assert A.not_in?(D)
assert A.not_in?(A)
assert_not A.not_in?(B)
assert_not A.not_in?(C)
end

def test_no_method_catching
assert_raise(ArgumentError) { 1.not_in?(1) }
end
end

2 comments on commit 0020f1a

@fxn

This comment has been minimized.

Copy link
Member

fxn replied Jul 22, 2016

Could you please add it to the core extensions guide?

@rafaelfranca

This comment has been minimized.

Copy link
Member

rafaelfranca replied Jul 22, 2016

Please sign in to comment.