Skip to content

Module isort.io

Defines any IO utilities used by isort

None

View Source
"""Defines any IO utilities used by isort"""

import re

import tokenize

from contextlib import contextmanager

from io import BytesIO, StringIO, TextIOWrapper

from pathlib import Path

from typing import Any, Callable, Iterator, TextIO, Union

from isort._future import dataclass

from isort.exceptions import UnsupportedEncoding

_ENCODING_PATTERN = re.compile(br"^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)")

@dataclass(frozen=True)

class File:

    stream: TextIO

    path: Path

    encoding: str

    @staticmethod

    def detect_encoding(filename: Union[str, Path], readline: Callable[[], bytes]) -> str:

        try:

            return tokenize.detect_encoding(readline)[0]

        except Exception:

            raise UnsupportedEncoding(filename)

    @staticmethod

    def from_contents(contents: str, filename: str) -> "File":

        encoding = File.detect_encoding(filename, BytesIO(contents.encode("utf-8")).readline)

        return File(  # type: ignore

            stream=StringIO(contents), path=Path(filename).resolve(), encoding=encoding

        )

    @property

    def extension(self) -> str:

        return self.path.suffix.lstrip(".")

    @staticmethod

    def _open(filename: Union[str, Path]) -> TextIOWrapper:

        """Open a file in read only mode using the encoding detected by

        detect_encoding().

        """

        buffer = open(filename, "rb")

        try:

            encoding = File.detect_encoding(filename, buffer.readline)

            buffer.seek(0)

            text = TextIOWrapper(buffer, encoding, line_buffering=True, newline="")

            text.mode = "r"  # type: ignore

            return text

        except Exception:

            buffer.close()

            raise

    @staticmethod

    @contextmanager

    def read(filename: Union[str, Path]) -> Iterator["File"]:

        file_path = Path(filename).resolve()

        stream = None

        try:

            stream = File._open(file_path)

            yield File(stream=stream, path=file_path, encoding=stream.encoding)  # type: ignore

        finally:

            if stream is not None:

                stream.close()

class _EmptyIO(StringIO):

    def write(self, *args: Any, **kwargs: Any) -> None:  # type: ignore # skipcq: PTC-W0049

        pass

Empty = _EmptyIO()

Variables

Empty

Classes

File

class File(
    stream: <class 'TextIO'>,
    path: pathlib.Path,
    encoding: str
)
View Source
@dataclass(frozen=True)

class File:

    stream: TextIO

    path: Path

    encoding: str

    @staticmethod

    def detect_encoding(filename: Union[str, Path], readline: Callable[[], bytes]) -> str:

        try:

            return tokenize.detect_encoding(readline)[0]

        except Exception:

            raise UnsupportedEncoding(filename)

    @staticmethod

    def from_contents(contents: str, filename: str) -> "File":

        encoding = File.detect_encoding(filename, BytesIO(contents.encode("utf-8")).readline)

        return File(  # type: ignore

            stream=StringIO(contents), path=Path(filename).resolve(), encoding=encoding

        )

    @property

    def extension(self) -> str:

        return self.path.suffix.lstrip(".")

    @staticmethod

    def _open(filename: Union[str, Path]) -> TextIOWrapper:

        """Open a file in read only mode using the encoding detected by

        detect_encoding().

        """

        buffer = open(filename, "rb")

        try:

            encoding = File.detect_encoding(filename, buffer.readline)

            buffer.seek(0)

            text = TextIOWrapper(buffer, encoding, line_buffering=True, newline="")

            text.mode = "r"  # type: ignore

            return text

        except Exception:

            buffer.close()

            raise

    @staticmethod

    @contextmanager

    def read(filename: Union[str, Path]) -> Iterator["File"]:

        file_path = Path(filename).resolve()

        stream = None

        try:

            stream = File._open(file_path)

            yield File(stream=stream, path=file_path, encoding=stream.encoding)  # type: ignore

        finally:

            if stream is not None:

                stream.close()

Static methods

detect_encoding

def detect_encoding(
    filename: Union[str, pathlib.Path],
    readline: Callable[[], bytes]
) -> str
View Source
    @staticmethod

    def detect_encoding(filename: Union[str, Path], readline: Callable[[], bytes]) -> str:

        try:

            return tokenize.detect_encoding(readline)[0]

        except Exception:

            raise UnsupportedEncoding(filename)

from_contents

def from_contents(
    contents: str,
    filename: str
) -> 'File'
View Source
    @staticmethod

    def from_contents(contents: str, filename: str) -> "File":

        encoding = File.detect_encoding(filename, BytesIO(contents.encode("utf-8")).readline)

        return File(  # type: ignore

            stream=StringIO(contents), path=Path(filename).resolve(), encoding=encoding

        )

read

def read(
    filename: Union[str, pathlib.Path]
) -> Iterator[ForwardRef('File')]
View Source
    @staticmethod

    @contextmanager

    def read(filename: Union[str, Path]) -> Iterator["File"]:

        file_path = Path(filename).resolve()

        stream = None

        try:

            stream = File._open(file_path)

            yield File(stream=stream, path=file_path, encoding=stream.encoding)  # type: ignore

        finally:

            if stream is not None:

                stream.close()

Instance variables

extension