From 519b8088fe363794c6144ebc8eedc473cd53a7ad Mon Sep 17 00:00:00 2001 From: johnnyshields <27655+johnnyshields@users.noreply.github.com> Date: Tue, 14 Nov 2023 03:07:48 +0900 Subject: [PATCH 1/3] Monkey Patch Removal: Remove __numeric__ class method from Numeric module. It is now inlined into its only usage. It was previously declared @api private so assume it is safe to delete. --- .../criteria/queryable/extensions/numeric.rb | 18 ++---------- .../queryable/extensions/numeric_spec.rb | 28 +++++++++---------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/lib/mongoid/criteria/queryable/extensions/numeric.rb b/lib/mongoid/criteria/queryable/extensions/numeric.rb index b4b63522df..3c6a3f2bf6 100644 --- a/lib/mongoid/criteria/queryable/extensions/numeric.rb +++ b/lib/mongoid/criteria/queryable/extensions/numeric.rb @@ -33,20 +33,6 @@ def __evolve_time__ module ClassMethods - # Get the object as a numeric. - # - # @api private - # - # @example Get the object as numeric. - # Object.__numeric__("1.442") - # - # @param [ Object ] object The object to convert. - # - # @return [ Object ] The converted number. - def __numeric__(object) - object.to_s.match?(/\A[-+]?[0-9]*[0-9.]0*\z/) ? object.to_i : Float(object) - end - # Evolve the object to an integer. # # @example Evolve to integers. @@ -57,7 +43,9 @@ def __numeric__(object) # @return [ Integer ] The evolved object. def evolve(object) __evolve__(object) do |obj| - __numeric__(obj) rescue obj + obj.to_s.match?(/\A[-+]?[0-9]*[0-9.]0*\z/) ? obj.to_i : Float(obj) + rescue + obj end end end diff --git a/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb b/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb index 4fca979182..1da51ab3fd 100644 --- a/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +++ b/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb @@ -7,12 +7,12 @@ let(:host) do Class.new do - include Mongoid::Criteria::Queryable::Extensions::Numeric::ClassMethods - end.new + extend Mongoid::Criteria::Queryable::Extensions::Numeric::ClassMethods + end end - describe "#__numeric__" do - let(:actual) { host.__numeric__(str) } + describe ".evolve" do + let(:actual) { host.evolve(str) } context "when the string is a whole number" do let(:str) { '123' } @@ -80,40 +80,40 @@ context "when the string is non-numeric" do let(:str) { 'foo' } - it "raises ArgumentError" do - expect { actual }.to raise_error(ArgumentError) + it "returns the string" do + expect(actual).to eq(str) end end context "when the string is non-numeric with leading dot" do let(:str) { '.foo' } - it "raises ArgumentError" do - expect { actual }.to raise_error(ArgumentError) + it "returns the string" do + expect(actual).to eq(str) end end context "when the string is non-numeric with trailing dot" do let(:str) { 'foo.' } - it "raises ArgumentError" do - expect { actual }.to raise_error(ArgumentError) + it "returns the string" do + expect(actual).to eq(str) end end context "when the string is non-numeric with trailing dot and zeroes" do let(:str) { 'foo.000' } - it "raises ArgumentError" do - expect { actual }.to raise_error(ArgumentError) + it "returns the string" do + expect(actual).to eq(str) end end context "when the string is empty" do let(:str) { '' } - it "raises ArgumentError" do - expect { actual }.to raise_error(ArgumentError) + it "returns the string" do + expect(actual).to eq(str) end end end From bc14f74d1f36b71ce48ecbf279e7dab93c113939 Mon Sep 17 00:00:00 2001 From: Johnny Shields <27655+johnnyshields@users.noreply.github.com> Date: Tue, 6 May 2025 05:49:33 +0900 Subject: [PATCH 2/3] Update numeric.rb --- .../criteria/queryable/extensions/numeric.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/mongoid/criteria/queryable/extensions/numeric.rb b/lib/mongoid/criteria/queryable/extensions/numeric.rb index 3c6a3f2bf6..383ae414f9 100644 --- a/lib/mongoid/criteria/queryable/extensions/numeric.rb +++ b/lib/mongoid/criteria/queryable/extensions/numeric.rb @@ -43,7 +43,21 @@ module ClassMethods # @return [ Integer ] The evolved object. def evolve(object) __evolve__(object) do |obj| - obj.to_s.match?(/\A[-+]?[0-9]*[0-9.]0*\z/) ? obj.to_i : Float(obj) + obj = obj.to_s + if str.empty? + nil + else + # These requirements seem a bit odd, but they're explicitly specified + # in the tests, so we're obligated to keep them, for now. + str = str.chop if str.end_with?('.') + if str.empty? + 0 + else + result = Integer(str) rescue Float(object) + integer = result.to_i + integer == result ? integer : result + end + end rescue obj end From 7a3a562db72e66c68e0e222b0ba4b5a886bc59ca Mon Sep 17 00:00:00 2001 From: Johnny Shields <27655+johnnyshields@users.noreply.github.com> Date: Tue, 6 May 2025 05:51:00 +0900 Subject: [PATCH 3/3] Update numeric.rb --- lib/mongoid/criteria/queryable/extensions/numeric.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mongoid/criteria/queryable/extensions/numeric.rb b/lib/mongoid/criteria/queryable/extensions/numeric.rb index 383ae414f9..e1655c8c19 100644 --- a/lib/mongoid/criteria/queryable/extensions/numeric.rb +++ b/lib/mongoid/criteria/queryable/extensions/numeric.rb @@ -43,7 +43,7 @@ module ClassMethods # @return [ Integer ] The evolved object. def evolve(object) __evolve__(object) do |obj| - obj = obj.to_s + str = obj.to_s if str.empty? nil else @@ -53,7 +53,7 @@ def evolve(object) if str.empty? 0 else - result = Integer(str) rescue Float(object) + result = Integer(str) rescue Float(obj) integer = result.to_i integer == result ? integer : result end