From 659c450cb89b22a5f775ff0fd752925718dc18d9 Mon Sep 17 00:00:00 2001 From: Ravencentric <78981416+Ravencentric@users.noreply.github.com> Date: Sun, 12 Oct 2025 02:05:15 +0530 Subject: [PATCH 1/7] make FILE_ATTRIBUTE__* available on all platforms Fixes: https://github.com/python/typeshed/issues/14865 --- stdlib/@tests/stubtest_allowlists/darwin.txt | 3 --- stdlib/@tests/stubtest_allowlists/linux.txt | 3 --- stdlib/stat.pyi | 28 +++++++++++++++++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/stdlib/@tests/stubtest_allowlists/darwin.txt b/stdlib/@tests/stubtest_allowlists/darwin.txt index b82f42156ad0..bee977f6d21d 100644 --- a/stdlib/@tests/stubtest_allowlists/darwin.txt +++ b/stdlib/@tests/stubtest_allowlists/darwin.txt @@ -45,9 +45,6 @@ multiprocessing.popen_spawn_win32 # exists on Darwin but fails to import readline.append_history_file # Only available if compiled with GNU readline, not editline select.poll # Actually a function; we have a class so it can be used as a type -# Some of these exist on non-windows, but they are useless and this is not intended -stat.FILE_ATTRIBUTE_[A-Z_]+ - tkinter.Tk.createfilehandler # Methods that come from __getattr__() at runtime tkinter.Tk.deletefilehandler # Methods that come from __getattr__() at runtime diff --git a/stdlib/@tests/stubtest_allowlists/linux.txt b/stdlib/@tests/stubtest_allowlists/linux.txt index 8d7176ce37a4..b8656a9b038f 100644 --- a/stdlib/@tests/stubtest_allowlists/linux.txt +++ b/stdlib/@tests/stubtest_allowlists/linux.txt @@ -54,9 +54,6 @@ _?socket.SOL_IPX _?socket.SOL_NETROM _?socket.SOL_ROSE -# Some of these exist on non-windows, but they are useless and this is not intended -stat.FILE_ATTRIBUTE_[A-Z_]+ - # This is available on Linux, but it's documented as for kernel debugging and # not present on GitHub Actions runners. termios.TIOCTTYGSTRUCT diff --git a/stdlib/stat.pyi b/stdlib/stat.pyi index face28ab0cbb..27f4b9d534ba 100644 --- a/stdlib/stat.pyi +++ b/stdlib/stat.pyi @@ -1,7 +1,33 @@ +# pyright: reportConstantRedefinition=false + import sys -from _stat import * +from _stat import * # pyright: ignore[reportGeneralTypeIssues] from typing import Final +# _stat.py defines FILE_ATTRIBUTE_* constants conditionally, +# making them available only at runtime on Windows. +# stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants +# on all platforms. +# See: +# +FILE_ATTRIBUTE_ARCHIVE: Final = 32 +FILE_ATTRIBUTE_COMPRESSED: Final = 2048 +FILE_ATTRIBUTE_DEVICE: Final = 64 +FILE_ATTRIBUTE_DIRECTORY: Final = 16 +FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 +FILE_ATTRIBUTE_HIDDEN: Final = 2 +FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 +FILE_ATTRIBUTE_NORMAL: Final = 128 +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 +FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 +FILE_ATTRIBUTE_OFFLINE: Final = 4096 +FILE_ATTRIBUTE_READONLY: Final = 1 +FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 +FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 +FILE_ATTRIBUTE_SYSTEM: Final = 4 +FILE_ATTRIBUTE_TEMPORARY: Final = 256 +FILE_ATTRIBUTE_VIRTUAL: Final = 65536 + if sys.version_info >= (3, 13): # https://github.com/python/cpython/issues/114081#issuecomment-2119017790 SF_RESTRICTED: Final = 0x00080000 From d564e54de667823b91fbbdf2961e967a1d458958 Mon Sep 17 00:00:00 2001 From: Ravencentric <78981416+Ravencentric@users.noreply.github.com> Date: Sun, 12 Oct 2025 02:09:58 +0530 Subject: [PATCH 2/7] fix: stubtest --- stdlib/@tests/stubtest_allowlists/win32.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/stdlib/@tests/stubtest_allowlists/win32.txt b/stdlib/@tests/stubtest_allowlists/win32.txt index 66695e1d87d3..ff2a1c347bcc 100644 --- a/stdlib/@tests/stubtest_allowlists/win32.txt +++ b/stdlib/@tests/stubtest_allowlists/win32.txt @@ -47,6 +47,7 @@ tty # Other allowlist entries that cannot or should not be fixed # ========================================================== +_stat.FILE_ATTRIBUTE_[A-Z_]+ # stdlib redefines these in stat.py multiprocessing.popen_fork # exists on Windows but fails to import multiprocessing.popen_forkserver # exists on Windows but fails to import multiprocessing.popen_spawn_posix # exists on Windows but fails to import From 9a0df4b5e739e744ed687c24bd09e074df7ae565 Mon Sep 17 00:00:00 2001 From: Ravencentric <78981416+Ravencentric@users.noreply.github.com> Date: Sun, 12 Oct 2025 02:20:39 +0530 Subject: [PATCH 3/7] use the redef workaround from PR#12729 --- stdlib/@tests/stubtest_allowlists/win32.txt | 1 - stdlib/stat.pyi | 51 ++++++++++----------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/stdlib/@tests/stubtest_allowlists/win32.txt b/stdlib/@tests/stubtest_allowlists/win32.txt index ff2a1c347bcc..66695e1d87d3 100644 --- a/stdlib/@tests/stubtest_allowlists/win32.txt +++ b/stdlib/@tests/stubtest_allowlists/win32.txt @@ -47,7 +47,6 @@ tty # Other allowlist entries that cannot or should not be fixed # ========================================================== -_stat.FILE_ATTRIBUTE_[A-Z_]+ # stdlib redefines these in stat.py multiprocessing.popen_fork # exists on Windows but fails to import multiprocessing.popen_forkserver # exists on Windows but fails to import multiprocessing.popen_spawn_posix # exists on Windows but fails to import diff --git a/stdlib/stat.pyi b/stdlib/stat.pyi index 27f4b9d534ba..b3f67d39bc27 100644 --- a/stdlib/stat.pyi +++ b/stdlib/stat.pyi @@ -1,32 +1,31 @@ -# pyright: reportConstantRedefinition=false - import sys -from _stat import * # pyright: ignore[reportGeneralTypeIssues] +from _stat import * from typing import Final -# _stat.py defines FILE_ATTRIBUTE_* constants conditionally, -# making them available only at runtime on Windows. -# stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants -# on all platforms. -# See: -# -FILE_ATTRIBUTE_ARCHIVE: Final = 32 -FILE_ATTRIBUTE_COMPRESSED: Final = 2048 -FILE_ATTRIBUTE_DEVICE: Final = 64 -FILE_ATTRIBUTE_DIRECTORY: Final = 16 -FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 -FILE_ATTRIBUTE_HIDDEN: Final = 2 -FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 -FILE_ATTRIBUTE_NORMAL: Final = 128 -FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 -FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 -FILE_ATTRIBUTE_OFFLINE: Final = 4096 -FILE_ATTRIBUTE_READONLY: Final = 1 -FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 -FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 -FILE_ATTRIBUTE_SYSTEM: Final = 4 -FILE_ATTRIBUTE_TEMPORARY: Final = 256 -FILE_ATTRIBUTE_VIRTUAL: Final = 65536 +if sys.platform != "win32": + # _stat.py defines FILE_ATTRIBUTE_* constants conditionally, + # making them available only at runtime on Windows. + # stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants + # on all platforms. + # See: + # + FILE_ATTRIBUTE_ARCHIVE: Final = 32 + FILE_ATTRIBUTE_COMPRESSED: Final = 2048 + FILE_ATTRIBUTE_DEVICE: Final = 64 + FILE_ATTRIBUTE_DIRECTORY: Final = 16 + FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 + FILE_ATTRIBUTE_HIDDEN: Final = 2 + FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 + FILE_ATTRIBUTE_NORMAL: Final = 128 + FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 + FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 + FILE_ATTRIBUTE_OFFLINE: Final = 4096 + FILE_ATTRIBUTE_READONLY: Final = 1 + FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 + FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 + FILE_ATTRIBUTE_SYSTEM: Final = 4 + FILE_ATTRIBUTE_TEMPORARY: Final = 256 + FILE_ATTRIBUTE_VIRTUAL: Final = 65536 if sys.version_info >= (3, 13): # https://github.com/python/cpython/issues/114081#issuecomment-2119017790 From 4288a09b00d46aa507f48185459164b53119e71a Mon Sep 17 00:00:00 2001 From: Ravencentric <78981416+Ravencentric@users.noreply.github.com> Date: Sun, 12 Oct 2025 19:21:47 +0530 Subject: [PATCH 4/7] address feedback --- stdlib/stat.pyi | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/stdlib/stat.pyi b/stdlib/stat.pyi index b3f67d39bc27..241282aab98d 100644 --- a/stdlib/stat.pyi +++ b/stdlib/stat.pyi @@ -2,30 +2,27 @@ import sys from _stat import * from typing import Final -if sys.platform != "win32": - # _stat.py defines FILE_ATTRIBUTE_* constants conditionally, - # making them available only at runtime on Windows. - # stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants - # on all platforms. - # See: - # - FILE_ATTRIBUTE_ARCHIVE: Final = 32 - FILE_ATTRIBUTE_COMPRESSED: Final = 2048 - FILE_ATTRIBUTE_DEVICE: Final = 64 - FILE_ATTRIBUTE_DIRECTORY: Final = 16 - FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 - FILE_ATTRIBUTE_HIDDEN: Final = 2 - FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 - FILE_ATTRIBUTE_NORMAL: Final = 128 - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 - FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 - FILE_ATTRIBUTE_OFFLINE: Final = 4096 - FILE_ATTRIBUTE_READONLY: Final = 1 - FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 - FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 - FILE_ATTRIBUTE_SYSTEM: Final = 4 - FILE_ATTRIBUTE_TEMPORARY: Final = 256 - FILE_ATTRIBUTE_VIRTUAL: Final = 65536 +# _stat.c defines FILE_ATTRIBUTE_* constants conditionally, +# making them available only at runtime on Windows. +# stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants +# on all platforms. +FILE_ATTRIBUTE_ARCHIVE: Final = 32 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_COMPRESSED: Final = 2048 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_DEVICE: Final = 64 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_DIRECTORY: Final = 16 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_HIDDEN: Final = 2 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_NORMAL: Final = 128 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_OFFLINE: Final = 4096 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_READONLY: Final = 1 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_SYSTEM: Final = 4 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_TEMPORARY: Final = 256 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_VIRTUAL: Final = 65536 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] if sys.version_info >= (3, 13): # https://github.com/python/cpython/issues/114081#issuecomment-2119017790 From bd856246a9d05f2daf84a4ae834182a1dd0f3b3d Mon Sep 17 00:00:00 2001 From: Ravencentric <78981416+Ravencentric@users.noreply.github.com> Date: Sun, 12 Oct 2025 19:24:24 +0530 Subject: [PATCH 5/7] fix pyright --- stdlib/stat.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/stat.pyi b/stdlib/stat.pyi index 241282aab98d..d8b1e45cd8cb 100644 --- a/stdlib/stat.pyi +++ b/stdlib/stat.pyi @@ -1,5 +1,5 @@ import sys -from _stat import * +from _stat import * # pyright: ignore[reportGeneralTypeIssues] from typing import Final # _stat.c defines FILE_ATTRIBUTE_* constants conditionally, From 32ea94e3095ed31937a426bd3d4217503367acd0 Mon Sep 17 00:00:00 2001 From: Ravencentric <78981416+Ravencentric@users.noreply.github.com> Date: Sun, 12 Oct 2025 19:36:57 +0530 Subject: [PATCH 6/7] fix pyright --- stdlib/stat.pyi | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/stdlib/stat.pyi b/stdlib/stat.pyi index d8b1e45cd8cb..48a567e44a41 100644 --- a/stdlib/stat.pyi +++ b/stdlib/stat.pyi @@ -1,28 +1,28 @@ import sys -from _stat import * # pyright: ignore[reportGeneralTypeIssues] +from _stat import * from typing import Final # _stat.c defines FILE_ATTRIBUTE_* constants conditionally, # making them available only at runtime on Windows. # stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants # on all platforms. -FILE_ATTRIBUTE_ARCHIVE: Final = 32 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_COMPRESSED: Final = 2048 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_DEVICE: Final = 64 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_DIRECTORY: Final = 16 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_HIDDEN: Final = 2 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_NORMAL: Final = 128 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_OFFLINE: Final = 4096 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_READONLY: Final = 1 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_SYSTEM: Final = 4 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_TEMPORARY: Final = 256 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] -FILE_ATTRIBUTE_VIRTUAL: Final = 65536 # type: ignore[misc] # pyright: ignore[reportConstantRedefinition] +FILE_ATTRIBUTE_ARCHIVE: Final = 32 # type: ignore[misc] +FILE_ATTRIBUTE_COMPRESSED: Final = 2048 # type: ignore[misc] +FILE_ATTRIBUTE_DEVICE: Final = 64 # type: ignore[misc] +FILE_ATTRIBUTE_DIRECTORY: Final = 16 # type: ignore[misc] +FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 # type: ignore[misc] +FILE_ATTRIBUTE_HIDDEN: Final = 2 # type: ignore[misc] +FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 # type: ignore[misc] +FILE_ATTRIBUTE_NORMAL: Final = 128 # type: ignore[misc] +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 # type: ignore[misc] +FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 # type: ignore[misc] +FILE_ATTRIBUTE_OFFLINE: Final = 4096 # type: ignore[misc] +FILE_ATTRIBUTE_READONLY: Final = 1 # type: ignore[misc] +FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 # type: ignore[misc] +FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 # type: ignore[misc] +FILE_ATTRIBUTE_SYSTEM: Final = 4 # type: ignore[misc] +FILE_ATTRIBUTE_TEMPORARY: Final = 256 # type: ignore[misc] +FILE_ATTRIBUTE_VIRTUAL: Final = 65536 # type: ignore[misc] if sys.version_info >= (3, 13): # https://github.com/python/cpython/issues/114081#issuecomment-2119017790 From d55212e95ad426293e6a6d04b7aeb8a9dea162b4 Mon Sep 17 00:00:00 2001 From: Ravencentric <78981416+Ravencentric@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:38:59 +0530 Subject: [PATCH 7/7] fix: explicitly import symbols from _stat --- stdlib/stat.pyi | 121 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 103 insertions(+), 18 deletions(-) diff --git a/stdlib/stat.pyi b/stdlib/stat.pyi index 48a567e44a41..6c26080e0665 100644 --- a/stdlib/stat.pyi +++ b/stdlib/stat.pyi @@ -1,28 +1,113 @@ import sys -from _stat import * +from _stat import ( + S_ENFMT as S_ENFMT, + S_IEXEC as S_IEXEC, + S_IFBLK as S_IFBLK, + S_IFCHR as S_IFCHR, + S_IFDIR as S_IFDIR, + S_IFDOOR as S_IFDOOR, + S_IFIFO as S_IFIFO, + S_IFLNK as S_IFLNK, + S_IFMT as S_IFMT, + S_IFPORT as S_IFPORT, + S_IFREG as S_IFREG, + S_IFSOCK as S_IFSOCK, + S_IFWHT as S_IFWHT, + S_IMODE as S_IMODE, + S_IREAD as S_IREAD, + S_IRGRP as S_IRGRP, + S_IROTH as S_IROTH, + S_IRUSR as S_IRUSR, + S_IRWXG as S_IRWXG, + S_IRWXO as S_IRWXO, + S_IRWXU as S_IRWXU, + S_ISBLK as S_ISBLK, + S_ISCHR as S_ISCHR, + S_ISDIR as S_ISDIR, + S_ISDOOR as S_ISDOOR, + S_ISFIFO as S_ISFIFO, + S_ISGID as S_ISGID, + S_ISLNK as S_ISLNK, + S_ISPORT as S_ISPORT, + S_ISREG as S_ISREG, + S_ISSOCK as S_ISSOCK, + S_ISUID as S_ISUID, + S_ISVTX as S_ISVTX, + S_ISWHT as S_ISWHT, + S_IWGRP as S_IWGRP, + S_IWOTH as S_IWOTH, + S_IWRITE as S_IWRITE, + S_IWUSR as S_IWUSR, + S_IXGRP as S_IXGRP, + S_IXOTH as S_IXOTH, + S_IXUSR as S_IXUSR, + SF_APPEND as SF_APPEND, + SF_ARCHIVED as SF_ARCHIVED, + SF_IMMUTABLE as SF_IMMUTABLE, + SF_NOUNLINK as SF_NOUNLINK, + SF_SNAPSHOT as SF_SNAPSHOT, + ST_ATIME as ST_ATIME, + ST_CTIME as ST_CTIME, + ST_DEV as ST_DEV, + ST_GID as ST_GID, + ST_INO as ST_INO, + ST_MODE as ST_MODE, + ST_MTIME as ST_MTIME, + ST_NLINK as ST_NLINK, + ST_SIZE as ST_SIZE, + ST_UID as ST_UID, + UF_APPEND as UF_APPEND, + UF_COMPRESSED as UF_COMPRESSED, + UF_HIDDEN as UF_HIDDEN, + UF_IMMUTABLE as UF_IMMUTABLE, + UF_NODUMP as UF_NODUMP, + UF_NOUNLINK as UF_NOUNLINK, + UF_OPAQUE as UF_OPAQUE, + filemode as filemode, +) from typing import Final +if sys.platform == "win32": + from _stat import ( + IO_REPARSE_TAG_APPEXECLINK as IO_REPARSE_TAG_APPEXECLINK, + IO_REPARSE_TAG_MOUNT_POINT as IO_REPARSE_TAG_MOUNT_POINT, + IO_REPARSE_TAG_SYMLINK as IO_REPARSE_TAG_SYMLINK, + ) + +if sys.version_info >= (3, 13): + from _stat import ( + SF_DATALESS as SF_DATALESS, + SF_FIRMLINK as SF_FIRMLINK, + SF_SETTABLE as SF_SETTABLE, + UF_DATAVAULT as UF_DATAVAULT, + UF_SETTABLE as UF_SETTABLE, + UF_TRACKED as UF_TRACKED, + ) + + if sys.platform == "darwin": + from _stat import SF_SUPPORTED as SF_SUPPORTED, SF_SYNTHETIC as SF_SYNTHETIC + # _stat.c defines FILE_ATTRIBUTE_* constants conditionally, # making them available only at runtime on Windows. # stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants # on all platforms. -FILE_ATTRIBUTE_ARCHIVE: Final = 32 # type: ignore[misc] -FILE_ATTRIBUTE_COMPRESSED: Final = 2048 # type: ignore[misc] -FILE_ATTRIBUTE_DEVICE: Final = 64 # type: ignore[misc] -FILE_ATTRIBUTE_DIRECTORY: Final = 16 # type: ignore[misc] -FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 # type: ignore[misc] -FILE_ATTRIBUTE_HIDDEN: Final = 2 # type: ignore[misc] -FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 # type: ignore[misc] -FILE_ATTRIBUTE_NORMAL: Final = 128 # type: ignore[misc] -FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 # type: ignore[misc] -FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 # type: ignore[misc] -FILE_ATTRIBUTE_OFFLINE: Final = 4096 # type: ignore[misc] -FILE_ATTRIBUTE_READONLY: Final = 1 # type: ignore[misc] -FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 # type: ignore[misc] -FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 # type: ignore[misc] -FILE_ATTRIBUTE_SYSTEM: Final = 4 # type: ignore[misc] -FILE_ATTRIBUTE_TEMPORARY: Final = 256 # type: ignore[misc] -FILE_ATTRIBUTE_VIRTUAL: Final = 65536 # type: ignore[misc] +FILE_ATTRIBUTE_ARCHIVE: Final = 32 +FILE_ATTRIBUTE_COMPRESSED: Final = 2048 +FILE_ATTRIBUTE_DEVICE: Final = 64 +FILE_ATTRIBUTE_DIRECTORY: Final = 16 +FILE_ATTRIBUTE_ENCRYPTED: Final = 16384 +FILE_ATTRIBUTE_HIDDEN: Final = 2 +FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768 +FILE_ATTRIBUTE_NORMAL: Final = 128 +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192 +FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072 +FILE_ATTRIBUTE_OFFLINE: Final = 4096 +FILE_ATTRIBUTE_READONLY: Final = 1 +FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024 +FILE_ATTRIBUTE_SPARSE_FILE: Final = 512 +FILE_ATTRIBUTE_SYSTEM: Final = 4 +FILE_ATTRIBUTE_TEMPORARY: Final = 256 +FILE_ATTRIBUTE_VIRTUAL: Final = 65536 if sys.version_info >= (3, 13): # https://github.com/python/cpython/issues/114081#issuecomment-2119017790