You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.0 KiB
37 lines
1.0 KiB
import os |
|
import sys |
|
from typing import Union |
|
|
|
_Path = Union[str, os.PathLike] |
|
|
|
|
|
def ensure_directory(path): |
|
"""Ensure that the parent directory of `path` exists""" |
|
dirname = os.path.dirname(path) |
|
os.makedirs(dirname, exist_ok=True) |
|
|
|
|
|
def same_path(p1: _Path, p2: _Path) -> bool: |
|
"""Differs from os.path.samefile because it does not require paths to exist. |
|
Purely string based (no comparison between i-nodes). |
|
>>> same_path("a/b", "./a/b") |
|
True |
|
>>> same_path("a/b", "a/./b") |
|
True |
|
>>> same_path("a/b", "././a/b") |
|
True |
|
>>> same_path("a/b", "./a/b/c/..") |
|
True |
|
>>> same_path("a/b", "../a/b/c") |
|
False |
|
>>> same_path("a", "a/b") |
|
False |
|
""" |
|
return normpath(p1) == normpath(p2) |
|
|
|
|
|
def normpath(filename: _Path) -> str: |
|
"""Normalize a file/dir name for comparison purposes.""" |
|
# See pkg_resources.normalize_path for notes about cygwin |
|
file = os.path.abspath(filename) if sys.platform == 'cygwin' else filename |
|
return os.path.normcase(os.path.realpath(os.path.normpath(file)))
|
|
|