blob: b98454a2ce7b3678ed75ebc27e0fbc919153f252 [file] [log] [blame]
"""All isort specific exception classes should be defined here"""
from pathlib import Path
from typing import Any, Dict, Union
from .profiles import profiles
class ISortError(Exception):
"""Base isort exception object from which all isort sourced exceptions should inherit"""
class InvalidSettingsPath(ISortError):
"""Raised when a settings path is provided that is neither a valid file or directory"""
def __init__(self, settings_path: str):
super().__init__(
f"isort was told to use the settings_path: {settings_path} as the base directory or "
"file that represents the starting point of config file discovery, but it does not "
"exist."
)
self.settings_path = settings_path
class ExistingSyntaxErrors(ISortError):
"""Raised when isort is told to sort imports within code that has existing syntax errors"""
def __init__(self, file_path: str):
super().__init__(
f"isort was told to sort imports within code that contains syntax errors: "
f"{file_path}."
)
self.file_path = file_path
class IntroducedSyntaxErrors(ISortError):
"""Raised when isort has introduced a syntax error in the process of sorting imports"""
def __init__(self, file_path: str):
super().__init__(
f"isort introduced syntax errors when attempting to sort the imports contained within "
f"{file_path}."
)
self.file_path = file_path
class FileSkipped(ISortError):
"""Should be raised when a file is skipped for any reason"""
def __init__(self, message: str, file_path: str):
super().__init__(message)
self.file_path = file_path
class FileSkipComment(FileSkipped):
"""Raised when an entire file is skipped due to a isort skip file comment"""
def __init__(self, file_path: str):
super().__init__(
f"{file_path} contains an file skip comment and was skipped.", file_path=file_path
)
class FileSkipSetting(FileSkipped):
"""Raised when an entire file is skipped due to provided isort settings"""
def __init__(self, file_path: str):
super().__init__(
f"{file_path} was skipped as it's listed in 'skip' setting"
" or matches a glob in 'skip_glob' setting",
file_path=file_path,
)
class ProfileDoesNotExist(ISortError):
"""Raised when a profile is set by the user that doesn't exist"""
def __init__(self, profile: str):
super().__init__(
f"Specified profile of {profile} does not exist. "
f"Available profiles: {','.join(profiles)}."
)
self.profile = profile
class FormattingPluginDoesNotExist(ISortError):
"""Raised when a formatting plugin is set by the user that doesn't exist"""
def __init__(self, formatter: str):
super().__init__(f"Specified formatting plugin of {formatter} does not exist. ")
self.formatter = formatter
class LiteralParsingFailure(ISortError):
"""Raised when one of isorts literal sorting comments is used but isort can't parse the
the given data structure.
"""
def __init__(self, code: str, original_error: Exception):
super().__init__(
f"isort failed to parse the given literal {code}. It's important to note "
"that isort literal sorting only supports simple literals parsable by "
f"ast.literal_eval which gave the exception of {original_error}."
)
self.code = code
self.original_error = original_error
class LiteralSortTypeMismatch(ISortError):
"""Raised when an isort literal sorting comment is used, with a type that doesn't match the
supplied data structure's type.
"""
def __init__(self, kind: type, expected_kind: type):
super().__init__(
f"isort was told to sort a literal of type {expected_kind} but was given "
f"a literal of type {kind}."
)
self.kind = kind
self.expected_kind = expected_kind
class AssignmentsFormatMismatch(ISortError):
"""Raised when isort is told to sort assignments but the format of the assignment section
doesn't match isort's expectation.
"""
def __init__(self, code: str):
super().__init__(
"isort was told to sort a section of assignments, however the given code:\n\n"
f"{code}\n\n"
"Does not match isort's strict single line formatting requirement for assignment "
"sorting:\n\n"
"{variable_name} = {value}\n"
"{variable_name2} = {value2}\n"
"...\n\n"
)
self.code = code
class UnsupportedSettings(ISortError):
"""Raised when settings are passed into isort (either from config, CLI, or runtime)
that it doesn't support.
"""
@staticmethod
def _format_option(name: str, value: Any, source: str) -> str:
return f"\t- {name} = {value} (source: '{source}')"
def __init__(self, unsupported_settings: Dict[str, Dict[str, str]]):
errors = "\n".join(
self._format_option(name, **option) for name, option in unsupported_settings.items()
)
super().__init__(
"isort was provided settings that it doesn't support:\n\n"
f"{errors}\n\n"
"For a complete and up-to-date listing of supported settings see: "
"https://pycqa.github.io/isort/docs/configuration/options/.\n"
)
self.unsupported_settings = unsupported_settings
class UnsupportedEncoding(ISortError):
"""Raised when isort encounters an encoding error while trying to read a file"""
def __init__(
self,
filename: Union[str, Path],
):
super().__init__(f"Unknown or unsupported encoding in {filename}")
self.filename = filename