]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
warnings removal, merge_result
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 29 Oct 2021 21:36:26 +0000 (17:36 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 30 Oct 2021 01:11:37 +0000 (21:11 -0400)
this is the last warning to remove.

Also fixes some mistakes I made with the new
Base20DeprecationWarning and LegacyAPIWarning classes created,
where functions in deprecations.py were still hardcoded to
RemovedIn20Warning.

Change-Id: I9a6045ac9b813fd2f9668c4bc518c46a7774c6ef

lib/sqlalchemy/orm/loading.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/testing/warnings.py
lib/sqlalchemy/util/deprecations.py
test/orm/test_deprecations.py
test/orm/test_loading.py

index 42ece864c92fbbd6968ca45c073f88fd00b8b041..bbad98144d2b8ef964fa60a4b0df605660c085b6 100644 (file)
@@ -264,14 +264,20 @@ def merge_frozen_result(session, statement, frozen_result, load=True):
         session.autoflush = autoflush
 
 
-@util.deprecated(
-    "2.0",
-    "The :func:`_orm.merge_result` method is superseded by the "
-    ":func:`_orm.merge_frozen_result` function.",
+@util.deprecated_20(
+    ":func:`_orm.merge_result`",
+    alternative="The function as well as the method on :class:`_orm.Query` "
+    "is superseded by the :func:`_orm.merge_frozen_result` function.",
+    becomes_legacy=True,
 )
 @util.preload_module("sqlalchemy.orm.context")
 def merge_result(query, iterator, load=True):
-    """Merge a result into this :class:`.Query` object's Session."""
+    """Merge a result into the given :class:`.Query` object's Session.
+
+    See :meth:`_orm.Query.merge_result` for top-level documentation on this
+    function.
+
+    """
 
     querycontext = util.preloaded.orm_context
 
index eab7a3d75a0ad60f652664ec09d5c5a963e70002..bd897211cad5d8ef9023dadc924fe78aac5aef85 100644 (file)
@@ -3002,6 +3002,13 @@ class Query(
 
         return result
 
+    @util.deprecated_20(
+        ":meth:`_orm.Query.merge_result`",
+        alternative="The method is superseded by the "
+        ":func:`_orm.merge_frozen_result` function.",
+        becomes_legacy=True,
+        enable_warnings=False,  # warnings occur via loading.merge_result
+    )
     def merge_result(self, iterator, load=True):
         """Merge a result into this :class:`_query.Query` object's Session.
 
index dbbafa7013c67034733cfdc54e8254739cc0f1a8..b5842ad694274f5fc89e989cb8ccc2c779ae4a37 100644 (file)
@@ -61,22 +61,6 @@ def setup_filters():
         message=r"^The (Sybase|firebird) dialect is deprecated and will be",
     )
 
-    # 2.0 deprecation warnings, which we will want to have all of these
-    # be "error" however for  I98b8defdf7c37b818b3824d02f7668e3f5f31c94
-    # we are moving one at a time
-    for msg in [
-        #
-        # ORM Session
-        #
-        r"The merge_result\(\) method is superseded by the "
-        r"merge_frozen_result\(\)",
-    ]:
-        warnings.filterwarnings(
-            "ignore",
-            message=msg,
-            category=sa_exc.RemovedIn20Warning,
-        )
-
     try:
         import pytest
     except ImportError:
index e1138aaefc618f03512994e99268604a73f47eb2..4d3e04fde853d2a66edf2d25702a833788bf32e8 100644 (file)
@@ -27,7 +27,10 @@ if os.getenv("SQLALCHEMY_WARN_20", "false").lower() in ("true", "yes", "1"):
 
 
 def _warn_with_version(msg, version, type_, stacklevel, code=None):
-    if issubclass(type_, exc.RemovedIn20Warning) and not SQLALCHEMY_WARN_20:
+    if (
+        issubclass(type_, exc.Base20DeprecationWarning)
+        and not SQLALCHEMY_WARN_20
+    ):
         return
 
     warn = type_(msg, code=code)
@@ -216,9 +219,12 @@ def deprecated_20(api_name, alternative=None, becomes_legacy=False, **kw):
     if alternative:
         message += " " + alternative
 
-    return deprecated(
-        "2.0", message=message, warning=exc.RemovedIn20Warning, **kw
-    )
+    if becomes_legacy:
+        warning_cls = exc.LegacyAPIWarning
+    else:
+        warning_cls = exc.RemovedIn20Warning
+
+    return deprecated("2.0", message=message, warning=warning_cls, **kw)
 
 
 def deprecated_params(**specs):
@@ -339,7 +345,7 @@ def _decorate_cls_with_warning(
         if constructor is not None:
             docstring_header %= dict(func=constructor)
 
-        if issubclass(wtype, exc.RemovedIn20Warning):
+        if issubclass(wtype, exc.Base20DeprecationWarning):
             docstring_header += (
                 " (Background on SQLAlchemy 2.0 at: "
                 ":ref:`migration_20_toplevel`)"
@@ -377,7 +383,7 @@ def _decorate_with_warning(
 
     message = _sanitize_restructured_text(message)
 
-    if issubclass(wtype, exc.RemovedIn20Warning):
+    if issubclass(wtype, exc.Base20DeprecationWarning):
         doc_only = (
             " (Background on SQLAlchemy 2.0 at: "
             ":ref:`migration_20_toplevel`)"
index 5d80156c882ff30a99347c3c82e53cfd871e7ea9..692a29b3069b7606f9e2793a0a5f3a60ef8f9d1f 100644 (file)
@@ -23,6 +23,7 @@ from sqlalchemy import text
 from sqlalchemy import true
 from sqlalchemy import util
 from sqlalchemy.engine import default
+from sqlalchemy.engine import result_tuple
 from sqlalchemy.engine.base import Engine
 from sqlalchemy.orm import aliased
 from sqlalchemy.orm import as_declarative
@@ -161,6 +162,10 @@ with_polymorphic_dep = (
     r"the 1.x series of SQLAlchemy and will be removed in 2.0"
 )
 
+merge_result_dep = (
+    r"The merge_result\(\) function is considered legacy as of the 1.x series"
+)
+
 
 def _aliased_join_warning(arg=None):
     return testing.expect_warnings(
@@ -9477,3 +9482,99 @@ class BindIntegrationTest(_fixtures.FixtureTest):
             assert (
                 c.exec_driver_sql("select count(1) from users").scalar() == 1
             )
+
+
+class MergeResultTest(_fixtures.FixtureTest):
+    run_setup_mappers = "once"
+    run_inserts = "once"
+    run_deletes = None
+
+    @classmethod
+    def setup_mappers(cls):
+        cls._setup_stock_mapping()
+
+    def _fixture(self):
+        User = self.classes.User
+
+        s = fixture_session()
+        u1, u2, u3, u4 = (
+            User(id=1, name="u1"),
+            User(id=2, name="u2"),
+            User(id=7, name="u3"),
+            User(id=8, name="u4"),
+        )
+        s.query(User).filter(User.id.in_([7, 8])).all()
+        s.close()
+        return s, [u1, u2, u3, u4]
+
+    def test_single_entity(self):
+        s, (u1, u2, u3, u4) = self._fixture()
+        User = self.classes.User
+
+        q = s.query(User)
+        collection = [u1, u2, u3, u4]
+
+        with assertions.expect_deprecated_20(merge_result_dep):
+            it = q.merge_result(collection)
+        eq_([x.id for x in it], [1, 2, 7, 8])
+
+    def test_single_column(self):
+        User = self.classes.User
+
+        s = fixture_session()
+
+        q = s.query(User.id)
+        collection = [(1,), (2,), (7,), (8,)]
+        with assertions.expect_deprecated_20(merge_result_dep):
+            it = q.merge_result(collection)
+        eq_(list(it), [(1,), (2,), (7,), (8,)])
+
+    def test_entity_col_mix_plain_tuple(self):
+        s, (u1, u2, u3, u4) = self._fixture()
+        User = self.classes.User
+
+        q = s.query(User, User.id)
+        collection = [(u1, 1), (u2, 2), (u3, 7), (u4, 8)]
+        with assertions.expect_deprecated_20(merge_result_dep):
+            it = q.merge_result(collection)
+        it = list(it)
+        eq_([(x.id, y) for x, y in it], [(1, 1), (2, 2), (7, 7), (8, 8)])
+        eq_(list(it[0]._mapping.keys()), ["User", "id"])
+
+    def test_entity_col_mix_keyed_tuple(self):
+        s, (u1, u2, u3, u4) = self._fixture()
+        User = self.classes.User
+
+        q = s.query(User, User.id)
+
+        row = result_tuple(["User", "id"])
+
+        def kt(*x):
+            return row(x)
+
+        collection = [kt(u1, 1), kt(u2, 2), kt(u3, 7), kt(u4, 8)]
+        with assertions.expect_deprecated_20(merge_result_dep):
+            it = q.merge_result(collection)
+        it = list(it)
+        eq_([(x.id, y) for x, y in it], [(1, 1), (2, 2), (7, 7), (8, 8)])
+        eq_(list(it[0]._mapping.keys()), ["User", "id"])
+
+    def test_none_entity(self):
+        s, (u1, u2, u3, u4) = self._fixture()
+        User = self.classes.User
+
+        ua = aliased(User)
+        q = s.query(User, ua)
+
+        row = result_tuple(["User", "useralias"])
+
+        def kt(*x):
+            return row(x)
+
+        collection = [kt(u1, u2), kt(u1, None), kt(u2, u3)]
+        with assertions.expect_deprecated_20(merge_result_dep):
+            it = q.merge_result(collection)
+        eq_(
+            [(x and x.id or None, y and y.id or None) for x, y in it],
+            [(u1.id, u2.id), (u1.id, None), (u2.id, u3.id)],
+        )
index 050dd3a2d710d2ce3e6a84f631b7b81df9418d16..88a160b5a8395b7bfd337b731aa82b0f48c337fa 100644 (file)
@@ -1,8 +1,6 @@
 from sqlalchemy import exc
 from sqlalchemy import select
 from sqlalchemy import testing
-from sqlalchemy.engine import result_tuple
-from sqlalchemy.orm import aliased
 from sqlalchemy.orm import loading
 from sqlalchemy.orm import relationship
 from sqlalchemy.testing import mock
@@ -117,15 +115,6 @@ class MergeResultTest(_fixtures.FixtureTest):
         s.close()
         return s, [u1, u2, u3, u4]
 
-    def test_single_entity(self):
-        s, (u1, u2, u3, u4) = self._fixture()
-        User = self.classes.User
-
-        q = s.query(User)
-        collection = [u1, u2, u3, u4]
-        it = loading.merge_result(q, collection)
-        eq_([x.id for x in it], [1, 2, 7, 8])
-
     def test_single_entity_frozen(self):
         s = fixture_session()
         User = self.classes.User
@@ -135,16 +124,6 @@ class MergeResultTest(_fixtures.FixtureTest):
         it = loading.merge_frozen_result(s, stmt, result.freeze())
         eq_([x.id for x in it().scalars()], [7, 8, 9])
 
-    def test_single_column(self):
-        User = self.classes.User
-
-        s = fixture_session()
-
-        q = s.query(User.id)
-        collection = [(1,), (2,), (7,), (8,)]
-        it = loading.merge_result(q, collection)
-        eq_(list(it), [(1,), (2,), (7,), (8,)])
-
     def test_single_column_frozen(self):
         User = self.classes.User
 
@@ -155,17 +134,6 @@ class MergeResultTest(_fixtures.FixtureTest):
         it = loading.merge_frozen_result(s, stmt, result.freeze())
         eq_([x.id for x in it()], [7, 8, 9])
 
-    def test_entity_col_mix_plain_tuple(self):
-        s, (u1, u2, u3, u4) = self._fixture()
-        User = self.classes.User
-
-        q = s.query(User, User.id)
-        collection = [(u1, 1), (u2, 2), (u3, 7), (u4, 8)]
-        it = loading.merge_result(q, collection)
-        it = list(it)
-        eq_([(x.id, y) for x, y in it], [(1, 1), (2, 2), (7, 7), (8, 8)])
-        eq_(list(it[0]._mapping.keys()), ["User", "id"])
-
     def test_entity_col_mix_plain_tuple_frozen(self):
         s = fixture_session()
         User = self.classes.User
@@ -181,39 +149,3 @@ class MergeResultTest(_fixtures.FixtureTest):
         it = list(it())
         eq_([(x.id, y) for x, y in it], [(7, 7), (8, 8), (9, 9)])
         eq_(list(it[0]._mapping.keys()), ["User", "id"])
-
-    def test_entity_col_mix_keyed_tuple(self):
-        s, (u1, u2, u3, u4) = self._fixture()
-        User = self.classes.User
-
-        q = s.query(User, User.id)
-
-        row = result_tuple(["User", "id"])
-
-        def kt(*x):
-            return row(x)
-
-        collection = [kt(u1, 1), kt(u2, 2), kt(u3, 7), kt(u4, 8)]
-        it = loading.merge_result(q, collection)
-        it = list(it)
-        eq_([(x.id, y) for x, y in it], [(1, 1), (2, 2), (7, 7), (8, 8)])
-        eq_(list(it[0]._mapping.keys()), ["User", "id"])
-
-    def test_none_entity(self):
-        s, (u1, u2, u3, u4) = self._fixture()
-        User = self.classes.User
-
-        ua = aliased(User)
-        q = s.query(User, ua)
-
-        row = result_tuple(["User", "useralias"])
-
-        def kt(*x):
-            return row(x)
-
-        collection = [kt(u1, u2), kt(u1, None), kt(u2, u3)]
-        it = loading.merge_result(q, collection)
-        eq_(
-            [(x and x.id or None, y and y.id or None) for x, y in it],
-            [(u1.id, u2.id), (u1.id, None), (u2.id, u3.id)],
-        )