diff --git a/sshfs/spec.py b/sshfs/spec.py index 5c1fc73..77a1e11 100644 --- a/sshfs/spec.py +++ b/sshfs/spec.py @@ -4,7 +4,7 @@ import stat import weakref from contextlib import AsyncExitStack, suppress -from datetime import datetime +from datetime import datetime, timezone import asyncssh from asyncssh.sftp import SFTPOpUnsupported @@ -151,8 +151,16 @@ def _decode_attributes(self, attributes): "type": kind, "gid": attributes.gid, "uid": attributes.uid, - "time": datetime.utcfromtimestamp(attributes.atime), - "mtime": datetime.utcfromtimestamp(attributes.mtime), + "time": ( + datetime.fromtimestamp(attributes.atime, tz=timezone.utc) + if attributes.atime is not None + else None + ), + "mtime": ( + datetime.fromtimestamp(attributes.mtime, tz=timezone.utc) + if attributes.mtime is not None + else None + ), "permissions": attributes.permissions, } diff --git a/tests/test_sshfs.py b/tests/test_sshfs.py index e55639c..ebe351b 100644 --- a/tests/test_sshfs.py +++ b/tests/test_sshfs.py @@ -4,12 +4,12 @@ import tempfile import warnings from concurrent import futures -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from pathlib import Path import fsspec import pytest -from asyncssh.sftp import SFTPFailure +from asyncssh.sftp import SFTPAttrs, SFTPFailure from importlib_metadata import entry_points from sshfs import SSHFileSystem @@ -116,6 +116,22 @@ def test_info(fs, remote_dir): assert details["name"] == remote_dir + "/dir/" +def test_info_timestamps_are_tz_aware_utc(fs, remote_dir): + fs.touch(remote_dir + "/a.txt") + details = fs.info(remote_dir + "/a.txt") + for key in ["time", "mtime"]: + assert details[key].tzinfo == timezone.utc + + +def test_decode_attributes_missing_timestamps(fs): + attrs = SFTPAttrs( + permissions=0o100644, size=0, uid=0, gid=0, atime=None, mtime=None + ) + details = fs._decode_attributes(attrs) + assert details["time"] is None + assert details["mtime"] is None + + def test_move(fs, remote_dir): fs.touch(remote_dir + "/a.txt") initial_info = fs.info(remote_dir + "/a.txt")