diff --git a/docs/tutorials/mongoid-upgrade.txt b/docs/tutorials/mongoid-upgrade.txt index eb8aba5abc..5f8bedb052 100644 --- a/docs/tutorials/mongoid-upgrade.txt +++ b/docs/tutorials/mongoid-upgrade.txt @@ -23,6 +23,79 @@ Upgrading to Mongoid 7.3 The following sections describe significant changes in Mongoid 7.3. +``::Boolean`` Removed +--------------------- + +**Breaking change:** Mongoid 7.3 removes the global ``::Boolean`` class. + +This change should have no impact on classes that simply use ``Boolean`` +fields, as the ``Boolean`` class is aliased from ``Mongoid::Fields`` +(which is included in ``Mongoid::Document``). The following field definition +continues to work in 7.3 as it did in 7.2: + +.. code-block:: ruby + + class User + include Mongoid::Document + + field :verified, type: Boolean + end + +However, code that is not executed in the context of a class including +``Mongoid::Document`` may need to explicitly qualify ``Boolean`` references. +The following snippet fails with Mongoid 7.3 due to ``Boolean`` being +unqualified: + +.. code-block:: ruby + + class User + include Mongoid::Document + end + + User.field :verified, type: Boolean + +To fix it, use the fully-qualified ``Mongoid::Boolean`` class: + +.. code-block:: ruby + + User.field :verified, type: Mongoid::Boolean + +Note that ``class_eval`` is executed in the scope of the caller, not in +the scope of the class being modified. Thus even when using ``class_eval`` +it is necessary to fully qualify ``Mongoid::Boolean``: + +.. code-block:: ruby + + User.class_eval do + field :verified, type: Mongoid::Boolean + end + +Additionally, in Mongoid 7.2 ``::Boolean`` and ``Mongoid::Boolean`` were +different classes. In Mongoid 7.3 there is only one class which is +``Mongoid::Boolean``. + +It is possible to restore the global ``::Boolean`` class by executing in +your application: + +.. code-block:: ruby + + Boolean = Mongoid::Boolean + +Note that this aliases ``Mongoid::Boolean`` to ``::Boolean`` such that there +is still only a single Boolean class: + +.. code-block:: ruby + + # With Mongoid 7.3: + Boolean = Mongoid::Boolean + Boolean == Mongoid::Boolean + # => true + + # With Mongoid 7.2: + Boolean == Mongoid::Boolean + # => false + + Selector Key Stringification ---------------------------- diff --git a/lib/mongoid/criteria/queryable/extensions.rb b/lib/mongoid/criteria/queryable/extensions.rb index fb06a01ddd..03999e890f 100644 --- a/lib/mongoid/criteria/queryable/extensions.rb +++ b/lib/mongoid/criteria/queryable/extensions.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true # encoding: utf-8 -unless defined?(Boolean) - class Boolean; end -end - if defined?(ActiveSupport) unless defined?(ActiveSupport::TimeWithZone) require "active_support/time_with_zone" diff --git a/lib/mongoid/criteria/queryable/extensions/boolean.rb b/lib/mongoid/criteria/queryable/extensions/boolean.rb index 556b1ccc56..8601e37acd 100644 --- a/lib/mongoid/criteria/queryable/extensions/boolean.rb +++ b/lib/mongoid/criteria/queryable/extensions/boolean.rb @@ -33,4 +33,4 @@ def evolve(object) end end -::Boolean.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Boolean::ClassMethods) +Mongoid::Boolean.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Boolean::ClassMethods) diff --git a/lib/mongoid/criteria/queryable/selectable.rb b/lib/mongoid/criteria/queryable/selectable.rb index 638e975a64..76de8b87a8 100644 --- a/lib/mongoid/criteria/queryable/selectable.rb +++ b/lib/mongoid/criteria/queryable/selectable.rb @@ -195,11 +195,11 @@ def exists(criterion) end typed_override(criterion, "$exists") do |value| - ::Boolean.evolve(value) + Mongoid::Boolean.evolve(value) end end key :exists, :override, "$exists" do |value| - ::Boolean.evolve(value) + Mongoid::Boolean.evolve(value) end # Add a $geoIntersects or $geoWithin selection. Symbol operators must diff --git a/lib/mongoid/extensions/boolean.rb b/lib/mongoid/extensions/boolean.rb index d93a20dca0..3e4fcd12a6 100644 --- a/lib/mongoid/extensions/boolean.rb +++ b/lib/mongoid/extensions/boolean.rb @@ -16,9 +16,8 @@ class << self # # @since 3.0.0 def mongoize(object) - ::Boolean.evolve(object) + evolve(object) end - alias :evolve :mongoize end end end diff --git a/lib/mongoid/extensions/false_class.rb b/lib/mongoid/extensions/false_class.rb index 1cb7a8297b..02cb755568 100644 --- a/lib/mongoid/extensions/false_class.rb +++ b/lib/mongoid/extensions/false_class.rb @@ -28,7 +28,7 @@ def __sortable__ # # @since 1.0.0 def is_a?(other) - if other == ::Boolean || other.class == ::Boolean + if other == Mongoid::Boolean || other.class == Mongoid::Boolean return true end super(other) diff --git a/lib/mongoid/extensions/true_class.rb b/lib/mongoid/extensions/true_class.rb index b9f54fa59a..896a5f9aa5 100644 --- a/lib/mongoid/extensions/true_class.rb +++ b/lib/mongoid/extensions/true_class.rb @@ -28,7 +28,7 @@ def __sortable__ # # @since 1.0.0 def is_a?(other) - if other == ::Boolean || other.class == ::Boolean + if other == Mongoid::Boolean || other.class == Mongoid::Boolean return true end super(other) diff --git a/lib/mongoid/fields.rb b/lib/mongoid/fields.rb index c100b3d109..3f029a3ec4 100644 --- a/lib/mongoid/fields.rb +++ b/lib/mongoid/fields.rb @@ -13,6 +13,7 @@ module Fields extend ActiveSupport::Concern StringifiedSymbol = Mongoid::StringifiedSymbol + Boolean = Mongoid::Boolean # For fields defined with symbols use the correct class. # diff --git a/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb b/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb index c906b3c461..04446209f2 100644 --- a/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +++ b/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" -describe Boolean do +describe Mongoid::Boolean do describe ".evolve" do diff --git a/spec/mongoid/extensions/false_class_spec.rb b/spec/mongoid/extensions/false_class_spec.rb index 11cc13cd8a..83bf2ebb08 100644 --- a/spec/mongoid/extensions/false_class_spec.rb +++ b/spec/mongoid/extensions/false_class_spec.rb @@ -17,7 +17,7 @@ context "when provided a Boolean" do it "returns true" do - expect(false.is_a?(Boolean)).to be true + expect(false.is_a?(Mongoid::Boolean)).to be true end end diff --git a/spec/mongoid/extensions/true_class_spec.rb b/spec/mongoid/extensions/true_class_spec.rb index c7249a7530..f99e5eda7d 100644 --- a/spec/mongoid/extensions/true_class_spec.rb +++ b/spec/mongoid/extensions/true_class_spec.rb @@ -17,7 +17,7 @@ context "when provided a Boolean" do it "returns true" do - expect(true.is_a?(Boolean)).to be true + expect(true.is_a?(Mongoid::Boolean)).to be true end end diff --git a/spec/mongoid/fields/localized_spec.rb b/spec/mongoid/fields/localized_spec.rb index 27eaf79e19..04e28f82b2 100644 --- a/spec/mongoid/fields/localized_spec.rb +++ b/spec/mongoid/fields/localized_spec.rb @@ -448,7 +448,7 @@ context "when the value is false" do let(:field) do - described_class.new(:boolean_value, localize: true, type: Boolean) + described_class.new(:boolean_value, localize: true, type: Mongoid::Boolean) end let(:value) do @@ -463,7 +463,7 @@ context "when the value is true" do let(:field) do - described_class.new(:boolean_value, localize: true, type: Boolean) + described_class.new(:boolean_value, localize: true, type: Mongoid::Boolean) end let(:value) do @@ -491,7 +491,7 @@ end let(:field) do - described_class.new(:boolean_value, localize: true, type: Boolean) + described_class.new(:boolean_value, localize: true, type: Mongoid::Boolean) end let(:value) do @@ -510,7 +510,7 @@ end let(:field) do - described_class.new(:boolean_value, localize: true, type: Boolean) + described_class.new(:boolean_value, localize: true, type: Mongoid::Boolean) end let(:value) do diff --git a/spec/mongoid/fields_spec.rb b/spec/mongoid/fields_spec.rb index ebea2ec709..0832f9bf5e 100644 --- a/spec/mongoid/fields_spec.rb +++ b/spec/mongoid/fields_spec.rb @@ -322,7 +322,7 @@ end it "converts to Mongoid::Boolean" do - expect(klass.field(:test, type: Boolean).type).to be(Mongoid::Boolean) + expect(klass.field(:test, type: Mongoid::Boolean).type).to be(Mongoid::Boolean) end end @@ -404,7 +404,7 @@ context "when the options are all standard" do before do - Band.field :acceptable, type: Boolean + Band.field :acceptable, type: Mongoid::Boolean end after do @@ -419,7 +419,7 @@ context "when a custom option is provided" do before do - Band.field :acceptable, type: Boolean, custom: true + Band.field :acceptable, type: Mongoid::Boolean, custom: true end it "adds the field to the model" do @@ -990,7 +990,7 @@ def testing=(value) end before do - Person.field :aliased, as: :alias, type: Boolean, overwrite: true + Person.field :aliased, as: :alias, type: Mongoid::Boolean, overwrite: true end it "uses the alias to write the attribute" do