From 2a0391230644cbc50d964149dcb0af4c02ac0992 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Thu, 27 Aug 2026 05:35:58 -0400 Subject: [PATCH 1/4] gh-152023: Update macOS installer builds to SQLite 3.53.4. (#156446) --- Mac/BuildScript/build-installer.py | 6 +++--- .../macOS/2026-08-27-04-10-12.gh-issue-152023.RNIecw.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2026-08-27-04-10-12.gh-issue-152023.RNIecw.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 16ad3fd111f65d6..a18079e7ebf3398 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -359,9 +359,9 @@ def library_recipes(): ), ), dict( - name="SQLite 3.53.3", - url="https://www.sqlite.org/2026/sqlite-autoconf-3530300.tar.gz", - checksum="c917d7db16648ec95f714974ace5e5dcf46b7dc70e26600a0a102a3141125db0", + name="SQLite 3.53.4", + url="https://www.sqlite.org/2026/sqlite-autoconf-3530400.tar.gz", + checksum="0e9483900e92cd5de8fd48d16bf9200145a61f7fd5be542a5ac81d8a9516eb9c", extra_cflags=('-Os ' '-DSQLITE_ENABLE_FTS5 ' '-DSQLITE_ENABLE_FTS4 ' diff --git a/Misc/NEWS.d/next/macOS/2026-08-27-04-10-12.gh-issue-152023.RNIecw.rst b/Misc/NEWS.d/next/macOS/2026-08-27-04-10-12.gh-issue-152023.RNIecw.rst new file mode 100644 index 000000000000000..32267c623f6e104 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2026-08-27-04-10-12.gh-issue-152023.RNIecw.rst @@ -0,0 +1 @@ +Update macOS installer builds to SQLite 3.53.4. From b8bf99cc4786c2d8725115006ebd92a15a2d981b Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Thu, 27 Aug 2026 05:39:10 -0400 Subject: [PATCH 2/4] gh-156369: Update macOS installer to use OpenSSL 3.5.8. (#156447) --- Mac/BuildScript/build-installer.py | 6 +++--- .../macOS/2026-08-27-03-19-21.gh-issue-156369.FKlSGY.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2026-08-27-03-19-21.gh-issue-156369.FKlSGY.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index a18079e7ebf3398..f22256c1f506cb9 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -246,9 +246,9 @@ def library_recipes(): result.extend([ dict( - name="OpenSSL 3.5.7", - url="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/openssl/openssl/releases/download/openssl-3.5.7/openssl-3.5.7.tar.gz", - checksum="a8c0d28a529ca480f9f36cf5792e2cd21984552a3c8e4aa11a24aa31aeac98e8", + name="OpenSSL 3.5.8", + url="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/openssl/openssl/releases/download/openssl-3.5.8/openssl-3.5.8.tar.gz", + checksum="a8f84a39918ec6415ce765d9b429d313ba97b8143169c172e734b9514464f5b2", buildrecipe=build_universal_openssl, configure=None, install=None, diff --git a/Misc/NEWS.d/next/macOS/2026-08-27-03-19-21.gh-issue-156369.FKlSGY.rst b/Misc/NEWS.d/next/macOS/2026-08-27-03-19-21.gh-issue-156369.FKlSGY.rst new file mode 100644 index 000000000000000..e953a92f5a106da --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2026-08-27-03-19-21.gh-issue-156369.FKlSGY.rst @@ -0,0 +1 @@ +Update macOS installer to use OpenSSL 3.5.8. From 79f41dd9f312ab960e492c34b85f02e84cf1f556 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 27 Aug 2026 06:30:35 -0400 Subject: [PATCH 3/4] Docs: remove __path__ discussion from tutorial (#156426) * Docs: remove __path__ discussion from tutorial This isn't the current best way to make namespace packages; almost no one needs to make namespace packages; the deleted text even says "while this feature is not often needed". It doesn't belong in the tutorial. * add removed id to removed-ids.txt --- Doc/tools/removed-ids.txt | 2 ++ Doc/tutorial/modules.rst | 14 -------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/Doc/tools/removed-ids.txt b/Doc/tools/removed-ids.txt index 3801e6d31199d69..059cbb9a8465496 100644 --- a/Doc/tools/removed-ids.txt +++ b/Doc/tools/removed-ids.txt @@ -16,6 +16,8 @@ deprecations/index.html: pending-removal-in-python-3-16 deprecations/index.html: c-api-pending-removal-in-python-3-15 deprecations/index.html: c-api-pending-removal-in-python-3-16 +tutorial/modules.html: packages-in-multiple-directories + # Removed libmpdec using/configure.html: cmdoption-with-system-libmpdec diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index f8105cd5441fec2..46a226be606aeba 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -584,20 +584,6 @@ Since the main module does not have a package, modules intended for use as the main module of a Python application must always use absolute imports. -Packages in Multiple Directories --------------------------------- - -Packages support one more special attribute, :attr:`~module.__path__`. This is -initialized to be a :term:`sequence` of strings containing the name of the -directory holding the -package's :file:`__init__.py` before the code in that file is executed. This -variable can be modified; doing so affects future searches for modules and -subpackages contained in the package. - -While this feature is not often needed, it can be used to extend the set of -modules found in a package. - - .. rubric:: Footnotes .. [#] In fact function definitions are also 'statements' that are 'executed'; the From 6671d27327dd0518c502aaac9d1b2e079d80ef05 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 27 Aug 2026 14:11:33 +0300 Subject: [PATCH 4/4] gh-156444: Fix a negated character set with IGNORECASE and LOCALE (GH-156445) charset_loc_ignore() tested the whole set once per locale case and took the disjunction, which complements a set before closing it under case instead of after: [bc] matched b'B', but so did [^bc]. Match both cases of the character against every set member instead. Co-authored-by: Claude Opus 5 (1M context) --- Lib/test/test_re.py | 22 +++++++ ...-08-27-08-31-29.gh-issue-156444.klcySy.rst | 3 + Modules/_sre/sre_lib.h | 63 +++++++++++++++++-- 3 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-08-27-08-31-29.gh-issue-156444.klcySy.rst diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index d086fd521e73b59..ff106c1b3415668 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2145,6 +2145,28 @@ def test_locale_flag(self): self.assertRaises(ValueError, re.compile, b'(?a)', re.LOCALE) self.assertRaises(re.PatternError, re.compile, b'(?aL)') + def test_locale_ignorecase_negated_set(self): + IL = re.LOCALE | re.IGNORECASE + # [bc] matches b'B', so [^bc] must not. + self.assertTrue(re.fullmatch(rb'[bc]', b'B', IL)) + self.assertIsNone(re.fullmatch(rb'[^bc]', b'B', IL)) + self.assertIsNone(re.fullmatch(rb'[^b-c]', b'C', IL)) + self.assertIsNone(re.fullmatch(rb'[^bc]', b'c', IL)) + self.assertTrue(re.fullmatch(rb'[^bc]', b'a', IL)) + # A one-member set compiles to NOT_LITERAL_LOC_IGNORE. + self.assertIsNone(re.fullmatch(rb'[^b]', b'B', IL)) + self.assertTrue(re.fullmatch(rb'[^b]', b'a', IL)) + self.assertIsNone(re.fullmatch(rb'[^\wq]', b'Q', IL)) + # A sparse set compiles to a bitmap instead of ranges. + self.assertTrue(re.fullmatch(rb'[ace]', b'C', IL)) + self.assertIsNone(re.fullmatch(rb'[^ace]', b'C', IL)) + self.assertTrue(re.fullmatch(rb'[^ace]', b'b', IL)) + # An alternation folded into a set puts NEGATE in the middle of it. + self.assertIsNone(re.fullmatch(rb'(?:a|[^bc])', b'B', IL)) + self.assertTrue(re.fullmatch(rb'(?:a|[^bc])', b'A', IL)) + self.assertIsNone(re.fullmatch(rb'\w(? */ + if (lo == set[0] || up == set[0]) + return ok; + set++; + break; + + case SRE_OP_CATEGORY: + /* */ + if (sre_category(set[0], (int) lo) || + sre_category(set[0], (int) up)) + return ok; + set++; + break; + + case SRE_OP_CHARSET: + /* */ + if ((lo < 256 && (set[lo/SRE_CODE_BITS] + & (1u << (lo & (SRE_CODE_BITS-1))))) || + (up < 256 && (set[up/SRE_CODE_BITS] + & (1u << (up & (SRE_CODE_BITS-1)))))) + return ok; + set += 256/SRE_CODE_BITS; + break; + + case SRE_OP_RANGE: + /* */ + if ((set[0] <= lo && lo <= set[1]) || + (set[0] <= up && up <= set[1])) + return ok; + set += 2; + break; + + case SRE_OP_NEGATE: + ok = !ok; + break; + + default: + /* internal error -- there's not much we can do about it + here, so let's just pretend it didn't match... */ + return 0; + } + } } LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel);