Permalink
Browse files

Add support for Object#in? and Object#either? in Active Support [#6321

…state:committed]

This will allow you to check if an object is included in another object
or the list of objects or not.

This patch is derived from patch by Brian Morearty and John Reitano on
Lighthouse ticket. I've rewrite it and make sure that we support both
'another object' and 'list of objects' version, as it surely be useful
to support both.
  • Loading branch information...
1 parent 62b2755 commit 635d991683c439da56fa72853880e88e6ac291ed Prem Sichanugrist, Brian Morearty, John Reitano committed with dhh Apr 10, 2011
View
@@ -1,5 +1,7 @@
*Rails 3.1.0 (unreleased)*
+* Add Object#in? to test if an object is included in another object, and Object#either? to test if an object is included in a list of objects which will be passed as arguments. [Prem Sichanugrist, Brian Morearty, John Reitano]
+
* LocalCache strategy is now a real middleware class, not an anonymous class
posing for pictures.
@@ -0,0 +1,20 @@
+class Object
+ # Returns true if this object is included in the argument. Argument must be
+ # any object which respond to +#include?+. Usage:
+ #
+ # characters = ["Konata", "Kagami", "Tsukasa"]
@chuyeow

chuyeow Apr 11, 2011

Contributor

Love the reference to Lucky Star :)

@pigoz

pigoz Apr 13, 2011

Moe got his way into Rails :)

+ # "Konata".in?(characters) # => true
+ #
+ def in?(another_object)
+ another_object.include?(self)
+ end
@tenderlove

tenderlove Apr 11, 2011

Owner

What should the behavior of this code be:

"foo".in?(nil)
+
+ # Returns true if this object is included in the argument list. Usage:
+ #
+ # username = "sikachu"
+ # username.either?("josevalim", "dhh", "wycats") # => false
+ #
+ def either?(*objects)
+ objects.include?(self)
+ end
+end
@@ -0,0 +1,52 @@
+require 'abstract_unit'
+require 'active_support/core_ext/object/inclusion'
+
+class InTest < Test::Unit::TestCase
+ def test_in_array
+ assert 1.in?([1,2])
+ assert !3.in?([1,2])
+ end
+
+ def test_in_hash
+ h = { "a" => 100, "b" => 200 }
+ assert "a".in?(h)
+ assert !"z".in?(h)
+ end
+
+ def test_in_string
+ assert "lo".in?("hello")
+ assert !"ol".in?("hello")
+ assert ?h.in?("hello")
+ end
+
+ def test_in_range
+ assert 25.in?(1..50)
+ assert !75.in?(1..50)
+ end
+
+ def test_in_set
+ s = Set.new([1,2])
+ assert 1.in?(s)
+ assert !3.in?(s)
+ end
+
+ def test_either
+ assert 1.either?(1,2,3)
+ assert !5.either?(1,2,3)
+ assert [1,2,3].either?([1,2,3], 2, [3,4,5])
+ end
+
+ module A
+ end
+ class B
+ include A
+ end
+ class C < B
+ end
+
+ def test_in_module
+ assert A.in?(B)
+ assert A.in?(C)
+ assert !A.in?(A)
+ end
+end

3 comments on commit 635d991

Owner

fxn replied Apr 10, 2011

Would be good to update also the AS guide.

Member

amatsuda replied Apr 11, 2011

Nice :)
But I prefer extlib version. https://github.com/datamapper/extlib/blob/master/lib/extlib/object.rb#L163

I just would like to use the shorter method name in any case.

Contributor

smartinez87 replied Apr 11, 2011

Updated AS guide to include this new methods: rails/docrails@7a1189a

Please sign in to comment.