From fcfe8e1ac82deae1a1ecc1e4ceda9eac48649a0a Mon Sep 17 00:00:00 2001 From: Ankit Kumar Pandey Date: Mon, 20 Feb 2023 20:41:04 +0530 Subject: [PATCH 1/2] Return arg in case of invalid param in strftime Chrono panics in case of unsupported formats, this patch handles such cases and returns supplied format as a result. --- Lib/test/test_time.py | 3 ++- extra_tests/snippets/stdlib_datetime.py | 5 +++++ vm/src/stdlib/time.rs | 12 +++++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index c27ffcf933..4e618d1d90 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -157,7 +157,8 @@ def test_sleep(self): self.assertRaises(ValueError, time.sleep, -1) time.sleep(1.2) - @unittest.skip("TODO: RUSTPYTHON, thread 'main' panicked at 'a Display implementation returned an error unexpectedly: Error'") + # TODO: RUSTPYTHON + @unittest.expectedFailure def test_strftime(self): tt = time.gmtime(self.t) for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I', diff --git a/extra_tests/snippets/stdlib_datetime.py b/extra_tests/snippets/stdlib_datetime.py index 5302117f37..4e6b0423b6 100644 --- a/extra_tests/snippets/stdlib_datetime.py +++ b/extra_tests/snippets/stdlib_datetime.py @@ -131,6 +131,11 @@ def __init__(self, offset, name): assert_raises(NotImplementedError, ne.utcoffset, dt) assert_raises(NotImplementedError, ne.dst, dt) +# unsupport format in strptime returns arg itself +# in linux. Todo: add cases for Mac/Windows +if sys.platform == 'linux': + assert_equal(_time.strftime("%?"), "%?") + # XXX: bug #1302 # def test_normal(self): #fo = FixedOffset(3, "Three") diff --git a/vm/src/stdlib/time.rs b/vm/src/stdlib/time.rs index fbf7538bb0..474d51d75d 100644 --- a/vm/src/stdlib/time.rs +++ b/vm/src/stdlib/time.rs @@ -207,8 +207,18 @@ mod time { #[pyfunction] fn strftime(format: PyStrRef, t: OptionalArg, vm: &VirtualMachine) -> PyResult { + use std::fmt::Write; + let instant = t.naive_or_local(vm)?; - let formatted_time = instant.format(format.as_str()).to_string(); + let mut formatted_time = String::new(); + + /* + * chrono doesn't support all formats and it + * raises an error if unsupported format is supplied. + * If error happens, we set result as input arg. + */ + write!(&mut formatted_time, "{}", instant.format(format.as_str())) + .unwrap_or_else(|_| formatted_time = format.to_string()); Ok(vm.ctx.new_str(formatted_time).into()) } From e42553867f5ab6cbc28fe17e1093db6f7f3d7a25 Mon Sep 17 00:00:00 2001 From: Jeong YunWon <69878+youknowone@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:14:53 +0900 Subject: [PATCH 2/2] Update extra_tests/snippets/stdlib_datetime.py --- extra_tests/snippets/stdlib_datetime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra_tests/snippets/stdlib_datetime.py b/extra_tests/snippets/stdlib_datetime.py index 4e6b0423b6..cd1f27733b 100644 --- a/extra_tests/snippets/stdlib_datetime.py +++ b/extra_tests/snippets/stdlib_datetime.py @@ -133,7 +133,7 @@ def __init__(self, offset, name): # unsupport format in strptime returns arg itself # in linux. Todo: add cases for Mac/Windows -if sys.platform == 'linux': +if sys.platform.startswith("linux"): assert_equal(_time.strftime("%?"), "%?") # XXX: bug #1302