Viewing file: via_os_path.py (3.68 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
from __future__ import absolute_import, unicode_literals
import os import platform from contextlib import contextmanager
from virtualenv.util.six import ensure_str, ensure_text
IS_PYPY = platform.python_implementation() == "PyPy"
class Path(object): def __init__(self, path): if isinstance(path, Path): _path = path._path else: _path = ensure_text(path) if IS_PYPY: _path = _path.encode("utf-8") self._path = _path
def __repr__(self): return ensure_str("Path({})".format(ensure_text(self._path)))
def __unicode__(self): return ensure_text(self._path)
def __str__(self): return ensure_str(self._path)
def __div__(self, other): if isinstance(other, Path): right = other._path else: right = ensure_text(other) if IS_PYPY: right = right.encode("utf-8") return Path(os.path.join(self._path, right))
def __truediv__(self, other): return self.__div__(other)
def __eq__(self, other): return self._path == (other._path if isinstance(other, Path) else None)
def __ne__(self, other): return not (self == other)
def __hash__(self): return hash(self._path)
def exists(self): return os.path.exists(self._path)
@property def parent(self): return Path(os.path.abspath(os.path.join(self._path, os.path.pardir)))
def resolve(self): return Path(os.path.realpath(self._path))
@property def name(self): return os.path.basename(self._path)
@property def parts(self): return self._path.split(os.sep)
def is_file(self): return os.path.isfile(self._path)
def is_dir(self): return os.path.isdir(self._path)
def mkdir(self, parents=True, exist_ok=True): try: os.makedirs(self._path) except OSError: if not exist_ok: raise
def read_text(self, encoding="utf-8"): return self.read_bytes().decode(encoding)
def read_bytes(self): with open(self._path, "rb") as file_handler: return file_handler.read()
def write_bytes(self, content): with open(self._path, "wb") as file_handler: file_handler.write(content)
def write_text(self, text, encoding="utf-8"): self.write_bytes(text.encode(encoding))
def iterdir(self): for p in os.listdir(self._path): yield Path(os.path.join(self._path, p))
@property def suffix(self): _, ext = os.path.splitext(self.name) return ext
@property def stem(self): base, _ = os.path.splitext(self.name) return base
@contextmanager def open(self, mode="r"): with open(self._path, mode) as file_handler: yield file_handler
@property def parents(self): result = [] parts = self.parts for i in range(len(parts) - 1): result.append(Path(os.sep.join(parts[0 : i + 1]))) return result[::-1]
def unlink(self): os.remove(self._path)
def with_name(self, name): return self.parent / name
def is_symlink(self): return os.path.islink(self._path)
def relative_to(self, other): if not self._path.startswith(other._path): raise ValueError("{} does not start with {}".format(self._path, other._path)) return Path(os.sep.join(self.parts[len(other.parts) :]))
def stat(self): return os.stat(self._path)
def chmod(self, mode): os.chmod(self._path, mode)
def absolute(self): return Path(os.path.abspath(self._path))
__all__ = ("Path",)
|