<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
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",)
