121 lines
3.5 KiB
Python
121 lines
3.5 KiB
Python
"""Exceptions module for rfc3986."""
|
|
from . import compat
|
|
|
|
|
|
class RFC3986Exception(Exception):
|
|
"""Base class for all rfc3986 exception classes."""
|
|
|
|
pass
|
|
|
|
|
|
class InvalidAuthority(RFC3986Exception):
|
|
"""Exception when the authority string is invalid."""
|
|
|
|
def __init__(self, authority):
|
|
"""Initialize the exception with the invalid authority."""
|
|
super().__init__(
|
|
f"The authority ({compat.to_str(authority)}) is not valid."
|
|
)
|
|
|
|
|
|
class InvalidPort(RFC3986Exception):
|
|
"""Exception when the port is invalid."""
|
|
|
|
def __init__(self, port):
|
|
"""Initialize the exception with the invalid port."""
|
|
super().__init__(f'The port ("{port}") is not valid.')
|
|
|
|
|
|
class ResolutionError(RFC3986Exception):
|
|
"""Exception to indicate a failure to resolve a URI."""
|
|
|
|
def __init__(self, uri):
|
|
"""Initialize the error with the failed URI."""
|
|
super().__init__(
|
|
"{} does not meet the requirements for resolution.".format(
|
|
uri.unsplit()
|
|
)
|
|
)
|
|
|
|
|
|
class ValidationError(RFC3986Exception):
|
|
"""Exception raised during Validation of a URI."""
|
|
|
|
pass
|
|
|
|
|
|
class MissingComponentError(ValidationError):
|
|
"""Exception raised when a required component is missing."""
|
|
|
|
def __init__(self, uri, *component_names):
|
|
"""Initialize the error with the missing component name."""
|
|
verb = "was"
|
|
if len(component_names) > 1:
|
|
verb = "were"
|
|
|
|
self.uri = uri
|
|
self.components = sorted(component_names)
|
|
components = ", ".join(self.components)
|
|
super().__init__(
|
|
f"{components} {verb} required but missing",
|
|
uri,
|
|
self.components,
|
|
)
|
|
|
|
|
|
class UnpermittedComponentError(ValidationError):
|
|
"""Exception raised when a component has an unpermitted value."""
|
|
|
|
def __init__(self, component_name, component_value, allowed_values):
|
|
"""Initialize the error with the unpermitted component."""
|
|
super().__init__(
|
|
"{} was required to be one of {!r} but was {!r}".format(
|
|
component_name,
|
|
list(sorted(allowed_values)),
|
|
component_value,
|
|
),
|
|
component_name,
|
|
component_value,
|
|
allowed_values,
|
|
)
|
|
self.component_name = component_name
|
|
self.component_value = component_value
|
|
self.allowed_values = allowed_values
|
|
|
|
|
|
class PasswordForbidden(ValidationError):
|
|
"""Exception raised when a URL has a password in the userinfo section."""
|
|
|
|
def __init__(self, uri):
|
|
"""Initialize the error with the URI that failed validation."""
|
|
unsplit = getattr(uri, "unsplit", lambda: uri)
|
|
super().__init__(
|
|
'"{}" contained a password when validation forbade it'.format(
|
|
unsplit()
|
|
)
|
|
)
|
|
self.uri = uri
|
|
|
|
|
|
class InvalidComponentsError(ValidationError):
|
|
"""Exception raised when one or more components are invalid."""
|
|
|
|
def __init__(self, uri, *component_names):
|
|
"""Initialize the error with the invalid component name(s)."""
|
|
verb = "was"
|
|
if len(component_names) > 1:
|
|
verb = "were"
|
|
|
|
self.uri = uri
|
|
self.components = sorted(component_names)
|
|
components = ", ".join(self.components)
|
|
super().__init__(
|
|
f"{components} {verb} found to be invalid",
|
|
uri,
|
|
self.components,
|
|
)
|
|
|
|
|
|
class MissingDependencyError(RFC3986Exception):
|
|
"""Exception raised when an IRI is encoded without the 'idna' module."""
|