Skip to content

Commit 9ca06df

Browse files
committed
MONGOID-5222 fix array, set, regexp mongoize
1 parent ad3c600 commit 9ca06df

File tree

8 files changed

+96
-5
lines changed

8 files changed

+96
-5
lines changed

lib/mongoid/criteria/queryable/extensions/array.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ module ClassMethods
133133
#
134134
# @return [ Object ] The evolved object.
135135
def evolve(object)
136-
if object.is_a?(::Array)
136+
case object
137+
when ::Array, ::Set
137138
object.map { |obj| obj.class.evolve(obj) }
138139
else
139140
object

lib/mongoid/extensions/array.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ def __mongoize_fk__(association, object)
147147
# @return [ Array | nil ] The object mongoized or nil.
148148
def mongoize(object)
149149
return if object.nil?
150-
if object.is_a?(::Array)
150+
case object
151+
when ::Array, ::Set
151152
evolve(object).collect{ |obj| obj.class.mongoize(obj) }
152153
end
153154
end

lib/mongoid/extensions/regexp.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ def mongoize(object)
2222
when ::Regexp then object
2323
when BSON::Regexp::Raw then object.compile
2424
end
25+
rescue RegexpError
26+
nil
2527
end
2628
end
2729
end

lib/mongoid/extensions/set.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ def demongoize(object)
4141
def mongoize(object)
4242
return if object.nil?
4343
case object
44-
when Array, Set then ::Array.mongoize(object.to_a)
44+
when ::Set then ::Array.mongoize(object.to_a)
45+
when ::Array then ::Array.mongoize(object).uniq
4546
end
4647
end
4748
end

spec/mongoid/criteria/queryable/extensions/array_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@
3333
expect(described_class.evolve("testing")).to eq("testing")
3434
end
3535
end
36+
37+
context "when providing a set" do
38+
39+
it "returns an array" do
40+
expect(described_class.evolve([ 1, 2, 3 ].to_set)).to eq([ 1, 2, 3 ])
41+
end
42+
end
3643
end
3744

3845
describe "#__add__" do

spec/mongoid/extensions/array_spec.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,12 +488,12 @@
488488
Date.new(2012, 1, 1)
489489
end
490490

491-
let(:array) do
491+
let(:input) do
492492
[ date ]
493493
end
494494

495495
let(:mongoized) do
496-
Array.mongoize(array)
496+
Array.mongoize(input)
497497
end
498498

499499
it "mongoizes each element in the array" do
@@ -503,6 +503,20 @@
503503
it "converts the elements properly" do
504504
expect(mongoized.first).to eq(Time.utc(2012, 1, 1, 0, 0, 0))
505505
end
506+
507+
context "when passing in a set" do
508+
let(:input) do
509+
[ date ].to_set
510+
end
511+
512+
it "mongoizes to an array" do
513+
expect(mongoized).to be_a(Array)
514+
end
515+
516+
it "converts the elements properly" do
517+
expect(mongoized.first).to eq(Time.utc(2012, 1, 1, 0, 0, 0))
518+
end
519+
end
506520
end
507521

508522
describe "#mongoize" do

spec/mongoid/extensions/regexp_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,28 @@
7272
expect(value).to eq(/hello/)
7373
end
7474
end
75+
76+
context "when providing an invalid regexp" do
77+
78+
let(:value) do
79+
Regexp.mongoize("[")
80+
end
81+
82+
it "returns nil" do
83+
expect(value).to be_nil
84+
end
85+
end
86+
87+
context "when providing an invalid Regexp to a BSON::Regexp::Raw" do
88+
89+
let(:value) do
90+
Regexp.mongoize(BSON::Regexp::Raw.new("["))
91+
end
92+
93+
it "returns nil" do
94+
expect(value).to be_nil
95+
end
96+
end
7597
end
7698

7799
describe "#mongoize" do

spec/mongoid/extensions/set_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,48 @@
3131
it "returns an array" do
3232
expect(set.mongoize).to eq([ "test" ])
3333
end
34+
35+
context "when there are mongoizable values in the container" do
36+
let(:date) do
37+
Date.new(2012, 1, 1)
38+
end
39+
40+
let(:mongoized) do
41+
Set.mongoize(input)
42+
end
43+
44+
context "when the input is an array" do
45+
46+
let(:input) do
47+
[ date ]
48+
end
49+
50+
it "mongoizes to a set" do
51+
expect(mongoized).to be_a(Array)
52+
end
53+
54+
it "mongoizes each element in the array" do
55+
expect(mongoized.first).to be_a(Time)
56+
end
57+
58+
it "converts the elements properly" do
59+
expect(mongoized.first).to eq(Time.utc(2012, 1, 1, 0, 0, 0))
60+
end
61+
end
62+
63+
context "when the input is a set" do
64+
let(:input) do
65+
[ date ].to_set
66+
end
67+
68+
it "mongoizes to a set" do
69+
expect(mongoized).to be_a(Array)
70+
end
71+
72+
it "converts the elements properly" do
73+
expect(mongoized.first).to eq(Time.utc(2012, 1, 1, 0, 0, 0))
74+
end
75+
end
76+
end
3477
end
3578
end

0 commit comments

Comments
 (0)