#35630: `django.utils.formats.sanitize_strftime_format()` no longer works 
correctly
with Python 3.13.0b4
------------------------------+--------------------------------------
     Reporter:  Michał Górny  |                     Type:  Bug
       Status:  new           |                Component:  Utilities
      Version:  dev           |                 Severity:  Normal
     Keywords:                |             Triage Stage:  Unreviewed
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+--------------------------------------
 Python 3.13.0b4 includes a change to
 [https://github.com/python/cpython/issues/120713 add zero-padding to `%y`
 and `%Y` `strftime()` formats]. However, padding is not added to `%C` or
 `%F` formats.

 The current logic in django assumes that if `%Y` is padded, then no
 padding needs to be added:

 {{{
     if datetime.date(1, 1, 1).strftime("%Y") == "0001":
         return fmt
 }}}
 
https://github.com/django/django/blob/0e94f292cda632153f2b3d9a9037eb0141ae9c2e/django/utils/formats.py#L266

 This misfires on 3.13.0b4, stopping django from adding the padding to `%C`
 and `%F` formats.

 I've filed [https://github.com/python/cpython/issues/122272 a bug to
 CPython upstream about this inconsistent behavior].

 This is causing the following test failures:

 {{{
 ======================================================================
 FAIL: test_sanitize_strftime_format
 (i18n.tests.FormattingTests.test_sanitize_strftime_format) (year=1,
 fmt='%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1195, in
 test_sanitize_strftime_format
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '0' != '00'
 - 0
 + 00
 ? +


 ======================================================================
 FAIL: test_sanitize_strftime_format
 (i18n.tests.FormattingTests.test_sanitize_strftime_format) (year=1,
 fmt='%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1195, in
 test_sanitize_strftime_format
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '1-01-01' != '0001-01-01'
 - 1-01-01
 + 0001-01-01
 ? +++


 ======================================================================
 FAIL: test_sanitize_strftime_format
 (i18n.tests.FormattingTests.test_sanitize_strftime_format) (year=99,
 fmt='%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1195, in
 test_sanitize_strftime_format
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '0' != '00'
 - 0
 + 00
 ? +


 ======================================================================
 FAIL: test_sanitize_strftime_format
 (i18n.tests.FormattingTests.test_sanitize_strftime_format) (year=99,
 fmt='%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1195, in
 test_sanitize_strftime_format
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '99-01-01' != '0099-01-01'
 - 99-01-01
 + 0099-01-01
 ? ++


 ======================================================================
 FAIL: test_sanitize_strftime_format
 (i18n.tests.FormattingTests.test_sanitize_strftime_format) (year=999,
 fmt='%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1195, in
 test_sanitize_strftime_format
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '9' != '09'
 - 9
 + 09
 ? +


 ======================================================================
 FAIL: test_sanitize_strftime_format
 (i18n.tests.FormattingTests.test_sanitize_strftime_format) (year=999,
 fmt='%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1195, in
 test_sanitize_strftime_format
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '999-01-01' != '0999-01-01'
 - 999-01-01
 + 0999-01-01
 ? +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=1, fmt='%%%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%0' != '%00'
 - %0
 + %00
 ?   +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=1, fmt='%%%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%1-01-01' != '%0001-01-01'
 - %1-01-01
 + %0001-01-01
 ?  +++


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=1, fmt='%%%%%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%%0' != '%%00'
 - %%0
 + %%00
 ?    +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=1, fmt='%%%%%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%%1-01-01' != '%%0001-01-01'
 - %%1-01-01
 + %%0001-01-01
 ?   +++


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=99, fmt='%%%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%0' != '%00'
 - %0
 + %00
 ?   +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=99, fmt='%%%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%99-01-01' != '%0099-01-01'
 - %99-01-01
 + %0099-01-01
 ?  ++


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=99, fmt='%%%%%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%%0' != '%%00'
 - %%0
 + %%00
 ?    +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=99, fmt='%%%%%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%%99-01-01' != '%%0099-01-01'
 - %%99-01-01
 + %%0099-01-01
 ?   ++


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=999, fmt='%%%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%9' != '%09'
 - %9
 + %09
 ?  +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=999, fmt='%%%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%999-01-01' != '%0999-01-01'
 - %999-01-01
 + %0999-01-01
 ?  +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=999, fmt='%%%%%C')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%%9' != '%%09'
 - %%9
 + %%09
 ?   +


 ======================================================================
 FAIL: test_sanitize_strftime_format_with_escaped_percent
 (i18n.tests.FormattingTests.test_sanitize_strftime_format_with_escaped_percent)
 (year=999, fmt='%%%%%F')
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/tmp/django/tests/i18n/tests.py", line 1227, in
 test_sanitize_strftime_format_with_escaped_percent
     self.assertEqual(dt.strftime(fmt), expected)
     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 AssertionError: '%%999-01-01' != '%%0999-01-01'
 - %%999-01-01
 + %%0999-01-01
 ?   +
 }}}
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35630>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070190e97f5a03-6349abb8-2333-40b6-a864-65ac3b675b2b-000000%40eu-central-1.amazonses.com.

Reply via email to