Skip to content

[3.13] gh-117655: Prevent test_strptime from raising a DeprecationWarning (GH-117668) #118956

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Lib/test/datetimetester.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

from test import support
from test.support import is_resource_enabled, ALWAYS_EQ, LARGEST, SMALLEST
from test.support import warnings_helper

import datetime as datetime_module
from datetime import MINYEAR, MAXYEAR
Expand Down Expand Up @@ -2797,6 +2798,7 @@ def test_strptime_single_digit(self):
newdate = strptime(string, format)
self.assertEqual(newdate, target, msg=reason)

@warnings_helper.ignore_warnings(category=DeprecationWarning)
def test_strptime_leap_year(self):
# GH-70647: warns if parsing a format with a day and no year.
with self.assertRaises(ValueError):
Expand Down
32 changes: 18 additions & 14 deletions Lib/test/test_strptime.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import os
import sys
from test import support
from test.support import skip_if_buggy_ucrt_strfptime
from test.support import skip_if_buggy_ucrt_strfptime, warnings_helper
from datetime import date as datetime_date

import _strptime
Expand Down Expand Up @@ -120,7 +120,7 @@ def setUp(self):

def test_pattern(self):
# Test TimeRE.pattern
pattern_string = self.time_re.pattern(r"%a %A %d")
pattern_string = self.time_re.pattern(r"%a %A %d %Y")
self.assertTrue(pattern_string.find(self.locale_time.a_weekday[2]) != -1,
"did not find abbreviated weekday in pattern string '%s'" %
pattern_string)
Expand Down Expand Up @@ -160,10 +160,11 @@ def test_compile(self):
found.group('b')))
for directive in ('a','A','b','B','c','d','G','H','I','j','m','M','p',
'S','u','U','V','w','W','x','X','y','Y','Z','%'):
compiled = self.time_re.compile("%" + directive)
found = compiled.match(time.strftime("%" + directive))
fmt = "%d %Y" if directive == 'd' else "%" + directive
compiled = self.time_re.compile(fmt)
found = compiled.match(time.strftime(fmt))
self.assertTrue(found, "Matching failed on '%s' using '%s' regex" %
(time.strftime("%" + directive),
(time.strftime(fmt),
compiled.pattern))

def test_blankpattern(self):
Expand Down Expand Up @@ -290,8 +291,9 @@ def test_unconverteddata(self):

def helper(self, directive, position):
"""Helper fxn in testing."""
strf_output = time.strftime("%" + directive, self.time_tuple)
strp_output = _strptime._strptime_time(strf_output, "%" + directive)
fmt = "%d %Y" if directive == 'd' else "%" + directive
strf_output = time.strftime(fmt, self.time_tuple)
strp_output = _strptime._strptime_time(strf_output, fmt)
self.assertTrue(strp_output[position] == self.time_tuple[position],
"testing of '%s' directive failed; '%s' -> %s != %s" %
(directive, strf_output, strp_output[position],
Expand Down Expand Up @@ -497,9 +499,11 @@ def test_escaping(self):
need_escaping = r".^$*+?{}\[]|)("
self.assertTrue(_strptime._strptime_time(need_escaping, need_escaping))

@warnings_helper.ignore_warnings(category=DeprecationWarning) # gh-70647
def test_feb29_on_leap_year_without_year(self):
time.strptime("Feb 29", "%b %d")

@warnings_helper.ignore_warnings(category=DeprecationWarning) # gh-70647
def test_mar1_comes_after_feb29_even_when_omitting_the_year(self):
self.assertLess(
time.strptime("Feb 29", "%b %d"),
Expand Down Expand Up @@ -679,33 +683,33 @@ class CacheTests(unittest.TestCase):
def test_time_re_recreation(self):
# Make sure cache is recreated when current locale does not match what
# cached object was created with.
_strptime._strptime_time("10", "%d")
_strptime._strptime_time("10 2004", "%d %Y")
_strptime._strptime_time("2005", "%Y")
_strptime._TimeRE_cache.locale_time.lang = "Ni"
original_time_re = _strptime._TimeRE_cache
_strptime._strptime_time("10", "%d")
_strptime._strptime_time("10 2004", "%d %Y")
self.assertIsNot(original_time_re, _strptime._TimeRE_cache)
self.assertEqual(len(_strptime._regex_cache), 1)

def test_regex_cleanup(self):
# Make sure cached regexes are discarded when cache becomes "full".
try:
del _strptime._regex_cache['%d']
del _strptime._regex_cache['%d %Y']
except KeyError:
pass
bogus_key = 0
while len(_strptime._regex_cache) <= _strptime._CACHE_MAX_SIZE:
_strptime._regex_cache[bogus_key] = None
bogus_key += 1
_strptime._strptime_time("10", "%d")
_strptime._strptime_time("10 2004", "%d %Y")
self.assertEqual(len(_strptime._regex_cache), 1)

def test_new_localetime(self):
# A new LocaleTime instance should be created when a new TimeRE object
# is created.
locale_time_id = _strptime._TimeRE_cache.locale_time
_strptime._TimeRE_cache.locale_time.lang = "Ni"
_strptime._strptime_time("10", "%d")
_strptime._strptime_time("10 2004", "%d %Y")
self.assertIsNot(locale_time_id, _strptime._TimeRE_cache.locale_time)

def test_TimeRE_recreation_locale(self):
Expand All @@ -716,13 +720,13 @@ def test_TimeRE_recreation_locale(self):
except locale.Error:
self.skipTest('test needs en_US.UTF8 locale')
try:
_strptime._strptime_time('10', '%d')
_strptime._strptime_time('10 2004', '%d %Y')
# Get id of current cache object.
first_time_re = _strptime._TimeRE_cache
try:
# Change the locale and force a recreation of the cache.
locale.setlocale(locale.LC_TIME, ('de_DE', 'UTF8'))
_strptime._strptime_time('10', '%d')
_strptime._strptime_time('10 2004', '%d %Y')
# Get the new cache object's id.
second_time_re = _strptime._TimeRE_cache
# They should not be equal.
Expand Down
Loading