From ffc58a9710172b2d716a810a9f303828f3ebf108 Mon Sep 17 00:00:00 2001 From: Kalyan Date: Wed, 8 Jun 2022 05:04:50 +0530 Subject: gh-93370: Deprecate sqlite3.version and sqlite3.version_info (#93482) Co-authored-by: Alex Waygood Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Erlend E. Aasland --- Doc/library/sqlite3.rst | 10 ++++++++++ Lib/sqlite3/__init__.py | 13 +++++++++++++ Lib/sqlite3/dbapi2.py | 14 +++++++++++++- Lib/test/test_sqlite3/test_dbapi.py | 11 +++++++++++ Misc/ACKS | 1 + .../Library/2022-06-03-22-13-28.gh-issue-93370.tjfu9L.rst | 1 + Modules/_sqlite/module.c | 2 +- 7 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2022-06-03-22-13-28.gh-issue-93370.tjfu9L.rst diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 5c62047..140cd94 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -142,12 +142,22 @@ Module functions and constants The version number of this module, as a string. This is not the version of the SQLite library. + .. deprecated-removed:: 3.12 3.14 + This constant used to reflect the version number of the ``pysqlite`` + package, a third-party library which used to upstream changes to + ``sqlite3``. Today, it carries no meaning or practical value. + .. data:: version_info The version number of this module, as a tuple of integers. This is not the version of the SQLite library. + .. deprecated-removed:: 3.12 3.14 + This constant used to reflect the version number of the ``pysqlite`` + package, a third-party library which used to upstream changes to + ``sqlite3``. Today, it carries no meaning or practical value. + .. data:: sqlite_version diff --git a/Lib/sqlite3/__init__.py b/Lib/sqlite3/__init__.py index 34a9c04..927267c 100644 --- a/Lib/sqlite3/__init__.py +++ b/Lib/sqlite3/__init__.py @@ -55,3 +55,16 @@ The sqlite3 module is written by Gerhard Häring . """ from sqlite3.dbapi2 import * +from sqlite3.dbapi2 import (_deprecated_names, + _deprecated_version_info, + _deprecated_version) + + +def __getattr__(name): + if name in _deprecated_names: + from warnings import warn + + warn(f"{name} is deprecated and will be removed in Python 3.14", + DeprecationWarning, stacklevel=2) + return globals()[f"_deprecated_{name}"] + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/Lib/sqlite3/dbapi2.py b/Lib/sqlite3/dbapi2.py index 36ce769..3b6d2f7 100644 --- a/Lib/sqlite3/dbapi2.py +++ b/Lib/sqlite3/dbapi2.py @@ -25,6 +25,9 @@ import time import collections.abc from _sqlite3 import * +from _sqlite3 import _deprecated_version + +_deprecated_names = frozenset({"version", "version_info"}) paramstyle = "qmark" @@ -45,7 +48,7 @@ def TimeFromTicks(ticks): def TimestampFromTicks(ticks): return Timestamp(*time.localtime(ticks)[:6]) -version_info = tuple([int(x) for x in version.split(".")]) +_deprecated_version_info = tuple(map(int, _deprecated_version.split("."))) sqlite_version_info = tuple([int(x) for x in sqlite_version.split(".")]) Binary = memoryview @@ -85,3 +88,12 @@ register_adapters_and_converters() # Clean up namespace del(register_adapters_and_converters) + +def __getattr__(name): + if name in _deprecated_names: + from warnings import warn + + warn(f"{name} is deprecated and will be removed in Python 3.14", + DeprecationWarning, stacklevel=2) + return globals()[f"_deprecated_{name}"] + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 1fa02db..b958bf1 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -57,6 +57,17 @@ class ModuleTests(unittest.TestCase): self.assertEqual(sqlite.apilevel, "2.0", "apilevel is %s, should be 2.0" % sqlite.apilevel) + def test_deprecated_version(self): + msg = "deprecated and will be removed in Python 3.14" + for attr in "version", "version_info": + with self.subTest(attr=attr): + with self.assertWarnsRegex(DeprecationWarning, msg) as cm: + getattr(sqlite, attr) + self.assertEqual(cm.filename, __file__) + with self.assertWarnsRegex(DeprecationWarning, msg) as cm: + getattr(sqlite.dbapi2, attr) + self.assertEqual(cm.filename, __file__) + def test_thread_safety(self): self.assertIn(sqlite.threadsafety, {0, 1, 3}, "threadsafety is %d, should be 0, 1 or 3" % diff --git a/Misc/ACKS b/Misc/ACKS index 6b5ab49..c3a4f9b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1456,6 +1456,7 @@ Edward K. Ream Chris Rebert Marc Recht John Redford +Kalyan Reddy Terry J. Reedy Gareth Rees John Reese diff --git a/Misc/NEWS.d/next/Library/2022-06-03-22-13-28.gh-issue-93370.tjfu9L.rst b/Misc/NEWS.d/next/Library/2022-06-03-22-13-28.gh-issue-93370.tjfu9L.rst new file mode 100644 index 0000000..bd53150 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-06-03-22-13-28.gh-issue-93370.tjfu9L.rst @@ -0,0 +1 @@ +Deprecate :data:`sqlite3.version` and :data:`sqlite3.version_info`. diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 9b0e921..995d094 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -707,7 +707,7 @@ module_exec(PyObject *module) goto error; } - if (PyModule_AddStringConstant(module, "version", PYSQLITE_VERSION) < 0) { + if (PyModule_AddStringConstant(module, "_deprecated_version", PYSQLITE_VERSION) < 0) { goto error; } -- cgit v0.12